Académique Documents
Professionnel Documents
Culture Documents
Licence Professionnelle
Qualit Logiciel
Pr. Mouad BEN MAMOUN
ben_mamoun@fsr.ac.ma
Les pointeurs
7.
Les fonctions
8.
9.
Les structures
2011/2012
Langages informatiques
2011/2012
Langage machine
Le code ASCII (American Standard Code for Information Interchange) donne les
2011/2012
L'assembleur
traducteur
LOAD B
langage machine
MOV A, OUT
2011/2012
Compilateur ou
en langage volu
interprteur
2011/2012
Langage machine
Compilateur/interprteur
Compilateur
exemple
excution
fichier excutable
2011/2012
Interprtation+excution
exemple.bas
fichier source
+ excution instantane apprciable pour les dbutants
- excution lente par rapport la compilation
Pr. Ben Mamoun
Langages de programmation:
Langages procduraux
Langages orients objets
Exemples de langages:
2011/2012
Historique du C
2011/2012
10
Caractristiques du C
11
Ce fichier objet nest pas excutable tel quel car il lui manque les
instructions excutables des fonctions standards appeles dans le fichier
source (printf, scanf, ) et ventuellement dautres fichiers objets
12
Compilateurs C
13
2011/2012
14
Directives du prprocesseur
15
16
Chapitre 2
Les variables
un nom (Identificateur
Identificateur)
un type (entier, rel, )
(Les types de variables en C seront discuts par la suite)
2011/2012
18
Les identificateurs
Le choix dun identificateur (nom dune variable ou dune fonction) est
soumis quelques rgles :
doit tre diffrent des mots rservs du langage : auto break case char
const continue default do double else enum extern float for
goto if int long register return short signed sizeof static
struct switch typedef union unsigned void volatile while
19
Le type dune variable dtermine lensemble des valeurs quelle peut prendre
et le nombre d'octets lui rserver en mmoire
En langage C, il ny a que deux types de base les entiers et les rels avec
diffrentes variantes pour chaque type
Remarques:
Un type de base est un type pour lequel une variable peut prendre une seule
valeur un instant donn contrairement aux types agrgs
Le type boolen nexiste pas. Un boolen est reprsent par un entier (un
entier non nul quivaut vrai et la valeur zero quivaut faux)
2011/2012
20
Types Entier
4 variantes dentiers :
char : caractres (entier sur 1 octet : - 128 127)
short ou short int : entier court (entier sur 2 octets : - 32768 32767)
int : entier standard (entier sur 2 ou 4 octets )
long ou long int : entier long (4 octets : - 2147483648 2147483648)
Si on ajoute le prfixe unsigned la dfinition d'un type de variables
entires, alors la plage des valeurs change:
unsigned char : 0 255
unsigned short : 0 65535
unsigned int : dpend du codage (sur 2 ou 4 octets)
unsigned long : 0 4294967295
Remarque : Une variable du type char peut subir les mmes oprations que les
variables du type short, int ou long
2011/2012
21
Types Rel
3 variantes de rels :
2011/2012
22
Syntaxe de dclaration en C
<Type> <NomVar1>,<NomVar2>,...,<NomVarN>;
Exemple:
int i, j,k;
float x, y ;
double z=1.5; // dclaration et initialisation
short compteur;
char c=`A`;
2011/2012
23
la directive #define :
#define nom_constante valeur
Ici la constante ne possde pas de type.
exemple: #define Pi 3.141592
le mot cl const :
const type nom = expression ;
Dans cette instruction la constante est type
exemple : const float Pi =3.141592
(Rq: Lintrt des constantes est de donner un nom parlant une valeur, par exemple
NB_LIGNES, aussi a facilite la modification du code)
2011/2012
24
Constantes entires
On distingue 3 formes de constantes entires :
2011/2012
25
2011/2012
26
Constantes relles
On distingue 2 notations :
notation dcimale
Ex : 123.4, .27, 5.
Remarques :
Les constantes relles sont par dfaut de type double
2011/2012
27
2011/2012
28
Expressions et oprateurs
Une expression peut tre une valeur, une variable ou une opration
constitue par des valeurs, des constantes et des variables relies
entre eux par des oprateurs
exemples: 1, b, a*2, a+ 3*b3*b-c,
2011/2012
29
Oprateurs en C
2011/2012
30
Oprateurs arithmtiques
Les oprandes peuvent tre des entiers ou des rels sauf pour % qui
agit uniquement sur des entiers
2011/2012
31
Conversions implicites
Exemple2 : p1 * p2 + p3 * x
2011/2012
32
Exemple de conversion
Exemple : n * p + x (int n ; long p ; float x)
long
x
conversion de n en long
multiplication par p
long
n * p de type long
float
conversion de n * p en float
+
float
2011/2012
addition
rsultat de type float
Pr. Ben Mamoun
33
2011/2012
34
Oprateurs relationnels
Oprateurs
< : infrieur
> : suprieur
== : gal
2011/2012
b==3 0 (faux)
a!=b 1(vrai)
4*(a<b) + 2*(c>=b) 4
Pr. Ben Mamoun
35
Oprateurs logiques
&& : ET logique
&& retourne vrai si les deux oprandes sont vrais (valent 1) et 0 sinon
|| : OU logique
! : ngation logique
Exemple : 5 && 11 1
!13.7 0
2011/2012
36
valuation de && et ||
Exemples
if ((d != 0) && (n / d == 2)) : pas de division si d vaut 0
if ((n >=0) && (sqrt(n) < p)) : racine non calcule si n < 0
2011/2012
37
Incrmentation et dcrmentation
Cette opration est effectue aprs ou avant l'valuation de l'expression suivant que
l'oprateur suit ou prcde son oprande
k = i++ (post
(post--incrmentation) affecte d'abord la valeur de i k et incrmente aprs (k
= i++ ; k = i ; i = i+1 ; )
k = ++i (pr
pr--incrmentation
incrmentation) incrmente d'abord et aprs affecte la valeur incrmente
k (k = ++i ; i = i+1 ; k = i ; )
Exemple :
i = 5 ; n = ++i - 5 ;
i vaut 6 et n vaut 1
i = 5 ; n = i++ - 5 ;
i vaut 6 et n vaut 0
2011/2012
38
Les oprandes sont de type entier. Les oprations s'effectuent bit bit
suivant la logique binaire
b1
b2
~b1
b1&b2
b1 | b2
b1^b2
2011/2012
39
Dans le cas d'un dcalage gauche les bits les plus gauche sont
perdus. Les positions binaires rendues vacantes sont remplies par
des 0
Ex : char x=14; (14=00001110) 14<<2 = 00111000 = 56
char y=-7; (-7=11111001) -7<<2= 11100100= -28
2011/2012
40
Lors d'un dcalage droite les bits les plus droite sont perdus.
2011/2012
41
Oprateurs utilisables :
+=
-=
*=
<<=
>>=
&=
/=
^=
%=
|=
Exemples :
a=a+b scrit : a+=b
n=n%2 scrit : n%=2
x=x*i scrit : x*=i
p=p>>3 scrit : p>>=3
2011/2012
42
2011/2012
43
Oprateur conditionnel ? :
Exemple2 :
2011/2012
44
Oprateur squentiel ,
Exemples
i++ , i + j; // on value i++ ensuite i+j (on utilise la valeur de i incrmente)
i++ , j = i + k , a + b; // la valeur de lexpression est celle de a+b
for (i=1 , k=0 ; ; ) { }
2011/2012
45
Oprateur SIZEOF
Exemples
int n;
printf ("%d \n",sizeof(int)); // affiche 4
printf ("%d \n",sizeof(n)); // affiche 4
2011/2012
46
Les oprateurs dans une mme ligne ont le mme niveau de priorit.
Dans ce cas on applique les rgles dassociativit selon le sens de la
flche. Par exemple: 13%3*4 vaut 4 et non 1
47
Oprateurs
() [] -> .
+ - ++ -- ! * & (cast) sizeof
* / %
+ << >>
< <= > >=
== !=
&
^
&&
?:
= += -= *= /= %=
&= ^= = <<= >>=
,
Pr. Ben Mamoun
Associativit
48
Chapitre 3
Entres-sorties
2011/2012
50
Syntaxe :
expr1, : sont les variables et les expressions dont les valeurs sont
reprsenter
Format : est une chane de caractres qui peut contenir
du texte
des squences dchappement (\n, \t, )
des spcificateurs de format : un ou deux caractres prcds du
symbole %, indiquant le format daffichage
51
Spcificateurs de format
SYMBOLE
TYPE
AFFICHAGE COMME
%d ou %i
int
entier relatif
%u
unsinged int
%c
char
caractre
%o
int
%x ou %X
int
%f
float, double
%e ou %E
float, double
%s
char*
chane de caractres
2011/2012
52
Squences dchappement
2011/2012
\n : nouvelle ligne
\t : tabulation horizontale
\a : signal sonore
\b : retour arrire
\r : retour chariot
\v : tabulation verticale
\f : saut de page
\\ : back slash ( \ )
\ : apostrophe
\" : guillemet
Pr. Ben Mamoun
53
Exemples de printf()
#include<stdio.h>
main()
{ int i=1 , j=2, N=15;
printf("la somme de %d et %d est %d \n", i, j, i+j);
printf( N= %x \n" , N);
char c='A' ;
printf(" le code Ascii de %c est %d \n", c, c);
}
Ce programme va afficher :
la somme de 1 et 2 est 3
N=f
le code Ascii de A est 65
Remarque : Pour pouvoir traiter correctement les arguments du type long,
il faut utiliser les spcificateurs %ld, %li, %lu, %lo, %lx
2011/2012
54
Exemples de printf()
#include<stdio.h>
main()
{ double x=10.5, y=2.5;
printf("%f divis par %f gal %f \n", x, y, x/y);
printf("%e divis par %e gal %e\n", x, y, x/y);
}
Ce programme va afficher :
10.500000 divis par 2.500000 gal 4.200000
1.050000e+001 divis par 2.500000e+000 gal 4.200000e+000
Remarque : Pour pouvoir traiter correctement les arguments du type
long double, il faut utiliser les spcificateurs %lf et %le
2011/2012
55
Par dfaut, les entiers sont affichs sans espaces avant ou aprs
Exemples : printf("%4d" , n );
2011/2012
n = 20
~~20
n=56123
56123
printf("%4X", 123);
~~7B
printf("%4x", 123);
~~7b
(~ : espace)
56
La prcision par dfaut est fixe six dcimales. Les positions dcimales
sont arrondies la valeur la plus proche.
Exemples :
printf("%f", 100.123);
100.123000
printf("%12f", 100.123);
~~100.123000
printf("%.2f", 100.123);
100.12
printf("%5.0f", 100.123);
~~100
1.2346
57
2011/2012
58
Exemples de scanf()
#include<stdio.h>
main()
{ int i , j;
scanf("%d%d", &i, &j);
printf("i=%d et j=%d", i, j);
}
ce programme permet de lire deux entiers entrs au clavier et les
afficher lcran.
Remarque : pour lire une donne du type long, il faut utiliser les spcificateurs
%ld, %li, %lu, %lo, %lx.
2011/2012
59
Exemples de scanf()
#include<stdio.h>
main()
{ float x;
double y;
scanf("%f %lf", &x, &y);
printf("x=%f et y=%f", x,y);
}
ce programme permet de lire un rel simple et un autre double du
clavier et les afficher lcran
Remarque : pour lire une donne du type double, il faut utiliser %le ou %lf et pour
lire une donne du type long double, il faut utiliser %Le ou %Lf
2011/2012
60
Chapitre 4
Structures de contrle
Structures de contrle
On distingue :
2011/2012
62
Linstruction ifelse
Syntaxe : If (expression)
bloc-instruction1
else
bloc-instruction2
bloc-instruction peut tre une seule instruction termine par un pointvirgule ou une suite dinstructions dlimites par des accolades { }
expression est value, si elle est vraie (valeur diffrente de 0), alors
bloc-instruction1 est excut. Si elle est fausse (valeur 0) alors blocinstruction2 est excut
2011/2012
63
ifelse : exemples
float a, b, max;
if (a > b)
max = a;
else
max = b;
int a;
if ((a%2)==0)
printf(" %d est paire" ,a);
else
printf(" a est impaire ",a);
2011/2012
64
if (N>0)
if (A>B)
MAX=A;
else MAX=B; (interprtation 1 : si N=0 alors MAX prend la valeur B)
if (N>0)
if (A>B)
MAX=A;
else MAX=B; (interprtation 2 : si N=0 MAX ne change pas)
2011/2012
65
2011/2012
66
la syntaxe est :
switch (expression) {
case expression_constante1 : instructions_1; break;
case expression_constante2 : instructions_2; break;
2011/2012
67
Fonctionnement de switch
On excute aussi les instructions des cas suivants jusqu la fin du bloc
ou jusqu une instruction break (qui fait sortir de la structure switch)
2011/2012
68
Switch : exemple
main( )
{ char c;
switch (c) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
case 'y': printf("voyelle\n"); break ;
default : printf("consonne\n");
}
}
2011/2012
69
do
{
instructions
} while (condition);
par contre, dans la boucle do-while ce test est effectu aprs le corps de
boucle, lequel sera alors excut au moins une fois
2011/2012
70
2011/2012
71
2011/2012
72
La boucle for
2011/2012
73
2011/2012
74
75
Linstruction break
Linstruction break peut tre utilise dans une boucle (for, while, ou do .. while).
Elle permet darrter le droulement de la boucle et le passage la premire
instruction qui la suit
i=1,j=0
i=2,j=0
i=3,j=0
2011/2012
76
Linstruction continue
Linstruction continue peut tre utilise dans une boucle (for, while, ou
do .. while). Elle permet labandon de litration courante et le passage
litration suivante
{int i;
for(i=1;i<5;i++)
{printf("dbut itration %d\n " ,i);
if(i<3) continue;
printf(" fin itration %d\n " ,i);
}
} rsultat: dbut itration 1
dbut itration 2
dbut itration 3
fin itration 3
dbut itration 4
fin itration 4
2011/2012
77
Chapitre 5
Les tableaux
Tableaux
2011/2012
79
ainsi pour :
2011/2012
80
Initialisation la dclaration
2011/2012
81
Remarques:
on ne peut pas saisir, afficher ou traiter un tableau en entier, ainsi on ne peut
pas crire printf(" %d",T) ou scanf(" %d",&T)
2011/2012
82
2011/2012
83
Tableaux : exemple
main ( )
{
float notes[30];
int nbre,i;
for(i=0;i<30;i++)
for(i=0;i<30
{ printf ("Entrez notes[%d] \n ",i);
scanf(" %f" , ¬es[i]);
}
nbre=0;
for (i=0; i<30; i++)
if (notes[i]>10) nbre+=1;
printf (" le nombre de notes > 10 est gal : %d", nbre);
}
2011/2012
84
Type Nom_du_Tableau[D1][D2][Dn];
[D1][D2][Dn]; o Di est le nombre
dlments dans la dimension i
2011/2012
85
A[0][0]
A[0][1]
A[0][2]
A[1][0]
A[1][1]
A[1][2]
86
float A[3][4] = {{-1.5, 2.1, 3.4, 0}, {8e-3, 7e-5,1, 2.7 }, {3.1, 0, 2.5E4, -1.3E2}};
2011/2012
87
2011/2012
88
89
1E05
T1E06
100
1E08
200
1E0A
300
1E0C
400
1E0E
500
1E0F
for(i=0;i<5;i++)
printf("adresse de T[%d]= %x\
%x\n",i,&T[i]);
2011/2012
90
A[0][0]
A[0][1]
A[0][2]
A[0][3]
A[1]011C
A[2] 0120
2011/2012
A[1][0]
A[1][1]
A[1][2]
A[1][3]
A[2][0]
A[2][1]
A[2][2]
A[2][3]
91
Chapitre 6
Les pointeurs
Pointeurs : dfinition
P 3F02 1C50
.
.
.
2011/2012
.
.
.
10
3F02
mmoire
93
2011/2012
94
2011/2012
95
Exemple1 :
2011/2012
96
2011/2012
97
Conseil : Toute utilisation dun pointeur doit tre prcde par une
initialisation.
Rq: un pointeur peut aussi tre initialis par une allocation dynamique (voir
fin du chapitre)
2011/2012
98
Pointeurs : exercice
main()
{ int A = 1, B = 2, C = 3, *P1, *P2;
P1=&A;
P2=&C;
*P1=(*P2)++;
P1=P2;
P2=&B;
*P1-=*P2;
++*P2;
*P1*=*P2;
A=++*P2**P1;
P1=&A;
*P2=*P1/=*P2;
}
99
p+i (resp p-i) : dsigne un pointeur sur une variable de type T. Sa valeur
est gale celle de p incrmente (resp dcrmente) de i*sizeof(T).
p1-p2 : Le rsultat est un entier dont la valeur est gale (diffrence des
adresses)/sizeof(T).
Remarque:
2011/2012
100
Adresse p2 = 22ff4c
101
Pointeurs et tableaux
P
pointe sur T[0] et *P
dsigne T[0]
P+1 pointe sur T[1] et *(P+1) dsigne T[1]
.
P+i pointe sur T[i] et *(P+i) dsigne T[i]
2011/2012
102
103
Version 1:
main()
{ float T[100] , *pt;
int i,n;
do {printf("Entrez n \n " );
scanf(" %d" ,&n);
}while(n<0 ||n>100);
pt=T;
for(i=0;i<n;i++)
for(i=0;i<n
{ printf ("Entrez T[%d] \n ",i );
scanf(" %f" , pt+i);
}
for(pt=T;pt<T+n
for(pt=T;pt<T+n;pt++)
{ printf ("Entrez T[%d] \n ",pt-T );
scanf(" %f" , pt);
}
for(i=0;i<n
for(i=0;i<n;i++)
printf (" %f \t",*(pt+i));
}
2011/2012
for(pt=T;pt<T+n
for(pt=T;pt<T+n;pt++)
printf (" %f \t",*pt);
}
Pr. Ben Mamoun
104
P
P+1
.
P+M
.
P+i*M
.
P+i*M+j
2011/2012
et *P
et *(P+1)
dsigne A[0][0]
dsigne A[0][1]
et *(P+M)
dsigne A[1][0]
et *(P+i*M)
dsigne A[i][0]
105
106
Un tableau de pointeurs :
Ex : int *T[10]; //dclaration dun tableau de 10 pointeurs dentiers
Un pointeur de tableaux :
Ex : int (*pt)[20]; //dclaration dun pointeur sur des tableaux de 20
lments
Un pointeur de pointeurs :
Ex : int **pt; //dclaration dun pointeur pt qui pointe sur des pointeurs
dentiers
2011/2012
107
108
La fonction malloc
109
Si on n'a plus besoin d'un bloc de mmoire rserv par malloc, alors
on peut le librer l'aide de la fonction free , dont la synatxe est :
free(pointeur);
2011/2012
110
2011/2012
111
Chapitre 7
Les fonctions
La programmation modulaire
Les modules sont des groupes d'instructions qui fournissent une solution des
parties bien dfinies d'un problme plus complexe. Ils ont plusieurs intrts :
2011/2012
113
Fonctions
le choix d'un nom de fonction doit respecter les mmes rgles que celles
adoptes pour les noms de variables.
2011/2012
114
Fonctions : exemples
Une fonction qui calcule la somme
de deux rels x et y :
double Som(double x, double y )
{
return (x+y);
}
2011/2012
115
Lappel d'une fonction se fait par simple criture de son nom avec la liste
des paramtres : nom_fonction (para1,, paraN)
Exemple dappels:
main( )
{ double z;
int A[5] = {1, 2, 3, 4, 5};
z=Som(2.5, 7.3);
AfficheTab(A,5);
}
2011/2012
116
2011/2012
117
118
2011/2012
119
Il faut utiliser autant que possible des variables locales. Ceci permet
d'conomiser la mmoire et d'assurer l'indpendance de la fonction
2011/2012
120
g(7) = 49
121
122
2011/2012
123
2011/2012
124
Exemples
Une fonction qui change le contenu de deux variables :
void Echange (float *x,
x, float *yy)
{ float z;
z = *x;
*x = *y;
*y = z;
}
main()
{ float a=2,b=5;
Echange(&a,&b);
printf("a=%f,b=%f\\n ",a,b);
printf("a=%f,b=%f
}
2011/2012
125
Rcursivit
Une fonction qui fait appel elle-mme est une fonction rcursive
Toute fonction rcursive doit possder un cas limite (cas trivial) qui
arrte la rcursivit
2011/2012
126
2011/2012
127
128
Chapitre 8
Chanes de caractres
2011/2012
130
Dclaration
131
Initialisation
2011/2012
132
La bibliothque <stdio.h>
La bibliothque <string.h>
La bibliothque <stdlib.h>
2011/2012
133
2011/2012
134
135
2011/2012
136
137
138