Sie sind auf Seite 1von 239

Universit Gaston Berger - Saint Louis Anne acadmique 2009-2010

Miage 1 et Dietel 1

E. M. Nguer UFR SAT UGB emnguer@gmail.com

Le Langage C

Sommaire
1. 2. 3. 4. 5. 6. 7. 7 8. 9. 10. 11. 12. 12 13. 14. Historique Gnralits Les types de bases Les oprateurs et les expressions Les entres-sorties Les instructions de contrle Les f L fonctions ti Tableaux et Pointeurs Les chanes de caractres Les structures Les fichiers Gnie logiciel La gestion dynamique Le prprocesseur p p
E. M. Nguer UFR SAT UGB emnguer@gmail.com 2

Le Langage C

Rfrences
Braquelaire J.P., Mthodologie de la programmation en langage JP C Principes et applications, Masson, 1993. Delannoy C., le livre du C Premier langage, Eyrolles. Delannoy C., Programmer en C Drix Ph., Langage. Norme ANSI, Masson, 1994. Kernighan B.W., Ritchie D.M., le langage C (ANSI), Masson, 1992. Rifflet J.M., La programmation sous UNIX (chapitre 8), Ediscience International, 1994 International 1994. Roberts E.C. The Art and Science of C, Addison Wesley, 1995. Henri Garreta, Le langage C 2003 http://mamadou.nguer.free.fr/ http://www.developpez.com

E. M. Nguer UFR SAT UGB emnguer@gmail.com

Le Langage C g g
Historique Gnralits Les types de bases Les oprateurs et les expressions e pressions Les entres-sorties Les instructions de contrle Les fonctions Tableaux et pointeurs Les chanes de caractres Les structures Les fichiers Gnie logiciel La gestion dynamique g y q Le prprocesseur

Historique Hi t i
La premire version La normalisation La seconde version Lusage gnrale

E. M. Nguer UFR SAT UGB emnguer@gmail.com

Le Langage C g g
Historique

Premire version i
g g p , 1972: Cration du langage C par Denis Ritchie, des Laboratoires Bell, dans le but dcrire un systme dexploitation (UNIX). 1978: le langage C est dfini et publi une premire fois par Brian Kernighan et D. Ritchie des Laboratoires Bell , dans un livre intitul The C Programming Language Language. Cette version fut appele Kernighan et Ritchie 78, ou K&R 78 en abrg, ou encore le plus souve , s p e e souvent, simplement K&R. & .
E. M. Nguer UFR SAT UGB emnguer@gmail.com 5

Premire version La normalisation Seconde version Lusage gnrale L l

Le Langage C g g
Historique

Lanormalisation L li ti
Suite l extraordinaire succs d UNIX qui l'extraordinaire d' UNIX, induisit le succs du langage C, la situation devint confuse : plusieurs fournisseurs de compilateurs p p mirent sur le march des compilateurs non conformes K&R car comportant des extensions particulires. la fin des annes 80, il devint ncessaire de mettre de l'ordre dans ce chaos et donc de normaliser le langage, tche laquelle s attela l langage s'attela l' ANSI1.1, organisme de normalisation amricain. La norme ANSI fut termine en 1989.
E. M. Nguer UFR SAT UGB emnguer@gmail.com 6

Premire version La normalisation Seconde version Lusage gnrale L l

Le Langage C g g
Historique

Secondeversion S d i
En 1990, l' ISO1.2, organisme de normalisation international, adopta tel quel le standard ANSI en tant que standard ISO. d d SO C tt seconde version du langage C devrait donc Cette d i d l d it d s'appeler ISO C, mais comme les acteurs importants du monde informatique sont de culture p q anglo-saxonne et que ceux-ci persistent l'appeler ANSI C, (presque ?) tout le monde fait de mme.

Premire version La normalisation Seconde version Lusage gnrale L l

E. M. Nguer UFR SAT UGB emnguer@gmail.com

Le Langage C g g
Historique

Lusagegnrale L l
Nous allons suivre dans ce cours l'usage gnral, et utiliserons l'expression ANSI C pour dsigner la norme commune l' ANSI et l' ISO ISO.

Premire version La normalisation Seconde version Lusage gnrale L l

E. M. Nguer UFR SAT UGB emnguer@gmail.com

Le Langage C g g
Historique Gnralits Les types de bases Les oprateurs et les expressions e pressions Les entres-sorties Les instructions de contrle Les fonctions Tableaux et pointeurs Les chanes de caractres Les structures Les fichiers Gnie logiciel La gestion dynamique g y q Le prprocesseur

Gnralits G lit
Cette partie traite de : la prsentation du langage C p g g de quelques instructions du langage C de quelques rgles dcriture et de la cration dun programme en langage C pour vous permettre davoir de quoi dmarrer sans entrer dans le fond du sujet.
E. M. Nguer UFR SAT UGB emnguer@gmail.com 9

Le Langage C g g
Gnralits

PrsentationdulangageC Prsentation du langage C


Le langage C est un langage de bas niveau dans le sens o il permet l'accs des donnes que manipulent les ordinateurs (bits, octets, adresses) et p ( ) qui ne sont pas souvent disponibles partir de langages volus tels que Fortran, Pascal ou ADA. Le langage C a t conu pour l'criture de systmes d exploitation et du logiciel de base. Plus d'exploitation base de 90% du noyau du systme UNIX est crit en langage C. Le compilateur C lui-mme est crite en grande partie en langage C ou partir d'outils gnrant du langage C.
E. M. Nguer UFR SAT UGB emnguer@gmail.com 10

Prsentation du langage C Quelques instructions du langage C Quelques rgles dcriture Cration dun C ti d programme en langage C

Le Langage C g g
Gnralits

PrsentationdulangageC Prsentation du langage C


Il en est de mme pour les autres outils de la chane de compilation (assembleur, diteur de liens , pr-processeur). De plus tous les outils du systme sont crits en C (shell, outils). (shell outils) Par le biais des bases de donnes, il est utilis dans les applications de gestion. De nombreux logiciels du domaine des ordinateurs personnels, tels que Microsoft Word ou Microsoft Excel, sont eux aussi Mi ft W d Mi ft E l t i crits partir de langage C ou de son successeur orient objet : C . C++.
E. M. Nguer UFR SAT UGB emnguer@gmail.com 11

Prsentation du langage C Quelques instructions du langage C Quelques rgles dcriture Cration dun C ti d programme en langage C

Le Langage C g g
Gnralits

QuelquesinstructionsdulangageC Q l i t ti d l C
Un exemple de programme en langage C: Structure d un programme en langage C d'un Dclarations

Prsentation du langage C Quelques instructions du langage C Quelques rgles dcriture Cration dun C ti d programme en langage C

Pour crire des informations: printf Pour lire de linformation: scanf Pour faire des choix : linstruction if Les directives destination du prprocesseur
E. M. Nguer UFR SAT UGB emnguer@gmail.com 12

Le Langage C g g
Gnralits Quelques instructions du langage C g g
Un exemple de programme en langage C: Structure d'un programme en langage C Dclarations Pour crire des informations: printf Pour lire de linformation: scanf Pour faire des choix : linstruction if Les directives destination du prprocesseur

UnexempledeprogrammeenlangageC:
/*Calcul de puissance dun rel*/ #include <stdio.h> main(){ int i,n ; float x = 2.0; float puis = 1; printf("Donner la valeur de n :"); scanf("%d",&n); if (n>0){ for(i=0;i<n;i++) puis = puis*x; printf("%f puissance %d = %f\n" ,x,n,puis); p } else printf("%d est ngatif",n); g getch(); }
E. M. Nguer UFR SAT UGB emnguer@gmail.com 13

Le Langage C g g
Gnralits Quelques instructions du langage C g g
Un exemple de programme en langage C: Structure d'un programme en langage C Dclarations Pour crire des informations: printf Pour lire de linformation: scanf Pour faire des choix : linstruction if Les directives destination du prprocesseur

Leprogrammeprincipal Le programme principal


La ligne: main() appele "en-tte" prcise que ce qui sera dcrit sa suite est en fait le ''programme principal (main). principal" (main) Cest une fonction dont le nom (main) est impos Il est dlimit par les accolades "{" et "}". On dit que les instructions situes entre ces } accolades forment un "bloc".

E. M. Nguer UFR SAT UGB emnguer@gmail.com

14

Le Langage C g g
Gnralits Quelques instructions du langage C g g
Un exemple de programme en langage C: Structure d'un programme en langage C Dclarations Pour crire des informations: printf Pour lire de linformation: scanf Pour faire des choix : linstruction if Les directives destination du prprocesseur

Dclarations
; ; p ; Les instructions : int n; float x; et float puis; sont des "dclarations". Elle prcise que : l variable nomme n est de type int, c'est--dire la i bl d i ' di qu'elle est destine contenir des nombres entiers (relatifs). (relatifs) les variables x et puis sont de type float c'est--dire p yp qu'elles sont destines contenir des nombres rels flottants. Nous verrons qu'en C il existe plusieurs types d entiers d'entiers et plusieurs types de rels. rels
E. M. Nguer UFR SAT UGB emnguer@gmail.com 15

Le Langage C g g
Gnralits Quelques instructions du langage C g g
Un exemple de programme en langage C: Structure d'un programme en langage C Dclarations Pour crire des informations: printf Pour lire de linformation: scanf Pour faire des choix : linstruction if Les directives destination du prprocesseur

Pourcriredesinformations:printf P i d i f ti i tf
L'instruction : printf ("Bonjour\n"); permet dafficher la chane "Bonjour\n" lcran. Les guillemets servent dlimiter une "chane de caractres" (suite de caractres). La notation \n est conventionnelle: elle reprsente un caractre de fin de ligne, c est--dire un caractre ligne c'est dire qui, lorsqu'il est envoy l'cran, provoque le p passage la ligne suivante. g g

E. M. Nguer UFR SAT UGB emnguer@gmail.com

16

Le Langage C g g
Gnralits Quelques instructions du langage C g g
Un exemple de programme en langage C: Structure d'un programme en langage C Dclarations Pour crire des informations: printf Pour lire de linformation: scanf Pour faire des choix : linstruction if Les directives destination du prprocesseur

Pourliredelinformation:scanf Pour lire de linformation: scanf


L'instruction : scanf("%d",&n); permet de lire de linformation au clavier. Son premier argument est un format "%d" exprimant le type de la valeur lue. "%d" prcise que la valeur lue lire doit tre un entier et "%f" un flottant. Le second argument &n reprsente ladresse o range la valeur lue.

E. M. Nguer UFR SAT UGB emnguer@gmail.com

17

Le Langage C g g
Gnralits Quelques instructions du langage C g g
Un exemple de programme en langage C: Structure d'un programme en langage C Dclarations Pour crire des informations: printf Pour lire de linformation: scanf Pour faire des choix : linstruction if Les directives destination du prprocesseur

Pourfairedeschoix:linstructionif P f i d h i li t ti if
La ligne if (x>0) est une condition de choix base sur la condition (x>0): ( ) si cette condition est vraie, on excute linstruction suivante. i sinon on excute l instruction suivant le else. linstruction else

E. M. Nguer UFR SAT UGB emnguer@gmail.com

18

Le Langage C Lesdirectivesdestinationdu g g
Gnralits Quelques instructions du langage C g g
Un exemple de programme en langage C: Structure d'un programme en langage C Dclarations Pour crire des informations: printf Pour lire de linformation: scanf Pour faire des choix : linstruction if Les directives destination du prprocesseur

prprocesseur

La premire ligne de notre programme : p g p g #include <stdio.h> est en fait un peu particulire. Il s'agit dune "directive" qui est prise en compte avant la compilation du programme. La directive demande en fait d'introduire (avant compilation) des instructions (en langage C) situes p ) ( g g ) dans le fichier stdio.h. Notez qu'un mme fichier entte contient des dclarations relatives plusieurs fonctions. En gnral, il est indispensable d incorporer stdio.h. gnral d'incorporer stdio h
E. M. Nguer UFR SAT UGB emnguer@gmail.com 19

Le Langage C g g
Gnralits

Quelquesrglesd criture Quelques rgles dcriture


Ce paragraphe expose un certain nombre de rgles gnrales intervenant dans l'criture d'un programme en langage C. Plus i Pl prcisment de ce que l'on appelle : td l' ll les identificateurs identificateurs, les mots cls, les sparateurs et les commentaires.

Prsentation du langage C Quelques instructions du langage C l Quelques rgles dcriture Cration dun programme en langage C

E. M. Nguer UFR SAT UGB emnguer@gmail.com

20

Le Langage C g g
Gnralits Quelques rgles dcriture

Lesidentificateurs Les identificateurs


Les identificateurs servent dsigner les diffrents "objets" manipuls par le programme: variables, fonctions, etc. Ils Il sont forms d'une suite de caractres choisis tf d' it d t h ii parmi les lettres ou les chiffres, le premier d'entre eux tant ncessairement une lettre. lettre Exemple: float salaire_06;

Les identificateurs Les mots cls Les sparateurs Les commentaires

E. M. Nguer UFR SAT UGB emnguer@gmail.com

21

Le Langage C g g
Gnralits Quelques rgles dcriture

Lesmotscls Les mots cls


mots cls" Certains "mots cls sont rservs par le langage un usage bien dfini et ne peuvent pas tre utiliss comme identificateurs. En voici la liste, classe par ordre alphabtique. auto default float break do for case double goto char else if const enum int continue extern long Exemple: i break; l int b k
E. M. Nguer UFR SAT UGB emnguer@gmail.com 22

Les identificateurs Les mots cls Les sparateurs Les commentaires

register return short signed sizeof static

struct switch typedef union unsigned g void

volatile while

Le Langage C g g
Gnralits Quelques rgles dcriture

Lessparateurs Les sparateurs


Dans un programme deux identificateurs successifs programme, entre lesquels la syntaxe n'impose aucun signe particulier doivent imprativement tre spars soit par un espace, soit par une fin de ligne. Par P contre, ds que la syntaxe impose un sparateur t d l t i t quelconque, il n'est alors pas ncessaire de prvoir d espaces d'espaces supplmentaires (bien qu en pratique cela qu'en amliore la lisibilit du programme). Ainsi, on doit imprativement crire : int x,y; ou int x, y; et non : intx,y;
E. M. Nguer UFR SAT UGB emnguer@gmail.com 23

Les identificateurs Les mots cls Les sparateurs Les commentaires

Le Langage C g g
Gnralits Quelques rgles dcriture

Lescommentaires Les commentaires


Le langage C autorise la prsence de commentaires dans vos programmes source. Il s'agit de textes d ' it d t t explicatifs sans incidence sur sa compilation et destins aux lecteurs du programme. Ils sont forms de caractres quelconques placs entre les symboles /* et */ ou aprs // et peuvent apparatre tout endroit du programme o un espace est autoris autoris. Exemples: // commentaire stendant sur une ligne /* Commentaire s'tendant sur plusieurs lignes de programme source */
E. M. Nguer UFR SAT UGB emnguer@gmail.com 24

Les identificateurs Les mots cls Les sparateurs Les commentaires

Le Langage C g g
Gnralits

Crationdunprogrammeen langageC l C
La L manire d d l i de dvelopper et d'utiliser un programme t d' tili en langage C dpend de lenvironnement de programmation dans lequel vous travaillez. travaillez Mais les grandes tapes de la cration d'un programme, savoir: L'diti du programme L'dition d la compilation et ldition de liens l dition s'appliquent n'importe quel environnement.
E. M. Nguer UFR SAT UGB emnguer@gmail.com 25

Prsentation du langage C Quelques instructions du langage C Quelques rgles dcriture Cration dun programme en langage C

Le Langage C g g
Gnralits Cration dun programme en langage C g g

L ditionduprogramme Ldition du programme


L'dition du programme (on dit aussi parfois "saisie") consiste crer, partir d'un clavier, tout ou partie du texte d'un programme: on parle alors de "programme source". En gnral, ce texte sera conserv dans un fichier dextension .c que l'on nommera "fichier source". q Exemple: racine_carree.c

L'dition du programme La compilation L dition Ldition de liens Environnement de dveloppement C

E. M. Nguer UFR SAT UGB emnguer@gmail.com

26

Le Langage C g g
Gnralits Cration dun programme en langage C g g

Lacompilation La compilation
Elle consiste traduire le programme source (ou le contenu d'un fichier source) en langage machine, en faisant appel un programme nomm compilateur. En langage C, compte tenu de l'existence d'un prprocesseur, cette opration de compilation tt ti d il ti comporte en fait deux tapes. Le rsultat de compilation porte le nom de module objet. objet Elle transforme le fichier .c en un fichier .o (objet)

L'dition du programme La compilation L dition Ldition de liens Environnement de dveloppement C

E. M. Nguer UFR SAT UGB emnguer@gmail.com

27

Le Langage C g g
Gnralits Cration dun programme en langage C g g

L ditiondeliens L'dition de liens


Le module objet cr par le compilateur n est pas n'est directement excutable. Il lui manque, au moins, les diffrents modules objet correspondant aux fonctions prdfinies (on dit aussi "fonctions standard") utilises par votre programme (comme printf, scanf, sqrt). t) C est C'est effectivement le rle de l diteur de liens que l'diteur d'aller rechercher dans la "bibliothque standard" les modules objet ncessaires.

L'dition du programme La compilation L dition Ldition de liens Environnement de dveloppement C

E. M. Nguer UFR SAT UGB emnguer@gmail.com

28

Le Langage C g g
Gnralits Cration dun programme en langage C g g

L ditiondeliens L'dition de liens


Le rsultat de l dition de liens est ce que l on l'dition l'on nomme un "programme excutable", c'est--dire un ensemble autonome d'instructions en langage g g machine. Si ce programme excutable est rang dans un fichier, il pourra ultrieurement tre excut sans qu il qu'il soit ncessaire de faire appel un quelconque composant de l'environnement de programmation en C.

L'dition du programme La compilation L dition Ldition de liens Environnement de dveloppement C

E. M. Nguer UFR SAT UGB emnguer@gmail.com

29

Le Langage C g g
Gnralits Cration dun programme en langage C g g

DansunsystmedetypeUnix Dans un systme de type Unix


Dans un systme de type Unix, pour obtenir: y yp ,p un fichier objet partir dun fichier source c, la commande usuelle est cc: cc c nom_du_fichier.c un fichier excutable partir dun fichier objet, la commande usuelle est cc: cc o nom_exec nom_du_fichier.o un fi hi excutable directement partir dun fichier bl di i d fichier source c, la commande usuelle est cc: cc o nom exec nom du fichier c nom_exec nom_du_fichier.c
E. M. Nguer UFR SAT UGB emnguer@gmail.com 30

L'dition du programme La compilation L dition Ldition de liens Environnement de dveloppement C

Le Langage C g g
Gnralits Cration dun programme en langage C g g

Structuregnraledunprogramme l d
Programme fichier1.c (source) (module) compilation fichier1.o (objet) (binaire) fichier2.c (source) (module) compilation fichier2.o (objet) (binaire) Edition de liens a.out a out (excutable) (binaire) fichier3.c (source) (module) compilation fichier3.o (objet) (binaire)

L'dition du programme La compilation L dition Ldition de liens Environnement de dveloppement C

E. M. Nguer UFR SAT UGB emnguer@gmail.com

31

Le Langage C g g
Gnralits Cration dun programme en langage C g g

EnvironnementdedveloppementC E i d d l C
Sous Windows Turbo c++ Visual C++ 2005 Express Dev-C++ wx-Devcpp Sous Linux Anjuta j KDevelop Sous Wi d S Windows et Linux Li MingW Developer Studio Code::Blocks Studio
E. M. Nguer UFR SAT UGB emnguer@gmail.com 32

L'dition du programme La compilation L dition Ldition de liens Environnement de dveloppement C

Le Langage C g g
Exercices

Schmadelastructuredunprogramme S h d l d
Exercice 1: crire un programme qui permet de calculer et dafficher le carre dun nombre entier saisi au clavier. Exercice 2: crire un programme qui permet de calculer et d afficher dafficher la somme de deux flottants saisis au clavier.

E. M. Nguer UFR SAT UGB emnguer@gmail.com

33

Le Langage C g g
Historique Gnralits Les types de bases Les oprateurs et les expressions e pressions Les entres-sorties Les instructions de contrle Les fonctions Tableaux et pointeurs Les chanes de caractres Les structures Les fichiers Gnie logiciel La gestion dynamique g y q Le prprocesseur

Lestypesdebases Les types de bases


Les types char, int et double que nous avons dj char rencontrs sont souvent dits "scalaires" ou "simples", car, un instant donn, une variable p , , , d'un tel type contient une seule valeur, par opposition aux types "structurs" qui correspondent des variables qui, un instant donn, donn contiennent pl sie rs valeurs (de mme plusieurs ale rs type ou non).

E. M. Nguer UFR SAT UGB emnguer@gmail.com

34

Le Langage C g g
Historique Gnralits Les types de bases Les oprateurs et les expressions e pressions Les entres-sorties Les instructions de contrle Les fonctions Tableaux et pointeurs Les chanes de caractres Les structures Les fichiers Gnie logiciel La gestion dynamique g y q Le prprocesseur

Lestypesdebases L t d b
yp g g p Les types de base du langage C se rpartissent en trois grandes catgories en fonction de la nature des informations qu'ils permettent de reprsenter: Les types entiers (mot clef int) Les types flottants (mot clef double) Le type caractre (mot clef char) Nous verrons qu'en f i char apparat (en C) N ' fait h ( comme un cas particulier de int.

E. M. Nguer UFR SAT UGB emnguer@gmail.com

35

Le Langage C g g
Les types de bases

Leurreprsentationenmmoire L t ti i
Le mot cl int correspond la reprsentation de nombres entiers relatifs. Pour ce faire: un bit est rserv pour reprsenter le signe du nombre (en gnral 0 correspond un nombre positif); les autres bits servent reprsenter la valeur absolue du nombre.

Les types entiers

Les types flottants Le type caractre

E. M. Nguer UFR SAT UGB emnguer@gmail.com

36

Le Langage C g g
Les types de bases

Lesdiffrentstypesd'entiers Les diffrents types d'entiers


Il y a trois "tailles" diffrentes d entiers, dsignes ya tailles d'entiers, par les mots cls suivants: - Short : (16 bits) : -32 768 32 767 - int : ( 6 3 b ts): 3 (16 ou 32 bits): -32 768 32 767 ou 3 -2 147 483 648 2 147 483 647 - long int : (32 64 bits) : -2 147 483 648 2 147 483 647 ou -264 263 2
E. M. Nguer UFR SAT UGB emnguer@gmail.com 37

Les types entiers

Les types flottants Le type caractre

Le Langage C Longueurdestypeentiers g g
Les types de bases

surlabasedequelquesmachines l b d l h
Type Anne PDP 11 1970
16 bits 16 bits 32 bits

Les types entiers

Intel 486 1989


16 bits 16 bits 32 bits

Sparc 1993
16 bits 32 bits 32 bits

Pentium 1993
16 bits 32 bits 32 bits

Alpha 1994
16 bits 32 bits 64 bits

Les types flottants Le type caractre

short int long

Remarque: Ces types (short, int et long) peut tre nuanc par l utilisation du "qualificatif" signed l'utilisation qualificatif (sign) ou de unsigned (non sign). Dans ce dernier, il n'y a plus de bit rserv au signe et on ne reprsente plus que des nombres positifs. Son emploi est rserv des sit ations particulires rser situations partic lires
E. M. Nguer UFR SAT UGB emnguer@gmail.com 38

Le Langage C g g
Les types de bases

Constanteentire C t t ti
p La faon la plus naturelle d'introduire une constante entire dans un programme est de l'crire simplement sous forme dcimale, avec ou sans signe, comme dans ces exemples: d l -533 ou 48 48...

Les types entiers

Les types flottants Le type caractre

E. M. Nguer UFR SAT UGB emnguer@gmail.com

39

Le Langage C g g
Les types de bases

Lesdiffrentstypesflottants Les diffrents types flottants


Les types "flottants" permettent de reprsenter, de manire approche, une partie des nombres rels. Pour ce faire, ils s'inspirent de la notation scientifique (ou exponentielle) bien connue qui consiste crire un nombre sous la forme 1.5.1022 ou 0.472 .10-8; dans une telle notation, on nomme : , mantisses les quantits telles que 1.5 ou 0.472 et exposants l quantits t ll que 22 ou -8. t les tit telles 8

Les types entiers

Les types flottants Le type caractre

E. M. Nguer UFR SAT UGB emnguer@gmail.com

40

Le Langage C g g
Les types de bases

Lesdiffrentstypesflottants Les diffrents types flottants


Il ya t i types diffrentes de flottants, trois t diff t d fl tt t dsignes par les mots cls suivants: - float :

Les types entiers

Les types flottants Le type caractre

- double: -l long double : d bl

E. M. Nguer UFR SAT UGB emnguer@gmail.com

41

Le Langage C Longueurdestypeflottants g g
Les types de bases

surlabasedequelquesmachines l b d l hi
Type PDP 11 1970
32 bits 64 bits 64 bits

Les types entiers

Intel 486 1989


32 bits 64 bits 64 bits

Sparc 1993
32 bits 64 bits 64 bits

Pentium 1993
32 bits 64 bits 64 bits

Alpha 1994
32 bits 64 bits 128 bits

Les types flottants Le type caractre

Anne
float double long double

E. M. Nguer UFR SAT UGB emnguer@gmail.com

42

Le Langage C g g
Les types de bases

Constanteflottante C t t fl tt t
En notation dcimale : Exemple : 12.43 -0.38 -.38 4. .27

Les types entiers

Les types flottants Le type caractre

En notation exponentielle Exemple : 4 25E4 E l 4. 4.25e+4 42 5E3 4 25 +4 42. 54.27E-32 542.7E-33 5427e-34

E. M. Nguer UFR SAT UGB emnguer@gmail.com

43

Le Langage C Typecaractreetchanesdecaractres g g yp
Les types de bases

Les types entiers

Les types flottants Le type caractre

Letypecaractreestdsignparlemotclefchar Uncaractreestunnombrereprsentsurunoctet p Uneconstantedetypecaractresenoteencrivant lecaractreentreapostrophes Unechanedecaractresestunesuitedecaractres complteparlecaractrenul(\0) Uneconstantedetypechanedecaractressenote encrivantsescaractresentreguillemets Exemples 3caractres A 2 3chanesdecaractresA Bonjour
B o n j o u r \0
44

Bonjour

E. M. Nguer UFR SAT UGB emnguer@gmail.com

Le Langage C g g
Les types de bases

Caractresnonimprimables Caractres non imprimables


Onpeutfairefigurernimportequel caractre,mmenonimprimabledansune caractre mmenonimprimabledansune constantecaractreouchanedecaractres enutilisantlescombinaisonssuivantes appelessquencesd chappement: appelessquencesdchappement: \n nouvelleligne \t tabulation \a i \ signalsonore l \\ antislash \?? \ \ Exemple : printf(Bonjour\n); affiche Bonjouretva laligne

Les types entiers

Les types flottants Le type caractre

E. M. Nguer UFR SAT UGB emnguer@gmail.com

45

Le Langage C g g
Historique Gnralits Les types de bases Les oprateurs et les expressions e pressions Les entres-sorties Les instructions de contrle Les fonctions Tableaux et pointeurs Les chanes de caractres Les structures Les fichiers Gnie logiciel La gestion dynamique g y q Le prprocesseur

Lesoprateursetlesexpressions L t tl i
Le langage C est certainement l'un des langages g g g g les plus fournis en oprateurs au niveau des oprateurs arithmtiques, relationnels, logiques ou de manipulations de bits. p Mais, de surcrot, le C dispose d'un important ventail d' t t il d'oprateurs originaux d'affectation et i i d' ff t ti t d'incrmentation. Nous allons voir dans cette partie Les L expressions et i Les oprateurs
E. M. Nguer UFR SAT UGB emnguer@gmail.com 46

Le Langage C g g
Les oprateurs et les expressions

Lesexpressions Les expressions


Expression:textecorrectquidtermine unevaleur l Instruction:textequidtermineune actionfaire Touteexpressionpossdeaumoins2 attributs:untypeetunevaleur. Exemple: Siiestunentierdevaleur10, 2*i+3apourtypeentieretpourvaleur23. 3 p yp p 3

Les expressions

Les oprateurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

47

Le Langage C g g
Les oprateurs et les expressions

Lesexpressions Les expressions


Deuxsortesdexpressions: Lvalue(expressionssignifiant lecontenant Lvalue(expressionssignifiant"lecontenant de" expressionsreprsentantunemplacementde lammoire. l i Lavaleurdelexpressionestalorsdfinie commelecontenudecetemplacement.Cas desvariables,descomposantesdestableaux. Unelvaluepossde3attributs:adresse,type, valeur. valeur Ex: x,t[2*i+4] Rvaluelavaleurde Cesexpressionsontuntypeetunevaleur, maispasdadresses Ex: * E 2*x+3,12
E. M. Nguer UFR SAT UGB emnguer@gmail.com 48

Les expressions

Les oprateurs

Le Langage C g g
Les oprateurs et les expressions

Lesexpressions Les expressions


Rvaluelavaleurde Cesexpressionsontuntypeetunevaleur, maispasdadresses Ex: 2*x+3 12 2*x+3,12 Expressionspuresetexpressionseffetde bord Expressionspures p p ex:2*x+3 Expressionsaveceffetdebord ex:i++(vautietremplaceipari+1) y=2*x+3(modifiey)
E. M. Nguer UFR SAT UGB emnguer@gmail.com 49

Les expressions

Les oprateurs

Le Langage C g g
Les oprateurs et les expressions

Lesoprateurs p
Lesoprateurssontleslmentsdu langagequipermettentdefairedu l i d f i d calculoudedfinirdesrelations. Ilsserventcombinerdesvariableset desconstantespourraliserdes expressions p

Les expressions

Les oprateurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

50

Le Langage C g g
Les oprateurs et les expressions

Lesoprateurs p
Oprateursarithmtiques :+,,*,/,% Oprateursdecomparaison : p p ==,!=,<,<=,>,>= Ilssontprioritairesparrapportet etou. Affectation expr1=expr2(expr1:lvalue,expr2:rvalue) Considrecommeuneexpression.Peutainsi figurercommeoprandedansune fi d d expression.IlestainsipossibledcrireenC: i=j=k=0 i=(j=(k=0)) Ex:c=getchar(); while(c!=f){ t[nbcars]=c; nbcars=nbcars+1; c=getchar(); }
E. M. Nguer UFR SAT UGB emnguer@gmail.com 51

Les expressions

Les oprateurs

Le Langage C g g
Les oprateurs et les expressions

Lesoprateurs p
Laffectationtantunesorte d expression,ceprogrammepeuts crire dexpression ceprogrammepeutscrire :
while((c=getchar())!=f){ (( g ()) ){ t[nbcars]=c; nbcars++; }

Les expressions

Les oprateurs

Oprateursdaffectationtendues (largies) Cproposedescombinaisonspuissantes d oprateurs,danslecasol oprande doprateurs,danslecasoloprande gauchedusigne=seretrouvedroite. expr1+=expr2 expr1=expr1+expr2 p p p p p


E. M. Nguer UFR SAT UGB emnguer@gmail.com 52

Le Langage C g g
Les oprateurs et les expressions

Lesoprateurs p
Demaniregnrale,siexpr1etexpr2sontdes expressions expr1op=expr2 expr1=(expr1)op(expr2) Oprateursdincrmentationetde p dcrmentation Ilexistedeuxoprateursunaires++diffrents: lunestpostfix(critderrireloprande), l fi ( i d i l d ) lautreestprfix(devant)
Post incrmentation Postincrmentation Format:exp++ expdoittredetypenumrique(entierou flottant)oupointeur. Cetteexpressionalemmetypequeexp,lemme effetdebordqueceluidel affectationexp exp+ effetdebordqueceluidelaffectationexp=exp+ 1etalavaleurdeexpavantlvaluationdeexp++
E. M. Nguer UFR SAT UGB emnguer@gmail.com 53

Les expressions

Les oprateurs

Le Langage C g g
Les oprateurs et les expressions

Lesoprateurs p
Princrmentation Format:++exp p Icilexpressionalammevaleurqueexpaprs lvaluation Exemples y=x++ {y=x;x=x+1;} y=++x {x=x+1;y=x;}

Les expressions

Les oprateurs

Ilenestdemmedesoprateurs Expressionsconditionnelles expr1?expr2:expr3 expr1estdabordvalue S sa a eu 0, e p es Sisavaleur0,expr2estvalueetdfinitla a u ee d a valeurdelexpressionconditionnelle.Dansce cas,expr3pasvalue.Sinonexpr3estvalue etdfinitlavaleurdel expression etdfinitlavaleurdelexpression conditionnelle,expr2pasvalue.
E. M. Nguer UFR SAT UGB emnguer@gmail.com 54

Le Langage C g g
Les oprateurs et les expressions

Lesoprateurs p
Exemple:y=(x!=0)?(1/x):maxfloat

Les expressions

Les oprateurs

Lesoprateurslogiques Oprateurs&&et|| Lesexpressionsdanslesquellesfigurent L i d l ll fi cesoprateurssontvaluesdegauche droite,etl valuationcessedsquela droite etlvaluationcessedsquela vracitoulafaussetdursultatest tablie. tablie &&estprioritairesur||,maistousdeux s appliquentaprslesoprateursde sappliquentaprslesoprateursde comparaisonetdgalit ex:if(a<b&&a<c)a=0;
E. M. Nguer UFR SAT UGB emnguer@gmail.com 55

Le Langage C g g
Les oprateurs et les expressions

Lesoprateurs p
Changementdetype(cast) conversionexpliciteparloprateurde i li i l d cast (nomdetype)expression ( d ) i ex:(int)c; (int)2.35 2 (float)2 2.0 conversionsutiles ) 1)entier flottant 2)flottant entier
E. M. Nguer UFR SAT UGB emnguer@gmail.com 56

Les expressions

Les oprateurs

Le Langage C g g
Les oprateurs et les expressions

Lesoprateurs p
Oprateursizeof Donnelatailleenoctets D l ill sizeof(type) sizeof(int) sizeof(t)=tailledutableaut sizeof(t)/sizeof(t[0])=nombrede composantesdet Oprationsbitbit p Oprationsnonabstraites Oprationabstraite:nefaitpas intervenirlesparticularitsdulangage p g g
E. M. Nguer UFR SAT UGB emnguer@gmail.com 57

Les expressions

Les oprateurs

Le Langage C g g
Les oprateurs et les expressions

Les oprateurs Lesoprateurs


Complment1~ ex expr 10101100 ~expr 01010011 &et & |ou ^ouexclusif(xor) l f( )

Les expressions

Les oprateurs

ex

&

00110011 0011 | ^ 0101 01010101 000101110110


58

E. M. Nguer UFR SAT UGB emnguer@gmail.com

Le Langage C g g
Les oprateurs et les expressions

Lesoprateurs p
<<dcalagegauche >>dcalagedroite

Les expressions

Les oprateurs

exexpr1b1b2b3b4 expr=expr1<<1b2b3b40 Oprateursquentiel(oprateur virgule) syntaxee1,e2 Permetderegrouperplusieurs expressionsenuneseule Lexpressionpossdeletypeetlavaleur y dee2 d Leplussouventutilisdanslesboucles "f " for
E. M. Nguer UFR SAT UGB emnguer@gmail.com 59

Le Langage C g g
Les oprateurs et les expressions

Lesoprateurs p
Oprateurdadressage Donnel adressed unevariableoud une Donneladressedunevariableoudune expressionquiestunelvalue Format:&exp inti,*p; p=&i; iet*pdsignentlemme iet pdsignentlemme objet Utilisdansscanf(%d%f,&i,&t[j]); ( , , [j]); Oprateurdeslection .x.info >x>info revoirdanslesstructures
E. M. Nguer UFR SAT UGB emnguer@gmail.com 60

Les expressions

Les oprateurs

Le Langage C g g
Les oprateurs et les expressions

Lesoprateurs p
Rcapitulatif desprioritsdetouslesoprateurs Priorit desoprateurs:dcroissante parniveauetduhautverslebas Associativitdesoprateurs(indique l ordredesoprationssionometles()) lordredesoprationssionometles())
Associativit gauche :x+y+z=((x+y)+z) Associativitdroite:x=y=z=(x=(y= A i ti itd it ( ( z))

Les expressions

Les oprateurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

61

Le Langage C g g
Les oprateurs et les expressions

Tableaurcapitulatif p
Oprateur Symbole Exemple Associativit

Les expressions

Les oprateurs

indexation [] champ de structure . -> appel de fonction () ngation logique ngation bit bit incrmentation dcrmentation moins unaire plus unaire conversion taille adresse indirection ! ~ ++ -+ ( yp ) (type) sizeof & *

t[i][j] gauche c.reel p->imag gauche max(t) gauche !x ~x i++ ++i i---i -2 2 +2 ( ) (int) sizeof(int) &x *p droite droite droite droite droite droite droite droite droite droite
62

E. M. Nguer UFR SAT UGB emnguer@gmail.com

Le Langage C Tableau rcapitulatif g g p f


Les oprateurs et les expressions

Oprateur multiplication division modulo Addition soustraction dcalage gauche dcalage droite oprateurs oprate rs relationnels oprateurs dgalitp g ingalit et bit bit

Symbole * / % + << >> < <= > < >= == != &

Exemple x*y x/y x%y x+y x-y x << 4 x >> n

Associativit gauche gauche gauche gauche gauche gauche gauche

Les expressions

Les oprateurs

x < 0 x > y ga che <= gauche x ==y x != 0 gauche y g x&b gauche

E. M. Nguer UFR SAT UGB emnguer@gmail.com

63

Le Langage C Tableau rcapitulatif g g p f


Les oprateurs et les expressions

Oprateur ou exclusif bit bit ou bit bit ou logique expression conditionnelle diti ll affectation affectation tendue composition dexpressions

Symbole ^ | || ?: = / += -= *= /= &= ^= |= <<= >>= ,

Exemple x^y x|y (x ==0) || (y>0) (x > 0)? x : -x x =1 x %= 1 y += 1 % z <<= 5 x = 1, b = x+1; z += 10

Associativit g gauche gauche gauche droite droite droite

Les expressions

Les oprateurs

gauche

E. M. Nguer UFR SAT UGB emnguer@gmail.com

64

Le Langage C g g
Historique Gnralits Les types de bases Les oprateurs et les expressions e pressions Les entres-sorties Les instructions de contrle Les fonctions Tableaux et pointeurs Les chanes de caractres Les structures Les fichiers Gnie logiciel La gestion dynamique g y q Le prprocesseur

Lesentressorties L t ti
Entres-sorties de caractres Entres-sorties formates Entres-sorties de lignes de caractres

E. M. Nguer UFR SAT UGB emnguer@gmail.com

65

Le Langage C g g
Historique Gnralits Les types de bases Les oprateurs et les expressions e pressions Les entres-sorties Les instructions de contrle Les fonctions Tableaux et pointeurs Les chanes de caractres Les structures Les fichiers Gnie logiciel La gestion dynamique g y q Le prprocesseur

Lesentressortieslmentaires l
Leur utilisation ncessite la bibliothque :
#include <stdio.h> compose de :

stdin : unit standard dentre clavier tdi it t d d d t l i stdout : unit standard de sortie cran stderr : unit standard daffichage des erreurs cran

E. M. Nguer UFR SAT UGB emnguer@gmail.com

66

Le Langage C g g
Les entres-sorties

Entres-sorties de caractres Entres-sorties formates Entres-sorties de lignes de caractres

Fonction getchar Permet dobtenir le caractre suivant du fichier courant des entres. Si la fin du fichier est rencontre, la valeur EOF est retourne int i = 0; char c; while ((c = getchar()) != EOF && (i < 20)) { tab[i++] = c; } L'expression : c = getchar() joue le mme rle que scanf ( '' % '' , &c). f %c'' & ) Comme putchar, getchar est une ''macro'' dont les instructions figurent dans stdio.h. i t ti fi td tdi h
E. M. Nguer UFR SAT UGB emnguer@gmail.com 67

Entres sorties Entres-sorties de caractres

Le Langage C g g
Les entres-sorties

Entres sorties Entres-sorties de caractres


Fonction putchar Permet d envoyer le caractre prcis en paramtre denvoyer dans le fichier courant de sortie for (i = 0; i < 10; i++) putchar(tab[i]); h ( bi) L' expression putchar() joue le mme rle que: printf ('' %c'' , c) ( %c c). Notez qu'en toute rigueur p q g putchar n'est p une pas vraie fonction mais une ''macro". Ses instructions (crites en C) seront incorpores votre programme par la directive:#include <stdio.h>
E. M. Nguer UFR SAT UGB emnguer@gmail.com 68

Entres-sorties de caractres Entres-sorties formates Entres-sorties de lignes de caractres

Le Langage C g g
Les entres-sorties

Entres sorties Entres-sorties formates


Fonction printf Permet denvoyer dans le fichier courant de sortie, y , une dition dinformations formattes Syntaxe : printf(<format>, p1, p2, , pn); <format> : chane de caractres contenant du texte et des spcificateurs de format (% suivi d un dun caractre de conversion) %d int %d o g %ld long % %f float oa %lf double %s char[ ]

Entres-sorties de caractres Entres-sorties formates Entres sorties Entres-sorties de lignes de caractres

printf(Bonjour); printf(Resultats : %d\n, res); printf(x = %d\t y = %f\n, x, y);


E. M. Nguer UFR SAT UGB emnguer@gmail.com 69

Le Langage C g g
Les entres-sorties

Action sur le gabarit d affichage d'affichage


Par dfaut, les entiers sont affichs avec le nombre de caractres ncessaires (sans espace avant ou aprs) et les flottants avec six chiffres aprs le point. Un nombre plac aprs % dans le code de format p prcise un gabarit d'affichage, c'est--dire un nombre g g minimal de caractres utiliser. Si le nombre peut s'crire avec moins de caractres, printf le fera prcder d'un nombre suffisant d'espaces en revanche, si le nombre ne peut s'afficher convenablement dans le gabarit imparti, printf utilisera le nombre de caractres ncessaires. ili l b d i
E. M. Nguer UFR SAT UGB emnguer@gmail.com 70

Entres-sorties de caractres Entres-sorties formates Entres sorties Entres-sorties de lignes de caractres

Le Langage C g g
Les entres-sorties

Entres sorties Entres-sorties formates


Exemples: int p = 9; printf("p = %5d",p); donne p = ^^^^9 et printf("p=%-5d",p); donne p = 9^^^^

Entres-sorties de caractres Entres-sorties formates Entres sorties Entres-sorties de lignes de caractres

Fonction scanf Permet de rechercher des informations, selon un format prcis dans le fichier courant des entres Syntaxe : S t scanf(<format>, &p1, &p2, , &pn) scanf(%d%d%f, & &b, &c); f(%d%d%f &a, &b & )
E. M. Nguer UFR SAT UGB emnguer@gmail.com 71

Le Langage C g g
Les entres-sorties

Entres-sorties de lignes de caractres


Fonction puts crit i sur la sortie standard la ligne fournie en l i d d l li f i paramtre. Le caractre \n est automatiquement ajout aprs le dernier caractre de la ligne Fonction gets Lit une ligne partir de lentre standard en la compltant par \0. char buf[20]; int i; gets(buf); while(buf[i] != \0) { putchar(buf[i]); i = i + 1; }
E. M. Nguer UFR SAT UGB emnguer@gmail.com 72

Entres-sorties de caractres Entres-sorties formates Entres-sorties de lignes de caractres

Le Langage C g g
Historique Gnralits Les types de bases Les oprateurs et les e p ess o s expressions Les entres-sorties Les instructions de contrle Les fonctions Tableaux et pointeurs Les h L chanes d de caractres Les structures Les fichiers L fi hi Gnie logiciel g y q La gestion dynamique Le prprocesseur

Lesinstructionsdecontrle
Notion de bloc tiquettes et instruction Instruction if else Instruction while et do while Instruction for Instruction switch Instructions break et continue Instruction return

E. M. Nguer UFR SAT UGB emnguer@gmail.com

73

Le Langage C
Les instructions de contrle Notion de bloc tiquettes et instruction Instruction if else Instruction while et while do while Instruction for Instruction switch Instructions break et continue Instruction return

Notion de bloc
Suite de dclarations et dinstructions encadre par les deux accolades { et } { dclaration dclaration instruction instruction } exemple if (t[i] > t[i+1]) { ( ) Rq : optimisation de lespace q p p int w; if (----) { w = t[i]; int i; t[i] = t[i+1]; t[i+1] = w; } else { } float x }
E. M. Nguer UFR SAT UGB emnguer@gmail.com 74

Le Langage C
Les instructions de contrle Notion de bloc tiquettes et instruction Instruction if else Instruction while et while do while Instruction for Instruction switch Instructions break et continue Instruction return

tiquettes et instruction q
Format : etiquette : instruction une tiquette est un identificateur q goto etiquette; transfre le contrle linstruction prfixe par ltiquette A ne pas utiliser, sauf dans certains cas for (--------) { f ( ) for (---- -- -) for(---------) f ( ) if (-----) goto sortie; . sortie : . }
E. M. Nguer UFR SAT UGB emnguer@gmail.com 75

Le Langage C
Les instructions de contrle Notion de bloc tiquettes et instruction Instruction if else Instruction while et while do while Instruction for Instruction switch Instructions break et continue Instruction return

Instruction if else f
Format : if (expr) instr1 else instr2 if (expr) instr1 Exemple: p if (x != 0) y = A/x; if (c >= 0 && c <= 9) printf("chiffre);
E. M. Nguer UFR SAT UGB emnguer@gmail.com

76

Le Langage C
Les instructions de contrle Notion de bloc tiquettes et instruction Instruction if else Instruction while et while do while Instruction for Instruction switch Instructions break et continue Instruction return

Instruction while
Syntaxe : while (expression) instruction i i

c = A; while(c <= Z) { putchar(c); c = c + 1; }

E. M. Nguer UFR SAT UGB emnguer@gmail.com

77

Le Langage C
Les instructions de contrle Notion de bloc tiquettes et instruction Instruction if else Instruction while et while do while Instruction for Instruction switch Instructions break et continue Instruction return

Instruction do while
Syntaxe : do instruction while (expression);

instruction est excute au moins une fois do { printf(donnez un nb > 0 :); scanf(%d, &n); } while ( n <= 0); Noter la diffrence avec repeatuntil
E. M. Nguer UFR SAT UGB emnguer@gmail.com

78

Le Langage C
Les instructions de contrle Notion de bloc tiquettes et instruction Instruction if else Instruction while et while do while Instruction for Instruction switch Instructions break et continue Instruction return

Instruction for f
Format : for(expr1;expr2;expr3) instruction expr1; while(expr2) { instruction expr3; } expr1 initialisations expr2 test de continuation expr3 expression (incrmentation.) 3 i (i t ti )

E. M. Nguer UFR SAT UGB emnguer@gmail.com

79

Le Langage C
Les instructions de contrle Notion de bloc tiquettes et instruction Instruction if else Instruction while et while do while Instruction for Instruction switch Instructions break et continue Instruction return

Instruction for f
int n, i, fact; for(i = 1, fact = 1; i <= n; i++) ( ) fact *= i; printf(%d ! = %d\n, n, fact); for ( ;expr2; ) while( expr2) instruction i t ti instruction i t ti for ( ; ; ) instruction for ( ; ; ) { p printf(Entrez un nbre ( 0 pour sortir ) : ); ( p ); scanf(%d, &n); if ( n == 0) break; }
E. M. Nguer UFR SAT UGB emnguer@gmail.com 80

Le Langage C
Les instructions de contrle Notion de bloc tiquettes et instruction Instruction if else Instruction while et while do while Instruction for Instruction switch Instructions break et continue Instruction return

Instruction switch
Format : switch(expression) corps Le corps prend la forme dun bloc renfermant une suite dinstructions de la forme case expression-constante : ou o bien default : defa lt switch(reponse) { ; case A : <<traitement associ A>> break; case B : <<traitement associ B>> break; default : <<traitement associ aux autres cas>> }
E. M. Nguer UFR SAT UGB emnguer@gmail.com 81

Le Langage C
Les instructions de contrle Notion de bloc tiquettes et instruction Instruction if else Instruction while et while do while Instruction for Instruction switch Instructions break et continue Instruction return

Instruction switch
main( ) { char c = getchar(); switch(c) { case 1 : case 2 : 2 case 3 : case 5 : case 7 : printf( %c est premier\n, c); break; case 6 : printf( %c est multiple de 3\n, c); case 4 : 4 case 8 : printf( %c est multiple de 2\n, c); break; case 9 : printf( %c est multiple de 3\n, c); i f( % l i l d 3\ ) break; default : printf( %c nest p un chiffre\n, c); p ( pas , ); }
E. M. Nguer UFR SAT UGB emnguer@gmail.com 82

Le Langage C
Les instructions de contrle Notion de bloc tiquettes et instruction Instruction if else Instruction while et while do while Instruction for Instruction switch Instructions break et continue Instruction return

Instructions break et continue


break : Dans la porte d une structure de contrle (for, dune while, do, switch), linstruction break provoque labandon de la structure et le passage linstruction suivante continue : moins utilise. Abandon de litration courante dans une boucle, et, si la condition lautorise, dmarrage de litration suivante

E. M. Nguer UFR SAT UGB emnguer@gmail.com

83

Le Langage C
Les instructions de contrle Notion de bloc tiquettes et instruction Instruction if else Instruction while et while do while Instruction for Instruction switch Instructions break et continue Instruction return

Instructions break et continue


#define n 99 main( ) { int n; do { printf(Donnez un nbre positif); i f(D b i if) scanf(%d, &n); if (n == N) break; if ( n < 0) { printf(le nbre doit tre positif); continue; } printf(Son carr est : %d\n, n * n); }while(n); }
E. M. Nguer UFR SAT UGB emnguer@gmail.com 84

Le Langage C
Les instructions de contrle Notion de bloc tiquettes et instruction Instruction if else Instruction while et while do while Instruction for Instruction switch Instructions break et continue Instruction return

Instruction return
Format : return expression; ou return; Abandon de la fonction en cours et retour la fonction appelante float fl t moy(float x, float y) { (fl t fl t ) float som; som = x+y; return som/2; }

E. M. Nguer UFR SAT UGB emnguer@gmail.com

85

Le Langage C

Lesfonctions
Historique Gnralits Les types de bases Les oprateurs et les expressions e pressions Les entres-sorties Les instructions de contrle Les fonctions Tableaux et pointeurs Les chanes de caractres Les structures Les fichiers Gnie logiciel La gestion dynamique g y q Le prprocesseur

Comme tous les langages, C permet de dcouper un p g p p programme en plusieurs parties nommes souvent "modules". Cette programmation dite "modulaire" se justifie pour de multiples raisons: - Un programme crit d'un seul tenant devient i d l d i difficile comprendre ds qu'il dpasse une ou deux pages de texte. p g - La programmation modulaire permet d'viter des squences d'instructions rptitives, et cela d autant d'autant plus que la notion d argument permet de d'argument" "paramtrer" certains modules. - La programmation modulaire permet le partage d'outils communs qu'il suffit d'avoir crits et mis au point une seule fois. Cet aspect sera d'autant plus marqu que C autorise effectivement la compilation spare de tels modules. il ti d t l d l
E. M. Nguer UFR SAT UGB emnguer@gmail.com 86

Le Langage C
Les fonctions

Dfinition dune fonction f f


Syntaxe: type ident(declaration ident,, declaration ident) bloc di bl dinstructions i Exemple: float puissance(float x int n) { x, int i; float p = 1; for (i = 0; i < n; i++) ( ) p *= x; return p; } float puissance(float x int n) est appel entte x, de la fonction. float puissance(float, int); est appel prototype de la fonction.
E. M. Nguer UFR SAT UGB emnguer@gmail.com 87

Dfinition, dclaration et appels Allocation et dure de vie des variables Passage des arguments Arguments en nombre variable i bl Fonctions rcursives Exercices

Le Langage C
Les fonctions

Dclaration dune fonction f


La dfinition dune fonction peut tre donne avant p ou aprs la fonction main. Dans le premier cas, il est inutile de la dclaration dans main(). d i () La dclaration peut se faire en crivant : soit un entte identique celui de la dfinition soit le prototype

Dfinition, dclaration et appels Allocation et dure de vie des variables Passage des arguments Arguments en nombre variable i bl Fonctions rcursives Exercices

E. M. Nguer UFR SAT UGB emnguer@gmail.com

88

Le Langage C
Les fonctions

Dclaration dune fonction f


Exemple:

int main(void){ /***programme principal ***/ int i m = 3; 3 Dfinition, dclaration float y, nbre = 10.0; et appels /* dclaration de la fonction carr */ Allocation et dure de vie float puissance(float x, int n) ; des variables /* appel de carre avec larguments x, n et p */ y = fexple ( p (nbre, m) ; , ) Passage des printf ("valeur de y : %f\n", y) ; arguments return 0 ; Arguments en nombre } variable i bl float puissance(float x, int n) { /**la fonction fexple **/ Fonctions rcursives int i; float p = 1; for (i = 0; i < n; i++) Exercices p *= x; return p; }
E. M. Nguer UFR SAT UGB emnguer@gmail.com 89

Le Langage C
Les fonctions

Appel dune fonction pp f


Exemple dappel : v = puissance(5,2); v = 2 * puissance (4*u + 5, k) + 3;

Dfinition, dclaration et appels Allocation et dure de vie des variables Passage des arguments Arguments en nombre variable i bl Fonctions rcursives Exercices

E. M. Nguer UFR SAT UGB emnguer@gmail.com

90

Le Langage C
Les fonctions

Arguments muets et arguments effectifs g g ff f


Les arguments figurant dans l'en-tte de la fonction se nomment des "arguments muets" f i d " " (ou encore "arguments formels" ou "paramtres formels"). ) Leur rle est de permettre, au sein du corps de la fonction, de dcrire ce qu'elle doit faire. Les arguments lappel de la fonction sont appels "arguments effectifs . arguments effectifs"

Dfinition, dclaration et appels Allocation et dure de vie des variables Passage des arguments Arguments en nombre variable i bl Fonctions rcursives Exercices

E. M. Nguer UFR SAT UGB emnguer@gmail.com

91

Le Langage C
Les fonctions

Fonctions sans valeur de retour.


Quand une fonction ne renvoie pas de rsultat, on le prcise, la fois dans l'en-tte et dans sa dclaration, l'aide du mot cl void. Exemple: void sansval (int n) //entte void sansval (int) ; //dclaration sansval(5); //Un exemple dappel Naturellement, la dfinition d'une telle fonction ne doit, en principe, contenir aucune instruction return.

Dfinition, dclaration et appels Allocation et dure de vie des variables Passage des arguments Arguments en nombre variable i bl Fonctions rcursives Exercices

E. M. Nguer UFR SAT UGB emnguer@gmail.com

92

Le Langage C
Les fonctions

Fonctions sans argument. g


Quand une fonction ne reoit aucun argument, on place le mot cl void (le mme que prcdemment, mais avec une signification diffrente !) la place de la liste d'arguments. d'arg ments Exemple:

Dfinition, dclaration et appels Allocation et dure de vie des variables Passage des arguments Arguments en nombre variable i bl Fonctions rcursives Exercices

double tirage (void) //lentte doub e tirage (void) //la dclaration double t age (vo d) ; // a dc a at o y=tirage(); //un exemple dappel

E. M. Nguer UFR SAT UGB emnguer@gmail.com

93

Le Langage C
Les fonctions

Allocation et dure de vie des variables


En fait, en C comme en Pascal, plusieurs fonctions (dont, bien entendu le programme principal main) peuvent partager des variables communes qu'on qualifie alors de globales. Les variables globales ne sont connues du compilateur que dans la partie du programme source suivant leur dclaration. Les variables locales ne sont connues qu l intrieur qu lintrieur de la fonction o elles sont dclares. Il est toutefois possible, grce au mot cl STATIC , de demander dattribuer un emplacement permanent une variable locale et quainsi sa valeur se conserve dun appel au suivant. i t
E. M. Nguer UFR SAT UGB emnguer@gmail.com 94

Dfinition, dclaration et appels Allocation et dure de vie des variables Passage des arguments Arguments en nombre variable i bl Fonctions rcursives Exercices

Le Langage C
Les fonctions

Allocation et dure de vie des variables


Les variables globales sont toujours statiques, i.e. permanentes : existent pendant toute la dure de lexcution Les variables locales et les arguments formels sont automatiques Le qualificatif static permet de modifier lallocation et la dure de vie des variables locales.
#include <stdio.h> main( ) { void fct(void); int n; for(n = 1; n <= 5; n++) fct( ); } void fct(void) { static int i; i++; printf(Appel numro : , ); %d\n ", i); } appel numro : 1 appel numro : 2 appel numro : 3 appel numro : 4 appel numro : 5 Ne pas confondre variable locale statique et variable globale

Dfinition, dclaration et appels Allocation et dure de vie des variables Passage des arguments Arguments en nombre variable i bl Fonctions rcursives Exercices

E. M. Nguer UFR SAT UGB emnguer@gmail.com

95

Le Langage C
Les fonctions

Passage des arguments g g


En C, les arguments sont toujours passs par valeur.

Arguments en nombre variable i bl Fonctions rcursives Exercices

#include <stdio.h> int i ( id){ i main(void){ Dfinition, dclaration et void echange (int a, int b) ; appels int n=10, p=20 ; Allocation et dure de vie printf ("avant appel: %d %d\n", n, p) ; des variables echange (n, p) ; p printf ("aprs appel: %d %d", n, p) ; ( p pp , , Passage des return 0 ; arguments } void echange (int a, int b){ int c ; printf ("dbut echange : %d %d\n , a b) ; ( dbut %d\n" a, c=a;a=b;b=c; printf ("fin echange : /d %d\n", a, b) ; }
E. M. Nguer UFR SAT UGB emnguer@gmail.com

avant appel : 10 20 dbut change : 10 20 fin change : 20 10 aprs appel : 10 20

96

Le Langage C
Les fonctions

Passage des arguments g g


Ce problme peut tre rsolu en transmettant en g argument la "valeur'' de l'adresse d'une variable. La fonction pourra ventuellement agir sur le "contenu" de cette adresse. C'est prcisment ce que nous faisons lorsque nous utilisons la fonction scanf. scanf Nous y reviendrons en dtail dans la p partie consacre aux pointeurs.

Dfinition, dclaration et appels Allocation et dure de vie des variables Passage des arguments Arguments en nombre variable i bl Fonctions rcursives Exercices

E. M. Nguer UFR SAT UGB emnguer@gmail.com

97

Le Langage C
Les fonctions

Arguments en nombre variable g


C permet de dfinir des fonctions dont le nombre darguments nest pas fix et peut ne pas tre le mme dun appel lautre. Une fonction avec un nombre variable darguments a ec n ariable darg ments est dclare en explicitant quelques arguments fixes, au moins, suivis d une virgule et trois points. dune Exple int max( short n, int x1, )

Dfinition, dclaration et appels Allocation et dure de vie des variables Passage des arguments Arguments en nombre variable b i bl Fonctions rcursives Exercices

La fonction peut tre appele avec un nombre quelconque d arguments effectifs, mais il faut darguments effectifs quil y en ait au moins autant quil y a darguments formels nomms.
E. M. Nguer UFR SAT UGB emnguer@gmail.com

98

Le Langage C
Les fonctions

Arguments en nombre variable g


On utilise des macros dfinis dans <stdarg.h> va list pointeur va_list dclaration de la variable pointeur, qui sera utilis comme argument dans les appels des macros va_start et va_arg. va_start(pointeur, dernier argument) (p , g ) Initialisation de la variable pointeur; dernier argument dernier des arguments explicitement g g p nomms va_arg(pointeur, type) Parcours des arguments anonymes : le premier appel donne le premier argument anonyme,
E. M. Nguer UFR SAT UGB emnguer@gmail.com

Dfinition, dclaration et appels Allocation et dure de vie des variables Passage des arguments Arguments en nombre variable b i bl Fonctions rcursives Exercices

99

Le Langage C
Les fonctions

Arguments en nombre variable g


Exemple: #include <stdarg.h> <stdarg h> int max ( short n, int x1,) { va_list va list p; int m, x, i; m = x1; va_start(p, x1); ( ; ; ) for( i = 1; i < n; i++) { x = va_arg(p, int); if ( x > m ) m = x; } return m; }
E. M. Nguer UFR SAT UGB emnguer@gmail.com 100

Dfinition, dclaration et appels Allocation et dure de vie des variables Passage des arguments Arguments en nombre variable b i bl Fonctions rcursives Exercices

Le Langage C
Les fonctions

Arguments en nombre variable g


Appels de cette fonction : a = max( 3, p, q, r); b = max( 8, x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7]); Pour les arguments nomms, laffectation des valeurs des arguments effectifs aux arguments l d t ff tif t formels est faite comme dordinaire. Pour les arguments anonymes, les char et les short sont convertis en int, les float en double

Dfinition, dclaration et appels Allocation et dure de vie des variables Passage des arguments Arguments en nombre variable b i bl Fonctions rcursives Exercices

E. M. Nguer UFR SAT UGB emnguer@gmail.com

101

Le Langage C
Les fonctions

Fonctions rcursives
Le langage C autorise la rcursivit des appels de fonctions. Exemple : long fac(n){ if (n>1) return (f ( 1)* ) (fac(n-1)*n); else return (1); t (1) }

Dfinition, dclaration et appels Allocation et dure de vie des variables Passage des arguments Arguments en nombre variable i bl Fonctions rcursives Exercices

E. M. Nguer UFR SAT UGB emnguer@gmail.com

102

Le Langage C
Les fonctions

Exercices
Ecrire: - une fonction, nomme f1, se contentant d'afficher ''bonjour'' (elle ne possdera aucun argument ni valeur de retour), - une fonction, nomme f2 qui affiche "bonjour" un fonction bonjour nombre de fois gal la valeur reue en argument (int) et qui ne renvoie aucune valeur, - une fonction, nomme f3 qui fait la mme chose que f2 mais qui, de plus, renvoie la valeur (int) 0. Ecrire un petit programme appelant successivement chacune de ces trois fonctions, aprs les avoir fonctions convenablement dclares sous forme d'un prototype.

Dfinition, dclaration et appels Allocation et dure de vie des variables Passage des arguments Arguments en nombre variable i bl Fonctions rcursives Exercices

E. M. Nguer UFR SAT UGB emnguer@gmail.com

103

Le Langage C g g
Historique Gnralits Les types de bases Les oprateurs et les expressions e pressions Les entres-sorties Les instructions de contrle Les fonctions Tableaux et pointeurs Les chanes de caractres Les structures Les fichiers Gnie logiciel La gestion dynamique g y q Le prprocesseur

Lestableauxetles p pointeurs
Un tableau est un ensemble d'lments yp g p ordonnes de mme type dsigns par un identificateur unique; chaque lment est repr par un indice prcisant sa position au sein de l'ensemble. i t iti i d l' bl Un pointeur est une variable destine contenir ladresse dun "objet" (variables, fonctions. . .). Un identificateur de tableau est une "constante pointeur". Cela peut se rpercuter dans le traitement des tableaux, tableaux notamment lorsque ceux-ci sont ceux ci transmis en argument de l'appel d'une fonction. C'est ce qui justifie que ces deux notions soient regroupes dans un seul chapitre.
E. M. Nguer UFR SAT UGB emnguer@gmail.com 104

Le Langage C
Tableaux et pointeurs

Dclaration
TYPE ident[TAILLE]; Elle rserve un emplacement pour TAILLE lments de type TYPE. Exemple: t[20] rserve l'emplacement pour 20 lments de type int. Chaque lment est repr par son indice dans le tableau. Conventionnellement, en langage C, la premire position porte le numro 0. Ici, d I i donc, nos indices vont de 0 19. i di td 19 Le premier lment du tableau sera dsign par t[0], le troisime par t[2] et le dernier par t[l9]. Plus gnralement, t[i] dsigne llment dont la position dans le tableau est fournie par la valeur de i. ii d l bl f i l l d i
E. M. Nguer UFR SAT UGB emnguer@gmail.com 105

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

Le Langage C
Tableaux et pointeurs

Les lments de tableau


Un lment de tableau est une lvalue. Il peut donc apparatre gauche d'un oprateur d'affectation comme dans: t[2] = 5 Il peut aussi apparatre comme oprande d'un oprateur d'incrmentation comme dans: t[3]++, --t[i] En revanche, il n'est pas possible, si tl et t2 sont des tableaux d entiers, d crire tl = t2; d'entiers, d'crire En fait, le langage C n'offre aucune possibilit d'affectations globales de tableaux, comme c'tait d' ff i l b l d bl ' i le cas, par exemple, en Pascal.

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

106

Le Langage C
Tableaux et pointeurs

Les indices
Un indice peut prendre la forme de n'importe quelle expression arithmtique de type entier (ou caractre, compte tenu des rgles de conversion systmatique). Exemple: t[3+2*i]

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

107

Le Langage C
Tableaux et pointeurs

La dimension d'un tableau


La dimension d'un tableau (son nombre d'lments) ne peut tre qu'une constante ou une expression constante. Ainsi, cette construction : #define N 50 .... int t[N] ; double h[2*N- 1 ]; est correcte. Elle ne le serait pas, par contre, si N tait une constante symbolique dfinie par const int N = 50 (les expressions N et 2*N-1 n'tant alors plus calculables par le compilateur).
E. M. Nguer UFR SAT UGB emnguer@gmail.com

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

108

Le Langage C
Tableaux et pointeurs

Dbordement d'indice
Aucun contrle de "dbordement d'indice" n'est mis p p p p p en place par la plupart des compilateurs. Pour en comprendre les consquences, il faut savoir que, que lorsque le compilateur rencontre une lvalue telle que t[i] , il en dtermine l'adresse en ajoutant l'adresse de dbut du tableau t, un ''dcalage" proportionnel la valeur de i (et aussi proportionnel la taille de chaque lment du tableau). De sorte qu'il est trs facile (si l'on peut dire !) de dsigner et, partant, de modifier, un emplacement situ avant ou aprs le tableau.

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

109

Le Langage C
Tableaux et pointeurs

Initialisation
Il est possible d'initialiser un tableau avec une liste p p p g , d'expressions constantes spares par des virgules, et entoure des signes { et }. Exemple : #define N 5 int i t[N] = {1, 2, 3, 4, 5}; { } On peut donner moins d expressions constantes que d'expressions le tableau ne comporte d'lments. Dans ce cas, les p premiers lments du tableau seront initialiss avec les valeurs indiques, les autres seront initialiss zro. Exemple : #define N 10 int t[N] = {1, 2}; //t[0]=1; t[1]=2; t[i]=0; pour i=2 9
E. M. Nguer UFR SAT UGB emnguer@gmail.com 110

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

Le Langage C
Tableaux et pointeurs

Dclaration
TYPE ident[TAILLE1][TAILLEN]; TAILLE1 TAILLEN rserve un tableau de TAILLE1**TAILLEN lments. Exemple: t[5][3] rserve un tableau de 15 (5 x 3) E l t bl d lments. Un lment quelconque de ce tableau se trouve alors repr par deux indices comme dans ces notations: t[3][2] ; t[i][j]; t[i-3][i +j] Notez bien que, l encore, la notation dsignant un lment d'un tel tableau est une lvalue. Il n'en ira toutefois pas de mme de notations telles que t[3] ou t[j] bien que, comme nous le verrons un peu plus tard, tard de telles notations aient un sens en C. C
E. M. Nguer UFR SAT UGB emnguer@gmail.com 111

Tableaux un indice Tableaux plusieurs indices l i i di Les pointeurs Relations entre tableaux et pointeurs

Le Langage C
Tableaux et pointeurs

Dclaration
Aucune limitation ne pse sur le nombre d'indices q p p que peut comporter un tableau. Seules les limitations de taille mmoire lies un environnement donn risquent de se faire sentir. sentir

Tableaux un indice Tableaux plusieurs indices l i i di Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

112

Le Langage C
Tableaux et pointeurs

Initialisation
Il est possible d'initialiser un tableau plusieurs p indices avec une liste d'expressions constantes spares par des virgules, et entoure des signes { et }. Exemple : #define N 2 #define M 3 int t[N][M] = {1, 2, 3, 4, 5}; [ ][ ] { , , , , }; donne T[0][0]=1 T[1][0]=4 T[0][1]=2 T[1][1]=5 T[0][1] 2 T[1][1] 5 T[0][2]=3 T[1][2]=0
E. M. Nguer UFR SAT UGB emnguer@gmail.com

Tableaux un indice Tableaux plusieurs indices l i i di Les pointeurs Relations entre tableaux et pointeurs

113

Le Langage C
Tableaux et pointeurs

Initialisation
Il est aussi possible d'initialiser un tableau plusieurs p q indices en initialisation sparment chaque bloc. Exemple : #define N 2 d fi #define M 3 int t[N][M] = {{1, 2},{3, 4, 5}}; {{1 2} {3 4 donne T[0][0]=1 T[1][0]=3 [ ][ ] [ ][ ] T[0][1]=2 T[1][1]=4 T[0][2]=0 T[1][2]=5

Tableaux un indice Tableaux plusieurs indices l i i di Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

114

Le Langage C
Tableaux et pointeurs

Exercice
Dclarer un tableau nb_jour qui doit tre initialis de faon ce que nb_jour[i] soit gal au nombre de jours du ieme mois de l'anne pour i allant de 1 12 j d i i d l' ll d (nb_jour[0] sera inutilis). crire une fonction d'initialisation de nb_jour qui utilisera l'algorithme suivant : - si i vaut 2 le nombre de jours est 28 ; - sinon si i pair et i <= 7 ou i impair et i > 7 le nombre de jours est 30 ; - sinon le nombre de jours est 31. crire une fonction d'impression des 12 valeurs p utiles de nb_jour. La fonction main se contentera d'appeler les fonctions d'initialisation et d'impression de nb_jour. d'i i d b j
E. M. Nguer UFR SAT UGB emnguer@gmail.com 115

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

Le Langage C
Tableaux et pointeurs

Notion de pointeur p
Une valeur de type pointeur repre une variable. En pratique, cela signifie qu'une valeur de type pointeur contient l'adresse d'une variable. i i l' d d' i bl

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

116

Le Langage C
Tableaux et pointeurs

Dclaration
Pour dclarer une variable pointeur vers un type de , base, il faut : - partir de la dclaration d'une variable ayant un type de base ; - ajo ter le signe * de ant le nom de la variable. ajouter devant ariable Exemple : int *pi; /* pi est un pointeur vers un int */ short int *psi; /* psi est un pointeur vers un short int*/ i t*/ double *pd; /*pd pointeur vers un flottant double p prcision */ char *pc; /*pc pointeur vers un char */

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

117

Le Langage C
Tableaux et pointeurs

Dclaration
Le type void * est le type pointeur gnrique, c'est dire capable de pointer vers n importe quel type n'importe d'objet. Sans un tel type, il ne serait pas possible par exemple d'indiquer le type d'objet rendu par les fonctions d'allocation de mmoire qui rendent un pointeur vers l'objet allou, puisque ce type varie d'une invocation l'autre de la fonction. Par P exemple, l fonction malloc de la bibliothque l la f i ll d l bibli h standard est dfinie de la manire suivante : void *malloc(size_t size); id * ll ( i t i )
E. M. Nguer UFR SAT UGB emnguer@gmail.com 118

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

Le Langage C
Tableaux et pointeurs

Oprateur adresse de p
L'oprateur & appliqu une variable dlivre l adresse celle-ci l'adresse de celle ci ; cette adresse pourra tre affecte une variable de type pointeur. On peut crire par exemple : int i i t i; int *pi; /* pi pointeur vers un int */ pi = &i; /* le pointeur pi repre la variable i */ i &i l i t i l i bl

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

119

Le Langage C
Tableaux et pointeurs

Oprateur d'indirection p
Lorsque l'oprateur * est utilis en oprateur prfix, il s agit de l oprateur d indirection qui, appliqu sagit l'oprateur dindirection qui une valeur de type pointeur, dlivre la valeur pointe. Exemple : int i i t i; int *pi; pi = &i; /* initialisation du pointeur pi */ i &i i iti li ti d i t i *pi = 2; /*initialisation de la valeur pointe par pi*/ j = *pi + 1; /* une utilisation de la valeur pointe par * i 1 ili i d l l i pi */
E. M. Nguer UFR SAT UGB emnguer@gmail.com

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

120

Le Langage C
Tableaux et pointeurs

Oprateur d'indirection p
Remarque L'oprateur * est surcharg : il peut tre oprateur p g p p de multiplication ou oprateur d'indirection. La grammaire lve l'ambigut car l'oprateur d'indirection est prfix, alors que l'oprateur de multiplication est infix. Surcharger les oprateurs gne la lisibilit des programmes. Exemple : si i et programmes j sont des pointeurs vers des entier, la multiplication des deux valeurs pointes s'crit : *i**j p j Devinette Si i et j sont des pointeurs vers des entiers, *i**j entiers i j est le produit des valeurs pointes, mais *i/*j estil le quotient des valeurs pointes ? Rponse la fin de ce chapitre. chapitre
E. M. Nguer UFR SAT UGB emnguer@gmail.com 121

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

Le Langage C
Tableaux et pointeurs

Exercice
1. Dclarer un entier i et un pointeur p vers un entier ; 2. Initialiser l'entier une valeur arbitraire et faire pointer p vers i ; 3. Imprimer la valeur de i ; 4. Modifier l'entier point par p (en utilisant p, pas i) ; 5. Imprimer la valeur de i. p

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

122

Le Langage C
Tableaux et pointeurs

Pointeurs et oprateurs additifs p f


Oprateurs + et

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

L oprateur L'oprateur + permet de raliser la somme de deux valeurs arithmtiques, mais il permet galement de raliser la somme d un pointeur et d un entier. d'un d'un entier Une telle opration n'a de sens cependant, que si le pointeur repre un lment d'un tableau. Soient p une valeur pointeur vers des objets de type T et un tableau dont les lments sont du mme type T ; si p repre l'lment d'indice i du tableau, p + j est une valeur de type pointeur vers T, qui repre l'lment d'indice i + j du tableau (en supposant qu'il existe). ( pp q )
E. M. Nguer UFR SAT UGB emnguer@gmail.com 123

Le Langage C
Tableaux et pointeurs

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

Oprateurs + et : Il en va de mme avec l'oprateur soustraction : p si p repre l'lment d'indice i d'un tableau, p - j repre l'lment d'indice i - j du tableau (toujours en supposant qu'il existe). Exemple: #define N 10 int t[N]; [ ]; int *p,*q,*r,*s; p = &t[0]; /* p repre le premier lment de t q = p + (N-1); /* q repre le dernier lment de t r = &t[N-1]; /* r repre le dernier lment de t s = r - (N-1); /* s repre le premier lment de t
E. M. Nguer UFR SAT UGB emnguer@gmail.com

Pointeurs et oprateurs additifs p f

*/ */ */ */
124

Le Langage C
Tableaux et pointeurs

Pointeurs et oprateurs additifs p f


La norme prcise que pour raliser la somme ou la diffrence d'un pointeur et d'un entier, il faut qu' la fois le pointeur et le rsultat reprent les lments d'un mme tableau ou l'lment (fictif) aprs le dernier lment du tableau. En d'autre termes, si on a : l t d t bl E d' t t i #define N 100 int t[N]; int * p = &t[0]; L'expression p + N est valide, mais p - 1 ou p + N + 1 ne sont pas valides. La possibilit de rfrencer l'lment (fictif) aprs le dernier lment d'un tableau a t introduite pour les problmes de fin de boucle de d parcours de tableau (mais on aurait pu s'en passer). d bl ( i i ' )
E. M. Nguer UFR SAT UGB emnguer@gmail.com 125

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

Le Langage C
Tableaux et pointeurs

Pointeurs et oprateurs additifs p f


Oprateurs ++ et -On peut appliquer les oprateurs ++ et -- des pointeurs et il est classique de les utiliser pour raliser des parcours de tableaux. Exemple (on rappelle que toute chane est termine par un null, c'est dire le caractre '\0') : char mess[] = "Hello world!!"; char *p; for ( f (p = &mess[0]; *p != '\0'; p++){ & [0] * ! '\0' ++){ /* ici p repre l'lment courant de mess */ }

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

126

Le Langage C
Tableaux et pointeurs

Pointeurs et oprateurs additifs p f


Oprateurs ++ et -Autre classique, en reprenant les variables mess et p de l'exemple prcdent : p=& &mess[0]; [0] while (*p != '\0'){ / /* ici utilisation de *p++ */ p++ / }

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

127

Le Langage C
Tableaux et pointeurs

Diffrence de deux pointeurs ff p


Il est possible d'utiliser l'oprateur de soustraction pour calculer la diffrence de deux pointeurs. Cela n'a de sens que si les deux pointeurs reprent des lments d'un mme tableau. Exemple: Soient p1 et p2 deux pointeurs du mme type tels que p1 repre le ieme lment d'un tableau, et p2 repre le 1 l i l d' bl 2 l jeme lment du mme tableau, p p p2 - p1 est une valeur de type p yp ptrdiff_t qui est gale q g j - i. Ce type est dfini dans le fichier d include stddef.h d'include En pratique, une variable de type ptrdiff_t pourra tre utilise comme une variable de type int.
E. M. Nguer UFR SAT UGB emnguer@gmail.com

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

128

Le Langage C
Tableaux et pointeurs

Diffrence de deux pointeurs ff p


La norme prcise qu'il est valide de calculer la diffrence de deux pointeurs condition que tous p q deux reprent des lments d'un mme tableau, ou l'lment (fictif) aprs le dernier lment du tableau. Exercice Dclarer et initialiser statiquement un tableau d'entiers t avec des valeurs dont certaines seront nulles. crire une fonction qui parcoure le tableau t et qui imprime les index des lments nuls du tableau, sans utiliser aucune variable de type entier. entier

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

129

Le Langage C
Tableaux et pointeurs

Passage de p g paramtres
En C, tout paramtre est pass par valeur, et cette g p rgle ne souffre aucune exception. Cela pose le problme de raliser un passage de paramtre par adresse lorsque le programmeur en a besoin. besoin Voici un exemple:
#include <stdio.h> int main(void){ void echange (int a, int b) ; g ( , ) int n=10, p=20 ; printf ("avant appel: %d %d\n", n, p) ; echange (n, p) ; (n printf ("aprs appel: %d %d", n, p) ; return 0 ; }
E. M. Nguer UFR SAT UGB emnguer@gmail.com 130

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

Le Langage C
Tableaux et pointeurs

Passage de p g paramtres
Exemple:
void echange (int a, int b){ int i c; printf ("dbut echange : %d %d\n", a, b) ; c=a;a=b;b=c; avant appel : 10 20 printf ("fin echange : /d %d\n", a,b) ; dbut change : 10 20 } fin change : 20 10
aprs appel : 10 20

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

La solution ce problme consiste dans ce cas, dclarer le paramtre comme tant un pointeur. pointeur Cette solution n'est rendue possible que par l'existence de l'oprateur adresse, qui permet de dlivrer l'adresse d' l' d d'une l l lvalue.

E. M. Nguer UFR SAT UGB emnguer@gmail.com

131

Le Langage C
Tableaux et pointeurs

Passage de p g paramtres
Solution:

#include <stdio.h> int i ( id){ i main(void){ Tableaux un indice void echange (int *a, int *b) ; Tableaux int n=10, p=20 ; plusieurs i di l i indices printf ("avant appel: %d %d\n", n, p) ; echange (&n, &p) ; Les pointeurs p printf ("aprs appel: %d %d", n, p) ; ( p pp , , avant appel : 10 20 return 0 ; Relations entre tableaux dbut change : 10 20 et pointeurs } void echange (int *a, int *b){ int c ; printf ("dbut echange : %d %d\ " * *b) ; i tf ("db t h %d\n", *a, c = *a ; *a = *b ; *b = c ; printf ("fin echange : /d %d\n", *a,*b) ; }
E. M. Nguer UFR SAT UGB emnguer@gmail.com

fin change : 20 10 g aprs appel : 20 10

132

Le Langage C
Tableaux et pointeurs

Pointeurs vers des fonctions f


Les pointeurs de fonctions permettent d'appeler une fonction en spcifiant une valeur (c'est l'aspect p ( p dynamique) plutt que le nom de la fonction. p La dclaration d'un pointeur sur une fonction s'crit : <type> (*nom)();. <type> reprsente le type d'objet retourn par la l d' bj l fonction dont nom est une variable pointeur ayant pour valeur l adresse d une fonction ; l'adresse d'une nom est le nom de la variable pointeur sur une fonction retournant des objets de type dfini par <type>. *nom est l fonction pointe. * la f i i
E. M. Nguer UFR SAT UGB emnguer@gmail.com 133

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

Le Langage C
Tableaux et pointeurs

Pointeurs vers des fonctions f


Quelques remarques : int (*fonc)(); est un pointeur sur une fonction qui ( )(); p q retourne un entier. int *fonc(); est une fonction retournant un pointeur sur un entier. Comme les pointeurs, un pointeur sur fonctions doit tre initialis avant d'tre utilis.

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

134

Le Langage C
Tableaux et pointeurs

Pointeurs vers des fonctions f


Exemple : void main() { () int f1(void), f2(int); ( g)(); /* pointeur sur fonction */ p int (*g)(); g = f1; ( g)(3); (*g)(3); / appel de f1 */ /* / g = f2; ( g)(4) (*g)(4) /* appel de f2 avec argument 3 */ / / }

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

135

Le Langage C
Tableaux et pointeurs

Pointeurs vers des fonctions f


void f1 (void){ printf(" Je suis dans la fonction f1 \n"); } void f2(int j){ printf(" dans la fonction f2 : %d \ " j) i tf(" d l f ti \n", j); } Il faut noter principalement : Les fonctions qui p q peuvent faire l'objet d'un appel j pp par pointeur doivent avoir t dclares au pralable. Lors de l'appel les parenthses () sont requises et l' l'appel est : (*f)(); l (*f)() Rien ne distingue une fonction appele par nom d une d'une fonction appele par pointeur. pointeur
E. M. Nguer UFR SAT UGB emnguer@gmail.com 136

Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs

Le Langage C
Tableaux et pointeurs

Rgle pour les tableaux une indice g p


Tout identificateur de type < tableau de X > apparaissant dans une expression est converti en une valeur constante dont : l t t d t - le type est < pointeur vers X > ; - l valeur est l'adresse du premier lment du tableau. la l t l' d d i l t d t bl Cette conversion n'a lieu que pour un identificateur de type < tableau de X > apparaissant dans une expression. En particulier, elle n'a pas lieu lors de la dclaration. Quand on dclare int T[10], le compilateur mmorise que T est de type < tableau de 10 int > et rserve de la place en mmoire pour 10 entiers. entiers C'est lors de toute utilisation ultrieure de lidentificateur T, que cette occurrence de T sera convertie en type i *, de valeur adresse de T[0]. int * d l d d T[0]
E. M. Nguer UFR SAT UGB emnguer@gmail.com 137

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

Le Langage C
Tableaux et pointeurs

Remarques q
1. Cette conversion automatique d'un identificateur ayant le type tableau empche de dsigner un tableau en entier, c'est pour cette raison que l'oprateur d'affecti ' t tt i l' t d' ff tation ne peut affecter un tableau un autre tableau : int t1[10] i t t2[10] i t t1[10]; int t2[10]; t1 = t2; /*le compilateur rejettera cette instruction*/ Cette affectation ne peut se raliser qu' l'aide d'une fonction qui ralisera l'affectation lment par lment 2. Un identificateur ayant le type tableau est converti en une valeur constante, on ne peut donc rien lui affecter : int *p; int t[10]; t = p; /* interdit */ p = t; /* valide */ lid
E. M. Nguer UFR SAT UGB emnguer@gmail.com 138

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

Le Langage C
Tableaux et pointeurs

L'oprateur d'indexation p t[i] est quivalent *(t + i)


Consquences: 1. ' 1 L'oprateur d'i d d'indexation not [] est donc inutile, et i d i il n'a t offert que pour des raisons de lisibilit des programmes, et pour ne pas rompre avec les habi habitudes de programmation. 2. 2 int t[10]; int * p; on peut crire : p = &t[4]; et utiliser l'oprateur d'indexation sur p, p[0] tant t[4], p[1] tant t[5], etc. p peut donc tre utilis d ili comme un sous-tableau de t. 3. L' 3 L'oprateur d'indexation est commutatif ! d'i d i if En effet, t[i] tant quivalent *(t + i) et l'addition , [] q ( ) tant commutative, t[i] est quivalent *(i + t) donc i[t] (Mais viter!)
E. M. Nguer UFR SAT UGB emnguer@gmail.com 139

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

Le Langage C
Tableaux et pointeurs

Passage de tableau en paramtre g p


Lorsqu'un tableau est pass en paramtre effectif, c'est l adresse du premier lment qui est passe en paramtre. Le paramtre formel correspondant devra t L t f l d td donc tre dclar comme tant de type pointeur. p Exemple. Soit crire une fonction imp_tab qui est charge d'imprimer un tableau d'entiers qui lui est pass en paramtre. paramtre On peut procder de la manire suivante : void imp_tab(int *t, int nb_elem){ int i; for (i = 0; i < nb_elem; i++) printf("%d ",*(t + i)); } Cependant, cette mthode a un gros inconvnient.
E. M. Nguer UFR SAT UGB emnguer@gmail.com

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

140

Le Langage C
Tableaux et pointeurs

Passage de tableau en paramtre g p


En effet, lorsqu'on lit l'en-tte de cette fonction, c'est dire la ligne : void imp_tab(int *t, int nb_elem) id i t b(i t *t i t b l ) il n'est pas possible de savoir si le p g p p programmeur a voulu passer en paramtre un pointeur vers un int (c'est dire un pointeur vers un seul int), ou au contraire s il a voulu passer un tableau, c est--dire sil tableau c'est dire un pointeur vers une zone de n int. Pour exprimer cette diffrence void imp_tab(int t[], int nb_elem){ int i; for (i = 0; i < nb_elem; i++) printf("%d",t[i]); }
E. M. Nguer UFR SAT UGB emnguer@gmail.com 141

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

Le Langage C
Tableaux et pointeurs

Passage de tableau en paramtre g p


Cette faon d'exprimer les choses est beaucoup plus claire, et sera donc prfre. L'appel se fera de la manire suivante : L' l f d l i i t #define NB_ELEM 10 int main(){ int tab[NB_ELEM]; imp_tab(tab,NB_ELEM); imp tab(tab NB ELEM); }

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

142

Le Langage C
Tableaux et pointeurs

Passage de tableau en paramtre g p


Remarque Quand une fonction admet un paramtre de type tableau, il y a deux cas possibles : t bl d ibl - soit les diffrents tableaux qui lui sont passs en paramtre effectif ont des tailles diffrentes, et dans ce cas la taille doit tre un paramtre d l t ill d it t t supplmentaire de la fonction, comme dans l'exemple prcdent ; - soit les diffrents tableaux qui lui sont passs en paramtre effectif ont tous la mme taille, et dans ce cas la taille peut apparatre dans le type du paramtre effectif : #define NB_ELEM 10 void imp_tab(int t[NB_ELEM]){ id i t b(i t t[NB ELEM]){ ... }
E. M. Nguer UFR SAT UGB emnguer@gmail.com 143

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

Le Langage C
Tableaux et pointeurs

Modification des lments d'un tableau pass f p en paramtre


Les lments d'un tableau pass en p p paramtre peuvent tre modifi compte tenu de la conversion automatique des identificateurs de type tableau. Exemple: void incr_tab(int t[], int nb_elem){ int i i i; for (i = 0; i < nb_elem; i++) t[i]++; [] ; }

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

144

Le Langage C
Tableaux et pointeurs

Interdiction de modifier les lments d'un f tableau pass en paramtre


Pour exprimer le fait que cette fonction ne doit pas modifier les lments du tableau t, on peut (et il est recommand de) l'crire de la faon suivante : void imp_tab(const int t[], int nb_elem){ int i; for (i = 0; i < nb_elem; i++) printf("%d ",t[i]); }

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

145

Le Langage C
Tableaux et pointeurs

Conversion des chanes littrales


Lorsque les chanes littrales apparaissent dans un autre contexte qu'une dclaration avec initialisation de tableau de caractres, elles subissent une conversion en pointeur vers char. Si une fonction a comme paramtre formel un tableau de caractres, on pourra lui passer en paramtre effectif aussi bien le nom d'un tableau de caractres qu'une chane litt l ' h littrale. Exemple : char mess[] = "Bonjour"; [] j ; void f( char t[]){ ... /* corps de la fonction f */ } f(mess); /* un appel possible de f */ f("Hello"); /* un autre appel possible de f */
E. M. Nguer UFR SAT UGB emnguer@gmail.com 146

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

Le Langage C
Tableaux et pointeurs

Exercice
1. Dclarer et initialiser deux tableaux de caractres (ch1 t h2) ( h1 et ch2). ( g_ ) qui 2. crire une fonction (lg chaine1) q admette en paramtre un tableau de caractres se terminant par un null, et qui rende le nombre de caractres du tableau (null exclu). exclu) 3. crire une fonction (lg_chaine2) qui implmente le mme interface que lg_chaine1, mais en donnant son paramtre le type pointeur vers char. 4. La fonction main imprimera le nombre d'lments de ch1 et ch2 par un appel lg_chaine1 et lg_chaine2. l h i 2
E. M. Nguer UFR SAT UGB emnguer@gmail.com 147

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

Le Langage C
Tableaux et pointeurs

Rgle pour les tableaux plusieurs indices g p p


En C, un tableau multidimensionnel est considr comme tant un tableau dont les lments sont eux mmes des tableaux. d t bl q q Les mmes considrations que celles que nous avons dveloppes sur les tableaux une dimension s'appliquent, savoir : Si on considre: int t[10][20]; 1. la dclaration, le compilateur allouera une zone mmoire permettant de stocker de manire contigu 10 tableaux de 20 entiers, soit 200 entiers ;

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

2. toute rfrence ultrieure t sera convertie en l'adresse de sa premire ligne, avec le type pointeur vers t bl tableau de 20 int. d i t
E. M. Nguer UFR SAT UGB emnguer@gmail.com 148

Le Langage C
Tableaux et pointeurs

Passage en p g paramtre
Lorsqu'on veut qu'un paramtre formel soit un tableau deux dimensions, il faut le dclarer comme dans l'exemple suivant : d l' l i t #define N 10 p(int t[][N]) { ... /* corps de p */ } On peut en effet omettre la taille de la premire dimension, mais il est ncessaire d'indiquer la taille de la seconde dimension, car le compilateur en a besoin pour gnrer le code permettant d accder un d'accder lment. En effet, si T est la taille des lments de t, l'adresse de d t[i][j] est : adresse d t+(i*N+j)*T t d de t+(i*N+j)*T.
E. M. Nguer UFR SAT UGB emnguer@gmail.com 149

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

Le Langage C
Tableaux et pointeurs

Passage en p g paramtre
Le compilateur besoin de connatre N, ce sera donc une constante. Par contre la taille de la premire dimension pourra contre, tre passe en paramtre, comme nous l'avons fait pour les tableaux une seule dimension. Exemple : #define P 10 void raz mat(int t[][P], int n) { raz_mat(int int i,j; for (i = 0; i < n; i++) for (j = 0; j < P; j++) t[i][j] = 0; } raz_mat raz mat ne sera applicable qu' des tableaux dont la premire dimension une taille quelconque, mais p dont la seconde dimension doit imprativement avoir P lments.
E. M. Nguer UFR SAT UGB emnguer@gmail.com 150

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

Le Langage C
Tableaux et pointeurs

Passage en p g paramtre
Exercice 1. Dclarer et initialiser statiquement une matrice [5,5] d'entiers (tab). 2. crire une fonction (print_mat) qui admette en paramtre une matrice [5,5] et qui imprime ses lments sous forme de tableau. l t f d t bl 3. La fonction main fera un appel p _mat pour pp print p le tableau tab.

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

151

Le Langage C
Tableaux et pointeurs

Tableau de pointeurs p
Cas gnral Pour des raisons de gain de place mmoire, on est parfois amen crer des tableaux deux dimensions dont toutes les lignes n'ont pas la mme taille. Ceci peut se raliser l'aide d'un tableau de pointeurs vers des tableaux de tailles diffrentes, associ un diffrentes autre tableau qui donnera la taille de chaque ligne. On obtient alors la structure de donnes suivante :

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

152

Le Langage C
Tableaux et pointeurs

Tableau de pointeurs p
#define NB_ELEM 3 int taille[NB_ELEM] = {1, 2, 3}; int ligne1[] = {10}; int ligne2[] = {20,21}; int ligne3[] = {30 31 32}; {30,31,32}; int *tab[] = {ligne1, ligne2, ligne3}; Pour une rfrence l'lment j de la ligne i, on n'a q que l'embarras du choix. Nous donnons ci-aprs trois mthodes diffrentes d'imprimer les lments du tableau ligne par ligne.

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

153

Le Langage C
Tableaux et pointeurs

Tableau de pointeurs p
Premire mthode On utilise un pointeur vers un entier que l'on fait progresser d'lment en lment dans une ligne : int i, *p; i p; for (i = 0; i < NB_ELEM; i++) { for ( f (p = tab[i]; p < tab[i] + taille[i]; p++) t b[i] t b[i] t ill [i] ++) printf("%d ",*p); /* accs l'lment courant par *p */ printf("\n"); }

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

154

Le Langage C
Tableaux et pointeurs

Tableau de pointeurs p
Deuxime mthode On utilise un pointeur vers le premier lment d'une ligne ; ce pointeur reste fixe. int i, j, *p; for (i = 0; i < NB_ELEM; i++) { for (p = tab[i], j = 0; j < taille[i]; j++) p printf("%d ",p[j]); ( ,p[j]); /* accs l'lment courant par p[j] */ printf("\n"); }

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

155

Le Langage C
Tableaux et pointeurs

Tableau de pointeurs p
Troisime mthode La dernire mthode est surprenante : pour la comprendre, il suffit de remarquer que la variable p dans la seconde solution est inutile, on peut accder inutile l'lment courant par la notation tab[i][j]. int i, j * i t i j, *p; for (i = 0; i < NB_ELEM; i++){ for (j = 0; j < taille[i]; j++) ; [ ]; j ) printf("%d ", tab[i][j]); /* accs l'lment courant par tab[i][j] */ printf( \n ); printf("\n"); }

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

156

Le Langage C
Tableaux et pointeurs

Tableaux de pointeurs vers des chanes p


C'est pour les tableaux de caractres deux dimensions, que se manifeste le plus souvent l'intrt de disposer d'un tableau de lignes de longueurs diffrentes : les longueurs des chanes sont extrmement variables. variables La aussi, les habitudes sont les mmes, les programmeurs utilisent le type tableau de pointeurs vers des char, comme ceci : h i char * t[NB_ELEM]; [ ]; On peut initialiser un tableau de ce type avec des chanes littrales : char * mois[] = {"janvier", "fvrier", "mars", "avril", "mai", "juin", "juillet", "aot", "septembre", "octobre" "novembre", "dcembre"};
E. M. Nguer UFR SAT UGB emnguer@gmail.com 157

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

Le Langage C
Tableaux et pointeurs

Tableaux de pointeurs vers des chanes p


On remarquera que ceci est impossible avec tout autre type que les char : il est impossible d'crire : int * tab[] = {{1}, {2,3}, {4,5,6}}; Une boucle d impression des valeurs du tableau mois d'impression pourra tre : #define #d fi NBMOIS 12 int i; for (i = 0; i < NBMOIS ; i++) ( ; ) printf("%s\n",mois[i]);

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

158

Le Langage C
Tableaux et pointeurs

Paramtres d'un programme p g


Les tableaux de pointeurs vers des chanes de caractres sont une structure de donnes importante, car c'est sur celle-ci que s'appuie la transmission de paramtres lors de l'excution d'un programme. Lorsqu'un utilisateur lance l'excution du programme prog avec les paramtres param1, param2, ... paramn, l'interprteur de commandes collecte tous ces mots l'i t t d d ll t t t sous forme de chanes de caractres, cre un tableau de pointeurs vers ces chanes, et lance la fonction p , main en lui passant deux paramtres : - un entier contenant la taille du tableau ; - le tableau de pointeurs vers les chanes.

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

159

Le Langage C
Tableaux et pointeurs

Paramtres d'un programme p g


Pour que le programme puisse exploiter les paramtres passs par l'utilisateur, la fonction main doit tre dclare de la manire suivante : int main(int argc, char *argv[]){ argc argv[]){ ... } Les noms argc (pour argument count), ainsi que argv (p (pour argument values), sont des noms traditionnels, g ), , mais peuvent tre remplacs par n'importe quels autres noms ; seuls les types doivent tre respects.

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

160

Le Langage C
Tableaux et pointeurs

Paramtres d'un programme p g


Comme exemple d'utilisation des paramtres, nous donnons le source d'un programme qui imprime son nom et ses paramtres : int main(int argc, char *argv[]){ argc argv[]){ int i; printf("Nom du programme : %s\n", argv[0]); for f (i = 1; i < argc; i++) 1 printf("Paramtre %d : %s\n",i,argv[i]); }

Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs

E. M. Nguer UFR SAT UGB emnguer@gmail.com

161

Le Langage C g g
Historique Gnralits Les types de bases Les oprateurs et les expressions e pressions Les entres-sorties Les instructions de contrle Les fonctions Tableaux et pointeurs Les chanes de caractres Les structures Les fichiers Gnie logiciel La gestion dynamique g y q Le prprocesseur

Leschanesde caractres
1. Reprsentation des chanes de caractres 2. Lire et crire des chanes 3. 3 Gnralits sur les fonctions portant sur les chanes

E. M. Nguer UFR SAT UGB emnguer@gmail.com

162

Le Langage C
Les chanes de caractres

La convention adopte p
En C, une chane de caractres est reprsente par une suite d'octets correspondant chacun de ses caractres (plus prcisment chacun de leurs codes), le tout tant termin par un octet supplmentaire de code nul. Cela signifie que, d'une manire gnrale, une chane de n caractres occupe en mmoire un emplacement de d n + 1 octets . t t

Reprsentation des chanes Lire et crire des chanes Gnralits

E. M. Nguer UFR SAT UGB emnguer@gmail.com

163

Le Langage C
Les chanes de caractres

Les chanes constantes


Exemple: #include <stdio.h> int main(void){ char * adr ; adr = "bonjour" ; while (*adr){ printf ("%c",* adr) ; adr++ ; } return 0 ; }
E. M. Nguer UFR SAT UGB emnguer@gmail.com 164

Reprsentation des chanes Lire et crire des chanes Gnralits

Le Langage C
Les chanes de caractres

Les chanes constantes


La dclaration : char * adr; rserve simplement l'emplacement p p p pour un pointeur p sur un caractre (ou une suite de caractres). En ce qui concerne la constante : ''bonjour'' le compilateur a cr en mmoire la suite d'octets correspondants mais, dans l'affectation : adr = ''bonjour" la notation ''bonjour'' a comme valeur, non pas la valeur de la chane elle-mme, mais son adresse; On retrouve l le mme phnomne que pour les tableaux.
E. M. Nguer UFR SAT UGB emnguer@gmail.com 165

Reprsentation des chanes Lire et crire des chanes Gnralits

Le Langage C
Les chanes de caractres

Initialisation de tableaux de caractres


Aprs la dclaration suivante : char ch[20]; il est impossible dcrire une affectation du genre p g ch = " bonjour"; p q p En effet ch est une constante pointeur qui correspond l'adresse que le compilateur a attribue au tableau ch; Par contre, C vous autorise initialiser un tableau de caractres l aide d une chane constante. l'aide d'une constante Ainsi, on peut crire : char ch[20] = "bonjour " Ce qui est quivalent : char ch[20] = { 'b','o','n','j','o','u','r','\0' } b o n j o u r \0
E. M. Nguer UFR SAT UGB emnguer@gmail.com 166

Reprsentation des chanes Lire et crire des chanes Gnralits

Le Langage C
Les chanes de caractres

Initialisation de tableaux de caractres


Il est admissible que la taille dclare pour le tableau soit suprieure la taille de la chane littrale. li l Exemple : char ch[100] = "exemple"; p [ ] p ; dans ce cas, seuls les 8 premiers caractres de ch seront initialiss. Il est galement possible de ne pas indiquer la taille du tableau et dans ce cas, le compilateur a le , p bon got de compter le nombre de caractres de la chane littrale et de donner la taille adquate au tableau (sans oublier le null). Exemple : char ch[] = "ch aura 22 caractres";
E. M. Nguer UFR SAT UGB emnguer@gmail.com 167

Reprsentation des chanes Lire et crire des chanes Gnralits

Le Langage C
Les chanes de caractres

Initialisation de tableaux de caractres


Il est galement possible de donner au tableau une taille gale au nombre de caractres de la chane. chane Dans ce cas, le compilateur comprend qu'il ne faut pas rajo ter le n ll de la fin de chane. rajouter null chane Exemple : char ville[7] = "kaolack"; E l h ill [7] "k l k"

Reprsentation des chanes Lire et crire des chanes Gnralits

E. M. Nguer UFR SAT UGB emnguer@gmail.com

168

Le Langage C
Les chanes de caractres

Initialiser de tableaux de pointeurs sur des chanes


Nous avons vu qu'une chane constante tait traduite par le compilateur en une adresse que l on pouvait, l'on pouvait Par exemple, affecter un pointeur sur une chane. Cela peut se gnraliser un tableau de pointeurs, comme dans: char * jour[7] = {"lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche" } ; j , , , Cette dclaration ralise donc la fois la cration des 7 chanes constantes correspondant aux 7 jours de la semaine et l'initialisation du tableau jour avec les 7 adresses de ces 7 chanes.
E. M. Nguer UFR SAT UGB emnguer@gmail.com 169

Reprsentation des chanes Lire et crire des chanes Gnralits

Le Langage C
Les chanes de caractres

Initialiser de tableaux de pointeurs sur des chanes


Voici un exemple employant cette dclaration (nous y avons fait appel, pour l affichage d une chane, au appel l'affichage d'une chane code de format %s, dont nous parlerons dans la suite: #include #i l d <stdio.h> tdi h int main(void) { char * j h jour[7] = { "l di" [7] "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", vendredi , samedi , "dimanche"}; int i ; printf ("donnez un entier entre 1 et 7 : ") ;
E. M. Nguer UFR SAT UGB emnguer@gmail.com 170

Reprsentation des chanes Lire et crire des chanes Gnralits

Le Langage C
Les chanes de caractres

Initialiser de tableaux de pointeurs sur des chanes


scanf ("%d", &i) ; printf ("Le jour numro /d de la semaine est %s", i, jour[i-1] ) ; return 0 ; } donnez un entier entre 1 et 7 : 3 le jour numro 3 de la semaine est mercredi Remarque: Nous travaillons avec un tableau de sept pointeurs, chacun d'entre eux dsignant une chane constante .
E. M. Nguer UFR SAT UGB emnguer@gmail.com 171

Reprsentation des chanes Lire et crire des chanes Gnralits

Le Langage C
Les chanes de caractres

Fonctions de lecture et d criture de chanes dcriture


Le langage C offre plusieurs possibilits de lecture d criture ou d'criture de chanes: - l'utilisation du code de format %s dans les fonctions p printf et scanf, , - les fonctions spcifiques de lecture (gets) ou d'affichage (puts) d'une chane (une seule la g (p ) ( fois). Voyons cet exemple de programme:

Reprsentation des chanes Lire et crire des chanes Gnralits

E. M. Nguer UFR SAT UGB emnguer@gmail.com

172

Le Langage C
Les chanes de caractres

Fonctions de lecture et d criture de chanes dcriture


#include <stdio.h> int main(void){ char nom[2O], prenom[20], ville[25] ; printf ("quelle est votre ville : ") ; ("q elle otre ille gets (ville) ; printf ("donnez votre nom et votre prnom : ") ; i tf ("d t t t scanf ("%s %s", nom, prenom) ; printf ("bonjour cher %s %s qui habitez " i tf ("b j h % % i h bit ", prenom, nom) ; puts (ville) ; return 0 ; }
E. M. Nguer UFR SAT UGB emnguer@gmail.com 173

Reprsentation des chanes Lire et crire des chanes Gnralits

Le Langage C
Les chanes de caractres

Fonctions de lecture et d criture de chanes dcriture


Les fonctions printf et scanf permettent de lire ou d afficher d'afficher simultanment plusieurs informations de type quelconque. Par contre, gets et puts ne traitent qu'une chane la fois. De plus, la dlimitation de la chane lue ne s'effectue pas de la mme faon avec scanf et gets. Plus prcisment : - avec le code %s de scanf, on utilise les dlimiteurs "habituels" (l'espace ou la fin de ligne). Cela interdit donc la lecture d'une chane contenant des espaces. espaces De plus le caractre dlimiteur n'est pas plus, "consomm" : il reste disponible dans le tampon pou u e p oc a e ectu e pour une prochaine lecture ;
E. M. Nguer UFR SAT UGB emnguer@gmail.com 174

Reprsentation des chanes Lire et crire des chanes Gnralits

Le Langage C
Les chanes de caractres

Fonctions de lecture et d criture de chanes dcriture


- avec gets, seule la fin de ligne sert de dlimiteur. plus, De plus contrairement ce qui se produit avec scanf, ce caractre est effectivement "consomm": il ne risque pas d'tre pris en compte lors d'une nouvelle lecture. Dans tous les cas, vous remarquerez que la lecture de n caractres implique le stockage en mmoire de n+1 caractres , car le caractre de fin de chane (\0) est gnr automatiquement par toutes les fonctions de Lecture (notez toutefois que le caractre sparateurfin de ligne ou autre-n'est pas recopi en mmoire).
E. M. Nguer UFR SAT UGB emnguer@gmail.com 175

Reprsentation des chanes Lire et crire des chanes Gnralits

Le Langage C
Les chanes de caractres

Fonctions de lecture et d criture de chanes dcriture


Remarques: 1) Dans les appels des fonctions scanf et puts, les puts identificateurs de tableau comme nom, prenom ou ville n'ont pas besoin d'tre p p prcds de l'oprateur & puisqu'ils reprsentent dj des adresses. 2) La fonction gets fournit en rsultat soit un pointeur sur la chane lue (c'est donc en fait la valeur de son argument), soit le pointeur nul en l d t) it l i t l cas d'anomalie. 3) La fonction puts ralise un changement de ligne la fin de l'affichage de la chane, ce qui n'est pas le cas de p t avec le code de format %s. printf e o at
E. M. Nguer UFR SAT UGB emnguer@gmail.com 176

Reprsentation des chanes Lire et crire des chanes Gnralits

Le Langage C
Les chanes de caractres

Fonctions de lecture et d criture de chanes dcriture


Remarques: 4) Nous nous sommes limit ici aux entres-sorties entres sorties "conversationnelles". Les autres possibilits seront examines dans le chapitre consacr aux p fichiers. 5) Si, dans notre prcdent programme, l'utilisateur ) p p g introduit une fin de ligne entre le nom et le prnom, la chane affecte prenom n'est rien d'autre d' t que... la chane vide ! Ceci provient de ce l h id C i i td que la fin de ligne servant de dlimiteur pour le premier %s n est pas consomme et se trouve n'est donc reprise par le %s suivant...

Reprsentation des chanes Lire et crire des chanes Gnralits

E. M. Nguer UFR SAT UGB emnguer@gmail.com

177

Le Langage C
Les chanes de caractres

Fonctions de lecture et d criture de chanes dcriture


Remarques: 6) Compte tenu de ce que gets consomme la fin de ligne servant de dlimiteur, alors que le code %s de scanf ne le fait pas, il n'est g p , gure possible, dans p , le programme prcdent, d'inverser les utilisations de scanf et de gets (en lisant la ville par scanf puis le nom et le prnom par scanf): dans ce cas, la fin de ligne non consomme par scanf amnerait gets introduire une chane vide comme nom. nom D'une manire gnrale, d'ailleurs, il est prfrable, prfrable autant que possible, de faire appel possible gets plutt qu'au code %s pour lire des chanes.

Reprsentation des chanes Lire et crire des chanes Gnralits

E. M. Nguer UFR SAT UGB emnguer@gmail.com

178

Le Langage C
Les chanes de caractres

Gnralits sur les fonctions portant sur des chanes


C dispose de nombreuses fonctions de manipulation de chanes. En voici quelques unes : chanes La fonction strlen(ch) <string.h> fournit en rsultat la l l longueur dune chane d d h dont on l i a transmis lui i ladresse en valeur. La fonction strcat(ch1,ch2) <string.h> recopie la seconde chane ch2 la suite de la premire ch1. p La fonction strncat(ch1, ch2, lgmax) <string.h> travaille de la mme faon que strcat en offrant un ill d l f ff contrle sur le nombre de caractres qui seront concatns la chaine ch2.
E. M. Nguer UFR SAT UGB emnguer@gmail.com 179

Reprsentation des chanes Lire et crire des chanes Gnralits

Le Langage C
Les chanes de caractres

Gnralits sur les fonctions portant sur des chanes


La fonction strcmp(ch1, ch2) <string.h> compare deux chanes et f d h fournit une valeur entire positive si i l i ii i ch1 > ch2, nulle si ch1=ch2 et ngative si ch1<ch2. La fonction strncmp(ch1,ch2,lgmax) <string.h> travaille comme strcmp mais elle limite la comparaison au nombre lgmax de caractres. Les fonctions stricmp(ch1, ch2) et strnicmp(ch1, ch2, lgmax) <string.h> travaillent comme strcmp et strncmp mais sans tenir compte de la diffrence entre majuscules et minuscules.
E. M. Nguer UFR SAT UGB emnguer@gmail.com 180

Reprsentation des chanes Lire et crire des chanes Gnralits

Le Langage C
Les chanes de caractres

Gnralits sur les fonctions portant sur des chanes


La fonction strcpy(destin, source) <string.h> recopie la chane source dans l emplacement d adresse destin lemplacement dadresse destin. La fonction strncpy(destin,source,lgmax) <string.h> limite la copie au nombre de caractres lgmax. La fonction strchr(ch,caractre) <string.h> ( , ) g recherche dans ch, la premire position o apparait le c c e e o caractre mentionn. . La fonction strrchr(ch,caractre) <string.h> opre de d mme mais en partant de la fin de ch; i t t d l fi d h La fonction strstr(ch,ssch) <string.h> recherche dans ch la premire occurrence de la sous chane ssch.
E. M. Nguer UFR SAT UGB emnguer@gmail.com 181

Reprsentation des chanes Lire et crire des chanes Gnralits

Le Langage C
Les chanes de caractres

Exercices
1) crire un programme dterminant le nombre de lettres e (minuscules) prsentes d l ( i l ) dans un texte d de moins d'une ligne (suppose ne pas dpasser 132 caractres) fo rni au clavier. fourni a cla ier 2) crire un programme qui supprime toutes les lettres e (minuscules) d'un texte de moins d'une ligne (suppose ne pas dpasser 132 caractres) fourni au clavier. Le texte ainsi modifi sera f i l i L t t i i difi cr, en mmoire, la place de l'ancien.

Reprsentation des chanes Lire et crire des chanes Gnralits

3) crire un programme qui lit au clavier un mot (d'au plus 30 caractres) et qui l'affiche " l'envers '' . l'
E. M. Nguer UFR SAT UGB emnguer@gmail.com 182

Le Langage C g g
Historique Gnralits Les types de bases Les oprateurs et les expressions e pressions Les entres-sorties Les instructions de contrle Les fonctions Tableaux et pointeurs Les chanes de caractres Les structures Les fichiers Gnie logiciel La gestion dynamique g y q Le prprocesseur

Les structures
Nous avons dj vu que le tableau permet de dsigner sous un seul nom un ensemble de valeurs de mme type, chacune d'entre elles tant repre par un indice n indice. La t t L structure, quant elle, va nous permettre de t ll tt d dsigner sous un seul nom un ensemble de valeurs pouvant tre de t t t d types diff t diffrents. L'accs h L' chaque l lment d l structure (nomm de la ( champ) se fera, cette fois, non plus par une indication de position, mais par son nom au sein de la structure.
E. M. Nguer UFR SAT UGB emnguer@gmail.com 183

Le Langage C
Les structures

Dclaration de structure
Il y a plusieurs mthodes pour dclarer des structures. Premire mthode : La dclaration : struct personne{ char nom[20]; char prenom[20]; int no_employe; no employe; }; dclare l'id ifi d l l'identificateur personne comme tant l nom le d'un type de structure compose de trois membres, On peut ensuite lutiliser pour dclarer des variables, l utiliser variables de la manire suivante : struct personne p1,p2; q qui dclare deux variables de type struct personne de yp p noms p1 et p2;
E. M. Nguer UFR SAT UGB emnguer@gmail.com 184

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure

Le Langage C
Les structures

Dclaration de structure
Deuxime mthode On peut dclarer des variables de type structure sans utiliser d'tiquette de structure, par exemple : struct{ char nom[20]; char prenom[20]; int no_employe; } p1,p2; dclare deux variables de noms p1 et p2 comme tant deux structures de trois membres, mais elle ne donne membres pas de nom au type de la structure. L'inconvnient de cette mthode est qu'il sera par la suite impossible de dclarer une autre variable du mme type.
E. M. Nguer UFR SAT UGB emnguer@gmail.com 185

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure

Le Langage C
Les structures

Dclaration de structure
En effet, si plus loin on crit : struct{ { char nom[20]; char prenom[20]; h [20] int no_employe; } p3; 3 les deux structures ont beau avoir le mme nombre de champs, avec les mmes noms et les mmes types, elles seront considres de types diffrents. diffrents Il sera impossible en particulier d'crire p3 = p1;.
E. M. Nguer UFR SAT UGB emnguer@gmail.com

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure

186

Le Langage C
Les structures

Dclaration de structure Troisime mthode


struct personne{ p { char nom[20]; p [ ]; char prenom[20]; int no_employe; } p1,p2; p ,p ;

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure

dclare les deux variables p1 et p2 et donne le nom personne la structure. On pourra ultrieurement structure dclarer d'autres variables : struct personne pers1, p pers2, pers3; qui seront du mme type q p1 et p2. p q yp que p p De ces trois mthodes c'est la premire qui est recommande, car elle permet de bien sparer la dfinition du type structure de ses utilisations.
E. M. Nguer UFR SAT UGB emnguer@gmail.com 187

Le Langage C
Les structures

Initialisation d'une structure


Une structure peut tre initialise par une liste d'expressions constantes la manire des initialisations de tableau. i iti li ti d t bl Exemple : p struct personne p = {"Mary Teuw", "Niane", 7845};

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure

E. M. Nguer UFR SAT UGB emnguer@gmail.com

188

Le Langage C
Les structures

Oprateurs sur les structures p


Accs aux membres des structures Pour dsigner un membre d'une structure, il faut utiliser l'oprateur de slection de membre qui se tili l' t d l ti d b i note . (point). Exemple: si p1 est une variable de type p p yp struct personne, on dsignera le membre nom de p1 par p1.nom. Affectation d structures Aff i de On peut affecter une structure une variable structure de mme type, grce l'oprateur d'affectation : yp , g p struct personne p1,p2 ... p1 = p2; Comparaison de structures p possible sur les structures. Aucune comparaison n'est p
E. M. Nguer UFR SAT UGB emnguer@gmail.com 189

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure

Le Langage C
Les structures

Tableaux de structures
Une dclaration de tableau de structures se fait selon le mme modle que la dclaration d'un tableau dont les lments sont de type simple. l l t td t i l Supposons q l'on ait dj dclar la struct personne pp que j p si on veut dclarer un tableau de 100 structures de ce type, on crira : struct personne t[100]; Pour rfrencer le nom de la personne qui a l index i l'index dans t on crira : t[i].nom.

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure

E. M. Nguer UFR SAT UGB emnguer@gmail.com

190

Le Langage C
Les structures

Pointeurs vers une structure


Supposons que l'on ait dfini la struct personne l'aide de la dclaration : struct personne{ }; On dclarera une variable de type pointeur vers une telle structure de la manire suivante : struct personne *p; p; On pourra alors affecter p des adresses de struct personne. Exemple : struct personne{ p { char nom[20]; char prenom[20]; t o_e p oye; int no employe; };
E. M. Nguer UFR SAT UGB emnguer@gmail.com 191

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure

Le Langage C
Les structures

Pointeurs vers une structure


int main(){ struct personne pers; /* pers est une variable de type struct personne */ struct personne *p; /* p est un pointeur vers une struct personne */ p= & &pers; p -> nom = 13456; /*pour affecter une valeur au membre no_employe de la _ p y structure pointe par p */ } Pour accs aux lments d'une structure pointe (*p).nom (*p) nom ou p->nom

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure

E. M. Nguer UFR SAT UGB emnguer@gmail.com

192

Le Langage C
Les structures

Les listes chanes


Une des utilisations frquentes des structures, est de crer des listes de structures chanes. Pour cela, il faut f t que chaque structure contienne un membre qui h t t ti b i soit de type pointeur vers une structure du mme type. Cela se fait de la faon suivante : yp struct personne { ... /* les diffrents membres */ struct personne *suivant; }; le membre de nom suivant est dclar comme tant du type pointeur vers une struct personne. d t i t t t La dernire structure de la liste devra avoir un membre suivant dont la valeur sera le pointeur NULL
E. M. Nguer UFR SAT UGB emnguer@gmail.com 193

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure

Le Langage C
Les structures

Passage de structures en paramtre g p


Supposons que l'on ait fait la dclaration suivante : struct date{ int jour,mois,annee; jour mois annee; }; une fonction de comparaison de deux dates pourra s'crire : ' i int cmp_date( struct date d1, struct date d2){ if (d1.annee > d2.annee) return(1); if (d1.annee < d2.annee) ( ); return(0); ... /* comparaison portant sur mois et jour */ } et une utilisation de cette fonction pourra tre : ili i d f i struct date d1,d2; ( p_ ( , )) if (cmp date(d1,d2)) ...
E. M. Nguer UFR SAT UGB emnguer@gmail.com 194

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure

Le Langage C
Les structures

Allocation et libration d'espace p


Nous allons voir dans cette partie trois fonctions de la bibliothque standard permettant d'allouer et de librer de l espace. l'espace Allocation d'espace : fonctions malloc et calloc Quand on cre une liste chane, c'est parce qu'on ne sait pas la compilation combien elle comportera p p p d'lments l'excution (sinon on utiliserait un tableau). Pour pouvoir crer des listes, il est donc ncessaire de pouvoir allouer de l espace l'espace dynamiquement. On dispose pour cela de deux fonctions malloc et calloc.

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure

E. M. Nguer UFR SAT UGB emnguer@gmail.com

195

Le Langage C
Les structures

Allocation et libration d'espace p


Allocation d'un espace : fonction malloc La fonction malloc admet un paramtre qui est la taille en octets de l lment dsir et elle rend un l'lment pointeur vers l'espace allou. Exemple: #include tdlib h #i l d <stdlib.h> struct personne *p; p = malloc(sizeof(struct personne)); Allocation d un tableau d'lments: fonction calloc d'un d lments: Elle admet deux paramtres : - le premier est le nombre d'lments dsirs ; - le second est la taille en octets d'un lment d un lment. son but est d'allouer un espace suffisant pour contenir les lments demands et de rendre un pointeur vers cet espace. t
E. M. Nguer UFR SAT UGB emnguer@gmail.com 196

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure

Le Langage C
Les structures

Allocation et libration d'espace p


Exemple: #include <stdlib.h> struct personne *p; int nb_elem; ... /* init de nb_elem */ i it d b l p = calloc(nb_elem,sizeof(struct personne)); On peut alors utiliser les lments p[0], p[1], ... p[nb_elem-1].

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure

E. M. Nguer UFR SAT UGB emnguer@gmail.com

197

Le Langage C
Les structures

Allocation et libration d'espace p


Libration d'espace : fonction free On libre l'espace allou par malloc ou calloc au p p moyen de la procdure free qui admet un seul paramtre : un pointeur prcdemment rendu par un appel malloc malloc. Exemple: #include <stdlib.h> struct personne *p; p = malloc(sizeof(struct personne)); ... /* utilisation de la structure alloue */ free(p);

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure

E. M. Nguer UFR SAT UGB emnguer@gmail.com

198

Le Langage C
Les structures

Les champs de bits p


Gnralits : Il est parfois ncessaire pour un programmeur de dcrire en termes de bits la structure d une d'une ressource matrielle de la machine. Un exemple machine typique est la programmation systme qui ncessite de manipuler des registres particuliers de la machine. Par exemple, dans le manuel du MC 68030 de Motorola, le registre d'tat est ainsi dcrit : - bit 0 : carry ; - bit 1 : overflow ; - bit 2 : zro ; - bit 3 : ngatif ; tif - bit 4 : extension ; - bits 5-7 : inutiliss ; - bits 8-10 : masque des interruptions ; - bit 11 : inutilis ; - bits 12 13 : niveau de privilge ; 12-13 - bits 14-15 : tat des traces.
E. M. Nguer UFR SAT UGB emnguer@gmail.com 199

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure p Les champs de bits

Le Langage C
Les structures

Les champs de bits p


Il existe dans le langage C un moyen de raliser de telles descriptions, l'aide du concept de structure. En effet, dans une dclaration de structure il est effet structure, possible de faire suivre la dfinition d'un membre par une indication du nombre de bits que doit avoir ce membre. Dans ce cas, l l b D le langage C appelle a un ll champ de bits. Le L registre d'tat du MC 68030 peut se dcrire ainsi : i t d't t d t d i i i struct sr{ unsigned int trace : 2; unsigned int priv : 2; unsigned int : 1; /* inutilis */ unsigned int masque : 3; unsigned int : 3; /* inutilis */ unsigned int extend : 1; unsigned int negative : 1;
E. M. Nguer UFR SAT UGB emnguer@gmail.com 200

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure Les champs de bits Les numrations Les unions

Le Langage C
Les structures

Les champs de bits p


unsigned int negative : 1; unsigned int zero : 1; unsigned int overflow : 1; unsigned int carry : 1; }; On it O voit que le langage C accepte que l'on ne donne l l t l' d pas de nom aux champs de bits qui ne sont pas utiliss. Contraintes 1. Les seuls types accepts pour les champs de bits sont int, unsigned int et signed int.

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure Les champs de bits Les numrations Les unions

E. M. Nguer UFR SAT UGB emnguer@gmail.com

201

Le Langage C
Les structures

Les champs de bits p


2. L'ordre dans lequel sont mis les champs de bits l intrieur d'un l'intrieur d un mot dpend de l implmentation, l'implmentation mais gnralement, dans une machine little endian les premiers champs dcrivent les bits de poids faibles et les derniers champs les bits de id f ibl tl d i h l bit d poids forts, alors que c'est gnralement l'inverse dans une machine big endian. g 3. Un champ de bit dclar comme tant de type int, peut en fait se comporter comme un signed int ou comme un unsigned int (cela dpend de l'implmentation). Il est donc recommand d'une manire gnrale de dclarer les champs de bits comme tant de type unsigned int. int 4. Un champ de bits n'a pas d'adresse, on ne peut donc pas lui appliquer l'oprateur adresse de (&).
E. M. Nguer UFR SAT UGB emnguer@gmail.com 202

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure Les champs de bits Les numrations Les unions

Le Langage C
Les structures

Les numrations
On peut dclarer des constantes nommes de la manire suivante : enum {LUNDI MARDI, MERCREDI JEUDI {LUNDI, MARDI MERCREDI, JEUDI, VENDREDI, SAMEDI, DIMANCHE}; qui dclare les identificateurs LUNDI, MARDI, etc. comme tant des constantes entires de valeur 0, 1, etc. Les numrations fonctionnent syntaxiquement comme les structures : aprs le mot-cl enum il peut y avoir un identificateur appel tiquette d'numration qui permettra plus loin dans le d' ti i tt l l i d l programme de dclarer des variables de type numration. Exemple : enum jour {LUNDI, MARDI, MERCREDI, JEUDI, VENDREDI, SAMEDI, DIMANCHE};
E. M. Nguer UFR SAT UGB emnguer@gmail.com 203

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure Les champs de bits Les numrations Les unions

Le Langage C
Les structures

Les numrations
enum jour j1, j2; j1 = LUNDI; j2 = MARDI; L'exemple ci-dessus est conforme ce qui nous semble tre de bonnes rgles de programmation : dclarer d'abord le type numration en lui donnant un nom grce une tiquette d'numration et ensuite utiliser ce nom pour dclarer des variables. variables Cependant, comme pour les structures, le langage C permet de dclarer des variables dans la dclaration du type d t numration, t ll ti ventuellement en omettant t tt t l'tiquette d'numration. Exemples : enum jour {LUNDI, MARDI, MERCREDI JEUDI, {LUNDI MARDI MERCREDI, JEUDI VENDREDI, SAMEDI, DIMANCHE} d1, d2; dclare d1 et d2 comme tant des variable de type enum j jour,
E. M. Nguer UFR SAT UGB emnguer@gmail.com 204

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure Les champs de bits Les numrations Les unions

Le Langage C
Les structures

Les numrations
enum {FAUX, VRAI} b1,b2; dclare b1 et b2 comme tant des variables de type numration sans nom, dont les valeurs peuvent tre FAUX ou VRAI. Nous avons expliqu plus haut pourquoi un tel style de programmation nous semblait mauvais. p g

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure Les champs de bits Les numrations Les unions

E. M. Nguer UFR SAT UGB emnguer@gmail.com

205

Le Langage C
Les structures

Les unions
Il est parfois ncessaire de manipuler des variables auxquelles on dsire affecter des valeurs de type diffrents. diffrents Supposons que l'on dsire crire un l on package mathmatique qui manipulera des nombres qui seront implments par des int, tant que la prcision des entiers de la machine sera suffisante et ii d ti d l hi ffi t t qui passera automatiquement une reprsentation sous forme de flottants ds que ce ne sera plus le cas. q p Il sera ncessaire de disposer de variables pouvant prendre soit des valeurs entires, soit des valeurs flottantes. Ceci peut se raliser en C, grce au mcanisme des C unions. Une dfinition d'union a la mme syntaxe qu'une dfinition de structure, le mot cl struct tant simplement remplac par l mot cl union. i l t l le t l i
E. M. Nguer UFR SAT UGB emnguer@gmail.com 206

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure Les champs de bits Les numrations Les unions

Le Langage C
Les structures

Les unions
Exemple : union nombre{ int i; float f; } L'identificateur nombre est appel tiquette d'union. La diffrence smantique entre les struct et les unions est la suivante : alors que pour une variable de type structure tous les membres peuvent avoir en mme temps une valeur, une variable de type union ne peut avoir un i t t donn qu'un seul membre ayant une i instant d ' l b t valeur. En reprenant l'exemple prcdent, on dclarera une variable n de type union nombre par : union nombre n; cette variable pourra possder soit une valeur entire, soit une valeur flottante, mais pas les deux l fois. it l fl tt t i l d la f i
E. M. Nguer UFR SAT UGB emnguer@gmail.com 207

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure Les champs de bits Les numrations Les unions

Le Langage C
Les structures

Les unions
Exemple : union nombre{ int i; float f; } L'identificateur nombre est appel tiquette d'union. La diffrence smantique entre les struct et les unions est la suivante : alors que pour une variable de type structure tous les membres peuvent avoir en mme temps une valeur, une variable de type union ne peut avoir un i t t donn qu'un seul membre ayant une i instant d ' l b t valeur. En reprenant l'exemple prcdent, on dclarera une variable n de type union nombre par : union nombre n; cette variable pourra possder soit une valeur entire, soit une valeur flottante, mais pas les deux l fois. it l fl tt t i l d la f i
E. M. Nguer UFR SAT UGB emnguer@gmail.com 208

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure Les champs de bits Les numrations Les unions

Le Langage C
Les structures

Exercice
1) Ecrire un programme qui: a) lit au clavier des informations dans un tableau de structures du type point dfini comme suit: struct point { int num; double d bl x ; double y; } Le nombre d'lments du tableau sera fix par une instruction #define. b) affiche l'cran l ensemble des informations l cran l'ensemble prcdentes. 2) Raliser la mme chose que dans l'exercice prcdent, prcdent mais en prvoyant, cette fois une prvoyant fois, fonction pour la lecture des informations et une fonction pour l'affichage.
E. M. Nguer UFR SAT UGB emnguer@gmail.com

Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure Les champs de bits Les numrations Les unions

209

Le Langage C g g
Historique Gnralits Les types de bases Les oprateurs et les expressions e pressions Les entres-sorties Les instructions de contrle Les fonctions Tableaux et pointeurs Les chanes de caractres Les structures Les fichiers Gnie logiciel La gestion dynamique g y q Le prprocesseur

Lesfichiers
Les donnes stockes en mmoire sont perdues ds la sortie du programme. Les fichiers sur support magntique (bande, disquette, (bande disquette disque) sont par contre conservables, mais au prix d'un temps d'accs aux donnes trs suprieur. On peut distinguer les fichiers squentiels (on accde au contenu dans l'ordre du stockage) ou accs g ) direct (on peut directement accder n'importe quel endroit du fichier). Les fichiers sont soit binaires (un float sera stock comme il est cod en mmoire , d'o gain de place mais incompatibilit entre logiciels), soit format logiciels) ASCII (un float binaire sera transform en dcimal puis on crira le caractre correspondant chaque chiffre). hiff )
E. M. Nguer UFR SAT UGB emnguer@gmail.com 210

Le Langage C g g
Historique Gnralits Les types de bases Les oprateurs et les expressions e pressions Les entres-sorties Les instructions de contrle Les fonctions Tableaux et pointeurs Les chanes de caractres Les structures Les fichiers Gnie logiciel La gestion dynamique g y q Le prprocesseur

Lesfichiers
Les fichiers tant dpendants du matriel, ils ne sont y pas prvus dans la syntaxe du C mais par l'intermdiaire de fonctions spcifiques. Nous verrons toutefois qu'en C, comme d ailleurs qu en d'ailleurs dans d'autres langages, tous les priphriques, qu'ils soient d'archivage (disque, disquette , clef usb. . . ) ou de communication (clavier, cran imprimante ) (clavier cran, imprimante,...), peuvent tre considrs comme des fichiers. Ainsi, dfi iti l Ai i en dfinitive, les entres-sorties conversationt ti ti nelles apparatront comme un cas particulier de la gestion de fichiers.

E. M. Nguer UFR SAT UGB emnguer@gmail.com

211

Le Langage C g g
Historique Gnralits Les types de bases Les oprateurs et les expressions e pressions Les entres-sorties Les instructions de contrle Les fonctions Tableaux et pointeurs Les chanes de caractres Les structures Les fichiers Gnie logiciel La gestion dynamique g y q Le prprocesseur

Lesfichiers
En fait, pour des fichiers disque (ou disquette), la distinction entre accs squentiel et accs direct n a n'a plus vritablement de raison d'tre. D'ailleurs, comme vous le verrez, en langage C, vous utiliserez les mmes fonctions dans les deux cas (exception faite d'une fonction de dplacement de pointeur de fichier). Qui l Q i plus est, rien ne vous empchera de mlanger les t i h d l l deux modes d'accs pour un mme fichier. Cependant, pour assurer une certaine progressivit notre propos, nous avons prfr commencer par Vous montrer comment travailler de manire o e co e v e e squentielle.

E. M. Nguer UFR SAT UGB emnguer@gmail.com

212

Le Langage C
Les fichiers

Les fichiers par lexemple f p p


Le programme suivant permet d'enregistrer squentiellement dans un fichier une suite de nombres entiers qu on lui fournit au clavier qu'on clavier.
#include <stdio.h> int main(void){ char nomfich[21] ; int n ; FILE * sortie ; printf ("nom du fichier crer : ") ; ( nom ) scanf ("%20s", nomfich) ; sortie = fopen (nomfich, "w") ; do{ { printf ("donnez un entier : ") ; scanf ("%d", &n) ; if (n) fwrite(&n, i f(i t) 1 f it (& sizeof(int), 1, sortie) ; ti ) }while (n) ; fclose (sortie) ; retunr 0 ; }
E. M. Nguer UFR SAT UGB emnguer@gmail.com 213

Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes

Le Langage C
Les fichiers

Cration dun fichier f


La dclaration : FILE * sortie; g q p j yp signifie que sortie est un pointeur sur un objet de type FILE. Ce nom dsigne en fait un modle de structure dfini dans le fichier stdio.h (par une instruction yp , qui p q ) typedef, ce q explique l'absence du mot struct). Cette dclaration ne rserve qu'un emplacement pour un pointeur. C est la fonction fopen qui crera effectivement C'est une telle structure et qui en fournira l'adresse en rsultat. La fonction fopen est ce que l on nomme une fonction l'on d'ouverture de fichier. Elle possde deux arguments : - le nom du fichier concern, fourni sous forme d'une chane de caractres; notez qu en gnral ce nom qu'en pourra comporter une information (chemin, rpertoire, ...) permettant de prciser l'endroit o se trouve le fichier. fichier
E. M. Nguer UFR SAT UGB emnguer@gmail.com 214

Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes

Le Langage C
Les fichiers

Ouverture dun fichier f


- une indication, fournie elle aussi sous forme d'une chane, prcisant ce que l'on souhaite faire avec ce fichier. fichier Liste des diffrentes possibilits offertes par fopen. r : lecture seulement; le fichier doit exister. exister w: criture seulement. Si le fichier n'existe pas, il est cr. S'il existe, son (ancien) contenu est perdu. a: it criture en fin de fichier (append). Si le fichier existe fi d fi hi ( d) l fi hi it dj, il sera "tendu". S'il n'existe pas, il sera cr, on se ramne alors au mode w. r+: mise j i jour (lecture et i (l criture). Le fichier doit ) L fi hi d i exister. Notez qu'alors il n'est pas possible de raliser une lecture la suite d'une criture ou une criture la suite d'une lecture, sans positionner le pointeur de fichier par fseek. Il est toutefois possible d'enchaner p plusieurs lectures ou critures conscutives (de ( faon squentielle).
E. M. Nguer UFR SAT UGB emnguer@gmail.com 215

Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes

Le Langage C
Les fichiers

Ouverture dun fichier f


w+: cration pour mise jour. Si le fichier existe, son (ancien) contenu sera dtruit. S'il n'existe pas, il sera cr. cr Notez que l'on obtiendrait un mode comparable w+ en ouvrant un fichier vide (mais existant) en mode r+. r+ a+: extension et mise jour. Si le fichier n'existe pas, il sera cr. S'il existe, le pointeur sera positionn en fin d fi hi fi de fichier. t ou b: lorsque l'implmentation distingue les fichiers de texte des autres, il est possible d'ajouter l'une de ces d deux l lettres chacun d 6 modes prcdents. h des d d La lettre t prcise que l'on a affaire un fichier de texte; la lettre b prcise que l'on a affaire un fichier ''binaire" .

Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes

E. M. Nguer UFR SAT UGB emnguer@gmail.com

216

Le Langage C
Les fichiers

criture dans un fichier f


Le remplissage du fichier est ralis par la rptition de l'appel : fwrite (&n, sizeof(int), 1, sortie); La fonction fwrite possde quatre arguments prcisant : - l' d l'adresse d'un bloc d'informations (ici &n), d' bl d'i f i (i i & ) - la taille d'un bloc, en octets : ici sizeof(int); notez l'emploi de l'oprateur sizeof qui assure la portabilit du programme, - le nombre de blocs de cette taille que l'on souhaite ( ), transfrer dans le fichier (ici l), - l'adresse de la structure dcrivant le fichier (sortie). Notez que, d une manire gnrale, fwrite permet de d'une transfrer plusieurs blocs conscutifs de mme taille partir d'une adresse donne.
E. M. Nguer UFR SAT UGB emnguer@gmail.com

Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes

217

Le Langage C
Les fichiers

criture dans un fichier f


Enfin, la fonction fclose ralise ce que l'on nomme une "fermeture" de fichier. Elle force l'criture sur disque du tampon associ au fichier Remarques: 1) On emploie souvent le terme flux (en anglais stream) pour dsigner un pointeur sur une structure de type FILE. Ici, par exemple, sortie est un flux que la fonction f f ti fopen aura associ un certain fichier. i t i fi hi D'une manire gnrale, par souci de simplification, lorsque aucune ambigut ne sera possible, nous utiliserons souvent le mot fichier l place de flux . ili l fi hi la l d fl 2) fopen fournit un pointeur nul en cas d'impossibilit d'ouverture du fichier. Ce sera le cas, par exemple, si l'on cherche ouvrir en lecture un fichier inexistant ou encore si l'on cherche crer un fichier sur une q disquette sature.
E. M. Nguer UFR SAT UGB emnguer@gmail.com 218

Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes

Le Langage C
Les fichiers

criture dans un fichier f


3) fwrite fournit le nombre de blocs effectivement crits. Si cette valeur est infrieure au nombre prvu, cela signifie qu une erreur est survenue en cours d criture. qu'une d'criture Cela peut tre, par exemple, une disquette pleine, mais cela peut se produire galement lorsque l'ouverture du fichier s'est mal droule (et que l'on n'a pas pris soin d'examiner le code de retour de fopen).

Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes

E. M. Nguer UFR SAT UGB emnguer@gmail.com

219

Le Langage C
Les fichiers

Lecture dun fichier f


Le programme suivant permet de lister (lire) le contenu d'un fichier quelconque tel qu'il a pu tre cr par le programme prcdent. prcdent
#include <stdio.h> int main(void){ char nomfich[21] ; int n ; FILE * entree ; printf ("nom du fichier lister : ") ; scanf ("%20s", nomfich) ; entree = fopen (nomfich "r") ; (nomfich, r ) while(fread (&n, sizeof(int), 1, entree), ! feof(entree)) { printf ("\n%d", n) ; } fclose (entree) ; return 0 ; }
E. M. Nguer UFR SAT UGB emnguer@gmail.com 220

Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes

Le Langage C
Les fichiers

Lecture dun fichier f


Les dclarations sont identiques celles du programme prcdent. En revanche, on trouve cette fois, dans l ouverture fichier, l'indication l'ouverture du fichier l indication r (abrviation de read). read) Elle prcise que le fichier en question ne sera utilis qu'en lecture. Il est donc ncessaire qu'il existe dj La lecture dans le fichier se fait par un appel de la fonction fread: fread (&n, i f(i t) 1 f d (& sizeof(int), 1, entree) t ) dont les arguments sont comparables ceux de fwrite. Mais, cette fois, la condition d arrt de la boucle est : d'arrt feof (entree) qui prend la valeur vrai (c est dire 1) lorsque la fin (c'est--dire du fichier a t rencontre. Notez bien qu'il n'est pas suffisant d'avoir lu le dernier octet du fichier pour que cette condition prenne la valeur vrai. vrai
E. M. Nguer UFR SAT UGB emnguer@gmail.com 221

Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes

Le Langage C
Les fichiers

Lecture dun fichier f


Il est ncessaire d'avoir tent de lire au-del; c'est ce qui explique que nous ayons examin cette condition aprs l'appel de fread et non avant. l appel avant Remarques: 1) On pourrait remplacer la boucle while par la construction (moins concise) suivante: do{ fread (&n, sizeof(int), 1, entree) ; if ( !feof(entree)) !f f( t )) printf ("\n%d", n) ; }while ( !feof(entree) ) ; 2) N'oubliez pas que le premier argument des fonctions fwrite et fread est une adresse. Ainsi, lorsque vous aurez affaire un tableau, il faudra utiliser simplement son nom (sans le faire prcder de &), tandis qu'avec p une structure il faudra effectivement utiliser l'oprateur & pour en obtenir l'adresse.
E. M. Nguer UFR SAT UGB emnguer@gmail.com 222

Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes

Le Langage C
Les fichiers

Lecture dun fichier f


Dans ce dernier cas, mme si l'on ne cherche pas rendre son programme portable, il sera prfrable d utiliser l'oprateur d'utiliser l oprateur sizeof pour dterminer avec certitude la taille des blocs correspondants. 3) fread fournit le nombre de blocs effectivement lus (et non pas le nombre d'octets lus). Ce rsultat peut tre infrieur au nombre de blocs demands soit lorsque l'on l' a rencontr une fi de fichier, soit lorsqu'une t fin d fi hi it l ' erreur de lecture est apparue. Dans notre prcdent exemple d'excution, fread fournit toujours 1, sauf la dernire f i o elle fournit 0. f i j 1 f l d i fois ll f i 0

Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes

E. M. Nguer UFR SAT UGB emnguer@gmail.com

223

Le Langage C
Les fichiers

Accs direct
Les fonctions fread et fwrite lisent ou crivent un certain nombre d'octets dans un fichier, partir d'une "position courante courante". Cette dernire n est rien d autre qu un n'est d'autre qu'un "pointeur" dans le fichier, c'est--dire un nombre prcisant le rang du prochain octet lire ou crire. Aprs chaque opration de lecture ou d'criture, ce pointeur se trouve incrment du nombre d'octets transfrs. C' t ainsi que l'on ralise un accs t f C'est i i l' li squentiel au fichier. Mais M i il est l galement possible d'agir directement sur ce ibl d' i di pointeur de fichier l 'aide de la fonction fseek. Cela permet ainsi de raliser des lectures ou des critures en n'importe quel point du fichier, sans avoir besoin de parcourir toutes les informations qui prcdent. p q g On peut ainsi raliser ce que l'on nomme gnralement un "accs direct".
E. M. Nguer UFR SAT UGB emnguer@gmail.com 224

Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes

Le Langage C
Les fichiers

Accs direct
Voici un programme qui permet d'accder n'importe quel entier d'un fichier #include <stdio.h> <stdio h> int main(void){ char nomfich[21]; int n ; long num ; FILE * entree ; printf ("nom du fichier consulter : ") ; scanf ( %20s , nomfich) ; ("%20s" entree = fopen (nomfich, "r") ; while (printf (" numro de l'entier recherch : "),scanf ( %ld &num), ("%ld", &num) num){ fseek (entree, sizeof(int)*(num-1), SEEK_SET); fread (&n, sizeof(int), 1, entree) ; printf ( valeur : %d \n", n) ; (" \n } fclose (entree) ; return 0 ;
}
E. M. Nguer UFR SAT UGB emnguer@gmail.com 225

Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes

Le Langage C
Les fichiers

Accs direct
La principale nouveaut rside essentiellement dans l'appel de la fonction fseek: fseek f k ( entree, sizeof(int)*(num-1), SEEK SET) t i f(i t)*( 1) SEEK_SET); Elle possde trois arguments: - le fichier concern - un entier de type long spcifiant la valeur que l'on souhaite donner au pointeur de fichier. p - le choix du mode d'action sur le pointeur de fichier: il est dfini par une constante entire. Les valeurs suivantes sont prdfinies dans <stdio.h>: * SEEK SET (en gnral 0): le second argument SEEK_SET ( l 0) l d dsigne un dplacement (en octets) depuis le dbut du fichier. * SEEK_CUR (en gnral 1) : le second argument dsigne un dplacement exprim partir de la p position courante; il s'agit d'un dplacement relatif g p dont la valeur peut, le cas chant, tre ngative.
E. M. Nguer UFR SAT UGB emnguer@gmail.com 226

Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes

Le Langage C
Les fichiers

Accs direct
* SEEK_END (en gnral 2): le second argument dsigne un dplacement depuis la fin du fichier. Ici, il s'agit de donner au pointeur de fichier une valeur correspondant l'emplacement d'un entier (sizeof(int)) octets) dont l utilisateur fournit le rang. l'utilisateur rang Il est donc naturel de donner au troisime argument la valeur 0. Notez, au passage, la "formule" : l 0 N t l "f l " sizeof(int) * (num-1) qui se justifie par le fait que nous nous sommes convenu que, pour l'utilisateur, le premier entier du fichier porterait le rang 1 et non 0. i i d fi hi i l 0

Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes

E. M. Nguer UFR SAT UGB emnguer@gmail.com

227

Le Langage C
Les fichiers

Les fichiers textes f


Nous venons de voir que les fonctions fread et fwrite ralisent un transfert d'information (entre mmoire et fichier) fi hi ) que l' pourrait qualifier d "b t" dans le sens l'on it lifi de "brut", d l o il se fait sans aucune transformation de l'information. Les L octets qui figurent dans le fichier sont des "copies i fi d l fi hi d " i conformes" de ceux qui apparaissent en mmoire. Mais, en langage C, il est galement possible d'accompagner ces transferts d'information d'oprations de formatage "formatage" analogues celles que ralisent printf ou scanf. Les fichiers concerns par ces oprations de formatage sont alors ce que l'on a coutume d'appeler des "fichiers de type texte". Ce sont des fichiers que vous pouvez manipuler avec un dit i l diteur.
E. M. Nguer UFR SAT UGB emnguer@gmail.com 228

Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes

Le Langage C
Les fichiers

Les fichiers textes f


Dans de tels fichiers, chaque octet reprsente un caractre. Gnralement, on y trouve des caractres de fin d li fi de ligne (\n), de sorte qu'ils apparaissent comme une (\ ) d t 'il i t suite de lignes. Les f L fonctions permettant de travailler avec des fichiers i d ill d fi hi de texte ne sont rien d'autre qu'une gnralisation aux fichiers de celles que nous avons dj rencontres pour les entres-sorties conversationnelles. Nous nous contenterons donc d'en fournir une brve liste fscanf ( fi hi format, liste_d'adresses ) f f fichier, f li d' d fprintf ( fichier, format, liste_d'expressions ) fgetc ( fichier ) fputc (entier, fichier ) fgets ( chane, lgmax, fichier ) p , fputs ( chane, fichier )
E. M. Nguer UFR SAT UGB emnguer@gmail.com 229

Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes

Le Langage C
Les fichiers

Les fichiers textes f


La signification de leurs arguments est la mme que p pour les fonctions conversationnelles correspondantes. p Seule fgets comporte un argument entier (lgmax) de contrle de longueur. Il prcise le nombre maximal de caractres (y compris le \0 de fin) qui seront placs dans la chane. Leur valeur de retour est la mme que pour les fonctions conversationnelles. Cependant, il nous faut apporter quelques indications supplmentaires qui ne se justijusti fiaient pas pour des entres-sorties conversationnelles, savoir que la valeur de retour fournie par fgetc est du type int (et non, comme on pourrait le croire, de type non croire char).

Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes

E. M. Nguer UFR SAT UGB emnguer@gmail.com

230

Le Langage C
Les fichiers

Les fichiers textes f


Lorsque la fin de fichier est atteinte, cette fonction fournit la valeur EOF (constante prdfinie dans <stdio.h> - en gnral -1). La fin de fichier n'est dtecte que lorsque l'on cherche lire un caractre q y p p p alors qu'il n'y en a plus de disponible, et non pas, ds que l'on a lu le dernier caractre. p , q , D'autre part, notez bien que cette convention fait, en quelque sorte, double emploi avec la fonction feof. D une D'une manire gnrale, toutes les fonctions prsentes ci-dessus fournissent une valeur de retour bien dfinie en cas de fin de fichier ou d'erreur.

Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes

E. M. Nguer UFR SAT UGB emnguer@gmail.com

231

Le Langage C
Les fichiers

Les fichiers textes f


Remarque importante: A priori, on peut toujours dire que n'importe quel fichier, quelle que soit la manire d t l'information y a t ll it l i dont l'i f ti reprsente, peut tre considr comme une suite de caractres. Bien entendu, si l'on cherche "lister", par exemple, le contenu d'un fichier tel que celui cr au l l d' fi hi l l i debut (suite d'entiers), le rsultat risque d'tre sans signification (on obtiendra une suite de caractres apparemment quelconques, sans rapport aucun avec les nombres enregistrs). Mais, sans aller jusqu' le lister, on peut se demander s'il ne serait pas possible de le recopier, l'aide d'une p g p rptition de fgetc et de fputc. Or cela semble effectivement possible puisque ces fonctions se contentent de prlever un caractre (donc un octet) et de le recopier tel quel. Ainsi, quel que soit le contenu de l'octet lu, on le l octet retrouvera dans le fichier de sortie.
E. M. Nguer UFR SAT UGB emnguer@gmail.com 232

Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes

Le Langage C
Les fichiers

Les fichiers textes f


En ralit, cela n'est que partiellement vrai car certains systmes (DOS en particulier) distinguent les fichiers de texte d t t des autres (qu'ils appellent parfois "fichiers t ( 'il ll t f i "fi hi binaires"); plus prcisment, lors de l'ouverture du fichier, on peut spcifier si l'on souhaite ou non considrer l contenu du fichier comme du texte. le d fi hi d Cette distinction est en fait motive par le fait que le caractre de fin de ligne (\n) possde, sur ces systmes, une reprsentation particulire obtenue par la succession de deux caractres (retour chariot \r, suivi de fin de ligne ( g \n). Or, dans ce cas, pour qu'un programme C puisse ne "voir" qu'un seul caractre de fin de ligne et qu'il s'agisse bien de \n, il faut oprer un traitement particulier , p p consistant : - remplacer chaque occurrence de ce couple de caractres par \n, dans le cas d une lecture, d'une
E. M. Nguer UFR SAT UGB emnguer@gmail.com 233

Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes

Le Langage C
Les fichiers

Les fichiers textes f


- remplacer chaque demande d'criture de \n par l'criture de ce couple de caractres. Bien entendu, de telles substitutions ne doivent pas tre ralises sur de "vrais fichiers binaires". Il faut donc bien bi pouvoir oprer une di i i au sein du programi distinction i d me. Cette distinction se fait au moment de l'ouverture du fichier, en ajoutant l'une des lettres t (pour "texte") ou b (pour "binaire") au mode d'ouverture. g p g En gnral, dans les implmentations o l'on distingue les fichiers de texte des autres, les fonctions d'entressorties formates refusent de travailler avec un fichier q qui n'a pas t spcifi de ce type lors de son ouverture. p p yp

Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes

E. M. Nguer UFR SAT UGB emnguer@gmail.com

234

Le Langage C
Les fichiers

Les fichiers textes f


Exercices 1) Ecrire une fonction permettant d'afficher le contenu d un d'un fichier texte en numrotant les lignes. Les lignes lignes seront supposes ne jamais comporter plus de 80 caractres. 2) Ecrire une fonction permettant de crer squentiel lement un fichier "rpertoire" comportant pour q personne: chaque p - nom (20 caractres maximum), - prnom (15 caractres maximum), - ge (entier), - numro de tlphone (11 caractres maximum). Les informations relatives aux diffrentes personnes seront lues au clavier clavier. 3) Ecrire une fonction permettant, partir du fichier cr par l'exercice prcdent, de retrouver les informations correspondant une personne de nom donn.
E. M. Nguer UFR SAT UGB emnguer@gmail.com 235

Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes

Le Langage C
Les fichiers

Les fichiers textes f


Exercices 4) E i une fonction permettant, partir du fichier Ecrire f ti tt t ti d fi hi cr par le programme de l'exercice 2, de retrouver les informations relatives une personne de "rang donn ( d (par accs di ) direct). 5) Ecrire une fonction permettent de trier par ordre alphabtique du nom, les informations du fichier cre lexercice 2. 6) Ecrire un programme regroupant tous ces sous programme avec possibilit de menu de choix p pour lutilisateur.

Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes

E. M. Nguer UFR SAT UGB emnguer@gmail.com

236

Le Langage C g g
Historique Gnralits Les types de bases Les oprateurs et les expressions e pressions Les entres-sorties Les instructions de contrle Les fonctions Tableaux et pointeurs Les chanes de caractres Les structures Les fichiers Gnie logiciel La gestion dynamique g y q Le prprocesseur

Gnielogiciel g

E. M. Nguer UFR SAT UGB emnguer@gmail.com

237

Le Langage C g g
Historique Gnralits Les types de bases Les oprateurs et les expressions e pressions Les entres-sorties Les instructions de contrle Les fonctions Tableaux et pointeurs Les chanes de caractres Les structures Les fichiers Gnie logiciel La gestion dynamique g y q Le prprocesseur

Lagestiondynamique delammoire

E. M. Nguer UFR SAT UGB emnguer@gmail.com

238

Le Langage C g g
Historique Gnralits Les types de bases Les oprateurs et les expressions e pressions Les entres-sorties Les instructions de contrle Les fonctions Tableaux et pointeurs Les chanes de caractres Les structures Les fichiers Gnie logiciel La gestion dynamique g y q Le prprocesseur

Leprprocesseur p p

E. M. Nguer UFR SAT UGB emnguer@gmail.com

239

Das könnte Ihnen auch gefallen