Vous êtes sur la page 1sur 16

Extrait : 16 pages sur 26

PAD INPT A LGORITHMIQUE 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 ? 2 Structure dun algorithme 2.1 Exemple dalgorithme : calculer le primtre dun cercle 2.2 Structure de lalgorithme . . . . . . . . . . . . . . . . . 2.3 Identicateurs . . . . . . . . . . . . . . . . . . . . . . . 2.4 Commentaires . . . . . . . . . . . . . . . . . . . . . . . 3 3 3 3 4 4 4 4 4 5 5 5 5 6 6 6 7 7 7 8 10

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

3 Variables 3.1 Quest ce quune variable ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Dnition dune variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 Constantes 6 Expressions 7 Instructions dentre/sorties 7.1 Opration dentre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2 Opration de sortie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Affectation

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

Cours C, Semaine 1

c INPTPAD

1/26

A LGORITHMIQUE

ET PROGRAMMATION

Algorithmique et programmation : les bases (C)

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

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

A LGORITHMIQUE

ET PROGRAMMATION

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 primtre dun cercle partir de son diamtre. Cet exemple est volontairement trs simple. Listing 1 Programme C pour calculer le primtre dun cercle
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

/********************************************************************** * 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;

/* le rayon du cercle lu au clavier */ /* le perimtre du cercle */

/* Saisir le rayon */ printf("Rayon = "); scanf("%lf", &rayon); /* Calculer le primtre */ perimetre = 2 * PI * rayon; /* par dfinition */ /*{ perimetre == 2 * PI * rayon }*/ /* Afficher le primtre */ printf("Le primtre est : %4.2f\n", perimetre); return EXIT_SUCCESS; }

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 prprocesseur) dinclure les chiers nomms stdio.h et stdlib.h. Ces chiers font parties de
Cours C, Semaine 1

c INPTPAD

3/26

A LGORITHMIQUE

ET PROGRAMMATION

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; int quantite; char nom[20]; /* prix unitaire dun article (en euros) */ /* quantit darticles commands */ /* 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

A LGORITHMIQUE

ET PROGRAMMATION

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; short a; long l; /* 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; /* un entier non sign */ /* 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 10 / 3 1 / 2 abs(-5) /* /* /* /* 1 3 0 5 (le reste de la division entire de (le quotient de la division entire (le quotient de la division entire (lentier est mis entre parenthses 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.

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

A LGORITHMIQUE

ET PROGRAMMATION

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 2 3

&& || !

/* ET logique /* OU logique /* NON logique

expr1 && expr2 expr1 || expr2 ! 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; i = c;

/* la valeur de c est A */ /* 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 2

"Une chane de caractres" "Une chane avec guillement (\")"

5 Constantes
Les constantes sont dnies 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 */

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 btement 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

A LGORITHMIQUE

ET PROGRAMMATION

Algorithmique et programmation : les bases (C)

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) = *= /= %= += -= <<= >>= &= |= ^= , // G : associativit gauche ((a + b) + c) + d // D : associativit droite x = (y = (z = t))

a + b + c + d x = y = z = t

Le dernier exemple correspond laffectation. Solution : Pour lexercice Parenthser, on obtient donc un rsultat diffrent :
(2 + (x * 3)) (((- x) + (3 * y)) <= (10 + 3)) ((x == 0) Ou (y == 0)) -- ok si x Entier (ou Rel) -- ok si x et y entiers (ou rels) -- 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 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 c INPTPAD 7/26

Cours C, Semaine 1

A LGORITHMIQUE

ET PROGRAMMATION

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 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;

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 2 3 4 5 6 7 8 9 10 11

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 afche alors :
1 2 3 4 5 6

A 10 3.140000 0.011000 2 * 10 = 20 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 2

char un_caractere = A; int un_entier = 10;

Cours C, Semaine 1

c INPTPAD

8/26

A LGORITHMIQUE

ET PROGRAMMATION

Algorithmique et programmation : les bases (C)

3 4 5 6 7 8 9 10 11 12

float un_reel = 3.14; double un_double = 1.10e-2; std::cout std::cout std::cout std::cout std::cout std::cout << << << << << << un_caractere << std::endl; un_entier << std::endl; un_reel << std::endl; un_double << std::endl; "2 * " << un_entier << " = " << un_entier * 2 << std::endl ; "c = " << un_caractere << " et nb = " << un_double << std::endl;

Le programme afche alors :


1 2 3 4 5 6

A 10 3.14 0.011 2 * 10 = 20 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 4 5 6 7 8 9

R0 : Afficher le cube dun nombre rel Tests : 0 -> 0 1 -> 1 2 -> 8 -2 -> -8 1.1 -> 1,331 R1 : Raffinage De Afficher le cube dun nombre rel | Saisir un nombre rel x: out Rel | Afficher le cube de x x: in Rel R2 : Raffinage De Afficher le cube de x | crire(x * x * x) /********************************************************************* : Xavier Crgut <cregut@enseeiht.fr> * Auteur Version : 1.2 * * Objectif : afficher le cube dun nombre rel ********************************************************************/ #include <stdio.h> #include <stdlib.h>

Cours C, Semaine 1

c INPTPAD

9/26

A LGORITHMIQUE

ET PROGRAMMATION

Algorithmique et programmation : les bases (C)

10 11 12 13 14 15 16 17 18 19 20 21 22

int main() { double x;

/* un nombre saisi par lutilisateur */

/* Saisir un nombre rel */ printf("Nombre = "); scanf("%lf", &x); /* 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 */ */ */ */

Enn, il existe les oprateurs de pr-incrmentation et post-incrmentation (idem avec dcrmentation).


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

A LGORITHMIQUE

ET PROGRAMMATION

Algorithmique et programmation : les bases (C)

int x = y = z = t = u =

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 */

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 rcipient intermdiaire si lon veut changer le contenu de deux bouteilles).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

/********************************************************************* : 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;

/* les deux caractres permuter */ /* notre intermdiaire */

/* initialiser c1 et c2 */ c1 = A; c2 = Z; /* permuter c1 et c2 */ tmp = c1; c1 = c2; c2 = tmp; /* afficher pour vrifier */ printf("c1 = %c et c2 = %c\n", c1, c2); return EXIT_SUCCESS; }

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

A LGORITHMIQUE

ET PROGRAMMATION

Algorithmique et programmation : les bases (C)

1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

R1 : Raffinage De Afficher le cube dun nombre rel | Saisir un nombre rel x: out Rel | Calculer le cube de x x: in Rel ; cube: out Rel | Afficher le cube R2 : Raffinage De Afficher le cube de x | cube <- x * x * x /********************************************************************* : 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;

/* un nombre saisi par lutilisateur */ /* le cube de x */

/* Saisir un nombre rel */ printf("Nombre = "); scanf("%lf", &x); /* Calculer le cube de x */ cube = x * x * x; /* Afficher le cube */ printf("Son cube est : %f\n", cube); return EXIT_SUCCESS; }

3.2 Quel est lintrt dutiliser une telle variable ? Solution : Lintrt dutiliser une variable intermdiaire est damliorer la lisibilit du programme 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 afchage. 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 diffrence cest que le dbogueur nindique pas les variables qui ont une valeur indtermine.

Cours C, Semaine 1

c INPTPAD

12/26

A LGORITHMIQUE

ET PROGRAMMATION

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) { instruction1 ; ... instructionn ; }

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 afche paire si elle est paire. Solution :
1 2 3 4 5 6 7 8 9 10 11 12 13 14

R0 : Afficher paire si une valeur entire saisie au clavier est paire tests 2 5 0 : -> paire -> -----> paire

R1 : Raffinage De Afficher ... | Saisir la valeur entire n | Afficher le verdict de parit R2 : Raffinage De Afficher le verdict de parit | Si n est paire Alors | | crire("paire")

Cours C, Semaine 1

c INPTPAD

13/26

A LGORITHMIQUE

ET PROGRAMMATION

Algorithmique et programmation : les bases (C)

15 16 17 18

| FinSi R3 : Raffinage De n est paire | 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 2 3 4 5 6 7 8 9 10 11 12

R1 : Raffinage De Afficher ... | Saisir la valeur entire | Dterminer la parit de n | Afficher le verdict de parit

n: out Entier n: in ; paire: out Boolen paire: in Boolen

R2 : Raffinage De Dterminer la parit de n | parit <- (n Mod 2) = 0 R2 : Raffinage De Afficher le verdict de parit | Si paire Alors | | crire("paire") | 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 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

ET PROGRAMMATION

Algorithmique et programmation : les bases (C)

6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

#include <stdio.h> #include <stdlib.h> int main() { int n;

/* valeur saisie au clavier */

/* Saisir la valeur entire n */ printf("Valeur = "); scanf("%d", &n); /* Afficher le verdict de parit */ if (n % 2 == 0) { /*{ n est paire }*/ printf("paire\n"); } return EXIT_SUCCESS; }

9.2.2 Conditionnelle Si ... Alors ... Sinon ... FinSi


if (condition) { instruction1,1 ; ... } else { /* ! condition */ instruction2,1 ; ... } /* squence1 */

/* squence2 */

Exercice 5 : Maximum de deux valeurs relles tant donnes deux valeurs relles lues au clavier, afcher lcran la plus grande des deux. Solution :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

R0 : Afficher le plus grand de deux rels saisis au clavier tests 1 2 3 : et 2 -> 2 et 1 -> 1 et 3 -> 3

R1 : Raffinage De Afficher le plus grand de deux rels ... | Saisir les deux rels x1, x2 : out Rel | Dterminer le maximum x1, x2 : in ; max : out Rel | Afficher le maximum R2 : Raffinage De Dterminer le maximum | Si x1 > x2 Alors | | max <- x1

Cours C, Semaine 1

c INPTPAD

15/26

A LGORITHMIQUE

ET PROGRAMMATION

Algorithmique et programmation : les bases (C)

16 17 18 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

| Sinon | | max <- x2 | FinSi /********************************************************************* : 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;

/* les deux rels saisis au clavier */ /* le plus grand de x1 et x2 */

/* Saisir les deux rels */ printf("Deux rels : "); scanf("%lf%lf", &x1, &x2); /* Dterminer le maximum */ if (x1 > x2) { max = x1; } else { max = x2; } /* Afficher le maximum */ printf("max(%f, %f) = %f\n", x1, x2, max); return EXIT_SUCCESS; }

9.2.3 La clause SinonSi


if (condition1 ) { /* squence1 */ instruction1,1 ; ... } else if (condition2 ) { /* squence2 */ instruction2,1 ; ... } ... else if (conditionn,1 ) { /* squencen */ instructionn,1 ; ...

Cours C, Semaine 1

c INPTPAD

16/26