Post on 02-Mar-2018
7/26/2019 LangageC FSB Imp
1/81
Pr. EDDAOUI AHMED
7/26/2019 LangageC FSB Imp
2/81
1- Edition du programme source, l'aide d'un diteur (traitement de textes). Lenom dufichier contient l'extension .C, exemple: EXI_1.C (menu edit ).2- Compilation du programme source, c'est dire cration des codes machinedestins aumicroprocesseur utilis. Le compilateur indique les erreurs de syntaxe mais ignore lesfonctions-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'unfichier binaire, non listable, appel fichier executable: EXI_1.EXE (commande build all).
4- x cu on u programme.Les compilateurs permettent en gnral de construire des programmes composs deplusieursfichiers sources, d'ajouter un programme des units dj compiles ...
2
7/26/2019 LangageC FSB Imp
3/81
Structure dun programme C#include
void main (){
.
}
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 sontelles-mmes constitues de mots-cls, de variables etdefonctions.
3
7/26/2019 LangageC FSB Imp
4/81
Les noms donns aux variables et fonctions sont cequon appelle des identificateurs.
Ils doivent commencer par une lettre (majuscule ou
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.
4
7/26/2019 LangageC FSB Imp
5/81
La premire ligne contient la directive #include suivi dunnom de fichier, ici stdio.h, contenant les dclarationsncessaires lutilisation de certaines fonctions.
Le compilateur dispose ainsi des informations ncessaires
pour vrifier si lappel de la fonction (en l'occurrenceprintf) est correct.
A la deuxime ligne la construction main() indique ledbut de dfinition d'unefonction dnomme main.
Tout programme C comporte au minimum une fonction, la
fonction main, qui est la fonction principale par laquellecommence lexcution du programme.
5
7/26/2019 LangageC FSB Imp
6/81
Linstruction printfLa fonction printf ne fait pas partie du langage C ausens strict mais d'une bibliothque de fonctions stdio(Standard Input/Output), qui sont toujours fournies
,cest ce qui explique la prsence de la directive#include 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 insrersquence spciale \n dans la chane de caractres.
6
7/26/2019 LangageC FSB Imp
7/81
#include void main ()
{
printf("Un ");
" "printf("texte.\n");
printf("Nouvelle ligne");
}
Affichera:Un bout de texte.
Nouvelle ligne
7
7/26/2019 LangageC FSB Imp
8/81
Les squences d'chappement permettent dereprsenter des caractres non imprimables oudifficiles taper.
\t pour le caractre de tabulation (tab),
\b pour le caractre de retour en arrire (backspace),
- .Ainsi, si lon veut afficher un texte qui contient unguillemet,
on ne peut pas simplement le mettre dans le texte, caril sert galement indiquer la fin de la chane, on doit
utiliser la squence d'chappement correspondante:printf(Le guillemet \ delimite les chaines);
8
7/26/2019 LangageC FSB Imp
9/81
Commentaires/* Commentaire
qui stend sur
plusieurs lignes */
// Commentaire sur une ligne
9
7/26/2019 LangageC FSB Imp
10/81
Dclaration de variablesType nom_var;
Type nom_var=valeur;
Type nom_var1,nom_var2;
Diffrents types :
10
7/26/2019 LangageC FSB Imp
11/81
constantes#include
#define pi 3.1415626
#define g 9.81
void main ()
{
double rayon, diametre;
rayon = 15.0;
diametre = 2*pi*rayon;
}
11
7/26/2019 LangageC FSB Imp
12/81
Affichage des variablesla fonction printf a besoin de savoir quel est le type de cesvariables
(entier, f lottant, simple caractre, etc...) et quel formatd'affichage utiliser (combien afficher de chiffres aprs la virgule,
utiliser la notation dcimale habituelle ou la notationscientifique en puissances de 10, complter les nombres troppetits par des espaces ou des zros gauche, etc...) Ces deuxinformations, type des variables afficher et format d'affichagesont 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 dela variable un_entier sur lcran.
12
7/26/2019 LangageC FSB Imp
13/81
13
7/26/2019 LangageC FSB Imp
14/81
Lecture du clavierscanf est un peu le
symtrique de printf et s'utilise de faon assez similaire. Ainsi, lepremier argument pass scanf doit tre une chane de formatindiquant le type des paramtres suivants.
#include
void main ()
{
int un_nombre;
printf("Donnez un nombre: ");scanf("%d", &un_nombre);
}
14
7/26/2019 LangageC FSB Imp
15/81
structure alternativesi () alors
finsi
15
7/26/2019 LangageC FSB Imp
16/81
structure alternativeExemple 1
if (a > b)max = a;
elsemax = b;
Exemple 2if A==B
printf("A est gal B\n");else
printf("A est diffrent de B\n");
Exemple 3if (A-B)
printf("A est diffrent de B\n");else
printf("A est gal B\n");
16
7/26/2019 LangageC FSB Imp
17/81
structure alternativeExemple 4if (A > B)
{
A DE = A; // S A suprieur B Permuter A et C
= ; non permuter etC = A DE;
}
Else
{
A DE = B;B = C;
C = A DE;
}
17
7/26/2019 LangageC FSB Imp
18/81
structure alternativeLa suite d'instructions
if (A>B)
MAX=A;
else
MAX=B;
peut tre remplace par:
MAX = (A > B) ? A : B;
18
7/26/2019 LangageC FSB Imp
19/81
tructures r p t t ves
19
7/26/2019 LangageC FSB Imp
20/81
tant que en algorithmique
tant que () faire
7/26/2019 LangageC FSB Imp
21/81
exemple
/* Afficher les nombres de 0 9 */ int = 0;while (
7/26/2019 LangageC FSB Imp
22/81
do - while
22
7/26/2019 LangageC FSB Imp
23/81
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 blocd'instructions,*do - while value la condition aprs avoir excut le bloc
d'instructions. Ainsi le bloc d'instructions est excut aumoins une fois.
23
7/26/2019 LangageC FSB Imp
24/81
Exemplefloat N;do{
printf(" ntroduisez un nombre entre 1 et 10 :");scanf("%f", &N);}while (N10);
nt n, v;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, (f loat)n/div);
24
7/26/2019 LangageC FSB Imp
25/81
La structure for en Cfor ( ; ; )
7/26/2019 LangageC FSB Imp
26/81
est value une fois avant le passage de la boucle.
Elle est utilise pour initialiser les donnes de la boucle. est value avant chaque passage de la boucle.Elle est utilise pour dcider si la boucle est rpte ou non. est value la fin de chaque passage de la boucle.Elle est utilise pour rinitialiser les donnes de la boucle.
Exempleint ;for ( =0 ;
7/26/2019 LangageC FSB Imp
27/81
/* notation utilisant for - plus compacte - */ /* prfre par lesexperts en C */ int C, ;
C=getchar();
for ( =128 ; >=1 ; C%= , /=2) printf("%i ", C/ );
* * * - - * *mauvais emploi de la structure */
int C, ;
for(C=getchar(), =128; >=1 ;printf("%i ",C/ ),C%=i,i/=2) ;
27
7/26/2019 LangageC FSB Imp
28/81
Instruction switchElle permet dexcuter diffrentes instructions en fonction
dune expression qui pourra avoir plus de deux valeurs.Une instruction de contrle comme if ne peut valuer quedeux valeurs dune expression: vrai ou faux.Dans le cas o l'on souhaite excuter une action diffrenteselon les diffrentes valeurs possibles d'une variable celaoblige utiliser une cascade de if...else
28
7/26/2019 LangageC FSB Imp
29/81
Exo : faite un programme qui permet de raliser les opration
mathmatiques (+,-,/,*) de valeurs saisie au clavier.
#include 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
7/26/2019 LangageC FSB Imp
30/81
#include
void main (){char operation; int r, a, b;printf("Entrez un signe d'opration: "); scanf("%c",&operation);a=273; b=158; r=0;
switch o erationcase '+':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
7/26/2019 LangageC FSB Imp
31/81
dimension
31
7/26/2019 LangageC FSB Imp
32/81
Les tableaux une dimension
Dfinitions
Un tableau (uni-dimensionnel) A est une variablestructure forme d'un nombre entier N de variables
,composantes du tableau. Le nombre de composantesN est alors la dimension du tableau.
En faisant le rapprochement avec les mathmatiques,on dit encore que "A est unvecteurde dimension N"
32
7/26/2019 LangageC FSB Imp
33/81
Exemple
La dclaration
int JOURS[12]={31,28,31,30,31,30,31,31,30,31,30,31};
n t un ta eau u type nt e mens on 12. es 12composantes sont initialises par les valeursrespectives 31, 28, 31, ... , 31.On peut accder lapremire composante du tableau par JOURS[0], ladeuxime composante par JOURS[1], . . . , la dernirecomposante par JOURS[11].
33
7/26/2019 LangageC FSB Imp
34/81
Dclaration de tableaux en C
[];
Les noms des tableaux sont des identificateurs qui
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
7/26/2019 LangageC FSB Imp
35/81
MmorisationEn C, le nom d'un tableau est le reprsentant del'adresse du premier lment du tableau. Lesadresses des autres composantes sont calcules
.Exemple:
short A[5] = {1200, 2300, 3400, 4500, 5600};
35
7/26/2019 LangageC FSB Imp
36/81
Si un tableau est form de N composantes et si unecomposante a besoin de M octets en mmoire, alors letableau occupera de N*M octets.
Exemple
En supposant qu'une variable du type long occupe 4octets (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
7/26/2019 LangageC FSB Imp
37/81
Initialisationint 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 listecorresponde la dimension du tableau. Si la liste necontient pas assez de valeurs pour toutes lescomposantes, les composantes restantes sont
initialises par zro.
37
7/26/2019 LangageC FSB Imp
38/81
Rservation automatiqueint A[] = {10, 20, 30, 40, 50};
==> rservation de 5*sizeof(int) octets (dans notrecas: 10 octets)
oat = -1.05, 3.33, 7e-5, -12.3 4 ;==> rservation de 4*sizeof(float) octets (dans notrecas: 16 octets)
int C[] = {1, 0, 0, 1, 1, 1, 0, 1, 0, 1};
==> rservation de 10*sizeof(int) octets (dans notrecas: 20 octets)
38
7/26/2019 LangageC FSB Imp
39/81
Accs aux composantesMAX = (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
7/26/2019 LangageC FSB Imp
40/81
Affichage du contenu d'un tableaumain() {int A[5];int ; /* Compteur */
" "= ,printf("\n");}Affectationmain() {int A[5];
int ; /* Compteur */for ( =0;
7/26/2019 LangageC FSB Imp
41/81
ExercicesSaisir 10 rels, les ranger dans un tableau. Calculer etafficher la moyenne.
41
7/26/2019 LangageC FSB Imp
42/81
Les tableaux deuxdimensions
42
7/26/2019 LangageC FSB Imp
43/81
DfinitionsEn C, un tableau deux dimensions A est interprtercomme un tableau (uni-dimensionnel) de dimension L(ligne)dont chaque composante est un tableau (uni-
.
43
7/26/2019 LangageC FSB Imp
44/81
Dclaration[][];
Exemples
nt 10 10 ; ou en ong 10 10 ; ou en ...float B[2][20]; ou bien double B[2][20]; ou bien ...int C[3][3];char D[15][40];
44
7/26/2019 LangageC FSB Imp
45/81
Mmorisationle nom d'un tableau est le reprsentant de l'adressedu premier lment du tableau (c.--d. l'adresse de lapremire ligne du tableau). Les composantes d'un
ligne dans la mmoire.
Exemple: Mmorisation d'un tableau deuxdimensions
short A[3][2] = {{1, 2 }, {10, 20 }, {100, 200}};
45
7/26/2019 LangageC FSB Imp
46/81
Initialisationint 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}};
- -. , . ,{86e-5, 87e-5 },
{-12.5E4, -12.3E4}};
Lors de l'initialisation, les valeurs sont affectes lignepar ligne en passant de gauche droite. Nous ne
devons pas ncessairement indiquer toutes les valeurs:Les valeurs manquantes seront initialises par zro.
46
7/26/2019 LangageC FSB Imp
47/81
Access au composants ,
- les indices du tableau varient de 0 L-1,respectivement de 0 C-1.
- a composante e a me gne et me co onneest note:
A[N-1][M-1]
A[3][2]=4;
47
7/26/2019 LangageC FSB Imp
48/81
Affichage du contenu d'un tableau deux dimensions
void main() {
int A[5][10];
int ,J;
* *for ( =0;
7/26/2019 LangageC FSB Imp
49/81
Affectation avec des valeurs provenant de l'extrieur
void main() {
int A[5][10];
int ,J;
/* Pour chaque ligne ... */
for ( =0;
7/26/2019 LangageC FSB Imp
50/81
ExercicesExo 1: Saisir une matrice dentiers 2.2, calculer et afficher son dterminant.
50
7/26/2019 LangageC FSB Imp
51/81
51
7/26/2019 LangageC FSB Imp
52/81
La notion d'adresse mmoire
La dfinition de variable int i = 5; peut tre interprte de 2 faons.
Point de vue conceptuel Point de vue du compilateur C
52
i est un nom symboliquequi dsigne une variablequi prend des valeurs entires
i 5
i est une zone mmoire dimensionnepour contenir des valeurs entires
le compilateur attribue une adresse i en mmoire
51C02
adresse mmoire
7/26/2019 LangageC FSB Imp
53/81
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
- ' '
53
-> la dclaration de variables dont les valeurs sontdes adresses mmoire (notion de pointeur)
l'oprateur "&"si i est une variable entire, alors &i est une expression dnotant
l'adresse de i
5&i
7/26/2019 LangageC FSB Imp
54/81
La notion de pointeur Dclaration d'une variable pointeur sur un type
Affectation un pointeur
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
54
L'oprateur *
pi *pi
variable pointeur variable pointe
l'oprateur * permet d'accder la variable pointe : il sert drfrencer le pointeur
5
int i = 5; ==> pi = &i;
i * (&i)
7/26/2019 LangageC FSB Imp
55/81
Les oprations sur les pointeurs
le dfrencement "*"
l'affectation "="
les oprateurs de comparaison "==", "!="
55
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 dedsallocation free offertes par la librairie standard (fichier stdlib.h
7/26/2019 LangageC FSB Imp
56/81
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 */
56
*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 !!! ");}
7/26/2019 LangageC FSB Imp
57/81
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 */
* * *
57
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 !!! */
7/26/2019 LangageC FSB Imp
58/81
Passage de paramtres par valeur
#include
int carre ( ){
return (x * x);}
main Carre
i
car
3
copie
avantappelde carre
int x
58
void main (){
int i = 3;int car;car = carre ( );
printf ("%d", car);}
car
i
valeur
retour
valeur
appelde carre
fin de
l'exc.de carre
3 3
3
9 9car
x
i
7/26/2019 LangageC FSB Imp
59/81
Passage de paramtres par adresse
#include
void raz ( ){
*ip = 0;}
main Raz
i 3avantappelde raz
int *ip
*ip
59
void main (){
int i = 3;
raz ( );
printf ("%d", i);}
i
copie
appelde raz
fin del'exc.de raz
3
&i
&i ipadresse
0
7/26/2019 LangageC FSB Imp
60/81
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
60
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
7/26/2019 LangageC FSB Imp
61/81
Pointeurs et tableaux Identificateur de tableaule nom d'un tableau est une constante dont la valeurest l'adresse du premier lment du tableau
0 1 2
ou &t[0]tint t[3];
61
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
7/26/2019 LangageC FSB Imp
62/81
Tableau en paramtre de fonction
Prototype d'une fonction triTableau
void triTableau (int tab[], int n);
Appel de la fonction triTableau
/* tab est une variablede type pointeur sur entier */
62
int t[3] = {4, 7, 2};triTableau (t,3);
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
/* t est une constante de type pointeur sur entier */
7/26/2019 LangageC FSB Imp
63/81
Pointeurs sur tableauxint t1[3] = {4, 6, 1};int *p1 = t1;
int t2[3] = {2, 7, 9};int *p2 = t2;
4 6 1
2 7 9
p1
p2
0 1 2t1
t2
63
p2 = p1;4 66 1
2 7 9
p1
p2
0 1 2
4 1
2 7 9
p1
p2
0 1 2
-- 55*(p2+1) = - 5 ;
==> modification de t1[1] !!!
t1
t2
t2
t1
7/26/2019 LangageC FSB Imp
64/81
Pointeurs et chanes de caractres
Constantes chanes de caractres- "ada", "pascal" sont des constantes littrales- une constante chane de caractres est implante commeune squence de caractres, termine par le caractre '\0'
- sa valeur est l'adresse de son premier caractre- son t e est ointeur sur caractre
64
Pointeurs sur chane de caractres
char * ch = "ada";
Tableaux de caractres
char tc[] = {'a', 'd', 'a', '\0'};
a ad \0
non modifiable !!non modifiable !!ch
a ad \0
modifiable !!modifiable !!
tcnon modifiable !!non modifiable !!
modifiable !!modifiable !!
7/26/2019 LangageC FSB Imp
65/81
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 fondont la valeur est l'adresse de sa premire instruction
Passage d'une fonction en paramtre
65
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);}
7/26/2019 LangageC FSB Imp
66/81
LES FONCTIONS
66
7/26/2019 LangageC FSB Imp
67/81
Dfinition d'une fonctionDans la dfinition d'une fonction, nous indiquons:
- le nom de la fonction- le type, le nombre et les noms des paramtres de la
- le type du rsultat fourni par la fonction- les donnes locales la fonction- les instructions excuter
67
( , , ... ) { }
7/26/2019 LangageC FSB Imp
68/81
Exemple
La fonction MAX est du type int et elle a besoin dedeux paramtres du type int. Le rsultat de la fonction
' .int MAX(int N1, int N2) {
if (N1>N2)
return N1;
elsereturn N2; }
68
7/26/2019 LangageC FSB Imp
69/81
69
7/26/2019 LangageC FSB Imp
70/81
70
7/26/2019 LangageC FSB Imp
71/81
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 aussison code pour qu'elle devienne utilisable.
e prototype cont ent ensem e es n ormat onslies aux types que la fonction manipule et retourne.
Une fonction peut utiliser des paramtres et rendreune valeur : ces paramtres et cette valeur de retour ontchacun un type qui globalement forme donc unprototype. Le code de la fonction (forcment placentre accolades) suit directement la dfinition duprototype.
71
7/26/2019 LangageC FSB Imp
72/81
Pour dfinir un prototype on procde de la faonsuivante :
on commence par fixer le type de retour (void s'il y en aaucun),
uis on rcise le nom de la fonction
puis on donne une liste des types des paramtresutiliss (cette liste est mise entre parenthses et leslments 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
7/26/2019 LangageC FSB Imp
73/81
Ensuite, il faut dfinir le code de cette fonction. La syntaxe reste
trs proche de la prcdente la diffrence que l'on rajoute del'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 faitque 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) devotre programme.
73
7/26/2019 LangageC FSB Imp
74/81
Variables localesLes variables dclares dans un bloc d'instructionssont uniquement visibles l'intrieur de ce bloc. On ditque ce sont desvariables locales ce bloc.
Exemple
extrieur de la fonction HELLO. Ainsi, aucune autrefonction n'a accs la variable NOM:
void HELLO(void); {
char NOM[20];
printf(" ntroduisez votre nom : "); gets(NOM);printf("Bonjour %s !\n", NOM); }
74
7/26/2019 LangageC FSB Imp
75/81
Exemple
Dans la fonction suivante,int FONCT ON(int A); {int X; ...X = 100; ...while (A>10) {
...X *= A;... } }la premire instruction X=100 se rapporte la variable du typeint dclare dans le bloc extrieur de la fonction; l'instructionX*=A agit sur la variable du type double dclare dans la bouclewhile. A l'intrieur de la boucle, il est impossible d'accder lavariable X du bloc extrieur.
75
7/26/2019 LangageC FSB Imp
76/81
Variables globalesLes variables dclares au dbut du fichier, l'extrieurde toutes les fonctions sont disponibles toutes les
fonctions du programme. Ce sont alors desvariables.
En gnral, les variables globales sont dclaresimmdiatement derrire les instructions #include audbut du programme.
Attention !
Les variables dclares au dbut de la fonctionprincipale main ne sont pas des variables globales,mais elles sont locales main !
76
7/26/2019 LangageC FSB Imp
77/81
ExempleLa variable STATUS est dclare globalement pour pouvoir treutilise dans les procdures A et B.#include int STATUS;void A(...) {...
if (STATUS>0)STATUS--;else... ... }void B(...) {...STATUS++;... }
77
7/26/2019 LangageC FSB Imp
78/81
rcursivitUne fonction est dite rcursive, ds lors ou elle se fait appel pourcalculer une sous partie de la valeur finale qu'elle retournera.La rcursivit peut tre directe ou non, selon que la fonction sefasse directement appel, ou bien qu'elle appelle une autrefonction, qui durant son excution pourra finir par r-appeler la
onct on n t a e.Un exemple classique de fonction rcursive, est celui de lafactorielle : en voici le code.
/* La factorielle rcursive. */
long fact(int n) {
return (n
7/26/2019 LangageC FSB Imp
79/81
Reprenons donc l'exemple de la factorielle. La factorielle de 6vaut 6*5*4*3*2*1. Celle de 5 vaut 5*4*3*2*1. Donc, on peut direque la factorielle de 6 vaut 6 fois la factorielle de 5. Plusgnralement, la factorielle de n vaut n*fact(n-1). Nous venonsde diviser le problme initial de la factorielle en un sousproblme de complexit (de difficult) moindre. Mais ce n'est
pas suffisant car cet algorithme ne finit pas : en effet onaboutirait une tape fact(0)=0*fact(-1), ce qui aboutirait traiter l'ensemble de tous les entiers ngatifs. Il faut donc dfinirun cas d'arrt pour la rcursivit. Or cette fonctionmathmatique n'est pas dfinie sur les entiers ngatifs, mieuxencore elle doit retourner 1 pour les valeurs 0 et 1. Il en rsultedonc le code prcdent.
79
7/26/2019 LangageC FSB Imp
80/81
80
7/26/2019 LangageC FSB Imp
81/81