Professional Documents
Culture Documents
PAD INPT
Cours C, Semaine 1
A LGORITHMIQUE ET
PROGRAMMATION 1
maijuin 2006
.
.
.
.
3
3
3
4
4
3 Variables
3.1 Quest ce quune variable ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2 Dfinition dune variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
4
4
4 Types fondamentaux
4.1 Les entiers . . . . . . . .
4.2 Les rels . . . . . . . . .
4.3 Les boolens . . . . . .
4.4 Les caractres . . . . . .
4.5 Les chanes de caractres
5
5
5
5
6
6
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5 Constantes
6 Expressions
7 Instructions dentre/sorties
7.1 Opration dentre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.2 Opration de sortie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
7
8
8 Affectation
Cours C, Semaine 1
10
c INPTPAD
1/26
A LGORITHMIQUE
ET PROGRAMMATION
9 Structures de contrle
9.1 Enchanement squentiel . . . . . . . . .
9.2 Instructions conditionnelles . . . . . . . .
9.2.1 Conditionnelle Si ... Alors ...
9.2.2 Conditionnelle Si ... Alors ...
9.2.3 La clause SinonSi . . . . . . . .
9.2.4 Conditionnelle Selon . . . . . . .
9.3 Instructions de rptitions . . . . . . . . .
9.3.1 Rptition TantQue . . . . . . . .
9.3.2 Rptition Rpter ... Jusqu . .
9.3.3 Rptition Pour . . . . . . . . . .
9.3.4 Quelle rptition choisir ? . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
FinSi . . . . . . . . . .
Sinon ... FinSi . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
13
13
13
13
15
16
18
19
19
22
25
26
Cours C, Semaine 1
c INPTPAD
2/26
A LGORITHMIQUE
ET PROGRAMMATION
/**********************************************************************
* Auteur : Xavier Crgut <cregut@enseeiht.fr>
* Version : 1.1
: Dterminer le primtre dun cercle partir de son rayon.
* Titre
*********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#define PI 3.1415
int main()
{
double rayon;
double perimetre;
/* Saisir le rayon */
printf("Rayon = ");
scanf("%lf", &rayon);
19
20
21
22
/* Calculer le primtre */
perimetre = 2 * PI * rayon;
/* par dfinition */
/*{ perimetre == 2 * PI * rayon }*/
23
24
25
26
27
28
29
/* Afficher le primtre */
printf("Le primtre est : %4.2f\n", perimetre);
return EXIT_SUCCESS;
}
c INPTPAD
3/26
A LGORITHMIQUE
ET PROGRAMMATION
la bibliothque standard du C et donne accs des fonctions dj dfinies. Par exemple les
fonctions daffichage (printf) et de lecture (scanf) sont dfinies dans stdio.h. La constante
EXIT_SUCCESS est dfinie dans stdlib.h. Si on ne met pas ces #include, on ne peut pas utiliser
ces fonctions ou constantes.
Le #define suivant permet de dfinir la constante PI. Il correspond donc une dfinition.
Finalement, les dclarations et instructions sont regroupes entre les accolades qui suivent
int main(), dabord les dclarations, puis les instructions. main est la fonction principale, cest-dire que cest elle qui est excute quand le programme sera lanc. Les instructions sont les
mmes que cette prsentes dans lalgorithme mme si elles ont une forme un peu diffrente.
2.3 Identificateurs
Un identificateur est un mot de la forme : une lettre (y compris le soulign) suivie dun
nombre quelconque de lettres et de chiffres.
Attention, il nest pas possible dutiliser les lettres accentues en C.
2.4 Commentaires
Les commentaires commencent par /* et se terminent par */. Attention, les commentaires ne
peuvent pas tre imbriqus.
Pour reprsenter une proprit du programme, nous utiliserons / *{ ... }*/.
Le langage C++ ajoute les commentaires qui commencent par // et se termine avec la fin de
la ligne (comme --). Ils peuvent tre utiliss la o on met -- en algorithmique.
3 Variables
3.1 Quest ce quune variable ?
3.2 Dfinition dune variable
En C, on commence par mettre le type suivi du nom de la variable et un point-virgule.
double prix_unitaire;
int quantite;
char nom[20];
Cours C, Semaine 1
/* trois entiers */
c INPTPAD
4/26
A LGORITHMIQUE
ET PROGRAMMATION
4 Types fondamentaux
Les oprateurs de comparaison se notent : <, >, <=, >=, == et !=. Notez bien que lgalit est
note avec deux fois le caractre =.
/* un entier court */
/* galement un entier court (int est implicite) */
/* un entier long (int est aussi implicite) */
sils sont signs ou non. Par dfaut, les entiers sont signs (positifs ou ngatif). Si lon
prcise unsigned devant le type, ils ne peuvent pas tre ngatifs.
unsigned int n;
unsigned short s;
Le reste de la division entire se note % et la division entire se note tous simplement /. Il faut
faire attention ne pas la confondre avec la division sur les rels.
10 % 3
10 / 3
1 / 2
abs(-5)
/*
/*
/*
/*
1
3
0
5
10 par 3) */
de 10 par 3) */
de 1 par 2) */
(cf sous-programmes)) */
Notons que les dbordement de capacit sur les oprations entires ne provoquent aucune
erreur lexcution... mais le rsultat calcul est bien sr faux par rapport au rsultat attendu !.
Remarque : Le type char (caractre, section 4.4) fait partie des entiers.
c INPTPAD
5/26
A LGORITHMIQUE
ET PROGRAMMATION
Cependant, il existe un module standard (<stdbool.h>) qui dfinit un type boolen bool avec
les deux valeurs true et false.
Les oprateurs logiques se notent && pour Et, || pour Ou et ! pour Non.
1
2
3
&&
||
!
/* ET logique
/* OU logique
/* NON logique
*/
*/
*/
Les expressions boolennes sont values en court-circuit (on parle dvaluation partielle),
cest--dire que ds que le rsultat dune expression est connu, lvaluation sarrte. Par exemple,
true || expression sera value true sans calculer la valeur de expression.
/* la valeur de c est A */
/* la valeur de i est 65, code ASCII de A */
Enfin, si c est un caractre correspondant un chiffre (c >= 0&& c <= 9), c - 0 est
la valeur entire de ce chiffre (entre 0 et 9).
5 Constantes
Les constantes sont dfinies en utilisant #define :
#define
#define
#define
#define
#define
PI 3.1415
/* Valeur de PI */
MAJORIT 18
/* ge correspondant la majorit */
TVA 19.6
/* Taux de TVA en vigueur au 15/09/2000 (en %) */
CAPACIT 120
/* Nombre maximum dtudiants dans une promotion */
INTITUL "Algorithmique et programmation"
/* par exemple */
Cours C, Semaine 1
c INPTPAD
6/26
A LGORITHMIQUE
ET PROGRAMMATION
6 Expressions
La priorit des oprateurs est diffrente. Voici la table des priorits de C.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1
2
16G
15D
13G
12G
11G
10G
9G
8G
7G
6G
5G
4G
3G
2D
1G
-> .
(unaires) sizeof ++ -- ~ ! + - * & (cast)
* / %
+ <<
>>
<
<=
>
>=
==
!=
&
^
|
&&
||
?: (si arithmtique)
= *= /= %= += -= <<= >>= &= |= ^=
,
a + b + c + d
x = y = z = t
7 Instructions dentre/sorties
7.1 Opration dentre
On utilise scanf qui est une fonction de saisie qui fonctionne avec un format dcrivant la
nature de linformation lire et donc la conversion effectuer.
1
2
3
4
5
6
7
8
9
10
char un_caractere;
int un_entier;
float un_reel;
double un_double;
scanf("%c", &un_caractere);
scanf("%d", &un_entier);
scanf("%f", &un_reel);
scanf("%lf", &un_double);
scanf("%c%d%lf", &un_caractere, &un_entier, &un_double);
Chaque % rencontr dans le format (la chane de caractres) est suivi dun caractre indiquant la nature de linformation lire (c pour caractre, d pour entier, etc.). chaque % doit
Cours C, Semaine 1
c INPTPAD
7/26
A LGORITHMIQUE
ET PROGRAMMATION
correspondre une variable donne aprs le format. Les variables sont spares par des virgules et
sont prcdes du signe & (voir sous-programmes). Le & indique que lon donne ladresse de la
variable de qui permet scanf de changer la valeur de la variable.
En faisant #include <iostream>, on peut utiliser loprateur >> :
1
2
3
4
5
6
7
8
9
10
char un_caractere;
int un_entier;
float un_reel;
double un_double;
std::cin
std::cin
std::cin
std::cin
std::cin
>>
>>
>>
>>
>>
un_caractere;
un_entier;
un_reel;
un_double;
un_caractere >> un_entier >> un_double;
char un_caractere = A;
int un_entier = 10;
float un_reel = 3.14;
double un_double = 1.10e-2;
printf("%c\n",
printf("%d\n",
printf("%f\n",
printf("%f\n",
printf("2 * %d
printf("c = %c
un_caractere);
un_entier);
un_reel);
un_double);
= %d\n", un_entier, un_entier * 2);
et nb = %f\n", un_caractere, un_double);
Notons que std::cout dsigne la sortie standard, lcran par dfaut. std::cerr dsigne la
sortie en erreur (galement relie lcran par dfaut).
Le programme affiche alors :
1
2
3
4
5
6
A
10
3.140000
0.011000
2 * 10 = 20
c = A et nb = 0.011000
char un_caractere = A;
int un_entier = 10;
Cours C, Semaine 1
c INPTPAD
8/26
A LGORITHMIQUE
3
4
5
6
7
8
9
10
11
ET PROGRAMMATION
12
<<
<<
<<
<<
<<
<<
A
10
3.14
0.011
2 * 10 = 20
c = A et nb = 0.011
Cours C, Semaine 1
c INPTPAD
9/26
A LGORITHMIQUE
10
11
12
13
int main()
{
double x;
14
15
16
17
18
19
20
21
22
ET PROGRAMMATION
/* Afficher le cube de x */
printf("Son cube est : %f\n", x * x * x);
return EXIT_SUCCESS;
}
8 Affectation
Laffectation se note avec un signe =.
Remarque : Laffectation peut tre enchane : a = b = c = 0; consiste initialiser c, b puis a
avec la valeur 0. Cest quivalent a = (b = (c = 0));.
Attention : Il ne faut pas confondre = (affectation) et == (galit).
Il exite des formes condenses de laffectation. Par exemple, x = x + y peut se noter x += y.
Ces formes condenses fonctionnent avec la plupart des oprateurs mais elles sont viter dans
le cas gnral car elles peuvent nuire la lisibilit.
x +=
x -=
x %=
x |=
...
y
y
y
y
/*
/*
/*
/*
x
x
x
x
=
=
=
=
x
x
x
x
+
%
|
y
y
y
y
*/
*/
*/
*/
Ces oprateurs peuvent tre utiliss dans des instructions (ce qui nest gnralement pas
recommand). On parle de post ou de pr car il sont respectivement excuts avant et avant
linstruction elle-mme.
Ainsi x = ++y; est quivalent :
++y;
x = y;
Cours C, Semaine 1
c INPTPAD
10/26
A LGORITHMIQUE
int
x =
y =
z =
t =
u =
ET PROGRAMMATION
x, y, z, t,
3;
7;
++x;
y--;
x++ + --y;
u;
/* x == 4, y == 7, z == 4, t == ?, u == ? */
/* x == 4, y == 6, z == 4, t == 7, u == ? */
/* x == 5, y == 5, z == 4, t == 7, u == 9 */
/*********************************************************************
: Xavier Crgut <cregut@enseeiht.fr>
* Auteur
Version
:
1.2
*
Objectif
:
Permuter
deux caractres c1 et c2
*
********************************************************************/
#include <stdio.h>
#include <stdlib.h>
int main()
{
char c1, c2;
char tmp;
14
15
16
17
/* initialiser c1 et c2 */
c1 = A;
c2 = Z;
18
19
20
21
22
/* permuter c1 et c2 */
tmp = c1;
c1 = c2;
c2 = tmp;
23
24
25
26
27
c INPTPAD
11/26
A LGORITHMIQUE
ET PROGRAMMATION
1
2
3
4
5
6
7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*********************************************************************
: Xavier Crgut <cregut@enseeiht.fr>
* Auteur
Version
:
1.1
*
Objectif
:
afficher
le cube dun nombre rel
*
********************************************************************/
#include <stdio.h>
#include <stdlib.h>
int main()
{
double x;
double cube;
18
19
20
21
22
23
24
25
26
/* Calculer le cube de x */
cube = x * x * x;
/* Afficher le cube */
printf("Son cube est : %f\n", cube);
return EXIT_SUCCESS;
}
Cours C, Semaine 1
c INPTPAD
12/26
A LGORITHMIQUE
ET PROGRAMMATION
9 Structures de contrle
9.1 Enchanement squentiel
La squence sexprime comme en algorithmique. Pour bien mettre en vidence une squence
dinstructions, on peut la mettre entre accolades. On parle alors de bloc dinstructions. Lintrt
des accolades est alors double :
il permet de considrer lensemble des instructions dans les accolades comme une seule
instruction ;
il permet de dclarer des variables (locales ce bloc).
Cette deuxime forme est largement prfrable car dans la premire on ne peut mettre quune
seule instruction contrle par le if alors que dans la seconde, on peut en mettre autant quon
veut, grce aux accolades.
Dans la suite, nous utiliserons pour toutes les structures de contrle la forme avec les accolades mais il existe la forme sans accolades (et donc avec une seule instruction) que nous
dconseillons fortement dutiliser !
Exercice 4 : Une valeur entire est-elle paire ?
crire un algorithme qui lit une valeur entire au clavier et affiche paire si elle est paire.
Solution :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
:
-> paire
-> -----> paire
Cours C, Semaine 1
c INPTPAD
13/26
A LGORITHMIQUE
15
16
17
18
ET PROGRAMMATION
| FinSi
R3 : Raffinage De n est paire
| Rsultat <- n Mod 2 = 0
Dans le raffinage prcdent un point est noter. Il sagit du raffinage R2 qui dcompose
Afficher le verdict de parit . Nous navons pas directement mis la formule n Mod 2 = 0 .
Lintrt est que la formulation n est paire est plus facile comprendre. Avec la formule,
il faut dabord comprendre la formule, puis en dduire sa signification. n est paire nous
indique ce qui nous intresse comme information (facile lire et comprendre) et son raffinage
(R3) explique comment on dtermine si n est paire. Le lecteur peut alors vrifier la formule en
sachant ce quelle est sense reprsenter.
Raffiner est quelque chose de compliquer car on a souvent tendance descendre trop vite
dans les dtails de la solution sans sarrter sur les tapes intermdiaires du raffinage alors que
ce sont elles qui permettent dexpliquer et de donner du sens la solution.
Dans cet exercice, vous vous tes peut-tre pos la question : mais comment sait-on que
n est paire . Si vous avez trouv la solution vous avez peut-re donne directement la formule
alors que le point cl est la question. Il faut la conserver dans lexpression de votre algorithme
ou programme, donc en faire une tape du raffinage.
Si vous arrivez sur une tape que vous avez du mal dcrire, ce sera toujours une indication
dune tape qui doit apparatre dans le raffinage. Cependant, mme pour quelque chose de simple,
que vous savez faire directement, il faut tre capable de donner les tapes intermdiaires qui
conduisent vers et expliquent la solution propose. Ceci fait partie de lactivit de construction
dun programme ou algorithme.
Remarque : Il est gnralement conseill dviter de mlanger traitement et entres/sorties.
Cest pourtant ce qui a t fait ci-dessus. On aurait pu crire le premier niveau de raffinage
diffremment en faisant.
1
2
3
4
5
6
7
8
9
10
11
12
n: out Entier
n: in ; paire: out Boolen
paire: in Boolen
On constate ici que la variable intermdiaire paire permet davoir un programme plus
lisible car on a donn un nom la quantit (n Mod 2) = 0.
1
2
3
4
5
/*********************************************************************
: Xavier Crgut <cregut@enseeiht.fr>
* Auteur
Version
:
Revision : 1.1
*
Objectif
:
Afficher
paire si une valeur entire est paire.
*
********************************************************************/
Cours C, Semaine 1
c INPTPAD
14/26
A LGORITHMIQUE
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
15
16
17
18
19
20
21
22
23
24
ET PROGRAMMATION
return EXIT_SUCCESS;
}
/* squence1 */
/* squence2 */
3
4
5
6
7
tests
1
2
3
:
et 2 -> 2
et 1 -> 1
et 3 -> 3
8
9
10
11
12
13
14
15
Cours C, Semaine 1
c INPTPAD
15/26
A LGORITHMIQUE
4
5
6
7
8
9
10
11
12
13
14
15
16
/*********************************************************************
: Xavier Crgut <cregut@enseeiht.fr>
* Auteur
Version
:
1.1
*
Objectif
:
Afficher
le plus grand de deux rels saisis au clavier
*
********************************************************************/
#include <stdio.h>
#include <stdlib.h>
int main()
{
double x1, x2;
double max;
17
18
19
20
21
/* Dterminer le maximum */
if (x1 > x2) {
max = x1;
}
else {
max = x2;
}
22
23
24
25
26
27
28
29
30
31
| Sinon
| | max <- x2
| FinSi
16
17
18
1
2
3
ET PROGRAMMATION
/* Afficher le maximum */
printf("max(%f, %f) = %f\n", x1, x2, max);
return EXIT_SUCCESS;
}
Cours C, Semaine 1
c INPTPAD
16/26