You are on page 1of 16

Extrait : 16 pages sur 26

PAD INPT

Cours C, Semaine 1

A LGORITHMIQUE ET

PROGRAMMATION 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 dfinir notre langage algorithmique ?

2 Structure dun algorithme


2.1 Exemple dalgorithme : calculer le primtre dun cercle
2.2 Structure de lalgorithme . . . . . . . . . . . . . . . . .
2.3 Identificateurs . . . . . . . . . . . . . . . . . . . . . . .
2.4 Commentaires . . . . . . . . . . . . . . . . . . . . . . .

.
.
.
.

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

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

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

/* le rayon du cercle lu au clavier */


/* le perimtre du cercle */

/* 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 fichier, 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 fichiers nomms stdio.h et stdlib.h. Ces fichiers 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 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];

/* prix unitaire dun article (en euros) */


/* quantit darticles commands */
/* nom de larticle */

Les types et leur signification 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;

Cours C, Semaine 1

/* trois entiers */

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 qualificatifs 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 fichier #include <math.h>. Dans ce mme
module sont dfinies 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 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

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

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).

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

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 dfinie !

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)
= *= /= %= += -= <<= >>= &= |= ^=
,

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

// G : associativit gauche ((a + b) + c) + d


// 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))
(((- 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

Cours C, Semaine 1

c INPTPAD

7/26

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

3
4
5
6
7
8
9
10
11

ET PROGRAMMATION

Algorithmique et programmation : les bases (C)

float un_reel = 3.14;


double un_double = 1.10e-2;
std::cout
std::cout
std::cout
std::cout
std::cout
std::cout

12

<<
<<
<<
<<
<<
<<

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

10
11
12
13

int main()
{
double x;

Algorithmique et programmation : les bases (C)

/* un nombre saisi par lutilisateur */

/* Saisir un nombre rel */


printf("Nombre = ");
scanf("%lf", &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

*/
*/
*/
*/

Enfin, 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

int
x =
y =
z =
t =
u =

ET PROGRAMMATION

x, y, z, t,
3;
7;
++x;
y--;
x++ + --y;

Algorithmique et programmation : les bases (C)

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

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

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

/* afficher pour vrifier */


printf("c1 = %c et c2 = %c\n", c1, c2);
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

A LGORITHMIQUE

ET PROGRAMMATION

Algorithmique et programmation : les bases (C)

1
2
3
4

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

5
6
7

R2 : Raffinage De Afficher le cube de x


| cube <- x * x * x

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;

/* Saisir un nombre rel */


printf("Nombre = ");
scanf("%lf", &x);

18
19
20
21
22
23
24
25
26

/* un nombre saisi par lutilisateur */


/* le cube de 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 raffinage, de dcoupler le calcul du cube de son affichage. 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 affiche 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

15
16
17
18

ET PROGRAMMATION

Algorithmique et programmation : les bases (C)

| 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

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

6
7
8
9
10
11
12
13
14

Algorithmique et programmation : les bases (C)

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

/* valeur saisie au clavier */

/* Saisir la valeur entire n */


printf("Valeur = ");
scanf("%d", &n);

15
16
17
18

/* Afficher le verdict de parit */


if (n % 2 == 0) {
/*{ n est paire }*/
printf("paire\n");
}

19
20
21
22
23
24

ET PROGRAMMATION

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, afficher lcran la plus grande des deux.
Solution :
1
2

R0 : Afficher le plus grand de deux rels saisis au clavier

3
4
5
6
7

tests
1
2
3

:
et 2 -> 2
et 1 -> 1
et 3 -> 3

8
9
10
11

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

12
13
14
15

R2 : Raffinage De Dterminer le maximum


| Si x1 > x2 Alors
| | max <- x1

Cours C, Semaine 1

c INPTPAD

15/26

A LGORITHMIQUE

4
5
6
7
8
9
10
11
12
13
14
15
16

Algorithmique et programmation : les bases (C)

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

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

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

You might also like