Académique Documents
Professionnel Documents
Culture Documents
Miage 1 et Dietel 1
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
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
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
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
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.
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.
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
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
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
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
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
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
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
Prsentation du langage C Quelques instructions du langage C l Quelques rgles dcriture Cration dun programme en langage C
20
Le Langage C g g
Gnralits Quelques rgles dcriture
21
Le Langage C g g
Gnralits Quelques rgles dcriture
volatile while
Le Langage C g g
Gnralits Quelques rgles dcriture
Le Langage C g g
Gnralits Quelques rgles dcriture
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
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)
27
Le Langage C g g
Gnralits Cration dun programme en langage C g g
28
Le Langage C g g
Gnralits Cration dun programme en langage C g g
29
Le Langage C g g
Gnralits Cration dun programme en langage C g g
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)
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
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.
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
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.
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.
36
Le Langage C g g
Les types de bases
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
Sparc 1993
16 bits 32 bits 32 bits
Pentium 1993
16 bits 32 bits 32 bits
Alpha 1994
16 bits 32 bits 64 bits
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...
39
Le Langage C g g
Les types de bases
40
Le Langage C g g
Les types de bases
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
Sparc 1993
32 bits 64 bits 64 bits
Pentium 1993
32 bits 64 bits 64 bits
Alpha 1994
32 bits 64 bits 128 bits
Anne
float double long double
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
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
43
Le Langage C Typecaractreetchanesdecaractres g g yp
Les types de bases
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
Le Langage C g g
Les types de bases
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
Les expressions
Les oprateurs
47
Le Langage C g g
Les oprateurs et les expressions
Les expressions
Les oprateurs
Le Langage C g g
Les oprateurs et les expressions
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
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
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 expressions
Les oprateurs
ex
&
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
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
Oprateur multiplication division modulo Addition soustraction dcalage gauche dcalage droite oprateurs oprate rs relationnels oprateurs dgalitp g ingalit et bit bit
Les expressions
Les oprateurs
63
Oprateur ou exclusif bit bit ou bit bit ou logique expression conditionnelle diti ll affectation affectation tendue composition dexpressions
Les expressions
Les oprateurs
gauche
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
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
66
Le Langage C g g
Les entres-sorties
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
Le Langage C g g
Les entres-sorties
Le Langage C g g
Les entres-sorties
Le Langage C g g
Les entres-sorties
Le Langage C g g
Les entres-sorties
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
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
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
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 )
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
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
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; }
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, 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
Dfinition, dclaration et appels Allocation et dure de vie des variables Passage des arguments Arguments en nombre variable i bl Fonctions rcursives Exercices
88
Le Langage C
Les fonctions
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
Dfinition, dclaration et appels Allocation et dure de vie des variables Passage des arguments Arguments en nombre variable i bl Fonctions rcursives Exercices
90
Le Langage C
Les fonctions
Dfinition, dclaration et appels Allocation et dure de vie des variables Passage des arguments Arguments en nombre variable i bl Fonctions rcursives Exercices
91
Le Langage C
Les fonctions
Dfinition, dclaration et appels Allocation et dure de vie des variables Passage des arguments Arguments en nombre variable i bl Fonctions rcursives Exercices
92
Le Langage C
Les fonctions
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
93
Le Langage C
Les fonctions
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
Dfinition, dclaration et appels Allocation et dure de vie des variables Passage des arguments Arguments en nombre variable i bl Fonctions rcursives Exercices
95
Le Langage C
Les fonctions
#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
96
Le Langage C
Les fonctions
Dfinition, dclaration et appels Allocation et dure de vie des variables Passage des arguments Arguments en nombre variable i bl Fonctions rcursives Exercices
97
Le Langage C
Les fonctions
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
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
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
Dfinition, dclaration et appels Allocation et dure de vie des variables Passage des arguments Arguments en nombre variable b i bl Fonctions rcursives Exercices
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
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
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
Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs
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
107
Le Langage C
Tableaux et pointeurs
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
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
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
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
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
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
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
122
Le Langage C
Tableaux et pointeurs
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
*/ */ */ */
124
Le Langage C
Tableaux et pointeurs
Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs
Le Langage C
Tableaux et pointeurs
Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs
126
Le Langage C
Tableaux et pointeurs
Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs
127
Le Langage C
Tableaux et pointeurs
Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs
128
Le Langage C
Tableaux et pointeurs
Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs
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.
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
132
Le Langage C
Tableaux et pointeurs
Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs
Le Langage C
Tableaux et pointeurs
Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs
134
Le Langage C
Tableaux et pointeurs
Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs
135
Le Langage C
Tableaux et pointeurs
Tableaux un indice Tableaux plusieurs i di l i indices Les pointeurs Relations entre tableaux et pointeurs
Le Langage C
Tableaux et pointeurs
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
Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs
Le Langage C
Tableaux et pointeurs
Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs
140
Le Langage C
Tableaux et pointeurs
Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs
Le Langage C
Tableaux et pointeurs
Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs
142
Le Langage C
Tableaux et pointeurs
Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs
Le Langage C
Tableaux et pointeurs
Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs
144
Le Langage C
Tableaux et pointeurs
Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs
145
Le Langage C
Tableaux et pointeurs
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
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
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
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
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
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
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
156
Le Langage C
Tableaux et pointeurs
Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs
Le Langage C
Tableaux et pointeurs
Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs
158
Le Langage C
Tableaux et pointeurs
Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs
159
Le Langage C
Tableaux et pointeurs
Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs
160
Le Langage C
Tableaux et pointeurs
Tableaux un indice Tableaux plusieurs indices Les pointeurs Relations entre tableaux et pointeurs
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
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
163
Le Langage C
Les chanes de caractres
Le Langage C
Les chanes de caractres
Le Langage C
Les chanes de caractres
Le Langage C
Les chanes de caractres
Le Langage C
Les chanes de caractres
168
Le Langage C
Les chanes de caractres
Le Langage C
Les chanes de caractres
Le Langage C
Les chanes de caractres
Le Langage C
Les chanes de caractres
172
Le Langage C
Les chanes de caractres
Le Langage C
Les chanes de caractres
Le Langage C
Les chanes de caractres
Le Langage C
Les chanes de caractres
Le Langage C
Les chanes de caractres
177
Le Langage C
Les chanes de caractres
178
Le Langage C
Les chanes de caractres
Le Langage C
Les chanes de caractres
Le Langage C
Les chanes de caractres
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.
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 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
Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure
188
Le Langage C
Les structures
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
190
Le Langage C
Les structures
Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure
Le Langage C
Les structures
Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure
192
Le Langage C
Les structures
Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure
Le Langage C
Les structures
Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure
Le Langage C
Les structures
Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure
195
Le Langage C
Les structures
Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure
Le Langage C
Les structures
Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure
197
Le Langage C
Les structures
Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure
198
Le Langage C
Les structures
Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure p Les champs de bits
Le Langage C
Les structures
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
Dclaration de structure Oprateurs sur les structures Tableaux de structures Pointeurs vers une structure Les champs de bits Les numrations Les unions
201
Le Langage C
Les structures
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
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.
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.
212
Le Langage C
Les fichiers
Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes
Le Langage C
Les fichiers
Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes
Le Langage C
Les fichiers
Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes
Le Langage C
Les fichiers
Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes
216
Le Langage C
Les fichiers
Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes
217
Le Langage C
Les fichiers
Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes
Le Langage C
Les fichiers
Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes
219
Le Langage C
Les fichiers
Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes
Le Langage C
Les fichiers
Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes
Le Langage C
Les fichiers
Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes
Le Langage C
Les fichiers
Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes
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
227
Le Langage C
Les fichiers
Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes
Le Langage C
Les fichiers
Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes
Le Langage C
Les fichiers
Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes
230
Le Langage C
Les fichiers
Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes
231
Le Langage C
Les fichiers
Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes
Le Langage C
Les fichiers
Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes
Le Langage C
Les fichiers
Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes
234
Le Langage C
Les fichiers
Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes
Le Langage C
Les fichiers
Cration dun fichier criture dans un fichier Lecture dun fichier Accs direct Les fichiers textes
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
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
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
239