Vous êtes sur la page 1sur 13

Centres des classes prÄparatoires

aux grandes Äcoles de Safi

PROGRAMMATION
Langage C
PrÄparÄ par : Jamal BAKKAS

[Computer Science is not about computers,


any more than astronomy is about telescopes.]
Edsger Wybe Dijkstra
1) Introduction
1.1) Petite histoire
Le langage C a €t€ mis au point par D.Ritchie et B.W.Kernighan au d€but des ann€es 70.
Leur but €tait de permettre de d€velopper un langage qui permettrait d'obtenir un syst•me
d'exploitation de type UNIX portable. D.Ritchie et B.W.Kernighan se sont inspir€s des
langages B et BCPL, pour cr€er un nouveau langage : le langage C.
1.2) Les atouts du langage
Un des principaux int€r‚ts du langage C est sa portabilit€. en effet, un programme €crit en
langage C en respectant la norme ANSI est portable sans modifications sur n'importe quel
syst•me d'exploitation disposant d'un compilateur C : Windows, UNIX, VMS (syst•me
des VAX) ou encore OS/390 ou z/Os (l'OS des mainframes IBM).
La rapidit€ des programmes €crits en langage C est en grande partie due au fait que le
compilateur pr€suppose que le programmeur sait ce qu'il fait : il g€n•re un code ne
contenant pas de v€rifications sur la validit€ des pointeurs, l'espace d'adressage, etc.
De plus, une des caract€ristiques du langage est qu'il est ƒ faiblement typ€ „, en effet : les
types de donn€es qu'il manipule sont tr•s restreints, et proches de la repr€sentation interne
du processeur : par exemple, le type 'Cha…ne de caract•res' n'existe pas en C.
Pour conclure, le langage C est un langage facile † apprendre vu qu’il dispose de peu
d'instructions, les structures de donn€es sont limit€es, etc.
1.3) Structure d’un programme
D€finition :
Un programme est la traduction d’un algorithme dans un langage compr€hensible par la
machine.

Le fichier source d'un programme €crit en langage C est un simple fichier texte dont
l'extension est par convention ƒ .c „. il est sous la forme suivante :
#include <stdio.h>
#include <… . h> Ent•te
#define …
main(){
type1 var1
.
. D‚clarations
. des variable
typen varn
Instruction 1
.
. Corps
.
Instruction n
}
La fonction main() est la fonction principale des programmes en C: Elle se trouve
obligatoirement dans tous les programmes C. L'ex€cution d'un programme entra…ne
automatiquement l'appel de la fonction main(), c’est le point d’entr€e du programme.

2 J.BAKKAS
1.4) Les •tapes de l’ex•cution d’un programme C
 La pr•compilation
 La compilation
 L'•dition des liens
Le programme source (exemple premierProg.c) ne peut pas ‚tre ex€cut€ par l'ordinateur tel
qu'il se pr€sente. Il faut le traduire en langage machine, c'est † dire des instructions
€l€mentaires que le microprocesseur peut ex€cuter. Pour rendre le texte exploitable par la
machine, on utilise un programme destin€ † le traduire : le compilateur C.
La pr•-compilation : modifie le texte du fichier source en interpr€tant les directives destin€es
du pr€processeur. Le pr€processeur est un programme qui va traiter des directives qui lui sont
destin€s. Les directives de pr€-compilation commencent par le symbole #. Elles sont
facilement rep€rables. Le C ne poss•de pas la possibilit€ d'€crire un texte sur l'€cran : on doit
donc inclure une biblioth•que qui int•gre ces fonctions manquantes. La directive #include
<stdio.h> r€alise ainsi l'inclusion des d€finitions pr€cises des fonctions standards
d'entr€es/sorties. Ces d€finitions se trouvent dans le fichier stdio.h. ƒstdio.h„ signifie standard
input/output et l'extension ƒ.h„ indique un fichier ƒheader„, simplement c'est le fichier
d'ent‚te qui donne la d€finition de certaines fonctions. A ce stade, la pr€compilation est
termin€ nous obtenons un fichier dans lequel des directives ont €t€ appliqu€es.
Le compilateur : est un programme qui va v€rifier la syntaxe et la concordance des types du
fichier g€n€r€ par le pr€-compilateur. Si le programme source ne comporte pas d'erreur de
syntaxe il va g€n€rer un fichier compos€ d'instructions machines.
Le r€sultat de la compilation est un fichier appel€ module objet, (premierProg.o † partir du
fichier source premierProg.c). Bien que form€ d'instructions machine, il n'est pas ex€cutable.
En effet, la pr€compilation a permis de donner la d€finition de la fonction printf. La
compilation a pr€par€ son usage mais n'a pas ajout€ les s€quences d'instructions machine qui
la r€alise. L'ensemble des instructions de toutes les fonctions d€finies dans stdio.h (la
biblioth•que) se trouve ailleurs dans un autre module objet d€j† compil€. Il reste † les lier
avec notre fichier objet pour pouvoir les utiliser. Le programme compil€ est pr‚t † utiliser la
fonction printf mais il ne la poss•de pas.
l'•diteur de lien : Le rˆle l'€diteur de lien est de r€unir le module objet premierProg.o
pr€c€demment construit et le module correspondant † la biblioth•que standard (<stdio.h>)
pour g€n€rer le programme ex€cutable nomm€ par exemple ƒ premierProg.exe „. L'€diteur de
lien va remplacer l'appel pr€par€ de la fonction printf par son appel r€el.
Remarque :
Dans la plupart des cas, les trois programmes €diteur de texte, compilateur (avec le pr€-
compilateur) et l'€diteur de liens sont int€gr€s harmonieusement au sein d'un environnement
d€di€ au d€veloppement en langage C (exemple DevC++). Les €tapes compilation puis
€dition de liens sont encha…n€es automatiquement sans que le programmeur ait besoin de le
faire explicitement.
A vous de vous familiariser avec l'environnement de d€veloppement choisi. Vous n'avez pas †
vous pr€occuper de savoir o‰ se trouve le module objet associ€ aux fonctions d€finies dans ƒ
stdio.h „. A l'installation du compilateur ces fichiers sont rang€s quelque part. Le compilateur
sait les retrouver, c'est implicite.
Les €tapes de pr€compilation, de compilation et d'€dition des liens sont g€n€ralement
automatiquement encha…n€es. Les fichiers interm€diaires issus de la pr€compilation et de la
compilation sont automatiquement d€truits. Il est cependant possible d'utiliser des options
pour les effectuer s€par€ment afin d'obtenir ces fichiers interm€diaires.
3 J.BAKKAS
2) Les variables
2.1) Rappel :
2.1.1)Les diff•rents types de m•moire
L'endroit o‰ s'ex€cute les programmes est la m€moire, donc toutes les donn€es du programme
(les variables, les fonctions, ...) se trouvent en m€moire.
Les ordinateurs sont dot€s des m€moires tr•s rapides (coÄte cher) mais pas importantes, et de
m€moires importantes (coÄte moins cher) mais pas tr•s rapides.
Les diff€rents types de m€moire existant dans un ordinateur, de la plus rapide † la plus lente :
1. Les registres : une m€moire ultrarapide situ€e directement dans le processeur.
2. La m€moire cache : elle fait le lien entre les registres et la m€moire vive.
3. La m€moire vive : c'est la m€moire avec laquelle nous allons travailler le plus souvent.
4. Le disque dur : que vous connaissez sŠrement, c'est l† qu'on enregistre les fichiers.
2.1.2)Sch•ma d’une m•moire vive :
Adresse valeur
0 0.321456
1 7658
2 23
3 9.536883
4 547652
… …
9 123 432 567 1.000028
… …
Les adresses : une adresse est un nombre qui permet † l'ordinateur de se rep€rer dans la
m€moire vive, la premi•re adresse est 0.
Les valeurs : A chaque adresse, on peut stocker une valeur (un nombre). On ne peut stocker
qu'un nombre par adresse !
2.2) D•finition d’une variable
Une variable est un emplacement m€moire nomm€ qui peut contenir une valeur pouvant ‚tre
modifi€es pendant l'ex€cution du programme.
D€claration
type variable;
exemple :
int n;
float a, b, c;
double x, y, z = 0.5;
Lorsqu’on d€clare une variable, int n=10; on r€serve un emplacement m€moire pour n dont le
contenu (valeur) est 10, et l’adresse peut-‚tre obtenu par &n.
2.3) Les types de base

L’espace m€moire occup€ par la variable d€pend de son type, le tableau ci-dessous pr€sente le
nombre d’octets occup€s par chaque type ainsi que les codes format correspondants utilis€s
dans printf (Voir paragraphe lecture et Åcriture).

4 J.BAKKAS
Nombre
Type En C Format x,o : Afficher un entier dans le format
d’octets hexadÄcimal respectivement octal
Caract•re char 1 %c
cha…ne de caract•re char * - %s f : Afficher un float ou un double en
entier court short int 2 notation dÄcimale
int 4 %d ou %i e, E : Afficher un float ou un double en
Entier
long int 4 notation scientifique avec un petit e
entier non sign€ unsigned int 4 %u (respectivement E)
R€el simple float 4
%f, %e, g, G : Afficher un float ou un double
double 8 (utilise le format le plus adaptÄ)
r€el double %E, %g
long double 12
Les codes format utilis€s dans scanf (Voir paragraphe lecture et Åcriture). sont † peu pr•s les
m‚mes que dans printf, sauf pour les flottants notamment.
Code format Utilisation
f, e, g float
lf, le, lg double
Lf, Le, Lg long double
2.4) Les pointeurs
D€finition
Comme on a d€j† vu, Le langage C dispose d'un op€rateur ƒ & ‚ permettant de r€cup€rer
l'adresse en m€moire d'une variable. Par exemple, si n est une variable, &n d€signe l'adresse
de n.
Le C dispose €galement d'un op€rateur ƒ * „ permettant d'acc€der au contenu de la m•moire
dont l'adresse est donn€e. Par exemple, supposons qu'on a :
int n;
Alors les instructions suivantes sont strictement identiques.
n = 10;
*( &n ) = 10;
Un pointeur (ou une variable de type pointeur) est une variable destin€e † recevoir une
adresse. On dit alors qu'elle pointe sur un emplacement m€moire. L'acc•s au contenu de la
m€moire se fait par l'interm€diaire de l'op€rateur *.
D€claration:
int *p; ou int * p;
Donc le type d'un pointeur sur int est int *.
int * p1, *p2, p3; // p1,p2 sont de type int *, p3 de type int
Exemple :
int *n,a ;
*n=&a ;
On dit que n pointe sur a, et cela peut se traduire en m€moire de la mani•re suivante :
Adresse valeur
0 0.321456
1 7658
… …
a{ 35425 9.536883
35426 547652
… …
n{ 9 123 432 56 35425
9 123 432 57 1.0800045

5 J.BAKKAS
3) Expressions et op•rateur
3.1) Expression :
Une expression est un ensemble de valeurs (op€randes) reli€es par des op€rateurs et
€quivalent † une valeur.
Expression
Exemple : Op€rateur
nbre1 = n1 + 3
Op€randes
Les expressions peuvent ‚tre combin€es entre elles par des opÅrateurs et former ainsi des
expressions plus complexes.
Une expression comme I=0 ou I++ ou printf(...) devient une instruction, si elle est suivie
d'un point-virgule.
3.2) Les op•rateurs :
 Les op€rateurs arithm€tiques courants : +, -, *, /, % (modulo)
 Les op€rateurs de comparaison : <, >, <=, >=, = =, !=
 Les op€rateurs logiques : &, && (et), |, || (ou), ! (not)
 Les op€rateurs d'incr€mentation et de d€cr€mentation :
Op€rateur d'incr€mentation : ++
Op€rateur de d€cr€mentation : --
Ils existent sous forme pr•fix•e ou postfix•e. L'op€rande doit ‚tre une value de type
num€rique ou pointeur.
Soient i et j deux variables de type int :
post incrÅmentation
j = i++; est ‚quivalent ƒ : j=i;
i=i+1;
prÅ incrÅmentation
j = i++; est ‚quivalent ƒ : i=i+1;
j=i;
L'op€rateur -- s'utilise de la m‚me mani•re que ++ mais l'op€rande est cette fois-ci
d€cr€ment€e.
 Les op€rateurs d'affectation
Ce sont les op€rateurs : =, += , -= , *= , /=, ...
x +=a; par exemple est €quivalent † : x=x+a;

4) Lecture et •criture
La biblioth•que standard <stdio> contient un ensemble de fonctions qui assurent la
communication de la machine avec le monde ext€rieur.
4.1) Ecriture
La fonction printf est utilis€e pour afficher du texte, des valeurs de variables ou des r€sultats
d'expressions.
Syntaxe : printf("Format", Expr1, Expr1,…)
Format : est une cha…ne de caract•res dans laquelle sont ins€r€s les caract•res repr€sentant la
ou les variables † €crire.
Pour chaque variable, un type de conversion est sp€cifi€. Ce type de conversion est d€crit par
les caract•res qui suivent le caract•re “%” (voir paragraphe type de base).
Exemple : int x ;
printf("la valeur de x est :%d",x);

6 J.BAKKAS
Affichage des caractƒres sp•ciaux
Certains caract•res sont sp€ciaux et il faut utiliser la technique dite d'•chappement pour les
utiliser. En langage C, le caract•re d'€chappement est le caract•re \.
Exemples :
Caractƒre Valeur
'\t' Le caract•re 'tabulation'
'\r' Le caract•re 'retour chariot'
'\n' Le caract•re 'fin de ligne'
'\\' Le caract•re 'antislash'
4.2) Lecture d’une donn•e
scanf("Format", arg1,arg2,…)
Format : est une cha…ne de caract•res qui d€crit la ou les variables † lire.
Exemple :
int n ,ref;
char c[20] ;
float p ;
scanf("%d",&n) ;
scanf("%s%d%f",c,&ref,&p) ;
Pour lire un caract•re on utilise la fonction getchar()
c = getchar()

5) Structures conditionnelles

Les structures conditionnelles permettent de r€aliser des tests, et suivant le r€sultat de ces
tests, d’ex€cuter des parties de code diff€rentes.
Attention, il y a bien 2 symboles "==" pour tester l'ÅgalitÅ.
Il existe trois formes du conditionnel :
5.1) Forme 1 : La s•lection simple
Syntaxe : if (condition){
Instructions
}
Exemple if (age >= 18){
printf ("Vous etes majeur !");
}
Remarque : S'il n'y a qu'une instruction entre les accolades, alors celles-ci deviennent
facultatives. Vous pouvez donc €crire :
if (age >= 18)
printf ("Vous etes majeur !");
5.2) Forme 2 : La s•lection alternative
Syntaxe if (condition){
Bloc d’instructions A
}else{
Bloc d’instructions B
}
Exemple
if (a==0){
printf("Pas de solution") ;
}else{
printf("x=%f",-a/b)
}

7 J.BAKKAS
5.3) Forme 3 : la s•lection „ choix multiples
Syntaxe :
switch(variable){
case valeur1 : instruction1 break ;
case valeur1 : instruction2 break ;
.
.
.
case valeur1 : instructionn break ;
default : instruction n+1
}
Exemple : Les jours de la semaine sont cod€s de 1 † 7, Ecrire un programme qui affiche le
jour correspondant † un code
Plusieurs conditions „ la fois
Il peut ‚tre utile de faire plusieurs tests † la fois dans une ƒ if „. Par exemple, tester si l'Žge est
sup€rieur † 18 ET si l'Žge est inf€rieur † 25.
Pour cela, il faut utiliser de nouveaux symboles : ƒ && „ pour "ET", ƒ || „ pour "OU" et
ƒ ! „ pour "NON"
Exemple: Test ET
if ( (age > 18) && (age < 25) )
Exemple : Test OU
Un programme qui d€cide si une personne a le droit d'ouvrir un compte en banque. Supposons
que, pour ouvrir un compte en banque, il faut avoir au moins 30 ans ou bien avoir plein
d'argent
if (age > 30 || argent > 100000){
printf("Bienvenue chez PicsouBanque !");
}else{
printf("Vous avez pas le droit d’ouvrir un compte !");
}
Exemple : Test NON
En informatique, le point d'exclamation ƒ ! „ signifie "Non".
if (!(age < 18)) //Si la personne n'est pas mineure

Exercice :
1) R€solution de l’€quation
2) Ecrire un programme qui permet de simuler le travail d’une calculatrice. Le
programme permet tout d’abord de lire un r€el, suivi d’un caract•re (’+’,’-’,’*’,’/’),
puis d’un autre r€el, et d’afficher par la suite le r€sultat selon l’op€ration effectu€e.

6) Instructions it•ratives

En C Les instructions it€ratives sont sous trois formes :


6.1) Forme 1 : while (boucle ind•terministe)
while (condition){
Instructions
}
L'instruction while permet d'ex€cuter une instruction tant que < condition > est vraie.
Exemple : Ecrire une programme en C qui permet de calculer la somme des n premiers
nombres.
8 J.BAKKAS
6.2) Forme 2 : do … while (boucle ind•terministe)
Syntaxe : do {
Bloc d’instructions
} while (condition)

L'instruction do…while permet d'ex€cuter une instruction tant que < condition > est vraie.
Le test est fait apr•s chaque ex€cution de l'instruction.
Exemple : programme en C qui permet de calculer la somme des nombres dont le dernier est 0.
6.3) Forme 3 : for (boucle d•terministe)
Avec:
Syntaxe : for (exp1 ;exp2 ;exp3){ exp1 : Initialisation du compteur
Instructions exp2 : Condition de la boucle
} exp3 : Pas de variation
Cette structure est €quivalente † :
exp1
while(exp2){
Instructions
exp3
}
La structure for est utilis€e lorsque le nombre d’it€rations † effectuer est connu.
p
Exemple : Ecrire un programme en C qui permet de calculer n
Exercice : Ecrire des programmes en C qui permettent de :
1. v€rifier si un nombre n est premier ou non
2. lister les nombres premiers inf€rieurs † un nombre n
3. v€rifier si un nombre n est parfait ou non
4. calculer le pgcd et le ppcm de deux entiers

7) Les tableaux et cha†nes de caractƒres


7.1) D•finition
Un tableau est un ensemble de zones m€moires cons€cutives, il permet de repr€senter une
liste de donn€es de m‚me type.
7.2) Les tableaux „ une dimension
D•finition
Un tableau (uni-dimensionnel) est une variable structur€e form€e d'un nombre entier N de
variables du m‚me type.
D€claration : type nomTab[tailleMax]
Exemple : int tab[10]; /* DÅclare un tableau de 10 ÅlÅments (de type int) */
/* tab est le nom du tableau */

Indices : 0 1 2 3 … 9
Valeurs : 12 5 43 22 … 16

Manipulation des cases d'un tableau:


On peut initialiser un tableau † l'aide des accolades.
Exemple : int t[10] = {0, 10, 20, 30, 40, 50, 60, 70, 80, 90};
Indices : 0 1 2 3 4 5 6 7 8 9
Valeurs : 0 10 20 30 40 50 60 70 80 90

9 J.BAKKAS
On peut acc€der † un €l€ment du tableau via son indice
Exemple :
int a ;
a = t[3] ;
t[1] = a ;
On peut parcourir un tableau en utilisant les structures it€ratives.
for (i=0 ;i<=9 ;i++) printf(’’%d”,t[i]);
Exercices: Voir les s€ries des travaux dirig€s 2 et 3

7.3) Les tableaux „ deux dimensions

Les tableaux † deux dimensions (bidimensionnels) sont des tableaux qui contiennent des
tableaux.
Par exemple le tableau bidimensionnel (3 lignes, 2 colonnes) suivant, est en fait un tableau
comportant 3 €l€ments, chacun d'entre eux €tant un tableau de 2 €l€ments :
2.0 2.6
est stock€ en m€moire de la
1.2 -2.9 2.0 2.6 1.2 -2.9 3.4 0.5
mani•re suivante :
3.4 0.5
D€claration :
type nomTab[nbrelignes][nbrescolonne];
nomTab[i][j] //l’element de la i •me ligne ,j •me colonne
Exemple : int a, A[3][2] ;
A[1][2]=1.2 ;
a=A[1][2] ; // permet de mettre 1.2 dans a
Exercice d’application :
 Somme de deux matrice A(n,m) et B(n,m)
 Produit de deux matrice A(n,m) et B(m,p)
 Calcule de la matrice An
7.4) Cha†nes de caractƒres
En C une cha…ne de caract•res est un tableau de caract•res de type (char) termin€ par le
caract•re ƒ \0 „.
D€claration : char nom_chaine[taille_chaine] ;
Ainsi la chaine de caract•res "bonjour" est €quivalente au tableau :
b o n j o U r \0
Lecture
scanf("%s", chaine); //Attention!,il ne faut pas mettre le symbole &.
gets(chaine) ; // une fonction de la biblioth†que <string.h>
Ecriture
printf("%s", chaine);
puts(chaine) ; //une fonction de la biblioth†que <string.h>
Initialiser une cha†ne de caractƒres
Comme g€n€ralement en langage C, il faut initialiser votre cha…ne de caract•res, c'est-†-dire
remplir les cases du tableau avec des caract•res, sachant que celui-ci devra obligatoirement
contenir le caract•re de fin de cha…ne '\0'.
Voici un exemple d'initialisation manuelle de cha…ne de caract•res :
#include <stdio.h>

10 J.BAKKAS
void main(){
char Chaine[20], mot[20]={‘m’,’a’,’t’,’h’,’ ’,'S','U','P','\0'};
Chaine[0]= 'B';
Chaine[1]= 'o';
Chaine[2]= 'n';
Chaine[3]= 'j';
Chaine[4]= 'o';
Chaine[5]= 'u';
Chaine[6]= 'r';
Chaine[7]= '\0';
Printf("%s %s",chaine,mot) ;
}
Voici une autre fa•on (plus simple) d'initialiser une cha…ne de caract•res :
Les fonctions de manipulation de cha†nes de caractƒres
De nombreuses fonctions de manipulation de cha…nes sont directement fournies. Ces fonctions
se trouvent dans le fichier d'en-t‚te <string.h>, c'est la raison pour laquelle il faut ajouter la
ligne suivante en d€but de programme : #include <string.h>
Ci-dessous une liste non exhaustive des fonctions de manipulation des chaines de caract•res
strlen(chaine) : qui prend en argument le nom de la cha…ne et retourne un entier
qui correspond au nombre de caract•res de cette cha…ne.
strlwr(chaine) : r€alise cette conversion des majuscules en minuscules.
strupr(chaine) : r€alise cette conversion des minuscules en majuscules.
strchr(ch,car) : cherche la premi•re occurrence d'un caract•re dans une cha…ne
en partant de la gauche
strrchr(ch,car) : cherche la premi•re occurrence d'un caract•re dans une cha…ne
en partant de la droite
strstr(ch,sch) : cherche si une sous-cha…ne appara…t dans une cha…ne
strcmp(ch1,ch2) : permet d'effectuer une comparaison de cha…nes, elle retourne la
valeur 0 en cas d'€galit€, un positif si la premi•re cha…ne est
sup€rieure alphab€tiquement † la seconde, un n€gatif sinon
strcpy(ch1,ch2) : permet de copier ch2 dans ch1 (affectation de ch2 † ch1)
strcat(ch1,ch2) : concat•ne les deux cha…nes de caract•res ch1 et ch2
Exercices d’application :
1. Ecrire un programme qui compte le nombre de lettres d'un mot.
2. •crire un programme qui d€termine si le mot donn€ au clavier est un palindrome, i.e.
s'il peut ‚tre lu aussi bien † l'endroit qu'† l'envers.
3. Ecrire un programme qui cherche la premi•re occurrence d'un caract•re dans une cha…ne.
4. Ecrivez un programme qui cherche si une sous-cha…ne appara…t dans la cha…ne

8) Les fonctions en C
8.1) D•finition
Une fonction en C est un module, c’est l’unit€ de structuration des programmes C.
Un programme C doit ‚tre con•u comme un ensemble de fonctions dont la principale est la
fonction main().
Syntaxe :
[type] nomFonction([parametres]){
D‚clarations
Instructions
retourne (resultat)
}

11 J.BAKKAS
Si la fonction n’est pas d€finie avant la fonction principale, alors l’ent‚te de la fonction
(appel€ aussi prototype), doit ‚tre d€finie au niveau de la fonction principale main()
Exemple : #include <stdio.h>
main(){
int somme(int,int);
int a=10,b=20,c;
c=somme(a,b);
printf("a+b=%d",c);
}
int somme(int x, int y){
int z;
z=x+y;
return(z);
}
8.2) Passage par valeur et passage par r•f•rence
8.2.1) Passage par valeur : Le param•tre r€cup•re sa valeur initiale d’avant l’appel apr•s
l’ex€cution de la fonction
Exercice : fonction de permutation des 3 entiers a,b et c, avec un affichage de a,b,c avant et
apr•s la permutation dans la fonction main()
#include <stdio.h>
main(){
void permutation(int,int,int);
int a=10,b=20,c=30;
printf("avant: a=%d b=%d c=%d\n",a,b,c); //avant: a=10 b=20 c=30
permutation(a,b,c);
printf("apres: a=%d b=%d c=%d\n",a,b,c); // apres: a=10 b=20 c=30
}
void permutation(int x, int y, int z){
int t;
printf("avant : x=%d y=%d z=%d\n",x,y,z);
t=x; x=y; y=z; z=t;
printf("apres : x=%d y=%d z=%d\n",x,y,z);
}
Dans un passage par valeur, les param•tres effectifs passent leurs valeurs (des copies) aux param•tres
formels, et tout changement effectu€ sur ces derniers n’affecte en aucun cas les param•tres effectifs.
8.2.2) Passage par r•f•rence : Apres l’ex€cution de la fonction le param•tre garde la valeur
qui lui a €t€ affect€ par la fonction
Exercice : fonction de permutation de deux entiers a et b, avec un affichage de a et b avant et
apr•s la permutation dans la fonction main()
#include <stdio.h>
main(){
void permutation(int *ad,int *ad);
int a=10,b=20;
printf("avant :a=%d b=%d\n",a,b); //avant: a=10 b=20
permutation(&a,&b);
printf("apres :a=%d b=%d\n",a,b); // apres: a=20 b=10
}
void permutation(int *x, int *y){
int t;
t=*x; *x=*y; *y=t;
}
Dans un passage par r€f€rence, les param•tres formels sont des pointeurs qui pointent sur les
param•tres effectifs, ce qui justifie le changement de ces derniers par la fonction apr•s l’appel.
12 J.BAKKAS
8.3) Variables globales et variables locales
8.3.1)Variables globales : c’est une variable d€clar€e † l'ext€rieur du corps de toute
fonction, et elle peut ‚tre utilis€e par n’importe quelle fonction.
En C une variable globale est d€clar€e avant toute fonction.
Exemple : #include <stdio.h>
int i ; // i est reconnu par toute les fonctions
main(){
void ecrire() ;
for(i=0 ;i<=10 ;i++)
ecrire () ;
}
void ecrire (){
printf("%d",i) ;
}
Port•e d’une variable : La port€e d'une variable d€finit les parties de programmes o‰ cette
variable est connue.
Une variable est visible † toutes les fonctions qui la suivent et non † celles qui la pr€c€dent
Exemple :
int k; //k peut •tre utilis‚ par main() f1() et f2()
main(){…
…}
int n; // n peut •tre utilis‚ par f1() et f2()
f1(){…
…}
float x; // x ne peut •tre utilis‚ que par f2()
f2(){…
…}
8.3.2)Variables locales : Une variable locale est une variable qui ne peut ‚tre utilis€e que
dans la fonction ou le bloc o‰ elle est d€finie. Sa dur€e de vie est €gale † la dur€e de
l’ex€cution de la fonction.
Exercices : soit les trois fonctions suivantes : , , . Ecrire dans le
langage C :
 Les fonctions f1, f2 et f3
 Une fonction menu() qui affiche un menu permettant de choisir une des trois
fonctions et retourne la valeur du choix.
 La fonction principale main()

13 J.BAKKAS