Langage C - C language fst settat

  • Published on
    11-Jun-2015

  • View
    444

  • Download
    1

Transcript

UNIVERSITE HASSAN 1ER FACULTE DES SCIENCES ET TECHNIQUES DE SETTAT DEPARTEMENT DE MATHEMATIQUES ET INFORMATIQUE Introduction au cours dalgorithmique et progra mmation Introduction au cours dalgorithmique et programmation Introduction la programmation en Langage C Fait par : Sofia DOUDA Anne 2007/2008 Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 1 Dfinition UnalgorithmeestunenoncedansunlangagebiendeIinid'unesuited'operationspermettantde resoudreparcalculunproblemedonne.Sicesoperationss'executentensequence.onparle d'algorithme sequentiel. Si les operations s'executent sur plusieurs processeurs en parallele. on parle d'algorithme parallele. Si les tches s'executent sur un reseau de processeurs on parle d'algorithme reparti ou distribue. La mise au point d'un programme inIormatique se Iait en plusieurs etapes. Ils'agitdeIournirlasolutionaunprobleme.lapremiereetapeconsistedoncaanalyserle probleme. c'est-a-dire en cerner les limites et le mettre en Iorme dans un langage descriptiI. on parle generalementd'analysepourdecrireleprocessusparlequelleproblemeestIormalise.Lelangage dedescriptionutilisepourecrireleresultatdel'analyseestappelealgorithme.L'etapesuivante consiste a traduire l'algorithme dans un langagede programmation speciIique. il s'agit de la phase de programmation.Lelangagedeprogrammationestl'intermediaireentrel'humainetlamachine.ilpermetd'ecrire dans un langage proche de la machine mais intelligible par l'humain les operations que l'ordinateur doit eIIectuer. Ainsi. etant donne que le langage de programmation est destine a l'ordinateur. il doit donc respecter une syntaxe stricte. Un algorithme peut touteIois aboutir a plusieurs programmes.Le programme est ensuite transIorme en langage machine lors d'une etape appelee compilation. La compilationestunephaserealiseeparl'ordinateurlui-mmegrceaunautreprogrammeappele compilateur.Laphasesuivantes'appellel'editiondeliens.elleconsistealierleprogrammeavectousles elements externes (generalement des librairies auxquelles il Iait reIerence).Caracteristiques d'un algorithme L'algorithme est un moyen pour le programmeur de presenter son approche du probleme a d'autres personnes. En eIIet. un algorithme est l'enonce dans un langage bien deIini d'une suite d'operations permettant de repondre au probleme. Un algorithme doit donc tre :lisible: l'algorithme doit tre comprehensible mme par un non-inIormaticienPr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 2 dehautniveau:l'algorithmedoitpouvoirtretraduitenn'importequellangagede programmation.ilnedoitdoncpasIaireappeladesnotionstechniquesrelativesaun programme particulier ou bien a un systeme d'exploitation donneprecis: chaque element de l'algorithme ne doit pas porter a conIusion. il est donc important de lever toute ambiguteconcis:unalgorithmenedoitpasdepasserunepage.Sic'estlecas.ilIautdecomposerle probleme en plusieurs sous-problemesstructure: un algorithme doit tre compose de diIIerentes parties Iacilement identiIiablesProgramme informatique UnprogrammeinIormatique.souventnommelogiciel.estcomposed`uneseried'instructions elementairesexecuteesparl'ordinateur.Lorsdelacreationd`unprogramme.ilestnecessaired`y inclure les instructions correspondant a la tche que vous souhaitez voir accomplie par l`ordinateur. LeprocessusconsistantadeIinirlesinstructionsdevanttreexecuteesparl`ordinateursenomme programmation.Lesinstructionscontenuesdansunprogrammesontgeneralementenregistrees sous Iorme d`un Iichier texte ASCII. pourvu. par exemple. de l`extension .C pour un programme C et .CPP pour un programme C. Les instructions d`un programme sont deIinies suivant des regles precises. celles d`un langage de programmation. C et C ne sont que deux exemples de langages parmi d`autres. tels que BASIC. Pascal et FORTRAN. Chaque langage de programmation oIIre es caracteristiquesuniquesetpossedesespropresIorcesetIaiblesses.Neanmoins.danstouslescas. unlangagedeprogrammationsertadeIiniruneseried`instructionsdevanttreexecuteesparun ordinateur. LesinstructionsexecuteesparunordinateursepresententpourluicommeunesuitedechiIIres binaires. 1 et 0.correspondant au passage ou non d`un signal electrique dans un composant. Dans les annees 40 et 50. les programmeurs devaient comprendre toutes les combinaisons de 1 et 0 : tous lesprogrammesetaientecrisdanscelangageditbinaire.Latailledesprogrammescroissant regulierement.cettemethodedevintrapidementpeupratique.LarechercheinIormatiquedonna alorsnaissanceadeslangagesdeprogrammation.permettantauxindividusdesaisirleurs instructions sous une Iorme plus comprehensible par un humain. Ces instructions. placees dans un Iichier texte nomme Iichier source. sont transmises a un second programme. appele compilateur. Le compilateurtransIormelesinstructionsdulangagedeprogrammationenlasuitede0et1 comprehensibles par l`ordinateur. le code machine.La Iacon d'ecrire un programme est intimement liee au langage de programmation que l'on a choisi carilenexisteenormement.Deplus.lecompilateurdevracorrespondreaulangagechoisi:a chaque langage de programmation son compilateur (exception Iaite des langages interpretes).D'une Iacon generale. le programme est un simple Iichier texte (ecrit avec un traitement de texte ou un editeur de texte). que l'on appelle Iichier source.Le Iichier source contient les lignes de programmes que l'on appelle code source. Ce Iichier source une Iois termine doit tre compile. La compilation se deroule en deux etapes:le compilateur transIorme le code source en code obiet. et le sauvegarde dans un Iichier obiet. c'est-a-dire qu'il traduit le Iichier source en langage machine (certains compilateurs creent aussi un Iichierenassembleur.unlangageprochedulangagemachinecarpossedantdesIonctionstres simples. mais lisibles)lecompilateurIaitensuiteappelaunediteurdeliens(enanglaislinkeroubinder)quipermet d'integrerdansleIichierIinaltousleselementsannexes(Ionctionsoulibrairies)auquelle programmeIaitreIerencemaisquinesontpasstockesdansleIichiersource.Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 3 PuisilcreeunIichierexecutablequicontienttoutcedontilabesoinpourIonctionnerdeIacon autonome.(souslessystemesd'exploitationMicrosoItWindowsouMS-DosleIichierainsicree possede l'extension .exe)L'allured'unprogrammedependdutypedelangageutilisepourIaireleprogramme.TouteIois.a peuprestousleslangagesdeprogrammationsontbasessurlemmeprincipe:Le programme est constitue d'une suite d'instructions que la machine doit executer. Celle-ci execute lesinstructionsauIuretamesurequ'ellelitleIichier(doncdehautenbas)iusqu'acequ'elle rencontreuneinstruction(appeleeparIoisinstructiondebranchement)quiluiindiqued'allerun endroit precis du programme. Il s'agit donc d'une sorte de ieu de piste dans lequel la machine doit suivre le Iil conducteur et executer les instructions qu'elle rencontre iusqu'a ce qu'elle arrive a la Iin du programme et celui-ci s'arrte. Langage Informatique Un langage inIormatique estun langage destine a decrire l'ensemble des actions consecutives qu'un ordinateurdoitexecuter.Leslangagesnaturels(parexemplel'anglaisouleIrancais)representent l'ensemble des possibilites d'expression partage par un groupe d'individus. Un langage inIormatique est une Iacon pratique pour donner des instructions a un ordinateur.Un langage inIormatique est rigoureux: a chaque instruction correspond une action du processeur. Le langage utilise par le processeur est appele langage machine. Il s'agit d'une suite de 0 et de 1 (du binaire)maispourplusdeclarteilpeuttredecritenhexadecimal.TouteIoislelangagemachine n'estpascomprehensibleIacilementparl'humainmoyen.Ainsi.ilestpluspratiquedetrouverun langageintermediaire.comprehensibleparl'homme.quiseraensuitetransIormeenlangage machine pour tre exploitable par le processeur.

L'assembleur est le premier langage inIormatique qui ait ete utilise. Celui-ci est encore tres proche dulangagemachinemaisilpermetdeiad'trepluscomprehensible.TouteIoisuntellangageest tellement proche du langage machine qu'il depend etroitement du type de processeur utilise (chaque typedeprocesseurpeutavoirsonproprelangagemachine).Ainsiunprogrammedeveloppepour unemachinenepourrapastreportesurunautretypedemachine(ondesigneparleterme "portable"unprogrammequipeuttreutilisesurungrandnombredemachines).Pourpouvoir l'utiliser sur une autre machine il Iaudra alors parIois reecrire entierement le programme. Un langage inIormatique a donc plusieurs avantages:il est plus Iacilement comprehensible que le langage machineilpermetuneplusgrandeportabilite.c'est-a-direuneplusgrandeIacilited'adaptationsurdes machines de types diIIerentsLeslangagesinIormatiquespeuventgrossierementseclasserendeuxcategories:leslangages interpretes et les langages compiles. Langage interprt UnlangageinIormatiqueestpardeIinitiondiIIerentdulangagemachine.IlIautdoncletraduire pourlerendreintelligibledupointdevueduprocesseur.Unprogrammeecritdansunlangage Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 4 interpreteabesoind'unprogrammeauxiliaire(l'interpreteur)pourtraduireauIuretamesureles instructions du programme. Langage compil UnprogrammeecritdansunlangageditcompilevatretraduituneIoispourtoutesparun programme annexe (le compilateur) aIin de generer un nouveau Iichier qui sera autonome. c'est-a-direquin'auraplusbesoind'unprogrammeautrequeluipours'executer(onditd'ailleursquece Iichier est executable). Un programme ecrit dans un langage compile a comme avantage de ne plus avoir besoin. une Iois compile.deprogrammeannexepours'executer.Deplus.latraductionetantIaiteuneIoispour toute. il est plus rapide a l'execution. TouteIois il est moins souple qu'un programme ecrit avec un langageinterpretecarachaquemodiIicationduIichiersource(Iichierintelligibleparl'homme: celuiquivatrecompile)ilIaudrarecompilerleprogrammepourquelesmodiIicationsprennent eIIet.

D'autrepart.unprogrammecompileapouravantagedegarantirlasecuriteducodesource.En eIIet.unlangageinterprete.etantdirectementintelligible(lisible).permetan'importequide connatre les secrets de Iabrication d'un programme et donc de copier le code voire de le modiIier. Ily a donc risque de non-respect des droits d'auteur. D'autre part. certaines applications securisees necessitentlaconIidentialiteducodepoureviterlepiratage(transactionbancaire.paiementen ligne. communications securisees. ...). Langages intermdiaires Certains langages appartiennent en quelque sorte aux deux categories (LISP. Java. Python. ..) car le programmeecritavecceslangagespeutdanscertainesconditionssubirunephasedecompilation intermediaireversunIichierecritdansunlangagequin'estpasintelligible(doncdiIIerentdu Iichier source) et non executable (necessite d'un interpreteur). Les applets Java. petits programmes inseresparIoisdanslespagesWeb.sontdesIichiersquisontcompilesmaisquel'onnepeut executer qu'a partir d'un navigateur internet (ce sont des Iichiers dont l'extension est .class). Quelques exemples de langages couramment utiliss Voici une liste non exhaustive de langages inIormatiques existants : LangageDomaine d'application principalCompil/interprt ADALe temps reellangage compile BASICComme son nom l'indique...langage interprete CProgrammation systemelangage compile CProgrammation systeme obietlangage compile CobolGestionlangage compile FortranCalcullangage compile Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 5 JavaProgrammation orientee internetlangage intermediaire MATLABCalcul mathematiquelangage interprete MathematicaCalcul mathematiquelangage interprete LISPIntelligence artiIiciellelangage intermediaire PascalEnseignementlangage compile PrologIntelligence artiIiciellelangage interprete PerlTraitement de chanes de caractereslangage interprete Structuration des donnes et des instructions Il est necessaire dans un programme de structurer les donnees et les instructions ; ainsi les langages de programmation ont ete inventes dans le sens de permettre cette structuration. - Structure de donnees : c`est cours tout entier traitant les diIIerentes structures de donnees utilisees dans la programmation. - Structures d`instructions :1. La sequence : est un groupe d`instructions executees l`une apres l`autre. 2. La structure de choix ou de la decision : permet une action de programme d`tre inIluence par les donnees. Exemple : si x~0 alors y x sinon y x 3.Lastructuredelarepetition :Elleestutiliseepourexecuteruneouunesuited`instructions plusieurs Iois. les instructions seront les mmes a chaque execution alors que les donnees pourront changees. Exemple : x10 Tant que x 0 Iaire x x - 1 4.LaprocedureouIonction :permetderemplacerungrouped`instructionsparunnomqui l`identiIie. elle donne aux programmes une structure modulaire. ce qui permet l`ecriture plus Iacile et plus dense. La notion de variable Danslaplupartdeslangages.ontravaillegeneralementsurdesvariables.c'est-a-direquel'on associe a un nom un contenu. On pourra ainsi appeler une variable "T" et y stocker le chiIIre 8. Type de donnes Certainslangagesacceptentquel'onassocieaunnomdevariablen'importequeltypededonnee (c'est-a-dire aussi bien un nombre entier qu'un caractere). on appelle ces langages des langages non types.EnIait.letypededonneeconditionnelenombred'octetssurlaquelleladonneeestcodee. c'est-a-direl'occupationenmemoiredecettedonneeainsiqueleIormatdanslequelelleest representee. C'estlaraisonpourlaquelleleslangagesevolues(LeC.leJava)sontdeslangagestypes.cela signiIiequ'aunevariableestassocienonseulementunnommaisaussiuntypededonneequ'il Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 6 Iaudrapreciserlorsquel'ondeclareralavariable.c'est-a-direquelorsquel'onecriralenomdela variable pour la premiere Iois il Iaudra preciserau compilateur quelle sorte de donnees celle-ci va pouvoir contenir (la Iacon de declarer la variable dependra du langage). Syntaxe Lasyntaxed`unprogrammeestsaIormed`ecriture.ilesttresimportantevuqu`unsimple changement de la Iorme pourra echanger le sens ou mme la rendre sans sens. Leslangagesdemandentunesyntaxerigoureuse.onnepeutdoncpasecrireleschosesdela maniere dont on le souhaite.Ainsi.certainslangagessontcasesensitive(enIrancais"sensiblesalacasse").celasigniIiequ'un nomnecomportantquedesminusculesneserapasconsiderecommeequivalentaummenom comprenantdesmaiuscules.Ainsilavariablenommee"T"seraunevariablediIIerentedela variable "t".Les noms de variables admettent generalement une longueur maximale (qui depend du langage) et un ieu de caracteres reduit. parmi lesquels on retrouve generalement les caracteres suivants :abcdeIghiiklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890Ainsi. un espace (" ") est en realite un caractere a part entiere. appele caractere special. Il est ainsi rare qu'un langage accepte des caracteres speciaux dans un nom de variable. SmantiqueC`est le sens du programme c'est-a-dire la sequence des etapes d`execution du programme. Mots reserves Dans la plupart des langages. il existe une poignee de mots que l'on ne peut pas attribuer aux noms devariables.onlesappellemotsreserves(enanglaisreservedwords).Ceux-ciserontexplicites dans chaque chapitre correspondant a un langage speciIique. Les constantes Lesconstantessontdes donneesdontlavaleurnepeuttremodiIiee.OnlesdeIinitgeneralement en debut de programme. La valeur que la constante contient peut tre de tout type. suivant ce que le langage autorise. Les commentaires Il est generalement bon de pouvoir aiouter dans un programme des lignes de texte qui ne seront pas prisesencompteparlecompilateur.Ceslignesdetextessontgeneralementprecedees(ou encadrees) par des instructions speciales qui signaleront au compilateur de les ignorer.Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 7 LescommentairesserventaclariIierunprogrammeendonnantdesexplications.Ilsservirontsi iamaisuneautrepersonneessaiedecomprendreleIonctionnementduprogrammeenlisantle Iichier source. ou bien a la personne qui l'a cree si iamais il relit le Iichier source quelques annees apres l'avoir ecrit... Les instructions L'instructionestl'elementcledel'ordinateurcarc'estellequipermetdespeciIierauprocesseur l'action a eIIectuer. Les instructions a eIIectuer sont indiquees dans le Iichier source et l'ordinateur passed'uneinstructionauneautreensuivantlesinstructionsindiqueesdehautenbas(carla lecture d'un Iichier se Iait de haut en bas). Une instruction est generalement composee de deux elements: l'operateur: action a eIIectuer par le processeur la ou les operandes: une ou plusieurs donnees sur lequel on va eIIectuer l'operationoperateur operande(s) Les types d'operateurs On distingue generalement deux ou trois types d'operateurs: Les operateurs unaires: ce sont des operateurs qui n'admettent qu'une seule operande Lesoperateursbinaires:cesontdesoperateursqui.contrairementacequel'onpourrait croire.netravaillentpassurdesoperandesbinaires.maisadmettentdeuxoperandes(binaire designe donc le nombre d'operandes manipulees. l'addition. souvent notee . est donc un operateur binaire) Les operateurs ternaires: ce sont des operateurs qui admettent trois operandes (les operateurs conditionnels sont par exemple des operateurs ternaires)Lesoperateurspeuventtreaussirepartisselonplusieurscategoriesselonletyped'action que leur execution declenche: les operateurs arithmetiques les operateurs de comparaison les operateurs logiques les operateurs de bits les operateurs d'aIIectation les operateurs conditionnels les operateurs sequentiels ...Les priorites des operateurs Danschaquelangageilexistegeneralementdesprioritesd'evaluationdesoperateurs.aIinque l'ordinateur sache dans quel sens evaluer les operateurs lorsque plusieursd'entre eux sont presents dans une mme expression. Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 8 Introduction au langage C Petite histoire du C Le langage C a ete mis au point par D. Ritchie et B. W. Kernighan au debut des annees 70. Leur but etaitdepermettrededevelopperunlangagequipermettraitd'obtenirunsystemed'exploitationde type UNIX portable. D. Ritchie et B.W. Kernighan se sont inspires des langages B et BCPL. pour creer un nouveau langage: le langage C.LapremieredeIinitiondecelangageaetedonneedansleurlivrecommun"TheCprogramming language". TouteIois.suiteal'apparitiondenombreuxcompilateursC.l'ANSI(abreviationdeAmerican National StandardsInstitute) a decide de normaliser ce langage pour donner ce que l'onappelle le C-ANSI.Suiteacettenorme.RitchieetKernighanontsortiunedeuxiemeeditiondulivreen integrant les modiIications apportees par l'ANSI. Les atouts du C Le langage C reste un des langages les plus utilises actuellement. Cela est d au Iait que le langage Cestunlangagecomportantdesinstructionsetdesstructuresdehautniveau(contrairementa l'assembleurparexemple)toutengenerantuncodetresrapidegrceauncompilateurtres perIormant.Un des principaux interts du C est que c'est un langage tres portable. Un programme ecrit en C en respectant la norme ANSI est portable sans modiIications sur n'importe quel systeme d'exploitation disposantd'uncompilateurC:Windows.UNIX.VMS(systemedesVAX)ouencoreOS/390ou z/Os (l'OS des mainIrames IBM).LarapiditedesprogrammesecritsenCestengrandepartiedueauIaitquelecompilateur presuppose que le programmeur sait ce qu'il Iait: il genere un code ne contenant pas de veriIications surlavaliditedespointeurs.l'espaced'adressage.etc.Ainsi.lesprogrammesenCsonttres compacts.Deplus.unedescaracteristiquesduCestqu'ilestunlangage"Iaiblementtype":lestypesde donnees qu'il manipule sont tres restreints. et proches de la representation interne par le processeur : par exemple. le type 'Chane de caracteres' n'existe pas en C. A l'inverse. comparer un entier et un caractereaunsensenCcaruncaractereestbienrepresenteeninterneparleprocesseurparune valeur de type entier (le code ASCII ou le code EBCDIC). Caractristiques du langage C Le fichier source Le Iichier source d'un programme ecrit en langage C est un simple Iichier texte dont l'extension est par convention .c.CeIichiersourcedoittreunIichiertextenonIormate.c'est-a-direunIichiertextedanssaplus simpleexpression.sansmiseenIormeparticuliereoucaracteresspeciaux(ilcontientuniquement les caracteres ASCII de base).Lorsqueleprogrammeestprtatreessaye.ils'agitdelecompiler(letraduireenlangage machine).Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 9 De nombreux compilateurs C existent: sous les systemes de type UNIX par exemple. le compilateur CestIournienstandard.sibienquelaprogrammationenlangageCestaiseesouscetypede systeme. La compilation sous UNIX se Iait par la ligne de commande suivante:cc Iichier.c Les diffrentes tapes de la vie d`un programme en langage C On distingue quatre etapes : -l`edition -la compilation -l`edition de liens -l`execution L`dition Il s`agit de la phase de saisie. eventuellement de modiIications. du texte du programme. Elle se Iait de Iacon classique en memoire centrale. avec des Iacilites de sauvegarde sur disque dur. Letermede programmesource estreserveautexteplaceenmemoireetleterme Iichier source est utilise pour designer ce mme texte lorsqu`il sera place dans un Iichier disque. La compilation Cetteetapeconsisteatraduireenlangagemachinel`ensembledutexteconstituantleprogramme. Ellepourraporte.soitsurunprogrammesource(situeenmemoirecentrale).soitsurunIichier source (situe sur disque). L`unedesoriginalitesdulangageCresidedansl`existenced`unpreprocesseur.Ilpermetau programmeurd'incluredesIichierssourcedansd'autresIichierssource(directive#include).de deIinir des macros (directive #deIine). et de proceder a des compilations conditionnelles. La directive #include Le rle de cette directive est de recopier le contenu d'un Iichier dans le Iichier courant. On l'emploie generalementpourinclurelesen-ttesdebibliotheques.tellesquelesIonctionsmathematiques (math.h~)oulesIonctionsd'entree/sortiestandard(stdio.h~).Cettedirectivepeuts`appliquer egalementadesIichiersdevotrecru.Celapeuts`avererutile.parexemplepourecrireuneseule Iois les declarations communes a plusieurs Iichiers sources diIIerents. Cette directive possede deux syntaxes semblables : #include recherche le Iichier mentionne dans le repertoire include #include nomfichier recherched`abordleIichiermentionnedanslerepertoirecourantpuis.encasd`echec.dansle repertoire include Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 10La directive #define Elle oIIre deux possibilites : -deIinition de symboles -deIinition de macros Dfinition de symboles Une directive telle que : #deIine nbmax 10 demanderdesubstituerausymbolenbmaxletexte5.etceciachaqueIoisquecesymbole apparatra dans la suite du Iichier source. #deIine entier int Placeeendebutdeprogramme.permettrad`ecrire neIrancais lesdeclarationsdevariables entieres. Ainsi. par exemple. ces instructions : entier a.b ; entier *p ;seront remplacees par : inta.b ; int *p ; Voici quelques derniers exemples vous montrant comment resumer en un seul mot une instruction C : #deIine boniour printI(boniour ) #deIine aIIiche printI(resultat d\n.a) #deIine ligneprintI(\n) Dfinition de macros La deIinition de macros ressemble a la deIinition de symboles mais elle Iait intervenir la notion de parametres. Par exemple. avec cette directive : #deIine carre(a) a*a le preprocesseur remplacera dans la suite. tous les textes de la Iorme : carre(x) dans lesquels x represente en Iait un symbole quelconque par : x*x : Par exemple : carre(z) deviendra z*z carre(valeur) deviendra valeur*valeur carre(12) deviendra 12*12 Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 11La macro precedente ne disposait que d`un seul parametre. mais il est possible d`en Iaire intervenir plusieurs en les separant. classiquement. par des virgules. Par exemple. avec : #deIine diII(a.b) a-b diII(x.z) deviendrait x-z diII(valeur9.n) deviendrait valeur9-n Les deIinitions peuvent s`imbriquer. Ainsi. avec les deux deIinitions precedente. le texte : diII(carre(p).carre(q)) sera. dans un premier temps. remplace par : diII(p*p.q*q) puis. dans un deuxieme temps. par : p*p-q*q. Neanmoins. malgre la puissance de cette directive. il ne Iaut pas oublier que. dans tous les cas. il ne s`agitquedesubstitutiondetexte.Ilestsouventnecessairedeprendrequelqueprecautions. notamment lorsque le texte de substitution Iait intervenir des operateurs. Par exemple. avec les instructions : #deIine DOUBLE(x) xx . DOUBLE(a)/bLe texte genere par le preprocesseur sera le suivant : aa/b ce qui diIIerent de (aa)/b. Ceproblemeestlieauxprioritesrelativesdesoperateursetpeuttreresoluenintroduisantdes parentheses dans la deIinition de la macro. Ainsi. avec : #deIine DOUBLE(x) ((x)(x)) Compilation conditionnelle Un certain nombre de directives permettent d`incorporer ou d`exclure des portions du Iichier source dans le texte qui sera genere par le preprocesseur. Ces directives se classent en deux categories en Ionction de la condition qui regit l`incorporation : -existence ou inexistence de symboles -valeur d`expression Incorporation liee a l`existence de symboles #iIdeI symbole . # else . #endiI demanded`incorporerletexteIigurantentrelesdeux lignes#iIdeIet#elsesilesymboleindiqueest eIIectivement deIini au moment ou l`on rencontre #iIdeI. Danslecascontraire.c`estletexteIigurantentre#elseet #endiIquiseraincorpore.Ladirective#elsepeut. naturellement. tre absente. Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 12De Iacon comparable : #iIndeI symbole . # else . #endiI Exemple d`utilisation de ces directives : #deIine miseaupoint.. #iIdeI miseaupoint Instruction1 #else Instruction2 #endiI Incorporation liee a la valeur d`une expression #iI condition . #else . #endiI Permet d`incorporer l`une des deux parties du texte. suivant la valeur de la condition indiquee. En voici un exemple d`utilisation : #deIine code 1 . #iI code1 Instructions 1 #endiI #iI code2 Instructions 2 #endiI demande d`incorporer le texte Iigurantentre lesdeux lignes #iIndeI et #else si le symbole indique n`est pas deIini. Dans lecascontraire.c`estletexteIigurantentre#elseet#endiI quiseraincorpore.Ladirective#elsepeut.naturellement. tre absente. Ici.lesinstructions1serontincorporeesparle preprocesseur.tandisquelesinstructions2neleseront pas.Parcontre.ilsuIIitdesupprimerladirective#deIine miseaupoint pour aboutir au resultat contraire. Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 13Ici. ce sont les instructions 1 qui seront incorporees par le preprocesseur. En remplacant la premiere directive par : #deIine code 2 il s`agirait des instructions 2. Le resultat de compilation porte le nom de module obiet . Il sera touiours range dans un Iichier d`extension obj. L`dition de liensLemoduleobietcreeparlacompilation.bienqueconstitued`instructionsenlangagemachine. n`estpasdirectementexecutable.IlluimanquepourcelalesdiIIerentsmodulesobiets correspondants aux Ionctions (de la bibliotheque) appelees par votre programme. C`est le rle de l`editeur de liens que de realiser cette incorporation de modules. Ces modules peuvent tre obtenus par l`editeur de liens de deux manieres : - Par simple recopie de Iichiers d`extension obi. - par recherche dans Iichier d`extension lib. lequel regroupe en Iait plusieurs modules obiets ayant traitaunm`medomaine(parexemplemaths.libcontienttouslesmodulesobietscorrespondants aux routines mathematiques). Le resultat de l`edition de liens est un programme executable. Aspect d'un programme en C Un programme ecrit en langage C. comporte une Ionction principale appelee main() renIermant les instructions qui doivent tre executees. Celles-cisont comprises entre des accolades qui suivent le nom de la Ionction.Un programme C de base ressemblera donc a ceci :main() printI("Ceci est votre premier programme"); } Leprogrammepresenteci-dessuscontientdoncuneIonctionprincipalemain()(qui.rappelons-le. estessentiellecarc'estparcetteIonctionqueleprogrammes'execute)contenantuneinstruction imprimant a l'ecran le message "Ceci est votre premier programme" grce a la Ionction printI(). Typologie Lamaniered'ecrireleschosesenlangageCasonimportance.LelangageCestparexemple sensible a la casse (en anglais case sensitive). cela signiIie qu'un nom contenant des maiuscules est diIIerent du mme nom ecrit en minuscules. Ainsi. les speciIications du langage C precisent que la Ionction principale doit tre appelee main() et non Main() ou MAIN().Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 14DelammeIacon.onremarqueraquelaIonctionprintI()estecriteenminuscules.D'autre part. l'instruction printI() se termine par un point-virgule. car en langage C. toute instruction se termine par un point-virgule. Ajout de commentaires Lorsqu'unprogrammedevientlongetcomplique.ilpeuttreinteressant(ilestmmeconseille) d'aiouter des lignes de commentaires dans le programme. c'est-a-dire des portions du Iichier source qui ont pour but d'expliquer le Ionctionnement du programme sans que le compilateur ne les prenne en compte (car il genererait une erreur).Pour ce Iaire. il Iaut utiliser des balises qui vont permettre de delimiter les explications aIin que le compilateurlesignoreetpassedirectementalasuiteduIichier.Ces delimiteurs sont /* et */. Un commentaire sera donc note de la Iacon suivante:/*Voici un commentaire!*/ En plus des symboles /* et */. Ionctionnant un peu comme des parentheses. le symbole // permet de mettreencommentairetoutelalignequilasuit(i.e.lescaracteresadroitedecesymbolesurla mme ligne.Il convient touteIois d'utiliser preIerablement la notation /* */ que //. car c'est beaucoup plus ioli et plus propre. La notation // est generalement reservee pour mettre en commentaire une ligne de code que l'on souhaite desactiver temporairement. Les types de donnes LesdonneesmanipuleesenlangageCsonttypees.c'est-a-direquepourchaquedonneequel'on utilise (dans les variables par exemple) il Iaut preciser le type de donnee. ce qui permet de connatre l'occupation memoire (le nombre d'octets) de la donnee ainsi que sa representationdes nombres: entiers (int) ou rels. c'est-a-dire a virgules (float)despointeurs(pointer):permettentdestockerl'adressed'uneautredonnee.ils"pointent" vers une autre donneeEn C il existe plusieurs types entiers. dependant du nombre d'octets sur lesquels ils sont codes ainsi que de leur Iormat. c'est-a-dire si ils sont signes (possedant le signe - ou ) ou non. Par deIaut les donnees sont signees.Voici un tableau donnant les types de donnees en langage C:Type de donneSignificationTaille (en octets)Plage de valeurs accepte CharCaractere1-128 a 127 unsigned charCaractere non signe10 a 255 short intEntier court2-32768 a 32767 unsigned short intEntier court non signe20 a 65535 IntEntier 2 (sur processeur 16 bits) 4 (sur processeur 32 bits) -32768 a 32767 -2147483648 a 2147483647 unsigned intEntier non signe 2 (sur processeur 16 bits) 4 (sur processeur 32 bits) 0 a 65535 0 a 4294967295 long intEntier long4-2 147 483 648 a 2 147 483 647 Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 15unsigned long intEntier long non signe40 a 4 294 967 295 IloatIlottant (reel)43.4*10-38 a 3.4*1038 doubleIlottant double81.7*10-308 a 1.7*10308 long doubleIlottant double long103.4*10-4932 a 3.4*104932 Nombre entier (int) Un nombre entier est un nombre sans virgule qui peut tre exprime dans diIIerentes bases:Base decimale: L'entier est represente par une suite de chiIIre unitaires (de 0 a 9) ne devant pas commencer par le chiIIre 0Base hexadecimale: L'entier est represente par une suite d'unites (de 0 a 9 ou de A a F (ou a a I)) devant commencer par 0x ou 0XBase octale:L'entierest represente par une suite d'unites (incluant uniquement des chiIIres de 0 a 7) devant commencer par 0LesentierssontsignespardeIaut.celasigniIiequ'ilscomportentunsigne.Pourstocker l'inIormation concernant le signe (en binaire). les ordinateurs utilisent le complement a deux Nombre virgule (float) UnnombreavirguleIlottanteestunnombreavirgule.ilpeuttouteIoistrerepresentede diIIerentes Iacons:un entier decimal: 895un nombre comportant un point (et non une virgule): 845.32une Iraction: 27/11un nombre exponentiel. c'est-a-dire un nombre (eventuellement a virgule) suivi de la lettre e (ou E). puis d'un entier correspondant a la puissance de 10 (signe ou non. c'est-a-dire precede d'un ou d'un -) 2.75e-235.8E10.25e-2Enrealite.lesnombresreelssontdesnombresavirguleIlottante.c'est-a-direunnombredans lequellapositiondelavirgulen'estpasIixe.etestrepereeparunepartiedesesbits(appelee l'exposant). le reste des bits permettent de coder le nombre sans virgule (la mantisse).Les nombres de type float sont codes sur 32 bits dont:23 bits pour la mantisse8 bits pour l'exposant1 bit pour le signeLes nombres de type double sont codes sur 64 bits dont:52 bits pour la mantisse11 bits pour l'exposant1 bit pour le signePr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 16Les nombres de type long double sont codes sur 80 bits dont:64 bits pour la mantisse15 bits pour l'exposant1 bit pour le signeLaprecisiondesnombresreelsestapprochee.Elledependparlenombredepositionsdecimales. suivant le type de reel elle sera au moins:de 6 chiIIres pour le type floatde 15 chiIIres pour le type doublede 17 chiIIres pour le type long double Caractre (char) Letypechar(provenantdel'anglaischaracter)permetdestockerlavaleurASCIId'uncaractere. c'est-a-dire un nombre entier. PardeIautlesnombressontsignes.celasigniIiequ'ilscomportentunsigne.Pourstocker l'inIormationconcernantlesigne(enbinaire).lesordinateursutilisentlecomplementadeux.Une donneedetypecharestdoncsignee.celanesigniIiebiensrpasquelalettrepossedeunsigne mais tout simplement que dans la memoire la valeur codant le caractere peut-tre negative. Si iamais on desire par exemple stocker la lettre B (son code ASCII est 66). on pourra deIinir cette donnee soit par le nombre 66. soit en notant 'B'. Il n'existe pas de type de donnees pour les chanes de caracteres (suite de caractere) en langage C. Pourcreerunechanedecaractereonutiliseradoncdestableauxcontenantdanschacunedeses cases un caractere. Crer un type de donne Il est possible en C de deIinir un nouveau type de donnees grce au mot cle typedeI. Celui-ci admet la syntaxe suivante:typedeI CaracteristiquesdutypeNomdutype ou Caracteristiquesdutyperepresenteuntypededonneesexistant(parexempleIloat.short int. ...) Nomdutype deIinit le nom que vous donnez au nouveau type de donneeAinsi l'instruction suivante cree un type de donnee Ch calque sur le type chartypedeI char Ch Conversion de type de donnes On appelle conversion de type de donnees le Iait de modiIier le type d'une donnee en une autre. Il peutarriverparexemplequel'onveuilletravaillersuruntypedevariable.puisl'utilisersousun autretype.Imaginonsquel'ontravailleparexemplesurunevariableenvirguleIlottante(type Iloat).ilsepeutquel'onveuille"supprimerleschiIIresapreslavirgule".c'est-a-direconvertirun Iloat en int. Cette operation peut tre realisee de deux manieres:Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 17 conversionimplicite:uneconversionimpliciteconsisteenunemodiIicationdutypede donnee eIIectuee automatiquement par le compilateur. Cela signiIie que lorsque l'on va stocker un typededonneedansunevariabledeclareeavecunautretype.lecompilateurneretournerapas d'erreur mais eIIectuera une conversion implicite de la donnee avant de l'aIIecter a la variable.int x; x 8.324; x contiendra apres aIIectation la valeur 8 conversion explicite: une conversion explicite (appelee aussi operation de cast) consiste en unemodiIicationdutypededonneeIorcee.CelasigniIiequel'onutiliseunoperateurditdecast pour speciIier la conversion. L'operateur de cast est tout simplement le type de donnee. dans lequel on desire convertir une variable. entre des parentheses precedant la variable.int x; x (int)8.324; x contiendra apres aIIectation la valeur 8 Les variables du langage C Le concept du langage C Unevariableestunobietrepereparsonnom.pouvantcontenirdesdonnees.quipourronttre modiIieeslorsdel'executionduprogramme.LesvariablesenlangageCsonttypees.c'est-a-dire quelesdonneescontenuesdanscelles-cipossedentuntype.ainsiellessontdoncstockeesdansla memoire et occupent un nombre d'octets dependant du type de donnee stockee.En langage C. les noms de variables peuvent tre aussi long que l'on desire. touteIois le compilateur netiendracomptequedes32premierscaracteres.Deplus.ellesdoiventrepondreacertains criteres:un nom de variable doit commencer par une lettre (maiuscule ou minuscule) ou un "" (pas par un chiIIre)un nom de variables peut comporter des lettres. des chiIIres et le caractere(les espaces ne sont pas autorises)Les noms de variables ne peuvent pas tre les noms suivants (qui sont des noms reserves):oautoobreakocase char const continueodeIault do doubleoelse enum externoIloat IorogotooiI. intolong oregister. returnoshort. signed. sizeoI. static. struct. switchotypedeIounion. unsignedovoid. volatileowhile Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 18Nom de variable correct Nom de variable incorrectRaison VariableNom de Variable comporte des espaces NomDeVariable123NomDeVariable commence par un chiIIre nomdevariablecpp(mailcity.com caractere special ( nomdevariable123Nom-de-variable signe - interdit 707goto nom reserve Lesnomsdevariablessontsensiblesalacasse(lelangageCIaitladiIIerenceentreunnomen maiusculeetunnomenminuscules).ilIautdoncveillerautiliserdesnomscomportantlamme casse. La dclaration de variables Pour pouvoir utiliser une variable. il Iaut la deIinir. c'est-a-dire lui donner un nom. mais surtout un typededonneeastockeraIinqu'unespacememoireconIormeautypededonneequ'ellecontient lui soit reserve.Une variable se declare de la Iacon suivante: type Nomdelavariable; ou bien s'il y a plusieurs variables du mme type: type Nomdelavariable1. Nomdelavariable2. ...; Affectation d'une donne une variable Pour stocker une donnee dans une variable que l'on a initialisee. il Iaut Iaire une aIIectation. c'est-a-direpreciserladonneequivatrestockeeal'emplacementmemoirequiaetereservelorsde l'initialisation.Pour cela on utilise l'operateur d'aIIectation "" :Nomdelavariable donnee; Pour stocker le caractere B dans la variable que l'on a appelee Caractere. il Iaudra ecrire:Caractere 'B'; CequisigniIiestockerlavaleurASCIIde"B"danslavariablenommee"Caractere".Ilestbien evident qu'il Iaut avoir prealablement declare la variable en lui aIIectant le type char: char Caractere; Initialisation d'une variable La declaration d'une variable ne Iait que "reserver" un emplacement memoire ou stocker la variable. Tant que l'on ne lui a pas aIIecte une donnee celle-ci contient ce qui se trouvait precedemment a cet emplacement. que l'on appelle garbage (en Irancais: detritus).OnpeutdoncaIIecterunevaleurinitialealavariablelorsdesadeclaration.onparlealors d'initialisation:Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 19 type Nomdelavariable donnee; Par exemple: Iloat T 125.36; Porte (visibilit) des variables Selon l'endroit ou on declare une variable. celle-ci pourra tre accessible (visible) de partout dans le code ou bien que dans une portion conIinee de celui-ci (a l'interieur d'une Ionction par exemple). on parle de portee (ou visibilite) d'une variable.Lorsqu'unevariableestdeclareedanslecodemme.c'est-a-direal'exterieurdetouteIonctionou detoutblocd'instruction.elleestaccessibledepartoutdanslecode(n'importequelleIonctiondu programme peut Iaire appel a cette variable). On parle alors de variable globaleLorsquel'ondeclareunevariableal'interieurd'unblocd'instructions(entredesaccolades).sa portee se conIine a l'interieur du bloc dans lequel elle est declaree.Une variable declaree au debut du code. c'est-a-dire avant tout bloc de donnee. seraglobale. on pourra alors les utiliser a partir de n'importe quel bloc d'instructionUnevariabledeclareeal'interieurd'unblocd'instructions(dansuneIonctionouuneboucle parexemple)aurauneporteelimiteeaceseulblocd'instruction.c'est-a-direqu'elleest inutilisable ailleurs. on parle alors de variable locale Dfinition de constantes Une constante est une variable dont la valeur est inchangeable lors de l'execution d'un programme. En langage C. les constantes sont deIinies grce a la directive du preprocesseur #deIine. qui permet deremplacertouteslesoccurrencesdumotquilesuitparlavaleurimmediatementderriereelle. Par exemple la directive:#deIine Pi 3.1415927 remplaceratouslesidentiIiants"Pi"(sanslesguillemets)parlavaleur3.1415927.sauIdansles chanes de caracteres:resultat Pi * sin(a); //-~ remplaceresultat Pi1; //-~ remplacePi 12; //-~ remplace MAIS genere une erreurresultat PiPo; //-~ pas remplaceprintI("pi Pi "); //-~ pas remplaceTouteIois.aveccettemethodelesconstantesnesontpastypees.ilIautdoncutiliserladirective #deIine avec parcimonie. Il est ainsi preIerable d'utiliser le mot cleI const. qui permet de declarer des constantes typees :const int dix 10;Deplus.celapermetd'evitercertainsproblemesdu#deIine.quiIaitdu"chercher-remplacer" textuel sans reIlechir. Les oprateurs du langage C Lesoperateurssontdessymbolesquipermettentdemanipulerdesvariables.c'est-a-direeIIectuer des operations. les evaluer. ...Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 20On distingue plusieurs types d'operateurs:les operateurs de calculles operateurs d'assignationles operateurs d'incrementationles operateurs de comparaisonles operateurs logiques(les operateurs bit-a-bit)(les operateurs de decalage de bit) Les oprateurs de calcul Les operateurs de calcul permettent de modiIier mathematiquement la valeur d'une variableOprateurDnominationEffetExempleRsultat (avec x valant 7) operateur d'additionAioute deux valeursx310 -operateur de soustractionSoustrait deux valeursx-34 *operateur de multiplicationMultiplie deux valeursx*321 /plus: operateur de divisionDivise deux valeursx/32.3333333 operateur d'aIIectation AIIecteunevaleuraune variable x3Met la valeur 3 dans la variable x Les oprateurs d'incrmentation Cetyped'operateurpermetdeIacilementaugmenteroudiminuerd'uneuniteunevariable.Ces operateurs sont tres utiles pour des structures telles que des boucles. qui ont besoin d'un compteur (variable qui augmente de un en un).Un operateur de type x permet de remplacer des notations lourdes telles que xx1 ou bien x1OprateurDnominationEffetSyntaxeRsultat (avec x valant 7) ++IncrementationAugmente d'une unite la variablex8 --DecrementationDiminue d'une unite la variablex--6 Les oprateurs d'assignation CesoperateurspermettentdesimpliIierdesoperationstellesqueaiouterunevaleurdansune variableetstockerleresultatdanslavariable.Unetelleoperationss'ecriraithabituellementdela Iacon suivante par exemple: ii2Avec les operateurs d'assignation il est possible d'ecrire cette operation sous la Iorme suivante: ikAinsi. si la valeur de i etait 7 avant operation et k a la valeur 2. alors i aura la valeur9 apres. De mme vous pourrez remplacer: a a*bpar a*b n n 3 par n 3 Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 21D`une maniere generale. C permet de condenser les aIIectations de la Iorme : valeur valeur operateur expression en : valeur operateurexpression Cettepossibiliteconcernetouslesoperateursbinairesarithmetiquesetdemanipulationdebits. Voici la liste complete de tous ces nouveaux operateurs nommes operateurs d`aIIectation elargie : . -. *. /. . '. `. &. . ~~. Cesoperateurs.commeceuxd`incrementation.permettentdecondenserl`ecrituredecertaines instructionsetcontribuentaeviterlaredondanceintroduiteIrequemmentparl`operateur d`aIIectation classique. L'operateurd'aIIectationrenvoieaussiunevaleur.quiestcelledelavariableapresaIIectation. Cela permet notamment de Iaire des aIIectations en cascade:a b c 1;ce qui correspond a :a (b (c 1)); Les oprateurs de comparaisonOprateurDnominationEffetExemple Rsultat (avec x valant 7) A ne pas confondre avec le signe d'affectation () operateur d'egalite Compare deux valeurs et veriIie leur egalite x3 Retourne 1 si X est egal a 3. sinon 0 operateur d'inIeriorite stricte VeriIiequ'unevariableest strictementinIerieureaune valeurx3 Retourne1siXest inIerieur a 3. sinon 0 operateur d'inIeriorite VeriIiequ'unevariableest inIerieure ou egale a une valeurx3 Retourne1siXest inIerieurouegala3. sinon 0 ~ operateur de superiorite stricte VeriIiequ'unevariableest strictementsuperieureaune valeurx~3 Retourne1siXest superieur a 3. sinon 0 ~ operateur de superiorite VeriIiequ'unevariableest superieure ou egale a une valeur x~3 Retourne1siXest superieurouegala3. sinon 0 ! operateur de diIIerence VeriIiequ'unevariableest diIIerente d'une valeurx!3 Retourne1siXest diIIerent de 3. sinon 0 Les oprateurs logiques (boolens) Ce type d'operateur permet de veriIier si plusieurs conditions sont vraies: Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 22Oprateur DnominationEffetSyntaxe [[OU logiqueVeriIie qu'une des conditions est realisee((condition1)''(condition2)) &&ET logiqueVeriIie que toutes les conditions sont realisees((condition1)&&(condition2)) !NON logique Inverse l'etat d'une variable booleenne (retourne la valeur 1 si la variable vaut 0. 0 si elle vaut 1) (!condition) (Les oprateurs bit--bit) Cetyped'operateurtraitesesoperandescommedesdonneesbinaires.pluttquedesdonnees decimales. hexadecimales ou octales. Ces operateurs traitent ces donneesselon leur representation binaire mais retournent des valeurs numeriques standards dans leur Iormat d'origine.Les operateurs suivants eIIectuent des operations bit-a-bit. c'est-a-dire avec des bits de mme poids.OprateurDnominationEffetSyntaxeRsultat (avec x valant 7) &ET bit-a-bit Retourne 1 si les deux bitsde mme poids sont a 1 9 & 12 (1001 & 1100) 8 (1000) [OU bit-a-bit Retourne 1 si l'un ou l'autredes deux bits de mme poids est a 1 (ou les deux) 9 ' 12 (1001 ' 1100) 13 (1101) ^OU bit-a-bit exclusiI Retourne 1 si l'un des deux bits de mme poids est a 1 (mais pas les deux) 9 ` 12 (1001 ` 1100) 5 (0101) L`operateur&permetd`accederaunepartiedesbitsd`unevaleurenmasquantlesautres.Par exemple. si n est de type int. l`expression : n & 0x000F permet de ne prendre en compte que les quatre bits de droite de n. De mme n & 0x8000 permet d`extraire le bit de signe de n.Voiciunexempledeprogrammequidecidesiunentierestpairouimpair.enexaminant simplement le dernier bit de sa representation binaire. void main() int n ; printI(donner un entier : ) ; scanI(d.&n) ; iI (n & 0x00011) printI(d est impair\n.n) ; else printI(d est pair\n.n) ; } Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 23Les oprateurs de dcalage de bit Cetyped'operateurtraitesesoperandescommedesdonneesbinairesd'unelongueurde32bits. pluttquedesdonneesdecimales.hexadecimalesouoctales.Cesoperateurstraitentcesdonnees selon leur representation binaire mais retournent des valeurs numeriques standards dans leur Iormat d'origine.Les operateurs suivants eIIectuent des decalages sur les bits. c'est-a-dire qu'ils decalent chacun des bitsd'unnombredepositionsverslagaucheouversladroite.Lepremieroperandedesignela donnee sur laquelle on va Iaire le decalage. la seconde designe le nombre de decalages.OprateurDnominationEffetSyntaxe Rsultat (avec x valant 7) Decalage a droite avec conservation du signe Decale les bits vers la droite(divise par 2 a chaque decalage).Les zeros quisortent a droite sont perdus.tandis que le bit non-nul de poids plusIort est recopie a gauche 6 ~~ 1 (0110 ~~ 1) 3 (0011) L`oprateur conditionnel Considerons la structure de choix : iI (a ~ b) max a ; elsemax b ; Elle attribue a la variable max la plus grande des deux valeurs de a et de b. la valeur de max pourrait tre deIinie par cette phrase : si a ~ b alors a sinon b En langage C. il est possible. grce a l`aide de l`operateur conditionnel. de traduire presque litteralement la phrase ci-dessus de la maniere suivante : max a ~ b ? a : b L`expression Iigurant a droite de l`operateur d`aIIectation est en Iait constituee de 3 (a ~ b. a et b) qui sont les 3 operandes de l`operateur conditionnel. lequel se materialise par 2 symboles separes : ? et : . D`une maniere generale. cet operateur evalue la premiere expression qui ioue le rle d`une condition. Comme touiours en C. celle-ci peut tre en Iait de n`importe quel type type Les expressions et les instructions Expressions : La Iormation des expressions est deIinie par recurrence :Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 24Les constantes et les variables sont des expressions.LesexpressionspeuventtrecombineesentreellespardesoperateursetIormerainsides expressions plus complexes.LesexpressionspeuventcontenirdesappelsdeIonctionsetellespeuventapparatrecomme parametres dans des appels de fonctions.Exemples i 0 i Xpow(A.4) printI(" Boniour !\n") a(5*x10*y)*2 (ab)~100 position!limite Instructions : Uneexpressioncommei=0oui++ouprintf(...)devientuneinstruction.sielleestsuivie d'un point-virgule.Exemples: i0; i; Xpow(A.4); printI(" Boniour !\n"); a(5*x10*y)*2; Evaluation et rsultatsEn C toutes les expressions sont evaluees et retournent une valeur comme resultat:(3+4==7) retourne la valeur 1 (vrai) A=5+6 retourne la valeur 8 Comme les aIIectations sont aussi interpretees comme des expressions. il est possible de proIiter de la valeur rendue par l'aIIectation: ((Acos(X)) 0.5) Les priorits des oprateurs L'ordredel'evaluationdesdiIIerentespartiesd'uneexpressioncorrespondenprincipeacelleque nous connaissons des mathematiques.ExempleSupposons pour l'instruction suivante: A5. B10. C1Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 25 X 2*A3*B4*C; L'ordinateur evalue d'abord les multiplications: 2*A ~ 10 . 3*B ~ 30 . 4*C ~ 4 Ensuite. il Iait l'addition des trois resultats obtenus: 10304 ~ 44 A la Iin. il aIIecte le resultat general a la variable: X 44 Priorit d'un oprateurOn dit alors que la multiplication a la priorit sur l'addition et que la multiplication et l'addition ont la priorite sur l'aIIectation.Si nous voulons Iorcer l'ordinateur a commencer par un operateur avec une priorite plus Iaible. nous devons (comme en mathematiques) entourer le terme en question par des parentheses.ExempleDans l'instruction:X 2*(A3)*B4*C; L'ordinateurevalued'abordl'expressionentreparentheses.ensuitelesmultiplications.ensuite l'addition et enIin l'aIIectation. (En reprenant les valeurs de l'exemple ci-dessus. le resultat sera 164)Entre les operateurs que nous connaissons iusqu'ici. nous pouvons distinguer les classes de priorites suivantes:Classes de prioritsPriorite 1 (la plus Iorte): ( )Priorite 2: ! ++ --Priorite 3: ` / Priorite 4: + -Priorite 5: Priorite 6: !Priorite 7: &&Priorite 8: [[Priorite 9 (la plus Iaible): + - ` / Evaluation d'oprateurs de la mme classe --~Danschaqueclassedepriorite.lesoperateursontlammepriorite.Sinousavonsunesuite d'operateurs binaires de la mme classe. l'evaluation se Iait en passantde la gauche vers la droite dans l'expression.Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 26-- Pour les operateurs unaires (!. ++. --) et pour les operateurs d'aIIectation (. +.-. `. /. ). l'evaluation se Iait de droite a gauche dans l'expression.ExemplesL'expression 5+15+30-40+70-60 sera evaluee comme suit: 5+15>2020+30>5050-40>1010+70>8080-60>20Pour A3 et B4. l'expression A ` B + 5 sera evaluee comme suit: B +5> B9>A `9>A27 Pour A1 et B4. l'expression !--A++!B sera evaluee comme suit:

Les parenthses LesparenthesessontseulementnecessairessinousdevonsIorcerlapriorite.maisellessontaussi permises si elles ne changent rien a la priorite. En cas de parentheses imbriquees. l'evaluation se Iait de l'interieur vers l'exterieur.ExempleEn supposant a nouveau que A5. B10. C1 l'expression suivante s'evaluera a 134:X ((2*A3)*B4)*C Observez la priorite des operateurs d'aIIectation :Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 27X * Y 1 ~ X X * (Y 1) X * Y 1n'equivaut pas a X X * Y 1 Les structures conditionnelles Onappellestructureconditionnellelesinstructionsquipermettentdetestersiuneconditionest vraie ou non. Ces structures conditionnelles peuvent tre associees a des structures qui se repetent suivant la realisation de la condition. on appelle ces structures des structures de boucleLa notion de bloc Une expression suivie d'un point-virgule est appelee instruction. Voici un exemple d'instruction :a; Lorsque l'on veut regrouper plusieurs instructions. on peut creer ce que l'on appelle un bloc. c'est-a-direunensembled'instructions(suiviesrespectivementpardespoint-virgules)etcomprisesentre les accolades et }.LesinstructionsiI.whileetIorpeuventparexempletresuiviesd'unblocd'instructionsa executer...L'instruction if L'instructioniIestlastructuredetestlaplusbasique.onlaretrouvedanstousleslangages(avec une syntaxe diIIerente...). Elle permet d'executer une serie d'instruction si iamais une condition est realisee.La syntaxe de cette expression est la suivante:iI (condition realisee) liste d'instructions; } Remarques:la condition doit tre entre des parenthesesil est possible de deIinir plusieurs conditions a remplir avec les operateurs ET et OU (&& et '')Par exemple l'instruction suivante teste si les deux conditions sont vraiesiI ((condition1)&&(condition2)) L'instruction suivante executera les instructions si l'une ou l'autre des deux conditions est vraie :iI ((condition1)''(condition2)) s'il n'y a qu'une instruction. les accolades ne sont pas necessaires...les instructions situees dans le bloc qui suit else sont les instructions qui seront executees si la ou les conditions ne sont pas rempliesL'instruction if ... else L'instruction iI dans sa Iorme basique ne permet de tester qu'une condition. or la plupart du temps on aimerait pouvoirchoisir les instructionsaexecuteren cas de non ralisation de la condition. L'expression iI ... else permet d'executer une autre serie d'instruction en cas de non-realisation de la condition.Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 28La syntaxe de cette expression est la suivante:iI (condition realisee) liste d'instructions } else autre serie d'instructions } IlestpossibledeIaireuntestavecunestructurebeaucoupmoinslourdegrcealastructure suivante:(condition) ? instruction si vrai : instruction si Iaux Remarques:la condition doit tre entre des parenthesesLorsque la condition est vraie. l'instruction de gauche est executeeLorsque la condition est Iausse. l'instruction de droite est executeeEnplusd'treexecutee.lastructure?:renvoielavaleurresultantdel'instructionexecutee. Ainsi. cette Iorme ?: est souvent utilisee comme suit :position ((enAvant 1) ? compteur1 : compteur-1); L'instruction switch L'instruction switch permet de Iaire plusieurs tests de valeurs sur le contenu d'une mme variable. CebranchementconditionnelsimpliIiebeaucoupletestdeplusieursvaleursd'unevariable.car cetteoperationauraitetecompliquee(maispossible)avecdesiIimbriques.Sasyntaxeestla suivante:switch (Variable) case Valeur1: Liste d'instructions; break; case Valeur2: Liste d'instructions; break; case Valeurs...: Liste d'instructions; break; default:Liste d'instructions; } Lesparenthesesquisuiventlemotcleswitchindiquentuneexpressiondontlavaleuresttestee successivement par chacun des case. Lorsque l'expression testee est egale a une des valeurs suivant uncase.lalisted'instructionquisuitcelui-ciestexecute.Lemotclebreakindiquelasortiedela structureconditionnelle.LemotcledeIaultprecedelalisted'instructionsquiseraexecuteesi l'expression n'est iamais egale a une des valeurs.Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 29N'oubliezpasd'insererdesinstructionsbreakentrechaquetest.cegenred'oubliestdiIIicilea detecter car aucune erreur n'est signalee. En eIIet. lorsque l'on omet le break. l'execution continue dans les blocs suivants. CetetatdeIaitpeutd'ailleurstreutiliseiudicieusementaIindeIaireexecuterlesmmes instructions pour diIIerentes valeurs consecutives. on peut ainsi mettre plusieurs cases avant le bloc :switch(variable)case 1:case 2: instructions executees pour variable 1 ou pour variable 2 }break;case 3: instructions executees pour variable 3 uniquement }break;deIault: instructions executees pour toute autre valeur de variable }}Les boucles Les boucles sont des structures qui permettent d'executer plusieurs Iois la mme serie d'instructions iusqu'a ce qu'une condition ne soit plus realisee... OnappelleparIoiscesstructuresinstructionsrepetitivesoubieniterations.LaIaconlapluscommunedeIaireuneboucle.estdecreeruncompteur(unevariablequi s'incremente.c'est-a-direquiaugmentede1achaquetourdeboucle)etdeIairearrterlaboucle lorsque le compteur depasse une certaine valeur.L'instruction while L'instruction while represente un autre moyen d'executer plusieurs Iois la mme serie d'instructions.La syntaxe de cette expression est la suivante:while (condition) liste d'instructions; } Cette instruction execute la liste d'instructions tant que la condition est realisee.La condition de sortie pouvant tre n'importe quelle structure conditionnelle. les risques de boucle inIinie(boucledontlaconditionesttouioursvraie)sontgrands.c'est-a-direqu'ellerisquede provoquer un plantage du programme en cours d'execution. Exemple : Considerons le programme suivant : Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 30#include stdio.h~ void main() int n. som ; som0 ; while (som 100) printI(donner un nombre : ) ; scanI(d.&n) ; somsom n ; } printI(somme obtenue : d. som) ; } La construction while (som 100)Repete l`instruction qui suit (ici un bloc d`instructions) tant que la condition mentionnee est vraie. Laconditionestexamineeavantchaqueparcoursdelaboucle.Unetellebouclepeuttresbien n`treparcourueaucuneIoissilaconditionestIaussedesqu`onl`abordecommelemontre l`exemple suivant : . int i ; i 13 ; while (i10) printI(id \n.i) ; i ;} Dans cet exemple. la condition est Iausse des le debut. La boucle do ] ] while Ilpeutarriverquel'onneveuilleeIIectuerletestdecontinuationqu'apresavoirexecute l'instruction. Dans ce cas. on utilise la boucle do } while. Sa syntaxe est do instruction while (expression ); Ici.instructionseraexecuteetantqueexpressionestnonnulle.CelasigniIiedoncqueinstruction est touiours executee au moins une Iois. Par exemple. pour saisir au clavier un entier entre 1 et 10 :int a; do printI("\n Entrez un entier entre 1 et 10 : "); scanI("d".&a); Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 31} while ((a 0) '' (a ~ 10)); La boucle for L'instruction Ior permet d'executer plusieurs Iois la mme serie d'instructions: c'est une boucle. Dans sa syntaxe. il suIIit de preciser le nom de la variable qui sert de compteur (et eventuellement savaleurdedepart.laconditionsurlavariablepourlaquellelaboucles'arrte(uneconditionqui testesilavaleurducompteurdepasseunelimite)etenIinuneinstructionquiincremente(ou decremente) le compteur.La syntaxe de cette expression est la suivante:Ior (initialisation du compteur; condition ; modiIication du compteur)liste d'instructions; } Par exemple:Ior (i1; i6; i) printI("d ". i); } Cette boucle aIIiche 5 Iois la valeur de i. c'est-a-dire vous aurez a l`ecran : 1 2 3 4 5

Elle commence a i1. veriIie que i est bien inIerieur a 6. etc... iusqu' a atteindre la valeur i6. pour laquelle la condition nesera plus realisee. la boucle s'interrompraet le programme continuera son cours. ilIaudratouioursveriIierquelaboucleabienuneconditiondesortie(i.elecompteur s'incremente correctement) uneinstructionprintI();dansvotreboucleestunbonmoyenpourveriIierlavaleurdu compteur pas a pas en l'aIIichant il Iaut bien compter le nombre de Iois que l'on veut Iaire executer la boucle:oIor(i0;i10;i) execute 10 Iois la boucle (i de 0 a 9)oIor(i0;i10;i) execute 11 Iois la boucle (i de 0 a 10)oIor(i1;i10;i) execute 9 Iois la boucle (i de 1 a 9)oIor(i1;i10;i) execute 10 Iois la boucle (i de 1 a 10)D`une maniere generale. nous pouvons dire que : for( expression1 ; expression2 ; expression3)instruction ;est equivalent a : expression1 ; while (expression2) ] instruction ; expression3 ; } Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 32Chacune des trois expressions est Iacultative. Ainsi. ces constructions suivantes sont equivalentes : Notezquelorsqueexpression2estabsente.elleconsidereecomme vraie. La richesse de la notion d`expression en C permet de grouper plusieurs actions dans une expression. Ainsi :

De mme : est equivalent a : Les constructions : Ior( ; ; ) ; Ior ( ; ; ) } sontsyntaxiquementcorrectes.EllesrepresententdesbouclesinIiniesdecorpsvide.Enpratique. elles ne presentent aucun intert. Par contre. cette construction Ior( ; ;)instruction ; Ior (i1; i6; i)printI("d ". i); i1 ; Ior ( ; i6; i)printI("d ". i); i1 ; Ior ( ; i6; )] printI("d ". i); i ; ] i1 ; k5 ; Ior(i0 ;. ; .) .. ; Ior(i0. i1. k5 ;. ; .) .. ; i0 ; i1 ;k5 ; Ior( ;. ; .) .. ; Ior(i1. printI(Debut\n) ; printI(Fin de tour\ n) . i5; i) instruction ;} printI(Debut\n) ; Ior(i1; i5; i) printI(Fin de tour\ n) ; instruction ; }printI(Fin de tour\ n) ; Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 33est une boucle a priori inIinie dont on pourra eventuellement sortir par une instruction break. Saut inconditionnel Il peut tre necessaire de Iaire sauter a la boucle une ou plusieurs valeurs sans pour autant mettre Iin a celle-ci.Lasyntaxedecetteexpressionest"continue;"(cetteinstructionseplacedansuneboucle).on l'associe generalement a une structure conditionnelle. sinon les lignes situees entre cette instruction et la Iin de la boucle seraient obsoletes.Exemple: Imaginons que l'on veuille imprimer pour x allant de 1 a 10 la valeur de 1/(x-7) ... il est evident que pour x7 il y aura une erreur. Grce a l'instruction continue. il est possible de traiter cette valeur a part puis de continuer la boucle. x1; while (x10) iI (x 7) printI("Division par zero!"); continue;} a 1/(x-7); printI("I". a); x; } Ilyauneerreurdansceprogramme:lorsquexestegala7.lecompteurnes'incrementeplus.il reste constamment a la valeur 7. il aurait Iallu ecrire:x1; while (x10) iI (x 7) printI("division par 0"); x++; continue; } a 1/(x-7); printI("I". a); x; } Arrt inconditionnel A l'inverse. il peut tre voulu d'arrter prematurement la boucle. pour une autre condition que celle precisedansl'en-tetedelaboucle.L'instructionbreakpermetd'arrteruneboucle(Ioroubien Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 34while).Il s'agit. tout comme continue. de l'associera une structureconditionnelle. sans laquelle la boucle ne Ierait iamais plus d'un tour. Dans l'exemple de tout a l'heure. par exemple si l'on ne savait pas a quel moment le denominateur (x-7) s'annule. il serait possible de Iaire arrter la boucle en cas d'annulation du denominateur. pour eviter une division par zero. Ior (x1; x10; x) a x-7; iI (a 0) printI("division par 0"); break;} printI("I". 1/a); } L`instruction goto Elle permet le branchement en un emplacement quelconque du programme. Nous pouvons ecrire le programme precedent en utilisant goto : Ior (x1; x10; x) a x-7; iI (a 0) goto etiq; printI("I". 1/a); } etiq : printI("division par 0"); L'instruction goto etiq permet d'eIIectuer un saut iusqu'a l'instruction etiq. Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 35Les fonctions en C La notion de fonction OnappelleIonctionunsous-programmequipermetd'eIIectuerunensembled'instructionpar simpleappeldelaIonctiondanslecorpsduprogrammeprincipal.LesIonctionspermettent d'executer dans plusieurs parties du programme une serie d'instructions. cela permet une simplicite ducodeetdoncunetailledeprogrammeminimale.D'autrepart.uneIonctionpeutIaireappela elle-mme.onparlealorsdeIonctionrecursive(ilneIautpasoublierdemettreuneconditionde sortie au risque sinon de ne pas pouvoir arrter le programme...).La dclaration d'une fonction Avant d'tre utilisee. une Ionction doit tre deIinie car pour l'appeler dans le corps du programme il Iautquelecompilateurlaconnaisse.c'est-a-direqu'ilconnaissesonnom.sesargumentsetles instructionsqu'ellecontient.LadeIinitiond'uneIonctions'appelle"declaration".Ladeclaration d'une Ionction se Iait selon la syntaxe suivante:typeretourne nomIonction(type1 argument1. type2 argument2. ...) liste d'instructions } Remarques:typeretournerepresenteletypedevaleurquelaIonctionestsenseeretourner(char.int. Iloat....)Si la Ionction ne renvoie aucune valeur. on la Iait alors preceder du mot-cle voidSi aucun type de donnee n'est precise. le type int est pris par deIautle nom de la Ionction suit les mmes regles que les noms de variables:ole nom doit commencer par une lettreounnomdeIonctionpeutcomporterdeslettres.deschiIIresetlescaractereset& (les espaces ne sont pas autorises!)olenomdelaIonction.commeceluidesvariablesestsensiblealacasse (diIIerenciation entre les minuscules et maiuscules)Les arguments sont IacultatiIs. mais s'il n'y a pas d'arguments. les parentheses doivent rester presentesIl ne Iaut pas oublier de reIermer les accoladesLenombred'accoladesouvertes(Ionction.bouclesetautresstructures)doittreegalau nombre d'accolades Iermees La mme chose s'applique pour les parentheses. les crochets ou les guillemets Appel de fonction Pour executer uneIonction. il suIIit de Iaire appel a elle enecrivant son nom (une Iois de plusen respectantlacasse)suivied'uneparentheseouverte(eventuellementdesarguments)puisd'une parenthese Iermee: nomIonction(); Remarques:lepointvirgulesigniIielaIind'uneinstructionetpermetdedistinguerlesdiIIerentsblocs d'instructionsPr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 36si iamais vous avez deIini des arguments dans la declaration de la Ionction. il Iaudra veiller alesinclurelorsdel'appeldelaIonction(lemmenombred'argumentsseparespardes virgules) : nomIonction(argument1. argument2); Prototype d'une fonction Leprototyped'uneIonctionestunedescriptiond'uneIonctionquiestdeIinieplusloindansle programme.Onplacedoncleprototypeendebutdeprogramme(avantlaIonctionprincipale main()).Cette description permet au compilateur de "veriIier" la validite de la Ionction a chaque Iois qu'il la rencontre dans le programme. en lui indiquant: Le type de valeur renvoyee par la Ionction Le nom de la Ionction Les types d'argumentsContrairementaladfinitiondelaIonction.leprototypen'estpassuividucorpsdelaIonction (contenant les instructions a executer). et necomprend pas le nom desparametres (seulement leur type).Un prototype de Ionction ressemble donc a ceci:typerenvoye nomIonction(typeargument1. typeargument2. ...); Le prototype est une instruction. il est donc suivi d'un point-virgule. Voici quelques exemples de prototypes:void AIIichecar(char. int); int Somme(int. int); Les arguments d'une fonction Il est possible de passer des arguments a une Ionction. c'est-a-dire lui Iournir une valeur ou le nom d'une variable aIin que la Ionction puisse eIIectuer des operations sur ces arguments ou bien grce a ces arguments.Lepassaged'argumentsauneIonctionseIaitaumoyend'unelisted'arguments(separespardes virgules) entre parentheses suivant immediatement le nom de la Ionction.Exemple : Dans la deIinition de la Ionction aIIiche. nous trouvons l`en-tte : void aIIiche(int n) qui indique que la Ionction ne retourne rien et a un seul argument de type int nomme n. void aIIiche(int n) ; void main() int a10. b20 ; aIIiche(a) ; aIIiche(b) ; aIIiche(ab) ; } void aIIiche(int n) printI(valeur : d\n .n) ; } Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 37Cela signiIie que lorsque cette Ionction sera appelee. on lui transmettra une valeur de type int.Lesymbolenn`adesigniIicationqu`auseindelaIonctionaIIicheetiln`aaucunrapportavec d`eventuelles variables de mme nom qui pourraient tre deIinies en dehors (ici. dans le programme principal). On dit souvent que n est un argument muet ou encore un argument Iormel. Encequiconcernel`utilisationdelaIonctionaIIichedansleprogrammeprincipal.nousIaisons suivresonnomd`uneexpressiondetypeint.placeeentreparentheses.Cetteexpressionportele nom d`arguments eIIectiI. C`est sa valeur qui sera eIIectivement transmise a la Ionction aIIiche lors de l`appel. EnC.unargumenteIIectiIprendlaIormeden`importequelleexpression(ici.noustrouvonsa.b. ab). Au contraire. un argument Iormel ne peut tre qu`un identiIicateur de variable. D`une maniere generale. une Ionction peut comporter plusieurs arguments separes par des virgules. Exemple : Fonctions fournissant un rsultat Exemple : void aIIichetrois(int a. int b. Iloat x) ; void main() int n. p; Iloat x; printI(Donner deux entiers\n) ; scanI(dd.&n.&p) ; printI(Donner un reel\n) ; scanI(I.&x) ; aIIiche(n.p.x) ; aIIiche(np. 5*n. x-20) ; } void aIIichetrois(int a. int b. Iloat x) printI(d d I\n .a. b. x) ; } double somme(double u. double v) ; void main() double a. b . c. d . x. y; a1. ; b 2. ; c3. ; d 4. ; x somme(a. b) 5 ; printI(x : e\n . x) ; y 3 * somme(c .d); printI(y : e\n. y) ; } double somme(double u. double v) ; double s ; suv ; return(s); } Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 38L`en-tte de la Ionction precise touiours la liste d`arguments Iormels avec leurs types ; mais de plus on y trouve (au debut) l`indication du type du resultat que Iournira la Ionction. Par ailleurs. dans le corps mme de la Ionction. on trouve une instruction : return(s) ; Qui speciIie le resultat qui sera Iourni par la Ionction lors de son appel. L`instruction return D`une maniere generale : - L`instruction return peut mentionner n`importe quelle expression. Ainsi. nous aurions pu ecrire la Ionction precedente d`une maniere plus simple : double somme(double u. double v) return(uv); } L`instructionreturnpeutapparatreaplusieursreprisesdansuneIonction.commedanscet exemple: double abssomme(double u. double v) double s ; suv ; iI (s~0) return(s); else retrun(-s); } Notezbienque.nonseulementl`instructionreturndeIinitlavaleurduresultat.mais.enmme temps. elle interrompt l`execution de la Ionction en revenant dans la Ionction qui l`a appelee. Si le type de l`expression Iigurant dans return est diIIerent du type du resultat tel qu`il a ete declare dans l`en-tte. le compilateur mettra automatiquement en place des instructions de conversion. Les valeurs sont transmises par valeur En langage C. les arguments d`une Ionction sont transmis par valeur. c`est-a-dire que la Ionction appelante Iait une copie de la valeur passee en parametre et passe cette copie a la Ionction appelee. Dans les exemples deia rencontres. les consequences et les limitations de ce mode de transmission n`apparaissent guere. Examinons l`exemple suivant : Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 39 A l`ecran vous aurez les resultats suivants : La Ionction echange recoit deux valeurs correspondant a ses deux arguments Iormels a et b. Elle eIIectue un echange de ces deux valeurs. Mais. lorsque l`on est revenu dans le programme principal. aucune trace de cet echange ne subsiste sur les arguments eIIectiIs n et p. En eIIet. lors de l`appel de echange. il y a eu transmission de la valeur des expressions n et p. On peut dire que ces valeurs ont ete recopiees localement dans la Ionction echange dans des emplacements nommes a et b. C`est eIIectivement sur ces copies qu`a travaille la Ionction echange. de sorte que les valeurs des variables n et p n`ont. quand a elles. pas ete modiIiees. C`est ce qui explique le resultat constate. Ce mode de transmission semble donc interdire a priori a une Ionction de produire une ou plusieurs valeurs en retour. autres que celle de la Ionction elle-mme. Puisque en C tous les modules doivent tre ecris sous Iorme de Ionction. ce simple probleme d`echange des valeurs de deux variables doit pouvoir se resoudre a l`aide d`une Ionction. Ce probleme possede plusieurs solutions. a savoir : -utiliser des variables globales comme nous allons le voir dans la section suivante. -transmettre en argument la valeur de l`adresse d`une variable. La Ionction pourra eventuellement agir sur le contenu de cette adresse. Nous examinons cette technique en detail dans la partie consacre aux pointeurs. Remarque : Les arguments d`une eIIectiIs peuvent prendre la Iorme d`une expression quelconque parce que la transmission des arguments se Iait par valeur. Les variables globales En ce qui concerne les possibilites d`echange d`inIormation entre diIIerentes Ionctions. nous avons vu iusqu`ici que la transmission des valeurs d`arguments et la recuperation d`une valeur en retour (ou resultat). EnIait.enCcommeenpascal.plusieursIonctions(dontlaIonctionmain)peuventpartagerdes variables communes qu`on qualiIie alors de globales. void echange(int a. int b) ; void main() int n10. p20 ; printI(avant appel : d d\n.n. p) ; echange(n. p) ; printI(apres appel : d d\n.n. p) ; } void echange(int a. int b) int c ; printI(debut echange : d d\n. a. b) ; ca ; ab ; bc ; printI(Iin echange : d d\n. a. b) ; } avant appel: 10 20 debut echange: 10 20 Iin echange: 20 10 apres appel: 10 20 Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 40 Exemple d`utilisation de variables globales LavariableiaetedeclareeendehorsdelaIonctionmain.Elleestalorsconnuedetoutesles Ionctionsquiserontcompileesparlasuiteauseindummesource.Ainsi.icileprogramme principal aIIecte a i des valeurs qui se trouvent utilisees par la Ionction message. Proprits des variables globales Portee LesvariablesglobalesainsideIiniesnesontconnuesducompilateurquedanslapartiedusource suivant leur declaration. On dit que leur portee (ou encore leur espace de validite) est limitee a la partie du source qui suit leur declaration. Examinons l`exemple suivant : .Ict1(.) ; . Ict2(.) ; void main() . } int n ; Iloat x ; . Ict1(..) . } .Ict2(.) . } Les variables n et x sont accessibles aux Ionctions Ict1 et Ict2. mais pas au programme principal (la Ionction main). Pourdesraisonsdelisibiliteduprogramme.onpreIereraregrouperlesdeclarationsdetoutesles variables globales au debut du source. void message() ; int i ; / * variable globale */ void main() Ior(i1 ; i6 ; i) message(); } void message() printI(Appel n : d\n.i) ; } A l`ecran d`execution. vous aurez : Appel n : 1 Appel n : 2 Appel n : 3 Appel n : 4 Appel n : 5 Appel n : 6 Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 41 Classe d`allocation D`unemanieregenerale.lesvariablesglobalesexistentpendanttoutel`executionduprogramme danslequelellesapparaissent.LeursemplacementsenmemoiresontparIaitementdeIinislorsde l`editiondeliens.CesvariablesIontpartiedelaclassed`allocationstatique.Deplus.ces variables se voient initialisees a zero. avant le debut d`execution du programme. sauI. bien sr. si vous leur attribuez explicitement une valeur initiale au moment de leur declaration. Variables locales : automatiques ou statiques A l`exception de l`exemple precedent. les variables que nous avions rencontrees iusqu`ici n`etaient pasdesvariablesglobales.Plusprecisement.ellesetaientdeIiniesauseind`uneIonction(qui pouvait tre la Ionction main). De telles variables sont dits locales a la Ionction dans laquelle elles sont declarees. La portee des variables locales Lesvariableslocalesnesontconnuesqu`al`interieurdelaIonctionouellessontdeclarees.Leur portee est donc limitee a cette Ionction. Lesvariableslocalesn`ontaucunlienavecdesvariablesglobalesdemmenomouavecd`autres variables locales a d`autres Ionctions. Examinons l`exemple suivant : void Ict1() ; int n ; void main() int p ; . } void Ict1() int n ; int p ; . } La variable p de main n`a aucun rapport avec la variable p de Ict1. De mme. la variable n de Ictl n`a aucun rapport avec la variable globale n. Les variables locales automatiques Par deIaut. les variables locales ont une duree de vie limitee a celle d`une execution de la Ionction danslaquelleellesIigurent.Plusprecisement.leurremplacementsnesontpasdeIinisdemaniere permanentecommeceuxdesvariablesglobales.Unnouvelespacememoireleurestallouea chaqueentreedanslaIonctionetlibereachaquesortie.IlseradoncgeneralementdiIIerentd`un appelausuivant.Ontraduitcelaendisantquelaclassed`allocationdecesvariablesest automatique .Ilestimportantdenoterquelesvaleursdesvariableslocalesnesontpas conservees dun appel au suivant. Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 42Les variables locales statiques Il est touteIois possible de demander d`attribuer un emplacement permanent a une variable locale et qu`ainsisavaleurseconserved`unappelausuivant.IlsuIIitpourceladeladeclareral`aidedu mot-cle : static Examinons l`exemple suivant : void Ict() ; void main() int n ; Ior(n1 ; n6 ;n) Ict(); } void Ict() statitc int i; i; printI(appel numero : d\n. i) ; } La variable locale i a ete declaree de classe statique. On constate bien que sa valeur progresse de un a chaque appel. De plus. on note qu`au premier appel sa valeur est nulle. En eIIet. comme pour lesvariablesglobales(lesquellessontaussideclassestatique).lesvariableslocalesdeclasse statique sont. par defaut initialisees a zero. LE CAS DE FONCTIONS RECURSIVES Le langage C autorise la recursivite des appels de Ionctions. Celle peut prendre deux aspects : -recursivitedirecte :uneIonctioncomporte.danssadeIinition.aumoinsunappelaelle-mme. -recursivitecroisee :l`appeld`uneIonctionentraneceluid`uneautreIonctionqui.ason tour appelle la Ionction initiale. Exemple 1 : Le Iactoriel peut tre deIinie de deux manieres: DeIinition iterative N ! 1 si N 0Sinon N ! 1 x 2 x . (N1) x N DeIinition recursiveSi N 0 alors N ! 1 Sinon N !N x (N-1) ! Ainsi on peut ecrire la Ionction qui calcule le Iactoriel d`un nombre d`une maniere recursive de la maniere suivante : A l`ecran de l`execution. vous aurez : appel numero : 1 appel numero : 2 appel numero : 3 appel numero : 4 appel numero : 5 appel numero : 6 Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 43 Il Iaut bien voir qu`alors chaque appel de Iactoriel entrane uneallocationd`espacepourlesvariableslocales(s`ils existent) et pour son argument n. Or. chaque nouvel appel deIactoriel.al`interieurdeIactoriel.provoqueunetelle allocation.sansquelesemplacementsprecedentsne soient liberes. Exemple 2 : Prenons le cas de la suite de Fibonacci. deIinie par U0 U11 Un Un-1 Un-2 pour n> 1 Onobtientdonclasuite1.1.2.3.5.8.13.21.34.55.89.144.233.377.610.987.1597.2584. 4181. 6765. 10946....De mme on peut ecrire la Ionction qui calcule la suite de Iibinacci de la maniere suivante: FibestuneIonctionquiutilisesonproprenomdansla deIinitiond'elle-mme.Ainsi.sil'argumentnestplus petitque1.onretournecommevaleur1.Sinon.le resultat est : Fib(n-1) Fib(n-2). Il est donc possible en C. comme en beaucoup d'autres langages (sauI Fortran). de deIinir de telles Ionctions recursives. D'ailleurs. toute suite (Un) deIinie par recurrence s'ecrit de cette maniere en C. Par ailleurs. on peut se demander comment C s'y prend pour Iaire le calcul des Ionctions recursives. Nous allons essayer de le suivre sur le calcul de Fib(4).Fib(4) -~ Fib (3) Fib (2) -~ (Fib (2) Fib (1)) Fib (2) -~ ((Fib (1) Fib (1)) Fib (1)) Fib(2) -~ ((1 Fib(1)) Fib (1)) Fib(2) -~ ((1 1) Fib (1)) Fib(2) -~ (2 Fib(1)) Fib(2) -~ (2 1) Fib(2) -~ 3 Fib(2) -~ 3 (Fib (1) Fib (1)) -~ 3 (1 Fib(1)) -~ 3 (1 1) long Iactoriel(int n) iI (n 1) return (1); else return (n * Iactoriel (n-1)); } int Fib(int n) iI (n 1)return (1); elsereturn (Fib (n-1) Fib (n-2)); } Pr. Sofia Douda Cours dintroduction a la programmation en Langage CAnnee 2007/2008 44 -~ 3 2 -~ 5

Appels recursiIs pour Fib(4) Le programme iteratiI pour le calcul de la suite Fibonacci est le suivant : /* Fonctioniterative qui calcule la suite de Fibonacci */ int Fibiter(int n) int u0.u1. u2; int i; iI (n0) return(0); iI (n1) return(1); u0 0; u1 1; Ior (i 1; i n; i) u2u0u1; u0u1; u1 u2; } return (u2); }

Recommended

View more >