Sunteți pe pagina 1din 8

21/12/2015

Lestableaux

LESTABLEAUX
Cechapitreestlasuitedirectedespointeursetvavousfairecomprendreunpeuplusleurutilit.Vous
comptiezychapper?C'estrat!LespointeurssontpartoutenC,vousaveztprvenus!
Danscechapitre,nousapprendronscrerdesvariablesdetypetableaux.Lestableauxsonttrs
utilissenCcarilssontvraimentpratiquespourorganiserunesriedevaleurs.
Nouscommenceronsdansunpremiertempsparquelquesexplicationssurlefonctionnementdes
tableauxenmmoire(schmasl'appui).Cespetitesintroductionssurlammoiresontextrmement
importantes:ellesvouspermettentdecomprendrecommentcelafonctionne.Unprogrammeurqui
comprendcequ'ilfait,c'estquandmmeunpeuplusrassurantpourlastabilitdesesprogrammes,
non?)

Lestableauxdanslammoire
Lestableauxsontunesuitedevariablesdemmetype,situesdansunespacecontiguenmmoire.

Bon,jereconnaisquearessembleunpeuunedfinitiondudictionnaire.Concrtement,ils'agitde
grossesvariablespouvantcontenirplusieursnombresdummetype
( long , int , char , double ).
Untableauaunedimensionbienprcise.Ilpeutoccuper2,3,10,150,2500cases,c'estvousqui
dcidez.Lafig.suivanteestunschmad'untableaude4casesenmmoirequicommencel'adresse
1600.

https://openclassrooms.com/courses/apprenezaprogrammerenc/lestableaux2

1/8

21/12/2015

Lestableaux

Lorsquevousdemandezcreruntableaude4casesenmmoire,votreprogrammedemandel'OS
lapermissiond'utiliser4casesenmmoire.Ces4casesdoiventtrecontigus,c'estdirelesunes
lasuitedesautres.Commevouslevoyez,lesadressessesuivent:1600,1601,1602,1603.Iln'ya
pasdetrouaumilieu.
Enfin,chaquecasedutableaucontientunnombredummetype.Siletableauestdetype int ,alors
chaquecasedutableaucontiendraun int .Onnepeutpasfairedetableaucontenantlafois
des int etdes double parexemple.
Enrsum,voicicequ'ilfautretenirsurlestableaux.
Lorsqu'untableauestcr,ilprendunespacecontiguenmmoire:lescasessontlesunesla
suitedesautres.
Touteslescasesd'untableausontdummetype.Ainsi,untableaude int contiendra
uniquementdes int ,etpasautrechose.

Dfiniruntableau
Pourcommencer,nousallonsvoircommentdfiniruntableaude4 int :
inttableau[4];

Voil,c'esttout.Ilsuffitdoncderajouterentrecrochetslenombredecasesquevousvoulezmettre
dansvotretableau.Iln'yapasdelimite(partpeuttrelatailledevotremmoire,quandmme).
Maintenant,commentaccderchaquecasedutableau?C'estsimple,ilfaut
crire tableau[numeroDeLaCase] .
Attention:untableaucommencel'indicen0!Notretableaude4 int adonclesindices0,
1,2et3.Iln'yapasd'indice4dansuntableaude4cases!C'estunesourced'erreurstrs
courantes,souvenezvousen.
Sijeveuxmettredansmontableaulesmmesvaleursquecellesindiquessurlafig.suivante,je
devraidonccrire:
inttableau[4];
tableau[0]=10;
tableau[1]=23;
tableau[2]=505;
tableau[3]=8;

Jenevoispaslerapportentrelestableauxetlespointeurs?
Enfait,sivouscrivezjuste tableau ,vousobtenezunpointeur.C'estunpointeursurlapremire
casedutableau.Faitesletest:
inttableau[4];
printf("%d",tableau);
https://openclassrooms.com/courses/apprenezaprogrammerenc/lestableaux2

2/8

21/12/2015

Lestableaux

Rsultat,onvoitl'adresseosetrouve tableau :
1600

Enrevanche,sivousindiquezl'indicedelacasedutableauentrecrochets,vousobtenezlavaleur:
inttableau[4];
printf("%d",tableau[0]);
10

Demmepourlesautresindices.Notezquecomme tableau estunpointeur,onpeututiliserle


symbole * pourconnatrelapremirevaleur:
inttableau[4];
printf("%d",*tableau);
10

Ilestaussipossibled'obtenirlavaleurdelasecondecaseavec *(tableau+1) (adressedetableau


+1).
Lesdeuxlignessuivantessontdoncidentiques:
tableau[1]//Renvoielavaleurdelasecondecase(lapremirecasetant0)
*(tableau+1)//Identique:renvoielavaleurcontenuedanslasecondecase

Enclair,quandvouscrivez tableau[0] ,vousdemandezlavaleurquisetrouvel'adressetableau


+0case(c'estdire1600).
Sivouscrivez tableau[1] ,vousdemandezlavaleursetrouvantl'adressetableau+1case(c'est
dire1601).
Etainsidesuitepourlesautresvaleurs.

Lestableauxtailledynamique
LelangageCexisteenplusieursversions.
Uneversionrcente,appeleleC99,autoriselacrationdetableauxtailledynamique,c'estdirede
tableauxdontlatailleestdfinieparunevariable:
inttaille=5;
inttableau[taille];

Orcelan'estpasforcmentreconnupartouslescompilateurs,certainsplanterontsurlasecondeligne.
LelangageCquejevousenseignedepuisledbut(appelleC89)n'autorisepascegenredechoses.
Nousconsidreronsdoncquefairecelaestinterdit.
Nousallonsnousmettred'accordsurceci:vousn'avezpasledroitd'utiliserunevariableentre
crochetspourladfinitiondelatailledutableau,mmesicettevariableestuneconstante!Letableau
doitavoirunedimensionfixe,c'estdirequevousdevezcrirenoirsurblanclenombre
https://openclassrooms.com/courses/apprenezaprogrammerenc/lestableaux2

3/8

21/12/2015

Lestableaux

correspondantlatailledutableau:
inttableau[5];

Maisalorsilestinterditdecreruntableaudontlatailledpendd'unevariable?
Non,rassurezvous:c'estpossible,mmeenC89.Maispourfairecela,nousutiliseronsuneautre
technique(plussreetquimarchepartout)appelel'allocationdynamique.Nousverronscelabien
plusloindanscecours.

Parcouriruntableau
Supposonsquejeveuillemaintenantafficherlesvaleursdechaquecasedutableau.
Jepourraisfaireautantde printf qu'ilyadecases.Maisbon,ceseraitrptitifetlourd,etimaginez
unpeulatailledenotrecodesiondevaitafficherlecontenudechaquecasedutableauuneune!
Lemieuxestdeseservird'uneboucle.Pourquoipasd'uneboucle for ?Lesboucles for sonttrs
pratiquespourparcouriruntableau:
intmain(intargc,char*argv[])
{
inttableau[4],i=0;
tableau[0]=10;
tableau[1]=23;
tableau[2]=505;
tableau[3]=8;
for(i=0;i<4;i++)
{
printf("%d\n",tableau[i]);
}
return0;
}
10
23
505
8

Notreboucleparcourtletableaul'aided'unevariableappele i (c'estlenomtrsoriginalqueles
programmeursdonnentengnrallavariablequileurpermetdeparcouriruntableau!).
Cequiestparticulirementpratique,c'estqu'onpeutmettreunevariableentrecrochets.Eneffet,la
variabletaitinterditepourlacrationdutableau(pourdfinirsataille),maiselleestheureusement
autorisepourparcourirletableau,c'estdireaffichersesvaleurs!
Ici,onamislavariable i ,quivautsuccessivement0,1,2,et3.Decettefaon,onvadoncafficherla
valeurde tableau[0] , tableau[1] , tableau[2] et tableau[3] !
Attentionnepastenterd'afficherlavaleurde tableau[4] !Untableaude4casespossde
lesindices0,1,2et3,pointbarre.Sivoustentezd'afficher tableau[4] ,vousaurezsoit
https://openclassrooms.com/courses/apprenezaprogrammerenc/lestableaux2

4/8

21/12/2015

Lestableaux

n'importequoi,soitunebelleerreur,l'OScoupantvotreprogrammecarilauratentd'accder
uneadresseneluiappartenantpas.

Initialiseruntableau
Maintenantquel'onsaitparcouriruntableau,noussommescapablesd'initialisertoutessesvaleurs0
enfaisantuneboucle!
Bon,parcourirletableaupourmettre0chaquecase,c'estdevotreniveaumaintenant:
intmain(intargc,char*argv[])
{
inttableau[4],i=0;
//Initialisationdutableau
for(i=0;i<4;i++)
{
tableau[i]=0;
}
//Affichagedesesvaleurspourvrifier
for(i=0;i<4;i++)
{
printf("%d\n",tableau[i]);
}
return0;
}
0
0
0
0

Uneautrefaond'initialiser
Ilfautsavoirqu'ilexisteuneautrefaond'initialiseruntableauunpeuplusautomatiseenC.
Elleconsistecrire tableau[4]={valeur1,valeur2,valeur3,valeur4} .Enclair,vous
placezlesvaleursuneuneentreaccolades,sparespardesvirgules:
intmain(intargc,char*argv[])
{
inttableau[4]={0,0,0,0},i=0;
for(i=0;i<4;i++)
{
printf("%d\n",tableau[i]);
}
return0;
}
0
0
0
0

https://openclassrooms.com/courses/apprenezaprogrammerenc/lestableaux2

5/8

21/12/2015

Lestableaux

Maisenfait,c'estmmemieuxquea:vouspouvezdfinirlesvaleursdespremirescasesdu
tableau,toutescellesquevousn'aurezpasrenseignesserontautomatiquementmises0.
Ainsi,sijefais:
inttableau[4]={10,23};//Valeursinsres:10,23,0,0

lacasen0prendralavaleur10,lan1prendra23,ettouteslesautresprendrontlavaleur0(par
dfaut).
Commentinitialisertoutletableau0ensachanta?
Ehbienilvoussuffitd'initialiseraumoinslapremirevaleur0,ettouteslesautresvaleursnon
indiquesprendrontlavaleur0.
inttableau[4]={0};//Touteslescasesdutableauserontinitialises0

Cettetechniqueal'avantagedefonctionneravecuntableauden'importequelletaille(l,amarche
pour4cases,maiss'ilenavaiteu100aauraittbonaussi).
Attention,onrencontresouvent inttableau[4]={1}; ,cequiinsrelesvaleurssuivantes
:1,0,0,0.
Contrairementcequebeaucoupd'entrevoussemblentcroire,onn'initialisepastoutesles
cases1enfaisantcela:seulelapremirecasesera1,lesautresseront0.Onnepeut
doncpasinitialisertouteslescases1automatiquement,moinsdefaireuneboucle.

Passagedetableauxunefonction
Vousaurezcoupsrsouventbesoind'affichertoutlecontenudevotretableau.Pourquoinepas
crireunefonctionquifaita?avanouspermettrededcouvrircommentonenvoieuntableau
unefonction(cequim'arrange).
Ilvafalloirenvoyerdeuxinformationslafonction:letableau(enfin,l'adressedutableau)etaussiet
surtoutsataille!
Eneffet,notrefonctiondoittrecapabled'initialiseruntableauden'importequelletaille.Or,dansvotre
fonction,vousneconnaissezpaslatailledevotretableau.C'estpourcelaqu'ilfautenvoyerenplus
unevariablequevousappellerezparexemple tailleTableau .
Commejevousl'aidit, tableau peuttreconsidrcommeunpointeur.Onpeutdoncl'envoyerla
fonctioncommeonl'auraitfaitavecunvulgairepointeur:
//Prototypedelafonctiond'affichage
voidaffiche(int*tableau,inttailleTableau);

intmain(intargc,char*argv[])
{
inttableau[4]={10,15,3};

//Onaffichelecontenudutableau
affiche(tableau,4);

return0;
}

voidaffiche(int*tableau,inttailleTableau)
https://openclassrooms.com/courses/apprenezaprogrammerenc/lestableaux2

6/8

21/12/2015

Lestableaux

{
inti;

for(i=0;i<tailleTableau;i++)
{
printf("%d\n",tableau[i]);
}
}
10
15
3
0

Lafonctionn'estpasdiffrentedecellesquel'onatudiesdanslechapitresurlespointeurs.Elle
prendenparamtreunpointeursur int (notretableau),ainsiquelatailledutableau(trsimportant
poursavoirquands'arrterdanslaboucle!).
Toutlecontenudutableauestaffichparlafonctionviauneboucle.
Notezqu'ilexisteuneautrefaond'indiquerquelafonctionreoituntableau.Pluttqued'indiquerque
lafonctionattendun int*tableau ,mettezceci:
voidaffiche(inttableau[],inttailleTableau)

Celarevientexactementaumme,maislaprsencedescrochetspermetauprogrammeurdebienvoir
quec'estuntableauquelafonctionprend,etnonunsimplepointeur.Celapermetd'viterdes
confusions.
J'utilisepersonnellementtoutletempslescrochetsdansmesfonctionspourbienmontrerquela
fonctionattenduntableau.Jevousconseilledefairedemme.Iln'estpasncessairedemettrela
tailledutableauentrelescrochetscettefois.

Quelquesexercices!
Jenemanquepasd'idesd'exercicespourvousentraner!Jevousproposederaliserdesfonctions
travaillantsurdestableaux.
Jedonnejustelesnoncsdesexercicesicipourvousforcerrflchirvosfonctions.Sivousavez
dumalralisercesfonctions,rendezvoussurlesforumspourposervosquestions.
Exercice1
Crezunefonction sommeTableau quirenvoielasommedesvaleurscontenuesdansletableau
(utilisezun return pourrenvoyerlavaleur).Pourvousaider,voicileprototypedelafonctioncrer:
intsommeTableau(inttableau[],inttailleTableau);

Exercice2
Crezunefonction moyenneTableau quicalculeetrenvoielamoyennedesvaleurs.Prototype:
doublemoyenneTableau(inttableau[],inttailleTableau);

Lafonctionrenvoieun double carunemoyenneestsouventunnombredcimal.


https://openclassrooms.com/courses/apprenezaprogrammerenc/lestableaux2

7/8

21/12/2015

Lestableaux

Exercice3
Crezunefonction copierTableau quiprendenparamtredeuxtableaux.Lecontenudupremier
tableaudevratrecopidanslesecondtableau.
Prototype:
voidcopie(inttableauOriginal[],inttableauCopie[],inttailleTableau);

Exercice4
Crezunefonction maximumTableau quiaurapourrlederemettre0touteslescasesdutableau
ayantunevaleursuprieureunmaximum.Cettefonctionprendraenparamtresletableauainsique
lenombremaximumautoris( valeurMax ).Touteslescasesquicontiennentunnombresuprieur
valeurMax doiventtremises0.Prototype:
voidmaximumTableau(inttableau[],inttailleTableau,intvaleurMax);

Exercice5
Cetexerciceestplusdifficile.Crezunefonction ordonnerTableau quiclasselesvaleursd'un
tableaudansl'ordrecroissant.Ainsi,untableauquivaut {15,81,22,13} doitlafindelafonction
valoir {13,15,22,81} .
Prototype:
voidordonnerTableau(inttableau[],inttailleTableau);

Cetexerciceestdoncunpeuplusdifficilequelesautres,maistoutfaitralisable.avavousoccuper
unpetitmoment.
Faitesvousunpetitfichierdefonctionsappel tableaux.c (avecson
homologue tableaux.h quicontiendralesprototypes,biensr!)contenanttoutesles
fonctionsdevotrecruralisantdesoprationssurdestableaux.
Autravail!:)

Enrsum
Lestableauxsontdesensemblesdevariablesdummetypestockesctecteenmmoire.
Latailled'untableaudoittredtermineavantlacompilation,ellenepeutpasdpendred'une
variable.
Chaquecased'untableaudetype int contientunevariabledetype int .
Lescasessontnumrotesviadesindicescommenant0
: tableau[0] , tableau[1] , tableau[2] ,etc.

https://openclassrooms.com/courses/apprenezaprogrammerenc/lestableaux2

8/8