Les structures de contrôle en C
O b j ectifs p édagogiques :
Écrire la syntaxe des structures for, while
et do…while en C; Utiliser l’operateur
conditionnelle (?) et virgule ;
S i tuation problème :
P Votre amie souhaite écrire un programme C qui calcule et
affiche la table de R multiplication d’un nombre positif saisi
par l’utilisateur. Elle souhaite donc que ce O programme
affiche à chaque fois un message à l’utilisateur s’il saisi un
nombre G négatif. Rencontrant des problèmes sur l’écriture
de ce programme, elle donc appel R à vous dans le but de
l’aider. A
C o n s i g ne s :
M
1. Qu’entend-on par structure de contrôle ?
M
2. Énumérer les différentes structures de contrôle utilisées en
programmation. E
3. Quelle structure utilise-t-on dans le cas où la condition se
traite en deux cas R
possibles ?
4. Quelle structure utilise-t-on dans chacun des cas suivants :
E
- La répétition connue d’un bloc instructions d’un programme ?
N
- La répétition non connue d’un bloc instructions d’un
programme ?
147
C
En programmation informatique, une st ructure d
e co ntrôle est une instruction particulière d'un langage
de programmation impératif pouvant dévier le flot de
contrôle du programme la contenant lorsqu'elle est
exécutée. Le langage C propose plusieurs structures de
contrôle différentes, qui nous permettent de nous adapter
à tous les cas possibles. Il permet d’utiliser les
conditions (structure s alternatives), des boucles
(structures itératives).
148
St ructure alternative (if...else...)
Il s’agit de tester une condition et d’effectuer une
série d’instructions si la condition est vraie et si elle est
fausse, effectuer une autre série d’instructions.
Il existe deux formes de structures conditionnelles :
L a f orme réduite
if (condition)
{
bloc instructions
P
1
R }
O
G E x emple : le programme C qui prend en entrée un
nombre puis affiche le
R message « positif » si c’est ce nombre est
supérieur à 0 est :
A #include
<Stdio.h> M int
main (void) { M
int n ;
E printf ("saisir un
nombre");
R
scanf("%d",&n);
if (n>0)
{
E
printf("Positif");
}
N
Return
0;
}
C
L a f orme complète
if (condition) {
bloc instructions 1
} else {
bloc instructions 2
148
E x emple : le programme C qui permet d’étudier la parité
d’un nombre saisi par
l’utilisateur est :
#include
<Stdio.h> int
main (void) {
int n ;
printf ("saisir un nombre");
scanf("%d",&n);
if (n%2==0) {
printf("%d",n,"est paire");
P
} else {
R
printf("%d",n,"est impaire");
O
}
G
Return 0;
R
}
A L ’opérateurs conditionnel ?
M
L’opérateur conditionnel ? est un opérateur ternaire. Sa
M
syntaxe est la suivante :
co ndition ? expression 1 : expression 2 ;
E
Cette expression est égale à e x pression 1 si co ndition est
R
satisfaite, et à e xpression 2
sinon.
E x emple : le programme C qui calcule la valeur absolue d’un
n
149
o
m
b
r
e
e
s
t
:
E
N
#include <Stdio.h>
int main (void) {
C
int x, abs;
abs=((x>=0)? x : -x)
; printf(" abs=
%d",abs);
}
Return 0;
}
150
L ’opérateur virgule
Une expression peut être constitué d’une suite
d’expressions séparées par des
virgules : e x pression 1 , e xpression 2 , …… , e xpression n ;
Cette expression est alors évaluée de gauche à droite. Sa valeur sera la valeur
de l’expression de droite. Par exemple, le programme
#include <Stdio.h>
P int main (void) {
R int a, b ;
O b=((a=3),(a+2)) ;
printf(" b= %d",b);
G
}
R
Return 0;
A
}
M
M retournera 5 à la sortie.
E NB : la virgule séparant les arguments d’une fonction ou les
déclarations des variables
R n’est pas l’opérateur virgule.
E
N
St ructures itératives
Toutes les structures itératives répètent l’exécution de
traitement(s). Deux
cas sont cependant à envisager, selon que :
C
- Le nombre de répétitions est connu à l’avance : c’est le cas
des boucles itératives.
- Le nombre de répétitions n’est pas connu ou est variable :
c’est le cas des boucles
conditionnelles.
Bo ucle
for
Cette structure est une boucle itérative ; elle consiste à
répéter un certain
traitement un nombre de fois fixé à l’avance. Cette structure
est donnée par :
for (initialisation ; condition ;incrémentation ) {
bloc instructions;
}
150
E x emple : Affichage de nombres plus petit ou égal à 5.
for (i=0 ;i<=5 ; i++ ) {
printf(" i=%d",i);
Bo ucle while
Parfois, pour réaliser une tâche, on doit effectuer
plusieurs fois les même s instructions, sans que le nombre
P
de fois soit déterminé à l’avance. On utilise alors une
R
boucle conditionnelle. Dans cette structure, le même
traitement est effectué tant qu’une condition reste valide ;
O
la boucle s’arrête quand celle -ci n’est plus remplie. Cette
G
structure répétitive est ainsi formulée :
R
While (condition vraie) {
A
M
bloc instructions;
M
}
E
E x emple : affichage des nombres plus petit que 5
R
i=0 ;
E
While (i < 5) {
N
printf("i=%d",i);
151 151
i++;
C
}
Bo ucle do…while
Une variante de structure répétitive avec boucle
conditionnelle consiste à répéter un traitement jusqu’à ce
qu’une certaine condition soit vérifiée. Dans ce cas, la
boucle est exécutée au moins une fois, après quoi on
teste la condition. On la traduit par l’instruction :
152 152
do {
bloc
instructions;
} While (condition);
E x emple : affichage des nombres plus petit que 5
i=0;
P do {
R printf("i=%d",i) ;
O i++;
G } While (i<5) ;
R
A
M
M
E
R
E
N
153 153
EXERCICES
Ex
ercice 1
Soit le programme suivant :
P
R
O
G
R
A
Ecrire un programme C réalisant exactement la même chose,
M
en utilisant : a) Une instruction while;
M
b) Une instruction do ... while
E
R
Ex
ercice 2
Écrire un programme C pour calculer la moyenne de notesE
fournies au clavier. Le
nombre de notes n’est pas connu à priori et l ’utilisateur peut en
N
fournir autant qu’il
le désire. Pour signaler qu’il a terminé on convient de fournir
une note négative non
comptée dans la moyenne.
C
154 154
Ex
ercice 3
Écrire un programme C pour Déterminer si un nombre
entier fourni en donnée est premier ou non
Ex
ercice 4
Écrire un programme qui affiche la table de multiplication
des nombres de 1 à 10
155 155
E x ercice 5
Soit le programme C ci-
dessous :
#include
<Stdio.h> int
main (void) {
int a,b,m;
m =((a>b)? a : b)
;
printf("%d",m)
;
}
P
Return 0;
R
}
O
G
a. Que fait ce programme ?
R
b. Traduire ce programme en utilisant la structure alternative.
A
M
M
E
R
E
N
156 156
Les tableaux en C
O b j ectif p édagogique :
Déclarer un tableau en C ;
S i tuation problème :
Votre camarade Ali souhaite écrit un programme C qui
calculera la moyenne arithmétique de 50 nombres. Votre
petit frère lui conseil d’utiliser le tableau dans P son
programme pour stocker les 50 nombres. Ne connaissant pas
comment utiliser R
le tableau en C, il fait appel à vous dans le but de l’aider.
O
C o nsignes :
G
1. Définir tableau
R
2. Donner l’intérêt de l’utilisation d’un tableau
A
3. Donner les caractéristiques d’un tableau
M
4. Donner la syntaxe de déclaration d’un tableau en langage C
M
5. Expliquer comment, on remplit un tableau avec ses
éléments en C E
6. Expliquer comment on accède aux différents éléments d’un
tableau en C. R
155 155
I. DÉCLARATION D’UN TABLEAU
N
Un tableau est un ensemble fini d’éléments de même
type, stockés en
mémoire à des adresses contiguës.
C
La déclaration d’un tableau à une dimension se fait
de la façon suivante :
t y pe nom-du-tableau[nombre-éléments] ;
où no mbre-éléments est une expression constante entière
positive. Par exemple : int t ab [10] ; indique que t ab est
un tableau de 10 éléments de type i nt .
Pour plus de clarté, il est nécessaire de donner un
nom à la constante
no mbre-éléments par une directive au préprocesseur, par
exemple
# d e fine nombre-éléments 10
De façon similaire, on peut déclarer un tab leau à
plusieurs dimensions. Par exemple pour un tableau à deux
dimensions :
156 156
t y pe nom-du-tableau[nombre-lignes] [ nombre-colonnes] ;
E x emple : i nt t ab [10][8] est un tableau à deux
dimensions de 10 lignes et de 8 colonnes.
II. AJOUT DES ÉLÉMENTS D’UN TABLEAU
Pour remplir les différents éléments du tableau, on
pourra affecter à chaque case de ce tableau une valeur.
P E x
emple : int tab[2]
R ; tab[0]=10 10 9
O
; tab[1]= 9
G
R ;
A
M Évidemment, à ce rythme-là, l’affectation est longue,
surtout si votre tableau
est de grande taille. C’est pourquoi on utilise la boucle
M
itérative f o r.
E On peut initialiser le tableau lors de sa création par une
liste de constantes
de la façon suivante :
R
t y pe nom-du-tableau[N ]={ constante-1,…,constante-N} ;
Par exemple, on peut écrire :
E
N # d efine N 4
i nt t ab[N]={1,2,3,4} ;
C
1 2 3 4
III. ACCÈS AUX ÉLÉMENTS D’UN TABLEAU
157 157
On accède à un élément du tableau en lui
appliquant l’operateur []. Les éléments d’un tableau sont
toujours numérotés de 0 à no mbre-éléments-1
Par exemple l’instruction p ri ntf("%d",tab[2]) ; affiche le
troisième élément du
tableau (contenu du tableau à l’indice i=2).
On pourra afficher tous les éléments du tableau en
utilisant la boucle for. Le programme ci-dessous réalise la
tâche.
158 158
#include <Stdio.h>
#define N 10
int main ()
{ int
tab[N]; int
i;
……………
for (i=0;i<N;i++) {
printf("tab[%d]=%d\n",I,tab[i]);
}
P
Return 0;
R
}
O
G
R
A
M
M
E
R
E
N
159 159
EXERCICES
Ex
ercice 1
Écrire un programme C qui calcule la moyenne de 5
nombres saisi par l’utilisateur.
Ex
ercice 2
1. Définir tableau puis donner 03 éléments qui caractérisent un
tableau.
2. Quel inconvénient présente le remplissage d’un tableau en
utilisant l’affectation ?
P Quelle autre méthode proposeriez -vous pour résoudre ce
problème ?
R
O
E x ercice 3
G 1. Écrire un programme C qui permet de rechercher le plus
petit élément d’un
R tableau à 20 éléments.
A 2. Écrire un programme C qui permet de rechercher le nom
d’un candidat parmi les
M noms de 50 candidats admis à un concours.
M 3. Écrire un programme C qui permet de faire la somme de
10 éléments d’un
E tableau.
R 4. Écrire un programme C permettant de créer les tableaux ci-
dessous :
E T ableau 1 :
N
160 160
12 13 14 15 222
T ableau 2 :
C
2 3 4 5 22 1 2 1 2 3
11 22 11 22 3 4 12 14 14 6
161 161
Les sous-programmes en
C
O b j ectif p édagogique :
Déclarer et appeler un sous-programme en C ;
S i t ua t i o n p
rob l è m e :
Votre ami Isaac a utilisé le langage C pour créer une
calculatrice qui effectue
les opérations d’addition, de soustraction, de division et de
multiplication. Il constate P que le code source de son
programme est touffu et volumineux ce qui lui rend R
difficile la compréhension de son code. Il cherche donc un
moyen très efficace pour O mieux structurer son programme.
Pour cela il fait appel à vous dans le but de l’aider. GC o
n s i g ne s :
R
1. Que doit faire votre ami Isaac pour organiser et mieux
comprendre son code ? A
2. Comment appelle-t-on le sous-programme en C ?
M
3. Donner la syntaxe de définition d’une fonction en C
M
4. Comment fait-on appel à une fonction en langage C ?
E
R
I. DÉFINITION D’UNE
FONCTION
162 162
L’écriture et la compréhension d’un programme peut
s’avérer difficile E lorsque le nombre d’instructions
devient trop important. A ce moment, le N programme
devient lourd et son exécution par l’ordinateur devient
beaucoup plus lente. Pour pallier ce problème, on a mis sur
pied la notion de sous-programme C informatique dont
l’objectif principal est de scinder un programme complexe
et touffu en plusieurs sous-programmes plus simples et plus
efficaces. En C, les sous programmes sont appelés les f o
nctions.
A part la fonction principale main() qui est obligatoire, les
autres fonctions
d’un programme C sont dites
fonctions secondaires.
Une fonction en C se définit de la
manière suivante :
t y pe nom-fonction (type-1 argument-1,
…,type-n argument-n)
{
[ d éclarations d es
variables l ocales]
l i stes d ’instructions
163 163
}
La première ligne de cette définition est l ’e n-tête de la
fonction. Dans cet
en-tête, t y pe désigne le type de la fonction, c’est -à dire
le type de la valeur qu’elle
retour
ne. N B
:
Contrairement à d’autres langage de programmation, en
C, il n’y a pas la notion de procédures et de sous-
programme. Une fonction qui ne renvoie pas de valeur est
une fonction dont le type est spécifié par le mot clé vo i
d. Les arguments de la
fonction sont appelés p aramètres formels, par opposition aux
P
p aramètres e ffectifs.
Si la fonction ne possède pas de paramètres, on remplace la
R
liste de paramètres
formels par le mot clé vo id.
O
Le corps de la fonction débute par des déclarations de
G
variables locales à cette
fonction. Il se termine par l’instruction de retour à la fonction
R
appelante, re turn, dont
la syntaxe est : re turn(expression) ;
A
La valeur e x pression est la valeur que retourne la fonction.
M
Son type doit être de le
même que celui qui a été spécifié dans l’entête de la
fonction. Si la fonction ne
M
retourne pas de valeur(fonction de type void), sa définition
s’achève
E par re t urn ;
R E x emples :
Une fonction calculant le produit de deux nombres est :
E int produit (int a, int b) {
160 160
N int p ;
p=a*b;
return p ;
C
}
Une fonction qui imprime les N éléments
d’un tableau est :
void imprime-tab (int *tab, int N) {
int i ;
for(i=0; i<N; i++){
printf("%d \t ", tab[i]);
}
return ;
}
161 161
II. APPEL D’UNE FONCTION
L’appel d’une fonction se fait par
l’expression no m-
fonction (paramètre-1,
…,paramètre -n )
N B : L’ordre et le type des paramètres effectifs doivent
concorder avec les ceux
donnés dans l’en-tête de la fonction.
III. DÉCLARATION D’UNE FONCTION
La déclaration d’une fonction en langage C peut être
faite soit avant, soit après la fonction principale mai n().
Toutefois, il est indispensable que le compilateur P connaisse
la fonction au moment ou elle celle -ci est appelée. Si une
fonction est R
définie après son premier appel (en particulier si sa définition
est placée après la O
fonction main), elle doit être impérativement déclarée au
préalable. Une fonction G
secondaire est déclarée par son prototype, qui donne le type
de la fonction et celui R
de ses paramètres, sous la forme :
A
t y pe nom-fonction(type-1,…,type-n ) ;
M
E x emple :
M
E
int produit (int , int) ; return a*b;
}
int produit (int a , int
b){
162 162
int main() { Déclaration de la fonction
R
int c=2,d=5 ;
Définition de la fonction
printf("%d\ E
n",produit(c,d)); N
}
C
Appel de la fonction
163 163
IV. NOTION DE VARIABLE LOCALE ET GLOBALE
D é f i ni t i o n s :
Une variable g lobale : est une variable déclarée en
dehors de toute fonction. Elle est connue d compilateur
dans toute la portion de code qui suit sa déclaration.
Une variable l ocale : est une variable déclarée en
l’intérieur d’une fonction
(ou d’un bloc d’instructions) du programme.
N B : Les variables locales n’ont en particulier aucun lien avec
des variables globales
de même nom.
P
R
O
G
R
A
M
M
E
R
E
N
164 164
EXERCICES
Ex
ercice 1
On veut écrire un programme C qui calcule la moyenne de 50
nombres saisis par
l’utilisateur.
a. Écrire une fonction nommée L e cture qui permet de lire les
50 nombres puis les
stockent dans un tableau de taille 50.
b. Écrire une autre fonction nommée so mme qui permet de
sommer les 50 nombres P stockés dans le tableau.
R c. Écrire une autre fonction nommée mo yenne qui calcule
la moyenne de ces 50 O nombres.
G d. Écrire la fonction principale faisant appel à ces
fonctions pour résoudre le R problème posé.
AM
E x ercice 2 M
1. Définir fonction
E
2. Quel mot clef utilisé en C et qu’on place devant le nom de
la fonction pour R
signifier qu’elle ne retourne pas une valeur ?
3. Donner la différence entre une variable globale et une
variable locale. E
4. Écrire une fonction en C qui permet de calculer x n où x et
n sont les nombres N
entiers.
5. Écrire une fonction en C qui permet de déterminer le type
d’une personne selon C
163 163
son âge.
NB : mineur (si âge <= 14), adulte (si âge > 14)
164 164
Exécution d’un programme
C
O b j ectif p édagogique :
Tester un programme dans un compilateur
S i t u a t io n
problème :
Votre amie Claudine a écrit un programme qui calcule la
somme des 10
P nombres en utilisant le langage C. Elle souhaite donc tester
ce programme pour savoir R s’il réalise vraiment la tâche
demandée. Rencontrant des difficultés, elle fait appel à O
vous dans le but de l’aider.
G C o
nsignes :
R 1. De quoi a-t-elle besoin pour tester
son programme ?
A 2. Donner le rôle d’un
compilateur.
M 3. Décrire les étapes qu’elle doit suivre pour
résoudre son problème.
M
E I. TESTER UN PROGRAMME C EN UTILISANT LE COMPILATEUR
GCC
R Le C est un langage compilé (par opposition aux
langages interprétés). Cela
signifie qu’un programme C est décrit par un fichier texte,
appelé fichier source. Ce
165 165
fichier n’étant évidemment pas exécutable par le
E
microprocesseur, il faut le traduire en langage machine.
N
Cette opération est appelée la co mpilation et est effectuée
par un programme appelé compilateur. Elle se décompose en
fait en 4 phases successives
C :
1. L e t raitement p ar l e p réprocesseur : le fichier
source est analysé par le
préprocesseur qui effectue des transformations purement
textuelles (remplacement
de chaînes de caractères, inclusion d’autres
fichiers source … ).
2. La co mpilation : la compilation proprement dite traduit
le fichier généré par le préprocesseur en assembleur.
3. L ’assemblage : cette opération transforme le code
assembleur en un fichier binaire,
c’est-`a-dire en instructions directement
compréhensibles par le processeur.
4. L ’é dition de l ie ns : un programme est souvent séparé
en plusieurs fichiers source, pour des raisons de clarté mais
aussi parce qu’il fait généralement appel à des librairies
des fonctions standard déjà écrites. Une fois chaque code
source assemble, il faut
166 166
donc lier entre eux les différents fichiers objets. L’édition de
liens produit alors un
fichier dit exécutable.
Pour compiler votre code source C en utilisant le
compilateur g cc , on utilise la commande suivante : g cc
[options] f ichier.c [ -llibrairies]
Par défaut, le fichier exécutable s’appelle a.o ut. Le
nom de l’exécutable peut être modifié à l’aide de l’option -
o nom-de-fichier
f i chier.c est le nom de votre programme C que vous avez
tapé dans votre éditeur
texte. Un programme C est toujours enregistré sous l’extension
.c
Les éventuelles librairies sont déclarées par la chaîne -l l
ibrairie . Dans ce cas, le système recherche le fichier l i
P
blibrairie.a dans le répertoire contenant les librairies pré-
R
compilées (généralement /usr/lib/). Par exemple, pour lier le
programme avec la librairie mathématique, on spécifie -
O
lm. Le fichier objet correspondant est l i bm.a. Lorsque les
G
librairies pré-compilées ne se trouvent pas dans le répertoire
R
usuel, on spécifie leur chemin d’accès par l’option - L
E x emple : la commande g cc - o programme1 p rogramme1.c
A
compile le code source du programme nommé p
M
rogramme1.c pour produire un fichier exécutable nommé
p rogramme1
M
Après compilation de votre programme C, il faut donc
E
ouvrir le fichier exécutable pour tester votre programme.
R
II. T ES T ER UN P ROGRAMME C EN UTILISA NT UN I DE : CA S DE C ODE::BLOC KS
E
167 167
L’exécution d’un programme écrit en langage C se fait
traditionnellement en N
utilisant un compilateur (gcc). Les fichiers sources sont écrits
en utilisant un éditeur
de texte et les programmes seront compilés depuis un terminal
ou une invite de C
commande.
Pour faciliter la compilation des programmes C, l’on
a mis sur pied des outils adaptés appelés e nvironnements
de d éveloppement integré (IDE : Integrated development
environment).
Un environnement de développement intégré permet
de prendre en charge les différentes opérations de
compilation : il regroupe donc l'édition de texte (créer le
code source) et les outils de compilation (activation du
compilateur gcc par exemple) directement depuis le
même logiciel. Il évite ainsi le lancement d'un terminal
ou d'une invite de commande pour lancer les opérations de
compilation.
168 168
En outre, l'environnement de développement intégré
facilite la correction du programme (debug) en lançant
l'outil de debug (gdb) auquel il ajoute la convivialité de
l'environnement graphique (visualisation de l'évolution
des variables en temps réel, par exemple).
Après démarrage de code::Blocks, l’interface suivante
apparait :
P
R
O
G
R
A
M
M
E
R
E
N
C
Ses différentes parties sont :
1. L a b arre d ’outils : elle comprend de nombreux boutons.
2. La l i st e des fichiers d u proj e t : c’est à gauche que
s’affiche tous les fichiers sources
de votre programme
169 169
3. La z o ne p rincipale : c’est là que vous pourriez écrire votre
code en langage C
4. La z o ne d e no tification : aussi appelée « la zone morte
», c’est ici que vous
pourriez voir les erreurs de compilation.
170 170
Sur la barre d’outils, on y trouve les boutons suivants :
Bo utons Compiler Tout
Compiler Exécuter & recomp
Tous exécuter
Permet iler
Cette
les fichiers de lancer
icone
source de la
lance
votre compilatio Permet
juste le
programm n ensuite de
dernier
e sont le fichier recompile P
Si exécutab
gnificatio envoyés executable r tous R
le que
n au produit les O
vous
compilate par le fichiers G
avez
ur qui compilateu de votre R
compilé,
va se r code A
cela vous
charger (raccourcis source M
permettr
M
E x emple :
E
Un programme C qui affiche bonjour est :
R
E
N
Après compilation et exécution en cliquant sur le bouton ,
on obtient :
171 171
172 172
EXERCICES
Ex
ercice 1
On souhaite écrire et exécuter un programme C qui calcule
la somme de trois
nombres saisis par l’utilisateur.
1. Écrire un programme C qui réalise la tâche demandée.
2. Démarrer l’IDE installer sur votre machine puis reproduire
votre code dans la
zone de travail de ce logiciel.
P 3. Cliquer sur le bouton de compilation pour compiler votre
programme.
R 4. Exécuter ce programme avec les valeurs 2, 3,23, 4 et 10.
O
G E x ercice 2
R Utiliser l’IDE code::Blocks pour écrire et exécuter chacun des
programmes demandés
A ci-dessous :
M 1. Un programme C qui calcule la moyenne de 10 nombres
fournis par l’utilisateur.
M 2. Un programme C qui calcule le PGDC de deux nombres
entiers naturels.
E 3. Un programme C qui détermine le reste de la division de a
par b . Où a et b sont
R fournis par l’utilisateur.
4. Un programme C qui affiche la table de multiplication d’n
nombre saisi par
E l’utilisateur.
N
173 173