Académique Documents
Professionnel Documents
Culture Documents
Langage C
Langage C
IEEA-TELECOM
Programmation en langage C
Zahi, Azeddine
2005-2006
A.Zahi/DI/FSTF
A.Zahi/DI/FSTF
Chapitre 0 : Introduction
lalgorithmique
1. Introduction
1.1. Dfinition
Un algorithme est une notion qui remonte trs loin, Il prend ses racines
dans le mot "Algorisme" introduit par le mathmaticien Persse AlKhawarsimi
dans son livre " hisabo aljabri wa almoqabala". Ce nest donc pas une notion
propre linformatique.
Un algorithme sert dans la rsolution dun certain nombre de problmes
tels que : chercher le plus grand commun diviseur de deux entiers, rsoudre un
systme linaires, rsoudre une quation diffrentielle, trouver le chemin
optimal dans une ville, chercher une stratgie pour attaquer un march financier
etc. Il permet de dcrire le processus rsolution de faon prcise et non
ambigu ne laissant place ni linterprtation ni lintuition.
Un algorithme est considr comme une suite finie et ordonne dactions
lmentaires, instructions, effectues sur des donnes pour aboutir des
rsultats. En gnral, il y a plusieurs algorithmes (plusieurs solutions) qui
rsolvent le mme problme. Le meilleur algorithme (solution optimale) est celui
qui contient moins dinstructions.
Donnes
Algorithme
Rsultats
A.Zahi/DI/FSTF
Partie dclaration
variables
Dclaration des variables
dbut
fin
Instructions
Partie traitement
Exemple
algorithme surface
constantes
PI = 3.14
rayon = 12.5
variables :
air : rel
dbut
air rayon*rayon*PI
ecrire(air)
fin
Conception
Variables : a,b, et pgcd : entiers
Algorithme
r a mod b
tant que (r != 0) faire
a b
b a div b
r a mod b
fintantque
2.
Deux types dobjets sont utiliss pour reprsenter les paramtres dun
problme dans un algorithme: les constantes et les variables. Une variable est un
objet qui peut changer de valeur au cours de lexcution de lalgorithme, tandis
quune constante ne change jamais de valeur.
Un objet est caractris par :
2.1. Identificateur
Un identificateur permet didentifier un objet parmi les autres objets. Cest
une suite de caractres alphanumriques qui respecte les contraintes suivantes:
Exemples
Identificateur valide
Salaire1
Etudiant
note_examen
Oprations arithmtiques : +, -, * et /.
Oprations de comparaison : <, , >, , = et .
2.3. Dclaration
La dclaration dun objet dans un algorithme consiste lui attribuer un
identificateur et un type.
A.Zahi/DI/FSTF
10
Exemples
PI=3.14
TVA = 0.2
G =9.8
Exemples
i,n
x,y
exist
rep, c
: entier
: rel
: boolen
: carcatre
2.4. Expressions
Une expression est une combinaison de valeurs, de constantes, de variables
et doprateurs. Le type de lexpression est dfini par celui des objets qui la
constituent. Selon le type de lexpression on peut distinguer trois catgories
dexpressions : expression arithmtique, expression logique et expression de
chane de caractre.
A.Zahi/DI/FSTF
11
Exemples
A 5
A B
A B+5
y ((n+10)*q)/t
cond_admis
(m
; avec
Nb_mod_val : le nombre de module valid et m la moyenne gnrale.
>=
10
et
Nb_mod_val
>
7)
Remarques
On peut par contre affecter une expression entire une variable relle.
A : entier
B, C : rels
A 12
B A div 2
C= 15
Exercices
1. Ecrire un algorithme qui permet d'changer le contenu de deux
variables A, B.
2. Ecrire un algorithme qui permet de permuter les contenues de trois
variables A, B, C.
A.Zahi/DI/FSTF
12
Exemple
algorithm lecture
variables
X :entier
Rayon : rel
C : caractre
debut
lire(X)
lire (rayon)
lire(c)
Fin
Exemples
algorithme ecriture
variables:
X :entier
Y :rel
Debut
Ecrire (" saisir la valeur de X")
Lire (X)
Y 2*X+1/X
Ecrire(" Valeur de Y = ", Y)
Fin
Exercices
1.
A.Zahi/DI/FSTF
13
2.
(a + b + c ) .
2
3.4. Choix
Une instruction de choix permet de choisir, suivant une condition, entre
deux ou plusieurs blocs d'instructions. Le choix peut se prsenter sous plusieurs
formes: sans alternative, avec alternative, imbrique ou multiple.
3.4.1. Choix sans alternative
Syntaxe
Instr_avant_si
si (condition) alors
Bloc_instrs
finsi
Instr_aprs_si
Condition est une expression logique, si elle est vraie alors on excute
les instructions Bloc_instrs, sinon on passe aux instructions suivantes.
A.Zahi/DI/FSTF
14
Instr_avant_si
Condition
vraie
Bloc_instrs
fausse
Instr_aprs_si
Exemples
1. Calcul de la valeur absolue d'un nombre rel.
Algorithme absolue
variables:
X, Val_X :rel
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
A.Zahi/DI/FSTF
15
Exercices
1. Ecrire un algorithme qui permet de saisir lentier n et le rel x et
dafficher la valeur de lexpression : ( 1)n * x .
2. Ecrire un algorithme qui saisit deux entiers et de les afficher dans lordre
dcroissant.
3. Ecrire un algorithme qui permet de saisir trois caractres et ne les
afficher que sils sont dans lordre alphabtique.
3.4.2.
Syntaxe
Instr_avant_si
si (condition) alors
Bloc_vraie
sinon
Bloc_fausse
finsi
Instr_aprs_si
Instr_avant_si
fausse
Condition
Bloc_fausse
vraie
Bloc_vraie
Instr_aprs_si
A.Zahi/DI/FSTF
16
Exemples
1. Une droite est dfinie par deux points, A = (x1 , y1 ) et B = (x 2 , y 2 ) ,
lalgorithme ci-dessous saisit les points, A , B et P = (x , y ) , et dcide si le
point P appartient la droite ( AB ) .
Algorithme disible
variables:
x, y, xa, ya, xb, yb :rels
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 nappartient pas la droite")
finsi
Fin
x et y")
0 ) alors
x, "est divisible par", y)
x, "nest divisible par", y)
Exercices
1. Ecrire un algorithme qui saisit deux entiers, a et b , et qui affiche
lexpression b = a * q + r avec p et r le rsultat de la division entire de
b par a . Il faut prendre en considration la cas o b est divisible par a .
Exemples
15 = 7* 2 + 1
10 = 5*2
2. La fonction caractristique de un intervalle I = [a , b] est dfinie par :
1, si x I
. Ecrire un algorithme qui saisit un rel x et qui affiche
0, sinon
(x ) =
la valeur de (x )
17
5. Trois nombres positifs peuvent reprsenter les cots dun triangle dans
la mesure o chacun dentre eux est infrieur la somme des deux
autres. Ecrire un algorithme qui saisit les trois nombres et affiche si on
peut construire un triangle avec.
3.4.3.
Choix imbriqu
Dans lun des blocs dune 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_aprs
A.Zahi/DI/FSTF
18
C1
C5
C2
Bloc52
Bloc51
C3
Bloc2
F
Bloc3
C4
v
Bloc4
Exemple
Calcul du maximum de trois nombres entiers a, b et c saisir. La solution peut
tre reprsent par larbre suivant :
a>b
V
a>c
V
Max=a
b>c
F
Max= c
Max=b
Max= c
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 rels, crire un algorithme qui permet de rsoudre
dans IR lquation: a X2 + b X + c = 0. Etudier tous les cas.
2. Ecrire un algorithme qui permet de saisir cinq rels x , a , b , c , d , et
dafficher limage de x par la fonction reprsente par le graphe
suivant :
1
Mention
Trs Bien
Bien
Assez Bien
Passable
affiche la mention
20
3.4.4.
Choix multiple
: Bloc_1
: Bloc_2
...
val_n
:Bloc_n
autrement : Bloc_a
finselon
Instr_aprs_selon
Evaluation de lexpression
val_1
val_2
Bloc_1
Bloc_2
val_n
Bloc_n
autrement
Bloc_a
Instr_aprs_selon
Exemple
Selon la couleur du feu de circulation, Rouge, Vert ou Jaune, un chauffeur
excute les oprations, Arrter, Avancer ou Ralentir, lalgorithme ci-dessous
permet de simuler le comportement du chauffeur. A chaque couleur on associe
un entier entre 0 et 2 et suivant la valeur saisie on excute l'action approprie.
A.Zahi/DI/FSTF
21
Algorithme Feu
variables:
Couleur: entier
debut
Ecrire (" Quel est la couleur
Lire (Couleur)
Selon (Couleur)
0
: Ecrire ("
1
: Ecrire ("
2
: Ecrire ("
autrement : Ecrire ("
finselon
Fin
du feu")
Arrter ")
Avancer ")
Ralentir ")
Feu en panne")
Exercices
1. Une exploitation agricole utilise un robot pour contrler la temprature
de ses serres. Selon le temps quil fait, Pleut, chaud, froid, beau, le
robot excute les oprations, Fermer la serre,
Dclancher le
ventilateur, Dclancher le chauffage, Ouvrir la serre.
Ecrire un algorithme qui permet de simuler le fonctionnement dun
robot.
2. Dans un magasin, le prix de vente dun produit est calcul par la
formule: Prix_ttc = prix_ht + (tva * prix_ht). Cinq classes de tva sont
dfinies selon lindice du produit.
Indice
1
2
3
4
5
tva
0
0.05
0.1
0.15
0.2
Ecrire un algorithme qui saisit le prix hors taxe prix_ht et lindice dun
produit indice, calcule et affiche le prix_tcc quivalent.
3. Un garagiste utilise un code pour chaque activit du garage. CODE=1
pour la vente des voitures neuves, CODE=2 pour la vente des voitures
doccasion, CODE=3 pour la vente des pices dtaches et CODE=4
pour la rparation des voitures. La commission dun employ est
calcule sur chaque activit de la manire suivante : sur une voiture
neuve, 2% du prix de vente mais avec un maximum de 5000DH, sur une
voiture doccasion, 5% du prix de vente mais avec un minimum de
500DH,sur les pices dtaches 6% du prix total et enfin sur la
rparation dune voiture 10% du prix de la main duvre.
Ecrire un algorithme qui saisit le code de lactivit et le prix
correspondant et qui affiche la commission.
A.Zahi/DI/FSTF
22
3.5. Rptition
3.5.1. Prsentation des boucles
Une boucle est une instruction qui permet de dcrire une rptition dans un
algorithme. Elle consiste rpter lexcution dun bloc dinstructions, appels
corps de la boucle, un certain nombre de fois, une excution du bloc sappelle
itration. Il existe trois formes de boucles : tant que, rpter et pour, chacune est
caractrise par les lments suivants :
Une condition darrt, c'est une expression logique qui permet l'arrt de
la boucle, une fois le nombre d'itrations est achev.
3.5.2.
Syntaxe
Instr_avant
Bloc
Instr_aprs
A.Zahi/DI/FSTF
23
Instr_avant_tantque
Condition
vraie
Corps de la boucle
fausse
Instr_aprs_tantque
Premier cas : le nombre ditration est connu lavance. Dans ce cas nous
aurons besoin des lments suivants :
A.Zahi/DI/FSTF
24
Exemples
n
i
i =1
algorithme somme
variables :
n,s,i :entier
dbut
Ecrire ("Saisir n")
lire (n)
i 1
s 0
tantque(in) faire
s s+i
i i+1
fintantque
crire ("Somme=", s)
fin
25
O/N"),
fintantque
Exemple
Un client achte plusieurs produits o chaque produit est caractris par la
quantit achete qa et son prix unitaire pu . Etablir l'algorithme qui calcul
et qui affiche le montant total payer par un client. Le montant d'achat d'un
seul produit est donn par la formule mp = qa * pu .
Algorithme client
Variables
Rep : caractre
MT, mp, pu : rel
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
26
Exercices
1. Ecrire un algorithme qui calcul x n , avec x et n sont donns.
2.
3.
4.
1
a
xn = 2 xn 1 + x
n 1
a.
5.
F0 = 0, F1 = 1
Fn + 2 = Fn +1 + Fn
La suite Dn =
Fn +1
converge vers un nombre , appel nombre
Fn
7.
3.5.3.
Boucle rpter
Syntaxe
Intsr_avant
rpter
Bloc
Jusqu (Condition)
Instr_aprs
27
Instr_avant_repeter
Corps de la boucle
fausse
Condition
vraie
Instr_aprs_repeter
Premier cas : le nombre ditrations est connu lavance. Dans ce cas nous
utilisons les mmes lments que ceux de la boucle tant que, seule la
condition darrt est diffre, elle devient (C > N + Vin -1). Ainsi, on
obtient la partie de lalgorithme suivante:
C Vin
rpter
Bloc
C C+1
Jusqu (C > N+Vin-1)
Exemples
n
i
i =1
algorithme somme
variables :
n,s,i :entier
dbut
Ecrire ("Saisir n")
lire (n)
i 1
s 0
rpter
s s+i
i i+1
Jusqu( i>n)
crire ("Somme = ", s)
fin
A.Zahi/DI/FSTF
28
2. Calcul du nombre dentiers < n qui sont divisibles par un entier k saisi.
algorithme combien
variables :
nb,n,k,i :entier
dbut
Ecrire ("Saisir n et k ")
lire (n, k)
i 1
nb 0
repter
si (i mod k = 0)
nb nb + 1
finsi
i i+1
jusqu (i>n)
crire ("le nombre est :", nb)
fin
O/N"),
jusqu (Rep="N")
Exemple
Un client achte plusieurs produits o chaque produit est caractris par la
quantit achete qa et son prix unitaire pu . Etablir l'algorithme qui permet
de calculer et afficher le montant total payer par un client. Le montant
d'achat d'un seul produit est dfini par mp = qa * pu .
Algorithme client
Variables
Rep : caractre
MT, mp, pu : rel
Debut
MT 0
Rep '0'
rpter
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
Exercices
Refaire les exercices de la page 23 en utilisant la boucle rpter.
3.5.4.
Boucle pour
Syntaxe
Instr_avant
pour i
allant de vi
faire
finpour
vf
Bloc
ou de faon gnrale
pour
i allant de
faire
Bloc
finpour
vi
vf incrment/dcrment
pas
Instr_aprs
30
Instr_avant_pour
I val_initiale
incrment
vraie
I <= val_finale
Corps de la boucle
fausse
Instr_aprs_pour
Exemples
1. Affichage des nombres pairs infrieurs n
algorithme pair
variables :
n,i :entiers
dbut
ecrire("saisir n")
lire (n)
pour i allant de 2 n incrment pas = 2
faire
ecrire (i)
finpour
fin
n
i
i =1
algorithme somme
variables :
n,s,i :entier
dbut
Ecrire ("Saisir n")
lire (n)
s 0
pour I allant de 1 n
faire
s s+i
finpour
crire ("Somme=', s)
fin
A.Zahi/DI/FSTF
31
Exercices
1. Ecrire un algorithme qui permet de calculer n! , n est saisi au clavier.
2. Ecrire un algorithme qui permet de calculer x n , n et x sont saisis au
clavier.
3. Ecrire un algorithme qui permet dafficher les entiers infrieurs n qui
sont divisibles par un entier k saisi au clavier. Donner les formes.
4. Ecrire un algorithme qui permet dafficher les diviseurs dun entier n
saisi au clavier.
5. On suppose quon ne dispose pas de loprateur *, crire un algorithme
qui permet de calculer le produit deux entiers.
6. Un triplet ( p , q , r ) dentiers naturels est dit pythagoricien si et seulement
si p 2 + q 2 = r 2 . Ecrire un algorithme qui permet dafficher tous les
triplets pythagoriciens ( p , q , r ) , avec, p et q < n , n saisi au clavier.
7. Ecrire un algorithme qui permet de calculer la valeur de la fonction
f n (x ) =
i =n
i!
, x et n saisis au clavier.
i =1
A.Zahi/DI/FSTF
32
1. Elments lexicaux
1.1. Identificateurs
Un identificateur est une suite de caractres alphanumriques, qui permet
de dsigne les objet dun programme, plus prcisment: les variables, les
constantes symboliques, les fonctions et les types construits par le
programmeur. Le choix dun identificateur doit obier aux rgles suivantes :
2.
Mots cls
auto, register, static, extern, typedef
char, double, enum, float, int, long, short,
signed, struct, union, unsigned, void
const, volatile
break, case, continue, default, do, else, for,
goto, if, switch, while
return, sizeof
A.Zahi/DI/FSTF
33
[directives de compilation]
[dclarations des variables globales]
[dclarations des fonctions]
void main()
{
dclarations des variables locales
Instructions
}
*/*/
2.2. Instructions
2.2.1. Instructions directement excutables
Remarques
34
Exemple
/* Inclusion du fichier dentres sorties standard*/
#include <stdio.h>
#include <stdlib.h>
/* definition dune pseudo-constante*/
#define PI 3.14
/* definition dune pseudo-fonction*/
#define CARRE(x) ((x)*(x))
void main()
{
int n=25 ;
float rayon ;
printf(donner le rayon du cercle) ;
scanf(%f, &rayon) ;
surface = PI*rayon *rayon ;
printf(S = %f , surface) ;
ptintf("carre de n = %d", CARRE(n)) ;
}
2.3. Fonctions
Lune des caractristiques du langage C est quil est compos par une ou
plusieurs fonctions. Une fonction est une entit indpendante forme par un
ensemble dinstructions et qui effectue une tche bien prcise, on distingue
trois types de fonctions :
A.Zahi/DI/FSTF
35
A.Zahi/DI/FSTF
36
Editeur de texte
.cpp .c
format ASCII
Prprocesseur
Traitement des
directives de
compilation
Compilation et
gnration du code
objet
Compilateur
.obj
format binaire
Inclusion du
code objet des
fichiers inclus
Gnration du
code excutable
.exe
format binaire
A.Zahi/DI/FSTF
37
Un mot cl.
3.1.1.
Les caractres
Le type caractre est dsign par le mot cl char, les valeurs prises par les
objets de ce type sont le jeu de caractres de la machine utilise. Chaque objet
est cod sur 1 octet.
3.1.2.
Les entiers
Ces attributs peuvent tre combins pour former plusieurs types numriques :
Mot cl
Description
Valeur min
Valeur max
Taille en octets
Int
short int
long int
unsigned int
entier standard
entier court
entier long
entier standard non
sign
entier court non
sign
entier long non
sign
-32768
-32768
-2147483548
0
32767
32767
2147483547
65535
2 octets
2 octets
4 octets
2 octets
65535
2 octets
4294957295
4 octets
unsigned
short int
unsigned long
int
3.1.3.
Les rels
Les rels sont caractriss par leur prcision (nombre de chiffre aprs la
virgule). Le langage C dispose de trois types de rels suivant la prcision
dsire. Le tableau suivant montre leurs caractristiques.
Mot cl
Valeur min
Valeur max
Taille
float
double
long double
3.4*10-38
1.7*10-308
3.4*10-4932
3,4*1038
1.7*10308
1.1*104932
4 octets
8 octets
10 octets
A.Zahi/DI/FSTF
38
3.2. Variables
Une variable est un emplacement mmoire dont la valeur peut changer au
cours de lexcution du programme.
3.2.1.
Dclaration
Une variable doit faire lobjet dune dclaration avant toute utilisation. Ce la
consiste spcifier son type et son nom.
Syntaxe
type id1, id2,...,idn ;
type est lun 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
Exemple
void main()
{
int compteur = 0 ;
float hauteur = 3.14 ;
char Rep = O;
}
Remarque
Une variable peut tre dclare plusieurs niveaux dun programme : dans
un fichier externe, dans la fonction main, dans une fonction secondaire ou dans
bloc dinstructions.
A.Zahi/DI/FSTF
39
4. Les constantes
4.1. Constantes littrales
Cest une valeur qui apparat littralement dans le code source dun
programme, le type de la constante dpend de son criture.
4.1.1.
Constantes rels
Les constantes rels ou encore les constantes flottantes sont reprsents par
la notation mantisse-exposant, lexposant est dsign par la lettre e ou E.
Remarque
Une constante relle est par dfaut de type double. Pour la forcer avoir
une reprsentation sous forme dun float (resp. long double) on doit laffecte
de lattribut f ou f(resp. L).
Exemples
4.1.2.
Constante
type
15.25
15.2e-4
15.25f
15.25l
double
double
float
long double
Constantes entires
Les constantes entires peuvent sexprimer dans les systmes dcimal, octal
ou hexadcimal.
Notation dcimal : la constante est une suite qui commence par un chiffre
diffrent de 0, suivie de chiffres entre 0 et 9.
Notation octal : La constante est une suite qui commence par le chiffre
zro 0, suivie de chiffres entre 0 et 7.
Remarque
Une constante entire est par dfaut de type int. Pour forcer la constante
avoir une reprsentation sous forme dun entier long : long int (resp court) on
doit laffecter de lattribut l ou L (resp. de u ou U).
A.Zahi/DI/FSTF
40
Exemples
4.1.3.
Constante
type
2001
02589
0x4D7
12458798L
1247U
12458798UL
int
int /*octal*/
int /*hxadcimal*/
long int
unsigned int
Unsigned long int
Constantes caractres
Les constantes de type caractre sont assimiles un entier sur un octet dont
la valeur correspond la position du caractre dans la table ASCII.
4.1.4.
Constante
Nom
\n
\t
\v
\b
\r
\f
\a
Retour la ligne
Tabulation horizontale
Tabulation verticale
Retour arrire
Retour chariot
Saut de page
Signal dalerte
Remarque
Il ne faut pas confondre a qui est une constante caractre et a qui est
une constante chane de caractres.
A.Zahi/DI/FSTF
41
Pseudo-constantes
Cest une constante dont le nom est attribu par la directive #define. Le
prprocesseur remplace chaque occurrence du nom par la valeur de la constante
sans aucune vrification 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
4.2.2.
Constantes variables
Cest une constante dclare comme une variable dont on ne peut pas
modifier le contenu au cours du programme. Elle occupe donc un espace en
mmoire centrale.
A.Zahi/DI/FSTF
42
Syntaxe
const type id = valeur;
Exemple
void main()
{
float s,r=11.6;
const float PI=3.14
s= PI*r*r ;
}
5.
Le texte afficher.
43
Symbole
Type
Impression comme
%d ou %i
int
%u
int
%o
int
%x
int
%c
int
%f
double
%e
double
%s
char*
entier relatif
entier naturel (unsigned)
entier exprim en octal
entier exprim en hexadcimal
Caractre
rationnel en notation dcimale
rationnel en notation scientifique
chane de caractres
Remarque
Les donnes saisies au clavier doivent tre spares par des espaces ou des
retour chariot, sauf sil sagit de la saisie dun caractre.
5.3. Fonctions getchar() et putchar()
Les fonctions getchar() et getchar() permettent respectivement de saisir et
dafficher des caractres.
Syntaxe
char c ;
c = getchar() ;
putchar(c) ;
44
Exemple
#include <stdio.h>
void main()
{
int c ;
while ((c = getch() != EOF)
putchar() ;
}
6.
Expressions et Oprateurs
Syntaxe
expr1 op expr2 /*pour les oprateurs binaires*/
op expr /*pour les oprateurs unaires*/
Exemple
Le programme C ci-dessous permet de lire un entier, un rel et dafficher
leur somme, leur diffrence et leurs produits:
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 rsultat dune opration entre un
rel est un rel */
printf (somme
: %f\n, (nb+re))
printf (diffrence : %f\n, (nb-re))
printf (produit
: %f\n, (nb*re))
}
entier et un
;
;
;
Remarque
Lorsque le type des deux oprandes nest pas le mme il y a conversion
implicite dans le type le plus fort. Soient x, y deux oprandes dun oprateur et
a,b leurs types, la conversion se fait suivant la rgle suivante :
si a est plus fort que b alors
convertir en a
sinon
convertir en b
6.2. Affectation
Laffectation permet de modifier les expressions qui se situent gauche de
loprateur, deux types daffectation :
Syntaxe
expr1 = expr2 /* Affectation simple */
expr1 op= expr2 /* Affectation compose */
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 ;
printf(le reste est %d, a) ;
}
/* Incrmentation */
/* Dcrmentation */
Exemple
#include<stdio.h>
main()
{
int a=50, b=60, x,
printf("a =%d ** b
x = ++a;
y = --b;
printf("\nx =%d **
x = a++;
y = b--;
printf("\nx =%d **
y;
= %d", a, b);
y = %d", x, y);
y = %d", x, y);
}
A.Zahi/DI/FSTF
47
Exemple
char c ;
int i, age, n
float m ;
(c != .)
(i <= n && exist ==1)
(m>=12 && age <=24) || (m>=12 && age <26)
Exemples
1. Le programme ci-dessous permet dafficher la valeur absolue dun entier en
utilisant loprateur conditionnel.
#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
6.6. Expression
Une expression permet de reprsenter une valeur dans un programme. On
distingue deux types dexpressions :
Expression simple, constitue par une seule variable, une seule constante
(littrale 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 littrales */
prixHT /* variable */
/* Expressions complexes */
2+8,
prixHT * TVA
7. Structures de contrle
7.1. Le choix
7.1.1. if sans else
Syntaxe
if(expr)
Partie_alors
49
Exemples
1. Calcul de la valeur absolue d'un nombre rel.
#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 ;
printf("valeur absolue de %f = %f", X, Val-X) ;
}
7.1.2.
if avec else
Syntaxe
if(expr)
Partie_alors
else
partie_sinon
Remarque
Lexpression expr doit tre toujours entre parenthses.
A.Zahi/DI/FSTF
50
Exemples
1. Le programme suivant saisit deux entiers, x et y , et dcide si x est
divisible par y .
#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 nest pas divisible par %d",x,y);
}
7.1.3.
1er Cas : Par dfaut, un else est associ au if le plus proche. Dans
lexemple suivant le else est associ if(expr2).
if (expr1)
if(expr2)
inst1
else
inst2
A.Zahi/DI/FSTF
51
Exemple
Maximum de trois entiers
#include <stdio.h>
main()
{
int a,b,c,max ;
printf (" Saisir a, b et c :") ;
scanf("%d%d", &a,&b) ;
if a > b)
if (a > c)
max
else
max
else
if (b > c)
max
else
max
= a ;
= c ;
= b
= c
2me Cas : Un else doit tre associ un if plus loin. Lambigut est leve
en regroupant les instructions, entre les if et else concerns, dans un bloc
dinstructions, i.e., entre accolades. Dans lexemple suivant le else est
associ if (expr1).
if (expr1)
{
if(expr2)
inst1
}
else
inst2
Exemple
Le programme ci-dessous permet de calculer la valeur de la fonction
dfinie par :
1
si x > b
f (x ) = 0
si x < a
x a
si a < x < b
b a
A.Zahi/DI/FSTF
52
#include <stdio.h>
main()
{
float x, fx, a, b;
printf (" Saisir a, b et x :") ;
scanf("%f%f%f", &a,&b,&x) ;
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
Bloc_n
delfaut :
Bloc_d
53
nest
pas
un
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
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);
}
3. Saisir une phrase caractre par caractre. La fin de la phrase est identifie par
le caractre .
#include <stdio.h>
main()
{
char c;
printf("Saisir un carcatre : ") ;
c=getc() ;
while(c != .)
c=getc() ;
}
A.Zahi/DI/FSTF
55
7.2.2.
Boucle do while
Syntaxe
do
corps_de_boucle
while (expr) ;
Exemples
n
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);
}
A.Zahi/DI/FSTF
56
3. Saisir une phrase caractre par caractre. La fin de la phrase est identifie par
le caractre .
#include <stdio.h>
main()
{
char c;
printf("Saisir un carcatre : ") ;
do
c=getc(stdin) ;
while(c != .);
}
7.2.3.
Boucle for
Syntaxe
for (expr1 ; expr2 ; expr3)
corps-de-boucle
Exemples
n
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
A.Zahi/DI/FSTF
58
dune
Exemple
#include <stdio.h>
/* la boucle sarrte 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 prmature)
}
7.3.2.
Instruction continue
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 ;
}
}
7.3.3.
Instruction return
A.Zahi/DI/FSTF
60
7.3.4.
Instruction exit
8. Les Pointeurs
8.1. Mmoire de lordinateur
La mmoire dun ordinateur est constitue de plusieurs cases mmoires
ranges de faon squentielle et dont la taille dpend des performances de la
machine. Chaque case est identifie par une adresse unique comprise entre 0 et
une valeur maximale qui dtermine la capacit de la mmoire installe dan la
machine. Lors du fonctionnement de lordinateur une partie de la mmoire est
occupe par le systme dexploitation (DOS, Windows 95/98/2000/NT, Unix,
etc.), le reste est utilis par les applications pour stocker les variables et les
instructions et effectuer les appels de fonctions. Quatre zones mmoires sont
rserves pour chaque programme :
La pile : utilise lors de lappel des fonctions, les variables locales et les
paramtres de la fonction appele sont logs dans cette zone. La mmoire
locale est alloue au moment de lappel et libre la fin de lexcution.
Le tas (Heap) cette zone, appele aussi mmoire dynamique, contient
les donnes dont la taille augmente ou diminue au cours de lexcution
dun programme.
A.Zahi/DI/FSTF
61
Mmoire centrale
Applications:traitement
de texte Word, Tex...),
Tableurs (Excell,...)
Dessins(
Paint,...)
Autocad,
Segment de donnes
Segment de code
Segment de Pile
visual Basic...)
Programmes Utilisateurs
Segment heap
Systmes
dexploitation
Valeur de X
Adresse de X
Variable X
Pointeur vers X
A.Zahi/DI/FSTF
62
8.3. Dclaration
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 rel double*/
char *ptr_carac ; /* pointeur sur un caractre*/
}
Remarque
La dclaration dune variable de type pointeur consiste lui rserver un
espace en mmoire dans le segment heap (mmoire dynamique) .
8.4. Initialisation
Comme pour les variables simples, un pointeur non initialis peut provoquer
des problmes dexcution. En effet, quand on dclare 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, cest le programmeur qui
doit sen charger. Il existe deux faons dinitialiser un pointeur : par une adresse
existante, en utilisant loprateur dadressage, ou en lui attribuant une nouvelle
adresse.
8.4.1.
Un pointeur peut tre initialis par ladresse dune variable qui existe dj.
Linitialisation a la forme suivante :
Syntaxe
type X ;
type* ptr_X ;
ptr_X= &X ; /* affectation de ladresse 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 ladresse de X */
}
8.4.2.
Un pointeur peut tre initialis par ladresse dune case mmoire rserve au
cours de lexcution du programme. Pour ce faire nous avons besoin des
fonctions malloc() et sizeof() qui sont situes dans la bibliothque <stdlib.h> ou
dans <alloc.h>.
Syntaxe
/* initialisation dun pointeur*/
nom_type *ptr_X ;
int t= sizeof(nom_type) ;
ptr_X= (nom_type* ) malloc(t) ;
sizeof est un oprateur qui retourner la taille dun type i.e., la taille
de lespace mmoire ncessaire pour loger une variable de ce type.
Exemple
int *ptr_X ;
/* allocation mmoire pour une variable entire X */
ptr_X = (int *) malloc (siezof(int)) ;
double *ptr_d ;
/* allocation mmoire pour une variable relle */
ptr_d = (double* ) malloc (siezof(double)) ;
8.5. Indirection
Aprs la dclaration et linitialisation dun pointeur, nous avons besoin de
manipuler la variable pointe. Pour accder cette variable on utilise loprateur
* suivant la syntaxe suivante :
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
65
9. Les fonctions
9.1. Analyse descendante
En utilisant les lments de programmation prsents prcdemment
(oprateurs, instructions de choix, boucles, etc.), il est facile de rsoudre tous les
problmes relativement simples. Cependant pour les problmes complexes et de
grandes tailles, il faudrait utiliser une mthodologie pour construire la solution
correspondante. Lanalyse descendante est lune des mthodes les plus utilise
pour le dveloppement dune solution informatique pour les problmes
complexes. Lanalyse descendante est base sur la technique diviser pour
rgner qui consiste :
P1
P11
P2
P12
P3
P31
P32
P33
P321
P322
Une fonction, est un ensemble dinstructions ralisant une tche bien prcise,
elle peut tre considre comme une bote noire qui reoit en entre des donnes
et fournit des rsultas en sortie.
Donnes
Fonction
Figure 12 : Schma dune fonction
A.Zahi/DI/FSTF
Rsultats
66
Exemple : Calcul de f n (x ) =
1 i =n i
x
n! i =1
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 parenthses entourant les arguments sont ncessaires pour viter les
effets de bord, En effet si on dfinie la macro : #define carre (x) x*x,
linstruction r=carre (x+y) ; sera remplace par lexpression x+y*x+y ;
9.3. Dclaration des fonctions utilisateur
La dclaration dune fonction en C est constitue par deux parties :
9.3.1.
Linterface est constitue par trois lments chacun joue un rle particulier.
Syntaxe
type_retour nom_fonction(liste des paramtres)
68
Exemples
/*a et b : paramtres fixes. */
int somme (int a, int b) ;
/*a et b : paramtres fixes, s : paramtre variable*/.
void somme(int a, int b, int *s) ;
/*fonction sans paramtres */
void affiche () ;
/*a et b : paramtres variables.*/
void echange (int *a, int* b) ;
9.3.2.
Corps de la fonction
}
Exemples
1. fonction main
void main ()
{
printf(bonjour Bonjour) ;
}
69
4. Valeur absolue
float Val_Abs(float a)
{
float abs ;
if (a>=0)
abs = a ;
else
abs = -a
return abs ;
}
9.3.3.
Quels sont les donnes dont la fonction a besoin pour effectuer sa tche ?
Les donnes constitueront les paramtres fixes de la fonction.
Quels sont les rsultats que la fonction doit fournir ?. Les rsultats
constitueront les paramtres variables de la fonction.
Quelles sont les instructions qui permettent dobtenir les rsultats partir
des donnes ? Les instructions constitueront le corps de la fonction.
A.Zahi/DI/FSTF
70
Fonction
appelante
Fonction
appele
Paramtres
effectifs
Suspension de
lexcution
Excution de
la fonction
Valeur de
retour
Reprise de
lexcution
Retour vers
lappelant
9.4.2.
Syntaxe de lappel
Exemples
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
2.
Remarques
9.4.3.
Lordre des paramtres effectifs doit tre le mme que celui des
paramtres formels.
72
x = 20
y=40
1. Copier x
sur la pile
2. Excuter
la fonction
4.
3. Stocker le rsultat
sur la pile
Rcuprer le rsultat
de la pile
x = 20
x= 40
Pile
A.Zahi/DI/FSTF
73
Mmoire
centrale
void f2(int * x)
{
*x= *x + *x ;
}
x = 20
x = 40
1. Copier &x
sur la pile
2. Excuter
la fonction
3. lire la valeur du
paramtre partir de
la M. C. (&x)
&x
4. Stocker
le rsultat
dans la M.C. &x
Pile
9.4.4.
A.Zahi/DI/FSTF
74
Exemple
#include <stdio.h>
int m;/* variable globale */
void init0()
{
m = 0;
printf("\n %d",m);
}
void init1(int t)
{
int k =15 ; /* variable local */
t = k+ 1;
printf("\n %d",t);
}
void init2(int *p)
{
*p = 2;
printf("\n %d",*p);
}
void main()
{
int n; /* variable locale*/
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);
}
A.Zahi/DI/FSTF
75
2.
i =n
xi
i! ,
i =1
ncessaires.
3.
A.Zahi/DI/FSTF
76
21
1er lment
12
2 me lment
3
Tableau
.
.
.
20
dernier lment
1.1. Dclaration
Syntaxe
type_element nom_tableau[CAP];
77
Remarque
/* Capacit du tableau */
int N ;
int t[CAP];
/* Taille du tableau
*/
Exemples
#define CAP1 15
#define CAP2 20
#define CAP3 30
void main()
{
/* tableau qui peut contenir 15 entiers */
int t[CAP1] ;
/* tableau qui peut contenir 20 rels*/
double r[CAP2] ;
/*tableau qui peut contenir 30 caractres*/
char nom[CAP3] ;
}
78
Exemple
#define CAP 5
/* initialisation de lintgralit du tableau*/
int t[CAP] = {1,2,3,4,8};
/* initialisation dune partie du tableau*/
int k[CAP] = {1,2};
/* initialisation sans indiquer la taille */
int l[] = {4,7,9,76};
exp est une expression dlivrant une valeur entire qui indique le rang de
llment dans le tableau.
Si T est un tableau, T[i] reprsente son (i+1)eme lment, Ainsi T[i] peut
tre considr comme une variable simple sur laquelle on peut effectuer
les oprations suivantes :
Affectation :
/*valeur dune constante*/
T[i]= Constante;
/*valeur dune expression*/
T[i]= expression;
/*valeur dune autre variable*/
T[i]= X ;
A.Zahi/DI/FSTF
);
o car est un
79
Exemple
Ce programme permet de saisir un tableau dentiers, de remplacer chaque
lment par la somme de ses diviseurs et dafficher le tableau rsultant.
#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 , i, T[i]) ;
}
Remarques
80
peut rien lui affecter, no moins on peut crer un pointeur variable qui
pointe vers le premier lment.
int tab[10] ;
int * ptr_tab ;
ptr_tab=tab ;
tab= ptr_tab
1.4.2.
Incrmentation et dcrmentation
Les lments dun tableau sont stocks en mmoire les un la suite des
autres et le nom du tableau contient ladresse du premier lment. Pour accder
un lment du tableau on doit donc se positionner son adresse. Pour cela le
nom du tableau doit tre incrment ou dcrment, i.e., augmente ou diminue
par la taille du type des lments du tableau, jusqu atteindre llment cherch.
Exemple
Ce programme permet de saisir un tableau dentiers, de remplacer chaque
lment par la somme de ses diviseurs et dafficher le tableau rsultant.
#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
1.4.3.
Indexation du tableau
1.4.4.
Tableaux dynamiques
82
Exemple
int
*t
;
double *d
;
char
*c
;
/* allocation de lespace un tableau de 10 entiers
t = (int ) malloc(10 * sizeof(int));
/* allocation de lespace un tableau de 40 rels
d = (int ) malloc(40 * sizeof(double));
*/
*/
1.5.
Appel de la fonction
type tab[10] ;
int n ; /* taille du tableau */
nom_fonc1(t,n) ;
nom_fonc2(t,&n) ;
Remarques
83
La fonction peut avoir un effet sur tous les lments du tableau, mais pas
sur la valeur du paramtre qui est de type pointeur i.e., ladresse du
premier lment ne change pas par la fonction. Par exemple, Aprs lappel
de la fonction :
void remplir(int *t, int n)
{
int *p = t + n ;
while ( t != p)
{
*t =*t + 2 ;
t++ ;
}
}
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
Tableau
2 me ligne
.25
.
12
20
dernire ligne
A.Zahi/DI/FSTF
85
Exemple
Pour stocker les notes des 12 modules, dune section de la fst, on utilise un
tableau de dimension n et 12, o n est le nombre dtudiants dans la section. Une
ligne du tableau reprsente les notes dun tudiant dans les 12 modules. Une
colonne reprsente les notes de tous les tudiants dans un module.
E1
E2
.
.
.
En
M1
12
05
M2
09
14
13.5 15
.
.
.
.
.
.
.
.
.
M12
16
12
16
2.1. Dclaration
Syntaxe
type_element nom_tableau[MAX_LIN]
[MAX_COL];
Exemple
/* matrice dentiers de 7 lignes et 6 colonnes */
int matrice[7][6] ;
/*texte de 10 lignes, chacune est forme par 80 caractres */
char texte[10][80] ;
/*tableau qui contient les notes dune section */
#define MEX_ETUD /* nombre maximale dtudiants */
float notes [MAX_ETUD][12] ;
2.2. Initialisation
Les tableaux de dimension deux peuvent tre initialiss au moment de la
dclaration par une liste dexpressions:
Exemple
int T[4][5]={ {0, 1, 2, 3, 4},
{10, 11, 12, 13, 14},
{20, 21, 22, 23, 24},
{30,31,32,33,34}}
A.Zahi/DI/FSTF
86
exp1, exp2 sont des expressions dlivrant des valeurs entires qui
indiquent respectivement la ligne et la colonne dans le tableau.
Exemple
Ce programme permet de saisir le tableau des notes des 12 modules dune
section, de calculer la moyenne de chaque tudiant, de stocker le rsultat dans la
13me colonne et dafficher la moyenne de chaque tudiant.
#define M_LIN 100
#define M_COL 15
void main()
{
float notes[M_LIN][M_COL], moy ;
int i, j, ne, nm;
/* Saisie des notes */
printf("donner le nombre dtudiants ");
scanf("%d",&ne);
for(i= 0; i<ne; i++)
for(j=0; j<12; j++)
scanf("%d", ¬es[i][j];
/* Calcul de la moyenne gnrale */
for (i=0 ; i<ne ;i++)
{
moy =0.0 ;
for j=0 ; j<12 ; j++)
moy += notes[i][j];
notes[i][13]=moy;
}
/* Affichage de la moyenne de chaque tudiant */
for(i= 0; i<ne; i++)
printf(%d, notes[i][13];
}
A.Zahi/DI/FSTF
87
Exercice
Chaque semaine la direction dun magasin dappareils lectromnagers
enregistre ses ventes, en nombre dappareils, dans un tableau de vente. A la fin
du mois les rsultats sont envoys au sige. On dsire crire un programme qui
affiche le nombre dappareils vendu par semaine.
2.4. Tableau de dimension deux paramtre dune fonction
Un tableau de dimension deux est dfini par ladresse de la premire ligne,
qui est de type tableau, le nombre effectif de lignes et le nombre effectif de
colonnes. Pour passer un tableau bidimensionnel comme paramtre une
fonction on doit lui fournier ces informations. Il faut noter que la taille maximale
dune ligne, qui nest dautre que le nombre maximal de colonnes, est ncessaire
la fonction pour pouvoir accder tous les lments du tableau. La syntaxe est
la suivante
Syntaxe
Dclaration 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 dune ligne.
Exemple
Ce programme permet de saisir le tableau des notes des 12 modules dune
section, de calculer la moyenne de chaque tudiant, de stocker le rsultat dans la
13me colonne, de calculer le nombre de module non valid, de stocker le rsultat
dans la 14 me colonne et dafficher la liste des admis (numro de la ligne).
#define M_LIN 100
#define M_COL 20
/**************************************************/
/*
Fonction Saisie des notes
*/
/**************************************************/
void Saisie( float notes[][M_COL], int nl, int nc)
{
for(i= 0; i<nl; i++)
for(j=0; j<nc; j++)
scanf("%d", ¬es[i][j];
}
A.Zahi/DI/FSTF
88
/**************************************************/
/*
Fonction Calcul de la moyenne gnrale
*/
/**************************************************/
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)
{
for(i= 0; i<nl; i++)
{
for (int j =0; j <nc; j++)
printf("\n %d ", notes[i][j]);
printf(" \n");
}
}
/****************************************************/
/* Fonction main
*/
/****************************************************/
void main()
{
float notes[M_LIN][M_COL], moy ;
int i, j, ne, nc;
printf("donner le nombre dtudiants ");
scanf("%d",&ne);
printf("donner le nombre de modules ");
scanf("%d",&nm);
Saisie( notes, ne, nm);
Cal_Moy(notes, ne, &nm);
Cal_nmnv(notes, ne, &nm);
Affiche(notes, ne, nm);
}
A.Zahi/DI/FSTF
89
3. Chanes de caractres
Une chane de caractres est une suite de caractres. En C, bien quil existe
une bibliothque qui permet de grer les chanes de caractres, il nexiste aucun
type qui permet de les reprsenter. Une chane de caractres est donc reprsente
par un tableau de caractres. Le tableau peut tre statique ou dynamique.
3.1. Dclaration
Pour dclarer une chane de n caractres on a besoin dun tableau de n+1
lments, le dernier lment est rserv au caractre NULL \0, qui indique la
fin de la chane.
Syntaxe
char chaine[nb_caractere] ;/* reprsentation statique */
char * chaine ; /* reprsentation dynamique */
Remarque
Dans le cas dune reprsentation dynamique un espace mmoire doit tre
rserv la chane, laide 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 caractres */
char* prenom
3.2. Initialisation
Les tableaux de caractres peuvent tre initialiss au moment de la
dclaration de deux faons :
Remarques
90
Exemple
#include <stdio.h>
char *vert1= " Il faut d'abord choisir le point";
char *vert2= " Pour tracer ensuite le cercle saint";
char vert3[]= " Autour de ma tte et de mon tre sain";
char
char
char
char
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
3.3.2.
Exemple
#include <stdio.h>
#include <stdlib.h>
main()
{
char nom[14] ;
char *plainte ;
printf (entrer votre nom ) ;
scanf(%s , nom) ;
plainte =(char*) malloc(50* sizeof(char)) ;
puts(entrer votre plainte ) ;
gets(plainte) ;
printf( votre dposition est la suivante:\n) ;
puts (plainte) ;
}
3.3.3.
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));
}
3.3.4.
Copie de chanes
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.
Concatnation
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);
printf("s : %s\n", s);
printf("t : %s\n", t);
printf("st: %s\n", st);
}
3.3.6.
Comparaison
Syntaxe
/* prototype */
int strcpy( char * s1, char* s2) ;
/* appel */
char * s1 , *s2 ;
int res= strcmp(s1, s2) ;
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");
ptr = strcmp(s2, s3);
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 raliser les fonctions : strlen, strcmy, stcat,
et strcmp.
A.Zahi/DI/FSTF
95
Chapitre 3: Structures
Dans les chapitres prcdents, nous navons utilis que des objets simples
dont le type est prdfini par le langage. Pour reprsenter des objets complexes
et htrognes, le langage C offre des mcanismes, tels que les structures et les
numrations, 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 lexploitation :
1. Le mot cl typedef
Le mot cl typedef permet daffecter un nouveau nom un type existant,
quil soit simple ou compos.
Syntaxe
typedef
type nom_type ;
Exemple
#include <stdio.h>
#include <stdlib.h>
typedef float real ;
typedef char* string ;
void main()
{
/* les notes de ltudiant */
real note1 , note2 , moy ;
/* le nom de ltudiant */
string nom;
nom = (string) malloc(10*sizeof(char));
A.Zahi/DI/FSTF
96
2. Enumrations
2.1. Dfinition dune numration
Une numration permet de construire un type partir dune liste de
valeurs. Cette liste constitue lensemble des valeurs prises par une variable de ce
type.
Syntaxe
typedef enum
{
enum_1,
enum_2,
.
.
enum_n,
} nom_enumeration ;
v_1, v2, ;
Exemples
1. Construction dun type boolen
typedef enum
{
VRAI ,
FAUX,
} Bool ;
Enumrateur
VRAI
FAUXt
A.Zahi/DI/FSTF
Code
0
1
97
Enumrateur
rouge
vert
bleu
Code
0
1
2
Enumrateur
Lundi
Mardi
Mercredi
Jeudi
Vendredi
Samedi
Dimanche
Code
0
1
2
50
51
52
53
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 Arrter ");
break;
case vert
:printf("\nAvancer ");
break;
: printf("\nFeu en panne");
break;
}
}
3.
Les Structures
nom_structure
A.Zahi/DI/FSTF
99
Exemples
1. Construction dun type complexe
typedef struct
{
float real ;
float img ;
} complexe;
3.2. Dclaration
La dclaration dune variable dun type construit obit aux mmes rgles et
la mme syntaxe que celles des types de bases.
Syntaxe
Variables statiques
nom_structure s1, s2 ;
Variables dynamiques
nom_structure *s1, *s2 ;
A.Zahi/DI/FSTF
100
Exemples
complexe z1, z2 ;
complexe *z3, *z4 ;
z3= &z1 ;
z4= (complexe*) malloc(sizeof(complexe)) ;
Saisie :
scanf("%c", &nom_structure.nom_champs) ;
scanf("%c", &nom_structure->nom_champs) ;
Affichage :
printf("%c", nom_structure.nom_champs) ;
printf("%c", nom_structure->nom_champs) ;
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 rsultas.
#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);
/* affichage des rsultats */
printf("Somme
= %f + i%f ", som->real, som->img);
printf("\nProduit
=
%f
+
i%f
",
prod.real,
prod.img);
}
3.3.2. Initialisation
Une variable de type structure peut tre initialise lors de la dclaration par
une liste dexpressions constantes.
Syntaxe
typedef struct
{
type_1 nom_champ_1 ;
type_2 nom_champ_2 ;
.
.
type_n nom_champ_n ;
} nom_structure;
nom_structure s1 = {exp_1, exp_2, , exp_n}
A.Zahi/DI/FSTF
102
Exemple
complexe z1 = {8.,10.};
complexe z2 = {9.25,5.2};
3.3.3.
Affectation
Prototype de la fonction
/* comme paramtre fixe */
void fonc1(nom_structure s1) ;
/* comme paramtre variable */
void fonc2(nom_structure *s1) ;
/* comme type de retour */
nom_structure fonc3() ;
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);
/* calcul de la somme de z1 et z2*/
som=(complexe*) malloc(sizeof(complexe));
somme(z1,*z2,som);
/* calul du produit de z1 et z2 */
prod = produit(z1,*z2);
printf("\n");
printf("Somme
= ");affiche(*som);
printf("\nProduit
= ");affiche(prod);
}
T le nom du tableau.
A.Zahi/DI/FSTF
105
Exemple
Ce programme saisi un tableau de complexe et affiche llment qui le plus petit
module
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define CAP 10
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 du module */
float module(complexe z)
{
float m;
m=sqrt(z.real*z.real + z.img*z.img);
return m;
}
/* fonction affiche complexe */
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);
}
/* saisie dun tableau de complexes */
void saisieTab(complexe T[], int n)
{
int i;
for (i=0; i<n; i++)
{
printf("\nSaisi du complexe Tab[%d] \n",i+1);
saisie(&T[i]);
}
}
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]);
}
Exemple
A la fst, pour chaque tudiant on retient les informations suivantes: le nom,
le code, les notes des 12 modules, et la moyenne gnrale. Le programme cidessous saisit les informations dun tudiant, calcul sa moyenne gnrale, calcul
le nombre de modules non valids et affiche sil est admis
A.Zahi/DI/FSTF
107
#include <stdio.h>
typdef struct
{
char nom[10] ;
int CNE;
float mod [12] ;
float Moy ;
} etudiant;
/* saisi dun tableau de rel*/
void saisiMod(float t, int n)
{
int i;
for (i=0; i<n; i++)
{
printf("\nSaisir le module M[%d] \n",i+1);
scanf("%f",&t[i]);
}
}
/* saisie dun tudiant tudiant */
void saisie( etudiant * etu)
{
printf ("entrer le nom ") ;
gets(etu->nom) ;
printf("entrer le CNE") ;
scanf("%d",&etu->CNE) ;
printf("entrer les des 12 modules ") ;
saisiMod(etu->mod, 12);
}
/* calcul de la moyenne gnrale*/
void cal_moy(etudiant *etu)
{
int i;
etu->Moy=0.0;
for (i=0; i<12; i++)
etu->Moy += etu->mod[i];
etu->Moy = (etu->Moy)/12;
}
/* 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
Exemple
#include<stdio.h>
struct date
{
int jour ;
int mois ;
int annee ;
} ;
struct livre
{
char titre [30] ;
char auteur[14] ;
int code ;
date d_entre ;
date d_sortie ;
} ;
/* saisie dune date */
void saisieDate(date *d)
{
printf (entrer le jour) ;
scanf("%d " &d->jour) ;
printf(entrer le mois) ;
scanf("%d " &d->mois) ;
printf(entrer lanne ) ;
scanf("%d " &d->annee) ;
}
A.Zahi/DI/FSTF
109
A.Zahi/DI/FSTF
110
Chapitre 4: Fichiers
Dfinition
Mmoire tampon
A.Zahi/DI/FSTF
111
Programme C
Instructions
+
Donnes
Mmoire
tampon
tte
l/e
Support
de
stockage
Mmoire
centrale
3.
Accs un fichier
3.2. Ouverture/fermeture
Pour tablir la connexion avec le fichier, le programme notifie le systme
dexploitation par la fonction douverture fopen, qui reoit le nom physique du
fichier comme paramtre, le systme gnre ensuite un bloc de type FILE et
retourne son adresse au programme. La connexion est coupe laide de la
fonction de fermeture fclose .
Syntaxe
FILE *flot;
flot= fopen(non_physique, mode_ouverture) ;
fclose(flot) ;
A.Zahi/DI/FSTF
112
Position
dbut
dbut
fin
rb
dbut
wb
dbut
ab
fin
r+
dbut
w+
dbut
a+
fin
r+b ou rb+
dbut
w+b ou wb+
dbut
a+b ou ab+
fin
Signification
Ouverture dun fichier texte en
lecture
Ouverture dun fichier texte en
criture
Ouverture dun fichier texte en
criture
Ouverture dun fichier binaire en
lecture
Ouverture dun fichier binaire en
criture
Ouverture dun fichier texte en
criture
Ouverture dun fichier texte en
lecture/ criture
Ouverture dun fichier texte en
lecture/ criture
Ouverture dun fichier texte en
lecture/criture
Ouverture dun fichier binaire en
lecture/criture
Ouverture dun fichier binaire en
lecture/criture
Ouverture dun fichier binaire en
lecture/ criture
A.Zahi/DI/FSTF
113
Exemple
#include <stdio.h>
main(()
{
FILE * flot ;
flot= fopen(fichier.dat, r) ;
if(flot==NULL)
printf(erreur douverture ) ;
else
/* traitement sur le fichier*/
....
fclose(flot) ;
}
4. Lecture /criture
4.1. Lecture et criture par caractre
Les fonctions fgetc et fputc permettent de lire et dcrire un caractre sur
un fichier.
Syntaxe
FILE *flot;
int car ;
char car ;
/* erreur */
car=fgetc (flot) ;
fputc(flot) ;
car est de type int, cest le caractre crire dans le fichier ou dans
lequel on rcupre le caractre 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
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
fscanf (f, format,&var_1, &var_2,...) ;
fprintf(f, format ,var_1, var_2 ...);
format cest une chane de caractre qui indique ce qui doit tre
crit ou lu. Cette chane contient des caractres constants et des
spcificateurs de formats commenant par le caractre %, dcrivant
comment les paramtres var_i doivent tre crits
Exemples
1.
116
2.
A.Zahi/DI/FSTF
117
Exemples
1.
118
2.
/*
/*
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.
Accs directe
Pour chaque fichier ouvert est associ un indicateur de position qui indique
quel endroit du fichier aura lieu la prochaine opration (lecture/criture). Cette
position est donne en nombres doctets partir du dbut du fichier. Par dfaut,
les fonctions prcdentes travaillent en mode squentiel, et mettent jour cet
indicateur par incrmentation automatique. En effet, chaque lecture ou criture
seffectue partir dune position courante, et incrmente cette position du
nombre de caractres lus ou crits.
A.Zahi/DI/FSTF
119
Exemple
#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