Professional Documents
Culture Documents
IEEA-TELECOM
Programmation en langage C
Zahi, Azeddine
2005-2006
1
1. Introduction .................................................................................................... 6
2.1. Identificateur....................................................................................... 8
2.2. Types prédéfinis .................................................................................. 9
2.3. Déclaration........................................................................................... 9
2.4. Expressions ........................................................................................ 10
1. Eléments lexicaux......................................................................................... 32
A.Zahi/DI/FSTF
2
4. Les constantes............................................................................................... 39
A.Zahi/DI/FSTF
3
1.1. Déclaration......................................................................................... 76
1.2 Initialisation d’un tableau................................................................ 77
1.3. Accès à un élément du tableau ........................................................ 78
1.4. Pointeurs et Tableaux....................................................................... 79
1.4.1. Le nom d’un tableau ___________________________ 79
1.4.2. Incrémentation et décrémentation ________________ 80
A.Zahi/DI/FSTF
4
2.1. Déclaration......................................................................................... 85
2.2. Initialisation....................................................................................... 85
2.3. Accès à un élément............................................................................ 86
2.4. Tableau de dimension deux paramètre d’une fonction ............... 87
3.1. Déclaration......................................................................................... 89
3.2. Initialisation....................................................................................... 89
3.3. Fonctions de manipulation .............................................................. 90
3.3.1. Affichage d’une chaîne__________________________ 90
3.3.2. Saisie d’une chaîne _____________________________ 91
3.3.3. Longueur d’une chaîne _________________________ 91
3.3.4. Copie de chaînes _______________________________ 92
3.3.5. Concaténation _________________________________ 93
3.3.6. Comparaison__________________________________ 93
2. Enumérations ............................................................................................... 96
3. Les Structures............................................................................................... 98
A.Zahi/DI/FSTF
5
1. Définition..................................................................................................... 110
A.Zahi/DI/FSTF
6
Chapitre 0 : Introduction à
l’algorithmique
1. Introduction
1.1. Définition
Un algorithme est une notion qui remonte à très loin, Il prend ses racines
dans le mot "Algorisme" introduit par le mathématicien Persse AlKhawarsimi
dans son livre " hisabo aljabri wa almoqabala". Ce n‘est donc pas une notion
propre à l’informatique.
A.Zahi/DI/FSTF
7
algorithme nom_algorithme
constantes
Déclaration des constantes
types
Déclaration des nouveaux types
Partie déclaration
variables
Déclaration des variables
début
Instructions
fin Partie traitement
Exemple
algorithme surface
constantes
PI = 3.14
rayon = 12.5
variables :
air : réel
début
air ← rayon*rayon*PI
ecrire(air)
fin
A.Zahi/DI/FSTF
8
Analyse
Conception
Deux types d’objets sont utilisés pour représenter les paramètres d’un
problème dans un algorithme: les constantes et les variables. Une variable est un
objet qui peut changer de valeur au cours de l’exécution de l’algorithme, tandis
qu’une constante ne change jamais de valeur.
2.1. Identificateur
A.Zahi/DI/FSTF
9
Exemples
Les types prédéfinis peuvent être utilisés sans qu’ils fassent l’objet d’une
déclaration. Ces types sont : les entiers, les booléens, les réels et les caractères.
Opérations arithmétiques : +, -, * et /.
Opérations de comparaison : <, ≤, >, ≥, = et ≠.
2.3. Déclaration
A.Zahi/DI/FSTF
10
Exemples
i,n : entier
x,y : réel
exist : booléen
rep, c : carcatère
2.4. Expressions
Exemples
n + 10 * cste /q
(a+b)*(c-d)/2
a div b
2*3.14*R
Exemples
A.Zahi/DI/FSTF
11
Syntaxe
Nom_variable Å expression
Exemples
A Å 5
A Å B
A Å B+5
y ← ((n+10)*q)/t
cond_admis ← (m >= 10 et Nb_mod_val > ; avec
7)
Nb_mod_val : le nombre de module validé et m la moyenne générale.
Remarques
• On peut par contre affecter une expression entière à une variable réelle.
A : entier
B, C : réels
A Å 12
B Å A div 2
C= 15
Exercices
A.Zahi/DI/FSTF
12
Syntaxe
Exemple
algorithm lecture
variables
X :entier
Rayon : réel
C : caractère
debut
lire(X)
lire (rayon)
lire(c)
Fin
Syntaxe
ecrire(exp1, ..., expn)
Exemples
algorithme ecriture
variables:
X :entier
Y :réel
Debut
Ecrire (" saisir la valeur de X")
Lire (X)
Y Å 2*X+1/X
Ecrire(" Valeur de Y = ", Y)
Fin
Exercices
A.Zahi/DI/FSTF
13
Exemple
Début
lire(x);
lire(y);
z ← x + y;
écrire(‘z=‘,z);
Fin
3.4. Choix
Syntaxe
Instr_avant_si
si (condition) alors
Bloc_instrs
finsi
Instr_après_si
Condition est une expression logique, si elle est vraie alors on exécute
les instructions Bloc_instrs, sinon on passe aux instructions suivantes.
A.Zahi/DI/FSTF
14
Instr_avant_si
vraie
Condition Bloc_instrs
fausse
Instr_après_si
Exemples
Algorithme absolue
variables:
X, Val_X :réel
Debut
Ecrire("saisir la valeur de X :")
Lire (X)
Val_XÅ -X
si (X > 0) alors
Val_X Å X
finsi
Ecrire("valeur absolue de", X,"=", Val-X)
Fin
Algorithme maximum
variables:
x, y, Max :entier
debut
Ecrire("saisir la valeur de X et Y :")
lire(X,Y)
Max Å x
si (x < y) alors
Max Å y
finsi
Ecrire ("Max (", X ",", Y, ")=", Max)
Fin
A.Zahi/DI/FSTF
15
Exercices
2. Ecrire un algorithme qui saisit deux entiers et de les afficher dans l’ordre
décroissant.
Syntaxe
Instr_avant_si
si (condition) alors
Bloc_vraie
sinon
Bloc_fausse
finsi
Instr_après_si
Instr_avant_si
fausse vraie
Condition
Bloc_fausse
Bloc_vraie
Instr_après_si
A.Zahi/DI/FSTF
16
Exemples
1. Une droite est définie par deux points, A = (x1 , y1 ) et B = (x 2 , y 2 ) ,
l’algorithme ci-dessous saisit les points, A , B et P = (x , y ) , et décide si le
point P appartient à la droite ( AB ) .
Algorithme disible
variables:
x, y, xa, ya, xb, yb :réels
debut
Ecrire ("Saisir le point A")
lire(xa, ya)
Ecrire ("Saisir le point B")
lire(xb,yb)
Ecrire ("Saisir le point P")
lire(x,y)
si ((ya-y)*(xb-x) = (xa-x)*(yb-y) ) alors
ecrire("P appartient à la droite")
sinon
ecrire("P n’appartient pas à la droite")
finsi
Fin
Algorithme divisible
variables:
x, y :entier
debut
Ecrire("Saisir x et y")
lire(x,y)
si (x mod y == 0 ) alors
ecrire( x, "est divisible par", y)
sinon
ecrire( x, "n’est divisible par", y)
finsi
Fin
Exercices
1. Ecrire un algorithme qui saisit deux entiers, a et b , et qui affiche
l’expression b = a * q + r avec p et r le résultat de la division entière de
b par a . Il faut prendre en considération la cas où b est divisible par a .
Exemples
15 = 7* 2 + 1
10 = 5*2
A.Zahi/DI/FSTF
17
a b
5. Trois nombres positifs peuvent représenter les cotés d’un triangle dans
la mesure où chacun d’entre eux est inférieur à la somme des deux
autres. Ecrire un algorithme qui saisit les trois nombres et affiche si on
peut construire un triangle avec.
Dans l’un des blocs d’une instruction de choix on peut avoir une
instruction qui contient une autre instruction de choix et ainsi de suite. On dit
dans ce cas que le choix est imbriqué.
Syntaxe
Instr_avant
si (condition_1) alors
si (condition_11) alors
.
.
sinon
.
finsi
sinon si (condition_2)
.
.
Sinon
.
.
finsi
finsi
Instr_après
A.Zahi/DI/FSTF
18
C1
F v
C5 C2
F v v
F
Bloc52 Bloc51 Bloc2 C3
v
F
Bloc3 C4
v
Bloc4
si (c1) alors
si (c2) alors
si (c3) alors
Bloc3
sinon
si (c4) alors
bloc4
finsi
finsi
sinon
bloc2
finsi
sinon
si ( c5) alors
bloc51
sinon
bloc52
finsi
finsi
Exemple
Calcul du maximum de trois nombres entiers a, b et c à saisir. La solution peut
être représenté par l’arbre suivant :
a>b
V F
a>c b>c
V F V F
A.Zahi/DI/FSTF
19
algorithme maximum3
variables :
a,b,c,max : entier
debut
Ecrire (" Saisir a, b et c :")
lire(a,b,c)
si (a > b) alors
si (a > c) alors
max ← a
sinon
max ← c
finsi
sinon
si (b > c) alors
max ← b
sinon
max ← c
finsi
finsi
ecrire(max)
fin
Exercices
1. Soient a, b et c trois réels, écrire un algorithme qui permet de résoudre
dans IR l’équation: a X2 + b X + c = 0. Etudier tous les cas.
a b c d
3. La mention de réussite est attribuée en fonction de la moyenne de
l’étudiant selon le tableau suivant :
Moyenne Mention
18 ≤ m Très Bien
14 ≤ m <18 Bien
12 ≤ m <14 Assez Bien
10 ≤ m <12 Passable
A.Zahi/DI/FSTF
20
Syntaxe
Instr_avant_selon
selon (expr)
val_1 : Bloc_1
val_2 : Bloc_2
...
val_n :Bloc_n
autrement : Bloc_a
finselon
Instr_après_selon
Instr_avant_selon
Evaluation de l’expression
Instr_après_selon
Exemple
A.Zahi/DI/FSTF
21
Algorithme Feu
variables:
Couleur: entier
debut
Ecrire (" Quel est la couleur du feu")
Lire (Couleur)
Selon (Couleur)
0 : Ecrire (" Arrêter ")
1 : Ecrire (" Avancer ")
2 : Ecrire (" Ralentir ")
autrement : Ecrire (" Feu en panne")
finselon
Fin
Exercices
Indice tva
1 0
2 0.05
3 0.1
4 0.15
5 0.2
Ecrire un algorithme qui saisit le prix hors taxe prix_ht et l’indice d’un
produit indice, calcule et affiche le prix_tcc équivalent.
A.Zahi/DI/FSTF
22
3.5. Répétition
3.5.1. Présentation des boucles
Une boucle est une instruction qui permet de décrire une répétition dans un
algorithme. Elle consiste à répéter l’exécution d’un bloc d’instructions, appelés
corps de la boucle, un certain nombre de fois, une exécution du bloc s’appelle
itération. Il existe trois formes de boucles : tant que, répéter et pour, chacune est
caractérisée par les éléments suivants :
• Une condition d’arrêt, c'est une expression logique qui permet l'arrêt de
la boucle, une fois le nombre d'itérations est achevé.
Syntaxe
Instr_avant
Bloc
fintantque
Instr_après
A.Zahi/DI/FSTF
23
Instr_avant_tantque
vraie
Condition Corps de la boucle
fausse
Instr_après_tantque
• Premier cas : le nombre d’itération est connu à l’avance. Dans ce cas nous
aurons besoin des éléments suivants :
A.Zahi/DI/FSTF
24
Exemples
n
1. Calculer la somme des n premiers entiers : ∑i
i =1
algorithme somme
variables :
n,s,i :entier
début
Ecrire ("Saisir n")
lire (n)
i ← 1
s ← 0
tantque(i≤n) faire
s ← s+i
i ← i+1
fintantque
écrire ("Somme=", s)
fin
algorithme combien
variables :
nb,n,k,i :entier
début
Ecrire ("Saisir n")
lire (n)
Ecrire ("Saisir k")
lire(k)
i ← 1
nb ← 0
tantque(i≤n) faire
si (i mod k = 0)
nb ← nb + 1
finsi
i ← i+1
fintantque
écrire ("le nombre est :", nb)
fin
A.Zahi/DI/FSTF
25
Bloc
ecrire(" texte de la question O/N"),
lire(Rep)
fintantque
Exemple
Algorithme client
Variables
Rep : caractère
MT, mp, pu : réel
Debut
MTÅ 0
Rep Å '0'
Tant que ( Rep='O') faire
Lire(qa,pu)
Mp Å qa*pu
MT Å MT+mp
Ecrire("Un autre produit O/N")
Lire (Rep)
Fintant que
Fin
Exemple
Saisir une phrase caractère par caractère, la fin de la phrase est identifiée par
le caractère ‘.’
algorithme saisir_phrase
variables :
c :caractère
début
lire (c)
tantque(c ≠ ‘.’) faire
lire (c)
fintantque
fin
A.Zahi/DI/FSTF
26
Exercices
1. Ecrire un algorithme qui calcul x n , avec x et n sont donnés.
Syntaxe
Intsr_avant
répéter
Bloc
Jusqu’à (Condition)
Instr_après
A.Zahi/DI/FSTF
27
Instr_avant_repeter
Corps de la boucle
fausse
Condition
vraie
Instr_après_repeter
• Premier cas : le nombre d’itérations est connu à l’avance. Dans ce cas nous
utilisons les mêmes éléments que ceux de la boucle tant que, seule la
condition d’arrêt est diffère, elle devient (C > N + Vin -1). Ainsi, on
obtient la partie de l’algorithme suivante:
C Å Vin
répéter
Bloc
C Å C+1
Jusqu’à (C > N+Vin-1)
Exemples
n
1. Calcul de la somme des n premiers entiers : ∑i
i =1
algorithme somme
variables :
n,s,i :entier
début
Ecrire ("Saisir n")
lire (n)
i ← 1
s ← 0
répéter
s ← s+i
i ← i+1
Jusqu’à( i>n)
écrire ("Somme = ", s)
fin
A.Zahi/DI/FSTF
28
2. Calcul du nombre d’entiers < à n qui sont divisibles par un entier k saisi.
algorithme combien
variables :
nb,n,k,i :entier
début
Ecrire ("Saisir n et k ")
lire (n, k)
i ← 1
nb ← 0
repéter
si (i mod k = 0)
nb ← nb + 1
finsi
i ← i+1
jusqu’à (i>n)
écrire ("le nombre est :", nb)
fin
Rep Å "O"
répépter
Bloc
ecrire(" texte de la question O/N"),
lire(Rep)
jusqu’à (Rep="N")
Exemple
Algorithme client
Variables
Rep : caractère
MT, mp, pu : réel
Debut
MTÅ 0
Rep Å '0'
répéter
Lire(qa,pu)
Mp Å qa*pu
MT Å MT+mp
Ecrire("Un autre produit a/N")
Lire (Rep)
Jusqu’à(Rep=’n’)
Fin
A.Zahi/DI/FSTF
29
Exemple
Saisir une phrase caractère par caractère, la fin de la phrase est identifiée par
le caractère ‘.’
algorithme saisir_phrase
variables :
c :caractère
début
lire (c)
répeter
lire (c)
jusqu’( c=’.’)
fin
Exercices
Refaire les exercices de la page 23 en utilisant la boucle répéter.
Syntaxe
Instr_avant
pour i allant de vi à vf
faire
Bloc
finpour
ou de façon générale
Instr_après
A.Zahi/DI/FSTF
30
Instr_avant_pour
I Å val_initiale
incrément
vraie
I <= val_finale Corps de la boucle
fausse
Instr_après_pour
Exemples
A.Zahi/DI/FSTF
31
Exercices
A.Zahi/DI/FSTF
32
1. Eléments lexicaux
1.1. Identificateurs
A.Zahi/DI/FSTF
33
[directives de compilation]
[déclarations des variables globales]
[déclarations des fonctions]
void main()
{
déclarations des variables locales
Instructions
}
Un commentaire est un texte mis entre les caractères ‘/*’ et ‘*/’. Il permet
de documenter un programme pour une meilleure lisibilité et une maintenance
facile (correction, modification etc.).
Exemples :
2.2. Instructions
2.2.1. Instructions directement exécutables
expression ;
Exemple
Remarques
A.Zahi/DI/FSTF
34
Exemple
2.3. Fonctions
L’une des caractéristiques du langage C est qu’il est composé par une ou
plusieurs fonctions. Une fonction est une entité indépendante formée par un
ensemble d’instructions et qui effectue une tâche bien précise, on distingue
trois types de fonctions :
A.Zahi/DI/FSTF
35
#include <stdio.h>
#define PI 3.14
{
float s ;
s= PI*r*r ;
return (s) ;
}
/* fonction principale */
void main()
surface = calc_surface(rayon) ;
printf(’’ Surface = %f\n’’, surface) ;
A.Zahi/DI/FSTF
36
• .cpp .c
• format ASCII
Compilateur Compilation et
génération du code
objet
• .obj
• format binaire
• Inclusion du
code objet des
Editeur des liens fichiers inclus
• Génération du
code exécutable
• .exe
• format binaire
Le langage C est un langage typé i.e. chaque objet est associé à un type qui
définit la représentation en mémoire et l’ensemble des valeurs qu’il peut prendre.
Les types de base en C concernent les caractères, les entiers et les réels.
A.Zahi/DI/FSTF
37
• Un mot clé.
Le type caractère est désigné par le mot clé char, les valeurs prises par les
objets de ce type sont le jeu de caractères de la machine utilisée. Chaque objet
est codé sur 1 octet.
Ces attributs peuvent être combinés pour former plusieurs types numériques :
Les réels sont caractérisés par leur précision (nombre de chiffre après la
virgule). Le langage C dispose de trois types de réels suivant la précision
désirée. Le tableau suivant montre leurs caractéristiques.
A.Zahi/DI/FSTF
38
3.2. Variables
3.2.1. Déclaration
Une variable doit faire l’objet d’une déclaration avant toute utilisation. Ce la
consiste à spécifier son type et son nom.
Syntaxe
type est l’un des types de base, int, char, float, etc.
Exemples
int compteur,X1,X2;
float hauteur,largeur;
double masse_atomique;
char touche;
3.2.2. Initialisation
Syntaxe
Exemple
void main()
{
int compteur = 0 ;
float hauteur = 3.14 ;
char Rep = ‘O’;
}
Remarque
Une variable peut être déclarée à plusieurs niveaux d’un programme : dans
un fichier externe, dans la fonction main, dans une fonction secondaire ou dans
bloc d’instructions.
A.Zahi/DI/FSTF
39
4. Les constantes
4.1. Constantes littérales
C’est une valeur qui apparaît littéralement dans le code source d’un
programme, le type de la constante dépend de son écriture.
Les constantes réels ou encore les constantes flottantes sont représentés par
la notation mantisse-exposant, l’exposant est désigné par la lettre e ou E.
Remarque
Une constante réelle est par défaut de type double. Pour la forcer à avoir
une représentation sous forme d’un float (resp. long double) on doit l’affecte
de l’attribut f ou f(resp. L).
Exemples
Constante type
15.25 double
15.2e-4 double
15.25f float
15.25l long double
Les constantes entières peuvent s’exprimer dans les systèmes décimal, octal
ou hexadécimal.
• Notation décimal : la constante est une suite qui commence par un chiffre
différent de 0, suivie de chiffres entre 0 et 9.
• Notation octal : La constante est une suite qui commence par le chiffre
zéro 0, suivie de chiffres entre 0 et 7.
Remarque
Une constante entière est par défaut de type int. Pour forcer la constante à
avoir une représentation sous forme d’un entier long : long int (resp court) on
doit l’affecter de l’attribut l ou L (resp. de u ou U).
A.Zahi/DI/FSTF
40
Exemples
Constante type
2001 int
02589 int /*octal*/
0x4D7 int /*héxadécimal*/
12458798L long int
1247U unsigned int
12458798UL Unsigned long int
Les constantes de type caractère sont assimilées à un entier sur un octet dont
la valeur correspond à la position du caractère dans la table ASCII.
Constante Nom
\n Retour à la ligne
\t Tabulation horizontale
\v Tabulation verticale
\b Retour arrière
\r Retour chariot
\f Saut de page
\a Signal d’alerte
Exemple
Remarque
Il ne faut pas confondre ’a’ qui est une constante caractère et ’’a’’ qui est
une constante chaîne de caractères.
A.Zahi/DI/FSTF
41
Une constante symbolique est un objet dont la valeur ne change pas au cours
de l’exécution du programme. Elle est représentée par un nom qu’on peut
utiliser chaque fois qu’on a besoin de la constante. Deux types de constantes
symboliques peuvent être distinguées.
4.2.1. Pseudo-constantes
C’est une constante dont le nom est attribué par la directive #define. Le
préprocesseur remplace chaque occurrence du nom par la valeur de la constante
sans aucune vérification de type.
Syntaxe
#define IDENF val_subst
Exemple
#define PI 3.14159
#define G 9.81
void main()
{
float s,r =12.5;
float m=15;
s = PI*r*r ;
P = G * m ;
}
Remarque
• La définition d’une constante n’est pas une déclaration, il n’y a pas donc
de point virgule ; à la fin.
C’est une constante déclarée comme une variable dont on ne peut pas
modifier le contenu au cours du programme. Elle occupe donc un espace en
mémoire centrale.
A.Zahi/DI/FSTF
42
Syntaxe
Exemple
void main()
{
float s,r=11.6;
const float PI=3.14
s= PI*r*r ;
}
Syntaxe
printf(’’format’’, expr1, expr2,..., exprn) ;
Le texte à afficher.
A.Zahi/DI/FSTF
43
Syntaxe
Remarque
Les données saisies au clavier doivent être séparées par des espaces ou des
retour chariot, sauf s’il s’agit de la saisie d’un caractère.
Syntaxe
char c ;
c = getchar() ;
putchar(c) ;
A.Zahi/DI/FSTF
44
Exemple
#include <stdio.h>
void main()
{
int c ;
while ((c = getch() != EOF)
putchar() ;
}
6. Expressions et Opérateurs
Syntaxe
Exemple
A.Zahi/DI/FSTF
45
#include <stdio.h>
void main()
{
int nb ;
float re;
printf (’’donner nb et re : ’’) ;
scanf(’’%d %f’’, &nb, &re) ;
/* le résultat d’une opération entre un entier et un
réel est un réel */
printf (’’somme : %f\n’’, (nb+re)) ;
printf (’’différence : %f\n’’, (nb-re)) ;
printf (’’produit : %f\n’’, (nb*re)) ;
}
Remarque
6.2. Affectation
Syntaxe
A.Zahi/DI/FSTF
46
Exemple
#include <stdio.h>
void main()
{
int a, b ;
scanf(’’%d %d’’, &a, &b) ;
/* reste de la division de a par b*/
a %= b ;
a += b ;
a /= b ;
Syntaxe
#include<stdio.h>
main()
{
int a=50, b=60, x, y;
printf("a =%d ** b = %d", a, b);
x = ++a;
y = --b;
printf("\nx =%d ** y = %d", x, y);
x = a++;
y = b--;
printf("\nx =%d ** y = %d", x, y);
A.Zahi/DI/FSTF
47
Syntaxe
expr1 op expr2
Exemple
char c ;
int i, age, n
float m ;
(c != ‘.’)
(i <= n && exist ==1)
(m>=12 && age <=24) || (m>=12 && age <26)
Syntaxe
expr1 ? expr2 : expr3
Exemples
#include <stdio.h>
main()
{
int x , abs_x;
printf (’’donner x : ’’) ;
scanf(’’%d ’’, &x) ;
abs_x = (x>=0) ? (x) : (-x) ;
printf (’’valeur absolue de x est : %d ’’, abs_x) ;
}
A.Zahi/DI/FSTF
48
#include <stdio.h>
void main()
{
int x ,y, max;
printf (’’donner x et y : ’’) ;
scanf(’’%d%d ’’, &x, &y) ;
max = (x>y) ? (x) : (y) ;
printf (’’le maximum de x et y est : %d ’’,
max) ;
}
6.6. Expression
• Expression simple, constituée par une seule variable, une seule constante
(littérale ou symbolique).
Exemple
#define PI 3.14
#define G 9.8
#define TVA 0.20
int prixHT ;
/* Expressions simples*/
PI, G, /*constantes symboliques */
50, -1.6, /*‘a’ constantes littérales */
prixHT /* variable */
/* Expressions complexes */
2+8,
prixHT * TVA
7. Structures de contrôle
7.1. Le choix
7.1.1. if sans else
Syntaxe
if(expr)
Partie_alors
A.Zahi/DI/FSTF
49
Exemples
#include <stdio.h>
main()
{
float X, Val_X ;
printf("saisir la valeur de X :");
scanf("%f", &X) ;
Val_X = -X ;
if (X > 0)
Val_X = X ;
#include <stdio.h>
main()
{
int x, y, Max ;
printf("saisir la valeur de x et y :") ;
scanf("%d%d", &x, &y) ;
Max = x ;
if (x < y)
Max = y ;
Syntaxe
if(expr)
Partie_alors
else
partie_sinon
Remarque
A.Zahi/DI/FSTF
50
Exemples
#include <stdio.h>
main()
{
int x, y;
printf("Saisir x et y : ") ;
scanf("%d%d", &x,&y);
if (x % y == 0 )
print("%d est divisible par %d",x,y);
else
printf("%d n’est pas divisible par %d",x,y);
}
#include <stdio.h>
main()
{
float x, y, xa, ya, xb, yb;
• 1er Cas : Par défaut, un else est associé au if le plus proche. Dans
l’exemple suivant le else est associé à if(expr2).
if (expr1)
if(expr2)
inst1
else
inst2
A.Zahi/DI/FSTF
51
Exemple
#include <stdio.h>
main()
{
int a,b,c,max ;
if a > b)
if (a > c)
max = a ;
else
max = c ;
else
if (b > c)
max = b
else
max = c
• 2ème Cas : Un else doit être associé à un if plus loin. L’ambiguïté est levée
en regroupant les instructions, entre les if et else concernés, dans un bloc
d’instructions, i.e., entre accolades. Dans l’exemple suivant le else est
associé à if (expr1).
if (expr1)
{
if(expr2)
inst1
}
else
inst2
Exemple
A.Zahi/DI/FSTF
52
#include <stdio.h>
main()
{
float x, fx, a, b;
fx = 1;
if (x > a)
{
if (x > b)
fx = (x-a)/(b-a);
}
else
fx = 0;
printf(" f(%f)= %f",x,fx);
}
Exercices
Voir chapitre 0
7.1.4. Switch
Syntaxe
switch(expr)
{
case etiq1 :
Bloc_1
case etiq2 :
Bloc_2
...
case etiqn :
Bloc_n
delfaut :
Bloc_d
}
A.Zahi/DI/FSTF
53
#include <stdio.h>
void main()
{
int a, b, s ;
char c;
printf(’’donner a, b’’) ;
scanf(’’%d%d’’, &a,&b) ;
scanf(’’%c ’’) ;
switch( c ) ;
{
case ‘+’ :
s= a+b ;
break ;
case ‘-’ :
s= a-b ;
break ;
case ‘*’ :
s= a*b ;
break ;
case ‘/’ :
s= a/b ;
break ;
default :
printf(’’ce n’est pas un
opérateur’’) ;
break ;
}
}
Exercices
Voir chapitre 0
7.2. Boucles
7.2.1. Boucle while
Syntaxe
while (expr)
corps-de-boucle
A.Zahi/DI/FSTF
54
Exemples
n
1. Calculer la somme des n premiers entiers : ∑i
i =1
#include <stdio.h>
main()
{
int i, n, S ;
printf(" Saisir n: ");
scanf("%d",&n);
S=0 ;
i=0 ;
while ( i<=n)
{
S += i;
i++;
}
printf("S=%d", S);
}
#include <stdio.h>
main()
{
char Rep;
float MT =0 ; mp, pu ;
Rep = 'O';
while ( Rep == 'O')
{
printf("saisir qa et pu") ;
scanf("%f%f", &qa,&pu) ;
Mp = qa*pu ;
MT = MT+mp ;
printf(" Un autre produit O/N") ;
scanf("%c", &Rep) ;
}
}
3. Saisir une phrase caractère par caractère. La fin de la phrase est identifiée par
le caractère ‘.’
#include <stdio.h>
main()
{
char c;
printf("Saisir un carcatère : ") ;
c=getc() ;
while(c != ‘.’)
c=getc() ;
}
A.Zahi/DI/FSTF
55
Syntaxe
do
corps_de_boucle
while (expr) ;
Exemples
n
1. Calculer la somme des n premiers entiers : ∑i
i =1
#include <stdio.h>
main()
{
int i, n, S ;
printf(" Saisir n: ");
scanf("%d",&n);
S=0 ;
i=0 ;
do
{
S += i;
i++;
}
while (i<=n);
printf("S=%d", S);
}
#include <stdio.h>
main()
{
char Rep;
float MT =0 ; mp, pu ;
Rep = 'O';
do
{
printf("saisir qa et pu") ;
scanf("%f%f", &qa,&pu) ;
Mp = qa*pu ;
MT = MT+mp ;
printf(" Un autre produit O/N") ;
scanf("%c", &Rep) ;
}
while ( Rep == 'O') ;
}
A.Zahi/DI/FSTF
56
3. Saisir une phrase caractère par caractère. La fin de la phrase est identifiée par
le caractère ‘.’
#include <stdio.h>
main()
{
char c;
printf("Saisir un carcatère : ") ;
do
c=getc(stdin) ;
while(c != ‘.’);
}
Syntaxe
Exemples
n
1. Calculer la somme des n premiers entiers : ∑i
i =1
#include <stdio.h>
main()
{
int i, n, S ;
printf(" Saisir n: ");
scanf("%d",&n);
S=0 ;
for (i=1; i<=n; i++)
S += i;
printf("S=%d", S);
}
A.Zahi/DI/FSTF
57
#include <stdio.h>
main()
{
int max, min, n;
printf(" Saisir n") ;
scanf("%d", &n);
A.Zahi/DI/FSTF
58
main()
{
...
...
while ( )
{
...
...
break ;
...
...
}
...
}
Exemple
#include <stdio.h>
/* la boucle s’arrête à la lecture du premier 5 */
void main()
{
int a ;
for (int i=0 ; i<=10; i++)
{
scanf(’’%d’’, &a);
if(a==5)
break ;
}
if (i <10)
printf (’’Sorite prématurée’’)
}
A.Zahi/DI/FSTF
59
main()
{
...
...
while ( )
{
...
...
continue;
...
}
}
Exemple
#include <stdio.h>
void main()
{
int n ;
float S ;
S=0;
for (int i=0 ; i<=100; i++)
{
scanf("%d", &n);
if(n==0)
continue ;
else
S=S+1/n ;
}
}
Exemple
#include <stdio.h>
float val_abs (float x)
{
if (x >=0) return x;
else return -x;
}
int main()
{
float y ,v ;
scanf(’’%f’’, &y);
v=val_abs(y);
printf(’’%f’’, v);
return;
}
A.Zahi/DI/FSTF
60
Exemple
#include <stdio.h>
main()
{
int n ;
int c ;
scanf(’’%d’’, &n);
c=n*n;
printf(’’%d’’, c);
exit(1);
}
8. Les Pointeurs
8.1. Mémoire de l’ordinateur
• La pile : utilisée lors de l’appel des fonctions, les variables locales et les
paramètres de la fonction appelée sont logés dans cette zone. La mémoire
locale est allouée au moment de l’appel et libérée à la fin de l’exécution.
• Le tas (Heap) cette zone, appelée aussi mémoire dynamique, contient
les données dont la taille augmente ou diminue au cours de l’exécution
d’un programme.
A.Zahi/DI/FSTF
61
Mémoire centrale
• Applications:traitement
de texte Word, Tex...), Segment de données
• Tableurs (Excell,...)
Systèmes
d’exploitation
• Linux, DOS, Windows...
Valeur de X Variable X
Pointeur vers X
Adresse de X
A.Zahi/DI/FSTF
62
8.3. Déclaration
Syntaxe
nom_Type *nom_pointeur ;
Exemple
void main()
{
int *ptr_entier ; /* pointeur sur un entier*/
long int *ptr_long; /*pointeur sur un entier long*/
double *ptr_double; /* pointeur sur un réel double*/
char *ptr_carac ; /* pointeur sur un caractère*/
}
Remarque
8.4. Initialisation
Comme pour les variables simples, un pointeur non initialisé peut provoquer
des problèmes d’exécution. En effet, quand on déclare un pointeur, ce dernier est
initialisé par une valeur quelconque (i.e., une adresse quelconque). Pour cela, un
pointeur doit être initialisé avant toute utilisation, c’est le programmeur qui
doit s’en charger. Il existe deux façons d’initialiser un pointeur : par une adresse
existante, en utilisant l’opérateur d’adressage, ou en lui attribuant une nouvelle
adresse.
Un pointeur peut être initialisé par l’adresse d’une variable qui existe déjà.
L’initialisation a la forme suivante :
Syntaxe
type X ;
type* ptr_X ;
ptr_X= &X ; /* affectation de l’adresse de X à ptr_X */
A.Zahi/DI/FSTF
63
Exemple
void main()
{
int X = 25; /* X contient la valeur 25 */
int *ptr_X ;
ptr_X = &X ; /* ptr_X contient l’adresse de X */
}
Un pointeur peut être initialisé par l’adresse d’une case mémoire réservée au
cours de l’exécution du programme. Pour ce faire nous avons besoin des
fonctions malloc() et sizeof() qui sont situées dans la bibliothèque <stdlib.h> ou
dans <alloc.h>.
Syntaxe
sizeof est un opérateur qui retourner la taille d’un type i.e., la taille
de l’espace mémoire nécessaire pour loger une variable de ce type.
Exemple
int *ptr_X ;
/* allocation mémoire pour une variable entière X */
ptr_X = (int *) malloc (siezof(int)) ;
double *ptr_d ;
/* allocation mémoire pour une variable réelle */
ptr_d = (double* ) malloc (siezof(double)) ;
8.5. Indirection
A.Zahi/DI/FSTF
64
Syntaxe
nomtype X ;
nomtype *ptr_X ;
ptr_X =( nomtype *) malloc(sizeof(nomtype)) ;
X=*ptr_X ;
Exemple 1
#include<stdio.h>
void main( )
{
int i = 0;
int *p;
float x = 3.14;
float *f;
f= (float* ) malloc(sizeof(float));
scanf(“%f”, f);
p = &i;
*f = 666;
f = &x;
printf(“%f”,*f);
*f = *p;
*p = 34;
*p = *p + 1;
printf( "%d %f %d\n", i, *f, *p );
}
Remarques
int* p = 10 ; * Faux*/
La fonction free permet de libérer un espace mémoire qui a été alloué par
la fonction malloc, cette fonction est appelée une fois qu’on a plus besoin de cet
espace.
Syntaxe
free(p);
A.Zahi/DI/FSTF
65
9. Les fonctions
9.1. Analyse descendante
P1 P2 P3
P321 P322
Une fonction, est un ensemble d’instructions réalisant une tâche bien précise,
elle peut être considérée comme une boîte noire qui reçoit en entrée des données
et fournit des résultas en sortie.
A.Zahi/DI/FSTF
66
1 i =n i
Exemple : Calcul de f n (x ) = ∑ x
n! i =1
• Ce problème peut être décomposé en trois sous problèmes :
(1/Fact(n))*Som(x,n)
9.2. Pseudo-fonction
Syntaxe
Exemple
#include <stdio.h>
#define CARRE(x) ((x)*(x))
#define MAX(x,y) ((x) >(y) ? (x):(y))
void main()
{
int n,m, M, C ;
printf("donner n et m: ");
scanf("%d%d", &n, &m);
M = MAX(m,n) ;
printf("Le max est : %d", M);
C = CARRE(n)
printf(" le carré de %d est : %d", n, C) ;
}
A.Zahi/DI/FSTF
67
Remarque
Les parenthèses entourant les arguments sont nécessaires pour éviter les
effets de bord, En effet si on définie la macro : #define carre (x) x*x,
l’instruction r=carre (x+y) ; sera remplacée par l’expression x+y*x+y ;
L’interface est constituée par trois éléments chacun joue un rôle particulier.
Syntaxe
type_retour nom_fonction(liste des paramètres)
A.Zahi/DI/FSTF
68
Exemples
Syntaxe
{
déclarations des variables locales
instructions
return expression ;
}
Variables locales ce sont des variables déclarées dans la fonction et
qui ne sont pas visibles à l’extérieure.
Exemples
1. fonction main
void main ()
{
printf(’’bonjour Bonjour’’) ;
}
A.Zahi/DI/FSTF
69
4. Valeur absolue
float Val_Abs(float a)
{
float abs ;
if (a>=0)
abs = a ;
else
abs = -a
return abs ;
}
• Quels sont les données dont la fonction a besoin pour effectuer sa tâche ?
Les données constitueront les paramètres fixes de la fonction.
• Quels sont les résultats que la fonction doit fournir ?. Les résultats
constitueront les paramètres variables de la fonction.
• Quelles sont les instructions qui permettent d’obtenir les résultats à partir
des données ? Les instructions constitueront le corps de la fonction.
Une fois déclarée, une fonction peut être utilisée dans plusieurs parties du
programme, on parle ainsi de l’appel de fonction. Au moment de l’appel, la
fonction appelante transmet à la fonction appelée les paramètres effectifs
(valeurs des paramètres formels); ensuite le corps de la fonction appelée est
exécutée, après, la fonction appelante reprend l’exécution à la ligne qui suit la
ligne d’appel et récupère éventuellement un résultat.
A.Zahi/DI/FSTF
70
Fonction
appelante Fonction
appelée
Paramètres
effectifs
Suspension de
l’exécution Exécution de
la fonction
Valeur de
Reprise de retour
l’exécution
Retour vers
l’appelant
Figure 13 : Processus de l’appel d’une fonction
1. Valeur absolue
#include <stdio.h>
float absolue( float a)
{
float abs ;
abs = a ;
if( a <0)
abs =-a
return abs ;
}
void main()
{
float x, y, Max ;
printf(" Entrer la valeur de x : ") ;
scanf("%f ", &x) ;
/* appel de la fonction absolue*/
printf("%f", absolue(x)) ;
}
A.Zahi/DI/FSTF
71
Remarques
L’ordre des paramètres effectifs doit être le même que celui des
paramètres formels.
A.Zahi/DI/FSTF
72
int x=20, y ;
y = f2(x) ;
Mémoire
centrale
int f2(int x)
{
x = 20 x= x+x ;
y=40 1. Copier x return x ;
sur la pile }
2. Exécuter
la fonction
3. Stocker le résultat
4. Récupérer le résultat
sur la pile
de la pile
x = 20
x= 40
Pile
A.Zahi/DI/FSTF
73
int x=20, y ;
f2(&x) ;
Mémoire
centrale
void f2(int * x)
{
x = 20 *x= *x + *x ;
x = 40 1. Copier &x }
sur la pile
2. Exécuter
la fonction
3. lire la valeur du
paramètre à partir de
la M. C. (&x)
&x
4. Stocker le résultat
dans la M.C. &x
Pile
A.Zahi/DI/FSTF
74
Exemple
#include <stdio.h>
void init0()
{
m = 0;
printf("\n %d",m);
}
void init1(int t)
{
int k =15 ; /* variable local */
t = k+ 1;
printf("\n %d",t);
}
init0();
printf("\n %d",m);
n = m;
init1(n);
printf("\n %d",n);
init2(&n);
printf("\n %d",n);
init2(&m);
printf("\n %d",m);
init1(m);
printf("\n %d",m);
}
Exercices
1. Ecrire une fonction qui retourne l’image d’un réel par la fonction définie
par le graphe suivant :
a b c d
A.Zahi/DI/FSTF
75
i =n
xi
2. Ecrire un programme qui calcul la valeur ∑ i! , Ecrire les fonctions
i =1
nécessaires.
A.Zahi/DI/FSTF
76
Un tableau uni dimensionnel est une structure qui abrite un ensemble fini
d’éléments de même type. Un tableau occupe une place contiguë dans la
mémoire i.e., les éléments sont stockés les un à la suite des autres.
21 1er élément
12 2 ème élément
3
Tableau
.
.
.
dernier élément
20
1.1. Déclaration
Syntaxe
type_element nom_tableau[CAP];
A.Zahi/DI/FSTF
77
Remarque
#define CAP 10
int t[CAP];
int t[ ];
int t[n]; avec n.une variable.
Exemples
#define CAP1 15
#define CAP2 20
#define CAP3 30
void main()
{
/* tableau qui peut contenir 15 entiers */
int t[CAP1] ;
A.Zahi/DI/FSTF
78
Exemple
#define CAP 5
Chaque élément du tableau est identifié par son rang. Pour y accéder on
utilise l’opérateur d’indexation [.] avec le rang de l’élément comme paramètre.
Syntaxe
nom_tableau [exp] ;
exp est une expression délivrant une valeur entière qui indique le rang de
l’élément dans le tableau.
Si T est un tableau, T[i] représente son (i+1)eme élément, Ainsi T[i] peut
être considéré comme une variable simple sur laquelle on peut effectuer
les opérations suivantes :
Affectation :
S=2*PI*T[i] ;
A.Zahi/DI/FSTF
79
Exemple
#include <stdio.h>
#define CAP 10
void main()
{
int T[CAP], n, s, d ;
/* Saisie du tableau */
printf (’’entrer la taille du tableau :’’) ;
scanf(’’%d’’, &n) ;
Remarques
• La conversion n’a lieu que pour les identificateurs des tableaux qui
apparaissent dans une expression et non lors de la déclaration.
A.Zahi/DI/FSTF
80
peut rien lui affecter, néo moins on peut créer un pointeur variable qui
pointe vers le premier élément.
int tab[10] ;
int * ptr_tab ;
ptr_tab=tab ;
tab= ptr_tab
Les éléments d’un tableau sont stockés en mémoire les un à la suite des
autres et le nom du tableau contient l’adresse du premier élément. Pour accéder à
un élément du tableau on doit donc se positionner à son adresse. Pour cela le
nom du tableau doit être incrémenté ou décrémenté, i.e., augmentée ou diminuée
par la taille du type des éléments du tableau, jusqu’à atteindre l’élément cherché.
Exemple
#include <stdio.h>
#define CAP 10
void main()
{
int T[CAP], n, s, d ; *p ;
/* Saisie du tableau */
printf (’’entrer la taille du tableau :’’) ;
scanf(’’%d’’, &n) ;
p=T;
for (int i=0 ;i<n ; i++)
{
printf("Donner T[%d] : ",i) ;
scanf("%d", p]) ;
p++ ;
}
/* Recherche des diviseurs */
p=T;
for (int i=0 ;i<n ; i++)
{
s=1 ; d=2 ;
while (d<=*p)
{
if(*p % d==0)
s += d ;
d++;
}
*p=s ;
}
/* Affichage du tableau */
p=T ;
for (int i=0 ;i<n ; i++)
{
printf (’’T[%d] = %d ’’, i, *p) ;
p++;
}
}
A.Zahi/DI/FSTF
81
Comme on a déjà vu, le nom d’un tableau est un pointeur vers le premier
élément. Par suite pour accéder à sa valeur on doit utiliser l’opérateur *. Ainsi, si
t est un tableau alors *t représente le premier élément de t et pour accéder au ieme
élément du tableau on doit incrémenter le non du tableau de i i.e., utiliser
l’expression *(t+i). Ainsi l’expression t[i] est équivalente à *(t+i).
Exemple
Ce programme permet de saisir un tableau d’entiers, de remplacer chaque
élément par la somme de ses diviseurs et d’afficher le tableau résultant.
#include <stdio.h>
#define CAP 10
void main()
{
int t[CAP], n, S, d ;
/* Saisie du tableau */
printf (’’entrer la taille du tableau :’’) ;
scanf(’’%d’’, &n) ;
for (int i=0 ;i<n ; i++)
{
printf(’’Donner t[%d] : ’’,i) ;
scanf(’’%d’’, t+i) ;
}
/* Recherche des diviseurs */
for (int i=0 ;i<n ; i++)
{
s=1 ;
d=2 ;
while (d<=*(t+i))
{
if(*(t+i)%d==0)
s += d ;
d++;
}
*(t+i)=s ;
}
/* Affichage du tableau */
for (int i=0 ;i<n ; i++)
printf (’’t[%d] = %d\t ’’, i, *(t+i)) ;
}
Syntaxe
/* déclaration d’un tableau dynamique */
nomtype *tab ;
A.Zahi/DI/FSTF
82
Exemple
int *t ;
double *d ;
char *c ;
/* allocation de l’espace à un tableau de 10 entiers */
t = (int ) malloc(10 * sizeof(int));
Syntaxe
Déclaration de la fonction
• La taille n’est pas modifiée par la fonction
Appel de la fonction
type tab[10] ;
int n ; /* taille du tableau */
nom_fonc1(t,n) ;
nom_fonc2(t,&n) ;
Remarques
A.Zahi/DI/FSTF
83
• La fonction peut avoir un effet sur tous les éléments du tableau, mais pas
sur la valeur du paramètre qui est de type pointeur i.e., l’adresse du
premier élément ne change pas par la fonction. Par exemple, Après l’appel
de la fonction :
#include <stdio.h>
#define CAP 10
/*********************************************************/
/* FONCTION SAISIE */
/*********************************************************/
void Saisie (int t[], int n)
{
int i;
for (i=0 ;i<n ; i++)
{
printf(’’Donner t[%d] : ’’,i) ;
scanf(’’%d’’, t+i) ;
}
}
/*********************************************************/
/* FONCTION AFFICHAGE */
/*********************************************************/
void Affichage (int *t, int n)
{
int i;
for (int i=0 ;i<n ; i++)
printf (’’t[%d] = %d\t ’’, i, *(t+i)) ;
}
/*********************************************************/
/* FONCTION DIVISEUR */
/*********************************************************/
void Diviseur (int t[CAP], int n)
{
int i, s, d;
for (int i=0 ;i<n ; i++)
{
s=1 ;
d=2 ;
while (d<=*(t+i))
{
if(*(t+i)%d==0)
s=s+d ;
d++;
}
*(t+i)=s ;
}
}
A.Zahi/DI/FSTF
84
/*********************************************************/
void main()
{
int t[CAP], n;
/* Saisie du tableau */
printf (’’entrer la taille du tableau :’’) ;
scanf(’’%d’’, &n) ;
Saisie(t,n) ;
/* Recherche des diviseurs */
Diviseur (t,n) ;
/* Affichage du tableau */
Affichage (t,n) ;
}
21
… 1er ère ligne
3
14
…. 2 ème ligne
Tableau
.25
.
12
… dernière ligne
20
A.Zahi/DI/FSTF
85
Exemple
Pour stocker les notes des 12 modules, d’une section de la fst, on utilise un
tableau de dimension n et 12, où n est le nombre d’étudiants dans la section. Une
ligne du tableau représente les notes d’un étudiant dans les 12 modules. Une
colonne représente les notes de tous les étudiants dans un module.
M1 M2 . . . M12
E1 12 09 . . . 16
E2 05 14 . . . 12
.
.
.
En 13.5 15 . . . 16
2.1. Déclaration
Syntaxe
Exemple
/* matrice d’entiers de 7 lignes et 6 colonnes */
int matrice[7][6] ;
2.2. Initialisation
Exemple
A.Zahi/DI/FSTF
86
Chaque élément du tableau est identifié par deux indices qui indiquent sa
ligne et sa colonne, pour accéder à un élément on utilise l’opérateur d’indexation
avec la ligne et la colonne comme paramètres.
Syntaxe
nom_tableau [exp1][exp2] ;
exp1, exp2 sont des expressions délivrant des valeurs entières qui
indiquent respectivement la ligne et la colonne dans le tableau.
Exemple
notes[i][13]=moy;
}
/* Affichage de la moyenne de chaque étudiant */
A.Zahi/DI/FSTF
87
Exercice
Syntaxe
Déclaration de la fonction
type_retour fonc1(type_elem Mat[][MAX], int L, int M)
type_retour fonc2(type_elem Mat[][MAX], int *L, int *M)
Appel de la fonction
int L, M ;
type_elem Mat[MAXL][MAXC] ;
fonc1(Mat, L, M)
fonc2(Mat, &L, &M)
MAX est une constante qui indique la taille maximale d’une ligne.
Exemple
/**************************************************/
/* Fonction Saisie des notes */
/**************************************************/
void Saisie( float notes[][M_COL], int nl, int nc)
{
A.Zahi/DI/FSTF
88
/**************************************************/
/* Fonction Calcul de la moyenne générale */
/**************************************************/
void Cal_Moy (float notes[][M_COL], int nl, int *nc)
{
for (i=0 ; i<nl ;i++)
{
moy =0.0 ;
for j=0 ; j< *nc ; j++)
moy += notes[i][j];
notes[i][13]=moy;
}
*nc = *nc +1 ;
}
/****************************************************/
/* Fonction Calcul du nombre de modules non validé */
/****************************************************/
void Cal_nmnv (float notes[][M_COL], int nl, int *nc)
{
int nm_nv;
for (i=0 ; i<ne ;i++)
{
nm_nv = 0 ;
for j=0 ; j<12 ; j++)
if (notes[i][j]< 7)
nm_nv += 1;
notes[i][14]=nm_nv;
}
*nc = *nc +1 ;
}
/****************************************************/
/* Fonction Affichage du tableau */
/****************************************************/
void affiche (float notes[][M_COL], int nl, int nc)
{
A.Zahi/DI/FSTF
89
3. Chaînes de caractères
Une chaîne de caractères est une suite de caractères. En C, bien qu’il existe
une bibliothèque qui permet de gérer les chaînes de caractères, il n’existe aucun
type qui permet de les représenter. Une chaîne de caractères est donc représentée
par un tableau de caractères. Le tableau peut être statique ou dynamique.
3.1. Déclaration
Syntaxe
char chaine[nb_caractere] ;/* représentation statique */
char * chaine ; /* représentation dynamique */
Remarque
Dans le cas d’une représentation dynamique un espace mémoire doit être
réservé à la chaîne, à l’aide de la fonction malloc, avant toute utilisation :
char * ch ;
ch = (char *) malloc(nb_caractere * sizeof(char)) ;
Exemples
char Nom[7] ;/* peut contenir un nom de 7 caractères */
char* prenom
3.2. Initialisation
• Dans le premier cas il ne faut pas oublier le caractère ’\0’ qui indique la
fin de la chaîne.
A.Zahi/DI/FSTF
90
Syntaxe
/* prototype */
int puts (const char *ch);
int printf (const char *format, ch1, ch2,..., chn) ;
/* appel */
char *ch = " c’est moi" ;
puts(ch) ;
printf("%s ", ch) ;
Exemple
#include <stdio.h>
main()
{
puts(vert1);
puts(vert2);
puts(vert3);
printf("\n\n");
printf ("%s\n%s\n%s\n", vert4, vert5, vert6);
printf("\n\n");
puts(auteur);
}
A.Zahi/DI/FSTF
91
Syntaxe
/* prototype */
char* gets (char * ch);
int scanf (const char * format, ch1, ch2,..., chn) ;
/* appel */
char ch[10] ;
gets(ch) ;
scanf("%s", ch) ;
Exemple
#include <stdio.h>
#include <stdlib.h>
main()
{
char nom[14] ;
char *plainte ;
Syntaxe
/* prototype */
int strlen(const char * ch) ;
/* appel */
char* ch1;
char ch2[20] ;
A.Zahi/DI/FSTF
92
Exemple
#include <stdio.h>
#include <string.h>
main()
{
char section[] = "Maitrises IEEA et TELECOM";
printf("Longueur :%d\n", strlen(section));
}
Syntaxe
/* prototype */
char * strcpy( char * dest, char* source) ;
/* appel */
char * dest, *source ;
strcpy(dest, source) ;
Remarque
Exemple
#include <stdio.h>
#include <string.h>
main()
{
char dest[10];
char source[] = "Bonjour toto";
strcpy(dest, source);
printf("source : %s\n", source );
printf("copie : %s\n", dest);
printf("%s\n", dest);
}
A.Zahi/DI/FSTF
93
3.3.5. Concaténation
Syntaxe
/* prototype */
char * strcat( char * dest, char* source) ;
/* appel */
char * dest, *source ;
strcat(dest, source) ;
Exemple
#include <stdio.h>
#include <string.h>
main()
{
char st[25];
char espace[] = " ", s[] = "salut", t[] = "toto";
strcpy(st, s);
strcat(st, espace);
strcat(st, t);
3.3.6. Comparaison
Syntaxe
/* prototype */
int strcpy( char * s1, char* s2) ;
/* appel */
char * s1 , *s2 ;
int res= strcmp(s1, s2) ;
A.Zahi/DI/FSTF
94
Exemple
#include <string.h>
#include <stdio.h>
main()
{
char s1[] = "aaa", s2[] = "bbb", s3[] = "ccc";
int ptr;
ptr = strcmp(s2, s1);
if (ptr > 0)
printf("s2 est plus grande que s1 \n");
else
printf("s2 est plus petite que s1 \n");
if (ptr > 0)
printf("s2 est plus grande que s3 \n");
else
printf("s2 est plus petite que s3 \n");
Exercices
Ecrire les fonctions qui permettent de réaliser les fonctions : strlen, strcmy, stcat,
et strcmp.
A.Zahi/DI/FSTF
95
Chapitre 3: Structures
Dans les chapitres précédents, nous n’avons utilisé que des objets simples
dont le type est prédéfini par le langage. Pour représenter des objets complexes
et hétérogènes, le langage C offre des mécanismes, tels que les structures et les
énumérations, qui permettent de construire de nouveaux types à partir des types
de base. Lors de la manipulation de ces constructeurs, Il faut distinguer entre la
construction et l’exploitation :
Syntaxe
#include <stdio.h>
#include <stdlib.h>
/* le nom de l’étudiant */
string nom;
nom = (string) malloc(10*sizeof(char));
A.Zahi/DI/FSTF
96
2. Enumérations
2.1. Définition d’une énumération
Syntaxe
typedef enum
{
enum_1,
enum_2,
.
.
enum_n,
} nom_enumeration ;
Exemples
A.Zahi/DI/FSTF
97
Exemples
1. Recherche séquentielle dans un tableau
#include <stdio.h>
typedef enum
{
vrai,
faux
} bool;
main()
{
int tab[10], n, i, v;
bool trouve;
printf(" Saisir la taille du tableau: ");
scanf("%d", &n);
for (i=0; i<n; i++)
{
printf("saisir tab[%d] = ", i);
scanf("%d", &tab[i]);
}
printf("Saisir la valeur v: ");
scanf("%d", &v);
i=0; trouve = faux;
while( i <=n && trouve == faux)
{
if(tab[i] == v) trouve = vrai;
i++;
}
if (trouve == vrai)
printf(" %d se trouve dans la case %d", v,i);
else
printf(" %d n'appartient pas au tableau", v);
}
A.Zahi/DI/FSTF
98
2. feu de circulation
#include <stdio.h>
typedef enum
{
rouge,
vert,
jaune,
} couleur;
void main()
{
couleur c;
printf("Saisir la couleur\n rouge: 0\n vert : 1 \n
jaune: 2\n\n choix: ");
scanf("%d",&c);
switch(c)
{
case rouge :printf("\n Arrêter ");
break;
3. Les Structures
Syntaxe
typedef struct
{
type_1 nom_champ_1 ;
type_2 nom_champ_2 ;
.
.
type_n nom_champ_n ;
} ; nom_structure
A.Zahi/DI/FSTF
99
Exemples
typedef struct
{
float real ;
float img ;
} complexe;
typedef struct
{
int annee;
int mois;
int jour;
} date;
typedef struct
{
float x ;
float y ;
} point;
3.2. Déclaration
La déclaration d’une variable d’un type construit obéit aux mêmes règles et
à la même syntaxe que celles des types de bases.
Syntaxe
• Variables statiques
nom_structure s1, s2 ;
• Variables dynamiques
A.Zahi/DI/FSTF
100
Exemples
complexe z1, z2 ;
complexe *z3, *z4 ;
z3= &z1 ;
z4= (complexe*) malloc(sizeof(complexe)) ;
Les structures peuvent être manipulées soit membre par membre ou comme
une entité indépendante.
Syntaxe
Saisie :
scanf("%c", &nom_structure.nom_champs) ;
scanf("%c", &nom_structure->nom_champs) ;
avec c, le spécificateur de format associé au type du champ.
Affichage :
printf("%c", nom_structure.nom_champs) ;
printf("%c", nom_structure->nom_champs) ;
avec c, le spécificateur de format associé au type du champ.
Affectation
nom_structure.nom_champs)= expression ;
nom_structure->nom_champs)= expression ;
A.Zahi/DI/FSTF
101
Exemple
Ce programme saisit deux complexes, calcul leur somme et leur produit et
affiche les résultas.
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
float real;
float img;
} complexe;
void main()
{
complexe z1;
complexe *z2;
complexe *som, prod;
/* saisie des variables*/
printf("\nSaisi du complexe z1\n");
printf("\tz1.real = "); scanf("%f",&z1.real);
printf("\tz1.img = "); scanf("%f",&z1.img);
printf("\nSaisi du complexe z2\n");
z2 =(complexe*) malloc(sizeof(complexe));
printf("\tz1.real = "); scanf("%f",&z2->real);
printf("\tz1.img = "); scanf("%f",&z2->img);
/* calcul de la somme de z1 et z2*/
som=(complexe*) malloc(sizeof(complexe));
som->real = z1.real + z2->real;
som->img = z1.img + z2->img ;
/* calcul du produit de z1 et z2 */
prod.real = (z1.real*z2->real - z1.img*z2->img);
prod.img = (z1.real*z2->img + z1.img*z2->real);
3.3.2. Initialisation
Une variable de type structure peut être initialisée lors de la déclaration par
une liste d’expressions constantes.
Syntaxe
typedef struct
{
type_1 nom_champ_1 ;
type_2 nom_champ_2 ;
.
.
type_n nom_champ_n ;
} nom_structure;
A.Zahi/DI/FSTF
102
Exemple
complexe z1 = {8.,10.};
complexe z2 = {9.25,5.2};
3.3.3. Affectation
Syntaxe
typedef struct
{
type_1 nom_champ_1 ;
type_2 nom_champ_2 ;
.
.
type_n nom_champ_n ;
} nom_structure;
nom_structure s1, s2 ;
s1 = s2;
Syntaxe
typedef struct
{
type_1 nom_champ_1 ;
type_2 nom_champ_2 ;
.
.
type_n nom_champ_n ;
} nom_structure;
Prototype de la fonction
A.Zahi/DI/FSTF
103
Appel de la fonction
nom_structure *s1, s2, s3 ;
fonc1(*s1) ;
fonc1(s2) ;
fonc2(s1) ;
fonc2(&s2) ;
s3 = fonc3(…) ;
Exemple
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
float real;
float img;
} complexe;
/* fonction saisie d'un complexe*/
void saisie(complexe *z)
{
printf("\treal = "); scanf("%f",&z->real);
printf("\timg = "); scanf("%f",&z->img);
}
/* fonction calcul de la somme*/
void somme(complexe z1, complexe z2, complexe *s)
{
s->real = z1.real + z2.real;
s->img = z1.img + z2.img ;
}
/* fonction calcul du produit*/
complexe produit(complexe z1, complexe z2)
{
complexe p;
p.real = (z1.real*z2.real - z1.img*z2.img);
p.img = (z1.real*z2.img + z1.img*z2.real);
return p;
}
/* fonction affichage */
void affiche(complexe z)
{
if(z.real == 0)
if(z.img == 0)
printf("0");
else
if(z.img == 1)
printf("i");
else
printf("i%1.2f",z.img);
else
if(z.img == 0)
printf("%10.2f", z.real);
else
if(z.img == 1)
printf("%1.2f + i",z.real);
else
printf("%1.2f + i%1.2f",z.real,
z.img);
}
A.Zahi/DI/FSTF
104
void main()
{
complexe z1;
complexe *z2;
complexe *som, prod;
/* saisie de complexe*/
printf("\nSaisi du complexe z1\n");
saisie(&z1);
z2 =(complexe*) malloc(sizeof(complexe));
printf("\nSaisi du complexe z2\n");
saisie(z2);
/* calul du produit de z1 et z2 */
prod = produit(z1,*z2);
printf("\n");
printf("Somme = ");affiche(*som);
printf("\nProduit = ");affiche(prod);
}
Un tableau de structure est un tableau dont les éléments sont des structures.
Syntaxe
typedef struct
{
type_1 nom_champ_1 ;
type_2 nom_champ_2 ;
.
.
.
type_n nom_champ_n ;
} nom_structure;
nom_structure T[CAP];
T le nom du tableau.
T[i].nom_champ_j.
A.Zahi/DI/FSTF
105
Exemple
typedef struct
{
float real;
float img;
} complexe;
A.Zahi/DI/FSTF
106
/* function maximum */
int Max_Mod(complexe T[], int n)
{
int ind;
float max;
max =-1;
ind = 0;
for (i=0; i<n; i++)
{
mod = module(T[i]);
if (mod > max)
{
max= mod;
ind = i;
}
return ind;
void main()
{
complexe Tab[CAP];
int i,ind,n;
float mod, max;
printf("saisir la taille du tableau");
scanf("%d", &n);
saisieTab(Tab,n);
ind = Max_Mod(Tab, n);
affiche(Tab[ind]);
}
Syntaxe
typedef struct
{
type_1 nom_champ_1 ;
type_tab T[10];
.
.
.
type_n nom_champ_n ;
} nom_structure ;
A.Zahi/DI/FSTF
107
#include <stdio.h>
typdef struct
{
char nom[10] ;
int CNE;
float mod [12] ;
float Moy ;
} etudiant;
/* admission */
void admis(etudiant etu)
{
if ( etu.moy >=10)
return 1 ;
else
return 0
}
void main()
{
etudiant e;
saisi(&e);
cal_moy(&e);
if( admis(e))
printf ("Admis") ;
else
printf ("Ajourné ") ;
}
A.Zahi/DI/FSTF
108
Syntaxe
typedef struct
{
type_1 nom_champ_1 ;
.
.
type_n nom_champ_n ;
} st_memmbre ;
typedef struct
{
type_1 nom_champ_1 ;
st_membre s1;
st_membre s2;
.
.
.
type_n nom_champ_n ;
} nom_structure;
Exemple
#include<stdio.h>
struct date
{
int jour ;
int mois ;
int annee ;
} ;
struct livre
{
char titre [30] ;
char auteur[14] ;
int code ;
date d_entrée ;
date d_sortie ;
} ;
A.Zahi/DI/FSTF
109
main()
{
livre L[50] ;
int n, i ;
char titre[30] ;
printf("Saisir le nombre de livres") ;
sacnf("%d ", &n) ;
A.Zahi/DI/FSTF
110
Chapitre 4: Fichiers
1. Définition
Il existe deux fichiers qui sont définis par défaut pour tous les
programmes : le fichier stdin, qui est associé avec l’entrée standard (le clavier) et
le fichier stdout qui est associé la sortie standard (l’écran).
2. Mémoire tampon
A.Zahi/DI/FSTF
111
Programme C
Instructions
+
Données
Mémoire tête
tampon l/e Support
de
stockage
Mémoire
centrale
3. Accès à un fichier
FILE* est un pointeur sur une structure déclarée dans le fichier en-tête
<stdio.h>. Cette structure contient les informations telles que l’adresse de la
mémoire tampon, la position courante de la tête de lecture/écriture, le type
d’accès au fichier, état d’erreur etc., Un programme doit déclarer un pointeur sur
cette structure pour pouvoir accéder aux fichiers.
Syntaxe
FILE * flot;
3.2. Ouverture/fermeture
Syntaxe
FILE *flot;
flot= fopen(non_physique, mode_ouverture) ;
fclose(flot) ;
A.Zahi/DI/FSTF
112
A.Zahi/DI/FSTF
113
Exemple
#include <stdio.h>
main(()
{
FILE * flot ;
flot= fopen(’’fichier.dat’’, ’’r’’) ;
if(flot==NULL)
printf(’’erreur d’ouverture ’’) ;
else
/* traitement sur le fichier*/
....
fclose(flot) ;
}
4. Lecture /écriture
4.1. Lecture et écriture par caractère
Syntaxe
FILE *flot;
int car ;
char car ; /* erreur */
car=fgetc (flot) ;
fputc(flot) ;
car est de type int, c’est le caractère à écrire dans le fichier ou dans
lequel on récupère le caractère lu à partir du fichier.
Exemple
#include <stdio.h>
main()
{
int car ;
FILE* f;
/* écriture dans le fichier test.dat*/
f= fopen ("test.dat", "w");
if(f != NULL){
while ( (car=getchar()) != '\n')
fputc(car,f );
}
fclose(f);
/* lecture du fichier test.dat*/
f= fopen ("test.dat", "r");
if(f != NULL)
{
while ( (car= fgetc(f)) !=EOF)
printf("%c" , car);
}
fclose(f);
}
A.Zahi/DI/FSTF
114
Syntaxe
FILE *flot;
char * chaine ;
fgets(chaine,nb, flot) ;
fputs(chaine, flot) ;
Exemple
#define BUFSIZE 10
#include <stdio.h>
main()
{
char* ch1="Abou Bakker Elkawarizmi\n";
char* ch2="Alain Turing \n";
char bf[BUFSIZ+1];
FILE* f;
/* écriture dans le fichier chaine.dat*/
f= fopen ("chaine.dat", "w");
if(f != NULL)
{
fputs(ch1,f);
fputs(ch2,f);
}
fclose(f);
/* lecture du fichier chaine.dat*/
f= fopen ("chaine.dat", "w");
if(f != NULL)
{
while (fgets (bf,sizeof(bf),f))
printf("%s\n",bf);
}
fclose(f);
}
A.Zahi/DI/FSTF
115
Syntaxe
format c’est une chaîne de caractère qui indique ce qui doit être
écrit ou lu. Cette chaîne contient des caractères constants et des
spécificateurs de formats commençant par le caractère %, décrivant
comment les paramètres var_i doivent être écrits
A.Zahi/DI/FSTF
116
#include <stdio.h>
struct Foncti
{
int Code;
float Sal;
char Nom[15];
};
A.Zahi/DI/FSTF
117
Syntaxe
fread(p, t , n, f) ;
fwrite(p, t , n, f) ;
#include <stdio.h>
struct Foncti
{
int Code;
float Sal;
char Nom[15];
};
/* écriture dans le fichier*/
void Ecriture(char * nom, Foncti, *fon)
{
f= fopen (nom, "w");
if(f != NULL)
fwrite (fon, sizeof(Foncti), 1,f);
fclose(f);
}
/* lecture à partir du fichier */
void lecture(char* nom, Foncti *g)
{
f= fopen (nom, "r");
if(f != NULL)
fread(g, sizeof(Foncti), 1,f);
fclose(f);
}
main()
{
Foncti fon ={145, 5000.00, "Ali"} , g;
FILE* f;
/* écriture dans le fichier fonc.dat */
Ecriture("fonc.dat",&fon)
/* lecture à partir du fichier fonc.dat */
lecriture("fonc.dat",&g)
printf("%d\n",g.Code);}
A.Zahi/DI/FSTF
118
int i;
FILE* f;
/* écriture du tableau dans le fichier */
EcrireTab("fonct.dat", fonc, 3) ;
fclose(f);
/* Lecture du tableau à partir du fichier */
Liretab("fonct.dat", d,3) ;
i=0 ;
while (i<3)
{
printf("%d%f%s\n",d[i].Code,d[i].sal,d[i].Nom);
i++;
}
}
5. Accès directe
Pour chaque fichier ouvert est associé un indicateur de position qui indique à
quel endroit du fichier aura lieu la prochaine opération (lecture/écriture). Cette
position est donnée en nombres d’octets à partir du début du fichier. Par défaut,
les fonctions précédentes travaillent en mode séquentiel, et mettent à jour cet
indicateur par incrémentation automatique. En effet, chaque lecture ou écriture
s’effectue à partir d’une position courante, et incrémente cette position du
nombre de caractères lus ou écrits.
A.Zahi/DI/FSTF
119
Syntaxe
rewind(f)
ftell(f) ;
fseek(f, dec, position)
#include <stdio.h>
#define PAS 10
char mess[]="abcdefghijklmnopqrstuvwxyz";
int main(void)
{
FILE *f;
char temp[PAS];
/* Ecriture dans le fichier */
f=fopen("text.txt","w");
if(f != NULL)
fprintf(f,"%s",mess);
fclose(f);
/* fonction ftell */
f=fopen("text.txt","r");
printf (" Avant la lecture\n \t position :%d\n",
ftell(f));
fgets(temp,PAS,f);
printf (" \n Apres la 1 er lecture\n");
printf("\t caractere :%s\t position : %d\n", temp,
ftell(f));
fgets(temp,PAS,f);
printf (" \n Apres la 2 eme lecture \n");
printf("\t caractere : %s \t position : %d\n", temp,
ftell(f));
fgets(temp,PAS,f);
printf (" \nApres la 3 eme lecture \n");
printf("\t caractere : %s \t position : %d\n", temp,
ftell(f));
A.Zahi/DI/FSTF
120
/* fonction rewind */
rewind(f);
printf ("\n Apres rewind, la position est: %d\n",
ftell(f));
fgets(temp,PAS,f);
printf (" \n1 er lecture Apres rewind \n");
printf("\t caractere : %s \t position : %d\n", temp,
ftell(f));
fclose(f);
getchar();
}
A.Zahi/DI/FSTF