Documente Academic
Documente Profesional
Documente Cultură
Lesfonctions
LESFONCTIONS
NoustermineronslapartieIducours(Lesbases)parcettenotionfondamentalequesontles
fonctionsenlangageC.TouslesprogrammesenCsebasentsurleprincipequejevaisvousexpliquer
danscechapitre.
Nousallonsapprendrestructurernosprogrammesenpetitsboutsunpeucommesionjouaitaux
Legos.
TouslesgrosprogrammesenCsontenfaitdesassemblagesdepetitsboutsdecode,etcespetits
boutsdecodesontjustementcequ'onappelledesfonctions!
Creretappelerunefonction
Nousavonsvudanslestoutpremierschapitresqu'unprogrammeenCcommenaitparunefonction
appele main .
Jevousavaismmefaitunschmarcapitulatif,pourvousrappelerquelquesmotsdevocabulaire(fig.
suivante).
Enhaut,onytrouvelesdirectivesdeprprocesseur(unnombarbaresurlequelonreviendra
d'ailleurs).Cesdirectivessontfacilesidentifier:ellescommencentparun # etsontgnralement
misestoutenhautdesfichierssources.
Puisendessous,ilyavaitcequej'avaisdjappelunefonction.Ici,surmonschma,vousvoyez
unefonction main (pastropremplieilfautlereconnatre).
Jevousavaisditqu'unprogrammeenlangageCcommenaitparlafonction main .Jevousrassure,
c'esttoujoursvrai!Seulement,jusqu'icinoussommesrestsl'intrieurdelafonction main .Nous
n'ensommesjamaissortis.Revoyezvoscodessourcesetvousverrez:noussommestoujoursrests
l'intrieurdesaccoladesdelafonction main .
Ehbien,c'estmald'avoirfaitcommea?
Noncen'estpasmal,maiscen'estpascequelesprogrammeursenCfontdanslaralit.
Quasimentaucunprogrammen'estcrituniquementl'intrieurdesaccoladesdelafonction main .
Jusqu'icinosprogrammestaientcourts,doncaneposaitpasdegrosproblmes,maisimaginezdes
plusgrosprogrammesquifontdesmilliersdelignesdecode!Sitouttaitconcentrdansla
fonction main ,bonjourlebazar
https://openclassrooms.com/courses/apprenezaprogrammerenc/lesfonctions1
1/12
21/12/2015
Lesfonctions
Nousallonsdoncmaintenantapprendrenousorganiser.Nousallonsenfaitdcoupernos
programmesenpetitsbouts(souvenezvousdel'imagedesLegosquejevousaidonnetout
l'heure).Chaquepetitboutdeprogrammeseracequ'onappelleunefonction.
Unefonctionexcutedesactionsetrenvoieunrsultat.C'estunmorceaudecodequisertfaire
quelquechosedeprcis.
Onditqu'unefonctionpossdeuneentreetunesortie.Lafig.suivantereprsenteunefonction
schmatiquement.
Lorsqu'onappelleunefonction,ilyatroistapes.
1. L'entre:onfaitrentrerdesinformationsdanslafonction(enluidonnantdesinformations
aveclesquellestravailler).
2. Lescalculs:grceauxinformationsqu'elleareuesenentre,lafonctiontravaille.
3. Lasortie:unefoisqu'elleafinisescalculs,lafonctionrenvoieunrsultat.C'estcequ'onappelle
lasortie,ouencoreleretour.
Concrtement,onpeutimaginerparexempleunefonctionappele triple quicalculeletripledu
nombrequ'onluidonne,enlemultipliantpar3(fig.suivante).Bienentendu,lesfonctionsseronten
gnralpluscompliques.
Lebutdesfonctionsestdoncdesimplifierlecodesource,pournepasavoirretaperlemmecode
plusieursfoisd'affile.
Rvezunpeu:plustard,nouscreronsparexempleunefonction afficherFenetre quiouvriraune
fentrel'cran.Unefoislafonctioncrite(c'estl'tapelaplusdifficile),onn'auraplusqu'direHep
!toilafonction afficherFenetre ,ouvremoiunefentre!.Onpourraaussicrireune
fonction deplacerPersonnage dontlebutseradedplacerlepersonnaged'unjeul'cran,etc.
Schmad'unefonction
Vousavezdjeuunaperudelafaondontestfaiteunefonctionaveclafonction main .
Cependantpourbienquevouscompreniezilvafalloirquejevousmontrequandmmecommenton
construitunefonction.
Lecodesuivantreprsenteunefonctionschmatiquement.C'estunmodleconnatre:
https://openclassrooms.com/courses/apprenezaprogrammerenc/lesfonctions1
2/12
21/12/2015
Lesfonctions
typenomFonction(parametres)
{
//Insrezvosinstructionsici
}
Vousreconnaissezlaformedelafonction main .
Voicicequ'ilfautsavoirsurceschma.
type (correspondlasortie):c'estletypedelafonction.Commelesvariables,les
fonctionsontuntype.Cetypedpenddursultatquelafonctionrenvoie:silafonction
renvoieunnombredcimal,vousmettrezsrement double ,siellerenvoieunentier
vousmettrez int ou long parexemple.Maisilestaussipossibledecrerdesfonctions
quinerenvoientrien!
Ilyadoncdeuxsortesdefonctions:
lesfonctionsquirenvoientunevaleur:onleurmetundestypesquel'onconnat
( char , int , double ,etc.)
lesfonctionsquinerenvoientpasdevaleur:onleurmetuntypespcial void (qui
signifievide).
nomFonction :c'estlenomdevotrefonction.Vouspouvezappelervotrefonction
commevousvoulez,dutempsquevousrespectezlesmmesrglesquepourles
variables(pasd'accents,pasd'espaces,etc.).
parametres (correspondl'entre):entreparenthses,vouspouvezenvoyerdes
paramtreslafonction.Cesontdesvaleursaveclesquelleslafonctionvatravailler.
Vouspouvezenvoyerautantdeparamtresquevouslevoulez.Vouspouvezaussi
n'envoyeraucunparamtrelafonction,maisasefaitplusrarement.
Parexemple,pourunefonction triple ,vousenvoyezunnombreenparamtre.Lafonction
rcuprecenombreetencalculeletriple,enlemultipliantpar3.Ellerenvoieensuitelersultatde
sescalculs.
Ensuitevousavezlesaccoladesquiindiquentledbutetlafindelafonction.l'intrieurdeces
accoladesvousmettrezlesinstructionsquevousvoulez.Pourlafonction triple ,ilfaudra
taperdesinstructionsquimultiplientpar3lenombrereuenentre.
Unefonction,c'estdoncunmcanismequireoitdesvaleursenentre(lesparamtres)etquirenvoie
unrsultatensortie.
Crerunefonction
Voyonsunexemplepratiquesansplustarder:lafameusefonction triple dontjevousparledepuis
toutl'heure.Onvadirequecettefonctionreoitunnombreentierdetype int etqu'ellerenvoieun
nombreentieraussidetype int .Cettefonctioncalculeletripledunombrequ'onluidonne:
https://openclassrooms.com/courses/apprenezaprogrammerenc/lesfonctions1
3/12
21/12/2015
Lesfonctions
inttriple(intnombre)
{
intresultat=0;
resultat=3*nombre;//Onmultiplielenombrefournipar3
returnresultat;//Onretournelavariableresultatquivautletripledenombre
}
Voilnotrepremirefonction!Unepremirechoseimportante:commevouslevoyez,lafonctionest
detype int .Elledoitdoncrenvoyerunevaleurdetype int .
Entrelesparenthses,vousavezlesvariablesquelafonctionreoit.Ici,notrefonction triple reoit
unevariabledetype int appele nombre .
Lalignequidonnepourconsignederenvoyerunevaleurestcellequicontientle return .Cette
lignesetrouvegnralementlafindelafonction,aprslescalculs.
returnresultat;
Cettefonctionfaitexactementlammechosequelafonctiondetoutl'heure,elleestjusteplusrapide
crire.Gnralement,vosfonctionscontiendrontplusieursvariablespoureffectuerleurscalculset
leursoprations,raresserontlesfonctionsaussicourtesque triple .
Plusieursparamtres,aucunparamtre
Plusieursparamtres
Notrefonction triple contientunparamtre,maisilestpossibledecrerdesfonctionsacceptant
plusieursparamtres.
Parexemple,unefonction addition quiadditionnedeuxnombres a et b :
intaddition(inta,intb)
{
returna+b;
}
Ilsuffitdesparerlesdiffrentsparamtresparunevirgulecommevouslevoyez.
Aucunparamtre
Certainesfonctions,plusrares,neprennentaucunparamtreenentre.Cesfonctionsferont
https://openclassrooms.com/courses/apprenezaprogrammerenc/lesfonctions1
4/12
21/12/2015
Lesfonctions
gnralementtoujourslammechose.Eneffet,siellesn'ontpasdenombressurlesquelstravailler,
vosfonctionsservirontjusteeffectuercertainesactions,commeafficherdutextel'cran.Etencore,
ceseraforcmenttoujourslemmetextepuisquelafonctionnereoitaucunparamtresusceptiblede
modifiersoncomportement!
Imaginonsunefonction bonjour quiaffichejusteBonjourl'cran:
voidbonjour()
{
printf("Bonjour");
}
Jen'airienmisentreparenthsescarlafonctionneprendaucunparamtre.
Deplus,j'aiutilisletype void dontjevousaiparlplushaut.
Eneffet,commevouslevoyezmafonctionn'apasnonplusde return .Elleneretournerien.Une
fonctionquineretournerienestdetype void .
Appelerunefonction
Onvamaintenanttesteruncodesourcepours'entranerunpeuaveccequ'onvientd'apprendre.
Nousallonsutilisernotrefonction triple (dcidmentjel'aimebien)pourcalculerletripled'un
nombre.
Pourlemoment,jevousdemanded'crirelafonction triple AVANTlafonction main .Sivousla
placezaprs,anemarcherapas.Jevousexpliqueraipourquoiparlasuite.
Voiciuncodetesteretcomprendre:
#include<stdio.h>
#include<stdlib.h>
inttriple(intnombre)
{
return3*nombre;
}
intmain(intargc,char*argv[])
{
intnombreEntre=0,nombreTriple=0;
printf("Entrezunnombre...");
scanf("%d",&nombreEntre);
nombreTriple=triple(nombreEntre);
printf("Letripledecenombreest%d\n",nombreTriple);
return0;
}
5/12
21/12/2015
Lesfonctions
ellevatravailler.
Cettefonctionrenvoieunevaleur,valeurqu'onrcupredanslavariable nombreTriple .Onordonne
doncl'ordinateurdanscetteligne:Demandelafonction triple demecalculerletriple
de nombreEntre ,etstockelersultatdanslavariable nombreTriple .
Lesmmesexplicationssousformedeschma
Vousavezencoredumalcomprendrecommentafonctionneconcrtement?
Pasdepanique!Jesuissrquevousallezcomprendreavecmesschmas.
Cecodeparticulirementcommentvousindiquedansquelordrelecodeestlu.Commencezdoncpar
lirelalignenumrote1,puis2,puis3(bonvousavezcomprisjecrois!):
#include<stdio.h>
#include<stdlib.h>
inttriple(intnombre)//6
{
return3*nombre;//7
}
intmain(intargc,char*argv[])//1
{
intnombreEntre=0,nombreTriple=0;//2
printf("Entrezunnombre...");//3
scanf("%d",&nombreEntre);//4
nombreTriple=triple(nombreEntre);//5
printf("Letripledecenombreest%d\n",nombreTriple);//8
return0;//9
}
Voicicequisepasse,ligneparligne.
1. Leprogrammecommenceparlafonction main .
2. Illitlesinstructionsdanslafonctionuneparunedansl'ordre.
3. Illitl'instructionsuivanteetfaitcequiestdemand( printf ).
4. Demme,illitl'instructionetfaitcequiestdemand( scanf ).
5. Illitl'instructionAh!Onappellelafonction triple ,ondoitdoncsauterlalignedela
fonction triple plushaut.
6. Onsautelafonction triple etonrcupreunparamtre( nombre ).
7. Onfaitdescalculssurlenombreetonterminelafonction. return signifielafindelafonction
etpermetd'indiquerlersultatrenvoyer.
8. Onretournedansle main l'instructionsuivante.
9. Un return !Lafonctionmainsetermineetdoncleprogrammeesttermin.
https://openclassrooms.com/courses/apprenezaprogrammerenc/lesfonctions1
6/12
21/12/2015
Lesfonctions
Sivousavezcomprisdansquelordrel'ordinateurlitlesinstructions,vousavezdjcomprisle
principal.Maintenant,ilfautbiencomprendrequ'unefonctionreoitdesparamtresenentreet
renvoieunevaleurensortie(fig.suivante).
Note:cen'estpaslecasdetouteslesfonctions.Parfois,unefonctionneprendaucunparamtreen
entre,ouaucontraireelleenprendplusieurs(jevousaiexpliquaunpeuplushaut).
Demme,parfoisunefonctionrenvoieunevaleur,parfoisellenerenvoierien(danscecasiln'yapas
de return ).
Testonsceprogramme
Voiciunexempled'utilisationduprogramme:
Entrezunnombre...10
Letripledecenombreest30
Vousn'tespasobligsdestockerlersultatd'unefonctiondansunevariable!Vouspouvez
directementenvoyerlersultatdelafonctiontripleuneautrefonction,comme
si triple(nombreEntre) taitunevariable.
Regardezbienceci,c'estlemmecodemaisilyaunchangementauniveaududernier printf .De
plus,onn'apasdclardevariable nombreTriple caronnes'ensertplus:
#include<stdio.h>
#include<stdlib.h>
inttriple(intnombre)
{
return3*nombre;
}
intmain(intargc,char*argv[])
{
intnombreEntre=0;
printf("Entrezunnombre...");
scanf("%d",&nombreEntre);
https://openclassrooms.com/courses/apprenezaprogrammerenc/lesfonctions1
7/12
21/12/2015
Lesfonctions
//Lersultatdelafonctionestdirectementenvoyauprintfetn'estpasstockdans
unevariable
printf("Letripledecenombreest%d\n",triple(nombreEntre));
return0;
}
Desexemplespourbiencomprendre
Vousavezdvousenrendrecompte:jesuisunmaniaquedesexemples.
Lathoriec'estbien,maissionnefaitqueaonrisquedenepasretenirgrandchoseetsurtoutne
pascomprendrecomments'enservir,cequiseraitunpeudommage
Jevaisdoncmaintenantvousmontrerplusieursexemplesd'utilisationdefonctions,pourquevousayez
uneidedeleurintrt.Jevaism'efforcerdefairedescasdiffrentschaquefois,pourquevous
puissiezavoirdesexemplesdetouslestypesdefonctionsquipeuventexister.
Jenevousapprendrairiendenouveau,maisceseral'occasiondevoirdesexemplespratiques.Si
vousavezdjcompristoutcequej'aiexpliquavant,c'esttrsbienetnormalementaucundes
exemplesquivontsuivrenedevraitvoussurprendre.
Conversioneuros/francs
Oncommenceparunefonctiontrssimilaire triple ,quiaquandmmeunminimumd'intrt
cettefois:unefonctionquiconvertitleseurosenfrancs.Pourceuxd'entrevousquineconnatraient
pascesmonnaiessachezque1euro=6,55957francs.
Onvacrerunefonctionappele conversion .
Cettefonctionprendunevariableenentredetype double etretourneunesortiede
type double caronvaforcmentmanipulerdesnombresdcimaux.Lisezlaattentivement:
https://openclassrooms.com/courses/apprenezaprogrammerenc/lesfonctions1
8/12
21/12/2015
Lesfonctions
doubleconversion(doubleeuros)
{
doublefrancs=0;
francs=6.55957*euros;
returnfrancs;
}
intmain(intargc,char*argv[])
{
printf("10euros=%fF\n",conversion(10));
printf("50euros=%fF\n",conversion(50));
printf("100euros=%fF\n",conversion(100));
printf("200euros=%fF\n",conversion(200));
return0;
}
10euros=65.595700F
50euros=327.978500F
100euros=655.957000F
200euros=1311.914000F
Lapunition
Onvamaintenants'intresserunefonctionquinerenvoierien(pasdesortie).
C'estunefonctionquiaffichelemmemessagel'cranautantdefoisqu'onluidemande.Cette
fonctionprendunparamtreenentre:lenombredefoisoilfautafficherlapunition.
voidpunition(intnombreDeLignes)
{
inti;
for(i=0;i<nombreDeLignes;i++)
{
printf("Jenedoispasrecopiermonvoisin\n");
}
}
intmain(intargc,char*argv[])
{
punition(10);
return0;
}
https://openclassrooms.com/courses/apprenezaprogrammerenc/lesfonctions1
9/12
21/12/2015
Lesfonctions
Jenedoispasrecopiermonvoisin
Jenedoispasrecopiermonvoisin
Jenedoispasrecopiermonvoisin
Jenedoispasrecopiermonvoisin
Jenedoispasrecopiermonvoisin
Jenedoispasrecopiermonvoisin
Jenedoispasrecopiermonvoisin
Jenedoispasrecopiermonvoisin
Jenedoispasrecopiermonvoisin
Jenedoispasrecopiermonvoisin
Onaiciaffaireunefonctionquinerenvoieaucunevaleur.Cettefonctionsecontentejusted'effectuer
desactions(ici,elleaffichedesmessagesl'cran).
Unefonctionquinerenvoieaucunevaleurestdetype void ,c'estpourcelaqu'onacrit void .
parta,iln'yariendebiendiffrent.
Ilauraittbienplusintressantdecrerunefonction punition quis'adapten'importequelle
sanction.Onluiauraitenvoydeuxparamtres:letexterpteretlenombredefoisqu'ildoittre
rpt.Leproblme,c'estqu'onnesaitpasencoregrerletexteenC(aucasovousn'auriezpasvu,
jevousrappellequ'onn'afaitquemanipulerdesvariablescontenantdesnombresdepuisledbutdu
cours!).D'ailleurscesujet,jevousannoncequenousnetarderonspasapprendreutiliserdes
variablesquiretiennentdutexte.C'estpluscompliququ'iln'yparatetonnepouvaitpasl'apprendre
dsledbutducours!
Aired'unrectangle
L'aired'unrectangleestfacilecalculer: largeur*hauteur .
Notrefonctionnomme aireRectangle vaprendredeuxparamtres:lalargeuretlahauteur.Elle
renverral'aire.
doubleaireRectangle(doublelargeur,doublehauteur)
{
returnlargeur*hauteur;
}
intmain(intargc,char*argv[])
{
printf("Rectangledelargeur5ethauteur10.Aire=%f\n",aireRectangle(5,10));
printf("Rectangledelargeur2.5ethauteur3.5.Aire=%f\n",aireRectangle(2.5,3.5));
printf("Rectangledelargeur4.2ethauteur9.7.Aire=%f\n",aireRectangle(4.2,9.7));
return0;
}
Rectangledelargeur5ethauteur10.Aire=50.000000
Rectangledelargeur2.5ethauteur3.5.Aire=8.750000
Rectangledelargeur4.2ethauteur9.7.Aire=40.740000
Pourraitonafficherdirectementlalargeur,lahauteuretl'airedanslafonction?
Biensr!
https://openclassrooms.com/courses/apprenezaprogrammerenc/lesfonctions1
10/12
21/12/2015
Lesfonctions
Danscecas,lafonctionnerenverraitplusrien,ellesecontenteraitdecalculerl'aireetdel'afficher
immdiatement.
voidaireRectangle(doublelargeur,doublehauteur)
{
doubleaire=0;
aire=largeur*hauteur;
printf("Rectangledelargeur%fethauteur%f.Aire=%f\n",largeur,hauteur,aire);
}
intmain(intargc,char*argv[])
{
aireRectangle(5,10);
aireRectangle(2.5,3.5);
aireRectangle(4.2,9.7);
return0;
}
Unmenu
Cecodeestplusintressantetconcret.Oncreunefonction menu() quineprendaucunparamtre
enentre.Cettefonctionsecontented'afficherlemenuetdemandel'utilisateurdefaireunchoix.La
fonctionrenvoielechoixdel'utilisateur.
intmenu()
{
intchoix=0;
while(choix<1||choix>4)
{
printf("Menu:\n");
printf("1:Pouletdedindeauxescargotsrotisalasaucebearnaise\n");
printf("2:Concombressucresalasaucedemyrtillesenrobeedechocolat\n");
printf("3:Escalopedekangourousaignanteetsageleeauxfraisespoivree\n");
printf("4:LasurpriseduChef(j'ensalived'avance...)\n");
printf("Votrechoix?");
scanf("%d",&choix);
}
returnchoix;
}
intmain(intargc,char*argv[])
{
switch(menu())
{
case1:
printf("Vousavezprislepoulet\n");
break;
case2:
printf("Vousavezprislesconcombres\n");
break;
case3:
printf("Vousavezprisl'escalope\n");
break;
case4:
printf("VousavezprislasurpriseduChef.Vousetesunsacreaventurierdites
donc!\n");
break;
}
https://openclassrooms.com/courses/apprenezaprogrammerenc/lesfonctions1
11/12
21/12/2015
Lesfonctions
return0;
}
J'enaiprofitpouramliorerlemenu(parrapportcequ'onfaisaithabituellement):la
fonction menu affichenouveaulemenutantquel'utilisateurn'apasentrunnombrecomprisentre
1et4.Commea,aucunrisquequelafonctionrenvoieunnombrequinefigurepasaumenu!
Dansle main ,vousavezvuqu'onfaitun switch(menu()) .Unefoisquelafonction menu() est
termine,ellerenvoielechoixdel'utilisateurdirectementdansle switch .C'estunemthoderapide
etpratique.
vousdejouer!Lecodeestencoreamliorable:onpourraitafficherunmessaged'erreursi
l'utilisateurentreunmauvaisnombrepluttquedesimplementafficherunenouvellefoislemenu.
Enrsum
Lesfonctionss'appellententreelles.Ainsi,le main peutappelerdesfonctionstoutesprtes
tellesque printf ou scanf ,maisaussidesfonctionsquenousavonscres.
Unefonctionrcupreenentredesvariablesqu'onappelleparamtres.
Elleeffectuecertainesoprationsaveccesparamtrespuisretourneengnralunevaleur
l'aidedel'instruction return .
https://openclassrooms.com/courses/apprenezaprogrammerenc/lesfonctions1
12/12