Vous êtes sur la page 1sur 81

Pr.

EDDAOUI AHMED

1- Edition du programme source, l'aide d'un diteur (traitement de textes). Le


nom du
fichier contient l'extension .C, exemple: EXI_1.C (menu edit ).
2- Compilation du programme source, c'est dire cration des codes machine
destins au
microprocesseur utilis. Le compilateur indique les erreurs de syntaxe mais ignore les
fonctions-bibliothque appeles par le programme.
Le compilateur gnre un fichier binaire, non listable, appel fichier objet: EXI_1.OBJ
(commande compile ).
3- Editions de liens: Le code machine des fonctions-bibliothque est charg,
cration d'un
fichier binaire, non listable, appel fichier executable: EXI_1.EXE (commande build all
).
4- Excution du programme.
Les compilateurs permettent en gnral de construire des programmes composs de
plusieurs
fichiers sources, d'ajouter un programme des units dj compiles ...

Structure dun programme C


#include <stdio.h>
void main (){
.
}
Un programme C est compos de fonctions et de
variables. Une fonction est elle-mme constitue d'une
squence d'instructions qui indiquent les oprations
effectuer alors que les variables mmorisent les valeurs
utilises au cours du traitement. Les instructions sont
elles-mmes constitues de mots-cls, de variables et
de fonctions.

Les noms donns aux variables et fonctions sont ce

quon appelle des identificateurs.


Ils doivent commencer par une lettre (majuscule ou
minuscule non accentue) mais peuvent contenir
outre des lettres, des chiffres et le caractre soulign _
dans le reste du symbole.
En langage C, les caractres majuscules et minuscules
ne sont pas quivalents, ainsi printf() et PRINTF()
dsignent deux fonctions diffrentes.

La premire ligne contient la directive #include suivi dun

nom de fichier, ici stdio.h, contenant les dclarations


ncessaires lutilisation de certaines fonctions.
Le compilateur dispose ainsi des informations ncessaires
pour vrifier si lappel de la fonction (en l'occurrence
printf ) est correct.
A la deuxime ligne la construction main() indique le
dbut de dfinition d'une fonction dnomme main.
Tout programme C comporte au minimum une fonction, la
fonction main, qui est la fonction principale par laquelle
commence lexcution du programme.

Linstruction printf
La fonction printf ne fait pas partie du langage C au

sens strict mais d'une bibliothque de fonctions stdio


(Standard Input/Output), qui sont toujours fournies
avec le langage,
cest ce qui explique la prsence de la directive
#include <stdio.h> en dbut de programme.
La fonction printf ne provoque pas de retour la ligne
aprs la chane de caractres quelle affiche.
Pour provoquer un retour la ligne il faut insrer
squence spciale \n dans la chane de caractres.
6

#include <stdio.h>
void main ()
{
printf("Un ");
printf("bout de ");
printf("texte.\n");
printf("Nouvelle ligne");
}
Affichera:
Un bout de texte.
Nouvelle ligne
7

Les squences d'chappement permettent de

reprsenter des caractres non imprimables ou


difficiles taper.
\t pour le caractre de tabulation (tab),
\b pour le caractre de retour en arrire (backspace),
\ pour le guillemet et \\ pour le caractre \ lui-mme.
Ainsi, si lon veut afficher un texte qui contient un
guillemet,
on ne peut pas simplement le mettre dans le texte, car
il sert galement indiquer la fin de la chane, on doit
utiliser la squence d'chappement correspondante:
printf(Le guillemet \ delimite les chaines);
8

Commentaires
/* Commentaire
qui stend sur
plusieurs lignes */
// Commentaire sur une ligne

Dclaration de variables
Type nom_var;
Type nom_var=valeur;
Type nom_var1,nom_var2;
Diffrents types :

10

constantes
#include <stdio.h>
#define pi 3.1415626
#define g 9.81
void main ()
{
double rayon, diametre;
rayon = 15.0;
diametre = 2*pi*rayon;
}
11

Affichage des variables

la fonction printf a besoin de savoir quel est le type de ces

variables
(entier, flottant, simple caractre, etc...) et quel format
d'affichage utiliser (combien afficher de chiffres aprs la virgule,
utiliser la notation dcimale habituelle ou la notation
scientifique en puissances de 10, complter les nombres trop
petits par des espaces ou des zros gauche, etc...) Ces deux
informations, type des variables afficher et format d'affichage
sont indiques au moyen de squences de caractres spciales,
appeles spcificateurs de format, insres dans la chane de
caractres passe comme premier paramtre la fonction printf.
Ainsi linstruction printf(%d,un_entier); affiche le contenu de
la variable un_entier sur lcran.
12

13

Lecture du clavier
scanf est un peu le
symtrique de printf et s'utilise de faon assez similaire. Ainsi, le

premier argument pass scanf doit tre une chane de format


indiquant le type des paramtres suivants.
#include <stdio.h>
void main ()
{
int un_nombre;
printf("Donnez un nombre: ");
scanf("%d", &un_nombre);
}

14

structure alternative
si (<expression logique>) alors
<bloc d'instructions 1>
sinon <bloc d'instructions 2>
finsi

15

structure alternative
Exemple 1
if (a > b)
max = a;
else
max = b;

Exemple 2

if (A==B)
printf("A est gal B\n");
else
printf("A est diffrent de B\n");

Exemple 3

if (A-B)
printf("A est diffrent de B\n");
else
printf("A est gal B\n");

16

structure alternative
Exemple 4
if (A > B)
{
AIDE = A;
A = C;
C = AIDE;
}
Else
{
AIDE = B;
B = C;
C = AIDE;
}

// SI A suprieur B Permuter A et C
// SI non permuter B et C

17

structure alternative
La suite d'instructions
if (A>B)

MAX=A;
else
MAX=B;
peut tre remplace par:
MAX = (A > B) ? A : B;

18

Structures rptitives

19

tant que en algorithmique


tant que (<expression logique>) faire

<bloc d'instructions>
Fintant

20

exemple
/* Afficher les nombres de 0 9 */ int I = 0;
while (I<10) {

printf("%i \n", I);


I++;
}
/* Afficher les nombres de 0 9 */
int I;
I = 0;

while (I<10)
printf("%i \n", I++);

/* Afficher les nombres de 1 10 */


I = 0;
while (I<10)
printf("%i \n", ++I);

21

do - while

22

do - while
do {
Instruction 1;
Instruction 2:
..
}while ( condition );
La structure do - while est semblable la structure while,

avec la diffrence suivante :

while value la condition avant d'excuter le bloc

d'instructions,
*do - while value la condition aprs avoir excut le bloc
d'instructions. Ainsi le bloc d'instructions est excut au
moins une fois.

23

Exemple
float N;

do
{
printf("Introduisez un nombre entre 1 et 10 :");
scanf("%f", &N);
}
while (N<1 || N>10);

int n, div;

printf("Entrez le nombre diviser : ");


scanf("%i", &n);
do
{
printf("Entrez le diviseur ( 0) : ");
scanf("%i", &div);
}
while (!div);
printf("%i / %i = %f\n", n, div, (float)n/div);
24

La structure for en C
for ( <init.> ; <cond. rptition> ; <compteur> )

<bloc d'instructions>

25

<expr1> est value une fois avant le passage de la boucle.

Elle est utilise pour initialiser les donnes de la boucle.


<expr2> est value avant chaque passage de la boucle.
Elle est utilise pour dcider si la boucle est rpte ou non.
<expr3> est value la fin de chaque passage de la boucle.
Elle est utilise pour rinitialiser les donnes de la boucle.

Exemple
int I;
for (I=0 ; I<=20 ; I++)
printf("Le carr de %d est %d \n", I, I*I);
int n, tot;

for (tot=0, n=1 ; n<101 ; n++) tot+=n;


printf("La somme des nombres de 1 100 est %d\n", tot);

26

/* notation utilisant for - plus compacte - */ /* prfre par les

experts en C */ int C, I;
C=getchar();
for (I=128 ; I>=1 ; C%=I, I/=2) printf("%i ", C/I);
/* d */ /* notation utilisant for - dconseiller - */ /* surcharge et
mauvais emploi de la structure */
int C, I;
for(C=getchar(),I=128; I>=1 ;printf("%i ",C/I),C%=i,i/=2) ;

27

Instruction switch
Elle permet dexcuter diffrentes instructions en fonction

dune expression qui pourra avoir plus de deux valeurs.


Une instruction de contrle comme if ne peut valuer que
deux valeurs dune expression: vrai ou faux.
Dans le cas o l'on souhaite excuter une action diffrente
selon les diffrentes valeurs possibles d'une variable cela
oblige utiliser une cascade de if...else

28

Exo : faite un programme qui permet de raliser les opration


mathmatiques (+,-,/,*) de valeurs saisie au clavier.

#include <stdio.h>
void main (){
char operation;
int r, a, b;
printf("Entrez un signe d'opration: ");
scanf("%c", &operation);
a=273; b=158; r=0;
if (operation=='+' || operation=='p') r = a + b;
else if (operation=='-' || operation=='m') r = a - b;
else if (operation=='*' || operation=='f') r = a * b;
else if (operation=='/' || operation=='d') r = a / b;
else printf("Non valable: ");

printf("%d %c %d = %d\n", a, operation, b, r);


}

29

#include <stdio.h>
void main (){
char operation; int r, a, b;
printf("Entrez un signe d'opration: "); scanf("%c",
&operation);
a=273; b=158; r=0;
switch (operation) {
case '+':case 'p':r = a + b;break;
case '-':case 'm':r = a - b;break;
case '*':case 'f':r = a * b;break;
case '/':case 'd':r = a / b;break;
default:printf("Non valable: ");}
printf("%d %c %d = %d\n", a, operation, b, r);
}
30

Les tableaux une


dimension

31

Les tableaux une dimension


Dfinitions
Un tableau (uni-dimensionnel) A est une variable

structure forme d'un nombre entier N de variables


simples du mme type, qui sont appeles les
composantes du tableau. Le nombre de composantes
N est alors la dimension du tableau.

En faisant le rapprochement avec les mathmatiques,

on dit encore que "A est un vecteur de dimension N"

32

Exemple
La dclaration
int JOURS[12]={31,28,31,30,31,30,31,31,30,31,30,31};

dfinit un tableau du type int de dimension 12. Les 12


composantes sont initialises par les valeurs
respectives 31, 28, 31, ... , 31.On peut accder la
premire composante du tableau par JOURS[0], la
deuxime composante par JOURS[1], . . . , la dernire
composante par JOURS[11].

33

Dclaration de tableaux en C

<TypeSimple> <NomTableau>[<Dimension>];
Les noms des tableaux sont des identificateurs qui

doivent correspondre aux restrictions dfinies sur les


variables.
Exemples
int A[25]; ou bien long A[25];
float B[100]; ou bien double B[100];
int C[10];
char D[30];
34

Mmorisation
En C, le nom d'un tableau est le reprsentant de

l'adresse du premier lment du tableau. Les


adresses des autres composantes sont calcules
(automatiquement) relativement cette adresse.
Exemple:
short A[5] = {1200, 2300, 3400, 4500, 5600};

35

Si un tableau est form de N composantes et si une

composante a besoin de M octets en mmoire, alors le


tableau occupera de N*M octets.

Exemple
En supposant qu'une variable du type long occupe 4

octets (c.--d: sizeof(long)=4), pour le tableau T


dclar par: long T[15];
C rservera N*M = 15*4 = 60 octets en mmoire.

36

Initialisation
int A[5] = {10, 20, 30, 40, 50};
float B[4] = {-1.05, 3.33, 87e-5, -12.3E4};
int C[10] = {1, 0, 0, 1, 1, 1, 0, 1, 0, 1};
Il faut que le nombre de valeurs dans la liste

corresponde la dimension du tableau. Si la liste ne


contient pas assez de valeurs pour toutes les
composantes, les composantes restantes sont
initialises par zro.

37

Rservation automatique
int A[] = {10, 20, 30, 40, 50};
==> rservation de 5*sizeof(int) octets (dans notre

cas: 10 octets)
float B[] = {-1.05, 3.33, 87e-5, -12.3E4};
==> rservation de 4*sizeof(float) octets (dans notre
cas: 16 octets)
int C[] = {1, 0, 0, 1, 1, 1, 0, 1, 0, 1};
==> rservation de 10*sizeof(int) octets (dans notre
cas: 20 octets)
38

Accs aux composantes


MAX = (A[0]>A[1]) ? A[0] : A[1]; A[4] *= 2;
int A[5]; dfini un tableau A avec cinq composantes,

auxquelles on peut accder par: A[0], A[1], ... , A[4]

Considrons un tableau T de dimension N:


l'accs au premier lment du tableau se fait par T[0]
l'accs au dernier lment du tableau se fait par T[N-1]

39

Affichage du contenu d'un tableau


main() {
int A[5];
int I; /* Compteur */
for (I=0; I<5; I++) printf("%d ", A[I]);
printf("\n");
}
Affectation
main() {
int A[5];
int I; /* Compteur */
for (I=0; I<5; I++) scanf("%d", &A[I]);
}
40

Exercices

Saisir 10 rels, les ranger dans un tableau. Calculer et

afficher la moyenne.

41

Les tableaux deux


dimensions

42

Dfinitions
En C, un tableau deux dimensions A est interprter

comme un tableau (uni-dimensionnel) de dimension L


(ligne)dont chaque composante est un tableau (unidimensionnel) de dimension C (colonne).

43

Dclaration
<TypeSimple>

<NomTabl>[<DimLigne>][<DimCol>];
Exemples
int A[10][10]; ou bien long A[10][10]; ou bien ...
float B[2][20]; ou bien double B[2][20]; ou bien ...
int C[3][3];
char D[15][40];

44

Mmorisation
le nom d'un tableau est le reprsentant de l'adresse

du premier lment du tableau (c.--d. l'adresse de la


premire ligne du tableau). Les composantes d'un
tableau deux dimensions sont stockes ligne par
ligne dans la mmoire.
Exemple: Mmorisation d'un tableau deux
dimensions
short A[3][2] = {{1, 2 }, {10, 20 }, {100, 200}};

45

Initialisation
int A[3][10] ={{ 0,10,20,30,40,50,60,70,80,90},

{10,11,12,13,14,15,16,17,18,19},
{ 1,12,23,34,45,56,67,78,89,90}};
float B[3][2] = {{-1.05, -1.10 },
{86e-5, 87e-5 },
{-12.5E4, -12.3E4}};
Lors de l'initialisation, les valeurs sont affectes ligne
par ligne en passant de gauche droite. Nous ne
devons pas ncessairement indiquer toutes les valeurs:
Les valeurs manquantes seront initialises par zro.
46

Access au composants ,
- les indices du tableau varient de 0 L-1,

respectivement de 0 C-1.
- la composante de la Nime ligne et Mime colonne
est note:
A[N-1][M-1]
A[3][2]=4;

47

Affichage du contenu d'un tableau deux dimensions


void main() {
int A[5][10];
int I,J;
/* Pour chaque ligne ... */
for (I=0; I<5; I++) { /* ... considrer chaque composante */
for (J=0; J<10; J++) printf("%d", A[I][J]);
/* Retour la ligne */
printf("\n");
}
}
48

Affectation avec des valeurs provenant de l'extrieur

void main() {
int A[5][10];
int I,J;
/* Pour chaque ligne ... */
for (I=0; I<5; I++)
/* ... considrer chaque composante */
for (J=0; J<10; J++) scanf("%d", &A[I][J]);
}

49

Exercices

Exo 1: Saisir une matrice dentiers 2.2, calculer et afficher son dterminant.

50

Les pointeurs

51

La notion d'adresse mmoire


La dfinition de variable int i = 5; peut tre interprte de 2 faons.
Point de vue conceptuel
i est un nom symbolique
qui dsigne une variable
qui prend des valeurs entires

Point de vue du compilateur C


i est une zone mmoire dimensionne
pour contenir des valeurs entires
le compilateur attribue une adresse
i en mmoire
1C02

adresse mmoire
52

Accs l'adresse mmoire d'une variable


l'adresse d'une variable est une donne en elle-mme
=> on peut manipuler les adresses mmoire
le langage C autorise :
-> l'accs l'adresse mmoire d'une variable
-> la manipulation des adresses mmoire l'aide d'oprateurs
-> la dclaration de variables dont les valeurs sont
des adresses mmoire (notion de pointeur)
l'oprateur "&"
si i est une variable entire, alors &i est une expression dnotant
l'adresse de i
&i

5
53

La notion de pointeur

Dclaration d'une variable pointeur sur un type


int * pi; /* pi est un pointeur sur entier */
char * pc; /* pc est un pointeur sur caractre */

-> on peut dclarer un pointeur sur un type quelconque


Affectation un pointeur
int i = 5; ==> pi = &i;

L'oprateur *
pi

*pi
5

variable pointeur

variable pointe

l'oprateur * permet d'accder


la variable pointe : il sert
drfrencer le pointeur
i * (&i)
54

Les oprations sur les pointeurs


le dfrencement "*"
l'affectation "="
les oprateurs de comparaison "==", "!="
les oprateurs "+" et "-" sur les adresses
la constante NULL est une valeur spciale du fichier stdio.h
-> un pointeur NULL ne pointe sur rien
les oprations d'allocation dynamique de la mmoire malloc et de
dsallocation free offertes par la librairie standard (fichier stdlib.h)

55

Un programme illustrant les pointeurs


main ()
{
int i = 5, j = 9;
int *p1, *p2; /* deux pointeurs sur entier */
p1 = &i; /* *p1 est la variable i */
p2 = p1; /* p2 dsigne la variable pointe par p1, c'est dire i */
*p1 = 9; /* la variable i est modifie */
if (p1 == p2) printf (" Ncessairement *p1 == *p2 ");
p2 = &j; /* *p2 est la variable j */
if (*p1 == *p2) printf (" Ne signifie pas p1 == p2 !!! ");
}

56

Pointeurs et typage
Typage d'un pointeur
- un pointeur est typ par le type de l'objet point
int * pi1, * pi2; /* pi1 et pi2 sont de type pointeur sur entier */
char * pc;
/* pc est de type pointeur sur caractre */
Affectation entre pointeurs
- l'affectation p1 = p2 est correcte si p1 et p2 sont de mme type
- pi1 = pi2; /* affectation correcte */
- pi1 = pc; /* affectation errone !!! */
57

Passage de paramtres par valeur


main

#include <stdio.h>
int carre ( int x )
{
return (x * x);
}
void main ()
{
int i = 3;
int car;
car = carre ( i );
printf ("%d", car);

avant
i
appel
de carre car
i
appel
de carre
car
i

fin de
l'exc.
car
de carre

Carre

copie
3

valeur

3
9

retour
valeur

}
58

Passage de paramtres par adresse


#include <stdio.h>
void raz ( int *ip )
{
*ip = 0;
}
void main ()
{
int i = 3;

main
avant
appel
de raz
appel
de raz

*ip
3

&i

raz ( &i );
printf ("%d", i);
}

fin de
l'exc.
de raz

Raz

copie
adresse

ip

59

Synthse sur le passage de paramtres


Passage par valeur
- la valeur du paramtre effectif est recopie dans le paramtre formel
- le paramtre effectif est la valeur d'une expression
- le paramtre effectif ne peut pas tre modifi par la fonction
Passage par adresse
- l'adresse du paramtre effectif est recopie dans le paramtre formel
- le paramtre effectif est une variable
- le paramtre effectif peut tre modifi par la fonction
- un tableau est toujours pass par adresse

60

Pointeurs et tableaux
Identificateur de tableau
le nom d'un tableau est une constante dont la valeur
est l'adresse du premier lment du tableau
0
1
int t[3];
t
ou &t[0]

Oprateurs "+" et "-" sur les pointeurs


int *p;
p = &t[1]; ==> p+1 pointe sur t[2] et p-1 pointe sur t[0]
Equivalence tableau / pointeur
int t[N]; ==> &t[k] equivaut t+k pour k dans 0..N-1
61

Tableau en paramtre de fonction


Prototype d'une fonction triTableau
void triTableau (int tab[], int n);

/* tab est une variable


de type pointeur sur entier */

Appel de la fonction triTableau


int t[3] = {4, 7, 2};
triTableau (t,3);

/* t est une constante de type pointeur sur entier */

Passage du tableau t en paramtre


l'appel de triTableau, l'argument tab est initialis avec &t[0]
==> un tableau est toujours pass par adresse
62

Pointeurs sur tableaux


int t1[3] = {4, 6, 1};
int *p1 = t1;
int t2[3] = {2, 7, 9};
int *p2 = t2;

p2 = p1;

*(p2+1) = - 5 ;
==> modification de t1[1] !!!

p1

t1

p2

t2

p1

t1

p2

t2

p1

-5

t1

p2

t2
63

Pointeurs et chanes de caractres


Constantes chanes de caractres
- "ada", "pascal" sont des constantes littrales
- une constante chane de caractres est implante comme
une squence de caractres, termine par le caractre '\0'
- sa valeur est l'adresse de son premier caractre
- son type est pointeur sur caractre
modifiable !!
Pointeurs sur chane de caractres
ch
non modifiable !!
char * ch = "ada";
a d a \0
Tableaux de caractres
char tc[] = {'a', 'd', 'a', '\0'};

modifiable !!
non modifiable !!
tc
a d a \0
64

Pointeur
sur
fonction
Dfinition
- le langage C autorise la dfinition de pointeurs sur fonction
- le nom d'une fonction est une constante de type pointeur sur fonction
dont la valeur est l'adresse de sa premire instruction
Passage d'une fonction en paramtre
float integrer (float (* f)(float) , float a, float b, int n);
float carre (float x) { return (x * x); }
main ()
{ float surface;
surface = integrer (carre, 0.0, 2.0, 100);
}
65

LES FONCTIONS

66

Dfinition d'une fonction


Dans la dfinition d'une fonction, nous indiquons:
- le nom de la fonction

- le type, le nombre et les noms des paramtres de la


fonction
- le type du rsultat fourni par la fonction
- les donnes locales la fonction
- les instructions excuter

<TypeRs> <NomFonct> (<TypePar1> <NomPar1>,

<TypePar2> <NomPar2>, ... ) { <dclarations locales>


<instructions> }
67

Exemple
La fonction MAX est du type int et elle a besoin de

deux paramtres du type int. Le rsultat de la fonction


MAX peut tre intgr dans d'autres expressions.
int MAX(int N1, int N2) {
if (N1>N2)
return N1;

else
return N2; }
68

69

70

Pour crer une fonction, il faut dfinir deux choses :


le prototype de la fonction et son code.
On peut dfinir uniquement que le prototype
une prdfinition : il faudra par la suite dcrire aussi

son code pour qu'elle devienne utilisable.


Le prototype contient l'ensemble des informations
lies aux types que la fonction manipule et retourne.
Une fonction peut utiliser des paramtres et rendre
une valeur : ces paramtres et cette valeur de retour ont
chacun un type qui globalement forme donc un
prototype. Le code de la fonction (forcment plac
entre accolades) suit directement la dfinition du
prototype.

71

Pour dfinir un prototype on procde de la faon

suivante :
on commence par fixer le type de retour (void s'il y en a
aucun),
puis on prcise le nom de la fonction
puis on donne une liste des types des paramtres
utiliss (cette liste est mise entre parenthses et les
lments sont spars par des virgules).
L'exemple suivant dfinit le prototype de la fonction
factorielle qui calcule la factorielle d'une valeur entire
(passe en paramtre) et retourne ce rsultat .
long fact(int); /* Pr-dclaration de la fonction fact
72
*/

Ensuite, il faut dfinir le code de cette fonction. La syntaxe reste

trs proche de la prcdente la diffrence que l'on rajoute de


l'information sur les noms des paramtres.
long fact(int n) {
long temp=1;
while(n>1) temp*=n--;
return temp;
}
Il n'est pas obligatoire de prdclarer la fonction. Cela ne se fait
que si la fonction doit tre utilise avant qu'elle ne soit dfinie.
En effet, sans cette phase de pr-dclaration, le compilateur ne
pourrait correctement vrifier la validit (au niveau des types) de
votre programme.

73

Variables locales
Les variables dclares dans un bloc d'instructions

sont uniquement visibles l'intrieur de ce bloc. On dit


que ce sont des variables locales ce bloc.
Exemple
La variable NOM est dfinie localement dans le bloc
extrieur de la fonction HELLO. Ainsi, aucune autre
fonction n'a accs la variable NOM:
void HELLO(void); {
char NOM[20];
printf("Introduisez votre nom : "); gets(NOM);
printf("Bonjour %s !\n", NOM); }
74

Exemple
Dans la fonction suivante,
int FONCTION(int A); {
int X; ...
X = 100; ...
while (A>10) {
double X;
...
X *= A;
... } }
la premire instruction X=100 se rapporte la variable du type
int dclare dans le bloc extrieur de la fonction; l'instruction
X*=A agit sur la variable du type double dclare dans la boucle
while. A l'intrieur de la boucle, il est impossible d'accder la
variable X du bloc extrieur.
75

Variables globales
Les variables dclares au dbut du fichier, l'extrieur

de toutes les fonctions sont disponibles toutes les


fonctions du programme. Ce sont alors des variables
globales.
En gnral, les variables globales sont dclares
immdiatement derrire les instructions #include au
dbut du programme.
Attention !
Les variables dclares au dbut de la fonction
principale main ne sont pas des variables globales,
mais elles sont locales main !

76

Exemple
La variable STATUS est dclare globalement pour pouvoir tre

utilise dans les procdures A et B.


#include <stdio.h>
int STATUS;
void A(...) {
...
if (STATUS>0)
STATUS--;
else
... ... }
void B(...) {
...
STATUS++;
... }

77

rcursivit
Une fonction est dite rcursive, ds lors ou elle se fait appel pour

calculer une sous partie de la valeur finale qu'elle retournera.


La rcursivit peut tre directe ou non, selon que la fonction se
fasse directement appel, ou bien qu'elle appelle une autre
fonction, qui durant son excution pourra finir par r-appeler la
fonction initiale.
Un exemple classique de fonction rcursive, est celui de la
factorielle : en voici le code.
/* La factorielle rcursive. */
long fact(int n) {
return (n<2?1:(long)n*fact(n-1));
}

78

Reprenons donc l'exemple de la factorielle. La factorielle de 6

vaut 6*5*4*3*2*1. Celle de 5 vaut 5*4*3*2*1. Donc, on peut dire


que la factorielle de 6 vaut 6 fois la factorielle de 5. Plus
gnralement, la factorielle de n vaut n*fact(n-1). Nous venons
de diviser le problme initial de la factorielle en un sous
problme de complexit (de difficult) moindre. Mais ce n'est
pas suffisant car cet algorithme ne finit pas : en effet on
aboutirait une tape fact(0)=0*fact(-1), ce qui aboutirait
traiter l'ensemble de tous les entiers ngatifs. Il faut donc dfinir
un cas d'arrt pour la rcursivit. Or cette fonction
mathmatique n'est pas dfinie sur les entiers ngatifs, mieux
encore elle doit retourner 1 pour les valeurs 0 et 1. Il en rsulte
donc le code prcdent.

79

80

81