Sie sind auf Seite 1von 39

1

Langage de programmation C

I - I NTRODUCTI ON
I -1. Origine du langage C
Le langage C a t cr en 1972 par Denis Ritchie avec un objectif relativement limit : crire un systme
dexploitation UNIX Mais ses qualits oprationnelles lont vite fait adopt par une large communaut de
programmeurs.
Une premire dfinition rigoureuse du langage C a t ralise en 1978 par Kernighan et Ritchie avec la
publication de louvrage The C programming language , Brian W. Kernighan, Dennis M. Ritchie , Prentice
Hall Software Series. 2d Ed. . De nombreux compilateurs ont alors vu le jour, en se fondant sur cette dfinition.
Ce succs international du langage a conduit sa normalisation, dabord par lANSI, puis par lISO et enfin par le
CEN.
Le langage C occupe toujours une place trs importante dans le paysage des langages de sa catgorie,
essentiellement par rapport Java.
I -2. Les premiers pas dans le langage comme dcrits par ses auteurs.
Pour entamer ltude du langage, les auteurs ont choisi de prsenter de manire trs simple un premier programme
dont lobjectif est dafficher la phrase Hello, world . Ce programme est devenu par la suite trs clbre. La
finalit est que si vous tes capable dcrire, de compiler et dexcuter le ce programme alors vous pouvez laborer
tout autre programme sur le mme modle.
Ce premier programme C est :

#include<stdio.h>

main()
{
printf("Hello, world\n") ;
}


Le lancement du programme dpend de lenvironnement utilis : Windows, Unix, Mac OS ou autre. Dans
notre cas, nous allons utiliser lenvironnement Windows. Nous allons dcrire les tapes que va subir ce
programme depuis sa forme texte jusqu laffichage du rsultat final.
1. On va avoir besoin dun outil pour formuler notre programme ; on dit diter le programme. Pour
cela, il existe beaucoup dditeurs de texte qui font laffaire. On obtient un premier fichier, dit
fichier source. En principe il doit porter lextension ".c". A titre dexemple on peut lappeler
"premier.c"
2. La forme de dpart du programme est une forme comprhensible par lhomme. La machine, cest
dire lordinateur, ne va pas comprendre cette forme de langage, et par consquent il va falloir lui
faire la traduction dans le langage de la machine. Cest l le rle du compilateur, compiler en
anglais. Le compilateur est un super programme qui se charge de traduire ce que vous crivez
dans le langage humain en respectant certaines rgles dcriture, en langage machine. Si le
2

compilateur ne rencontre aucun problme il produit un nouveau fichier qui correspond la forme
machine du premier. En principe lextension de ce fichier est ".exe". A titre dexemple, notre
programme produira : "premier.exe"


Comment ce fait la compilation ? En ralit cest une commande qui diffre lgrement dun
systme un autre. Elle ressemble ceci :
gcc premier.c premier.exe
Dans laquelle gcc est le super programme ou le compilateur ; premier.c est le programme quon
veut compiler et premier.exe est le nom quon souhaite donner lexcutable issu de la
compilation. Il faut prciser quil existe plusieurs compilateurs. Certains sont gratuits, dautres
payants.
3. Le lancement du programme "premier.exe" produira enfin le rsultat voulu.



I -3. Les environnements de dveloppement intgrs
EDI en franais ou IDE en anglais (Integrated development environment) sont des applications fort
utiles, puisquelles regroupent dans un mme espace les taches dcrites ci-dessus : savoir ldition
et la compilation. Celui que nous utilisons en salle de TP et code blocks : dont voici une capture
dcran.
Code source du
programme.
"premier.c"
Programme
excutable :
"premier.exe"

Compilation et
dition de liens
3


On distingue lexistence
Dune zone de texte dans laquelle a bien t saisi le code source du programme "premier.c".
Une zone dans laquelle on peut demander la compilation ou lexcution du programme dit.
Et bien dautres choses dont il sera question dans la suite du cours.



II- GENERALI TES
II-1 Les lments constitutifs du premier programme
Dans le programme premier.c on distingue trois parties apparentes. On les identifie dans le schma
suivant :

a- La zone 1 constitue lentte du programme ; header en anglais. Les lignes de lentte
commencent par un caractre # (dise). Lentte peut tre vide, si le programme nen a pas
besoin.
printf("Hello ,world\n");
#include<stdio.h>
main( )

Zone 3 : Implmentation
Zone 2 : Fonction Principale
Zone 1 : Entte
4

b- La zone 2 est compose de la fonction principale, elle sappelle main ; qui veut dire
principal en anglais. Ce mot main est obligatoire. Dautres fonctions existent dans des
librairies crites pour le langage ; et on peut crire ses propres fonctions. La structure de la
fonction comprend aussi la pair de parenthses ( ) et la pair daccolades { }.
c- La zone 3 constitue le corps de la fonction main, on parle dimplmentation de la fonction ;
qui veut dire remplissage . Dans lexemple ci-dessus, limplmentation ne contient quune
seule ligne. Cette ligne est une instruction. La suite du cours donnera plus de dtails sur les
possibilits du langage quant au remplissage des fonctions.
d- Lespace libre situ aprs la fonction main peut servir pour y crire dautres fonctions.
Le code source minimal dun programme est obtenu en supprimant lentte et limplmentation, soit :
main()
{
}
II-2 Les mots du langage C
Les symboles utiliss dans le langage sont composs des touches du clavier dun ordinateur. On distingue
les lettres : a, b, c, , z, A, B, C, , Z ( ce sont des caractres alphabtiques). Le langage diffrencie
entre majuscules et minuscules. Pour lui, a et A sont deux lettres diffrentes. On distingue dautre part les
chiffres : 0, 1, 2 9 ( ce sont des caractres numriques). Enfin le reste des caractres : +, -, %, & etc (ce
sont des caractres spciaux). Certains ont un pictogramme (un dessin pour les reprsenter) comme < & *
etc. ; dautres nen ont pas comme espace , retour chariot etc. Mais tous ont un code grce auquel
le langage les reconnait.
Avec les caractres alphabtiques et numriques (alphanumriques), en plus du seul caractre spcial
admis : _, on fabrique des mots qui seront utiliss dans le langage C. Avec les autres caractres spciaux
le langage conoit des operateurs.
Llment de base du code source est un token (cest un terme anglais, en franais on peut dire : une
unit lexicale), un token est un texte du code source que le compilateur ne va pas chercher dcomposer
en plus petit lments. Cest le composant ultime, comme les atomes pour la matire.
Le langage comprend 6 types d'units lexicales (token) :
les mots-cls
les identificateurs
les constantes
les chanes
les oprateurs
les signes de ponctuation
Dont voici une dfinition trs simplifie pour chacun de ces lments. Sachant que dans la suite de ce
cours on aura loccasion de dtailler ces lments.
- Les mots-cls (keywords) : Certains mots du langage courant (langlais) sont rservs par le
langage C lui-mme, et ne peuvent tre utiliss par lutilisateur pour construire ses propres
identificateurs. La liste exhaustive des mots-cls du C est donne ci-dessous :

auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short unsigned
5

continue for signed void
default goto sizeof volatile
do if static while

- Les identificateurs (identifiers) : sont les noms donns aux variables, types, fonctions ou labels
de vos programmes. A ce titre main et printf sont des identificateurs. Un mot-cl ne peut
pas servir didentificateur. On a droit aux caractres alphanumriques, en plus du seul caractre
spcial _. Voici la liste exhaustive des caractres auxquels on a droit :
_ a b c d e f g h i j k l m n o p r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9
Aucun caractre spcial nest admis lexception de _. De plus un identificateur ne doit jamais
commencer par un chiffre.
Exemple didentificateurs corrects : x, y, age, prix123, _beta.
Exemple didentificateurs non valides : 3a, a$, x 2.
- Les constantes sont les nombres entiers ou rels, caractres ou suite de caractres utilises
comme valeurs dans programme. Par exemple : 54 ; 3.14 ; 2.9e+08 pour les constantes
numriques ; a ; Z ; 1 ; 47 ; = ; hello pour les constantes caractres.
- Les chanes sont des suites de caractres organiss par une convention pour former un lment du
langage.
- Les operateurs sont forms partir des caractres spciaux, ils permettent de faire des oprations
sur dautres lments du langage. On site par exemple : + ; * ; - ; / ;% pour les oprations
daddition, de multiplication, de division et de modulo. On site aussi : > ; < pour les oprations de
comparaison (logique). Et bien dautres.
- Les signes de ponctuations : certains caractres ont un sens bien spcifique en C, ils seront vu
tout au long du cours. Parmi eux on trouve :
[ ] ( ) { } * , : = ; ... #
Dans le programme exemple premier.c , on a vu ces deux signes ( ) { } dans la fonction main, et
aussi le signe #, rserv aux directives du prprocesseur.
II-3 Les phrases du langage C
Le langage prvoit dorganiser les mots du langage c'est--dire, les units lexicales (token), en phrases.
On dit en langage C des instructions. Une instruction est une suite dunits lexicales termine par le signe
de ponctuation : ;
Un exemple est donn dans premier.c, il sagit de :
printf("Hello ,world\n");
II-4 Les programmes du langage C
Le programme dans le langage C va tre un ensemble dinstructions et dunits lexicales, organises de
faon raliser les taches qui lui ont ts soumises.



6

I I I - LES ELEMENTS DE BASE
III-1 La notion de variable
La plus part des langages utilisent la notion de variable. Une variable est un nom (identificateur) qui sert reprer
un emplacement dans la mmoire centrale. Notion simple qui contribue faciliter la ralisation de programme. Elle
permet de manipuler des valeurs sans avoir se proccuper de lemplacement effectivement en mmoire. Cela est
possible parce quil existe un programme de traduction (compilateur ou interprteur) de votre programme dans le
langage machine. Cest lui qui attribuera une adresse chaque variable.
Lutilisateur na pas connaitre ladresse en mmoire dune variable mais seulement le nom de la variable pour
toutes ses oprations.
De sa dfinition jusqu' son utilisation, une variable nest compltement dfinie quaprs trois tapes
- Le choix de son nom
- Le choix de son type
- Sa dclaration
III-2 Les noms de variables
Le nom de variable appartient la catgorie des identificateurs (le nom est un token). Il faut donc :
- Utiliser des caractres parmi :
_abcdefghijklmnoprstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
- Nutiliser aucun autre caractre.
- Ne pas commencer par un chiffre.
- Pour la longueur en caractres, on peut au moins aller jusqu' 32 caractres.
III-3 Les types de variables
Lapproche qua lordinateur relativement au stockage des valeurs numriques est diffrente de notre
exprience quotidienne de la mmorisation de linformation. En effet nous reprsentons des informations
comme 10 ou 3,14 de la mme manire ; ou du moins nous croyons que notre esprit le fait. Mais pour la
machine il lui faut plus de mmoire pour reprsenter 3,14 que pour reprsenter 10. On parle alors de
codage de linformation.
La machine code linformation en bits : c'est--dire soit 0 soit 1. Ensuite elle les organise en bytes.
Le byte est la plus petite unit adressable dun ordinateur. Aujourdhui, les bytes de 8 bits se sont
gnraliss en informatique.
Loctet est une unit de mesure en informatique mesurant la quantit de donnes. Un octet est lui-mme compos
de 8 bits, soit 8 chiffres binaires. Le byte, qui est un ensemble de bits adjacents, a presque toujours une taille d'un
octet et les deux mots sont gnralement, mais abusivement, considrs comme synonymes.
On en vient aux variables. Lunit pour coder les variables est loctet. Une variable peut tre code sur 1,
2, 4 ou plus doctets. De plus le mode adopt pour coder ces octets peut tre adapt la nature de
linformation que lon souhaite mettre en mmoire.
Le langage C prvoit 3 types de base, avec des variantes pour chacun :
a. Un type pour les caractres
b. Un pour les entiers
7

c. Un pour les flottants. C'est--dire les rels
En ce qui concerne le type caractre on a les types rsums dans le tableau suivant :
Type Signification Taille (Octets) Valeurs acceptes
signed char Caractre signe 1 -128 127
unsigned char
Caractre non
signe
1 0 255
char Caractre 1 -128 127
Tableau 1 : types de base pour les caractres
Pour les entiers on pourrait choisir parmi les tailles en octets rsumes dans le tableau suivant :

Type de variable Signification Taille (Octets) Valeurs acceptes
short int Entier court 2 -32 768 32 767
unsigned short int Entier court non sign 2 0 65 535
int Entier
2 (sur processeur 16 bits)
4 (sur processeur 32 bits)
-32 768 32 767
-2 147 483 648 2 147 483 647
unsigned int Entier non sign
2 (sur processeur 16 bits)
4 (sur processeur 32 bits)
0 65 535
0 4 294 967 295
long int Entier long 4 -2 147 483 648 2 147 483 647
unsigned long int Entier long non sign 4 0 4 294 967 295
Tableau 2 : Types de base pour les entiers.
Enfin, les possibilits offertes pour le type rel ou flottant sont :

Type de variable Signification Taille (Octets) Valeurs acceptes
float Flottant (rel) 4 3.4*10
-38
3.4*10
38

double Flottant double 8 1.7*10
-308
1.7*10
308

long double Flottant double long 10 3.4*10
-4932
3.4*10
4932

Tableau 3 : Types de base pour les rels.
Il ne suffit pas de savoir quel nombre doctets est affect pour chaque type, mais il est important de
connaitre lintervalle des valeurs possibles quand on a fait son choix de type. Le compilateur ne
dtectera pas derreur son niveau, sil y en a, cest plutt lexcution quapparaitront ces erreurs ;
et il y a de fortes chances quelles soient indcelables.
A prsent on va sintresser la manire dont C manipule les variables.
III-4 Les dclarations de variables
La dclaration dune variable est ncessaire, et elle doit tre faite avant toute autre manipulation de celle-
ci.
La dclaration est une instruction dans laquelle, le nom et le type sont simultanment dfinis. Le type en
premier. Sa syntaxe est :
Type nom ;
Par exemple, si on a une variable relle de nom : prix on crira :
8

float prix ;
Autres exemples : dclaration simultane de trois variables entires de noms alpha, beta et gamma :
int alpha, beta, gamma ;

I I I -5 Les affectations des variables.
Une variable nest sense tre utilise dans aucune opration que si au pralable on lui a attribue une
valeur. C'est--dire que la phase prcdente de dclaration de la variable na eu pour effet que la
rservation en mmoire centrale de la machine dun certain nombre doctets ; sans se soucier du contenu
de ces octets. Certains langages mettent zro le contenu des octets au moment de la dclaration de la
variable ; ce nest pas le cas du C.
Pour affecter une valeur une variable, on dispose de plusieurs faons pour le faire.
- De manire directe avec loperateur =. Par exemple :
prix = 1.5 ;
- De manire indirecte avec une autre variable dj bien dfinie. Par exemple, si on
avait
a = 1.7 ; //on peut faire
prix = a ;
- Avec une expression mettant en jeu dautres variables lies par des operateurs. Par
exemple :
prix = 2*a-3.6 ;

I I I -6 Les initialisations des variables.
Les initialisations sont une affectation des variables au moment de la dclaration. Comme :
float prix = 10. ;
on peut attribuer la variable toute valeur admise par le type.
La diffrence entre les initialisations et les affectations est que linitialisation ne se fait quune seule fois
dans un programme alors que les affectations peuvent se rpter autant de fois que lon le souhaite.
I I I -7 La notion doprateur.
A linstar des mathmatiques qui disposent doperateurs qui agissent sur des fonctions ou sur des
variables pour leur faire subir des oprations, et donc des transformations ; le langage C dfinit des
operateurs qui vont agir sur des variables ou des fonctions, et de la mme manire, vont engendrer des
transformations.
Il est dune importance capitale de dfinir chaque opration les lments en jeu qui sont :
- Loprateur
- Les oprandes
Dans une opration il est possible que lon soit en prsence :
- dun seul oprateur et dun seul oprande. Loprateur est dit tre unaire.
- dun seul oprateur et de deux oprandes. Loprateur est dit tre binaire.
- dun seul oprateur et de trois oprandes. Loprateur est dit tre ternaire.
9

Il faut, dun autre cot, prciser les positions relatives de loprateur et des oprandes, les uns par rapport
aux autres.
I I I -8 Exemples doprateurs : loprateur daffectation et les oprateurs arithmtiques
a) Loprateur daffectation ( = ) et la notion de lecture/criture
Il sutilise entre deux oprandes, selon cette syntaxe :
Oprande_gauche = oprande_droit
On pourra lire ceci : mettre le contenu de loprande droit dans loprande gauche
A partir dici il faut dgager et assimiler une notion fondamentale en programmation. A savoir,
la notion de lecture/ criture.
Par lecture, on veut dire lecture dans une adresse mmoire. Et par criture on comprend lcriture
dans ladresse mmoire. Ces deux notions se ressemblent beaucoup ; mais une diffrence de
taille les spare. Pour C la lecture dans la mmoire est possible pratiquement pour toute les
adresses sans consquence ngative sur le droulement du programme. Car ladresse lue nest
pas modifie par lopration de lecture. Par contre lcriture dans une mmoire efface le contenu
prcdent lcriture. On dit aussi crase ou dtruit le contenu de la mmoire. Par consquent
cette opration conduit la perte dinformation. Le langage C prvoit la protection de certaines
adresses, comme les constantes par exemple ; et ne va pas permettre dy crire en signalant une
erreur la compilation. Mais il ne dclera pas toute ces erreurs, cest au programmeur dtre
vigilant quant sa faon de programmer.
Revenons loprateur daffectation =. A sa droite loprande subit une lecture. Et alors on peut
mettre presque toute chose cette position. A sa gauche loprateur subit une criture. Et donc il
faut sassurer que cet oprande soit une lvalue. Le langage C utilise cette terminologie de lvalue
pour dire left value (valeur de gauche dans une affectation). Ce qui veut dire : valeur dans
laquelle on peut crire.

b) Les oprateurs + daddition et de soustraction
Ils agissent dans les oprations soit :
- Comme oprateurs unaires. Leurs critures sont alors : op oprande
O op est + ou -. Et oprande peut tre une variable de tout type parmi les types de
base, int, char, float etc. Leffet de loprateur est de changer le signe de la variable.
Et + quant lui, il laisse invariable le signe de la variable.
- Comme oprateurs binaires. Leurs critures sont alors :
Operande_1 op operande_2
Les oprandes peuvent tre l aussi des variables de types de base. Le rsultat des
oprations sont comme en mathmatiques : laddition ou la soustraction des valeurs
contenues dans les variables.

c) Les oprateurs * de multiplication et / de division

Ce sont des oprateurs binaires. On les utilise comme dans les oprations mathmatiques de
multiplication et de division. La syntaxe est la suivante :
Oprande_1 op oprande_2
Les oprandes peuvent tre l aussi des variables de types de base.

d) Loperateurs % de modulo

Sa syntaxe est la suivante : oprande_1 % oprande_2
Il donne en rsultat le reste de la division de loprande_1 par loprande_2. Evidemment cela na
de sens que sur les types entiers.

e) Le type du rsultat dune opration arithmtique
10


Le rsultat dune opration du genre : oprande_1 op oprande_2
Dans laquelle op vaut : + - * / dpend du type des oprandes. Si tous les deux sont dun mme
type alors le rsultat est du mme type. Par exemple si on a type int + type int alors le rsultat est
de type int. Ainsi de suite. Pour loprateur de division / cela a beaucoup dimportance. Une
division comme : 3/2 donne 1 et non pas 1.5. Ce qui nest pas la mme chose. Si on veut le rsultat
exact il faut crire 3.0/2.0 soit type float / type float.
Si les deux oprandes ne sont pas du mme type, alors le langage prvoit de transformer le plus
petit type dans le format du plus grand type et ensuite de faire lopration dans le format le
plus grand. Le rsultat est fourni dans le plus grand. Exemple :
type int + type float devient type float + type float le rsultat est dans le type float.
Cette conversion de type, on dit aussi promotion de type, peut varier dune machine lautre ;
pour le type int par exemple ; qui peut faire 2 ou 4 octet. Il faut donc tre attentif quand on utilise
ces conversions.

f) Oprateur de cast

Le langage permet de forcer la conversion de type pour effectuer certaines oprations.
Supposons que lon veuille faire cette opration :

int a = 5 , b = 3, c = 2 ;
float x ;
x = a + b / c;

Si on souhaite que le rsultat soit un rel, il y aurait problme avec le terme b/c qui va tre un
entier puisque b et c sont des entiers. Il faut forcer la conversion, en rel, de lun des deux : b ou c.
pour cela on utilise lopration de cast, de cette manire.
x = a + (float) b / c;
de cette manire b sera converti en float avant de faire la division.

g) Oprateurs dincrmentation ++ et de dcrmentation --

On a souvent besoin dincrmenter, ou de dcrmenter, dune unit les variables qui servent de
compteurs. Pour a, il y a dans C des oprateurs pour cet effet. Prenons par exemple le code
suivant :
int i = 0 ;
/* instructions */
i = i + 1 ; //incrmentation

Ce code peut tre remplac par celui-ci :

int i = 0 ;
/* instructions */
i++;

++ est en lui-mme un seul oprateur compos de 2 caractres. Sa position par rapport la
variable admet deux critures : avant ou aprs la variable.
i++ ;
++i ;
La diffrence est dans la priorit attribue chacune. ++i est plus prioritaire que i++. Prenons un
exemple.

int i = 0, j = 0;
printf("i=%d j=%d", i++, ++j);

11

Ce code affichera : i=0 j=1. Parce que printf est prioritaire sur i++. Et au contraire ++j
et prioritaire sur printf.
En rsum, les oprateurs dincrmentation et de dcrmentation sont :

oprateur quivalence
++i
--i
i=i+1
I=i-1
i++
i--
i=i+1
I=i-1

Tableau 4 : Oprateurs d'incrmentation et de dcrmentation. La priorit est plus leve en haut, elle dcroit vers le bas

I I I -9 Lassociativit et la priorit

Que se passe-t-il si dans une mme instruction se trouve runis plusieurs oprateurs et oprandes ?
On peut prendre comme exemple :
Oprande1 op1 oprande2 op2 oprande3
O oprateurs 1 et 2 sont binaires par exemple. On sattend ce que le compilateur excute les oprations
les unes aprs les autres et non simultanment. Tout comme en mathmatiques en dfinitive. La question
devient quelle opration va-t-il effectuer en premier ?
En fait le langage donne un ordre de priorit aux diffrents oprateurs. Et il donne un tableau rsumant
ces priorits par dfaut.
Supposons que loprateur 2 est prioritaire sur loprateur 1. Alors les oprations vont se drouler selon le
diagramme ci-dessous :





Si on souhaite que le compilateur fasse les oprations suivant un ordre dfini ; et si cet ordre nest pas
celui qui va tre adopt par le compilateur ; alors dans ce cas on utilisera les parenthses ( ) pour fixer les
priorits, sachant que les oprations entre parenthses sont prioritaires sur les autres.
Dans le cas o cest le mme oprateur qui est rpt dans les oprations, donc la priorit est identique
pour tous, cest le principe dassociativit qui est utilis, le mme quen mathmatiques. A savoir quon
associe les oprandes soit partir de la gauche soit partir de la droite. Cela reste prciser selon chaque
oprateur. Le problme est identique dans le cas doprateurs diffrents mais de mme niveau de priorit.
Exemple :

int a = 5, b = 7, c = 12, d ;
d = a + b + c ;
oprande1 op1 Oprande2 op2 oprande3
Rsultat de lopration 2 oprande1 op1
Rsultat final
12

Lassociativit pour + est de gauche vers la droite. Donc le calcul se fera comme si on faisait :(a+b)+c
Lensemble des priorits connues sur les oprateurs que nous avons voqus jusqu prsent est rsum
dans le tableau ci-dessous. Les oprateurs dune mme cellule ont la mme priorit mme sils sont sur
des lignes diffrentes.

Tableau 5 : Table des priorits. Dcroissantes de haut en bas
catgorie oprateurs description associativit
unaire +
-
++
--
&
(cast)
sizeof
identit
oppos
incrmentation
dcrmentation
adresse
conversion force
taille dun objet

arithmtique *
/
%
produit
division
modulo (reste de division
entire)

arithmtique +
-
Somme de 2 nombres
Soustraction de 2 nombres




IV- Lessentiel sur les oprateurs relationnels et les oprateurs logiques
I V-1 Les oprateurs relationnels
a) Dfinitions
La liste des oprateurs relationnels avec leurs significations est comme suit :
Oprateur Signification Rsultat
< infrieur
la valeur 0 ou 1
<= infrieur ou gal
> suprieur
>= suprieur ou gal
== gal
!= diffrent

Ce sont tous des oprateurs binaires. Ils agissent sur des oprandes de tous les types de bases (int char
float etc.) et aussi sur dautres types quon na pas encore prsents. Les promotions numriques et les
conversions dajustement de type sont aussi valables ici comme pour les oprateurs arithmtiques. Le
sens attribu chaque oprateur est spcifi dans la colonne du milieu. Le rsultat de lopration est
prcis dans la dernire colonne.
La manire dutiliser ces oprateurs est donne dans les exemples suivants :
10>2 1.0<10.6 'a'<='A' 10==1. 2 != 'a'
Ils donneront respectivement les rsultats suivants :
13

1 1 0 0 1
Les affirmations qui sont vraies se verront attribuer la valeur 1 celles qui sont fausses auront la valeur 0.
Les mmes rsultats seraient obtenus si, au lieu des constantes prcdentes, on utilisait des variables :
int a = 10, b = 2;
float x = 1., y = 10.6;
char u = 'a', v = 'A';
printf("%d", a > b); // affiche 1
printf("%d", x < y); // affiche 1
printf("%d", u <= v); // affiche 0
printf("%d", a == x); // affiche 0
printf("%d", b != u); // affiche 1
b) Comparatif oprateurs arithmtiques/relationnels

Par comparaison avec les oprateurs arithmtiques, on peut dire que les oprateurs arithmtiques agissent
sur des variables dun type donn parmi les types de base et quils fournissent la fin une quantit dun
type correspondant parmi les types de base. Alors que les oprateurs relationnels donnent toujours un
rsultat 0 ou 1. On peut schmatiser cela dans le diagramme suivant :

c) Les priorits et les associativits
Les oprateurs relationnels ci-dessus sont moins prioritaires que nimporte quel oprateur arithmtique.
Oprateur
arithmtique
Quantit 1
(Type 1 quelconque)
Quantit 2
(Type 2 quelconque)
Quantit 3
(Type 1 ou 2)

Quantit 1
(Type 1 quelconque)
Oprateur
relationnel
Quantit 2
(Type 2 quelconque)
Quantit 3 =
Valeur 0 ou 1

Comparaison entre
operateurs arithmtiques
et operateurs relationnels
14

Les oprateurs (<, <=, >, >=) ont mme priorit. Et elle est suprieure celle des oprateurs (==, !=) ; qui
leur tour ont la mme priorit .
Tous ces oprateurs sont associatifs de gauche droite. Cest dire que si les rgles de priorit et les
parenthses ne suffisent pas pour dcider quelles oprations sont effectues en priorit ; alors on fait
intervenir lordre des oprations de gauche droite. Par exemple une expression du genre : a<b<c
sera effectue comme : (a<b)<c
Un rcapitulatif sera donn dans la suite, incluant tous les oprateurs dfinis jusqu prsent.
I V-2 Type logique
Nous venons de voir que les oprateurs relationnels gnrent des valeurs gales uniquement 0 ou 1.
Beaucoup de langages dfinissent un type rserv ce genre de variables et ils lappellent type logique.
En C++ on dfinit le type (bool) qui est de type logique. Pour tous les langages la valeur 0 signifie faux
(false en anglais) et 1 signifie vrai (true en anglais).
Pour ce type un seul bit suffirait pour coder les variables logiques, mais comme la plus petite quantit
adressable est loctet (8 bit) alors les 7 autres bits ne sont pas utiliss.
Le langage C a une approche quelque peu originale de reprsenter les variables logiques. En effet, pour
le langage C, la valeur 0 (zro) reprsente la valeur logique 0 (faux/false) et tout autre nombre non nul
reprsente 1 (vrai/true). Tout type de base est bon pour reprsenter le type logique en C. Mais il est
courant de prendre le type int pour les variables logiques du C.
Valeurs logiques Valeurs quivalentes Langage C
1 1, true, vraie Toute valeur non nulle dun type quelconque
0 0, false, faux 0 de type quelconque

I V-3 Les oprateurs logiques
a) Dfinitions
Ils sont au nombre de trois : && (et), || (ou inclusif) et ! (ngation). Les deux premiers sont binaires et le
troisime est unaire. Le rsultat de la comparaison vaut 1 ou 0. Ils jouent un rle trs important dans les
structures de choix et aussi dans les structures de rptition.
Il faut revenir au cours de lalgbre et de la logique pour la dfinition de ces oprateurs. On rappelle ici
les rsultats importants les concernant :
Oprande 1 Oprateur Oprande 2 Rsultat
0
&&
0 0
0 1 0
1 0 0
1 1 1
0
||
0 0
0 1 1
1 0 1
1 1 1

!
0 1
1 0
15


Voici quelques exemples pour fixer les ides :
(5<10) && (6>3) devient 1 && 1 et enfin donne 1
Si a= 5, b=10, c=6 et d=3 alors lexpression ci-dessus scrirait :
(a<b) && (c>d) et elle donnerait 1.
! (a==b) deviendrait !(0) et donnerait 1.
Avec la reprsentation du langage C pour les logiques ; certaines critures sont correctes mme si elles
sont moins usuelles :
a || b /* est vue comme 1||1 soit 1 */
!c /* est vue comme !1 soit 0 */
b) Les priorits et les associativits
Loprateur ! est prioritaire sur tous les oprateurs arithmtiques binaires et aux oprateurs relationnels.
Loprateur || est moins prioritaire que loprateur &&. Tous deux ont une priorit infrieure aux
oprateurs arithmtiques ou relationnels.
Tous ces oprateurs sont associatifs de gauche droite. Par exemple, si on a :
bool d ; (ou int d )
d=a && b && c est quivalente : (a && b) && c
c) Rcapitulatif des rgles de priorit ajoutant les nouveaux oprateurs aux anciens
En incluant les oprateurs relationnels et les oprateurs logiques aux tables des oprateurs arithmtiques,
la nouvelle table est la suivante :
catgorie oprateurs description associativit
unaire +
-
++
--
!
&
(cast)
sizeof
identit
oppos
incrmentation
dcrmentation
ngation logique
adresse
conversion force
taille dun objet

arithmtique *
/
%
produit
division
modulo (reste de division entire)

arithmtique +
-
somme de 2 nombres
soustraction de 2 nombres

relationnels < <=
> >=
infrieur , infrieur ou gal
suprieur , suprieur ou gal

relationnels ==
!=
gal
diffrent de

logique && Et logique
logique || ou logique
conditionnel ? : (oprateur ternaire)
affectation = affectation usuelle
16

+= -= *= /=
%=
opration associe suivie
daffectation

V- Les structures de choix

Elles confrent aux programmes, avec les structures de rptition, un comportement intelligent et les rendent
plus intressants, permettant ainsi de rsoudre un nombre important de problmes aussi bien en mathmatiques que
dans toutes les autres disciplines.
V-1 Algorithme
En langage humain ces structures de choix sont des instructions de contrles qui permettent de choisir entre deux
instructions, selon la valeur dune expression numrique servant de condition. On peut la formuler avec
lalgorithme suivant :
Si <condition> Alors
instruction(s) 1
Sinon
instruction(s) 2
La condition est une expression logique qui a pour valeur soit 0 soit 1. Elle est dabord value, si elle vaut 1 cest
linstruction 1 qui est excute si elle vaut 0 cest linstruction 2 qui sera excute.
V-2 Organigramme

V-3 Syntaxe en langage C
La traduction de lalgorithme prcdent en langage C est :
if (expression)
instruction_1
Dbut
Condition
Instruction 2
Fin
Instruction 1
Vraie Fausse
17

else
Instruction_2
if else sont des mots-cls du langage C, traduction de Si et de Sinon.
expression expression quelconque, de type numrique. Cest plus tendu cause
de la dfinition du type logique du C. Si elle est non nulle cest linstruction 1
qui est excute. Si nulle, cest linstruction 2 qui le sera.
V-4 tude dun exemple
Appliquons la structure de choix dans le cas dun programme qui lit 2 entiers au clavier et qui affiche la plus
grande des 2 valeurs :
int a, b;
scanf("%d %d",&a,&b);
if(a>b)
printf("ici, instruction 1, le maximum est: %d", a);
else
printf("ici, instruction 2, le maximum est: %d", b);
En saisissant les valeurs a = 5 et b = 1, par exemple, la condition a>b vaut 1 ; cest lexpression 1 qui sera excute.
V-5 Prsence de plusieurs instructions dans if
Si plusieurs instructions sont excuter dans le cas o la condition est fausse ou vraie, alors il faut les mettre dans
un bloc {}.
if (expression)
{
instruction_11
instruction_12
instruction_13
}
else
{
instruction_21
instruction_22
instruction_23
}
18

V-6 Autres formes de la structure de choix en C
a) Le branchement conditionnel
Une forme simplifie de cette structure rside dans labsence de linstruction 2 et donc de elselui-mme.
if (expression)
instruction
Le branchement vers instruction ne se fait que si condition vaut 1. Sinon le programme continue son
excution vers les instructions qui suivent.
Par un organigramme, on obtient :

On peut en donner un exemple dans lequel on a trois variables a, b et c dont on cherche la valeur maximale.
int a, b, c, max;
scanf("%d %d %d",&a,&b,&c);
max = a;
if(b > max) max = b;
if(c > max) max = c;
printf("maximum : %d", max);
On mmorise la variable a dans max. Si b est plus grand que a ; alors cest b qui est mmoris. Si c est plus grand
que a et b, alors c sera mmoris dans max.
Cette faon se gnralise facilement un nombre quelconque de valeurs, surtout si on utilise les structures de
rptition comme for.
b) Les if imbriqus
Cette forme de branchement conditionnel permet deffectuer une suite de tests en cascade. C'est--dire les uns aprs
les autres.
Elle est reprsente par lalgorithme suivant :
Condition
Instruction 1
Vraie
Fausse
Fin

Dbut

19

Si (condition 1) alors instructions 1
Sinon si (condition 2) alors instructions 2

Sinon si (condition N) alors instructions N
Sinon instructions
Si la condition 1 est vraie alors les instructions 1 sont excutes, et le programme ignore toutes les autres
instructions et va la fin de si. Si elle est fausse, la condition 2 est value ; si elle est vraie les instructions 2 sont
alors excutes. Ainsi de suite. Si aucune des conditions nest vraie, le programme va la ligne sinon (la dernire)
et excute les instructions qui y sont.
Par un organigramme cela donne :

Avec un exemple : Lire un nombre entier N au clavier et tester quil nest ni pair, ni multiple de 5, ni inferieur
100. Afficher la rponse lcran.
int N;
scanf("%d",&N);
if( N < 100) printf ("est inferieur 100");
else if ( N % 5 == 0) printf ("est multiple de 5");
else if( N % 2 == 0) printf ("est pair");
else printf("n'est pas inf a 100, pas pair et pas mult de 5");
Si aucune des conditions nest vraie alors le nombre vrifie les trois conditions. On aurait pu faire autrement, cest
dire lier les trois conditions en une seule et faire un seul test :
int N;
Fausse
Fausse
Fausse
Vraie
Vraie
Vraie
Dbut

Instruction(s) 1
Condition 2

Condition 3

Instruction(s) 2
Instruction(s) 3
Instruction(s) 4
Fin

Condition 1

20

scanf("%d",&N);
if(N >= 100 && N % 5 != 0 && N % 2 != 0)
printf("n'est pas inf a 100, pas pair et pas mult de 5");
Mais, bien que plus longue, la premire version est plus lisible que la seconde.
c) Linstruction switch
Cest une instruction de contrle qui permet de regrouper une srie de tests lis et dexcuter certaines instructions
parmi lensemble des instructions. Voyons dabord sa syntaxe.
switch(expression_entire)
{
case constante 1 : instructions 1
case constante 2 : instructions 2
........
case constante N : instructions N
default : instructions
}
expression_entire doit tre de type char, int ou long c'est--dire un type entier.
case constante 1 et les autres aussi, sont des constantes entires : 'a', 0, 1234, etc.
Le compilateur vrifie, dans lordre prsent, si lexpression est gale
une des constantes, dans lequel cas les instructions correspondantes
sont excuts.
Default si aucune des constantes nest gale lexpression de switch alors
les instructions de default sont excutes.
Une remarque trs importante, une fois que le branchement est fait vers les instructions i, toutes les instructions
suivantes i+1, i+2 etc. sont excutes aussi. Voyons sur lorganigramme suivant le droulement des oprations :
Illustrations avec un exemple. Supposons que lon veuille vrifier si une lettre saisie au clavier est une voyelle ou
non ?
char c ;
scanf("%c",&c) ;
switch(c)
{
case 'a': printf("c est a") ; break ;
case 'e': printf("c est e") ; break ;
case 'i': printf("c est i") ; break ;
21

case 'o': printf("c est o") ; break ;
case 'u': printf("c est u") ; break ;
case 'y': printf("c est y") ; break ;
default : printf("c nest pas une voyelle") ;
}

VI- Les structures rptitives
VI -1 I ntroduction
Les structures rptitives ou simplement boucles permettent de rpter un groupe dinstructions un certain
nombre de fois. Elles existent dans tous les langages. Elles sont constitues dune instruction ou dun
groupe dinstructions excuter, et dune expression fournissant une condition. Tant que cette condition
est vraie ; on rpte lexcution du groupe dinstructions ; ds que la condition devient fausse lexcution
sarrte.
Lordre dans lequel on place les instructions et la condition offre deux possibilits dusage des boucles,
avec trs peu de diffrences entre elles:
1. Si la condition prcde les instructions, on a une boucle de forme : tant que faire
Dans ce cas le test est effectu avant dexcuter les instructions. Linstruction qui lui correspond
dans le langage C est while.
2. Si au contraire les instructions prcdent la condition, on est en prsence dune boucle de forme:
fairetant que.
Dans ce cas lexcution des instructions se fait avant de faire le test. Linstruction qui lui
correspond dans le langage est do while.
VI -2 Forme tant que faire ou while
a) Algorithmique tant que faire
On pourrait formuler lalgorithme de while de cette manire :
TantQue <condition>
DebutTantQue
instructions
FinTantQue
Que lon interprte de la manire suivante : tant que la condition est vraie on excute les instructions. Ds
que la condition est fausse on va la fin de tant quesans excuter les instructions.
Avec un organigramme, on aurait pour cette forme la reprsentation suivante :


22

Lensemble des instructions est rpt tant que la condition est vraie.
b) Syntaxe de linstruction while
Linstruction while a la syntaxe suivante :
while (condition)
instruction
O :
condition est une expression logique, elle doit tre entre parenthses.
instruction instruction excuter.
Dans le cas de la prsence de plusieurs instructions, on place le tout entre accolades.
while (expression)
{
instructions
}
c) Exemples pour while :
Exemple 1 :
Une boucle qui affiche les nombres entiers compris entre deux nombres a et b tels que a < b .
#include<stdio.h>
V
F
Dbut
Instructions
excuter
Fin
Condition

Boucle : while
Condition avant instructions
23

main()
{
int a = 10, b = 20, i;
i = a;
while(i <= b)
{
printf("\n%d", i);
i++;
}
printf("\nValeur de i en sortie de boucle : %d", i);
}
Il est noter que la valeur de i la sortie de la boucle est 21. Puisque b vaut 20 ; la condition ne sera
fausse qu partir de i = 21.
Exemple 2 :
Lire 5 valeurs entires au clavier.
int a, compteur = 0;
while ( compteur < 5 )
{
scanf( "%d", &a );
compteur++;
}
printf("\n Valeur de compteur est : %d",compteur);
La variable compteur varie de 0 4, avec chaque itration une lecture de a.
Quand compteur vaut 5, il sort de la boucle.
Exemple 3 :
Afficher et compter les diviseurs dun nombre n saisi au clavier.
int n,i,compt=0;
scanf("%d",&n);
i=1;
while(i<=n)
{
24

if(n%i==0)
{
printf("i=%d divise %d\n",i,n);
compt++;
}
i++;
}
Ce mme exemple peut tre modifi pour chercher si n est un nombre premier ou non. Il suffit de
contrler si le nombre de diviseurs est gal ou suprieur 2.
Exemple 4 :
Un programme qui lit des nombres rels positifs ou nuls, ds quun nombre ngatif est saisi la lecture
sarrte
float x;
x=1.;
while(x>=0.)
{
scanf("%f",&x);
}
Pour que lon puisse accder la premire fois lintrieur de la boucle, il faut bien initialiser x une
valeur non ngative quelconque.
On peut ensuite modifier ce programme pour quil calcule la moyenne des valeurs saisies.
float x,som=0.;
int compt=0;
x=1.;
while(x>=0.)
{
scanf("%f",&x);
if (x>=0.)
{
compt++;
som+=x;
}
25

}
if(compt) printf("la moyenne est : %f",som/compt);

VI -3 Forme faire tant que ou do while
a) Algorithmique de faire tant que
La diffrence annonce entre la forme tant que faire et faire tant que tait dans lordre classement
entre la condition et les instructions excuter. Lalgorithme de faire tant que va donc tre :
Faire
instructions
Tant que (condition)
Les instructions sont excutes une fois dans tous les cas, leur excution une seconde fois ou plus,
dpendra ensuite de la condition.
Par un organigramme on a :













b) Syntaxe de dowhile
La syntaxe de dowhile dans le langage C est :
do
instruction
Boucle : do while
Instructions avant condition
V
F
Dbut
Instructions excuter
Condition

Fin
26

while (condition);
Attention au point-virgule prsent aprs la condition. La condition est une expression logique, mise entre
parenthses. Par ailleurs, dans le cas de plusieurs instructions, il faut ajouter les accolades. Ce qui donne :
do
{
Instructions
}
while (expression);
c) Exemples pour linstruction dowhile
Dune manire gnrale, tout ce qui est crit avec une des deux formes de boucle peut tre rcrit avec
lautre moyennant des adaptations mineures.
Exemple 1 : Reprenons lexemple 4 prcdent.
Il sagit de lire, au clavier, des nombres rels tant quils sont positifs ou nuls ; ds quun nombre ngatif
est saisi la lecture doit sarrter. Calculer ensuite la moyenne des nombres saisis.
float x,moy,som;
int compt=0;
do
{
scanf("%f",&x);
if (x>=0.)
{
compt++;
som+=x;
}
}while(x>=0.);
if(compt) printf("la moyenne est : %f",som/compt);
Comme on peut le voir, on lit dabord x et ensuite on teste son signe. Selon sa valeur on revient faire une
autre lecture ou on sort de la boucle. Il na pas t ncessaire dinitialiser x comme dans le cas de while.
Exemple 2 :
Afficher tous les multiples pairs de 3 inferieurs 100.
int n=100, i=1;
do
27

{
if (i%2==0 && i%3==0) printf("%d est pair et mult de 3\n",i);
i++;
}while(i<=100);

VI -4 Oprateur squentiel
Selon le contexte, loprateur virgule (,) peut servir de sparateur cest le cas des listes darguments de
fonctions comme dans printf() ou scanf(), par exemple :
Printf(valeur i=%d j=%d r=%f,i,j,r) ;
Dans cet exemple, loprateur (,) sert sparer les diffrentes variables.
Dans dautres cas, il peut servir comme oprateur squentiel, dont voici la dfinition :
Loprateur squentiel (,) permet de regrouper des sous-expressions sous forme de liste. Ces sous-
expressions sont values en squence. La valeur d'une liste d'expressions est celle de la dernire de la
liste.
Exemple, soit les expressions suivantes :
i++;
j += 5;
k = i + 2 * j;
Si on crivait
i++, j += 5, k = i + 2 * j;
On obtiendrait un oprateur squentiel avec (,) dans lequel les expressions prcdentes sont devenues des
sous expressions dune instruction termine par (;).
Lexpression i++ est dabord value, ensuite j += 5 est value et en dernier k = i + 2 * j
est value. C'est--dire que lassociativit est de gauche vers la droite.
Il ne faut pas confondre cette criture avec cette autre criture :
i++; j += 5; k = i + 2 * j;
Laquelle lvidence est quivalente la premire ; c'est--dire en fait la succession de trois instructions
distinctes, sans retour la ligne entre elles.
Un autre exemple pour montrer la deuxime partie de la dfinition : La valeur d'une liste d'expressions est
celle de la dernire de la liste.
i = (j++, i+3, k+1);
28

Dans cet exemple, la variable i prendra la valeur k+1 tout simplement ; mais auparavant, la sous
instruction j++ sera excute, suivie de lexpression i+3 et enfin k+1. Comme k+1 est la dernire
expression, alors i sera gale k+1. Notez que la prsence des parenthses est dterminante sinon la
squence prcdente aura une autre interprtation.
Lusage de loprateur squentiel se rencontre particulirement dans les structures de contrle for de
rptition.
VI -5 Forme for des structures de contrle rptitives
La forme des structures rptitives utilisant for sapparente beaucoup celle utilisant while, en ce sens
que le test y est effectu avant lexcution du bloc dinstructions ; en plus dun rarrangement des autres
lments de la structure.
a) Syntaxe de for
for possde la syntaxe suivante :
for ([expression1] ; [expression2] ; [expression3])
{
instructions
}


Nature et sens des expressions incluses dans for :
expression1 est excute une fois et une seule, tout au dbut de la premire
itration. Pour cela, on lutilisera pour linitialisation
dune variable dite de contrle, qui servira dans la condition.
expression2 elle servira de contrle pour la boucle. Si vrai on excute les
instructions , si fausse on quitte la boucle.
expression3 elle est excute la fin de chaque itration. On peut y modifier la
valeur de la variable de contrle, comme par incrmentation ou
dcrmentation par exemple.
On va prendre un exemple avec un cas de boucle fait avec la forme whileque lon convertie en forme for.
On pourrait crire un programme qui affiche 5 fois le mot hello en utilisant une variable de contrle
qui est un entier i :
Forme while Forme for
int i;

i = 0;
while( i < 5 )
{
printf( "\nHello ! %d", i );
i++;
}
int i;

for( i = 0; i < 5; i++ )
{
printf( "\nHello ! %d", i );
}


On remarque que :
29

Lexpression1 : i = 0 correspond linitialisation
Lexpression2 : i < 5 correspond la condition
Lexpression3 : i++ correspond lincrmentation
Pour laspect facultatif des expressions dans for on peut illustrer par ces quelques modifications apportes
au code ci-dessus :
int i;
i = 0;
for( ; i < 5; )
{
printf( "\nHello ! %d", i );
i++;
}
Ce programme sexcutera normalement. On peut galement supprimer la condition i < 5. La syntaxe
sera toujours correcte. Quand la condition est absente, par dfaut, le langage la considre comme vraie.
On va obtenir une boucle infinie. Cela na pas beaucoup dintrt pratique.
VI -6 Boucle for et oprateur squentiel virgule
Dans beaucoup de cas de la boucle for on a besoin de plus que dune instruction dans linitialisation ou
dans lincrmentation. Dans ces cas loperateur squentiel est trs utile.
Prenons le cas o on veut copier un tableau t1 dans un tableau t2 plus grand :
int i, j ,t2[10], t1[5]={3,1,7,4,9};
for(i=0,j=5; i<5; i++,j++) t2[j]=t1[i];
Pour la condition, i<5, cest aussi possible ; mais il est prfrable dutiliser les oprateurs logiques &&
et || afin dviter les erreurs de logique et non de syntaxe. Voici un exemple avec une variante du cas
prcdent:
for(i=0,j=5; i<5, j<10; i++,j++) t2[j]=t1[i];
On a une condition squentielle, compos de deux expressions i<5 et j<10 ; la valeur de la condition
est celle de la dernire expression : j<10. Lexpression i<5 est excute puis ignore, elle ne sert
rien. Dans ce cas de figure, i<5 et j<10 sont quivalentes, une des deux suffira. Si elles avaient t
diffrentes, la condition de la boucle telle quelle est crite donnera un rsultat, mais ce nest peut tre pas
celui souhait. Il aurait fallut crire une seule condition avec un lien logique :
for(i=0,j=5; i<5 && j<10; i++,j++) t2[j]=t1[i];

Considrons dautres exemples o on veut afficher les variables i et j avec une boucle for en prsence de
loperateur squentiel virgule.
30

Exemple 1: une seule condition
for(i=0,j=20; i<5; i++,j--)
printf("%d %d\n",i,j);
affichera le rsultat suivant:
0 20
1 19
2 18
3 17
4 16
Exemple 2: deux conditions
Voici un exemple avec une variante du cas prcdent o nous avons deux conditions squentielles,
composes de deux expressions i<5 et j>17 :
for(i=0,j=20; i<5, j>17; i++,j--)
printf("%d %d\n",i,j);
affichera le rsultat suivant:
0 20
1 19
2 18
la valeur de la condition est celle de la dernire expression : j>17. Lexpression i<5 est excute
puis ignore, elle ne sert rien.
Exemple 3: condition logique
Dans le cas ou on souhaiterait que les deux conditions soient ralises, Il aurait fallut crire une seule
condition avec un lien logique :
for(i=0,j=20; i<5 && j>0; i++,j--)
printf("%d %d\n",i,j);
affichera le rsultat suivant:
0 20
1 19
2 18
3 17
4 16

31

VI -7 Les instructions de branchement inconditionnel : continue, break et goto
Ces instructions vont faire le branchement vers un endroit prcis du programme sans aucune condition
pralable. Les instructions continue et break sont utiliss dans les boucles.
Prenons lexemple dun programme qui chercherait dterminer si un nombre entr au clavier est un
nombre premier ou non ?
On va chercher si ce nombre admet un diviseur autre que 1 ou lui mme.
int N,i;
printf("Entrez un nombre :");
scanf("%d",&N);
for ( i = 2; i < N; i++ )
{
if ( N % i != 0 ) continue;
else
{
printf("\n%d est diviseur de N=%d",i,N);
printf("\n%d n'est pas premier",N);
break;
}
}
Aprs la division de N par i ; on fait le test sur le reste, si ce reste est non nul alors i ne divise pas N. On
doit passer la valeur suivante de i , soit i+1. Cest ce que fait linstruction continue.
Continue renvoie la fin de litration en cours en sautant toutes les instructions qui la suivent.
Si le reste est nul, N nest pas premier. Alors le programme va dans le bloc de else, fait les affichages
rencontrs, et arrive linstruction break, qui renvoie le programme la fin de la boucle.
Break, quand il est rencontr fait sortir de la boucle, en sautant toutes les instructions qui le sparent de
laccolade fermante du bloc for.
Linstruction goto pour sa part permet de faire des branchements non conditionnels vers un endroit
quelconque du programme identifi par un label.
Label : cest un identifiant respectant les rgles des identificateurs, suivi de loprateur deux-points. Un
label na pas besoin de dclaration. Il sert reprer une ligne du programme et na pas deffet spcifique
lexcution. On peut les placer partout dans un programme.
Exemples de noms de labels valides : label_numero_1, entree, sortie, km_40 . etc.
32

Exemple de programme avec goto : comparer deux nombres a et b saisis au clavier et affichage de la
comparaison.
int a,b;
printf("saisir 2 nombres :");
scanf("%d %d",&a,&b);
if (a>b) goto lab_1;
if (b>a) goto lab_2;
if (b==a) goto lab_3;
lab_1:
printf("a est plus grand que b\n");
goto fin;
lab_2:
printf("b est plus grand que a\n");
goto fin;
lab_3:
printf("a et b sont egaux\n");
goto fin;
fin:
printf(" termine !!!!");
Remarque trs importante : goto est un hritage de la programmation non structure. Son usage rend les
programmes illisibles. Un code crit avec des goto est difficilement rutilisable. Il est fortement
dconseill de lutiliser.
VII- Les tableaux

Les variables, telles que nous les avons vues, ne permettent de stocker qu'une seule donne la
fois. Or, pour de nombreuses donnes, comme cela est souvent le cas, des variables distinctes seraient
beaucoup trop lourdes grer. Heureusement, le langage C propose des structures de donnes permettant
de stocker l'ensemble de ces donnes dans une variable commune . Ainsi, pour accder ces valeurs il
suffit de parcourir la variable de type complexe compose de variables de type simple.
Le langage C propose deux types de structures :
les tableaux, permettant de stocker plusieurs donnes de mme type
les structures, pouvant contenir des donnes htrognes

VI I -1 Dfinition dun tableau
33

Un tableau est un ensemble fini dlments de mme type stocks en mmoire des adresses
contiges (les unes la suite des autres). Un tableau est donc une suite de cases (espace mmoire) de
mme taille. La taille de chacune des cases est conditionne par le type de donne que le tableau contient.
Les lments du tableau peuvent tre :
des donnes de type simple : int, char, float, long, double... (la taille d'une case du tableau est alors le
nombre d'octets sur lequel la donne est code)
des pointeurs (objets contenant une adresse mmoire).
des tableaux

Lorsque le tableau est compos de donnes de type simple, on parle de tableau monodimensionnel (ou
vecteur) . Lorsque celui-ci contient lui-mme d'autres tableaux on parle alors de tableaux
multidimensionnels (aussi matrice ou table)
VII-2 Tableau une dimension

En langage C, la syntaxe de la dclaration d'un tableau unidimensionnel est la suivante :
type Nom_du_tableau [Nombre d'lments]
typedfinit le type d'lments que contient le tableau (rappel : un tableau en langage C est
compos uniquement d'lments de mme type), c'est--dire qu'il dfinit la taille d'une case du
tableau en mmoire (char, int, float, )
Nom_du_tableau est le nom que l'on dcide de donner au tableau, le nom du tableau suit les
mmes rgles qu'un nom de variable
Nombre d'lments est un nombre entier qui dtermine le nombre de cases que le tableau doit
comporter

Exemple:
int T[10] : indique que T est un tableau de 10 lments de type entier. Cette dclaration rserve en mmoire un
espace de 10x4 octets conscutifs.
Conventionnellement en langage C, la 1re position porte le numro 0. Donc nos indices vont de zro 9.
On accde un lment du tableau en lui appliquant loprateur [ ]. Les lments dun tableau sont toujours
numrots de 0 (nombre d lment)-1.
Le 1er lment du tableau sera dsign par T[0].
Le 3me lment du tableau sera dsign par T[2].
Le dernier lment du tableau sera dsign par T[9].
Plus gnralement, une notation telle que T[i] dsigne un lment dont la position dans le tableau est i+1.
La notation &T[i] dsigne ladresse de llment T[i] .
1) Initialiser les lments du tableau
Lorsque l'on dfinit un tableau, les valeurs des lments qu'il contient ne sont pas dfinies, il faut
donc les initialiser, c'est--dire leur affecter une valeur.
Pour initialiser un tableau avec des valeurs spcifiques, il est possible d'initialiser le tableau la dfinition
en plaant entre accolades les valeurs, spares par des virgules :
34

int T[] = {1, 2, 6, 5, 2, 1, 9, 8, 1, 5};
Le nombre de valeurs entre accolades est automatiquement la dimension du tableau
Les valeurs entre accolades doivent tre des constantes (l'utilisation de variables provoquera une
erreur du compilateur)
Il doit y avoir au moins une valeur entre accolades. Ainsi, l'instruction suivante permet d'initialiser
tous les lments du tableau zro : int Tab[10] = {0};
Exemple 1:
#include<stdio.h>
#define N 10
main()
{
int T[N],i;
printf("Remplissage d'un tableau de %d element entier :\n",N);
for(i=0;i<N;i++)
{
printf("donner T[%d] = ",i);
scanf("%d",&T[i]);
}
printf("les elements du tableau saisie sont:\n");
for(i=0;i<N;i++)
printf("T[%d]= %d\n",i,T[i]);
}
Remarque 1 : On ne peut pas crire T1=T2. Il faut effectuer laffectation pour chacun des lments du tableau.
Exemple 2 :
#include<stdio.h>
#define N 10
main()
{
int T1[N],T2[N],i;
printf("Remplissage du tableau 1: \n");
for(i=0;i<N;i++)
{
35

printf("donner T1[%d] = ",i);
scanf("%d",&T1[i]);
printf("\n");
}
for(i=0;i<N;i++)
T2[i]=T1[i];
printf("les elements du tableau 2 sont:\n");
for(i=0;i<N;i++)
printf("T2[%d]= %d\n",i,T2[i]);
}
Remarque 2 : On peut initialiser un tableau lors de sa dclaration par une liste de constantes de la faon
suivante :
Exemple 3 :
#include<stdio.h>
#define N 10
main()
{
int T[N]={1,55,6,7,11,0,9,8,10,3},i;
printf("les elements du tableau sont:\n");
for(i=0;i<N;i++)
printf("T[%d]= %d\n",i,T[i]);
}
Exemple 4:
Supposons que nous souhaitons dterminer, partir de 10 notes dtudiants (fournies en donnes), combien
dentres elles sont suprieures la moyenne de la classe.
#include<stdio.h>
main()
{
int i,nombre;
float som,moy,T[10];
for(i=0;i<10;i++)
{
36

printf("donnez la note numero %d:",i+1);
scanf("%f",&T[i]);
}
for(i=0,som=0;i<10;i++)
som+=T[i];
moy=som/10;
printf("\n\n moyenne de la classe: %.2f\n",moy);
for(i=0,nombre=0;i<10;i++)
if(T[i]>moy) nombre++;
printf("%d etudients ont plus de cette moyenne \n",nombre);
}
2) Tableau de caractres :
Une chane de caractres est traite comme un tableau une dimension de caractres (vecteur de
caractres). Lors de la dclaration, nous devons indiquer l'espace rserver en mmoire pour le stockage
de la chane.
Dclaration et mmorisation :
La dclaration de chanes de caractres en langage C se fait de la manire suivante :
char <NomVariable> [<Longueur>];
Exemples :
char nom [20];
char ville [20];

En gnral, les tableaux sont initialiss par l'indication de la liste des lments du tableau entre accolades.
La reprsentation interne d'une chane de caractres est termine par le symbole '\0' (NUL). Ainsi, pour
un texte de n caractres, nous devons prvoir n+1 octets.

char ville[] = {'M','a','r','r','a', 'k','e', 'c','h','\0'};
Lors de l'initialisation par [ ], l'ordinateur rserve automatiquement le nombre d'octets ncessaires pour la
chane, c.--d.: le nombre de caractres + 1 (ici: 10 octets).
Pour le cas spcial des tableaux de caractres, nous pouvons utiliser une initialisation plus confortable en
indiquant simplement une chane de caractre constante:
char ville[] = "Marrakech";
Nous pouvons aussi indiquer explicitement le nombre d'octets rserver, si celui-ci est suprieur ou gal
la longueur de la chane d'initialisation.
char ville[15] = "Marrakech";
37

Nous pouvons aussi initialiser un tableau de caractres en utilisant une boucle. Voyons lexemple pour
saisir et afficher les caractres de la ville de Marrakech.
#include<stdio.h>
main()
{
int i;
char ville[15];
for(i=0;i<9;i++)
{
printf("Saisir le caractere %d:",i+1);
scanf("%c",&ville[i]);
fflush(stdin);
}
for(i=0;i<9;i++)
printf("%c",ville[i]);
}
VI I -3 Tableau deux dimensions
Les tableaux multidimensionnels sont des tableaux qui contiennent des tableaux. Dans ce cours nous
traitons uniquement les tableaux deux dimensions.
Dfinition :
En langage C, un tableau deux dimensions A est interprter comme un tableau (uni-dimensionnel) de
dimension L dont chaque composante est un tableau (uni-dimensionnel) de dimension C.
On appelle L le nombre de lignes du tableau et C le nombre de colonnes du tableau. L et C sont alors les deux
dimensions du tableau. Un tableau deux dimensions contient donc L*C composantes







On dit qu'un tableau deux dimensions est carr, si L est gal C.
38

En faisant le rapprochement avec les mathmatiques, on peut dire que "A est un vecteur de L vecteurs de
dimension C", ou mieux: "A est une matrice de dimensions L et C".
Exemple :
Considrons un tableau NOTES une dimension pour mmoriser les notes de 20 lves d'une classe dans un
devoir:
int NOTE[20] = {45, 34, ... , 50, 48};


Pour mmoriser les notes des lves dans les 10 devoirs d'un trimestre, nous pouvons rassembler plusieurs de
ces tableaux uni-dimensionnels dans un tableau NOTES deux dimensions :
int NOTE[10][20] = {{45, 34, ... , 50, 48},
{39, 24, ... , 49, 45},
... ... ...
{40, 40, ... , 54, 44}};










Dans une ligne nous retrouvons les notes de tous les lves dans un devoir. Dans une colonne, nous
retrouvons toutes les notes d'un lve.

c) Accs aux composantes

Considrons un tableau A de dimensions L et C. En langage C,
les indices du tableau varient de 0 L-1, respectivement de 0 C-1.
la composante de la N
ime
ligne et M
ime
colonne est note: A[N-1][M-1]
Accs un tableau deux dimensions en C :
Les lments d'un tableau de dimensions L et C se prsentent de la faon suivante:

/ \
| A[0][0] A[0][1] A[0][2] . . . A[0][C-1] |
| A[1][0] A[1][1] A[1][2] . . . A[1][C-1] |
| A[2][0] A[2][1] A[2][2] . . . A[2][C-1] |
| . . . . . . . . . . . . . . . |
| A[L-1][0] A[L-1][1] A[L-1][2] . . . A[L-1][C-1] |
\ /




39

d) Affectation et affichage
Lors du travail avec les tableaux deux dimensions, nous utiliserons deux indices (p.ex: i et j), et
la structure for, souvent imbrique, pour parcourir les lignes et les colonnes des tableaux.

Affectation et affichage du contenu d'un tableau deux dimensions :
#include<stdio.h>
main()

{
int i,j;
int A[3][4]={{1,2,3,4},
{5,6,7,8},
{9,0,3,4}} ;

for (i=0; i<3; i++)
{
for (j=0; j<4; j++)
printf("%7d", A[i][j]);
printf("\n");
}
}

Remarques :
Avant de pouvoir afficher les composantes d'un tableau, il faut leur affecter des valeurs.
Pour obtenir des colonnes bien alignes lors de l'affichage, il est pratique d'indiquer la largeur minimale
de l'affichage dans la chane de format.

Affectation avec des valeurs provenant de l'extrieur :

#include<stdio.h>
main()

{
int i,j;
int A[3][4];

for (i=0; i<3; i++)
for (j=0; j<4; j++)
scanf("%d", &A[i][j]);

for (i=0; i<3; i++)
{
for (j=0; j<4; j++)
printf("%7d", A[i][j]);
printf("\n");
}
}

Das könnte Ihnen auch gefallen