Documente Academic
Documente Profesional
Documente Cultură
Programmation Structure
Langage C
Laurence.Bergougnoux@univ-amu.fr
http://iusti.polytech.univ-mrs.fr/~bergougnoux/
UE :
Mathmatiques & Informatique
En GC UE 52
ce sera le seul cours du cursus ...
En ME UE 53
+ UE 63 Calcul scientifique et
langage Fortran avec Jacques Massoni au
semestre 6
Commun avec MT et GII Rmy Bulot
Progr. struct. - C
Introduction
L'quipe enseignante
Laurence BERGOUGNOUX
Franois GUILLARD
Christian MARIANI
Fabien PETITPAS
Jrme VICENTE
Bureau 208
Bureau 242
Bureau 321
Bureau 319B
Bureau 326
Prenom.Nom@polytech.univ-mrs.fr
ou
Prenom.Nom@univ-amu.fr
Progr. struct. - C
Introduction
Organisation de l'enseignement
ME
GC
14h cours
14h TD
20h TP
14h cours
20h TD
20h TP
La semaine 51
Maxime Alarcon
&
Yassine El Khatari
Organisation de l'enseignement
Transparents de cours en fichier pdf sur :
- le Bureau virtuel
- http://iusti.polytech.univ-mrs.fr/~bergougnoux/enseignement.htm
1er TP sur machine la semaine prochaine :
Accs avec votre n tudiant et code INE
Si vous n'tes pas encore inscrit :
- en ME prendre contact avec M. Daurelle (bur. 326)
- en GC avec M. Court ou M. Thuilliez (bur. 237)
Progr. struct. - C
Introduction
ME
ME
ME
ME
Progr. struct. - C
Introduction
Plan du cours
1.
2.
3.
4.
5.
6.
7.
8.
9.
Introduction
Les bases du langage C
Les pointeurs et les tableaux
Les fonctions
Les types utilisateurs
La gestion de fichiers
La programmation modulaire
L'allocation dynamique de mmoire
Les listes chanes
Progr. struct. - C
Introduction
Progr. struct. - C
Introduction
Quelques gnralits
en programmation
Progr. struct. - C
Quelques gnralits
10
ingrdients
Progr. struct. - C
Algorithme
Recette de cuisine
Quelques gnralits
rsultat
(sorties)
plat
11
1)
2)
3)
4)
5)
6)
8)
Quelques gnralits
12
Langages de programmation :
Pourquoi faire?
Pour crire avec des mots et signes
comprhensibles par une intelligence humaine
plutt que 00111000111
Afin d'organiser, de structurer, le droulement
d'un programme de manire claire et vrifiable.
Progr. struct. - C
Quelques gnralits
13
Quelques Langages
Par ordre chronologique :
Assembleur 68000, 8086
Fortran, Cobol
Basic, Pascal, Langage C
Langages Objets : C++, Java , C#,
http://www.scriptol.fr/programmation/langages-populaires.php
Progr. struct. - C
Quelques gnralits
14
Programme excutable
Suite dinstructions binaires que le processeur
doit effectuer :
Spcifiques un type de processeur.
Stockes sur une mmoire de masse
(disque dur, DVD, clef usb).
Charges en mmoire centrale avant
lexcution du programme.
Progr. struct. - C
Quelques gnralits
15
Fichier Compilation
Source
Progr. struct. - C
Fichier
Objet
diteur
de liens
Quelques gnralits
Fichier
Excutable
16
L'excution du programme
Au lancement du programme, le systme
dexploitation :
Transfre le programme de la mmoire de
masse en mmoire centrale,
Rserve de la place pour les donnes du
programme,
Dmarre lexcution du programme,
Reprend la main quand le programme sachve.
Progr. struct. - C
Quelques gnralits
17
1er programme en C
Progr. struct. - C
1er programme
18
Le langage C
Cre par K. Thompson, D. Ritchie et B. Kernighan
pour dvelopper UNIX.
Cest un langage structur et portable.
Cest le langage le plus utilis par les professionnels
du logiciel.
Cest la base du C++ qui permet la programmation
oriente objet.
Progr. struct. - C
1er programme
19
LabWindowsTM/CVI
Environnement de Dveloppement Intgr (IDE)
sous Windows, avec 1 compilateur C-ANSI.
Programmation vnementielle
et interface graphique.
Logiciels de mesure et contrle
Progr. struct. - C
1er programme
20
Premier Programme
en langage C
sous LabWindows/CVI
source_1.c
Progr. struct. - C
1er programme
21
Le fichier Source en C
source_1.c
#include <stdio.h> // fichier en-tte ou header o
se trouve la dfinition de printf()
int main()
//Fonction ou bloc principal
{
printf("Bienvenue a POLYTECH Marseille \n");
return(0);
}
Progr. struct. - C
1er programme
22
Les
Les
Les
Les
Prog. Struct. - C
types de donnes
variables
oprateurs
structures conditionnelles
Les bases
23
Prog. Struct. - C
24
Prog. Struct. - C
25
Signification
Taille (octet)
Plage de valeurs
char
Caractre
-128 127
unsigned char
Caractre non
sign
0 255
short int
Entier court
unsigned short
int
0 65 535
int
Entier
unsigned int
long int
Entier long
unsigned long
int
Prog. Struct. - C
26
Prog. Struct. - C
Signification
Taille (octet)
Flottant double
long
Plage de valeurs
3,4 x 10-38 3,4 x 1038
10
27
Codage binaire
des nombres entiers
1970=1024 + 512 + 256 + 128 + 32 + 16 + 2
= 210
+ 29 + 28 + 27 + 25 + 24 + 21
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
00 00 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1110110010
= 1,100010111 x 27
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 1 00 0 0 11 0 1 0 0 0 1 0 1 1 1 0 0 0 0 0000000000
exposant
mantisse
Prog. Struct. - C
28
Les pointeurs
Type
*pointeur
Signification
adresse
Prog. Struct. - C
Taille (octet)
Plage de valeurs
2 (sur 16 bits)
0x0000 0xFFFF
4 (sur 32 bits)
0x00000000 0xFFFFFFFF
29
Leur nom :
Les variables
default
float
register struct
volatile
break
do
for
return
switch
while
case
double
goto
short
typedef
char
else
if
signed
union
const
enum
int
sizeof
unsigned
long
static
void
continue extern
Prog. Struct. - C
2. Les variables
30
incorrect
Raison
Variable
Nom de Variable
Nom_De_Variable
123Nom_De_Variable
nom_de_variable
toto@mailcity.com
nom_de_variable_123
Nom-de-variable
_707
goto
MAJUSCULE
Prog. Struct. - C
commence par un
chiffre
caractre spcial @
signe - interdit
nom rserv
minuscule
2. Les variables
31
La dclaration de variables
type nom_de_la_variable ;
exemple :
#include <stdio.h>
int main()
{
int a;
//dclaration
char var_car = 'f'; // + initialisation
char *pointe_ici;
// le pointeur
a = 127;
//affectation
pointe_ici = &var_car;
printf("la valeur de a = %i",a);
//affichage
printf("\n et celle de var_car %c", var_car);
}
Prog. Struct. - C
2. Les variables
32
Les constantes
#include <stdio.h>
//Directive du pr processeur
#define PI 3.14159
int main()
{ float a;
//Dclaration d'une constante
const int douze=12;
a = douze*PI;
}
Prog. Struct. - C
2. Les variables
33
%d
float
%f
double %lf
2. Les variables
34
Les oprateurs du C
Prog. Struct. - C
3. Les oprateurs
35
Exemple
Si
Si
int x=10;
float x=10.0;
d'addition
x=x+3;
13
13.0
de soustraction
x=x-3;
7.0
de multiplication
x=x*3;
30
30.0
de division
x=x/3;
3.3333333
modulo
x=x%3;
x=3;
Met la valeur 3
dans la variable x
d'affectation
reste de la division
=
Prog. Struct. - C
3. Les oprateurs
36
+=
-=
*=
/=
x=a=b=3;
Prog. Struct. - C
x= (a= (b=3));
3. Les oprateurs
37
//pr incrmentation
3. Les oprateurs
38
==
galit
x==3
<
infriorit stricte
x<3
<=
infriorit
x<=3
>
supriorit
stricte
x>3
>=
supriorit
x>=3
!=
diffrence
x!=3
Prog. Struct. - C
3. Les oprateurs
39
&
ET
OU
OU exclusif
Prog. Struct. - C
Syntaxe
9 & 12
Rsultat
1001
& 1100
1000
9 | 12
1001
| 1100
1101
13
9 ^ 12
1001
^ 1100
0101
3. Les oprateurs
40
Syntaxe
Rsultat
6 << 1
<<
00000110 << 1
= 00001100
Dcalage gauche
12
x2
6 >> 1
>>
00000110 >> 1
= 00000011
/2
-6 >>1 = -3
3. Les oprateurs
11111010 << 1
= 11110100
11111010 >> 1
= 11111101
41
Les priorits
+++
()
-*
+
<<
<
==
&
^
|
&&
?:
=
[]
++ ! ~ / %
>>
<= >= >
!=
||
+=
-=
etc.
--Prog. Struct. - C
3. Les oprateurs
42
4 types d'instructions
Nulle ;
Expression a=b+1;
Prdfinie condition ou boucle if ()
Bloc { }
Prog. Struct. - C
43
si (vrai) alors
sinon ...
Prog. Struct. - C
44
L'instruction if
syntaxe :
if(condition)
{
instructions;
}
FAUX
condition
VRAI
instructions
Prog. Struct. - C
45
L'instruction if(condition)else
syntaxe :
if(condition)
{
instructions;
}
else
{
instructions;
}
Prog. Struct. - C
condition
VRAI
FAUX
instructions
instructions
46
L'instruction ifelse
Exemple :
if (var1==0)
//si var1 vaut 0
{
//alors on affiche
printf("La variable est nulle\n");
}
else
//sinon c'est faux
{
if (var1 > 0)
{ printf("Elle est positive\n");
else
{ printf("Elle est ngative");
}
Prog. Struct. - C
}
}
47
Prog. Struct. - C
48
L'oprateur conditionnel
(condition) ? instruction_vrai : instruct_faux
exemple :
x = 3;
y = 2;
max_xy = ((x>=y) ? x : y);
=
1
Prog. Struct. - C
max_xy = x;
49
||
&&
!
OU logique
ET logique
NON logique
Prog. Struct. - C
Syntaxe
((cond1)||(cond2))
((cond1)&&(cond2))
a b
a||b
a&&b
!a
0 0
0 1
1 0
1 1
(!condition)
3. Les oprateurs
50
?
==const1
V
instr.
?
==const2
V
instr.
?
!=const1,2
V
instr.
51
exemple :
switch
char choix;
printf("Taper 1 ou 2");
scanf("%c",&choix);
switch(choix)
{
case '1':
printf("vous avez tape 1\n");
break;
case '2':
printf("vous avez tape 2\n");
break;
default :
printf("je vous ai dit 1 ou 2 pas %c\n",choix);
break;
}
Prog. Struct. - C
52
Prog. Struct. - C
53
L'instruction while
tant que (condition vraie)
syntaxe :
condition
while(condition)
{
instructions;
}
Prog. Struct. - C
FAUX
VRAI
instructions
54
L'instruction dowhile
faire tant que (condition vraie)
syntaxe :
do
{
instructions
instructions;
}while(condition);
Prog. Struct. - C
VRAI
condition
FAUX
55
L'instruction for()
initialisation du
compteur de boucle
syntaxe :
for( init;condition;incrment)
{
instructions;
condition
}
VRAI
exemple :
for(i=0;i<100;i++)
{
printf("%d\n",i);
}
Prog. Struct. - C
FAUX
instructions
modification du
compteur de boucle
56
exemple :
for( ; ; )
{
printf("sans fin\n");
}
Prog. Struct. - C
V
Affichage
"sans fin"
;
57
x=1
exemple :
x=1;
while(x<=10)
{
a=1/(x-7);
printf("%f",a);
x++;
}
?
x <= 10
V
a=1/(x-7)
affichage a
x=x+1
58
exemple :
x=1;
while(x<=10)
{
if (x==7)
{ printf("division par 0");
x++;
continue;
}
a=1/(x-7);
printf("%f",a);
x++;
}
Prog. Struct. - C
?
x <= 10
V
?
x ==7
V
affiche /0
x=x+1
a=1/(x-7)
affichage de a
x=x+1
59
x=1;
while(x<=10)
{
a = x-7;
printf("%f", 1/a);
x++;
}
Que va-t-il se passer quand
x=7 ?
Prog. Struct. - C
x=1
F
?
x <=10
V
a=x-7
affichage 1/a
x=x+1
60
?
x <=10
V
a=x-7
?
a == 0
F
V
affiche /0
affichage 1/a
x=x+1
61
return(0);
}
Prog. Struct. - C
62
Exemples
Rsolution numrique d'une quation du second
degr
Programme mystre
Affectation et rcurrence
Rsolution de ax2+bx+c=0 :
Organisation du programme
Initialisation :
Acquisition au clavier
des valeurs de a,b,c
Algorithme de calcul
Prsentation des
rsultats sur lcran
Prog. Struct. C
64
Prog. Struct. C
65
Rsolution de ax2+bx+c=0 :
Organigramme
Acquisition de a, b, c
VRAI
a= = 0
FAUX
Calcul de D
Affichage C
pas 2 degr
D<0
D==0
V
Pas de racines
Racine
double
2 Racines
distinctes
fin
Prog. Struct. C
66
Le squelette
#include <stdio.h>
#include <math.h>
Directives du pr processeur
int main()
{
/*Dclaration de variables a,b,c,delta,x1,x2*/
/*Entre des valeurs pour a, b, c*/
/*Test du contenu de a*/
//si a 0
/*Calcul de delta */
/*Test sur delta*/
//si delta <0 -> affichage pas de racines
//si delta =0 -> affichage racine double
//si delta >0 -> affichage 2 racines relles
}
Prog. Struct. C
67
II
Fonction main ()
int main()
{
/*Dclaration de variables */
float a,b,c;
float delta;
float x1,x2;
/*Fin de la dclaration des variables*/
Prog. Struct. C
68
Prog. Struct. C
69
delta */
delta = b*b-4*a*c;
/*Test sur delta*/
if (delta < 0)
printf("\nPas de racines");
else
{ /*ouverture du bloc d'instruction delta >=0*/
Prog. Struct. C
70
Fin du main ()
if (delta == 0) /*Test delta nul*/
{
x1 = -b/(2*a);
printf ("\nRacine double :%f",x1);
}
else
/*Bloc d'intruction delta positif*/
{
x1=(-b-sqrt(delta))/a/2;
x2=(-b+sqrt(delta))/a/2;
printf("x1=%f x2=%f \n",x1,x2);
}/*fin delta>0*/
}/*Fin delta <0*/
}/*Fin a != 0*/
return 0;
}/*Fin programme*/
secondeg.c
Prog. Struct. C
71
Algorithme
mystrieux
Soit a, b, r rels ;
lire(a) ;
lire(b) ;
r <- 0 ;
tant-que (b 0)
si (b est pair)
b <- b/2 ;
a <- 2*a ;
sinon
b <- b-1 ;
r <- r+a ;
fin si
fin tant-que
crire(r) ;
#include <stdio.h>
int main()
{
float a, b,r;
Prog. Struct. C
72
Rcurrence
Mathmatiquement une relation de
rcurrence, c'est :
xi+1 = f(xi)
avec x0 donn
73
Affectation
x = expression(x);
x x + 3;
Le nouveau contenu de x (aprs l'excution de
l'instruction) est le rsultat de l'valuation de
l'expression avec le contenu actuel de x.
Prog. Struct. C
74
Exemple : Calculer
Sn =
( 1)
i= 1
i+ 1
Sk = Sk 1 +
Avec
S1 = 1
( 1)
k+ 1
k
recurrence.c
Prog. Struct. C
75
Prog. struct. : C
76
Prog. struct. : C
77
Prog. struct. : C
78
Prog. struct. : C
79
http://www.siteduzero.com/
Prog. struct. : C
80
Ladressage indirect
int i,*pAdi;
i=10;
pAdi =
Prog. struct. : C
contenant
10
Adresse de i
&i;
*pAdi = 12;
contenu
contenu
pAdi
contenant
81
Ladressage indirect
*pAdi
pAdi = &i;
= 12;
Prog. struct. : C
contenant
12
Adresse de i
int i,*pAdi;
i=10;
contenu
pAdi
contenu
contenant
82
& et *
int i;
int *padi;
83
Prog. struct. : C
84
Exemple :
contenant contenu
int i = 80;
double xx=3.1415;
double *pAd;
pAd = &xx;
80
3.1415
100
60
64
80
3.1415
100
pAd = pAd+i;
/*pAd +i*sizeof(double)
c.a.d. 64 + 80*8 octets*/
Prog. struct. : C
60
64
64
60
64
80
3.1415
100
704
nom
i
xx
pAd
i
xx
pAd
i
xx
pAd
85
Les Tableaux
Prog. struct. : C
86
Prog. struct. : C
87
Prog. struct. : C
88
Exemples
double Toto [100];
//Toto est un tableau de 100 doubles
Prog. struct. : C
89
Tab[1]
Tab[2]
Tab+i
Tab[N-1]
&Tab[i]
tableau
pointeur
*(Tab+i)
Tab [i]
printf("%d",*Tab); ou printf("%d",Tab[0]);
scanf("%d",Tab+2); ou scanf("%d",&Tab[2]);
Prog. struct. : C
90
Prog. struct. : C
91
Exemple de Tableau 1D :
Les chanes de caractres (string)
Dclaration et initialisation :
char chaine[10];
char source[]="Ma premier chaine de char";
char lettre[]={'t','a','r','a','t','a','t','a',0};
Format :
printf("\nLe contenu de source est %s",source);
scanf("%s",chaine); ou gets(chaine);
Pas besoin de & car le contenu de chaine est une adresse
Prog. struct. : C
92
Chanes de caractres
char *pfin;
char cBonjour [] = "Bonjour";
printf("%s\n", cBonjour);
pfin = cBonjour + 3;
printf("%s\n", pfin);
pfin = cBonjour+strlen(cBonjour);
do
{
printf ("%c",*--pfin);
}while (pfin != cBonjour);
Prog. struct. : C
93
Pour comprendre
'B'
cBonjour
'o'
'n'
'j'
pfin
'o'
'r'
cBonjour+3
printf("%s\n", cBonjour);
pfin = cBonjour + 3;
printf("%s\n", pfin);
Prog. struct. : C
'u'
Bonjour
jour
94
Pour comprendre
'B'
'o'
'n'
'j'
'o'
'u'
'r'
pfin
cBonjour
strlen(cBonjour) renvoie 7
Adresse pointe par pfin
Prog. struct. : C
95
Chane de Caractres
Exemple
!OG
Prog. struct. : C
96
Tableau de Tableaux
Dclaration :
Type_donne Indent_Tab_Tab[Nlign][Ncol];
Nlign et Ncol sont des constantes entires littrales
ou symbolique.
Exemple :
float mat[3][3];
int trice[3][3]={{1,1,1}, {1,1,1}, {1,1,1}};
printf("%d %d %d", trice[0][0],trice[1][1],trice[2][2]);
scanf("%f",&mat[0][0]);
ou
scanf("%f",mat[0]);
Prog. Struct. - C
97
Ligne1
...
NCol
NCol
NCol
NLign x NCol
Prog. Struct. - C
98
99
Les fonctions
1.
2.
3.
4.
Prog. Struct. - C
Introduction
Mise en uvre
Passage par valeur et par adresse
Pour aller plus loin
IV - Les Fonctions
100
Directives au pr-processeur
La fonction principale
Il ne peut y en avoir qu'une !!
Prog. Struct. - C
IV - Les Fonctions
101
Introduction
Une fonction vue par un dbutant
C'est un morceau de programme qui sert faire
quelque chose de prcis.
Entre
Fonction
=
brique
Sortie
IV - Les Fonctions
102
Introduction
Une fonction vue du processeur
C'est un code excutable termin par une
instruction de retour situ une certaine adresse
en mmoire.
l'appel de la fonction, le processeur excute le
code partir de l'adresse de la fonction et
l'instruction retour le fait revenir l'instruction
suivant l'appel.
Des donnes peuvent tre transmises la fonction
en paramtres. Lors du retour, une valeur peut tre
rcupre/renvoye.
Prog. Struct. - C
IV - Les Fonctions
103
Instruction i ;
Appel MaFonction() ;
Adresse
Instruction i+2 ;
Prog. Struct. - C
IV - Les Fonctions
104
X = sqrt(4) ;
Instruction i+2 ;
4
sqrt(argument) if (argument>0)
Le calcul de sqrt(4)
return(2)
Prog. Struct. - C
IV - Les Fonctions
Retour de 2
105
IV - Les Fonctions
utilise
des
acclrer le
106
Instruction i;
MaFonction(10,x+y,z);
Instruction_suiv;
Passage de
x+y paramtres
10
MaFonction {
Instructions
De MaFonction
return;
}
Prog. Struct. - C
IV - Les Fonctions
107
/* 3) L'appel */
}
/* 1) La dfinition */
Prog. Struct. - C
IV - Les Fonctions
108
1) La Dfinition
Localisation :
#include <stdio.h>
int main()
{
Exemples de fonctions :
Arguments ou
paramtres
IV - Les Fonctions
109
2) Le Prototypage
Type_Ret Ident_fonc (,Type Argument,);
Exemples de prototypages :
void AfficheTableau(float *ptab, int nlignes);
double CalcDiscri (double Arga,double Argb,double Argc);
Prog. Struct. - C
IV - Les Fonctions
110
3) L'appel de la fonction
Paramtres de la fonction
{
double ValDisc;
IV - Les Fonctions
111
Ma premire fonction
\fonctions\exemple1.prj
Prog. Struct. - C
IV - Les Fonctions
112
2 types de fonctions
1) Celles qui ne retournent rien (void).
Elles sont galement appeles procdures.
void nom_fonction(dclarations_d'arguments)
EXEMPLE : /* Procdure affichant le produit de deux entiers */
/* Paramtres d'entre : deux entiers, Type retour : rien */
void affiche_produit (int iExp1, int iExp2)
{
int iProduit;
Prog. Struct. - C
IV - Les Fonctions
113
2 types de fonctions
2) Celles qui retournent quelque chose (elles
renvoient une valeur).
Pour cela, il faut utiliser l'instruction return :
return expression;
EXEMPLE :
/* Une fonction calculant le produit de deux entiers */
/* Paramtres d'entre : deux entiers, Type retour : entier */
Prog. Struct. - C
IV - Les Fonctions
114
2 types d'arguments :
1) ceux passs par valeur
On indique au compilateur
que fonction1 est une
fonction qui ne retourne
rien et qui admet pour
paramtre un double
//Prototypage
void fonction1(double z);
//Dfinition
void fonction1(double z)
{
z = z * 2.0;
printf("z = %lf\n",z);
}
Lors de l'appel de la fonction, le
contenu de la zone repre par z
sera x 2
Prog. Struct. - C
On donne le code de la
fonction. Le compilateur
rserve 8 octets de la pile
dsigns par z. Pour le
moment, le contenu de cette
zone est indtermin.
IV - Les Fonctions
115
Zone de 8 octets
rserve pour x
20.0
Zone de 8 octets
rserve pour z
20.0
double x = 20.0;
...
fonction1 (x);
pile
Prog. Struct. - C
IV - Les Fonctions
116
Lors de lexcution
Zone de 8 octets
rserve pour x
Hors de porte
de fonction1
20.0
20.0
40.0
pile
Prog. Struct. - C
IV - Les Fonctions
117
20.0
Prog. Struct. - C
IV - Les Fonctions
118
2 types d'arguments :
2) ceux passs par adresse
On indique au compilateur que :
- fonction2 ne retourne rien,
- et admet pour paramtre un pointeur sur double
//Prototypage
void fonction2(double *pz);
//Dfinition
void fonction2 (double *pz)
{
*pz = (*pz)*2.0;
}
Prog. Struct. - C
IV - Les Fonctions
119
Excution :
Appel de la fonction
Zone de
8 octets
rserve
par x
20.0
//A l'intrieur de la
fonction appelante
double x = 20.0;
...
4 octets
rservs
par pz
fonction2 (&x);
&x
pile
Prog. Struct. - C
IV - Les Fonctions
120
Au sein de la fonction
x inaccessible dans fonction2,
mais atteint grce l'adressage
indirect
20.0
40.0
&x
pile
Prog. Struct. - C
IV - Les Fonctions
121
Aprs lexcution
8 octets
rservs pour x de
nouveau accessible
40.0
Prog. Struct. - C
IV - Les Fonctions
pile
122
Ma deuxime fonction
val_et_adr.prj
Exemple
Prog. Struct. - C
IV - Les Fonctions
123
IV - Les Fonctions
124
IV - Les Fonctions
125
A RETENIR !!!
Prog. Struct. - C
IV - Les Fonctions
126
La rcursivit
La porte des variables : locales ou globales
Les tableaux comme arguments
Les pointeurs sur fonctions
Prog. Struct. - C
IV - Les Fonctions
127
1) La Rcursivit :
La fonction s'appelle elle-mme !
Exemple :
double Factorielle (int n);
double Factorielle (int n)
{
if (n <= 0)
return 1;
}
//Prototype
Condition d'arrt
Appel rcursif
factorielle.prj
Prog. Struct. - C
IV - Les Fonctions
128
IV - Les Fonctions
129
3) Tableaux passs en
paramtres une fonction
Tableaux une dimension (un indice)
Type_ret Ident(Type_Tab *ptab, int nSize, );
OU
Type_ret Ident(Type_Tab Tab[], int nSize, );
ex : void affichetableau(float *ptab, int Nb);
Prog. Struct. - C
IV - Les Fonctions
130
3) Tableaux passs en
paramtres une fonction
Tableaux deux dimensions (2 indices)
Type_ret Ident(Type_Tab Tab[][NCOL], int nLign, );
OU
IV - Les Fonctions
131
Prog. Struct. - C
IV - Les Fonctions
132
Signature_fonc
Exemple
double (*pFonc)(double);
Prog. Struct. - C
IV - Les Fonctions
133
Ncessite
#include <math.h>
Prog. Struct. - C
IV - Les Fonctions
134
pointfonct.prj
Prog. Struct. - C
IV - Les Fonctions
135
Prog. struct. C
Prog. struct. C
V- Les structures
137
De la fiche la structure
Pour grer une clientle, une bibliothque, un stock de
pices dtaches, etc
on a besoin d'informations sur chacun des lments de
l'ensemble.
Ces informations sont consignes dans des fiches qui
sont remplies grce un formulaire unique.
C'est le formulaire qui structure les informations
contenues dans les fiches.
Prog. struct. C
V- Les structures
138
MT
Anne : 3
Spcialit :aucune
Login : PIGNMT12
Password : juste12
Email : Francois.Pignon@polytech.univ-mrs.fr
Prog. struct. C
V- Les structures
139
Traduction Informatique
Formulaire
Type de donne
Structure struct
modle
Fiche
Variable de type
struct
objet
Fichier
Prog. struct. C
V- Les structures
140
type_N ident_champM;
}nom_var1, ... ,nom_varP;
Prog. struct. C
V- Les structures
141
int main()
{
}
Prog. struct. C
V- Les structures
142
POLYTECH
Nom[80];
Prenom[80];
Adresse[200];
Depart;
Annee;
Spec;
Login[10];
Passw[8];
Email[30];
Prog. struct. C
V- Les structures
143
Prog. struct. C
V- Les structures
144
nom_struct.nom_var
ex : UnEleve.Annee = 1;
V- Les structures
145
TabElev[10] = UnEleve;
(TabElev+10)->Annee = 1;
}
Prog. struct. C
V- Les structures
146
En utilisant la structure :
void NewElev(struct POLYTECH *pNouveau);
structures/POLYTECH.prj
Prog. struct. C
V- Les structures
147
V- Les structures
Le nom de ce nouveau
type est Complex
148
Complex *pz;
Complex zTabVal [10];
pz = &zI;
pz->Re = sqrt(2)/2;
pz->Im = pz->Re;
zTabVal[0].Re = 11.5;
Utilisation de ces
variables
(zTabVal+5)->Im = sqrt(2);
Prog. struct. C
V- Les structures
149
Union
Ensemble de variables de type diffrents pouvant
alternativement occuper la mme zone mmoire.
Syntaxe de dclaration :
la mme que pour une structure ...
union jour
{ char lettre;
int numero;
};
150
numration
Permet de dfinir un type par la liste des valeurs qu'il
peut prendre.
Syntaxe :
enum modele
{ constante_1,constante_2,,constante_n
};
Exemple :
enum tBool{FAUX,VRAI};
typedef enum tBool BOOLEEN;
...
enum jours_ouv{lundi,mardi,mercredi,jeudi,vendredi};
Prog. struct. C
151
Exemple
enum tdepart{GC,GII,ME,MT};
typedef enum tdepart DEPART;
POLYTECH *pElev;
/*Mettre une adresse valide dans pElev*/
pElev->Depart = MT;
Prog. struct. C
V- Les structures
152
La gestion de fichiers
1.
2.
3.
4.
Les Flots
Ouverture / Fermeture d'un fichier
Lecture / criture dans un fichier
Formats
Prog. struct. C
154
Gestion de Fichiers
pour le programmeur
Transfrer une ou des informations d'une
source vers une destination.
Donc grer un flot d'informations.
Prog. struct. C
155
Flot dinformations
Source :
Destination :
Mmoire
de masse
Mmoire de
masse
Clavier
Port Srie
Mmoire
Flot
Flot//stream
stream
octets
Console
Port Srie
Mmoire
Carte SD
Carte SD
...
...
Prog. struct. C
156
La direction du Flot
Dans la gestion d'un flot, au moins l'une des
destinations est la mmoire de l'ordinateur.
Pour crire dans le fichier des informations
stockes dans la mmoire, il faut accder au
fichier en criture.
Le flot est en sortie.
Pour lire les informations du fichier et les stocker
dans la mmoire, on accde au fichier en lecture.
157
<stdio.h>
standard input output
Prog. struct. C
158
Ouverture/Fermeture
de flots en C (ANSI)
Pour toutes les fonctions de gestion des
flots, il faut un pointeur sur la structure FILE
dfinie dans stdio.h.
Le flot est ouvert en appelant fopen() qui
affecte une valeur cette variable pointeur.
Le flot est ferm par fclose().
Prog. struct. C
159
160
Prog. struct. C
161
Exemple
#include <stdio.h>
int main()
{
//pointeurs sur fichier
FILE *pFascii,*pFbin;
pFascii = fopen("totoascii.txt","w");
pFbin = fopen("totobin.moi","wb");
fclose(pFascii);
fclose(pFbin);
}
Prog. struct. C
texte_bin.prj
162
163
Exemple
#include <stdio.h>
int main()
{
fprintf(stdout,"1ere alternative printf()\n");
fputs("\n En voila une autre",stdout);
}
ecran.prj
Prog. struct. C
164
/* crit nombre objets, chacun ayant la taille indique, les uns la suite
des autres l'adresse indique par source. Renvoie le nombre d'objets
crits, qui peut tre infrieur au nombre demand (en cas d'erreur) */
Prog. struct. C
165
166
r av
ec p
rca:
Fixer la position dans le fichier
utiofpos_t *ptr)
void fsetpos(FILE *flot, const
n !!
Prog. struct. C
167
Renommer ou Supprimer
un fichier
Renommer
int rename(const char *ancienNom, const char
*nouveauNom);
Supprimer
int remove(const char *FichieraSuppr);
Prog. struct. C
168
Formats d'criture
%[flags][width][.precision][{h|L|l}]type
flags (-,+,0, ,#) : mise en forme du texte
width : Longueur minimum du texte
.precision : Nombre de chiffres aprs la virgule (.)
type :
1) Flottants e,E,f,g,G
2) Entiers gnraliss c,d,i,o,u,x,X
3) Chanes de caractres s
169
Formats de lecture
%[*] [width] [{h | l }]type
Prog. struct. C
170
171
Exemple 1 :
texte format -> fichier binaire
...
int main()
{
FILE *srce; /* fichier de texte */
FILE *dest; /* fichier binaire */
...
if ((srce = fopen(nomfich, "r")) == NULL)
exit(ERREUR_OUVERTURE);
...
for (;;)
//tant qu'il y a des choses lire
{
if ((nb=fscanf(srce, "%s %s\n", art.nom, art.prenom)) != 2)
break;
...
}
...
}
Prog. struct. C
fichier.prj
172
Prog. struct. C
173
Programmation modulaire
(multi-fichiers)
1.
2.
3.
4.
Gnralits
Mise en uvre
Macros
Variables de porte fichier
Gnralits
Un logiciel doit tre conu comme la runion de
plusieurs modules,
Chaque module regroupe des fonctions de mme
nature (Graphisme, Algorithmes principaux,
interface utilisateur, ),
Un seul des modules contient la fonction main ().
Prog. Struct. C
IX - Prog. Modulaire
175
Les avantages
En sparant les fonctionnalits du projet en units
le moins possible interdpendantes, on simplifie la
mise au point du logiciel qui se fait module par
module.
La compilation est beaucoup plus rapide, car seuls
les modules modifis sont compils.
Certains modules (sils sont bien conus) peuvent
tre r-utiliss dans dautres projets.
Prog. Struct. C
IX - Prog. Modulaire
176
La mise en uvre
Programme monofichier
En-tte
Programme modulaire
Fichiers .h
Module
Fonction main
Fichier .c
Sans fonction
main()
Dfinition de
vos fonctions
Prog. Struct. C
Fichiers .c
IX - Prog. Modulaire
177
Consquences :
Le fichier *.prj s'agrandit
Prog. Struct. C
IX - Prog. Modulaire
178
Le contenu de l'en-tte
Directives de pr-processeur : #xxxx
++++ Mon_Fichier.h
Prog. Struct. C
IX - Prog. Modulaire
179
La directive #include
Syntaxe :
#include <stdio.h>
#include "[nomchemin\\]nomfichier.h"
Action : Inclure
Avant la compilation, le pr-processeur met
en lieu et place de la directive le fichier.h
Prog. Struct. C
IX - Prog. Modulaire
180
La directive #include
/* C'est le contenu du
fichier.h qui est
recopi en en-tte
du fichier.c */
#include "fichier.h"
int main()
{
}
/*fichier .c */
Prog. Struct. C
IX - Prog. Modulaire
181
La directive #define
Syntaxe :
#define BUFSIZE 512
#define PI 3.14159
Action : Rechercher/Remplacer
Partout o la chane de caractres BUFSIZE
est rencontre, elle est remplace par 512
La compilation se fera sur le code transform!
Prog. Struct. C
IX - Prog. Modulaire
182
#define
#define NMAX 10
....
int main()
{
float vect[NMAX];
Le programme est
dvelopp avec 10 pour
remplacer NMAX.
Aprs le programmeur
pourra mettre 10000 ...
IX - Prog. Modulaire
183
Prog. Struct. C
IX - Prog. Modulaire
184
IX - Prog. Modulaire
185
Prog. Struct. C
IX - Prog. Modulaire
186
Dfinition de constantes
#define CONSTANTE
Il est alors possible d'utiliser #ifdef et #endif
#define WINDOWS
#ifdef WINDOWS
//code source pour Windows
#endif
#ifdef LINUX
//code source pour Linux
#endif
Prog. Struct. C
IX - Prog. Modulaire
187
Prog. Struct. C
IX - Prog. Modulaire
188
Prog. Struct. C
IX - Prog. Modulaire
189
Prog. Struct. C
IX - Prog. Modulaire
190
Exemple
modulaire.prj
Prog. Struct. C
IX - Prog. Modulaire
191
Dpartement
Dpartement Gnie
Gnie Civil
Civil &
& Dpartement
Dpartement Mcanique
Mcanique nergtique
nergtique
Allocation Dynamique
de Mmoire
1. Gnralits
2. Les fonctions malloc() & Cie
Quand l'utiliser ?
Si le nombre dobjets stocker dans le
tableau nest connu qu lexcution, il faut
avoir recours lallocation dynamique.
Pour les tableaux plusieurs indices mme si
les dimensions sont connues priori.
Pour stoker des donnes volumineuses.
Prog. struct. C
193
Dclaration de variables
=
Demande d'allocation mmoire
int maVariable = 12;
1) le programme demande Windows la permission
d'utiliser un peu de mmoire,
2) Windows rpond en indiquant o votre
programme peut stocker maVariable
il lui alloue une adresse
3) lorsque la fonction est termine, maVariable
est automatiquement supprime de la mmoire.
Votre programme dit Windows "Je n'ai plus besoin
de cet espace mmoire"
Prog. struct. C
194
Prog. struct. C
195
Configuration de la mmoire
pendant lexcution
Tas
Programme
Variables
statiques
Pile
196
La Mise en uvre
Il faut :
Une variable de type pointeur sur la donne
stocker
Utiliser la fonction malloc() ou une similaire
pour affecter une adresse cette variable.
Librer la mmoire lorsque l'on en n'a plus
besoin avec la fonction free().
Prog. struct. C
197
La fonction malloc()
Prototype dans <stdlib.h> ou <malloc.h> :
void * malloc (size_t nSize);
Appel :
typedef struct POLYTECH_EL ELP;
ELP *pTabElev;
int nNbEl;
198
La fonction malloc()
Erreur mmoire insuffisante :
Quand la demande ne peut pas tre satisfaite,
la fonction malloc()retourne le pointeur NULL.
Do le test derreur :
if (pTabElev == NULL)
{
Gestion Erreur
}
Prog. struct. C
199
Prog. struct. C
200
La fonction calloc()
Prototype :
void *calloc(size_t nElem,size_t Taille_Elem);
Appel :
pTabElev =(struct POLYTECH_EL*)calloc (nNbEl,
sizeof(struct POLYTECH_EL));
Prog. struct. C
201
La fonction realloc()
Prototype :
void *realloc (void *ptrAlloc,size_t New_Size);
Prog. struct. C
202
La fonction free()
Prototype :
void free (void * pMemAlloue);
Appel :
free(pTabElev);
Action :
Libre la zone mmoire alloue par une des fonctions de
la famille malloc().
Doit sutiliser ds que lon na plus besoin de cette
mmoire.
Prog. struct. C
203
La fonction free()
Si la fonction free() a pour paramtre la valeur
NULL, elle sexcute sans erreur et sans rien faire.
Prog. struct. C
204
Exemple
allocat.prj
Prog. struct. C
205
Prog. struct. C
206
1 Tableau
Prog. struct. C
207
1 Liste
Prog. struct. C
208
Prog. struct. C
209
Prog. struct. C
210
if (liste==NULL || element==NULL)
{
exit(EXIT_FAILURE);
}
element->nombre=0;
element->suivant_sur_la_liste=NULL;
liste->premier_sur_la_liste=element;
Prog. struct. C
211
Progr. struct. - C
Bibliographie
212
Sources
213