Vous êtes sur la page 1sur 16

PAD INPT

ALGORITHMIQUE ET PROGRAMMATION 1
Cours C, Semaine 1
maijuin 2006
Algorithmique et programmation : les bases (C)
Corrig
Rsum
Ce document dcrit lcriture dans le langage C des lments vus en algorithmique.
Table des matires
1 Pourquoi dnir notre langage algorithmique ? 3
2 Structure dun algorithme 3
2.1 Exemple dalgorithme : calculer le primtre dun cercle . . . . . . . . . . . . . 3
2.2 Structure de lalgorithme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.3 Identicateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.4 Commentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3 Variables 4
3.1 Quest ce quune variable ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3.2 Dnition dune variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
4 Types fondamentaux 5
4.1 Les entiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
4.2 Les rels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
4.3 Les boolens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
4.4 Les caractres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
4.5 Les chanes de caractres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
5 Constantes 6
6 Expressions 7
7 Instructions dentre/sorties 7
7.1 Opration dentre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
7.2 Opration de sortie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
8 Affectation 10
Cours C, Semaine 1 c INPTPAD 1/26
Extrait : 16 pages sur 26
ALGORITHMIQUE ET PROGRAMMATION 1 Algorithmique et programmation : les bases (C)
9 Structures de contrle 13
9.1 Enchanement squentiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
9.2 Instructions conditionnelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
9.2.1 Conditionnelle Si ... Alors ... FinSi . . . . . . . . . . . . . . . . . 13
9.2.2 Conditionnelle Si ... Alors ... Sinon ... FinSi . . . . . . . . . . 15
9.2.3 La clause SinonSi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
9.2.4 Conditionnelle Selon . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
9.3 Instructions de rptitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
9.3.1 Rptition TantQue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
9.3.2 Rptition Rpter ... Jusqu . . . . . . . . . . . . . . . . . . . . . . . 22
9.3.3 Rptition Pour . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
9.3.4 Quelle rptition choisir ? . . . . . . . . . . . . . . . . . . . . . . . . . 26
Liste des exercices
Exercice 1 : Cube dun rel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Exercice 2 : Permuter deux caractres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Exercice 3 : Cube dun rel (avec une variable) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Exercice 4 : Une valeur entire est-elle paire ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Exercice 5 : Maximum de deux valeurs relles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Exercice 6 : Signe dun entier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Exercice 7 : Rponse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Exercice 8 : Somme des premiers entiers (TantQue) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Exercice 9 : Saisie contrle dun numro de mois . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Exercice 10 : Plusieurs sommes des n premiers entiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Exercice 11 : Saisie contrle dun numro de mois . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Exercice 12 : Somme des premiers entiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Cours C, Semaine 1 c INPTPAD 2/26
ALGORITHMIQUE ET PROGRAMMATION 1 Algorithmique et programmation : les bases (C)
1 Pourquoi dnir notre langage algorithmique ?
2 Structure dun algorithme
2.1 Exemple dalgorithme : calculer le primtre dun cercle
Un exemple dalgorithme/programme est donn ci-dessous. Il dcrit comment obtenir le p-
rimtre dun cercle partir de son diamtre. Cet exemple est volontairement trs simple.
Listing 1 Programme C pour calculer le primtre dun cercle
1 /
**********************************************************************
2
*
Auteur : Xavier Crgut <cregut@enseeiht.fr>
3
*
Version : 1.1
4
*
Titre : Dterminer le primtre dun cercle partir de son rayon.
5
*********************************************************************
/
6
7 #include <stdio.h>
8 #include <stdlib.h>
9
10 #define PI 3.1415
11
12 int main()
13 {
14 double rayon; /
*
le rayon du cercle lu au clavier
*
/
15 double perimetre; /
*
le perimtre du cercle
*
/
16
17 /
*
Saisir le rayon
*
/
18 printf("Rayon = ");
19 scanf("%lf", &rayon);
20
21 /
*
Calculer le primtre
*
/
22 perimetre = 2
*
PI
*
rayon; /
*
par dfinition
*
/
23 /
*
{ perimetre == 2
*
PI
*
rayon }
*
/
24
25 /
*
Afficher le primtre
*
/
26 printf("Le primtre est : %4.2f\n", perimetre);
27
28 return EXIT_SUCCESS;
29 }
2.2 Structure de lalgorithme
La structure dun programme C est proche de celle dun algorithme. Le chier, qui doit avoir
lextension .c, commence par un cartouche faisant apparatre le nom des auteurs du programme,
la version ou la date de ralisation et lobjectif du programme. Ces lments sont mis dans des
commentaires et sont donc ignors par le compilateur.
Les #include correspondent des directives qui indiquent au compilateur (en fait au pr-
processeur) dinclure les chiers nomms stdio.h et stdlib.h. Ces chiers font parties de
Cours C, Semaine 1 c INPTPAD 3/26
ALGORITHMIQUE ET PROGRAMMATION 1 Algorithmique et programmation : les bases (C)
la bibliothque standard du C et donne accs des fonctions dj dnies. Par exemple les
fonctions dafchage (printf) et de lecture (scanf) sont dnies dans stdio.h. La constante
EXIT_SUCCESS est dnie dans stdlib.h. Si on ne met pas ces #include, on ne peut pas utiliser
ces fonctions ou constantes.
Le #define suivant permet de dnir la constante PI. Il correspond donc une dnition.
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 Identicateurs
Un identicateur 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 n de
la ligne (comme --). Ils peuvent tre utiliss la o on met -- en algorithmique.
3 Variables
3.1 Quest ce quune variable ?
3.2 Dnition dune variable
En C, on commence par mettre le type suivi du nom de la variable et un point-virgule.
double prix_unitaire; /
*
prix unitaire dun article (en euros)
*
/
int quantite; /
*
quantit darticles commands
*
/
char nom[20]; /
*
nom de larticle
*
/
Les types et leur signication seront prsents dans la suite du cours.
Il est possible de dclarer plusieurs variables du mme type en les sparant par des virgules
mais ceci est dconseill sauf si le mme commentaire sapplique toutes les variables.
int a, b, c; /
*
trois entiers
*
/
Cours C, Semaine 1 c INPTPAD 4/26
ALGORITHMIQUE ET PROGRAMMATION 1 Algorithmique et programmation : les bases (C)
4 Types fondamentaux
Les oprateurs de comparaison se notent : <, >, <=, >=, == et !=. Notez bien que lgalit est
note avec deux fois le caractre =.
4.1 Les entiers
Le type entier se note int. Cependant, des qualicatifs peuvent venir prciser :
sa taille, cest--dire le nombre doctets sur lequel il est reprsent (2 octets pour short,
4 pour long). La taille dun int est comprise entre celle dun short int dun long int.
Notons que int est optionnel quand on utilise short et long.
short int a; /
*
un entier court
*
/
short a; /
*
galement un entier court (int est implicite)
*
/
long l; /
*
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; /
*
un entier non sign
*
/
unsigned short s; /
*
un entier court non sign
*
/
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 /
*
1 (le reste de la division entire de 10 par 3)
*
/
10 / 3 /
*
3 (le quotient de la division entire de 10 par 3)
*
/
1 / 2 /
*
0 (le quotient de la division entire de 1 par 2)
*
/
abs(-5) /
*
5 (lentier est mis entre parenthses (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.
4.2 Les rels
Il existe deux types rels, les rels simple prcision appels float et les rels double prcision
appels double.
La valeur absolue se note fabs. Elle prend en paramtre un double et retourne un double.
Pour pouvoir lutiliser, il faut ajouter en dbut de chier #include <math.h>. Dans ce mme
module sont dnies la racine carre (sqrt), les fonctions trigonomtriques (sin, cos, etc.)...
La partir entire dun rel sobtient en faisant un cast : (int) 3.14 correspond 3. Ceci
correspond convertir en entier le rel 3.14.
4.3 Les boolens
Le type boolen nexiste pas. Cest le type entier qui remplace les boolens avec la convention
suivante : 0 correspond FAUX, tous le reste VRAI. Il faut donc comparer par rapport 0 et
non par rapport 1 ou un autre entier non nul !
Cours C, Semaine 1 c INPTPAD 5/26
ALGORITHMIQUE ET PROGRAMMATION 1 Algorithmique et programmation : les bases (C)
Cependant, il existe un module standard (<stdbool.h>) qui dnit un type boolen bool avec
les deux valeurs true et false.
Les oprateurs logiques se notent && pour Et, || pour Ou et ! pour Non.
1 && /
*
ET logique expr1 && expr2
*
/
2 || /
*
OU logique expr1 || expr2
*
/
3 ! /
*
NON logique ! expr1
*
/
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.
4.4 Les caractres
Le type caractre se note char. Les constantes caractres se notent comme en algorithmique.
Cependant, le type char est un fait un type entier et sa valeur est le code ASCII du caractre. Il
ny a donc pas de fonctions Chr et Ord.
char c;
int i;
c = A; /
*
la valeur de c est A
*
/
i = c; /
*
la valeur de i est 65, code ASCII de A
*
/
Enn, 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).
4.5 Les chanes de caractres
Les constantes chanes de caractres se notent comme en algorithmique.
1 "Une chane de caractres"
2 "Une chane avec guillement (\")"
5 Constantes
Les constantes sont dnies en utilisant #define :
#define PI 3.1415 /
*
Valeur de PI
*
/
#define MAJORIT 18 /
*
ge correspondant la majorit
*
/
#define TVA 19.6 /
*
Taux de TVA en vigueur au 15/09/2000 (en %)
*
/
#define CAPACIT 120 /
*
Nombre maximum dtudiants dans une promotion
*
/
#define INTITUL "Algorithmique et programmation" /
*
par exemple
*
/
Attention : Ne surtout pas mettre de point-virgule ( ; ) aprs la dclaration dune constante
avec #define. #define nest pas traite par le compilateur mais par le prprocesseur qui fait b-
tement du remplacement de texte. Le point-virgule provoquera donc des erreurs l o est utilise
la macro et non o elle est dnie !
Cours C, Semaine 1 c INPTPAD 6/26
ALGORITHMIQUE ET PROGRAMMATION 1 Algorithmique et programmation : les bases (C)
6 Expressions
La priorit des oprateurs est diffrente. Voici la table des priorits de C.
1 16G -> .
2 15D (unaires) sizeof ++ -- ~ ! + -
*
& (cast)
3 13G
*
/ %
4 12G + -
5 11G << >>
6 10G < <= > >=
7 9G == !=
8 8G &
9 7G ^
10 6G |
11 5G &&
12 4G ||
13 3G ?: (si arithmtique)
14 2D =
*
= /= %= += -= <<= >>= &= |= ^=
15 1G ,
1 a + b + c + d // G : associativit gauche ((a + b) + c) + d
2 x = y = z = t // D : associativit droite x = (y = (z = t))
Le dernier exemple correspond laffectation.
Solution : Pour lexercice Parenthser, on obtient donc un rsultat diffrent :
(2 + (x
*
3)) -- ok si x Entier (ou Rel)
(((- x) + (3
*
y)) <= (10 + 3)) -- ok si x et y entiers (ou rels)
((x == 0) Ou (y == 0)) -- ok si x et y entiers (ou rels)
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 char un_caractere;
2 int un_entier;
3 float un_reel;
4 double un_double;
5
6 scanf("%c", &un_caractere);
7 scanf("%d", &un_entier);
8 scanf("%f", &un_reel);
9 scanf("%lf", &un_double);
10 scanf("%c%d%lf", &un_caractere, &un_entier, &un_double);
Chaque % rencontr dans le format (la chane de caractres) est suivi dun caractre indi-
quant la nature de linformation lire (c pour caractre, d pour entier, etc.). chaque % doit
Cours C, Semaine 1 c INPTPAD 7/26
ALGORITHMIQUE ET PROGRAMMATION 1 Algorithmique et programmation : les bases (C)
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 char un_caractere;
2 int un_entier;
3 float un_reel;
4 double un_double;
5
6 std::cin >> un_caractere;
7 std::cin >> un_entier;
8 std::cin >> un_reel;
9 std::cin >> un_double;
10 std::cin >> un_caractere >> un_entier >> un_double;
Notons que std::cin dsigne lentre standard, le clavier par dfaut.
Il ny a plus faire attention ni au format utilis, ni au nombre de variables fournies.
7.2 Opration de sortie
On utilise printf qui est une fonction de saisie qui, comme scanf, fonctionne avec un format
dcrivant la nature de linformation crire et donc la conversion effectuer.
1 char un_caractere = A;
2 int un_entier = 10;
3 float un_reel = 3.14;
4 double un_double = 1.10e-2;
5
6 printf("%c\n", un_caractere);
7 printf("%d\n", un_entier);
8 printf("%f\n", un_reel);
9 printf("%f\n", un_double);
10 printf("2
*
%d = %d\n", un_entier, un_entier
*
2);
11 printf("c = %c 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 afche alors :
1 A
2 10
3 3.140000
4 0.011000
5 2
*
10 = 20
6 c = A et nb = 0.011000
Notons que lon ne met pas de & devant lexpression.
En C++ : En faisant #include <iostream>, on peut utiliser loprateur << :
1 char un_caractere = A;
2 int un_entier = 10;
Cours C, Semaine 1 c INPTPAD 8/26
ALGORITHMIQUE ET PROGRAMMATION 1 Algorithmique et programmation : les bases (C)
3 float un_reel = 3.14;
4 double un_double = 1.10e-2;
5
6 std::cout << un_caractere << std::endl;
7 std::cout << un_entier << std::endl;
8 std::cout << un_reel << std::endl;
9 std::cout << un_double << std::endl;
10 std::cout << "2
*
" << un_entier << " = " << un_entier
*
2 << std::endl ;
11 std::cout << "c = " << un_caractere
12 << " et nb = " << un_double << std::endl;
Le programme afche alors :
1 A
2 10
3 3.14
4 0.011
5 2
*
10 = 20
6 c = A et nb = 0.011
Remarque : Malheureusement, le scanf et le printf de C ne sont pas polymorphes et cest pour
cette raison que le programmeur doit prciser le format. Les oprateurs << et >> de C++ sont,
quant eux, polymorphes.
Exercice 1 : Cube dun rel
crire un programme qui afche le cube dun nombre rel saisi au clavier.
Solution :
1 R0 : Afficher le cube dun nombre rel
2
3 Tests :
4 0 -> 0
5 1 -> 1
6 2 -> 8
7 -2 -> -8
8 1.1 -> 1,331
9
10 R1 : Raffinage De Afficher le cube dun nombre rel
11 | Saisir un nombre rel x: out Rel
12 | Afficher le cube de x x: in Rel
13
14 R2 : Raffinage De Afficher le cube de x
15 | crire(x
*
x
*
x)
1 /
*********************************************************************
2
*
Auteur : Xavier Crgut <cregut@enseeiht.fr>
3
*
Version : 1.2
4
*
Objectif : afficher le cube dun nombre rel
5
********************************************************************
/
6
7 #include <stdio.h>
8 #include <stdlib.h>
9
Cours C, Semaine 1 c INPTPAD 9/26
ALGORITHMIQUE ET PROGRAMMATION 1 Algorithmique et programmation : les bases (C)
10 int main()
11 {
12 double x; /
*
un nombre saisi par lutilisateur
*
/
13
14 /
*
Saisir un nombre rel
*
/
15 printf("Nombre = ");
16 scanf("%lf", &x);
17
18 /
*
Afficher le cube de x
*
/
19 printf("Son cube est : %f\n", x
*
x
*
x);
20
21 return EXIT_SUCCESS;
22 }
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 += y /
*
x = x + y
*
/
x -= y /
*
x = x - y
*
/
x %= y /
*
x = x % y
*
/
x |= y /
*
x = x | y
*
/
...
Enn, il existe les oprateurs de pr-incrmentation et post-incrmentation (idem avec dcr-
mentation).
int i = 10;
i++; /
*
postincrmentation de i
*
/
++i; /
*
princrmentation de i
*
/
i--; /
*
postdcrmentation de i
*
/
--i; /
*
prdcrmentation de i
*
/
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;
Prenons un exemple plus compliqu :
Cours C, Semaine 1 c INPTPAD 10/26
ALGORITHMIQUE ET PROGRAMMATION 1 Algorithmique et programmation : les bases (C)
int x, y, z, t, u;
x = 3;
y = 7;
z = ++x; /
*
x == 4, y == 7, z == 4, t == ?, u == ?
*
/
t = y--; /
*
x == 4, y == 6, z == 4, t == 7, u == ?
*
/
u = x++ + --y; /
*
x == 5, y == 5, z == 4, t == 7, u == 9
*
/
La dernire instruction est quivalente :
--y; /
*
dcrmentation de y ==> y == 5
*
/
u = x + y; /
*
y = 4 + 5 ==> y == 9
*
/
x++; /
*
incrmentation de x ==> x == 5
*
/
Exercice 2 : Permuter deux caractres
crire un programme qui permute la valeur de deux variables c1 et c2 de type caractre.
Solution : Le principe est dutiliser une variable intermdiaire (tout comme on utilise un rci-
pient intermdiaire si lon veut changer le contenu de deux bouteilles).
1 /
*********************************************************************
2
*
Auteur : Xavier Crgut <cregut@enseeiht.fr>
3
*
Version : 1.2
4
*
Objectif : Permuter deux caractres c1 et c2
5
********************************************************************
/
6
7 #include <stdio.h>
8 #include <stdlib.h>
9
10 int main()
11 {
12 char c1, c2; /
*
les deux caractres permuter
*
/
13 char tmp; /
*
notre intermdiaire
*
/
14
15 /
*
initialiser c1 et c2
*
/
16 c1 = A;
17 c2 = Z;
18
19 /
*
permuter c1 et c2
*
/
20 tmp = c1;
21 c1 = c2;
22 c2 = tmp;
23
24 /
*
afficher pour vrifier
*
/
25 printf("c1 = %c et c2 = %c\n", c1, c2);
26 return EXIT_SUCCESS;
27 }
Exercice 3 : Cube dun rel (avec une variable)
Reprenons lexercice 1.
3.1 Utiliser une variable intermdiaire pour le rsoudre.
Solution : On reprend le mme R0 et les mmes tests. En fait, seule la manire de rsoudre le
problme change.
Cours C, Semaine 1 c INPTPAD 11/26
ALGORITHMIQUE ET PROGRAMMATION 1 Algorithmique et programmation : les bases (C)
1 R1 : Raffinage De Afficher le cube dun nombre rel
2 | Saisir un nombre rel x: out Rel
3 | Calculer le cube de x x: in Rel ; cube: out Rel
4 | Afficher le cube
5
6 R2 : Raffinage De Afficher le cube de x
7 | cube <- x
*
x
*
x
1 /
*********************************************************************
2
*
Auteur : Xavier Crgut <cregut@enseeiht.fr>
3
*
Version : 1.1
4
*
Objectif : afficher le cube dun nombre rel
5
********************************************************************
/
6
7 #include <stdio.h>
8 #include <stdlib.h>
9
10 int main()
11 {
12 double x; /
*
un nombre saisi par lutilisateur
*
/
13 double cube; /
*
le cube de x
*
/
14
15 /
*
Saisir un nombre rel
*
/
16 printf("Nombre = ");
17 scanf("%lf", &x);
18
19 /
*
Calculer le cube de x
*
/
20 cube = x
*
x
*
x;
21
22 /
*
Afficher le cube
*
/
23 printf("Son cube est : %f\n", cube);
24
25 return EXIT_SUCCESS;
26 }
3.2 Quel est lintrt dutiliser une telle variable ?
Solution : Lintrt dutiliser une variable intermdiaire est damliorer la lisibilit du pro-
gramme car elle permet de mettre un nom sur une donne manipule. Ici on nomme cube la
donne x
*
x
*
x.
De plus, ceci nous a permis, au niveau du rafnage, de dcoupler le calcul du cube de son af-
chage. Il est toujours souhaitable de sparer calcul des oprations dentres/sorties car linterface
avec lutilisateur est la partie dune application qui a le plus de risque dvoluer.
3.3 Excuter la main lalgorithme ainsi crit.
Solution : faire soi-mme ! On peut galement lexcuter sous le dbogueur. La seule diff-
rence cest que le dbogueur nindique pas les variables qui ont une valeur indtermine.
Cours C, Semaine 1 c INPTPAD 12/26
ALGORITHMIQUE ET PROGRAMMATION 1 Algorithmique et programmation : les bases (C)
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).
9.2 Instructions conditionnelles
9.2.1 Conditionnelle Si ... Alors ... FinSi
if (condition)
une_seule_instruction;
if (condition) {
instruction
1
;
...
instruction
n
;
}
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 ac-
colades 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 afche paire si elle est paire.
Solution :
1 R0 : Afficher paire si une valeur entire saisie au clavier est paire
2
3 tests :
4 2 -> paire
5 5 -> -----
6 0 -> paire
7
8 R1 : Raffinage De Afficher ...
9 | Saisir la valeur entire n
10 | Afficher le verdict de parit
11
12 R2 : Raffinage De Afficher le verdict de parit
13 | Si n est paire Alors
14 | | crire("paire")
Cours C, Semaine 1 c INPTPAD 13/26
ALGORITHMIQUE ET PROGRAMMATION 1 Algorithmique et programmation : les bases (C)
15 | FinSi
16
17 R3 : Raffinage De n est paire
18 | Rsultat <- n Mod 2 = 0
Dans le rafnage prcdent un point est noter. Il sagit du rafnage R2 qui dcompose
Afcher 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 signication. n est paire nous
indique ce qui nous intresse comme information (facile lire et comprendre) et son rafnage
(R3) explique comment on dtermine si n est paire. Le lecteur peut alors vrier la formule en
sachant ce quelle est sense reprsenter.
Rafner 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 rafnage 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 rafnage.
Si vous arrivez sur une tape que vous avez du mal dcrire, ce sera toujours une indication
dune tape qui doit apparatre dans le rafnage. 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 rafnage
diffremment en faisant.
1 R1 : Raffinage De Afficher ...
2 | Saisir la valeur entire n: out Entier
3 | Dterminer la parit de n n: in ; paire: out Boolen
4 | Afficher le verdict de parit paire: in Boolen
5
6 R2 : Raffinage De Dterminer la parit de n
7 | parit <- (n Mod 2) = 0
8
9 R2 : Raffinage De Afficher le verdict de parit
10 | Si paire Alors
11 | | crire("paire")
12 | FinSi
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
*
Auteur : Xavier Crgut <cregut@enseeiht.fr>
3
*
Version : Revision : 1.1
4
*
Objectif : Afficher paire si une valeur entire est paire.
5
********************************************************************
/
Cours C, Semaine 1 c INPTPAD 14/26
ALGORITHMIQUE ET PROGRAMMATION 1 Algorithmique et programmation : les bases (C)
6
7 #include <stdio.h>
8 #include <stdlib.h>
9
10 int main()
11 {
12 int n; /
*
valeur saisie au clavier
*
/
13
14 /
*
Saisir la valeur entire n
*
/
15 printf("Valeur = ");
16 scanf("%d", &n);
17
18 /
*
Afficher le verdict de parit
*
/
19 if (n % 2 == 0) { /
*
{ n est paire }
*
/
20 printf("paire\n");
21 }
22
23 return EXIT_SUCCESS;
24 }
9.2.2 Conditionnelle Si ... Alors ... Sinon ... FinSi
if (condition) { /
*
squence
1 *
/
instruction
1,1
;
...
}
else { /
*
! condition
*
/ /
*
squence
2 *
/
instruction
2,1
;
...
}
Exercice 5 : Maximum de deux valeurs relles
tant donnes deux valeurs relles lues au clavier, afcher lcran la plus grande des deux.
Solution :
1 R0 : Afficher le plus grand de deux rels saisis au clavier
2
3 tests :
4 1 et 2 -> 2
5 2 et 1 -> 1
6 3 et 3 -> 3
7
8 R1 : Raffinage De Afficher le plus grand de deux rels ...
9 | Saisir les deux rels x1, x2 : out Rel
10 | Dterminer le maximum x1, x2 : in ; max : out Rel
11 | Afficher le maximum
12
13 R2 : Raffinage De Dterminer le maximum
14 | Si x1 > x2 Alors
15 | | max <- x1
Cours C, Semaine 1 c INPTPAD 15/26
ALGORITHMIQUE ET PROGRAMMATION 1 Algorithmique et programmation : les bases (C)
16 | Sinon
17 | | max <- x2
18 | FinSi
1 /
*********************************************************************
2
*
Auteur : Xavier Crgut <cregut@enseeiht.fr>
3
*
Version : 1.1
4
*
Objectif : Afficher le plus grand de deux rels saisis au clavier
5
********************************************************************
/
6
7 #include <stdio.h>
8 #include <stdlib.h>
9
10 int main()
11 {
12 double x1, x2; /
*
les deux rels saisis au clavier
*
/
13 double max; /
*
le plus grand de x1 et x2
*
/
14
15 /
*
Saisir les deux rels
*
/
16 printf("Deux rels : ");
17 scanf("%lf%lf", &x1, &x2);
18
19 /
*
Dterminer le maximum
*
/
20 if (x1 > x2) {
21 max = x1;
22 }
23 else {
24 max = x2;
25 }
26
27 /
*
Afficher le maximum
*
/
28 printf("max(%f, %f) = %f\n", x1, x2, max);
29
30 return EXIT_SUCCESS;
31 }
9.2.3 La clause SinonSi
if (condition
1
) { /
*
squence
1 *
/
instruction
1,1
;
...
}
else if (condition
2
) { /
*
squence
2 *
/
instruction
2,1
;
...
}
...
else if (condition
n,1
) { /
*
squence
n *
/
instruction
n,1
;
...
Cours C, Semaine 1 c INPTPAD 16/26

Vous aimerez peut-être aussi