Support de Cours de Langage C. Christian Bac

Dimension: px
Commencer à balayer dès la page:

Download "Support de Cours de Langage C. Christian Bac"

Transcription

1 Support Cours Langage C Christian Bac 24 avril 2003

2 ii

3 Table s matières Avant-propos 1 Historique et présentation Historique Présentationdulangage Idéesfondamentales En-chaîneurpasses Pré-processeur Compilateur Optimiseurco Assembleur Éditeurliens Quelquesoptionscc Généralités sur la syntaxe 2.1 Miseenpage Intiant Espaceslexicaux Motsréservés Constantes Instructions Types et variables Typesbase Typesentiers Typesavecpartiesdécimales Taillesstypes Constantesassociéesauxtypesbase Constantestypeentier Constantesavecpartiedécimale Constantestypecaractère xi

4 iv TABLE DES MATIÈRES Chaînescaractères Qualicatifs Tailleetnormalisation Dénitionvariables Typesdérivésstypesbase Tableauxetstructures Pointeurs Initialisationvariables Conversiontype Conversionsimplicites Déclarationetdénition Exercicessurlestypesetvariables Exercice Exercice Exercice Exercice Eléments base Bonjour Lireetécrire Quelquesopérations Plussur printf() et scanf() Exercicessur printf() et scanf() Exercice Exercice Exercice Exercice Opérateurs et expressions Opérateursun-aires Opérateurréférencement Opérateurdéréférencementouindirection Utilisations&et* Opérateursd'incrémentationetdécrémentation Opérateurtaille Opérateurnégationlogique Plusetmoinsunaires Complémentàun Opérateursbinaires Opérateursarithmétiques

5 TABLE DES MATIÈRES v Opérateursmanipulantlesbits Opérateursdécalage Opérateursrelation Opérateurbinaired'aectationetsuccession Opérateursd'aectation Opérateurternaire Précéncesopérateurs Expressions Instructions Exercicessurlesopérateursetlesexpressions Exercice Exercice Exercice Exercice Exercice5:Operateurternaire Exercice Instructions contrôle Instructionsconditionnelles Test Tablebranchement Instructionsitératives while for do while Remarquessurlesinstructionsitératives Rupturesséquence continue break goto return Exercicessurlesinstructionscontrôle Exercice Exercice Exercice Exercice Exercicessurlesrupturesséquence Exercice Exercice

6 vi TABLE DES MATIÈRES 7 Programmation structurée Historique Idéesfondamentales LangageCetprogrammationstructurée AmbitionsdulangageC Cetstructuresfondamentales Quelquesexemples Exempleavecstests Exempleavecuneboucle Fonctions Dénitiond'unefonction Retourfonction Passagesparamètres Passageconstantes Passagevariables Utilisationpointeursenparamètres Conversiontypelorssappels Récursivité Argumentslafonctionmain() Pointeurfonction Étapesd'unappelfonction Exercicessurlesfonctions Exercice Exercice Exercice Compilations séparées Programme Fichiersource Visibilité Espacesnommageetvisibilité Extensionlavisibilité Prototypessfonctions Fonctionsexternes Fonctionsdéniesultérieurement Véricationsprototypes Multiplesdéclarationsetdénitions Fichiersd'inclusion Réductionlavisibilité

7 TABLE DES MATIÈRES vii Variableslocalesrémanentes Travaillerengroupe Exercicessurlesfonctionsetlavisibilitésvariables Exercice1:simulationd'unascenseur Exercice2:racinesd'uneéquationduuxièmegré Exercice3:utilisationschiersd'inclusion Pointeurs et tableaux Tableauxàunedimension Arithmétiqued'adresseettableaux Tableauxmultidimensionnels Pointeursettableaux Tableaupointeurs Pointeursversuntableau Exercicessurlestableauxetlespointeurs Exercice1:tritableauxd'entiers Structures Dénition Utilisation Opérationssurleschamps Opérationssurlavariabledanssonensemble Structuresetlisteschaînées Champsbits Exercicessurlesstructures Exercice Exercice Unions Dénition Accèsauxchamps Exercicessurlesunionsetleschampsbits Exercice Exercice Énumérations Dénition Utilisation Limitessénumérations Types synonymes et complexes 157

8 viii TABLE DES MATIÈRES 14.1 Typessynonymes Typescomplexes Fonctionsettableaux Exercicessurlesdéclarationscomplexes Exercice Exercice Exercice Préprocesseur Commentaires Inclusionchiers Variablespré-compilation Dénitionconstantescompilation Dénitionstinéeàlasélection Dénitionmacro-expressions Eacementd'unedénition Dénitionàl'appell'enchaîneurpasses Sélectionco Sélectionavec #if Sélectionavec #iff et #ifnf Exercicessurlepréprocesseur Exercice Exercice Entrées-sorties la bibliothèque Entrée-sortiesstandards Échangescaractèreparcaractère Échangesligneparligne Échangesavecformats Ouvertured'unchier Fermetured'unchier Accèsaucontenuduchier Accèscaractèreparcaractère Accèsligneparligne Accèsenregistrementparenregistrement Entrée-sortiesformatées Formats:caslalecture Formats:casl'écriture Conversionsurlesentrée-sortiesstandards Conversionenmémoire

9 TABLE DES MATIÈRES ix Conversiondansleschiers Déplacementdanslechier Gestionstampons Gestionserreurs Autres fonctions la bibliothèque Fonctionsmanipulationchaînescaractères Typescaractères Quelquesfonctionsgénérales system() exit() GNU Free Documentation License ApplicabilityandDenitions VerbatimCopying CopyinginQuantity Modications CombiningDocuments CollectionsofDocuments AggregationWithInpenntWorks Translation Termination FutureRevisionsofThisLicense Liste s programmes exemples 212 Liste s gures 215 Liste s tableaux 218 Bibliographie 220 Inx 221

10 x TABLE DES MATIÈRES

11 Avant-propos Notice copyright - NOTICE COPYRIGHT c ou moi) Ce support l'institut cours National correspond Télécommunications, au cours langage 9 C rue Charles Christian Fourier Bac 91011, (ci-après Évry, l'auteur, France. je Cedocumentestdisponibleauxformatslatex,PostScriptouHTML,surlewebàl'URL: http ://picolibre.int-evry.fr/projects/coursc/. sur Il son est utilisabilité, fourni tel quel, ni sur l'auteur l'exactitu ayant fait s informations son mieux qu'il pour contient. supprimer les erreurs, sans garantie licencedocumentationlibre,version1.1outouteversionpostérieurepubliéeparlafreesoftware Vous avez le droit copier, distribuer et/ou modier ce document selon les termes la Foundation; avec une section invariante le chapitre Avant-propos texte spécique en première et en quatrième couverture. Une copie qui contient la licence cette est licence, inclue dans sans le chapitre intitulé"gnu Free Documentation License". Toute remarque ou erreur peut être notiée à l'auteur à l'adresse électronique suivante: Christian.Bac AT int-evry.fr Fin la NOTICE COPYRIGHT c - Conventions d'écriture Voici les conventions d'écriture suivies dans ce support: lestyle italique en anglais comme n'estquasimentjamaisutilisécarjenel'aimepas,jeleréservepourlesphrases The C programming Language les et pour les locutions latines comme versus; caractères et les parties programme, type imprimante comme à /usr/inclu/stdio.h; boule(teletype) sont utilisés pour les noms chiers le style gras les caractères est sont utilisé plus lorsqu'un larges dans mot l'énoncé me semble règles important, ou par parties exemple syntaxe instructions; la syntaxe la conversion explicite: (type) expression; telles que lesmotsquinesontpasfrançaismaissontsouventutilisésdanslejargonsinformaticiens commequote Ainsijepeuxappeleruninx-noeuddusystèmechiersUNIX:unino; sontconsidéréscommetypeneutreetsevoientappliquerlegenremasculin. dans noms les entourés ssins par représentant s pointillés l'espace sont s mémoire adresses occupé et non par s les variables. variables ou les tableaux, les

12 xii Vocabulaire courant Voici quelques mots que j'utilise manière courante: Bit (BinarydigiT)ouélémentbinaire,lapluspetitepartiemanipulableparunordinateur.Comme sonnoml'indiqueunélémentbinairepeutprendreuxvaleurs:0ou1. Octet groupeestleplussouvent(commesonnoml'indique)constituéhuitbits.enlangagec, ou byte, le groupe bits qui permet supporter la représentation d'un caractère. Ce l'octet compliquées sert dans comme les calculs le mot d'occupation machine ont d'espace une taille mémoire donnée et en en nombre particulier d'octets. les variables plus Pile ou programmeteniràjourssériesvariablesactives.cetespaceestgérécommeunepile pile d'exécution, c'est une partie l'espace mémoire d'une application qui permet au d'assiettes, cet espace seulement c'est-à-dire par que le l'on haut. peut Ainsi, ajouter les rniers l'espace éléments (faire grandir qui ont la été pile) ajoutés ou diminuer pile sont les plus facilement accessible, une pile représente le modèle LIFO sur une (Last In First Out) opérations les rniers d'agrandissement éléments qui ou y sont réduction ajoutés sont la pile les premiers sont faites à pouvoir manière être automatique retirés. Les lors à partir s d'un appels espace fonctions mémoire et respectivement taille xe qui est s attribué retours manière fonctions. automatique La pile est par gérée système d'exploitation. Le processeur tient à jour sa relation avec la pile à travers un registre le internequidécritlesommetpileetunautreregistrequimaintientunliensurlecontexte (arguments l'appel et variables locales). Un peu d'histoire CecourslangageCalagénéalogiesuivante: Génèse assurer 1. Il a la été formation créé en 1985 en interne. lorsque j'étais au centre calcul du CNET Paris A, pour 2. La première version était tapée avec les accents français grâce à une version d'emacs sur Multics améliorée par M. Arditti. Cette version d'emacs accents. permettait taper les 3. LesexercicesassociésontétéréaliséssurunemachinetypeSM Les Auguste personnes et M. Sabatier m'ayant du aidé CNET. dans la réalisation cette première version sont : M. Tro 1. Lorsque le DWB (Documentation WorkBench) ticipation du CNET à travers la personne M. a Gien, été disponible dans l'organisation suite à une intense la conférence par- une version Européenne troff. sur UNIX à Paris en 1986, j'ai décidé faire migrer ce cours sous 2. J'ai car elles alors faisaient choisi d'utiliser partie les la macros distribution qui me semblaient voir être la future référence d'unix system V, les macros -mm quej'aiétéleseul). (je crois 3. Lespremièresguressontapparuesdanscesupportgrâceàladisponibilitél'utilitaire pic. 4. Lespersonnesm'ayantaidédanslaréalisationcetteversionsont:M.FondainetM. Horn du CNET. Utilisation formation continue venirtravailleràl'inten1989.elleaalorsservisupportcourspourlamiseenplace Cette version m'a suivi lorsque j'ai quitté le CNET pour d'un le service ensemble national cours la dus formation à l'arrivée France du système Télécom. UNIX dans les services opérationnels, par Macintosh J'ai arrété modier cette version en 1991, pour ux raisons:

13 CHAPITRE0. AVANT-PROPOS xiii 1. premièrement, j'ai écrit s adndas avec Microsoft Word ndas avaient pour but d'expliquer les modications apportées pour par Macintosh. la normalisation Ces ad- du langage. 2. uxièmement, s phrases et en j'ai modiant constitué les un polices jeu transparents caractères à partir manière ce à cours le rendre en supprimant foisprojeté.cejeutransparentsestvenumonnouveausupportcoursetjel'ai lisible une fait évoluer manière indépendante. LaTeX J'ai décidé en 1997 reconstituer ce support en utilisant LaTeX, avec plusieurs buts: 1. pourmoi,cefutuntrèsbonapprentissage LaTeX lorsque je veux rédiger un nouveau document; etilconstitueunesorteréférence 2. grâce supportsurleworldwiweb; à s outils comme LaTeX2HTML, je peux permettre aux autres consulter ce 3. j'aimesurélalimitestransparentssurtoutlorsqu'ilssontutilisésparlesélèvescomme support cours. Je etlalevéedanslarelectureetlacorrectioncesupport.jesuisaussirevable,àcernier tiens à souligner la participation active Mmes. Monget et Carpentier, Ms. Conan, Volt moult conseils relatifs à l'utilisation LaTeX2e. GnuFDL s cos En 2003, mais je aussi suis du convaincu savoir, s j'ai vertus placé ce du cours partage sous au licence travers GNU d'internet, Free Documentation non seulement Licence collèguesenseignantsfrancophones.pourl'occasion,j'enaiprottépourassocieràcesupport pour lui permettre continuer à vivre et pour faciliter son utilisation par mes quelques exercices et leurs corrigés qui étaient sur un support séparé. permettent Je tiens à enn ce cours à remercier s'améliorer. les internautes qui m'envoient s correctifs ou s remarques qui

14 xiv

15 Chapitre 1 Historique et présentation Ce chapitre essaye placer le langage C[BK78] dans son contexte historique et technique, manière à approcher l'état d'esprit du langage qui nous permet viner les règles sous-jacentes aulangagesanspourcelaavoiràlesmémoriser. 1.1 Historique Le langage C [DR78] est lié à la conception du système UNIX1 ayant inuencé son développement sont: par les Bell-Labs. Les langages lelangage BCPL le langage M.Richards1967; B CesuxlangagespartagentaveclelangageC: développé aux Bell-Labs les l'usage structures s pointeurs; contrôle; Ces la ux récursivité. vaillaient que langages sur s données prédécesseurs décrites du par C avaient un mot la machine particularité ce qui d'être leur sans donnait type. un Ils gré ne tra- portabilité nul. Le langage C comble ces lacunes en introduisant s types données tels que l'entier, ou le caractère. Les dates marquantes l'histoire du langage C 1970diusionlafamillePDP11. sont les suivantes: 1971 son mot début mémoire du travail est sur 2 octets, le langage il est C, nécessaire car le PDP pour 11 utiliser peut manipuler les fonctionnalités un octet du alors PDP11 que introduire compteparlelangageb,ellesleserontdanssonsuccesseurlec. un type donnée char et un type int. Ces notions type n'étant pas prises en 1972 M. Ritchie. la première version C est écrite en assembleur par Brian W. Kernighan et Dennis Alan Steve Snyr C. Johnson écrit un écrit compilateur et présente C le portable(thèse PCC (Portable MIT). le compilateur le plus répandu. Le PCC a longtemps assuré C sa Compiler). propre norme C'était puisqu'il à l'époque plus simple porter le PCC que réécrire un compilateur C (25 % du co du PCC était modier). à 1987 X3 J-11. début la normalisation du langage par l'ieee avec constitution d'un comité appelé: 1À l'époque UNIX était une marque déposée s laboratoires Bell. Aujourd'hui, c'est venu un nom quasiment commun :-), bien que la marque soit toujours la propriété The Open Group qui pratique s programmes certication.

16 PRÉSENTATION DU LANGAGE sortie réalisation du premier du document document nal normalisé normalisé appelé auprès norme l'iso: ANSI ISO/IEC X première révision la norme ISO/IEC 9899[ISO99]. 9899[ISO89]; B. W. Jusqu'en1987,iln'yavaitpasnorme.Lelivre"TheCProgrammingLanguage"[BK78] langageappelée Kernighan et D. M. Ritchie dénit le langage. Ce livre contient une scription précise du "C Reference [BK88]ainsiquelanormeISO[ISO89]sontàlabasececours. Manual".Celivrequialuiaussiétéremisaugoutdujouren1988 ce langage. Le livre Philippe Dax[Dax92] est lui aussi une bonne introduction pour l'apprentissage 1.2 Présentation du langage manipulent LelangageCestunlangagebasniveaudanslesensoùilpermetl'accèsàsdonnéesque langages les évolués ordinateurs tels que (bits, Fortran, octets, Pascal adresses) ou ADA. et qui ne sont pas souvent disponibles à partir 90%dunoyaudusystèmeUNIXestécritenlangageC.LecompilateurClui-mêmeestécriten LelangageCaétéconçupourl'écrituresystèmesd'exploitationetdulogicielbase.Plus gran pour les partie autres en outils langage la C chaîne ou à partir compilation d'outils générant (assembleur, du langage éditeur C [SJ78]. liens, Il pré-processeur). en est même De plus, tous les utilitaires du système sont écrits en C(shell, outils). typescientiqueouencorepourl'accèsauxbasesdonnées.parlebiaissbasesdonnées, Il est cependant susamment général pour permettre développer s applications variées il personnels, est utilisé tels dans que les Microsoft applications Word ou gestion. Microsoft De nombreux Excel, sont logiciels eux-aussi du écrits domaine à partir s ordinateurs Cousonsuccesseurorientéobjet:C++[Str86]. langage nécessaires Bien que à pouvant la conception être considéré s applications bas niveau, structurées. le langage Cette C caractéristique supporte les structures le range dans base catégorie s langages haut niveau. Il est aussi un s premiers langages orant s possibilités la plusieurs programmation modules. modulaire, Chaque module c'est-à-dire est qu'un un chier programme source que l'on langage peut C compiler peut être constitué autonomepourobtenirunchierobjet.l'ensembleschiersobjetsparticipantsàunprogramme manière doivent être associés pour constituer un chier exécutable. sait Lorsque faire le compilateur nous parlons lui-même. du langage Comme C, dans nous cette le première verrons plus partie, loin nous dans faisons la section référence 1.4, plusieurs à ce que outils gramme, interviennent en un chier dans binaire la transformation exécutable, qui d'un est ensemble le résultat chiers ce que sources, l'on appelle constituant communément un pro- la en compilation. objet, suivies Il serait la réunion plus juste s chiers dire les objets. compilations suivies par les traductions d'assembleur Le peuvent compilateur être traduites langage ecacement C se limite en aux instructions fonctionnalités machine. qui fait La directement règle fonctionnement par le compilateur du compilateur lui-même et C, ce édictée qui ne ci-ssus, peut l'être. permet Essayons détecter d'illustrer ce qui cette est règle par Le compilateur quelques exemples: puler s éléments C est binaires(bits) capable générer ou s s groupes instructions d'éléments machine binaires. qui permettent Il peut donc réaliser mani- s l'intérieur masques pour mots sélectionner machine. s groupes bits, ou encore faire s décalages bits à Il qui permet représentent les manipulations s valeurs entières algébriques ou s (addition, valeurs multiplication, décimales. etc.) groupes d'octets

17 CHAPITRE 1. HISTORIQUE ET PRÉSENTATION 3 Il permet manipuler s caractères en considérant qu'un caractère est représenté par un octetàpartirducoascii2 Ilnepermetpasmanipulerdirectementstableaux.Enparticulier,ilnepermetpar. manipuler tères. Pour directement cela, il faut les faire groupes appel à s caractères fonctions utilisés bibliothèques pour stocker dont les le chaînes nom commence carac- par str De manière comme contradictoire strcat(). collection données groupées à la (structure) règle précénte, par une le collection compilateur données accepte l'aectation type intique, d'une puislanormalisationdulangage.cecis'expliqueparlefaitqu'unestructureestconsidérée dans donnée le langage même comme type. une donnée simple, elle doit donc pouvoir être aectée à une autre ou Pour faire réaliser appel aux s fonctions opérations prédénies plus compliquées, la bibliothèque le programmeur du langage doit écrire C (voir ses propres chapitres fonctions 17). Ces fonctions sont, elles aussi, standardisées. La rédaction la norme a supprimé un 16 petit et problème 11 Digital qui Equipment venait la sur référence lequel sous-jacente ont été conçues aux les opérations premières possibles versions sur du le compilateur processeur C. du Cette PDP machine était cependant susamment générale pour que cela ne transparaisse pas. 1.3 Idées fondamentales c'est Ilestdicileprésenterlesdiérentsconceptsdulangageindépenmmentlesunssautres, chapitres pourquoi, pour n'être certains approfondis concepts, comme que plus la tard. visibilité s variables, sont abordés dans les premiers est Nous montré allons dans décrire la gure les 1.1, principales un programme composantes en C est d'un constitué programme d'un écrit ensemble en langage chiers C. Comme sources il stinés sont aussi à appelés être compilés modules séparément et ce type et à programmation subir une édition est appelé liens programmation commune. Ces chiers modulaire. sources notions visibilités associées à la programmation modulaire sont approfondies dans le chapitre Les 9. programmes Le fait pouvoir manière compiler modulaire chaque en chier regroupant, source dans manière chaque autonome chier source, amène s à concevoir fonctions s manipulent les mêmes variables ou qui participent aux mêmes algorithmes. qui appelle Chacune aussi s module. parties peut être regroupée dans un ou plusieurs chiers langage C que l'on nom Prenonspourexempleunprogrammequienregistreunesérienomsetnotesd'élèves.Chaque rang est note associé et ache à une note. cette liste Une ainsi fois la triée. saisie Puis terminée il trie la le liste programme s élèves trie par la liste ordre s alphabétique élèves par à sedécouperentroispartiescorrespondantàlagure1.1: partir leurs noms et stocke cette liste dans un chier sur disque. Ce type d'application peut la lapartiecalculquidanscecasestuntri(parnoteouparnom)(fichier2.c); partie interactive qui échange les informations avec l'utilisateur(fichier1.c; Chaque la partie chier(voir stockage s g. 1.2) données contient sur disque les éléments une fois suivants ces données dans un triées(fichier3.c). s références à s variables ou s fonctions externes (sous forme ordre quelconque: références décrivent les types s variables ou le prototype s fonctions déclarations). utilisées dans Ces module mais dénies dans d'autres modules; ce s dénitions variables globales et fonctions, qui peuvent être référencées3 dans les 2ASCII : Americans Standard Co for Information Interchange. ISO 646 :1983, Information processing - ISO 7-bit cod character set for information interchange. 3Nous verrons plus en détail l'ensemble s possibilités associées aux déclarations et aux dénitions dans les chapitres 3 et 9.

18 IDÉESFONDAMENTALES Fig. 1.1 Structure d'un programme C Fig. 1.2 Fichier source

19 CHAPITRE 1. HISTORIQUE ET PRÉSENTATION 5 Fig. 1.3 Structure d'une fonction C s autres lignes chiers; Une fonction(fig. directives 1.3) est construite compilation(pour à partir: le pré-processeur). d'une ses interface paramètres; constituée du type et du nom la fonction suivis par les types et les noms La d'unbloc,appeléaussicorpslafonction. fonction main() conçu à partir l'ensemble est particularisée, s chiers source, en ce sens commence que l'exécution par elle. du chier binaire exécutable, Unblocestconstitué: d'une s dénitions accola s ouvrante; s instructions; variables locales au bloc; Une d'une instruction accola peut fermante. être: unbloc4 ouuneexpression5 ; ou une instruction suivied'unpointvirgule( contrôle ot(test, boucle, ;); Nous parlerons en détail s possibilités du pré-processeur rupture dans le chapitre séquence) En-chaîneur passes compilation, L'étu s permet diérentes mieux actions comprendre entreprises lors quel outils ce que proviennent nous appelons les diérentes manière caractéristiques la programmation en langage C. abusive la facilement Nous prenons séparables. le cas Dans s un outils système utilisés type dans UNIX, les systèmes pour obtenir type un UNIX chier car exécutable les actions à partir sont d'unsourcec,lacommanusuelleest cc6 : cc options nom_du_fichier.c tionnement, Ces compilateurs et les options sont en cc. fait Cet s outils en-chaîneurs sert à appeler passes; les diérents nous allons utilitaires voir l'usage, nécessaires le fonc- la transformation d'un programme C en un chier exécutable. L'en-chaîneur passes à cc uvre cinq utilitaires: met en lecompilateurc,quenousappellerons le pré-processeur, que nous appellerons cpp; c0+c1 carilpeutêtredécoupéenuxparties; 4On voit apparaître une dénition récursive à l'intérieur du langage : à savoir un bloc contient s instructions qui peuvent être s blocs qui contiennent s instructions,... 5Les expressions sont explicitées dans le chapitre 5. 6cc ou tout autre compilateur comme gcc.

20 EN-CHAÎNEUR DE PASSES Fig. 1.4Schémafonctionnement cc

21 CHAPITRE 1. HISTORIQUE ET PRÉSENTATION 7 l'optimiseur l'assembleur, que co, nous appelé nommerons c2; l'éditeurliens,dontlenomlepluscourantest as; La gure1.4 donne un organigramme s diérentes ld. passes. Les chiers temporaires 1 à 3 décrits dans cette actions gure entreprises sont utilisés par par un en-chaîneur les outils pour stocker les données intermédiaires nécessaires à la traduction s diérents cos Pré-processeur pilateur. Le pré-processeur C'est un manipulateur ou pré-compilateur chaînes est un caractères. utilitaire Il qui retire traite les le parties chier source commentaires, avant le com- sont comprises entre qui /* et */. Il prend aussi en compte les lignes du texte source ayant un # première colonne pour créer le texte que le compilateur analysera. Ses possibilités sont trois en ordres(voirchap.15): inclusion dénition d'alias chiers; sélection parties et texte. macro-expressions; Compilateur dantes. Le compilateur Le compilateur lit ce lit que le texte génère source le pré-processeur une seule fois et du crée début les du lignes chier d'assembleur à la n. Cette correspon- conditionne les contrôles qu'il peut faire, et explique pourquoi toute variable ou fonction doit lecture déclarée avant d'être utilisée. être Optimiseur co sséquencesd'instructionsparsinstructionsplussophistiquéesetpropresauprocesseur.cette L'optimiseur co élimine les parties du co assembleur qui ne sont pas utiles. Il remplace opération premières versions donne un co compilateur, plus compact il est et arrivé plus que rapi. sur certaines Ensuite, machines il optimise l'optimisation les sauts. Dans crée les petits problèmes qui se résument par: après l'optimisation, le programme ne marche plus Assembleur et génère L'assembleur un chier prend en format le co relogeable. généré par Ce le compilateur, chier possè éventuellement s références modié insatisfaites par l'optimiseur, résolues par l'éditeur liens. Sur les machines utilisant un système type UNIX, ce qui chier seront suxépar est.o Éditeur liens module L'éditeur chargeable. liens Il se prend sert le bibliothèques ou les chiers pour en format résoudre relogeable les références et les indénies, associe pour en particulier créer un la bibliothèque démarrage du standard(libc.a). programme. Il utilise aussi un module spécial, crt0.o, qui contient le co dans PardéfautsurunsystèmetypeUNIX,l'éditeurlienmetlerésultatl'éditionliens un chier qu'il appelle a.out. 7De mauvaises langues prétennt que sur d'autres types système un mauvais esprit aurait osé les suxer par.obj

22 EN-CHAÎNEUR DE PASSES Quelques options cc passées. La gure1.4 Les donne un schéma fonctionnement cc, relativement aux options qui lui sont options l'enchaineur passes sont précédées d'un tiret8 les plus couramment utilisées: (-). Voici les options -c provoque la génération d'un module objet non exécutable, il s'arrête avant l'édition liens. cc -c toto.c toto.o -E lance par le.i. pré-processeur seul, cpp, qui écrit sur la sortie standard ou génère un chier suxé cc -E toto.c stdout ou toto.i -S génère suxé le par chier.s. assembleur après passage du pré-processeur et du compilateur. Le chier est cc -S toto.c toto.s -O optimise le co généré(utilisation c2). -o nom donnelenomauchierexécutableaulieu a.out. cc -o toto toto.c toto -v option bavar, cc annonce ce qu'il fait. Deux options sont utiles sur le compilateur GNU gcc correspondant à la norme ANSI: pour forcer la vérication d'une syntaxe -ansi sans avec extensions cette option le langage compilateur correspondant se comporte au C comme GNU; un compilateur langage C ANSI -pedantic ansi; cette option man au compilateur refuser la compilation programme non -Wall rencontre cette option s constructions augmente le nombre dangereuses. messages d'alerte générés par le compilateur lorsqu'il L'utilisation compilateur gcc. ces options est recommandée lors l'apprentissage du langage C en utilisant le 8Selon la tradition du système UNIX. c ChristianBac

23 Chapitre 2 Généralités sur la syntaxe C, à Ce savoir chapitre les règles introduit qui les constituent premiers concepts la syntaxe indispensables base du langage. à la compréhension Ces règles sont d'un utilisées programme les compilateurs pour déterminer si une série caractères correspond à un mot réservé, à un nom par ou à une constante. 2.1 Mise en page Leformatdutexteestlibre.Lamiseenpagen'aaucunesignicationpourlecompilateur.Elle est importante pour la lisibilité du programme. Les lignes directives pré-compilation (voir chapitre 15) commencent par un # Intiant langage. Les intiants Un intiant sont est utilisés construit pour selon donner le modèle: s noms aux diérentes entités utilisés dans le àpartirl'alphabet:a-z, A-Z, 0-9, il peut avoir jusqu'à trente et un caractères _; lation. La norme mentionne que les noms peuvent signicatifs être limités à l'intérieur à six caractères d'une unité entre compi- compilation et que les éditeurs liens peuvent ne pas tenir compte s majuscules unités minuscules. Cette contrainte n'est pas suivie par les compilateurs mornes. et ilcommenceparunelettreoulesouligné_ Espaces lexicaux caux Les qui diérents permettent intiants d'isoler les d'un noms programme selon leur en signication. langage C Les sont espaces classés lexicaux dans s utilisés espaces par lexi- compilateur C sont les suivants: un le fonctions; premier espace contient les intiants relatifs aux types synonymes, aux variables et aux le le troisième second espace espace est est réservé utilisé aux pour étiquettes les noms pour modèles les branchements structures, inconditionnels; rations; d'unions ou d'énumé- pour nomschampslastructureoul'union. chaque modèle structure ou d'union, un espace noms est créé pour contenir les

24 MOTSRÉSERVÉS Ces espaces sont isolés ce qui permet d'avoir une étiquette qui porte le même nom qu'une variable mais jamais une fonction qui porte le même nom qu'une variable. 2.2 Mots réservés Ils sont CesontlesmotsprédénisdulangageC.Ilsnepeuventpasêtreréutiliséspoursintiants. relatifs aux diérents concepts du langage: type s données char const double float int long short signed unsigned void volatile classes d'allocation auto extern register static constructeurs enum struct typef union instructions boucle do for while sélections case fault else if switch ruptures séquence break continue goto return divers asm entry fortran sizeof 2.3 Constantes pressions. Les constantes Les constantes servent dans type l'expression chaîne caractères s tailles, l'initialisation ont un statut particulier: s variables elles et dans permettent les ex- constants. constituer s tableaux caractères anonymes. Les caractères ces tableaux peuvent être variables. Nous approfondirons Voici cependant l'expression quelques exemples s constantes constantes: dans la section 3.2 qui traite s types constante constante entière: ottante: 10; caractère simple:'a'; ; chaîne caractères:"message". 2.4 Instructions Une instruction soit une instruction est: soit un instruction composée. simple, Une instruction simple est toujours terminée par un;. Les instructions composées sont contenues entre ux accolas: {}.

25 Chapitre 3 Types et variables Ce chapitre traite s dénitions variables. Dans tous les langages, une dénition variable a les rôles suivants: 1. dénir le domaine valeur cette variable(taille en mémoire et représentation machine); 2. dénir les opérations possibles sur cette variable; 3. dénir le domaine visibilité cette variable; 4. permettre une adresse à mémoire; l'environnement d'exécution du programme d'associer le nom la variable à 5. initialiser la variable avec une valeur compatible avec le domaine valeur. pointsprécéntsnuméros1et2sontassociésautypelavariable;lespoints3et4sontassociés En langage C, une variable se caractérise à partir son type et sa classe mémoire. Les à la classe mémoire la variable. L'initialisation est traitée dans la section Types base Cesontlestypesprédénisducompilateur.Ilssontaunombresix: void les c'est fonctions le type sans vi. argument Il a été introduit ou sans par retour. la norme Il joue ANSI. un rôle Il particulier est surtout dans utilisé l'utilisation pour préciser pointeurs(voir chapitre 10). s int c'est le type entier. Ce type se décline avec s qualicatifs pour préciser sa taille (long short),etlefaitqu'ilsoituniquementpositif(unsigned)oupositifetnégatif(signed) ou 1 qualicatif signed est appliqué par défaut, ainsi il n'y a pas diérence entre une variable.le type int etunevariabletype signed int. char entre-128et+127.ilestlesupportscaractèresausenscommunduterme.cescaractères cetypeesttrèsprochel'octet.ilreprésenteunentiersurhuitbits.savaleurpeutévoluer sont représentés par la table ASCII. Comme le type int le type char manièreàêtresignéounon.lanormeansiintroduituntypepermettantsupporters peut être qualié alphabets chier<stdf.h>. comprenant plus 255 signes, ce type est appelé wchar_t. Il est déni dans le float ce type sert pour les calculs avec s parties décimales. double gran c'estuntypequipermetreprésentersvaleursayantunepartiedécimaleavecuneplus précision que le type float. Comme nous le verrons dans l'expression s constantes 1Dans le cas le plus courant une variable du type entier peut contenir une valeur positive ou négative.

26 TYPES DE BASE (sec. valeurs 3.2.2) avec et parties dans décimales. les calculs(sec. 3.8), ce type est le plus courant pour représenter s long double nécessitent ce type une très est récent, gran il précision. permet représenter s nombres avec parties décimales qui Types entiers Les mots short et long d'avoirsdénitionsdutype: peuvent être utilisés seuls ou avec le mot int, donnant la possibilité short intou long manière abrégée: int.cesdénitionspeuventaussis'écrire short ou long. LelangageCconsidèrelestypes char, short int, intet long et permet les mélanger lors s calculs(5.3). int,commestypesentiers ou négatives. A priori, les Par types exemple, entiers la sont valeur signés, d'une c'est-à-dire variable du qu'ils type peuvent contenir s valeurs positives char peut évoluer entre -128 et Les types entiers peuvent être qualiés à l'ai du mot unsigned ce type à être considérées comme uniquement positives. Par exemple, la qui valeur force d'une les variables variable du type unsigned char nepeutévoluerqu'entre 0 et 255. Le qualicatif signed positives ou négatives. Il fait permet pendant d'insister au qualicatif sur le fait que la variable peut prendre s valeurs unsigned pendant à l'opérateur - unaire. comme l'opérateur + unaire fait Types avec parties décimales Commenousl'avonsdéjàdit,lestypesavecpartiesdécimalessontaunombretrois: float norme ce type ISO/IEEE sert pour 754. les calculs avec s parties décimales. Il est souvent représenté selon la double LuiaussiestsouventbasésurlanormeISO/IEEE754. ce type plus gran précision permet représenter s valeurs avec parties décimales. long double une très ce gran type précision, est récent si et la permet machine le représenter permet. s nombres avec parties décimales sur Tailles s types implantélecompilateur.lechoixestlaisséauxconcepteursscompilateurs.lesseulescontraintes L'espace qu'occupent les diérents types en mémoire dépend la machine sur laquelle est sont s inégalités non strictes, à savoir: sizeof(short) sizeof(int) sizeof(long) sizeof(f loat) sizeof(double) sizeof(longdouble) où sizeof parenthèses. est un opérateur qui donne la taille en nombre d'octets du type dont le nom est entre par La exemple taille seize l'entier bits sur est une le plus machine souvent type la taille ordinateur s registres internes la machine, c'est personnel2 machines du type station travail. et trente-ux bits sur les ISO/IEEE La taille 754. s Les variables machines ayant supportant une partie un décimale type est le plus souvent cadrée sur la norme long double diérent du type double assez rares. sont 2Pour s problèmes compatibilité avec les anciennes versions, les compilateurs pour PC génèrent le plus souvent du co compatible 386.

27 CHAPITRE 3. TYPES ET VARIABLES 13 Type PDP 11 Intel 486 Sparc Pentium Alpha Année short char 16 8 bits bits 16 8bits bits 16 8bits bits 16 8bits bits 16 8bits int 16 bits 16 bits 32 bits 32 bits 32 bits long 32 bits 32 bits 32 bits 32 bits 64 bits bits double oat bits bits bits bits bits bits bits bits bits bits long double 64 bits 64 bits 64 bits 64 bits 128 bits Tab. 3.1Longueurstypesbasesurquelquesmachines taillessuivantesennombrebits:16(decpdp11,intel486),32(sunsparc,intelpentium)et Le tableau 3.1 donne quelques exemples tailles pour s machines dont les registres ont les 64(DEC pour alpha Alpha). utilise Vous s entiers remarquerez sur 32 que bits. malgré Il est aussi son architecture le seul processeur interne capable 64 bits, diérencier le compilateur les double s long doubles. 3.2 Constantes associées aux types base Les constantes sont reconnues par le compilateur grâce à l'utilisation caractères qui ne participent pas à la construction d'un intiant Constantes type entier expriméesenbasedixmaispeuventêtreexpriméesenbasehuit(octal)lorsquelepremiercaractère Les constantes type entier sont construites à partir chires. Elles sont naturellement est un 0 ou en base seize lorsque les ux premiers caractères sont 0X (hexadécimal). Une constante est a priori du type int plus grand entier représentable. Si la valeur si le la nombre constante qu'elle est supérieure représente au est plus plus grand petit que entier le représentable, la constante vient du type long. Lesconstantespeuventêtresuxéesparunl oul pourpréciserqueleurtypeassociéest long int. Les constantes peuvent être précédées par un signe - ou +. signe(qualiées Elles peuvent unsigned). être suxées par un u ou U pour préciser qu'elles expriment une valeur sans Voici constantesansprécisiontype: quelques exemples constantes type entier: 0377 octal 0X0FF hexadécimal 10 décimal -20 décimal constante longue entière: L, 0364L, 0x1faL l, 0364l, 0x1fal U, 0364U, 0x1faU constante entière non signée:

28 CONSTANTES ASSOCIÉES AUX TYPES DE BASE u, 0364u, 0x1fau UL, 0364UL, 0x1faUL, 120uL, 0364uL, 0x1fauL Ul, 0364Ul, 0x1faUl, 120ul, 0364ul, 0x1faul constante longue entière non signée: Constantes avec partie décimale Lesconstantesavecpartiedécimaleontletype double à partir d'une notation utilisant le point décimal ou à partir pardéfaut.ellespeuventêtreexprimées d'une notation exponentielle. valeur Ces constantes type float. peuvent être suxées par un f ou F pour préciser qu'elles représentent une Elles peuvent même être suxées par un l ou un L pour exprimer s valeurs type long double. Voici quelques constantes avec partie décimale: double. constante exprimée avec la notation utilisant le point décimal, son type implicite est 12134e-2 la même constante exprimée en notation exponentielle E-2 la notation exponentielle accepte le E majuscule, et le + un-aire f constante valeur intique mais type float car suxée par f l constante valeur intique mais type long double car suxée par l Constantes type caractère Les constantes du type caractère simple sont toujours entourées d'apostrophes (single Elles peuvent être représentées selon quatre méthos: quote). 1. lorsque trophe, le le caractère caractère est correspondant disponible au est clavier simplement sauf pour entouré la barre d'apostrophes, fraction inversée par exemple et l'apos- 'a'. 2. uncaractèrepeutaussiêtrereprésentéparsavaleurexpriméedanslatableasciienutilisant une barre notation fraction en base inversée. huit. Cette valeur est précédée à l'intérieur s apostrophes par une '\0' :octetdunul,ilsertàdélimiterlesnschaînescaractères. '\012' :sautligne(line Feed,LF); '\015' retour chariot(carriage Return, CR); '\011' : tabulation horizontale(horizontal Tabulation, HT); 3. même,uncaractèrepeutêtrereprésentéparsanotationenbaseseize. '\x0' :caractèrenul; '\xa' :sautligne(lf); '\xc' :retourchariot(cr); '\x9' : tabulation horizontale(ht); 4. un certain nombre d'abréviations est aussi disponible: '\a' :alert(sonnerie,bel); '\b' :backspace(bs); '\f' :sautpage(ff); '\n' :sautligne(lf);

29 CHAPITRE 3. TYPES ET VARIABLES 15 Fig. 3.1 Chaîne caractères constante '\r' :retourchariot(cr); '\t' : tabulation horizontale(ht); '\v' : tabulation verticale(vt); L. Pour Par exemple, spécier qu'une constante caractère est du type (wchar_t), elle doit être précédée d'un L'a' est la constante type caractère long contenant le caractère a Chaînes caractères Les constantes du type chaîne caractères doivent être mises entre guillemets(double Lecompilateurgénèreunesuited'octetsterminéeparuncaractèrenul(touslesbitsà0)àpartir quote). s une caractères zone mémoire contenus en dans lecture la chaîne. seulement. Cette suite d'octets peut être placée par le système dans du tableau. La zone correspondante Par exemple, la est chaîne en fait caractères un tableau char. La chaîne est référencée par l'adresse "message" leschémalagure3.1. est générée par le compilateur selon 3.3 Qualicatifs Nous avons déjà parlé s qualicatifs unsigned et signed type entier. Il existe d'autres qualicatifs qui ont été spéciés par qui s'appliquent la norme. Il aux s'agit variables const, volatile, static et register. Une dénition variable qualiée du mot const considérée comme constante et ne doit pas être utilisée informe dans la le partie compilateur gauche que d'une cette aectation. variable Ce est type en lecture dénition seulement autorise à l'exécution. le compilateur à placer la variable dans une zone mémoire accessible Le qualicatif volatile une zone mémoire qui peut informe être le modiée compilateur par d'autres que la variable parties correspondante du système que est le programme placée dans lui-même. la variable. Ceci Ce supprime type variable les optimisations sert à décrire faites s par zones le compilateur mémoire lors partagées l'accès entre en lecture plusieurs programmes machine. ou encore s espaces mémoires correspondant à s zones d'entrée-sorties la pas Les modiée ux qualicatifs par la partie peuvent correspondante être utilisés du sur programme la même mais variable, par l'extérieur. spéciant que la variable n'est Les qualicatifs static et register sont décrits dans la section Taille et normalisation uxchiers: Les tailles s types entiers et avec partie décimale sont dénies sur chaque machine à partir limits.h pour les types entiers; float.h pour les types avec partie décimale.

30 DÉFINITION DE VARIABLES etvaleursmaximalesstypesbaseetstypesnonsignés. Ces chiers contiennent s dénitions qui s'adressent au pré-compilateur et donnent les tailles Le programme 3.1 est un exemple chier <limits.h> chier <float.h>. et le programme 3.2 est un exemple Programme 3.1 Exemple chier limits.h /* Number of bits in a char. */ #fine CHAR_BIT 8 /* No multibyte characters supported yet. */ #fine MB_LEN_MAX 1 /* Min and max values a signed char can hold. */ #fine SCHAR_MIN (-128) #fine SCHAR_MAX 127 /* Max value an unsigned char can hold. (Min is 0). */ #fine UCHAR_MAX 255U /* Min and max values a char can hold. */ #fine CHAR_MIN SCHAR_MIN #fine CHAR_MAX SCHAR_MAX /* Min and max values a signed short int can hold. */ #fine SHRT_MIN (-32768) #fine SHRT_MAX /* Max value an unsigned short int can hold. (Min is 0). */ #fine USHRT_MAX 65535U /* Min and max values a signed int can hold. */ #fine INT_MIN (-INT_MAX-1) #fine INT_MAX /* Max value an unsigned int can hold. (Min is 0). */ #fine UINT_MAX U /* Min and max values a signed long int can hold. */ #fine LONG_MIN (-LONG_MAX-1) #fine LONG_MAX /* Max value an unsigned long int can hold. (Min is 0). */ #fine ULONG_MAX U La normalisation a aussi introduit un ensemble types prédénis comme size_t qui est le type la valeur retournée par l'opérateur sizeof. Les dénitions exactes ces types sont dans le chier <stdf.h>. Le programme 3.3 est un extrait d'un exemple chier <stdf.h>. 3.5 Dénition variables Nousappellerons intiant ce que nous avons dit dans l'introduction soitunnomfonction,soitunnomvariable.pourcompléter associésàla ce chapitre, voici comment les diérents besoins dénition variablessontcouvertsparlelangage C : dénition du domaine valeur = grâceautype. cette variable et les opérations légales sur cette variable;

31 CHAPITRE 3. TYPES ET VARIABLES 17 Programme 3.2 Exemple chier float.h /* Float finitions */ #fine FLT_MANT_DIG 24 #fine FLT_EPSILON e-07f #fine FLT_DIG 6 #fine FLT_MIN_EXP -125 #fine FLT_MIN e-38f #fine FLT_MIN_10_EXP -37 #fine FLT_MAX_EXP 128 #fine FLT_MAX e+38f #fine FLT_MAX_10_EXP 38 /* Double finitions */ #fine DBL_MANT_DIG 53 #fine DBL_EPSILON e-16 #fine DBL_DIG 15 #fine DBL_MIN_EXP #fine DBL_MIN e-308 #fine DBL_MIN_10_EXP -307 #fine DBL_MAX_EXP 1024 #fine DBL_MAX e+308 #fine DBL_MAX_10_EXP 308 Programme 3.3 Exemple chier stdf.h typef long ptrdiff_t; typef unsigned long size_t; typef int wchar_t; réservation l'espace = grâceautypeetàlaclassemémoire. nécessaire au support la variable lors l'exécution; initialisation la variable riable; à l'ai d'une constante dont le type correspond à celui la va- = en faisant suivre le nom par un symbole d'aectation = la variable. et une valeur compatible avec association d'une durée vie programme(règles visibilité). à la variable qui permet l'utilisation dans certaines parties du = grâceàlaclassemémoireetaulieudénition. classemémoire.la Une dénition variable est l'association d'un intiant à un type et la spécication d'une classe mémoire en machine. Nous approfondirons les sertàexpliciterlavisibilitéd'unevariableetsonimplantation sur la visibilité. Les possibilités associées aux classes mémoire dans le chapitre 9 classes mémoire sont: global accessibles cette classe à toutes est celle les fonctions. s variables La durée dénies en vie hors s variables d'une fonction. type global Ces variables est la même sont que celle du programme en cours d'exécution. local ou toute auto: variable cette classe dénie comprend à l'intérieur l'ensemble d'une fonction. s variables L'espace dénies mémoire dans réservé un bloc. pour C'est ce le type cas variable est alloué dans la pile d'exécution. C'est pourquoi elles sont appelées aussi auto c.a.d automatique car l'espace mémoire associé est créé lors l'entrée dans la fonction et

32 TYPES DÉRIVÉS DES TYPES DE BASE Déclaration/dénition Classe mémoire int a; dénition d'une variable globale int main (int argc, paramètres passés dans la pile, char *argv[]) donc automatiques { int b; dénition d'une variable locale à main donc automatique static char c[50]; variable locale à main mais implantée avec les globales } extern int b; déclaration d'une variable qui est dénie dans un autre chier int (rien à voir la variable b main), variable globale externe coucou(const int c) paramètre constant, variable locale { lafonctioncoucous'engageànepasmodierc volatile char c; variable locale volatile register int a; variable locale à coucou, à mettre en registre si possible if (b == 1) référenceàlavariablebexterne } Tab. 3.2 Variables et classes mémoire il celle est détruit la fonction lors dans la sortie laquelle la elles fonction. sont dénies. La durée vie s variables type local est static dans ce qualicatif le cas d'une modie variable la visibilité locale il modie la variable, son implantation ou son implantation: l'espace mémoire globale pour cette variable. Une variable en locale attribuant type une statique partie a un danslecasd'unevariableglobale,ceprédicatrestreintlavisibilitédunomlavariable nomlocalmaisauneduréevieégaleàcelleduprogrammeencoursd'exécution. à par l'unité un autre compilation. chier source Une participant variable au globale même programme type statique par une ne peut référence pas être avec utilisée réservé le mot extern (voir point suivant). extern dénition ce qualicatif mais une permet spécier que la ligne correspondante n'est pas une tentative déclaration quisontdéniesdansunautrechiersourceetquisontutiliséesdanscechiersource. (voir 3.9). Il précise les variables globales (noms et types) register le reste ce qualicatif la ligne permet sont utilisées d'informer souvent. le compilateur Le prédicat que man les variables les locales mettre dénies si possible dans dans nombre s registres registres disponibles disponibles du pour processeur telles manière mans à optimiser est variable le temps selon les d'exécution. machines. Le esttoutefaçonlimité(4pourlesdonnées,4pourlespointeurssurun680x0).seulesles Il variables locales peuvent être qualiées register. Le tableau 3.2 donne quelques exemples dénitions et déclarations variables. 3.6 Types dérivés s types base Untypedérivéestcrééàpartirstypesbasevusprécémmentpourl'usagepropreàun programme. Les types dérivés sont les tableaux, les structures et les pointeurs Tableaux et structures Les tableaux sont s paquets données même type. Ils sont reconnus par la présence crochets ouvrants et fermants lors la déclaration ou la dénition l'objet. La taille du

33 CHAPITRE 3. TYPES ET VARIABLES 19 tableau lerangsélémentsdutableaunepeutévoluerqu'entre0etlatailledutableau-1. est donnée entre les crochets lors la dénition. Pour simplier le travail du compilateur, types Les diérents. structures Les sont structures s ensembles sont déclarées données ou dénies non homogènes. selon le modèle: Les données peuvent avoir s struct un nom structure facultatif { la liste s données contenues dans la structure } Prenons la liste pour s variables exemple les construites dénitions selon suivantes: ce modèle. int tab[10]; struct st1 { int a1; float b1; long c1; } objst1; Danscetexemple: 1. tab est un tableau 10 entiers, et les éléments du tableau sont référencés par tab[0] jusqu'à tab[9]; 2. st1 est un nom modèle structure et objst1 est un objet type struct diérentes parties la structure st1. Les objst1 sont accessibles par objst1.a1, objst1.b1 objst1.c1. et Les tableaux et les structures sont parfois appelés agglomérats données Pointeurs Le pointeur sant la taille estunevariablestinéeàconteniruneadressemémoire.lecompilateurconnais- pointeur. Un pointeur l'espace est reconnu adressable syntaxiquement la machine, par il l'étoile(symbole sait la taille nécessaire la multiplication pour contenir *) qui un précé son nom dans sa dénition. grâce Toutpointeurestassociéàuntyped'objet.Cetypeestceluisobjetsquisontmanipulables manipuler au pointeur. s tableaux Ce type à partir est utilisé pointeurs(voir en particulier Chap. lors s 10). calculs d'adresse qui permettent Prenons les dénitions suivantes: int *ptint; char *ptchar; Dans cet exemple, ptint est une variable du type pointeur sur un entier. Cette variable peutdonccontenirs3 valeursquisontsadressesvariablesdutypeentier(int). De même, ptchar s valeurs qui sont s est adresses une variable variables du type pointeur type caractère(char). sur un caractère. Elle peut donc contenir conditionne Le compilateur les opérations C vérie arithmétiques(voir le type s adresses chap. mises 9 pointeurs dans un et pointeur. tableaux) Le sur type ce pointeur. du pointeur Les opérations les plus simples sur un pointeur sont les suivantes: 3Une valeur à la fois mais comme le pointeur est une variable cette valeur peut changer au cours l'exécution du programme.

34 INITIALISATION DE VARIABLES aectation utilisation du d'une pointeur adresse pour au pointeur; Sil'ondénitlesvariableslamanièresuivante: accér à l'objet dont il contient l'adresse. int in; int tabint[10]; char car; int *ptint; char *ptchar; associé Un pointeur au pointeur. peut Comme être aecté nous avec le verrons l'adresse dans d'une la variable partie sur ayant les un opérateurs, type qui correspond le é-commercial à celui & donne du premier l'adresse élément du nom du tableau. variable Les pointeurs qui le suit précénts et les noms peuvent tableau donc être corresponnt aectés à la l'adresse suivante: manière ptint = &in; ptc = &car; accér Une aux fois cases un pointeur mémoires aecté correspondant avec l'adresse à la d'une variable(valeur variable, ce pointeur la variable): peut être utilisé pour *ptint = 12; *ptc = 'a'; La première instruction met la valeur entière 12 dans l'entier in; la uxième instruction met le caractère a minuscule dans l'entier car. tableau. Il est Ainsi possible les lignes: réaliser ces opérations en utilisant le pointeur pour accér aux éléments du ptint=tab; *ptint=4; aectentlepointeurptint avecl'adressedupremierélémentdutableau tabint équivalent(comme nous le reverrons dans le chapitre sur pointeurs et tableaux 10) à &tabint[0]; puis le premier élément du tableau(tabint[0]) est aecté avec la valeur Initialisation variables L'initialisation se dénit comme l'aectation d'une valeur lors la dénition la variable. tion Toute mais modication une aectation. valeur d'une variable postérieure à sa dénition n'est pas une initialisa- avec Par la défaut, valeur qui les variables correspond à type tous global les bits (dénies à zéro en (0 hors pour un toute entier fonction) ou 0.0 pour sont un initialisées à virgule ottante). Les variables locales, quant à elles ne sont pas initialisées avec s nombre par défaut. Vous veillerez donc à les initialiser pour vous prémunir contre le risque d'utiliser valeurs variable sans en connaître la valeur initiale. Sur les compilateurs anciens, pour les variables une type tableau ou structure, seules les variables globales pouvaient être initialisées. Il est possible réaliser s initialisations selon trois techniques suivant le type la variable: 1. danslecasd'unevariablesimple,ilsutfairesuivreladénitiondusigneégal(=)et lavaleurquel'onveutvoirattribuéeàlavariable.

35 CHAPITRE 3. TYPES ET VARIABLES 21 int i 10; Entieriinitialiséà10 int j = 12, entiersjinitialiséà12; k = 3, l; kinitialiséà3etlnoninitialisé. int *p1 = &i; Pointeur d'entier initialisé à l'adresse i char d = '\n'; Caractère initialisé à la valeur du retour chariot. float tf[10] = { Tableau dix ottants dont les quatre premiers 3.1, 4.5, 6.4, sont initialisés à }; et9.3,lesautressontinitialisésà0.0. char t1[10] = Tableau 10 caractères initialisé avec les caractères "Coucou"; 'C' 'o' 'u' 'c' 'o' 'u' '\0' Les initialisés trois rniers avec la valeur caractères '\0'. sont aussi struct tt1{ modèle structure contenant int i; un entier, float j; un ottant, char l[20]; et un tableau 20 caractères. } obst = { variable(obst)dutype struct tt1, 12, avec le premier champ(obst.i) initialisé à 12, 3.14, le uxième champ(obst.j) initialisé à 3.14, "qwertyuiop" }; et le la troisième chaîne"qwertyuiop" champ(obst.l) initialisé à partir char t2[] = Tableau caractères initialisé avec la chaîne "bonjour"; "bonjour". selonlenombrecaractères+1(pourlenul). La taille du tableau est calculée char t3[10] = { 'a', Tableau10caractèresdontles5premierssont 'b','c','d','e'}; initialisés. const char *p3 = Pointeur sur un caractère initialisé à l'adresse "Bonjour les"; la dans chaîne une zone caractères mémoire constante. accessible La en chaîne lecture peut seulement. être mise Tab. 3.3 Exemples d'initialisations 2. dans d'une le accola cas tableaux ouvrante ou et structures, la série il faut valeurs faire terminée suivre la par dénition une accola du signe fermante. égal suivi valeurs sont séparées par s virgules. Elles doivent correspondre aux éléments du tableau Les ou inférieur la structure. au nombre La d'éléments norme préconise à initialiser, que lorsque les rniers le nombre éléments valeurs soient d'initialisation initialisés avec est valeur nulle correspondant à leur type. la 3. les caractères tableaux la caractères châine sont peuvent considérés être comme initialisés constants. à partir d'une chaîne caractères. Les Le tableau 3.3 donne s exemples d'initialisation. 3.8 Conversion type Le compilateur La conversion fait type lui-même est un s outil conversions très puissant, lors elle l'évaluation doit donc s être expressions. utilisée avec Pour prunce. applique s règles conversion implicite. Ces règles ont pour but la perte du minimum d'information dans l'évaluation l'expression. Ces règles sont décrites dans l'encart ci-ssous. cela il

36 CONVERSION DE TYPE float f; double d; int i; long li; li = f + i; iesttransforméenoatpuisadditionnéàf, lerésultatesttransforméenlongetrangédansli. d = li + i; iesttransforméenlongpuisadditionnéàli, lerésultatesttransforméendoubleetrangédansd. i = f + d; festtransforméendouble,additionnéàd, lerésultatesttransforméenintetrangédansi. Tab. 3.4 Exemples conversion implicite Règle Conversion Implicite Convertir dans le type les éléments la variable la ou partie la droite constante d'une le expression plus riche. d'aectation Faire Puis convertir les opérations le résultat calcul dans dans le type ce type. la variable aectée. calcul La d'une notion expression richesse à ux d'un opérans type est précisée doit se faire dans est la norme donné par [ISO89]. les règles Le type suivantes: dans lequel le 1. sil'unsuxopéransestdutype long doublealorslecalculdoitêtrefaitdansletype long double; 2. sinon, si l'un s ux opérans est du type double type double; alors le calcul doit être fait dans le 3. sinon,sil'unsuxopéransestdutype float; floatalorslecalculdoitêtrefaitdansletype 4. sinon,appliquerlarèglepromotionenentier,puis: (a) sil'unsuxopéransestdutype unsigned long dans ce type; intalorslecalculdoitêtrefait (b) si l'un s ux opérans est du type long int type alors le calcul doit être fait dans le long int; (c) sil'unsuxopéransestdutype unsigned int letype alorslecalculdoitêtrefaitdans unsigned int; (d) sil'unsuxopéransestdutype intalorslecalculdoitêtrefaitdansletype int Conversions implicites étaient Le C promues selon la lors rédaction s appels Kernighan fonction. et Cette Ritchie règle décrivait porte d'une la façon part avec sur les laquelle nombres les variables ottantequisonttransfomésen double,etd'autrepartsurtouslestypesentierdontlatailleest à virgule plus dans petite une expression, que l'entier les naturel. valeurs Les ces variables variables ou ou les constantes constantes sont s transformées types suivants en leur sont équivalent utilisées en champs entier avant bits et s faire énumérations les calculs. Ceci la même permet façon d'utiliser que s s entiers. caractères, Le principe s entiers permet courts, d'utiliser s àlaplaced'unentier: scaractèresetsentierscourtssignésounonsignés; Des schampsbitsetsénumérationssignésounonsignés. exemples conversions implicites sont donnés dans le tableau3.4. avant Il est possible l'utiliser par forcer une conversion la conversion implicite. d'une variable Cette opération (ou d'une est expression) appelée cast. dans un Elle autre se réalise type lamanièresuivante:

37 CHAPITRE 3. TYPES ET VARIABLES 23 (type) expression Prenonspourexemplel'expression: i = (int) f + (int) d; fetdsontconvertisenint,puisadditionnés.lerésultatentierestrangédansi. Ilpeutyavoirunediérenceentre i = f + d ; et i = (int) f + (int) d ; du fait la perte s parties fractionnaires. 3.9 Déclaration et dénition la diérence Maintenant entre que déclaration nous connaissons et dénition. les diérents Cette diérence types du sera langage vue C, manière nous pouvons approfondie introduire le chapitre 9. Nous appellerons: dans la déclaration : contient une association aussi le type type s avec arguments un nom la variable fonction, ou les fonction noms s (dans arguments ce cas peuvent être omis), dénition pour cette variable, : une déclaration si c'est une et si fonction c'est une la dénition variable, une du corps man fonction d'allocation contenant d'espace instructions associées à cette fonction. les De programme.ellepeutsetraduireparjesaisqu'ilexisteunevariableayantcetypeetportantce manière simpliste, une déclaration fait référence à une dénition dans une autre partie du nom Exercices sur les types et variables Exercice 1 Dans chaîne un chier 10 caractères appelé exo1.c, globale déclarer et statique; les variables suivantes: tableau pointeur sur 10 caractère entiers global; ottant local; local en registre; caractère entier nommé local ex statique; Dans la fonction main(), externe. faire écrire les adresses s variables. Compileravec:gcc -c exo1.c Dans un uxième chier appelé exo1bis.c mettre la dénition l'entier ex liserez avec la valeur 20. que vous initia- Compilerceuxièmechierlamêmemanière: gcc -c exo1bis.c Fairel'éditionlienspar:gcc -o exo1 exo1.o exo1bis.o Exercice 2 Dans un chier appelé exo2.c, déclarer les variables suivantes: unentierglobalinitialiséà10; un tableau 10 caractères global initialisé à "bonjour";

38 EXERCICES SUR LES TYPES ET VARIABLES Programme 3.4 Suggestion corrigé chapitre 3 exercice 1 1 static char chaine[10]; 2 int tableau[10]; 3 extern int ex; 4 int 5 main (int argc, char *argv[], char **envp){ 6 register char *pointeur; 7 float local; 8 static char car; 9 return 0; 10 } Programme 3.5 Suggestion corrigé chapitre 3 exercice 1 second chier 1 2 int ex = 20; un pointeur sur caractère initialisé à l'adresse du premier élément du tableau. Compiler, messages d'erreurs. essayer mettre l'adresse l'entier dans le pointeur caractère et regarz les programmes,faireécrireletableauàpartirsonnometaveclepointeur. Une fois que vous aurez lu le chapitre 4 sur les éléments bases pour réaliser les premiers Programme 3.6 Suggestion corrigé chapitre 3 exercice 2 1 /* claration s variables globales */ 2 int global = 10; 3 char tableau[10] = "bonjour"; 4 int 5 main (int argc, char *argv[], char **envp){ 6 char *pt = tableau; /* ou pt = & tableau[0] */ 7 pt (char *) &global; /* adresse l entier dans le pointeur char */ 8 pt = tableau; /* adresse du tableau dans le pointeur */ 9 printf("%s\n", tableau); 10 printf("%s\n", pt); 11 return 0; 12 } Données écrites sur le fichier standard sortie bonjour bonjour Exercice 3 Déclarer: unentier unottant i; un pointeur f; unpointeursurentier sur caractère pti; ptc; un tableau d'entier ti;

39 CHAPITRE 3. TYPES ET VARIABLES 25 Réaliser untableaucaractères les opérations suivantes: tc. i f; f = i; pti = 0; ptc pti; pti tc; ptc = ti. Compiler. Faire les"casts" nécessaires à une compilation sans erreurs. Programme 3.7 Suggestion corrigé chapitre 3 exercice 3 1 int 2 main (int argc, char *argv[], char **envp){ 3 /* clarations s variables */ 4 int i; 5 float f; 6 char *ptc; 7 int *pti; 8 int ti[10]; 9 char tc[10]; 10 /* affectations s variables */ 11 i f; 12 f = i; 13 pti 0; 14 ptc (char *) pti; 15 pti (int *) tc; 16 ptc = (char *) ti; 17 return 0; 18 } Exercice 4 Dénir les variables: i entier f ottant l long c caractère tc en les tableau initialisant caractères. la manière suivante: i àlavaleurhexadécimale50; f a3.14; l àlavaleuroctale40; c àz; tc à"qwertyuiop".

40 EXERCICES SUR LES TYPES ET VARIABLES Programme 3.8 Suggestion corrigé chapitre 3 exercice 4 1 int 2 main (int argc, char *argv[], char **envp){ 3 /* claration et initialisation s variables */ 4 int i = 50; 5 float f = ; 6 long l 040L; 7 char c = 'z'; 8 static char tc[] = "qwertyuiop"; 9 return 0; 10 }

41 Chapitre 4 Eléments base grammes Le langage écrits C en est langage utilisé C dans font un s contexte échanges interactif. d'information Ce qui avec veut un dire utilisateur que la plupart du programme. s pro- celle Biensûr,lelangageCestunlangagesannées70etl'idéel'interactionavecl'utilisateurest via une s voie systèmes d'entrée-sortie centralisés qui à temps permet partagé. d'échanger Un utilisateur s caractères. ce type Ces voies système sont la est plupart connecté temps reliées à un télétype(écran, clavier, avec sortie optionnelle sur papier). Les caractères sont du écritssurl'écranduterminaletlusàpartirduclavier. Càpartirschiersstandardd'entréeetsortie. CemodèleécranclavierquiestreprisparlesystèmeUNIXestceluisinteractionsenlangage mais Les elles entrée-sorties sont réalisées en à langage travers C s ne fonctions sont pas prises bibliothèque. en charge Le directement compilateur par ne le peut compilateur contrôle cohérence dans les arguments passés à ces fonctions car ils sont type pas variable. faire Ceci explique l'attention toute particulière avec laquelle ces opérations doivent être programmées. 4.1 Bonjour pond Le à premier la question programme suivante que : comment tout un écrire chacun un programme écrit lorsqu'il principal apprend qui un imprime nouveau Bonjour? langage ré- programme est donné dans la gure 4.1. Ce Ilestconstituélamanièresuivante: la chier première représentant ligne est l'interface une directive standard pour s le entrées pré-processeur sorties. Le qui contenu man à ce celui-ci chier est décrit lire le Fig. 4.1 Programme qui écrit Bonjour

42 LIRE ET ÉCRIRE modulefaisantappelàsfonctionsd'entréessortiesetenparticulierauxfonctions manière approfondie dans le chapitre 16. Cette première ligne doit être présente dans tout printf() iln'yapasvariableglobale; et scanf(); le programme contient une seule fonction main() Cette fonction est utilisée sans argument; qui joue le rôle programme principal. la dénition la fonction main() ouvrante; commence comme pour toute fonction par une accola ellenecontientpasvariablelocale; la Cette seule instruction instruction est correspond une man à un d'écriture appel fonction d'une chaîne qui provoque caractères; l'écriture sur le terminal. la fonction main() Lafonction est terminée par une accola fermante. printf()1 estunefonction 2 ments sont transformés en une chaîne caractères. quireçoitunnombred'argumentsvariable.cesargu- format.commenousleverronsplusloin,leformatdénitletypeladonnéeenmémoireet Cette transformation fait appel à une notion le mo représentation la donnée lorsqu'elle est achée. 4.2 Lire et écrire Une fonction scanf() fait le pendant à la fonction printf(). Elle permet lire s valeurs surleclavier.leprogramme4.1estunexemplelectureetd'écritureàl'écrand'unechaîne caractères. Programme 4.1 Lecture et écriture chaîne par scanf() et printf() 1 #inclu <stdio.h> 2 char tt[80]; /* Tableau 80 caracteres */ 3 int 4 main (int argc, char *argv[]) 5 { 6 printf ("ecrivez une chaine caracteres : "); 7 scanf ("%s", tt); 8 printf ("\nla chaine entree est : %s\n", tt); 9 return 0; 10 } Données en entrée bonjour Données écrites sur le fichier standard sortie ecrivez une chaine caracteres : La chaine entree est : bonjour Ce programme ne décrit toujours pas les arguments main(). Il contient cependant la dénition d'une variable globale. Cette variable est un tableau quatre-vingt caractères stiné à 1La fonction printf() fait partie la bibliothèque standard. Sur un système type UNIX, l'interface qui décrit cette fonction est contenue dans le chier stdio.h et le module objet correspondant est contenu dans le chier libc.a. Ces chiers sont stockés dans s parties l'arborescence qui dépennt l'installation du compilateur (voir chap. 16). Le chier stdio.h est utilisé lors la compilation pour vérier la cohérence d'utilisation s fonctions. Le module objet est associé au programme lors l'édition liens (chap. 1). 2La notion fonction sera explicitée au chapitre 5.

43 CHAPITRE 4. ELÉMENTS DE BASE 29 %d entier décimal %f ottant %c caractère(1 seul) %s chaîne caractères Tab. 4.1 Conversions usuelles printf et scanf recevoir sont les appels les caractères aux fonctions lus au clavier. lecture Il n'y et a toujours pas variable locale. Les seules instructions d'écriture(scanf() et printf()). 4.3 Quelques opérations Les aectations peuvent être écrites comme dans nombreux autres langages informatiques. En voici quelques exemples: + * b / c ; a = b - c ; 4.4 Plus sur printf() et scanf() Les fonctions printf() et scanf() chaîne caractères (vision humaine) transforment en une représentation s objets manipulable d'une représentation par la machine à partir (vision d'une machine), formats qui et décrivent vice et versa. le type Pour s objets réaliser manipulés ces transformations (vision interne) ces fonctions et la représentation sont guidées en par chaîne s caractères cible(vision externe). Par exemple, un format du type %x variableestdutypeentieretd'autrepartquelachaînecaractèresquilareprésenteestexprimée signie d'une part que la en base 16(hexadécimal). Pour printf(), un format est une chaîne caractères dans laquelle sont insérés les caractères représentant la ou les variables à écrire. Pour scanf(), un format est une chaîne caractères qui décrit la ou les variables à lire. Pour chaque variable, un type conversion est spécié. Ce type conversion est décrit par les caractères qui suivent le caractère %. Les types conversion les plus usuels sont donnés dans la table4.1. conversiondansleformatlecture.lelecteurcurieuxpeutsereporteràlasection16.5. Dans une première approche scanf(), nous considérons qu'il ne faut mettre que s types manipulations Le tableau 4.2 pour donne un résumé s déclarations variables et s formats nécessaires à leurs printf et scanf. Le & être mis est vant un opérateur le nom du la langage variable, C dans dont nous les formats parlons stinés dans la à section la fonction 5.1. Cet scanf, opérateur comme doit montreletableau4.2,pourlesvariablesdontnousavonsdéjàparlésaufpourlesvariablesdutype le tableau caractères. d'un Les tableau exemples correspond lecture au d'une nom chaîne tableau, caractères nous en reparlerons montrent que dans l'adresse le chapitre du premier 10. élément

44 PLUS SUR PRINTF() ET SCANF() déclaration lecture écriture format externe int i; scanf("%d",&i); printf("%d",i); décimal int i; scanf("%o",&i); printf("%o",i); octal int i; scanf("%x",&i); printf("%x",i); hexadécimal unsigned int i; scanf("%u",&i); printf("%u",i); décimal short j; scanf("%hd",&j); printf("%d",j); décimal short j; scanf("%ho",&j); printf("%o",j); octal short j; scanf("%hx",&j); printf("%x",j); hexadécimal unsigned short j; scanf("%hu",&j); printf("%u",j); décimal long k; scanf("%ld",&k); printf("%ld",k); décimal long k; scanf("%lo",&k); printf("%lo",k); octal long k; scanf("%lx",&k); printf("%lx",k); hexadécimal unsigned long k; scanf("%lu",&k); printf("%lu",k); décimal float l; scanf("%f",&l); printf("%f",l); pointdécimal float l; scanf("%e",&l); printf("%e",l); exponentielle float l; printf("%g",l); la s plus ux courte double m; scanf("%lf",&m); printf("%f",m); point décimal double m; scanf("%le"&m); printf("%e",m); exponentielle double m; printf("%g",m); la plus courte long double n; scanf("%lf"&n); printf("%lf",n); point décimal long double n; scanf("%le"&n); printf("%le",n); exponentielle long double n; printf("%lg",n); la plus courte char o; scanf("%c",&o); printf("%c",o); caractère char p[10]; scanf("%s",p); printf("%s",p); chaîne caractères scanf("%s",&p[0]); Tab. 4.2Exemples printf et scanf

45 CHAPITRE 4. ELÉMENTS DE BASE 31 Leprogramme4.2,montrequ'ilestpossiblefairel'écritureoulalectureplusieursvariables en utilisant une seule chaîne caractères contenant plusieurs scriptions formats. Programme 4.2 Lectures multiples avec scanf() 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) 4 { 5 int i = 10; 6 float l = ; 7 char p[50] = "Bonjour"; 8 printf ("%d bonjour %f %s\n", i, l, p); 9 scanf ("%d%f%s", &i, &l, p); 10 printf ("Apres lecture au clavier : %d %f %s\n", i, l, p); 11 return 0; 12 } Données en entrée salut Données écrites sur le fichier standard sortie 10 bonjour Bonjour Apres lecture au clavier : salut 4.5 Exercices sur printf() et scanf() Exercice 1 Réaliser un programme dans un chier contenant une fonction main() suivantes: qui réalise les écritures écrire écrire le la caractère'a'; écrirel'entier32567danslesformats: chaîne caractères"bonjour"; décimal; hexadécimal; octal; écrire nonsigné; notation le ottant exponentielle; dans les formats suivants: notation variable(g). avec point décimal; Exercice 2 Reprendre l'exercice 1 en séparant chaque impression par un retour chariot Exercice 3 Déclarer s variables s types suivants:

46 EXERCICES SUR PRINTF() ET SCANF() Programme 4.3 Suggestion corrigé chapitre 4 exercice 1 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[], char **envp){ 4 /* ecriture a bonjour hexa octal non signe */ 5 printf("%c", 'a'); 6 printf("%s", "bonjour"); 7 printf("%d", 32567); 8 printf("%x", 32567); 9 printf("%o", 32567); 10 printf("%d", (unsigned) 32567); 11 /* ecriture pi format e f g */ 12 printf("%e", ); 13 printf("%9.7f", ); 14 printf("%g", ); 15 return 0; 16 } Données écrites sur le fichier standard sortie abonjour325677f e entier; caractère; ottant; puis réaliser chaîne s caractères; opérations lecture an d'aecter ces variables Exercice 4 Lire et réécrire les éléments l'exercice 3.

47 CHAPITRE 4. ELÉMENTS DE BASE 33 Programme 4.4 Suggestion corrigé chapitre 4 exercice 2 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[], char **envp){ 4 /* ecriture a bonjour hexa octal non signe */ 5 printf("%c\n", 'a'); 6 printf("%s\n", "bonjour"); 7 printf("%d\n", 32567); 8 printf("%x\n", 32567); 9 printf("%o\n", 32567); 10 printf("%d\n", (unsigned) 32567); 11 /* ecriture pi au format e f g */ 12 printf("%e\n", ); 13 printf("%9.7f\n", ); 14 printf("%g\n", ); 15 return 0; 16 } Données écrites sur le fichier standard sortie a bonjour f e

48 EXERCICES SUR PRINTF() ET SCANF() Programme 4.5 Suggestion corrigé chapitre 4 exercice 3 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[], char **envp){ 4 /* claration s variables */ 5 int evry; 6 char dassaut; 7 float ille; 8 char io[100]; 9 /* saisie du nombre entier */ 10 printf("entrer un entier\n"); 11 scanf("%d", &evry); 12 /* saisie du caractere */ 13 /* en effacant le caractere blanc ou \r ou \n precent genant pour %c */ 14 printf("entrer un caractere\n"); 15 scanf(" %c", &dassaut); 16 /* saisie du nombre reel */ 17 printf("entrer un reel\n"); 18 scanf("%f", &ille); 19 /* saisie la chaine caracteres */ 20 printf("entrer une chaine caracteres\n"); 21 scanf("%s", io); 22 return 0; 23 } Données en entrée 126 f e-1 unseulmot possible Données écrites sur le fichier standard sortie entrer un entier entrer un caractere entrer un reel entrer une chaine caracteres

49 CHAPITRE 4. ELÉMENTS DE BASE 35 Programme 4.6 Suggestion corrigé chapitre 4 exercice 4 1 #inclu <stdio.h> 2 int 3 main(int argc, char *argv[], char **envp){ 4 /* claration s variables */ 5 int evry; 6 char dassaut; 7 float ille; 8 char io[100]; 9 /* saisie du nombre entier */ 10 printf("entrer un entier\n"); 11 scanf("%d", &evry); 12 /* saisie du caractere */ 13 /* en effacant le caractere blanc (\r ou \n) precent genant pour %c */ 14 printf("entrer un caractere\n"); 15 scanf(" %c", &dassaut); 16 /* saisie du nombre reel */ 17 printf("entrer un reel\n"); 18 scanf("%f", &ille); 19 /* saisie la chaine caracteres */ 20 printf("entrer une chaine caracteres\n"); 21 scanf("%s", io); 22 /* impression s resultats */ 23 printf("%d\n%c\n%f\n%s\n", evry, dassaut, ille, io); 24 return 0; 25 } Données en entrée 126 f e-1 unseulmot possible Données écrites sur le fichier standard sortie entrer un entier entrer un caractere entrer un reel entrer une chaine caracteres 126 f unseulmot

50 EXERCICES SUR PRINTF() ET SCANF()

51 Chapitre 5 Opérateurs et expressions innovantes Le langage en matière C est connu d'opérateurs. pour la richesse En particulier, ces opérateurs. le langage Il C apporte considère aussi l'aectation quelques notions un opérateur normal alors que les langages qui l'ont précédé (par exemple FORTRAN, ADA) comme considèrent comme une opération privilégiée. la rateurs Cette et richesse d'opérans) au niveau parfois s complexes. opérateurs permet d'écrire s expressions (combinaisons d'opé- relations. Lesopérateurssontlesélémentsdulangagequipermettentfaireducalculoudénirs Ils servent à combiner s variables et s constantes pour réaliser s expressions. et non Laclassicationfaiteci-aprèsestguidéeparlenombred'opéransmisencauseparl'opérateur par l'utilisation s opérateurs. 5.1 Opérateurs un-aires expression. Un opérateur Ainsi, un-aire l'opérateur agit un-aire sur un opéran qui peut être une constante, une variable, ou une - permet d'inverser le signe et on peut écrire: -2 où 2 estuneconstante; -i où i estunevariable; -(i+2) où i+2 est une expression. Le tableau 5.1 donne la liste s opérateurs un-aires. sur Nous les variables allons prendre décrites quelques dans le programme exemples pour 5.1. expliquer l'utilisation base ces opérateurs Opérateur Utilisation & opérateur d'adresse appelé aussi référencement * opérateur d'indirection ou déréférencement sur une adresse -- opérateur décrémentation ++ opérateur d'incrémentation sizeof opérateur donnant la taille en octet! négation logique - moins unaire, inversion du signe + plus unaire ~ complément à un Tab. 5.1 Liste s opérateurs unaires

52 OPÉRATEURSUN-AIRES Programme 5.1 Dénitions variables et d'un pointeur int var=10, *pint=&var, nvar=0; long f=20l; Fig. 5.1 Exemple relation entre pointeur et variable Opérateur référencement Le & dont le nom est l'opérateur le suit. référencement, il retourne l'adresse en mémoir(référence) la variable &var utilisée pour aecter un pointeur donne l'adresse (à la condition en mémoire que le pointeur la variable soit var. d'un Cette type adresse compatible peut avec être l'adresse la variable). Comme le montre l'extrait l'exemple: pint = &var; Opérateur déréférencement ou indirection Le * plus souvent est l'opérateur en utilisant d'indirection. la valeur contenue Il permet dans d'accér un pointeur). à une Dans variable notre à partir programme d'une adresse(le 5.1, *&var donnelavaleur 10,mêmeque *pint,puisque pint aétéinitialiséavecl'adresse var Utilisation s & et * l'espacemémoireassociéauxdonnéesduprogrammedébuteen Prenons un exemple d'utilisation s opérateurs d'adresse et d'indirection en supposant que 0x20000 est quatre octets. Nous supposons plus que la taille d'un pointeur etquelatailled'unentier octets. est elle-aussi quatre culier, La gure l'association 5.1 montre entre l'espace le pointeur mémoire associé aux dénitions du programme 5.1, et en parti- pint et la variable var. L'instruction pint = &nvar; est traduite dans la gure5.2. Fig. 5.2Miseenrelationd'unpointeuretd'unevariable

53 CHAPITRE 5. OPÉRATEURS ET EXPRESSIONS 39 Unefoiscetteinstructionréalisée,l'expression *pint = var - 2 setraduitauniveauduprocesseur1 parlesopérationssuivantes: 1. mettrelavaleur var dansleregistre R0 0x20000,soit R0 10); 2. soustraire2àcettevaleur(r0 R0 soit -2, R0 8); 3. mettrelavaleur pint dansleregistre A0 0x20004, soit A0 0x20008); 4. mettrelavaleurquiestdans R0 A0,c'est-à-diredans àl'adressecontenuedansleregistre var (@ A0 R0,soit 0x ). tableaux Nous et reparlerons les pointeurs. s relations entre les pointeurs et les variables dans le chapitre 10 sur les Opérateurs d'incrémentation et décrémentation Les opérateurs -- et ++ entier. Dans une première approche, permettent nous pouvons décrémenter considérer et d'incrémenter que: s variables type var est équivalent à var = - 1, ce qui implique en partant d'une variable var valeur ayant une 8 que cette variable contient la valeur 7 une fois l'expression calculée à l'exécution; var++ est équivalent à var = var + 1, ce qui implique en partant var ayant une valeur 8 que cette variable contient la valeur 9 à la n l'exécution l'expression. la variable Il est possible (postxé) d'utiliser ou vant les opérateurs celle-ci variable un-aires (préxé). d'incrémentation Ce qui permet et décrémentation post-incrémenter, rrière pré-incrémenter, post-décrémenter ou pré-décrémenter. l'opération Lorsque ne l'opérateur soit calculée. est préxé, Dans le l'opération cas où l'opération est appliquée est post-xée, avant que la valeur la valeur la correspondant variable avant à l'opération est utilisée pour les autres calculs et ensuite l'opération est appliquée. Prenons comme exemple, ux entiers i 0. et j, et initialisons ces ux variables avec la valeur int i=0, j=0; Si nous écrivons j = ter ++i, c'est une pré-incrémentation la variable i. Cela signie incrémen- i 1 puis mettre la valeur i dans j. À la n cette opération i vaut 1 et j anticipant sur l'opérateur succession 5.2.5, nous pouvons considérer cette instruction vaut comme 1. En équivalente à: i i+1, j = i Si au contraire, nous écrivons j = i++, cela signie mettre la valeur i dans j menter i1.enpartantsmêmesvaleurs, ivalant 0et jvalant 0,àlancetteinstruction puis incré- i vaut 1 et j vaut 0.Cetteopérationestéquivalenteà: j=i, i = i+1, j 1Cet exemple suppose un processeur simple ayant s registres internes banalisés appelés R0, R1,...pour les registres données et A0, A1 pour les registres d'adresses. L'@ est utilisé pour signier le contenu la variable à l'adresse.

54 OPÉRATEURSUN-AIRES Opérateur taille L'opérateur sizeof dénitionsvariablesduprogramme5.1: donne la taille en octets la variable dont le nom suit. En gardant les sizeof f donnelavaleur 42. L'opérateur sizeof Dans notre exemple, peut aussi donner la taille d'un type, le type doit être entre parenthèses. sizeof f est équivalent à sizeof(long). Lescalculsassociésàl'opérateur sizeof langage en assembleur, et non lors l'exécution sontréalisésparlecompilateurlorslatraductiondu du programme. L'expression sizeof f une valeur constante et peut entrer dans la construction d'une expression constante (calculable est donc lors la compilation). Le type la valeur calculée par sizeof est size_t 3.4. Ce type est un type synonyme, comme décrit dans le comme chapitre nous 14, l'avons il est déni vu dans dans la le section chier <stdf.h> Opérateur négation logique vrai La négation à faux et logique(non réciproquement. logique, logical not) sert à inverser une condition en la faisant passer EnlangageC,uneexpressionestfaussesilavaleurqu'elleretourneestégaleà 0,elleestvraie sinon.deplus,lanormespécieque!0 vaut 1. Dansnotreexemple,!var vaut 0 car var estvraiepuisque var contient Plus et moins unaires Lemoinsun-aireinverselesignel'expressionquilesuit.Leplusun-aireaétéintroduitpar lanorme;iln'existaitpasdanslesversionsc72.ilsertànepaschangerlesignel'expression Complément à un L'opérateur ~ utilisé dans les calculs donne le masquage complément et à nous un le l'expression considérons entière comme qui un le opérateur suit. C'est portant un opérateur bits l'opéran associé. sur les Si nous gardons l'exemple notre variable type entier var considérant qu'un entier est représenté sur 16 bits, cette valeur est équivalente contenant en la binaire valeur à: 10. En etlavaleur ~var estéquivalenteenbinaireà: soit la valeur décimale -11. Commesonnom,complémentà1,nel'indiquepaslasommesvaleurs var + à -1,dontlavaleurenbinaireest: ~varestégale Ceci complémentà2puisque explique pourquoi en référence au complément à 1, l'inversion signe est aussi appelée -varestéquivalentà~var plus 1. +1,soitlecomplémentà1lavaleurvar 2Un entier long sur les machines les plus courantes est représenté sur 32 bits soit 4 octets.

55 CHAPITRE 5. OPÉRATEURS ET EXPRESSIONS 41 Type Arithmétique d'opérateurs Opérateurs Usage + - addition, soustraction, * / multiplication, division, % Masquage reste la division entière. & ^ Décalage et, ou, ou exclusif >> << Relation vers la droite ou vers la gauche < <= inférieur, inférieur ou égal, > >= supérieur, supérieur ou égal ==!= Logique égal, non égal && Aectation et logique, ou logique = Succession aectation, succession Tab. 5.2 Liste s opérateurs binaires 5.2 Opérateurs binaires Le tableau 5.2 donne la liste s opérateurs binaires Opérateurs arithmétiques les autres Le langage langages, C permet à savoir l'utilisation : l'addition, s opérateurs la soustraction, calcul la multiplication que l'on trouve et habituellement la division. Il utilise dans pourcelalessymbolesrespectifs: + - * /. dans Comme le cas s nous trois avons symboles déjà vu : les opérateurs un-aires, vous remarquerez l'utilisation contextuelle + - son nombre d'opérans. *. Le compilateur détermine la signication l'opérateur à par Commenousleverronsplusloin,letype(ausenstypesdonnées)l'opérationestdéterminé peuvent le type s'appliquer s valeurs aux sur types lesquelles entiers portent et dans ce l'opération. cas elles ont Les un opérations comportement arithmétiques d'opération classiques (en particulier la division). Ces opérations s'appliquent aussi aux types avec partie décimale entière dans ce cas, elles donnent un résultat avec partie décimale. et entière Le langage déterminée C introduit par les ux l'opérateur opérans modulo, entiers noté qui %, lui qui sont permet associés. d'obtenir Par exemple, le reste l'expression la division 14 % 3 donnelavaleur Opérateurs manipulant les bits entières.ilsserventàconstruiresmasquesmanièreàtestercertainsbitsdanssvariables Les opérateurs masquage et décalages sont utilisés pour manipuler les bitss variables type entier(char short int dans petits intervalles. Par long). exemple, Ces il opérations sut trois servent bits à pour stocker exprimer s valeurs une valeur qui s'expriment entre 0 et 7.Ainsi,lareprésentationsdroitsd'accèssurunchier3 caractéristique d'utilisation. danslesystèmeunixestunexemple pour Les l'interfaçage opérations s niveau périphériques. bit sont Elles utilisées sont aussi manière beaucoup interne utilisées par les dans systèmes le cadre d'exploitation s réseaux 3Les droits sont exprimés sur trois bits que l'on appelle communément les bits r(ead) w(rite) et (e)x(ecute). Les droits sont exprimés pour trois populations : le propriétaire du chier, le groupe propriétaire et les autres. Un quatrième groupe trois bits (sst) est utilisé pour dénir s comportements particuliers.

56 OPÉRATEURSBINAIRES où bits. le Elles contenu permettent d'un espace aussi mémoire manipuler est souvent les images dépendant une fois d'informations que celles-ci ont représentées été numérisées. sur peu ceuxquipermettentd'extraireunepartiesinformationscontenuedansunopéran(opérateurs Les opérateurs qui permettent manipuler s expressions au niveau bit sont ux types gauche(opérateurs masquage) et ceux décalage). qui modient l'information en déplaçant les bits vers la droite ou vers la Opérateurs masquage Les trois premiers opérateurs binaires niveau bit \& d'unevaleuroubienàforcercertainsbitsàun. ^) servent à sélectionner une partie que Pour le type reprendre chier l'exemple et les droits s droits d'accès d'accès d'un sur chier un chier sont contenus dans le système dans une UNIX, variable considérons du type unsigned chier correspondant. short, et voyons comment nous pouvons extraire ou xer certains droits d'accès au Dansleprogramme5.2,lemoinitialestxéà danslavaleur)représenteletypeduchieretlesmosspéciaux(bitsappeléssst)etquelesneuf sachantquelapartiehaute(àgauche autres le groupe bits auquel représentent appartient les droits le chier d'accès(rwx et pour les respectivement autres utilisateurs). pour le propriétaire du chier, pour Lavaleur sertàreprésenterunchierenmo: 1. chiernormal 010 danslapartiegauchelavaleur; 2. pastraitementparticulier(bitssstà0); 3. lecture écriture et exécutable pour le propriétaire(7 ou 111); 4. lectureetexécutablepourlegroupe(5 ou 101); 5. exécutable pour les autres(1 ou 001). Programme 5.2 Utilisation s opérateurs masquage 1 int var=10, *pint=&var, nvar=0; 2 long f=20l; 3 char tabc[4]="abc"; Voici laligne3metdans l'explication s diérentes lignes du programme 5.2: res lapartie mo la variable quispécieletypechier,aprèscetteinstruction res la ligne 4 met dans contient la valeur ; res la valeur courante mo forçant les bits numéro 5 et 3 à 1. Ces bits représentent en conservant respectivement le type le droit chier en écriture et en pour variable le groupe et le droit en lecture pour les autres. Ainsi, cette instruction met dans la res la ligne 5 met la dans valeur ; res la valeur mo pour les trois populations d'utilisateurs. Après en inversant cette instruction, les droits la d'accès variable en mo écriture res valeur , eaçant ainsi le droit d'écriture pour le propriétaire et donnant ce contient droit au la groupe propriétaire du chier et aux autres utilisateurs Opérateurs décalage Les opérateurs décalage (<< riables type entier en poussant les et >>) bits servent vers la à gauche manipuler ou la les droite. valeurs Ces contenues opérateurs dans servent les va- réaliser s tests ou eacer certaines parties d'une variable. à Ledécalagepeutsefaireverslagaucheouversladroite.

57 CHAPITRE 5. OPÉRATEURS ET EXPRESSIONS 43 dépendant Le décalage l'implantation vers la droite (ce peut qui être veut signé dire si que l'expression pour écrire est un signée, programme le résultat portable est cependant pas utiliser le décalage à droite sur une valeur négative). il ne faut d'une De position manière revient simple à (en une ne multiplication parlant pas s par cas ux et déborment), un décalage vers un décalage la droite vers correspond la gauche une division par ux. à Programme 5.3 Utilisation s opérateurs décalage 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) 4 { 5 unsigned short int mo = ; 6 int res = mo << 4; 7 printf ("res = %o\n", res); 8 res = res >> 4; 9 printf ("res = %o\n", res); 10 res = (mo >> 12) << 12; 11 printf ("res = %o\n", res); 12 return 0; 13 } Données écrites sur le fichier standard sortie res res res = Voici laligne2metdans quelques explication reslavaleurcorrespondantà sur les dénitions et instructions modécaléàgauchequatrepositions, du programme 5.3: supprimant réaliséeninsérantsbitsàlavaleurzérosurladroitelavaleur.lavariable ainsi la partie qui spécie le type chier. Le décalage vers la gauche rescontient a été laligne3remetdans àlancetteopérationlavaleur ressavaleurcourantedécaléequatrepositionsversladroite,enne ; conservant que les droits d'accès du chier. Cette ligne met dans la variable res Vous constatez que nous avons ainsi eacé la partie la valeur qui correspond la valeur type du chier; au réciproquement la ligne 4 eace les bits correspondant aux droits d'accès en mettant dans res la valeur mo metdanslavariable avec les douze bits correspondants aux droits mis à zéro. Cette ligne res lavaleur Opérateurs relation Comme Les opérateurs nous le verrons relation dans le servent chapitre à réaliser 6 ces opérateurs s tests entre sont les surtout valeurs utilisés ux à l'intérieur expressions. instructions contrôle ux(tests). s Les opérateurs relation algébrique sont au nombre six : (< <= > >= == opérateurs peuvent être utilisés avec s variables type entier ou s variables ayant une!=). partie Ces décimale.notezledoubleégalpourletestquiestsouventsourceconfusionaveclesimpleégal qui décrit l'aectation. Les ux autres opérateurs tests (&& le ou logique. Le et logique permet décrire ) qu'une sont appelés condition respectivement constituée le ux et logique parties est et satisfaite si et seulement si les ux parties sont satisfaites.

58 OPÉRATEURSBINAIRES arithmétique += -= *= /= %= masquage &= = ^= décalage >>= <<= Tab. 5.3 Liste s opérateurs binaires d'aectation dés Le lors ou qu'une logique s ux permet parties décrire est satisfaite. qu'une Ces condition opérateurs constituée servent donc ux à parties décrire est s satisfaite logiques du type nécessité ux conditions(et logique) ou susance d'une s ux conditions relations (condition type entier ou). et dont Ces opérateurs la valeur est s'appliquent testée comme à s pour expressions le non logique que l'on à peut savoir considérer une expression comme est considérée comme fausse si la valeur correspondant à cette expression est égale à 0. Ainsi en langage C, pour tester si une variable type entier j entreuxbornesnonstrictes contient une valeur comprise 12 et 143 ilfautécrire:j >= 12 && j <= 143. Demême,untestpoursavoirsiuncaractère carcontientun'a'enminusculeouenmajuscule s'écrit:car == 'a' car == 'A' Opérateur binaire d'aectation et succession En langage C, l'aectation est un opérateur comme les autres. Ceci permet d'écrire s expressionscomme:i = j = k = 1 quidétermineuneaectationmultiple. valeur La associée virgule, quant sera la à rnière elle, sert valeur à séparer calculée. ux Une expressions expression qui comme: sont évaluées successivement. La i = (j=2, k=3) à associe i lavaleur Opérateurs d'aectation binaires Le langage arithmétiques, C permet s construire opérateurs s opérateurs masquage et binaires s opérateurs d'aectation décalage, à partir s en opérateurs suivre d'un égal(=). les faisant dans L'association le tableau 5.3. d'un opérateur binaire avec l'opérateur d'aectation donne les opérateurs décrits ces Le diérentes tableau expressions. 5.4 donne un Ce exemple tableau d'utilisation est construit en chacun supposant ces que opérateurs le type entier et la est façon représenté lire sur 32 bits, et que les ux variables i et j sont dénies la manière suivante : int i = 100,j = 5;. La partie droite l'opérateur peut être une expression: i += ( j * ) Ceci permet d'écrire s expressions plus complexes: i += ( j += j * ) - 12 La celle rnière expression arithmétique fait plusieurs aectations: j avec j * celle i avec i + j - 12 Soit,si i et j ontpourvaleur1avantcetteexpression, j vaudra368aprèset i vaudra357. complexes Ce type oertes d'expression en matière est un d'expressions peu compliqué sont et rend ce le programme fait peu utilisées dicile ou à alors lire. Ces soigneusement possibilités encadrées par s parenthèses qui favorisent la compréhension.

59 CHAPITRE 5. OPÉRATEURS ET EXPRESSIONS 45 expression résultat opérateurs équivalence arithmétiques lecture += ajoute10ài += j j ajoutejài -= retranche5ài -= j j retranchejài *= multiplieipar10 *= j 5250 * j multiplieiparj /= diviseipar10 /= j 105 / j diviseiparj i %= 10 5 i = i % 10 ireçoitlerestela opérateurs masquage divisionentièreipar10 &= 0 & ETiavec8 = OUiavec8 i ^= 4 0x0C i = i ^ 4 opérateurs décalage OUexclusifiavec4 <<= 0xC0 << décaleiàgauche4positions i >>= 4 0x0C i = i >> 4 décaleiàdroite4positions Tab. 5.4 Exemples d'opérateurs binaires d'aectation Opérateur ex1?ex2:ex3 Usage Retourneex2siex1estvrai retourneex3siex1estfaux Tab. 5.5 Opérateur ternaire Opérateur ternaire avec L'opérateur retour valeur. ternaire met en jeu trois expressions(ex1,ex2,ex3) et permet contruire une test la La uxième première expression expression(ex1) est réalisée joue et le le rôle résultat condition. cette Si expression la condition est propagé est vériée, comme l'évaluation l'expression globale. résultat résultat Dans le cette cas contraire(le expression est test propagé est faux), comme l'évaluation résultat la l'expression troisième expression globale. est réalisée et le Prenonspourexemplel'expression a == b? c : d. Cette expression retourne la valeur contenue dans la variable c variable si la valeur contenue dans la a contenue dans est égale la variable à celle d. la variable b. Dans le cas contraire, l'expression retourne la valeur L'expression a >= b? a : b estévaluéelamanièresuivante: 1. si la valeur a a; est supérieure ou égale à la valeur b, alors l'expression donne la valeur 2. sinon l'expression donne la valeur b; Ainsi l'expression max = a >= b? a : b permet mémoriser dans la variable max maximum s ux valeurs contenues dans les variables la valeur a et b.

60 OPÉRATEURSBINAIRES Classe Parenthésage d'opérateur Opérateur(s) Associativité () Appel fonction gauche droite () Suxesou gauche à droite [] -> Un-aires & * + - ~! préxes ++ droiteàgauche sizeof sizeof() Changement type (type) Multiplicatifs droite à gauche * / % Additifs gauche droite + - Décalages gauche droite << >> Comparaisons gauche droite < <= > >= Égalités gauche droite ==!= etbitàbit gauche à droite & ouexclusifbitàbit gaucheàdroite ^ oubitàbit gaucheàdroite et logique gaucheàdroite && ou logique gauche droite Condition gauche à droite?: Aectations droite gauche = += -= *= /= %= droite à gauche &= = ^= <<= >>= Succession, gauche à droite Tab. 5.6 Précénce s opérateurs Précénce s opérateurs s Dans ordres l'évaluation priorité d'une que nous ligne appelons contenant relations s opérateurs précénce. et s opérans, Cette précénce le compilateur détermine utilise l'ordre d'association s opérateurs et opéran par le compilateur. lecture Ces régles ce tableau. précénces sont représentées par le tableau 5.6, l'encart suivant donne la grille RÈGLE précénce : La selon priorité le tableau s opérateurs 5.6. du langage C est décroissante haut en bas Lorsque 5.6, la priorité ux opérateurs d'évaluation se d'une trouvent ligne dans C la dans même laquelle case du tableau se qui trouvent détermine ces dans opérateurs, quel ordre est le donnée compilateur par la colonne associe, les droite opérateurs (associativité), et les opérans (en commençant par la droite ou la gauche). Il faut consulter ce tableau pour être sûr l'ordre d'évaluation d'une expression. lafaçondontlecompilateuranalyselalignesourceenc.c'estl'ordredanslalignesourcequiest L'associativité n'est pas la précénce entre opérateurs d'une même ligne ce tableau. C'est important et non l'ordre sur la ligne du tableau. Pour parenthésage; résumer, cette règle précénce suit l'ordre: opérateurs opérateurs d'accès, un-aires(associativité appel fonction droite et post à gauche); incrémentation ou décrémentation;

61 CHAPITRE 5. OPÉRATEURS ET EXPRESSIONS 47 opérateurs et opérateurs binaires(selon bit à bit); le bon sens commun, méez vous s relations opérateurs test opérateur opérateurs ternaire(associativité binaires d'aectation(associativité droite à gauche); succession. droite à gauche); 5.3 Expressions Une EXPRESSION est : une suite syntaxiquement correcte d'opérateurs et d'opérans. Maintenant manière rigoureuse que nous dans avons l'encart vu l'ensemble ci ssus la s notion opérateurs d'expression. du langage C, nous pouvons dénir suite Uneexpressionestdoncunesuitesyntaxiquementcohérented'opérateursetd'opérans.Cette doit donc avoir s opérans cohérents en nombre et en type avec les opérateurs. Une même expression si la valeur ramène n'est pas toujours utilisée. une valeur, Une Elle est expression vraie si est son fausse résultat si son est non résultat nul. est nul. La table 5.3 décrit les relations entre expression et utilisation d'une expression dans un test. Prenonslavariable i quiestdénie int i=10;l'expression i donnelavaleur 10 valeurpeutêtreutiliséedansuntestetestconsidéréecommevraiedanscecas..cette 5.4 Instructions Une Maintenantquenousconnaissonslanotiond'expressionnouspouvonsintroduirecelled'instruction. instruction soit une instruction est: soitunbloc. simple, Une instruction simple soit une instruction est: soituneexpressionsuivie;. contrôle(voir chapitre suivant), Une instruction simple est toujours terminée par un ;. Un bloc une accola alastructuresuivante: une liste dénitions ouvrante"{" une suite d'instructions locales au bloc(optionnelle) À uneaccolafermante"}". manière partir indiérente maintenant, l'une s lorsque trois signications: nous employons le terme instruction, il peut prendre 1. instruction simple; 2. ou instruction contrôle ot; 3. ou bloc d'instructions.

62 EXERCICES SUR LES OPÉRATEURS ET LES EXPRESSIONS 5.5 Exercices sur les opérateurs et les expressions Exercice 1 Déclarerunentier,unpointeursurentieretuntableau10entiers. 1. Faire écrire l'adresse l'entier. 2. Aecterlavaleur1àl'entier. 3. Faireécrirelavaleurl'entier Faire écrire la valeur l'entier. tableau Mettre au 1, pointeur. 2, 3, 4 dans le tableau et aecter la valeur correspondant à l'adresse début du 1. En incrément, utilisant ainsi l'opérateur que le contenu post-incrémentation, s entiers pointés faire par écrire le pointeur le contenu et son du incrément. pointeur et son 2. Faireécrirelataillel'entier,dupointeuretdutableau. 3. Faireécrirelanégationcequiestpointéparlepointeur Exercice 2 Dénir ux entiers i et j initialisés avec les valeurs 10 et 3 respectivement. Faire écrire les résultats : + - * / i % j Trouver une façon diérente calculer i % j. Aecter les valeurs 0x0FF et 0xF0F respectivementài et j. Faire écrire en hexadécimal les résultats : & ^ j i << j >> Exercice 3 Déniruxentiers i et j initialisésrespectivementaveclesvaleurs1et2. Faire écrire les résultats s diérentes opérations logiques entre i et j ou,etc.). (égalité, inégalité, et, Noter les dierences eventuelles entre les resultats : && et & i j et i j Exercice 4 initialiséà10: En faisant écrire les résultats intermédiaires, réaliser les opérations suivantes sur un entier divisionpar2 additionavec3

63 CHAPITRE 5. OPÉRATEURS ET EXPRESSIONS 49 multiplication aectationdurestesapropredivisionpar3 par 2 ouavec10 décalage2bitsverslagauche etavec19 NB: Il ouexclusifavec7. est possible réaliser ces opérations ux facons diérentes Exercice 5 : Operateur ternaire Enutilisant4entiers i, j, k et l,avec k initialiséà12et l litlesvaleurs à8,écrireleprogrammequi: i et j écritlavaleur k si i écritlavaleur estnul; l i estnonnulet j écritlavaleur estnul i + j danslesautrescas Exercice 6 Enutilisantquatrevariablesentières i, j, k et l enuneseuleexpressionaecterlavaleur1à i, : j ajouter1àiquatremanièresdiérentes. et k. écrire l'expression qui aecte à k le resultat i + j +1 et incrémente i et j solutions au moins). 1 (quatre écrire l'expression qui met: dans i 3 * i + j dans j divise k diviselanouvellevaleur par2logiquement à la valeur obtenue. jparcelle ketmetdans llapuissance2correspondant

64 EXERCICES SUR LES OPÉRATEURS ET LES EXPRESSIONS Programme 5.4 Suggestion corrigé chapitre 5 exercice 1 1 #inclu <stdio.h> 2 3 int i, *pti, tab[10]; 4 int 5 main (int argc, char *argv[], char **envp){ 6 /* ecriture l'adresse l'entier */ 7 printf(" Adresse l'entier : %x \n", &i); 8 /* affectation l'entier a 1 */ 9 i = 1; 10 /* ecriture la valeur l'entier + 1 */ 11 printf(" Valeur l'entier + 1 : %d\n", i + 1); 12 /* ecriture a valeur l'entier */ 13 printf(" Valeur l'entier : %d\n", i); 14 /* remplissage du tableau */ 15 tab[0] 1; tab[1] 2; 16 tab[2] = 3; tab[3] = 4; 17 /* Affectation l adresse but du tableau au pointeur */ 18 pti = tab; 19 /* ecriture du contenu du pointeur et son increment. */ 20 printf(" Contenu du pointeur %x \n", pti); 21 printf(" et son increment : %x \n", pti + 1); 22 /* ecriture du contenu s objets pointes */ 23 printf(" contenu l'objet pointe par pt %d \n", *pti); 24 printf(" et par l'increment pt : %d \n", *++pti); 25 /* ecriture s tailles l'entier du pointeur et du tableau */ 26 printf(" Taille l'entier %d octets \n", sizeof (i)); 27 printf(" Taille du pointeur %d octets \n", sizeof (pti)); 28 printf(" Taille du tableau : %d octets \n", sizeof (tab)); 29 /* ecriture la negation ce qui est pointe par pt */ 30 printf(" Negation pt : %d \n",!*pti); 31 return 0; 32 } Données écrites sur le fichier standard sortie Adresse l'entier : Valeur l'entier + : 2 Valeur l'entier : 1 Contenu du pointeur 80497e0 et son increment : 80497e4 contenu l'objet pointe par pt 1 et par l'increment pt : 2 Taille l'entier octets Taille du pointeur 4 octets Taille du tableau : 40 octets Negation pt : 0

65 CHAPITRE 5. OPÉRATEURS ET EXPRESSIONS 51 Programme 5.5 Suggestion corrigé chapitre 5 exercice 2 1 #inclu <stdio.h> 2 3 int 4 main(int argc, char *argv[], char **envp){ 5 /* Definition s ux entiers initialises a 10 et 3 */ 6 int i = 10, j = 3; 7 /* ecriture du resultat differentes operations arithmetiques */ 8 printf(" Le resultat + est %d \n", + j); 9 printf(" Le resultat - est %d \n", - j); 10 printf(" Le resultat * est %d \n", * j); 11 printf(" Le resultat / j est %d \n", i / j); 12 printf(" Le resultat i %% j est %d \n", i % j); 13 /* facon differente calculer i % j */ 14 printf(" calcul different i %% j : %d \n", i - (j * (i / j))); 15 /* nouvelle affectation i et j */ 16 i 0x0FF; 17 j = 0xF0F; 18 /* ecriture du resultat differentes operations logiques */ 19 printf(" Le resultat & est %x \n", & j); 20 printf(" Le resultat est %x \n", j); 21 printf(" Le resultat ^ j est %x \n", i ^ j); 22 printf(" Le resultat i << est %x \n", i << 2); 23 printf(" Le resultat j >> 2 est %x \n", j >> 2); 24 return 0; 25 } Données écrites sur le fichier standard sortie Le resultat + est 13 Le resultat - est 7 Le resultat * est 30 Le resultat / est 3 Le resultat i % j est 1 calcul different i % j : 1 Le resultat & est f Le resultat est fff Le resultat ^ j est ff0 Le resultat i << est 3fc Le resultat j >> 2 est 3c3

66 EXERCICES SUR LES OPÉRATEURS ET LES EXPRESSIONS Programme 5.6 Suggestion corrigé chapitre 5 exercice 3 1 #inclu <stdio.h> 2 3 int i, *pti, tab[10]; 4 int 5 main (int argc, char *argv[], char **envp){ 6 int i = 1, j = 2; /* initialisation ux entiers */ 7 /* ecriture du resultat differentes operations logiques */ 8 printf(" Resultat diverses operations logiques avec i = 1 et j = 2\n"); 9 printf(" Le resultat & est %x \n", & j); 10 printf(" Le resultat est %x \n", j); 11 printf(" Le resultat i ^ j est %x \n", i ^ j); 12 printf(" Le resultat ~i est %x \n", ~i); 13 printf(" Le resultat ~j est %x \n", ~j); 14 printf(" Le resultat && est %x \n", && j); 15 printf(" Le resultat i j est %x \n", i j); 16 printf(" Le resultat!i est %x \n",!i); 17 printf(" Le resultat!j est %x \n",!j); 18 return 0; 19 } Données écrites sur le fichier standard sortie Resultat diverses operations logiques avec i = 1 et j = 2 Le resultat & est 0 Le resultat est Le resultat i ^ j est 3 Le resultat ~i est fffffffe Le resultat ~j est fffffffd Le resultat && est Le resultat i j est 1 Le resultat!i est Le resultat!j est 0

67 CHAPITRE 5. OPÉRATEURS ET EXPRESSIONS 53 Programme 5.7 Suggestion corrigé chapitre 5 exercice 4 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[], char **envp){ 4 int i = 10; 5 printf (" Resultat diverses operations avec i = %d\n\n", i); 6 /* ecriture du resultat differentes operations */ 7 printf(" Division par 2 %d\n", /= 2); 8 printf(" Addition avec 3 %d\n", i += 3); 9 printf(" Multiplication par 2 %d\n", i *= 2); 10 printf(" Reste la division par 3 %d\n", i %= 3); 11 printf(" OU logique avec 10 %d\n", i = 10); 12 printf(" Shift 2 a gauche %d\n", i <<= 2); 13 printf(" ET logique avec 19 %d\n", &= 19); 14 printf(" OU exclusif avec 7 %d\n", i ^= 7); 15 return 0; 16 } Données écrites sur le fichier standard sortie Resultat diverses operations avec i = 10 Division par 2 5 Addition avec 3 8 Multiplication par 2 16 Reste la division par 3 1 OU logique avec Shift 2 a gauche 44 ET logique avec 19 0 OU exclusif avec 7 7

68 EXERCICES SUR LES OPÉRATEURS ET LES EXPRESSIONS Programme 5.8 Suggestion corrigé chapitre 5 exercice 5 1 #inclu <stdio.h> 2 int 3 main(int argc, char *argv[], char **envp){ 4 int i, j, k = 12, l = 8; /* finition 4 entiers */ 5 /* lecture s valeurs i et j */ 6 printf("\n Entrer la valeur i :"); 7 scanf("%d", &i); 8 printf("\n Entrer la valeur j :"); 9 scanf("%d", &j); 10 /* ecriture du resultat selon les valeurs i et j 11 si i est nul, impression la valeur k 12 si j est nul, impression la valeur i + l 13 * impression la valeur i +j dans les autres cas 14 */ 15 printf("\n resultat : %d\n", (!i? k : (!j? i + l : i + j))); 16 return 0; 17 } Données en entrée Données écrites sur le fichier standard sortie Entrer la valeur i : Entrer la valeur j : resultat : 134

69 CHAPITRE 5. OPÉRATEURS ET EXPRESSIONS 55 Programme 5.9 Suggestion corrigé chapitre 5 exercice 6 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[], char **envp){ 4 int i, j, k, l; /* finition s 4 entiers */ 5 /* affectation s entiers */ 6 i = j = k = 1; 7 /* incrementation i 4 manieres differentes */ 8 printf(" premiere solution i++ %d \n", i++); 9 printf(" uxieme solution ++i = %d \n", ++i); 10 printf(" troisieme solution = i + 1 = %d \n", i = i + 1); 11 printf(" quatrieme solution i += 1 = %d \n", i += 1); 12 /* affectation i + j + 1 a k et incrementation i et j */ 13 printf(" resultat apres affectation et incrementation\n"); 14 k = i++ + j++ + 1; /* ou i j ou ++i+j++ ou ++i+ ++j -1 */ 15 printf(" valeur k %d \n", k); 16 printf(" valeur i %d \n", i); 17 printf(" valeur j : %d \n", j); 18 /* ecriture d'une expression qui realise les operations suivantes : 19 3 * i dans i et 3 * i + j dans j 20 et divise k par 2 logiquement et divise j par k 21 * et affecte a l la puissance 2 correspondant à la valeur precente 22 */ 23 l = l << (j += (i *= 3)) / (k >>= l = 1); 24 printf(" Resultat apres calcul l'expression \n"); 25 printf(" valeur i... %d \n", i); 26 printf(" valeur j... %d \n", j); 27 printf(" valeur k... %d \n", k); 28 printf(" valeur l... %d \n", l); 29 return 0; 30 } Données écrites sur le fichier standard sortie premiere solution i++ 1 uxieme solution ++i = 3 troisieme solution = i + 1 = 4 quatrieme solution i += 1 = 5 resultat apres affectation et incrementation valeur k 7 valeur i 6 valeur j : 2 Resultat apres calcul l'expression valeur i valeur j valeur k... 3 valeur l... 64

70 EXERCICES SUR LES OPÉRATEURS ET LES EXPRESSIONS

71 Chapitre 6 Instructions contrôle Les instructions contrôle servent à controler le déroulement l'enchaînement s instructions à l'intérieur d'un programme, ces instructions peuvent être s instructions conditionnelles ou itératives. 6.1 Instructions conditionnelles Les instructions conditionnelles permettent réaliser s tests, et suivant le résultat ces tests, d'exécuter s parties co diérentes Test L'opérateur test se présente sous les ux formes présentées dans l'encart suivant: if( expression ) instruction else if( expression instruction2 ) instruction1 ou une L'expressionn'estpasforcémentuntestquiretournelavaleur0ou+1.Cepeutêtreuncalcul booléen,etuneexpressionestvraiesielleramèneunrésultatnonnul;elleestfaussesilerésultat aectation, car, comme nous l'avons déja dit dans la section5.1.6, il n'y a pas type est nul. VoiciquelquesexemplestestsenlangageC: if (a == b) usuelcommedanstouslesautreslangages int b 1; if (a = b) vraipuisquebestégalà1(doncnonnul), attentioncarcelametlavaleurbdansa int c; if (c = getchar()) vraisilafonctiongetcharneramènepas '\0' if (c) vraisicn'estpaségalà0sinonfaux l'ensembletestsdécritdansleprogramme6.1permettestersiunnombreestpairouimpair Les tests sont souvent imbriqués pour tester si une variable contient une valeur. Par exemple etsiilestsupérieurà5ounon.

72 INSTRUCTIONSCONDITIONNELLES Programme 6.1 Exemple tests imbriqués 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) 4 { 5 int i; 6 scanf ("%d", &i); 7 if (i == 6 i == 8) 8 { 9 printf ("le nombre est superieur a 5\n"); 10 printf ("le nombre est pair\n"); 11 } 12 else if (i == 4 i == 2 i == 0) 13 printf ("le nombre est pair\n"); 14 else if (i == 7 i == 9) 15 { 16 printf ("le nombre est superieur a 5\n"); 17 printf ("le nombre est impair\n"); 18 } 19 else if (i == 5 i == 3 i == 1) 20 printf ("le nombre est impair\n"); 21 else 22 printf ("ceci n est pas un nombre\n"); 23 return 0; 24 } Données en entrée 5 Données écrites sur le fichier standard sortie le nombre est impair Table branchement Pour éviter les imbrications d'instructions if, le C possè une instruction qui crée une table branchement: c'est l'instruction switch. La syntaxe du switch est résumée dans l'encart suivant:

73 CHAPITRE 6. INSTRUCTIONS DE CONTRÔLE 59 switch (expression) { case value1 : inst inst 10 inst 11 case value2 : inst inst inst 21 etc. 22 case valuen : inst inst N0 inst N1 fault : inst 30 N2 inst inst } L'exécution du switch est réalisée selon les étapes suivantes: 1. l'expression est évaluée comme une valeur entière; 2. les valeurs s case sont évaluées comme s constantes entières; 3. l'exécution se fait à partir du case en séquence jusqu'à la rencontre d'une dont instruction la valeur break;; correspond à l'expression. Elle s'exécute 4. les instructions qui suivent la condition fault sont exécutées lorsqu'aucune constante s case n'est égale à la valeur retournée par l'expression; 5. l'ordre s case et du fault programme; n'est par prédéni par le langage mais par les besoins du 6. l'exécution à partir d'un case continue sur les instructions s autres case tant qu'un break n'est pas rencontré; 7. plusieurs valeurs case peuvent aboutir sur les mêmes instructions; 8. lernier ne pas avoir breakestfacultatif.ilvautmieuxlelaisserpourlacohérencel'écriture,etpour surprise lorsqu'un case est ajouté. Les programmes 6.2, 6.3 et 6.4 sont s exemples d'utilisation tables sauts. Le premier exemple 6.2 est symbolique: 1. lorsque l'expression exp 20,21et22sontexécutées; donne une valeur égale à 21, les instructions numérotées 10, 11, 12, 2. lorsque l'expression exp exécutées; donne une valeur égale à 12, les instructions 20, 21 et 22 sont 3. danstouslesautrescas,lesinstructions30,31et32sontexécutées. se déroule L'exemple donc 6.3 reprend la même l'exemple façon, en précént utilisant la 6.1 valeur réalisé dans avec l'expression s tests imbriqués. switch, c'est-à-dire L'éxécution valeur la i : 1. lorsqueiestégalà6ou8,leprogrammeécrit le nombre est superieur a 5,puisécrit le nombre est pair; 2. lorsqueiestégalà0,2ou4,leprogrammeécrit le nombre est pair; 3. lorsqueiestégalà9ou7,leprogrammeécrit le nombre est superieur a 5,puisécrit le nombre est impair; 4. lorsqueiestégalà1,3ou5,leprogrammeécrit le nombre est impair; 5. danslesautrescas,leprogrammeécrit ceci n'est pas un nombre. Dans l'exemple 6.4, la sélection incrémente les variables nb_chiffres ou nb_lettres que le caractère lu au clavier est un chire, ou une lettre. Si le caractère lu n'est ni un chire selon une lettre, la variable ni nb_others est incrémentée.

74 INSTRUCTIONSITÉRATIVES while( expression ) instruction Tab. 6.1Syntaxedu while 6.2 Instructions itératives Fig. 6.1 Organigramme du while Les le instructions itératives sont commandées par trois types boucles: while le for le do while while Lasyntaxedu while estdécritedanslatable6.1. Le while férente zéro). répète Il correspond l'instruction à l'organigramme tant que la valeur la gure l'expression 6.1. s'interprète comme vraie (dif- Dans l'exemple 6.5, la fonction getchar() clavier. Nous supposerons que la valeur est une fonction qui lit un seul caractère sur le EOF est connue et correspond à ce que retourne la fonction getchar() D sur un lorsque système la n type chier UNIX est par détectée exemple). sur le Nous clavier(par reparlerons la frappe manière du caractère approfondie Contrôle getchar() dans la section cases Dans du tableau cet exemple tab. Cet 6.5, exemple les caractères n'est pas sont sécurisé lus un en par ce un sens au qu'il clavier n'y et a pas sont rangés vérication dans les déborment du tableau. Nous verrons(prog. 6.7) que cet exemple peut être réécrit à l'ai d'une boucle for manièreànepasdéborrdutableau. L'exemple 6.6 correspond à la recopie la chaîne caractères contenue dans tab Letestnchaînecorrespondà dans tab2. tab[i] == '\0' correspond à puisqueletestpassagedanslaboucle tab[i]!= nul('\0')àlanlachaîne '\0'. Ce test fonctionne correctement car le compilateur a mis un octet tab (quisanscelan'enseraitpasune).

75 CHAPITRE 6. INSTRUCTIONS DE CONTRÔLE 61 exp1; for(exp1; exp2; exp3) inst est while(exp2) { équivalent inst exp3; à } Tab. 6.2Comparaisondu for etdu while Fig. 6.2Organigrammedu for for La syntaxe du for est donnée dans l'encart suivant. for( exp1; exp2; exp3 ) instruction Le for s'utilise avec trois expressions, séparées par s points virgules, qui peuvent être vis: 1. l'expression expr1 expression d'initialisation; estréaliséeuneseulefoislorsl'entréedanslaboucle,nousl'appellerons 2. l'expression expr2 itération, y compris est la la première. condition Si d'exécution l'expression l'instruction. Elle est testée à chaque expr2 controlée par le prend la valeur vraie l'instruction for est exécutée, sinon la boucle se termine; 3. l'expression expr3 calculer la prochaine contrôle valeur l'avancement avec laquelle la condition la boucle. Elle passage permet va être manière retestéee, générale elle est exécutée après l'instruction à chaque itération avant le nouveau test passage. Le for est équivalent à un while contrôle comme il est montré dans le tableau plus une 6.2. instruction d'initialisation et une instruction Le for correspond à l'organigramme 6.2. l'instruction Dansle forcommedansle n'est pas forcément while,ilestàremarquer,queletestestplacéentêteetdoncque exécutée. Voici quelques exemples boucle for : 1. for (i = 0 ; i < 10 ; i++) 2. for (i = 0, j = 10 ; i < j ; i++, j--)

76 INSTRUCTIONSITÉRATIVES 3. for ( ; ; ) inst Fig. 6.3Organigrammedu do while Dans Le cet premier exemple, exemple l'expression correspond d'initialisation à une boucle met la parcours valeur 0 classique dans la d'un variable tableau qui joue taille le rôle 10. d'indice est strictement pour parcourrir inférieur à le la tableau; taille du la tableau condition (10), d'exécution et la progression se fait en d'indice testant se si fait l'indice par pas courant en utilisant l'opérateur d'incrémentation(++). 1 dans Le l'expression uxième exemple d'avancement montre comment la boucle, avoir en utilisant plusieurs l'opérateur initialisations succession et plusieurs,. expressions innie Le est troisième utilisé exemple lorsque l'instruction est une convention qu'elle contrôle pour écrire n'est une pas une boucle instruction innie. Ce simple type mais boucle un bloc d'instructions dans lequel se trouvent s conditions sortie la boucle (voir section plutôt 6.3 sur les ruptures séquence). L'exemple 6.7 montre l'utilisation d'une boucle for au clavier et l'aectation du tableau avec les caractères pour lus. L'expression la lecture d'un ensemble condition d'exécution caractères réalise tableau(indice plusieurs inférieur actions. à Elle la taille commence du tableau). par vérier Puis elle qu'il réalise n'y a la pas lecture risque d'un caractére déborment au clavier du qu'elle stocke dans la variable c. La valeur mise dans la variable c quelanchiern'apasétéatteinte(attentionauparenthésageilestindispensableàlabonne est alors testée pour vérier exécution). tableau et le Si caractère les ux lu conditions n'est EOF, sont le caractére réunies, la lu valeur est mis dans l'indice l'élément est inférieure correspondant à la taille au rang du contenu dans la variable rang do while Lasyntaxedu do while estdonnéedansl'encartsuivant: do instruction while( expression ); Al'inversedu while,ledo while Il ressemble aux REPEAT UNTIL d'algol placesontestennd'exécution,d'oùaumoinsuneexécution. du ou PASCAL. L'organigramme correspond à celui while aumoinsunefois. mais avec le test en n plutôt qu'en début, ce qui assure que l'instruction est réalisée Dans l'exemple donné dans le programme 6.8, les variables i, n et le tableau d'entiers s modiés la manière suivante: sont 1. s[0]reçoit4et ireçoit1puis nreçoit 563; nétantalorssupérieurà10labouclecontinue; 2. s[1] reçoit3et ireçoit2puis nreçoit 56; nétantalorssupérieurà10labouclecontinue;

77 CHAPITRE 6. INSTRUCTIONS DE CONTRÔLE s[2] reçoit6et i reçoit3puis n reçoit 5; n étantalorsinférieurà10labouclesetermine. Lorsque danslesélémentsrangs0,1et2. la boucle est terminée, le tableau d'entier contient les valeurs 4, 3, et 6 respectivement Remarques sur les instructions itératives ouunbloc. Comme nous l'avons vu dans la section 5.4, une instruction peut être une instruction simple sur Les la programmation diérentes boucles structurée, peuvent il être faut imbriquées s'astreindre et, à une comme certaine nous mise le verrons en page dans pour le faciliter chapitre la 7 lecture du programme. 6.3 Ruptures séquence sant Dans vouloir le cas où sortir une boucle cette comman boucle alors l'exécution que la condition d'un bloc d'instructions, passage est encore il peut vali. être Ce intéres- d'opération est appelé une rupture séquence. Les ruptures séquence sont utilisées lorsque type s conditions multiples peuvent conditionner l'exécution d'un ensemble d'instructions. travail: Les ruptures séquence sont réalisées par quatre instructions qui corresponnt à leur niveau 1. continue 2. break 3. goto 4. return d'unprogramme.ils'agitl'appelauxfonctions Deux appels fonctions la bibliothèque permettent aussi modier l'ordre d'exécution void exit(int status) du programme et quiterminel'exécution void longjmp(jmp_buf env, int val) reprise mis dans le programme. qui permet sauter à un point continue L'instruction continue l'itération suivante la boucle est utilisée en sautant en relation à la n avec du les bloc. boucles. Ce faisant, Elle provoque elle provoque le passage la non à exécution s instructions qui la suivent à l'intérieur du bloc. et le Prenons nombre le total programme caractères. 6.9, qui Les compte caractères le nombre sont considérés caractères comme non blancs blancs s'ils rentrés sont au égaux clavier, à l'espace, la tabulation horizontale, le saut ligne ou le retour à la colonne numéro zéro. soit lanl'exécution: À 1. i clavier; contient une valeur qui correspond au nombre total caractères qui ont été tapés au 2. j contient une valeur qui correspond au nombre caractères non blancs; 3. et i-j contient une valeur qui correspond au nombre caractères blancs break Nous avons déjà vu une utilisation du break sortir d'un bloc d'instruction associé à une instruction dans le répétitive switch. Plus ou alternative généralement, controlée il permet par les

78 RUPTURES DE SÉQUENCE Fig. 6.4 break et continue dansun for Fig. 6.5 break et continue dansun while instructions if, for,un whileouun do puisqu'il ne permet sortir que d'un niveau while.iln'estpasaussigénéralqu'enadaouenjava d'imbrication. le nombre Dans l'exemple caractères 6.10, jusqu'au nous reprenons retour chariot l'exemple en 6.9, utilisant manière l'instruction à créer break. une boucle Lorsque qui le compte chariot('\r')estrencontré,le breakprovoquelasortielaboucle for.ilenseraitmêmeavec retour un while ouun do while. letableauenvériantqu'iln'yapasdébormenttaille.danscecas,nousutilisonsle Dans l'exemple 6.11, nous reprenons l'exemple 6.5, manière à créer une boucle qui remplit break poursortirlabouclelorsquelanchierestrencontrée. Lesgures6.4,6.5et6.6sontsorganigrammesquimontreleseetsdu break etducontinue surlesboucles for, while,et do while.

79 CHAPITRE 6. INSTRUCTIONS DE CONTRÔLE goto Fig. 6.6 break et continue dansun do while Le goto nuit à la lisibilité permet s d'aller programmes. n'importe Il où est à cependant l'intérieur très d'une utilisé fonction. après Son s utilisation détections systématique il permet sortir plusieurs blocs imbriqués. Il est associé à une étiquette appelée d'erreur, label. car labelestunechaînecaractèressuiviedudoublepoint :. Un Leprogramme6.12estunextraitlasuitetestsducompilateur gcc.dansceprogramme: test_goto1() doitretourner2sil'argumentquiluiestpasséestdiérent0et1sinon. test_goto2() doitretourner8sil'argumentquiluiestpasséestinférieurà10et4sinon. main() provoquel'appellafonction test_goto1() fonction successivementaveclesvaleurs0et1puisla test_goto2 Les résultats obtenus avec par une les retours valeur inférieure d'appels à 10 fonctions (3) et une sont valeur cumulés supérieure dans la à variable 10 (30). globale goto_val return Nous étudierons manière plus détaillée les fonctions dans le chapitre 8. L'instruction return provoque fonction appelante. la terminaison Cette instruction l'exécution peut la être fonction mise à dans tout laquelle moment elle dans se le trouve corps et d'une le retour fonction; à la son n d'une exécution fonction. provoque la n celle-ci. Cette instruction est appelée manière implicite à la Le return fait en évaluant permet l'expression calculer qui suit une le valeur return. correspondant L'expression au est type évaluée sa et fonciton. la valeur Ce calculée calcul est se retournée à la fonction appelante. Lorsque la fonction est type void, le return où la fonction est associé à un type qui n'est pas void, est utilisé la valeur sans expression calculée par associée, le return dans est le celle cas que retourne la fonction contenant le return. Les formes possibles du return sont donc: return; return expression; lafonctionprovoque:lecalcullavaleuràretrouner,lasortielafonction,lacontinuation Ilpeutyavoirplusieurs returndansunefonction,lepremierquiestexécutédanslecontexte l'exécution la fonction appelante. Nous allons créer une fonction (voir prog. 6.13) qui retourne : 0 si elle lit une majuscule, 1 ellelituneminuscule, si 2 siellelitunchire, -1 siellelit EOF et -2 danstouslesautrescas.

80 EXERCICES SUR LES INSTRUCTIONS DE CONTRÔLE 6.4 Exercices sur les instructions contrôle Exercice 1 Lire2entiers i et j. Écrire avec celui l'instruction possédant la plus gran valeur absolue if avec l'opérateur ternaire Exercice 2 Écrire un programme qui imprime le type lettre(voyelle ou consonne) entrée au clavier. Remarque: il peut être judicieux transformer les majuscules en minuscules Exercice 3 Al'aid'uneboucle for,lire10entiersetlesstockerdansuntableau. Réécrire le contenu du tableau à l'ai d'une boucle while Exercice 4 En utilisant une boucle do while, transformer l'exercice 2 façon à arréter le traitement lorsqu'un caractère autre qu'une lettre est entré au clavier. 6.5 Exercices sur les ruptures séquence Exercice 5 retour Lire chariot) caractère et par la stocker caractère dans une un ligne tableau. entrée au clavier (la n ligne est caracterisée par un unique, Transformer et en remplacant cette ligne le retour en remplacant chariot une n suite ligne d'espaces par le ou caractère une tabulation nul('\0'). par un espace Réécrire la ligne ainsi transformée par un printf() chaîne caractères Exercice 6 en l'écriture Cet exercice la consiste lettre correspondant en la lecture d'un à ce entier, rang. qui est le rang d'une lettre dans l'alphabet, et Pourcelailfaudra: initialiser faireunebouclelectured'unentier; un tableau caractères avec l'alphabet; sortirlabouclelorsquel'entierluest100; imprimer dans les autres la lettre cas correspondant reboucler en lecture. à l'entier lorsque celui-ci est compris entre 1 et 26;

81 CHAPITRE 6. INSTRUCTIONS DE CONTRÔLE 67 Programme 6.2 Exemple table sauts 1 /* Extracted from GCC source co: this co is copyrighted see GCC source 2 * co for copyright license 3 */ 4 extern void ERROR (char *,...); 5 extern void warning (char *,...); 6 extern void pedwarn (char *,...); 7 extern int fflag, lflag, imag, pedantic; 8 void 9 exemple (char *p) 10 { 11 switch (*p++) 12 { 13 case 'f': 14 case 'F': 15 if (fflag) 16 ERROR ("more than one 'f' suffix on floating constant"); 17 fflag = 1; 18 break; case 'l': 21 case 'L': 22 if (lflag) 23 ERROR ("more than one 'l' suffix on floating constant"); 24 lflag = 1; 25 break; case 'i': 28 case 'I': 29 case 'j': 30 case 'J': 31 if (imag) 32 ERROR ("more than one 'i' or 'j' suffix on floating constant"); 33 else if (pedantic) 34 pedwarn ("ISO C forbids imaginary numeric constants"); 35 imag = 1; 36 break; fault: 39 ERROR ("invalid suffix on floating constant"); 40 } 41 }

82 EXERCICES SUR LES RUPTURES DE SÉQUENCE Programme 6.3 Exemple table sauts 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) 4 { 5 int i; 6 scanf ("%d", &i); 7 switch (i) 8 { 9 case 6: 10 case 8: 11 printf ("le nombre est superieur a 5\n"); 12 case 0: 13 case 2: 14 case 4: 15 printf ("le nombre est pair\n"); 16 break; 17 fault: 18 printf ("ceci n est pas un nombre\n"); 19 break; 20 case 9: 21 case 7: 22 printf ("le nombre est superieur a 5\n"); 23 case 5: 24 case 1: 25 case 3: 26 printf ("le nombre est impair\n"); 27 break; 28 } 29 return 0; 30 } Données en entrée 5 Données écrites sur le fichier standard sortie le nombre est impair

83 CHAPITRE 6. INSTRUCTIONS DE CONTRÔLE 69 Programme 6.4 Exemple table sauts 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) 4 { 5 int c, nb_chiffres = 0, nb_lettres = 0, nb_autres = 0; 6 while ((c = getchar ())!= EOF) 7 { 8 switch (c) 9 { 10 case '0': case '1': case '2': case '3': case '4': 11 case '5': case '6': case '7': case '8': case '9': 12 nb_chiffres++; 13 break; 14 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': 15 case 'g': case 'h': case 'i': case 'j': case 'k': 16 case 'l': /* toutes les valeurs s */ 17 case 'm': /* lettres doivent etre */ 18 case 'n': /* presentes dans les case */ 19 case 'o': case 'p': case 'q': case 'r': case 's': case 't': 20 case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': 21 nb_lettres++; 22 break; 23 fault: 24 nb_autres++; 25 break; 26 } 27 } 28 printf ("Chiffres lettres et autres sur le fichier d'entree : %d %d %d\n", 29 nb_chiffres, nb_lettres, nb_autres); 30 return 0; 31 } Données en entrée The quick brown fox jumped over the lazy dog, Données écrites sur le fichier standard sortie Chiffres lettres et autres sur le fichier d'entree :

84 EXERCICES SUR LES RUPTURES DE SÉQUENCE Programme 6.5 Lecture d'une ligne avec while 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) 4 { 5 char tab[80]; 6 int c, rang = 0; 7 while ((c = getchar ())!= EOF) 8 tab[rang++] = c; 9 tab[rang]='\0'; 10 printf("caracteres lus : %s\n",tab); 11 return 0; 12 } Données en entrée The quick brown fox jumped over the lazy dog, Données écrites sur le fichier standard sortie Caracteres lus : The quick brown fox jumped over the lazy dog, Programme 6.6 Recopie d'une chaîne avec une boucle while 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) 4 { 5 char tab[] = "Message initialise"; 6 char tab2[50]; 7 int i = 0; 8 while (tab[i]) 9 { 10 tab2[i] = tab[i]; 11 i++; 12 } 13 tab2[i] = '\0'; 14 printf ("Resultat la copie tab : %s \n", tab); 15 printf ("dans tab2 : %s \n", tab2); 16 return 0; 17 } Données écrites sur le fichier standard sortie Resultat la copie tab : Message initialise dans tab2 : Message initialise

85 CHAPITRE 6. INSTRUCTIONS DE CONTRÔLE 71 Programme 6.7 Lecture d'une ligne avec for 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) 4 { 5 char tab[80]; 6 int rang, c; 7 for (rang = 0; rang < 80 && (c = getchar ())!= EOF; rang++) 8 tab[rang] = c; 9 tab[rang]='\0'; 10 printf ("Contenu du tableau tab apres execution :\n\t%s\n", tab); 11 return 0; 12 } Données en entrée The quick brown fox jumped over the lazy dog, Données écrites sur le fichier standard sortie Contenu du tableau tab apres execution : The quick brown fox jumped over the lazy dog, Programme 6.8 Décomposition s puissances dix d'un nombre avec un do while 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) 4 { 5 int s[10], i = 0, j=0, n = 5634; 6 do 7 s[i++] = n % 10; 8 while ((n /= 10) > 10); 9 printf("valeurs s entiers dans s : "); 10 for(j=0;j<i;j++){ 11 printf("%d ",s[j]); 12 } 13 printf("\n"); 14 return 0; 15 } Données écrites sur le fichier standard sortie Valeurs s entiers dans s : 4 3 6

86 EXERCICES SUR LES RUPTURES DE SÉQUENCE Programme 6.9 Utilisation du continue dans une boucle for 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) 4 { 5 int i, j, c; 6 for (i = 0, j = 0; (c = getchar ())!= EOF; i++) 7 { 8 if (c == ' ') 9 continue; 10 if (c == '\t') 11 continue; 12 if (c == '\r') 13 continue; 14 if (c == '\n') 15 continue; 16 j++; 17 } 18 printf ("Caracteres lus : %d dont non blancs %d \n", i, j); 19 return 0; 20 } Données en entrée The quick brown fox jumped over the lazy dog, Données écrites sur le fichier standard sortie Caracteres lus : 58 dont non blancs 48 Programme 6.10 Utilisation s ruptures séquence dans une boucle for 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) 4 { 5 int i, j, c; 6 for (i = j = 0; (c = getchar ())!= EOF; i++) 7 { 8 if (c == '\r') 9 break; 10 if (c == ' ') 11 continue; 12 j++; 13 } 14 printf ("Caracteres lus : %d dont non blancs %d \n", i, j); 15 return 0; 16 } Données en entrée The quick brown fox jumped over the lazy dog, Données écrites sur le fichier standard sortie Caracteres lus : 58 dont non blancs 49

87 CHAPITRE 6. INSTRUCTIONS DE CONTRÔLE 73 Programme 6.11 Lecture d'une ligne avec for et break 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) 4 { 5 char tab[80]; 6 int c, rang; 7 for (rang = 0; rang < 80; rang++) 8 { 9 if ((c = getchar ())!= EOF) 10 tab[rang] = c; 11 else 12 break; 13 } 14 tab[rang]='\0'; 15 printf("ensemble caracteres lus :\n %s\n",tab); 16 return 0; 17 } Données en entrée The quick brown fox jumped over the lazy dog, Données écrites sur le fichier standard sortie Ensemble caracteres lus : The quick brown fox jumped over the lazy dog,

88 EXERCICES SUR LES RUPTURES DE SÉQUENCE Programme 6.12 Utilisation l'infâme goto 1 /* From GCC TestSuite this co is copyrighted see GCC source co for 2 * copyright license */ 3 /* Check the use of goto. */ 4 5 int goto_val; 6 7 int 8 test_goto1 (int f) 9 { 10 if (f) /* count(2) */ 11 goto lab1; /* count(1) */ 12 return 1; /* count(1) */ 13 lab1: 14 return 2; /* count(1) */ 15 } int 18 test_goto2 (int f) 19 { 20 int i; 21 for (i = 0; i < 10; i++) /* count(15) */ 22 if (i == f) 23 goto lab2; /* count(14) */ 24 return 4; /* count(1) */ 25 lab2: 26 return 8; /* count(1) */ 27 } 28 /* Add co for test not includ in GCC test suite */ 29 #inclu <stdio.h> 30 int 31 main(int argc, char * argv) 32 { 33 printf("res1 %d\n",goto_val += test_goto1 (0)); 34 printf("res2 %d\n",goto_val += test_goto1 (1)); 35 printf("res3 %d\n",goto_val += test_goto2 (3)); 36 printf("res4 : %d\n",goto_val += test_goto2 (30)); 37 return 0; 38 } Données écrites sur le fichier standard sortie Res1 1 Res2 3 Res3 11 Res4 : 15

89 CHAPITRE 6. INSTRUCTIONS DE CONTRÔLE 75 Programme 6.13 Utilisation plusieurs return 1 #inclu <stdio.h> 2 int 3 testc (int c) 4 { 5 switch (c) 6 { 7 case EOF: 8 return -1; 9 case 'A': case 'B': case 'C': case 'D': case 'E': 10 case 'F': case 'G': case 'H': case 'I': case 'J': 11 case 'K': case 'L': case 'M': case 'N': case 'O': 12 case 'P': case 'Q': case 'R': case 'S': case 'T': 13 case 'U': case 'V': case 'W': case 'X': case 'Y': 14 case 'Z': 15 return 0; 16 case '0': case '1': case '2': case '3': case '4': 17 case '5': case '6': case '7': case '8': case '9': 18 return 2; 19 case 'a': case 'b': case 'c': case 'd': case 'e': 20 case 'f': case 'g': case 'h': case 'i': case 'j': 21 case 'k': case 'l': case 'm': case 'n': case 'o': 22 case 'p': case 'q': case 'r': case 's': case 't': 23 case 'u': case 'v': case 'w': case 'x': case 'y': 24 case 'z': 25 return 1; 26 fault: 27 break; 28 } 29 return -2; 30 }

90 EXERCICES SUR LES RUPTURES DE SÉQUENCE Programme 6.14 Suggestion corrigé chapitre 6 exercice 1 1 #inclu <stdio.h> 2 int 3 main(int argc, char *argv[], char **envp){ 4 int i, j; /* finitions ux entiers */ 5 printf(" Entrer les valeurs i et j "); 6 scanf("%d%d", &i, &j); /* lecture s ux entiers */ 7 /* ecriture l'entier possedant la plus gran valeur 8 * absolue a l'ai l'instruction if 9 */ 10 if(i == j i == -j){ 11 printf("\nles ux entiers i (%d) et j (%d) ", i, j); 12 printf("sont egaux en valeur absolue\n"); 13 return 0; 14 } 15 printf("\nle plus grand en valeur absolue i (%d) et j (%d)", i, j); 16 printf(" est : "); 17 if(i < 0) 18 if(j < 0) 19 if(i > j) printf(" j : %d\n", j); 20 else printf("i : %d\n", i); 21 else if(-i > j) printf("i %d\n", i); 22 else printf("j : %d\n", j); 23 else if(j < 0) 24 if(i > -j) printf("i %d\n", i); 25 else printf("j : %d\n", j); 26 else if(i > j) printf("i %d\n", i); 27 else printf("j : %d\n", j); 28 /* ecriture l'entier possedant la plus gran valeur 29 * absolue a l'ai l'operateur ternaire 30 */ 31 printf("avec l'operateur ternaire\n"); 32 printf("le plus grand en valeur absolue i (%d) et j (%d)\n", i, j); 33 printf("est : %c \n", 34 (((i < 0? -i : i) > (j < 0? -j : j))? 'i' : 'j')); 35 printf(" dont la valeur est : %d \n", 36 (((i < 0? -i : i) > (j < 0? -j : j))? i : j)); 37 return 0; 38 } Données en entrée Données écrites sur le fichier standard sortie Entrer les valeurs i et j le plus grand en valeur absolue i (-25) et j (12) est : i : -25 Avec l'operateur ternaire le plus grand en valeur absolue i (-25) et j (12) est : i dont la valeur est : -25

91 CHAPITRE 6. INSTRUCTIONS DE CONTRÔLE 77 Programme 6.15 Suggestion corrigé chapitre 6 exercice 2 1 #inclu <stdio.h> 2 int 3 main(int argc, char *argv[], char **envp){ 4 char c; /* finition la variable */ 5 /* saisie du caractere a analyser */ 6 printf(" Entrer une lettre : "); 7 scanf(" %c", &c); 8 /* transformation s majuscules en minuscules */ 9 if (c >= 'A' && c <= 'Z') 10 c += 'a' - 'A'; 11 /* ecriture du type lettre */ 12 switch (c){ 13 case 'a': case 'e': case 'i': 14 case 'o': case 'u': case 'y': 15 printf(" la lettre est une voyelle \n"); 16 break; 17 case 'b': case 'c': case 'd': case 'f': 18 case 'g': case 'h': case 'j': case 'k': 19 case 'l': case 'm': case 'n': case 'p': 20 case 'q': case 'r': case 's': case 't': 21 case 'v': case 'w': case 'x': case 'z': 22 printf(" la lettre est une consonne \n\n"); 23 break; 24 fault: 25 printf(" pas une lettre!!!\n\n"); 26 break; 27 } 28 return 0; 29 } Données en entrée R Données écrites sur le fichier standard sortie Entrer une lettre : la lettre est une consonne

92 EXERCICES SUR LES RUPTURES DE SÉQUENCE Programme 6.16 Suggestion corrigé chapitre 6 exercice 3 1 #inclu <stdio.h> 2 int tab[10]; /* finition du tableau */ 3 int 4 main (int argc, char *argv[], char **envp){ 5 int i; 6 int *pt; /* pointeur pour accer au tableau */ 7 int nbel = 5; 8 /* premiere solution */ 9 /* remplissage du tableau a l'ai d une boucle for */ 10 printf(" entrer les %d entiers : ", nbel); 11 for(i = 0; i < nbel; i++) scanf("%d", &tab[i]); 12 printf("\n"); 13 /* ecriture du tableau avec une boucle while */ 14 i = 0; 15 while(i < nbel) 16 printf(" l'element %d du tableau est %d \n", i, tab[i++]); /* uxieme solution a l'ai d'un pointeur */ 19 /* remplissage du tableau a l'ai d'une boucle for */ 20 pt = tab; 21 printf(" entrer les %d entiers : ", nbel); 22 for(i = 0; i < nbel; i++) scanf ("%d", pt++); 23 printf("\n"); 24 /* ecriture du tableau */ 25 i = 0; 26 pt = tab; 27 while(pt < &tab[nbel]){ 28 printf(" l'element %d du tableau est %d \n", i, *pt++); 29 i++; 30 } 31 return 0; 32 } Données en entrée Données écrites sur le fichier standard sortie entrer les 5 entiers : l'element 1 du tableau est 1 l'element 2 du tableau est 2 l'element 3 du tableau est 3 l'element 4 du tableau est 4 l'element 5 du tableau est 5 entrer les 5 entiers : l'element 0 du tableau est 6 l'element 1 du tableau est 7 l'element 2 du tableau est 8 l'element 3 du tableau est 9 l'element 4 du tableau est 10

93 CHAPITRE 6. INSTRUCTIONS DE CONTRÔLE 79 Programme 6.17 Suggestion corrigé chapitre 6 exercice 4 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[], char **envp){ 4 char c; 5 int count = 0; 6 /* saisie du caractere a analyser */ 7 printf(" Entrer une lettre : "); 8 count = scanf(" %c", &c); 9 if (count <= 0) return 0; 10 do{ 11 /* transformation s majuscules en minuscules */ 12 if (c >= 'A' && c <= 'Z') 13 c += 'a' - 'A'; 14 /* ecriture du type lettre */ 15 switch(c){ 16 case 'a': case 'e': case 'i': 17 case 'o': case 'u': case 'y': 18 printf(" la lettre est une voyelle \n"); 19 break; 20 case 'b': case 'c': case 'd': case 'f': 21 case 'g': case 'h': case 'j': case 'k': 22 case 'l': case 'm': case 'n': case 'p': 23 case 'q': case 'r': case 's': case 't': 24 case 'v': case 'w': case 'x': case 'z': 25 printf(" la lettre est une consonne \n"); 26 break; 27 fault: 28 printf(" pas une lettre!!!\n\n"); 29 break; 30 } 31 printf(" Entrer une lettre : "); 32 count = scanf(" %c", &c); 33 }while(count == 1); 34 return 0; 35 } Données en entrée qwerty Données écrites sur le fichier standard sortie Entrer une lettre la lettre est une consonne Entrer une lettre la lettre est une consonne Entrer une lettre la lettre est une voyelle Entrer une lettre la lettre est une consonne Entrer une lettre la lettre est une consonne Entrer une lettre la lettre est une voyelle Entrer une lettre :

94 EXERCICES SUR LES RUPTURES DE SÉQUENCE Programme 6.18 Suggestion corrigé chapitre 6 exercice 5 1 #inclu <stdio.h> 2 char tab[100]; /* ligne initiale */ 3 char ntab[100]; /* ligne avec blancs compresses */ 4 int 5 main (int argc, char *argv[], char **envp) 6 { 7 char c; 8 int i 0; /* indice dans tab */ 9 int j = 0; /* indice dans ntab */ 10 int blk = 0; /* 1 si blanc rencontre 0 sinon */ 11 int s = 0; /* marque but ligne */ 12 /* remplissage du tableau par lecture la ligne */ 13 printf(" Entrer une chaine avec s tabs et s blancs \n"); 14 while((c = getchar ())!= '\n'){ 15 if (i >= 99) break; 16 tab[i++] = c; 17 } 18 tab[i] = '\0'; 19 /* parcours tab et passage dans ntab en supprimant */ 20 /* les caracteres inutiles */ 21 i = 0; 22 while((c = tab[i++])!= '\0'){ 23 /* elimination s tabs et s blancs but ligne */ 24 if((c == ' ' c == '\t') && s == 0) continue; 25 s = 1; 26 /* remplacement la tabulation par un blanc */ 27 if(c == '\t') c = ' '; 28 /* remplacement plusieurs blancs par un seul */ 29 if(c == ' ') 30 if(blk!= 0) continue; 31 else blk = 1; 32 else blk = 0; 33 ntab[j++] = c; 34 } 35 ntab[j] = '\0'; /* on assure la fin chaine */ 36 printf("\nancienne ligne :\n %s\n", tab); 37 printf("nouvelle ligne :\n %s\n", ntab); 38 return 0; 39 } Données en entrée parcours tab et passage dans ntab en supprimant Données écrites sur le fichier standard sortie Entrer une chaine avec s tabs et s blancs Ancienne ligne : parcours tab et passage dans ntab en supprimant Nouvelle ligne : parcours tab et passage dans ntab en supprimant

95 CHAPITRE 6. INSTRUCTIONS DE CONTRÔLE 81 Programme 6.19 Suggestion corrigé chapitre 6 exercice 6 1 #inclu <stdio.h> 2 3 /* Tableau contenant l'alphabet */ 4 char tab[] = "abcfghijklmnopqrstuvwxyz"; 5 int 6 main(int argc, char *argv[], char **envp){ 7 int i, count; 8 /* boucle lecture */ 9 while (1){ 10 i = 0; 11 printf("entrer un nombre : "); 12 count = scanf("%d", &i); 13 if(count!= 1) break; /* on n'a pas lu un nombre */ 14 if(i == 100) break; /* sortie la boucle */ 15 if(i < 1 i > 26) continue; /* nombre n'est pas entre 1 et 26 */ 16 /* ecriture la lettre correspondante */ 17 printf("\nle nombre %d correspond a la lettre %c \n", i, tab[i - 1]); 18 } 19 printf("\nfini\n"); 20 return 0; 21 } Données en entrée Données écrites sur le fichier standard sortie entrer un nombre : le nombre 12 correspond a la lettre l entrer un nombre : le nombre 4 correspond a la lettre d entrer un nombre : entrer un nombre : le nombre 6 correspond a la lettre f entrer un nombre : entrer un nombre : le nombre 26 correspond a la lettre z entrer un nombre : Fini

96 EXERCICES SUR LES RUPTURES DE SÉQUENCE

97 Chapitre 7 Programmation structurée La programmation structurée est un nom générique qui couvre un courant pensées qui s'est développé entre les années 1965 et La programmation structurée a pour but faciliter le travail relecture s programmes et minimiser le travail maintenance. 7.1 Historique L'historiquecemouvementestàpeuprèslesuivant: 1965 avec les Dijkstra premiers [Dij65] développements propose la suppression d'algol. GOTO dans les langages. Ceci est associé Dijkstra[Dij68] Wirth [Wir71] le propose père du les langage 3 structures Pascal fondamentales écrit un article en programmation. ranements successifs. sur la programmation par De nombreux 1974 Wirth[Wir74] autres articles explicite ont été la écrits manière sur d'écrire ce sujet. un programme bien structuré. 7.2 Idées fondamentales programme.cependantlaprogrammationstructuréenesecaractérisepasparl'absencegoto, La première règle en programmation structurée est minimiser le nombre GOTO dans le maisparlaprésencestructuresdansleprogramme.lesidéesbasesontlessuivantes: La programmation peut se faire en utilisant un nombre réduit structures programmes. La Les présentation tâches doivent du être programme éclatées doit en sous-tâches(ranement). reéter la structure du programme. Le particulier, ranement les données doit être manipulées fait en tenant par une compte tâche s doivent données être manipulées déclarées près par les la tâches. tâche. En Chaquesous-tâchedoitavoirunpointd'entréeuniqueetunpointsortieunique.Ilyeut une longue polémique sur la dénition d'un point sortie unique. Lesstructuresfondamentalessontaunombrequatre1 : 1. séquence les instructions sont exécutées manière séquentielle. 2. sélection sous trois formes: : qui représente un choix dans le co à exécuter. La sélection peut se présenter if else : représentant une alternative. 1Dijkstra a démontré que toute structure programme peut en fait se ramener aux trois premières.

98 LANGAGE C ET PROGRAMMATION STRUCTURÉE if orif : permettant décrire un choix multiple. case :stinéàcréerstablesvérité. 3. itération boucles ont : été pour choisies: répéter un traitement tant qu'une condition est vériée. Deux types laboucle while laboucle :quiplaceletestavantletraitement. until :quiplaceletestaprèsletraitement. 4. sortie est stinée à terminer une sous-tâche. Deux types sortie sont possibles: escape termine la sous-tâche. cycle cette permetsauterlesinstructionssuivantesd'uneboucleetpasseraucyclesuivant boucle. Il est la sémantique possible propre distinguer au langage trois niveaux et ses restrictions; dans la structuration d'un programme: le la respect présentation s recommandations du texte du programme. au niveau l'utilisation s structures programme; 7.3 Langage C et programmation structurée structurés. Le langage Il supporte C est apparu donc un en ensemble 1972, c'est-à-dire fonctionnalités en pleine qui pério sont directement réexion issues sur les langages rant pensée. Le langage C n'a cependant pas l'ambition d'obliger les programmeurs à respecter ce cou- un et il quelconque ore peu style restrictions programmation, sémantiques. ilest en eet peu contraignant au niveau la compilation Ambitions du langage C ce LelangageCaétéconçuetréalisépourécrireunsystèmed'exploitationetleslogicielsbase faire les système(interpréteur mêmes choses que l'assembleur. comman, Il compilateur,...). est assez peu contraignant Pour ce faire, car il ces doit concepteurs être capable l'ont créé richesse pour s leur expressions) propre utilisation, que d'éviter ils ont les donc erreurs préféré programmation favoriser l'expressivité en multipliant du langage les tests (d'où à la la compilation. décrit. En Pascal, Cette le approche programmeur est diérente travaille sur une la programmation machine virtuelle, structurée la machine telle Pascal. que Wirth En C, l'a programmeur peut écrire s choses explicites qui sont liées à la structure la machine. le pas Le à les langage utiliser. C est En assez particulier, peu contraignant. il autorise les Il ore entrées s multiples structures et les programme sorties multiples mais il dans n'oblige tâches. La mise en page est libre, ce qui permet d'écrire s programmes dont la mise en page les reète richesselasyntaxeduc. la structure. Les programmes sans mise en page sont rapiment illisibles du fait la C et structures fondamentales Le tableau 7.1 montre que le C propose s structures programme équivalentes à celles recommandées dans la programmation structurée. 7.4 Quelques exemples Nousallonsécrireàchaquefoistroisexemplescopermettantréaliserlamêmetâche: le leuxièmeexempleestécritenrespectantlesstructuresmaissansmiseenpage. premier exemple est écrit manière la moins structurée possible.

99 CHAPITRE 7. PROGRAMMATION STRUCTURÉE 85 Type Structures Instruction C correspondante sélection if if orif else n'existe if(expression) pas. instruction else instruction case switch. itération until while do while(expression) instruction instruction for(expression;expression;expression) while(expression); instruction sortie escape break ou return cycle continue Tab. 7.1 C et Structures Fondamentales le rnier reéter exemple ces structures. est écrit en respectant les structures et avec une mise en page qui tente Nous allons réaliser cet exercice avec s tests et une boucles. Sur les systèmes type UNIX, les outils tels que cb ou innt mettre en page du co mal présenté. Ils fournissent un bon point départ peuvent pour être avoir utilisés s idées pour aussi lamiseenpagecorrecte.l'éditeur pour d'autre langages. emacsréalisecetyped'assistancepourlelangagecmais Exemple avec s tests apourbutdéterminerquelentier Latâcheréaliséeparl'ensembletestsquenousallonsécrireplusieursmanièresdiérentes, i ou j alaplusgranvaleurabsolue. lectureceprogramme7.1esttrouverlecheminquiarrivesurlesétiquettes.pourlarecherche Le programme 7.1 est écrit manière la moins structurée possible. La diculté lors la d'erreur ligne. dans un co ce type, il faut déterminer comment le programme est arrivé sur une dicile Le programme savoir quelles 7.2 est conditions écrit manière ont mené structurée à une ligne. mais En sans particulier mise en page. il est Dans délicat ce cas, trouver il est la condition correspondant à un else. apparaître Le programme manière 7.3 plus est écrit évinte manière l'imbrication structurée s avec mise en page. La mise en page fait if else. Uneautrefaçonclaired'écrireducoavecs if et s commentaires pour intier les accolas fermantes. elseimbriquésestmettresaccolas programme 7.4. Cette technique est illustrée par le letypelastructureetlenumérocettestructureencommentaires.cettetechniqueestillustrée Certainsprogrammeursannotentlesaccolasouvrantesetfermantesavecslabelsintiant dans le programme 7.5. terminal. L'avantage Cela évite ces solutions remonter apparaît dans le source lorsque en la cherchant condition le s'étend sur plusieurs pages d'un if correspondant à un else. 7.6, Il le est calcul possible donnant réaliser la condition la même doit tâche être en commenté utilisant car une les table diérentes branchement. valeurs possibles Dans l'exemple pas évintes à trouver. ne sont

100 QUELQUESEXEMPLES Exemple avec une boucle un tableau Nous allons dont réaliser la fonction une fonciton ne connait qui pas calcule la taille), la longueur la boucle d'un réalise chaîne le parcours caractère(vue du tableau comme caractères(tabc) et continue tant que la caractère lu n'est pas le caractère '\0'. s Le goto. programme 7.7 réalise ce parcours tableau, il est écrit manière non structurée avec Leprogramme7.8réaliseceparcourstableau,ilestécritmanièrestructuréeavecun for maislamiseenpagelaisseàdésirer. en page. Le programme 7.9 réalise ce parcours tableau, il est écrit manière structurée avec mise

101 CHAPITRE 7. PROGRAMMATION STRUCTURÉE 87 Programme 7.1 Ensemble tests non structuré 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) 4 { 5 int i, j; 6 printf ("Veuillez entrer ux valeurs entieres : "); 7 scanf ("%d%d", &i, &j); 8 if (i == j) 9 goto T3; 10 if (i <= 0) 11 goto L1; 12 if (j <= 0) 13 goto L2; 14 if (i > j) 15 goto T2; 16 goto T1; 17 L2:if (i > -j) 18 goto T2; 19 goto T1; 20 L1:if (j <= 0) 21 goto L3; 22 if (-i > j) 23 goto T2; 24 goto T1; 25 L3:if (-i > -j) 26 goto T2; 27 T1:printf (" le plus grand est j : %d\n", j); 28 goto T4; 29 T2:printf (" le plus grand est i : %d\n", i); 30 goto T4; 31 T3:printf (" i et j sont egaux\n"); 32 T4: 33 return 0; 34 } Données en entrée Données écrites sur le fichier standard sortie Veuillez entrer ux valeurs entieres : le plus grand est j : 12

102 QUELQUESEXEMPLES Programme 7.2 Ensemble tests structuré non mis en page 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) 4 { 5 int i, j; 6 printf ("Veuillez entrer ux valeurs entieres : "); 7 scanf ("%d%d", &i, &j); 8 if (i == j) printf (" i et j sont egaux\n"); 9 else if (i < 0) if (j < 0) 10 if (-i > -j) printf (" le plus grand est i : %d\n", i); 11 else printf (" le plus grand est j : %d\n", j); 12 else if (-i > j) printf (" le plus grand est i : %d\n", i); 13 else printf (" le plus grand est j : %d\n", j); 14 else if (j < 0) if (i > -j) printf (" le plus grand est i : %d\n", i); 15 else printf (" le plus grand est j : %d\n", j); 16 else if (i > j) printf (" le plus grand est i : %d\n", j); 17 else printf (" le plus grand est j : %d\n", j); 18 return 0; 19 } Données en entrée Données écrites sur le fichier standard sortie Veuillez entrer ux valeurs entieres : le plus grand est j : 12

103 CHAPITRE 7. PROGRAMMATION STRUCTURÉE 89 Programme 7.3 Ensemble tests structuré et mis en page 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) 4 { 5 int i, j; 6 printf ("Veuillez entrer ux valeurs entieres : "); 7 scanf ("%d%d", &i, &j); 8 if (i == j) 9 printf (" i et j sont egaux\n"); 10 else if (i < 0) 11 if (j < 0) 12 if (-i > -j) 13 printf ("le plus grand est i : %d\n", i); 14 else 15 printf ("le plus grand est j : %d\n", j); 16 else if (-i > j) 17 printf ("le plus grand est i : %d\n", i); 18 else 19 printf ("le plus grand est j : %d\n", j); 20 else if (j < 0) 21 if (i > -j) 22 printf ("le plus grand est i : %d\n", i); 23 else 24 printf ("le plus grand est j : %d\n", j); 25 else if (i > j) 26 printf ("le plus grand est i : %d\n", i); 27 else 28 printf ("le plus grand est j : %d\n", j); 29 return 0; 30 } Données en entrée Données écrites sur le fichier standard sortie Veuillez entrer ux valeurs entieres : le plus grand est j : 12

104 QUELQUESEXEMPLES Programme 7.4 Ensemble tests structuré et mis en page avec commentaires 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) 4 { 5 int i, j; 6 printf ("Veuillez entrer ux valeurs entieres : "); 7 scanf ("%d%d", &i, &j); 8 if (i == j) printf (" i et j sont egaux\n"); 9 else{ 10 if (i < 0){ 11 if (j < 0) 12 if (-i > -j) printf ("le plus grand est i : %d\n", i); 13 else printf ("le plus grand est j : %d\n", j); 14 else if (-i > j) 15 printf ("le plus grand est i : %d\n", i); 16 else 17 printf ("le plus grand est j : %d\n", j); 18 }else{ /* i >= 0 */ 19 if (j < 0){ 20 if (i > -j) printf ("le plus grand est i %d\n", i); 21 else printf ("le plus grand est j : %d\n", j); 22 } /* fin j < 0 */ 23 else{ 24 if (i > j) printf ("le plus grand est i %d\n", i); 25 else printf ("le plus grand est j : %d\n", j); 26 } /* fin j */ 27 } /* fin > 0 */ 28 } /* fin i!= j */ 29 return 0; 30 } Données en entrée Données écrites sur le fichier standard sortie Veuillez entrer ux valeurs entieres : le plus grand est j : 12

105 CHAPITRE 7. PROGRAMMATION STRUCTURÉE 91 Programme 7.5 Ensemble tests structuré, mis en page et étiqueté 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) 4 { 5 int i, j; 6 printf ("Veuillez entrer ux valeurs entieres : "); 7 scanf ("%d%d", &i, &j); 8 if (i == j) 9 printf (" i et j sont egaux\n"); 10 else 11 { /* ELIF 1 */ 12 if (i < 0) 13 { /* ELIF1.IF1 */ 14 if (j < 0) 15 if (-i > -j) 16 printf (" le plus grand est i : %d\n", i); 17 else 18 printf (" le plus grand est j : %d\n", j); 19 else if (-i > j) 20 printf (" le plus grand est i : %d\n", i); 21 else 22 printf (" le plus grand est j : %d\n", j); 23 } /* fin ELIF 1.IF1 */ 24 else 25 { /* ELIF 1.ELIF1 */ 26 if (j < 0) 27 { 28 if (i > -j) 29 printf (" le plus grand est i : %d\n", i); 30 else 31 printf (" le plus grand est j : %d\n", j); 32 } /* fin j < 0 */ 33 else 34 { 35 if (i > j) 36 printf (" le plus grand est i : %d\n", i); 37 else 38 printf (" le plus grand est j : %d\n", j); 39 } /* fin j > 0 */ 40 } /* fin ELIF1.ELIF1 */ 41 } /* fin ELIF 1 */ 42 return 0; 43 } Données en entrée Données écrites sur le fichier standard sortie Veuillez entrer ux valeurs entieres : le plus grand est j : 12

106 QUELQUESEXEMPLES Programme 7.6 Ensemble tests par table branchement 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) 4 { 5 int i, j; 6 printf ("Veuillez entrer ux valeurs entieres : "); 7 scanf ("%d%d", &i, &j); 8 if (i == j) 9 printf (" i et j sont egaux\n"); 10 else 11 { 12 /* l'expression (i<0) + 2*(j<0)) donne la valeur : */ 13 /* 0 si i>0 et j>0, 1 si i<0 et j>0 */ 14 /* 2 si i>0 et j<0 3 si i<0 et j<0 */ 15 switch ((i < 0) + 2 * (j < 0)) 16 { 17 case 0: 18 if (i > j) 19 printf ("le plus grand est i : %d\n", i); 20 else 21 printf ("le plus grand est j : %d\n", j); 22 break; 23 case 1: 24 if (-i > j) 25 printf ("le plus grand est i : %d\n", i); 26 else 27 printf ("le plus grand est j : %d\n", j); 28 break; 29 case 2: 30 if (i > -j) 31 printf ("le plus grand est i : %d\n", i); 32 else 33 printf ("le plus grand est j : %d\n", j); 34 break; 35 case 3: 36 if (-i > -j) 37 printf ("le plus grand est i : %d\n", i); 38 else 39 printf ("le plus grand est j : %d\n", j); 40 } /* switch */ 41 } /* fin i!= j */ 42 return 0; 43 } Données en entrée Données écrites sur le fichier standard sortie Veuillez entrer ux valeurs entieres : le plus grand est j : 12

107 CHAPITRE 7. PROGRAMMATION STRUCTURÉE 93 Programme 7.7 Boucle réalisée par s tests et sauts 1 int 2 mystrlen (char tabc[]) 3 { 4 int i; 5 i = 0; 6 B1: 7 if (tabc[i] == '\0') 8 goto B2; 9 i = i + 1; 10 if (i < 100) 11 goto B1; 12 B2: 13 return i; 14 } Programme 7.8 Boucle réalisée par un for() 1 int 2 mystrlen (char tabc[]) 3 { 4 int i; 5 for (i = 0; i < 100; i++) if (tabc[i] == '\0') break; 6 return i; 7 } Programme 7.9 Boucleréaliséeparunfor()etmiseenpage 1 int 2 mystrlen (char tabc[]) 3 { 4 int i; 5 for (i = 0; i < 100; i++) 6 if (tabc[i] == '\0') 7 break; 8 return i; 9 }

108 QUELQUESEXEMPLES

109 Chapitre 8 Fonctions traitement Les fonctions plusieurs sont fois s et/ou parties sur s co variables source diérentes. qui permettent Les mots procédure réaliser le et même fonction type sont employés dans le reste ce chapitre manière quasi indiérente. UnefonctionenlangageCpeut: modier modiée par s le données reste du globales. programme. Ces données Une fonction sont peut dans dans une zone ces conditions mémoire réaliser qui peut plusieurs être communiquer fois le même traitement avec le reste sur du un programme ensemble par variables une interface. déni à Cette la compilation; la compilation. L'appel la fonction correspond à un échange données interface à est travers spéciée cette à interface, tat via cette au traitement interface. Ainsi, ces une données fonction (dans permet le corps réaliser fonction), le même et à un traitement retour sur résul- ensembles variables diérents. s 8.1 Dénition d'une fonction présence Lors s leur dénition ou leur utilisation les fonctions sont distinguées s variables par la parenthèses ouvrantes et fermantes. contient: Une dénition fonction, voir gure 8.1 une uncorpsfonctionquiestenfaitunblocd'instructions. interface; L'interface ladéclarationdutyperetouretdunomlafonction; complète d'une fonction contient: une ladéclarationstypesetsnomssparamètres; parenthèse ouvrante; Fig. 8.1 Structure d'une fonction

110 RETOUR DE FONCTION Co C Explications int plus(int a,int b) fonction plus qui retourne un résultat type entier { a = a + b; etquiaccepteuxarguments a et b typeentier. return a; } void add(int a,int b,int *c) fonction add etquiatroisarguments:aet quineretournepasrésultat b et sontuxentiers c estunpointeurd'entier { cette fonction modie l'entier pointé *c = a + b; parlernierparamètre } long push(double X, int Y) fonction push quiretourneunrésultattype long etquiauxarguments:xtype double et Y typeentier {... } Tab. 8.1 Exemples dénition fonctions L'interfaced'unefonctionpeutêtreincomplètesiellenecontientpaslenomsparamêtrescomme une parenthèse fermante. nous et est le utilisées verrons lorsque dans le prochain s fonctions chapitre, proviennent cette interface diérents est aussi chiers appelée sources signature ou bibliothèques. la fonction, Lecorpsfonctionestunbloc,c'est-à-dire: une s déclarations accola ouvrante; s instructions; variables locales au bloc; Letableau8.1donnesexemplesdénitionsfonctionsenC. une accola fermante. 8.2 Retour fonction Toute fonction qui n'est pas type void retourne un résultat. Le type ce résultat est celui la fonction. La génération du retour fonction est provoquée par l'appel l'instruction return dont la syntaxe est décrite dans l'encart suivant. return expression; Danslecorpslafonction,lerésultatestgénéréparle return.l'expressionquisuitle return est fonction évaluée, peut et être la valeur utilisé obtenue comme est la valeur retournée. d'une Au expression. niveau Si la nous fonction prenons appelante, le cas le la retour fonction plus() une variable(dans vuedansletableau8.1,lavaleurduretourcettefonctionpeutêtreutiliséepouraecter cet exemple la variable z). int x=12,y=5,z; z = plus(x,y); chapitre5.cequinouspermetd'écrireparexemple: Nous pouvons utiliser ce retour fonction dans toute expression telle que dénie dans le

111 CHAPITRE8. FONCTIONS 97 Dénition Appel z = z * plus(x,y) ; int plus(int a,int b) int main(int argc, char *argv[]) { { a = a + b; int x=4,y=6,z; return(a); plus(1,23); } z = plus(x,y); } 8.3 Passage s paramètres Tab. 8.2 Exemples d'appels fonctions En langage C, les passages paramètres se font par appelantefaitunecopielavaleurpasséeenparamètreetpassecettecopieàlafonctionappelée valeur, c'est-à-dire que la fonction à ). l'intérieur Cette variable d'une est variable accessible créée dans manière l'espace interne mémoire par la géré fonction par la à partir pile d'exécution l'argument (voir formel chap. correspondant. Le tableau 8.2 donne ux exemples d'appels à la fonction plus() dénie dans le tableau Passage constantes étapes La gure l'appel 8.2 donne la fonction s indications correspondant sur une vision à la ligne l'espace mémoire pendant l'exécution s z = plus(1,23);. 0 la pile contient les valeurs initiales x, y Comme la variable et z, le sommet pile est juste au ssus z. z n'a pas été initialisée nous n'en connaissons pas la valeur; Étape 1 ponntauxtypesparamètreslafonction:danscecasuxentiers; les valeurs 1 et 23 sont empilées dans s variables anonymes dont les types corres- Étape 2 la fonction plus() et du pointeur contexte est appelée, courant. ce La qui fonction se traduit par l'empilement l'adresse retour plus() connaît sous les noms a et b. Ces ux variables sont dispose les copies s ux valeurs variables dont qu'elle avons parlé à l'étape précénte. Elles ont donc pour valeurs initiales respectivement nous 23; 1 et Étape 3 metdonclavaleur24dansa; lafonction plus()modielavaleurlavariablea enexécutantlaligne a=a+b;,elle Étape 4 registre la fonction du processeur se termine réservé en à retournant cet eet; cette valeur 24, cette valeur est stockée dans un Étape 5 pileestremisàsavaleurinitiale). lesvariablescrééesparl'appelsontdétruites(l'espacesur lapileestrestitué,lepointeur Étape 6 àl'aectation). lavaleurstockéedansleregistreduprocesseurestaectéeàlavariablez(correspondant est Lavisiondonnéeparlesschémaslagure8.2,mêmequelesautresssinscechapitre, taille simpliste et permettent en ce sens stocker qu'elle considère s adresses que ou les s cases entiers. mémoire Elle sur vrait la pile être font ranée toutes pour la même compte la taille s types mais alors elle viendrait spécique à une architecture. De même, tenir elle susante considère pour que mettre le sommet tout nouvel pile élément. est au ssus du bas pile, et que la taille la pile est

112 PASSAGE DES PARAMÈTRES Fig. 8.2Pileetpassageconstantes

113 CHAPITRE8. FONCTIONS 99 Déclaration Appel add(int a,int b,int *c) int main(int argc, char *argv[]) { { int x=5,y=7,z; *c=a+b; add(x,y,&z); } add(43,4,&x); } Passage variables Tab. 8.3 Pointeurs et appels fonctions Le uxième appel à la fonction z = plus(x,y); espace mémoire représenté dans la gure 8.3: provoque les opérations suivantes avec un Étape 1 les valeurs s variables x et y s variables dont les types corresponnt (4 et 6) aux sont types calculées, paramètres ces valeurs la sont fonction; empilées dans Étape 2 la fonction plus() "b".cesuxvariablessontlescopiessvaleurs est appelée et elle dispose xet ux ydontnousavonsparléàl'étape variables qu'elle nomme "a" et précénte. Ces ux variables ont donc pour valeurs initiales 4 et 6; Étape 3 lafonction plus() modielavaleurlavariable"a"enymettantlavaleur10; Étape 4 la fonction se termine en retournant cette valeur 10; Étape 5 les variables créées par l'appel sont détruites. sont Ces qualiés ux exemples par const), montrent, mais ces que paramètres la fonction sont appelée dans son peut univers modier local. les Les paramètres modications (sauf s'ils paramètres formels par une fonction n'ont aucune inuence sur la valeur s paramètres utilisés s lors l'appel. Par exemple, lorsque lors du uxième appel, la fonction plus() "a"celanemodiepaslavariable"x". modie la variable 8.4 Utilisation pointeurs en paramètres Il est possible, à partir d'une fonction, modier s objets la fonction appelante. Pour cela,ilfautquelafonctionappelantepasselesadressescesobjets1. autres Les constantes, adresses sont il y considérées a promotion comme constante s pointeurs à variable dans la lors fonction du passage appelée. s Comme paramètres pour par les valeur. Il est en eet possible d'appeler la fonction plus() interne cette même fonction s variables. Dans le cas d'une avec adresse, s constantes la promotion et d'utiliser en variable en rend un pointeur. Le tableau 8.3 est un exemple d'utilisation la fonction add() uxentiersetuneadressed'entier.cettefonctionutiliseletroisièmeargumentpourcommuniquer qui accepte comme arguments le résultat ses calculs. La gure 8.4, montre les diérents états la pile lors l'exécution du premier appel add(x,y,&z); qui modie la variable z à 5. Lors du uxième appel en lui aectant la valeur 12 (5+7), dans les étapes 0 add(43,4,&x); la variable x (43+4). Seules les étapes premières étapes cet appel sont est représentées modiée et sur elle la prend gure. la Ces valeur étapes 47 Le 6 retour à 8 corresponnt la fonction à appelée l'appel à la fonction fonction et appelante l'exécution n'est pas l'aectation représenté. en Il utilisant sut le reprendre pointeur. les aulieuz)etlavaleurlacasemémoirecorrespondante(xdoitcontenir47). étapes numérotés 4 et 5 en changeant la éche qui va du pointeur à la variable associée (ici x 1Vous trouvez ici l'explication rationnelle la formule magique qui consiste à mettre un "et commercial" vant les noms variables lors l'appel la fonction scanf(). Il faut en eet passer l'adresse la variable à modier à cette fonction.

114 UTILISATION DE POINTEURS EN PARAMÈTRES Fig. 8.3Pileetpassagevariables

115 CHAPITRE8. FONCTIONS 101 Fig. 8.4Pileetpassagevariablesavecréférence

116 CONVERSION DE TYPE LORS DES APPELS Type du paramètre Type après conversion char short int long float double int int int long double double Tab. 8.4 Conversions type un-aire 8.5 Conversion type lors s appels étaient Le C promues selon la lors scription s appels Kernighan fonction. et Cette Ritchie règle décrivait porte d'une la façon part avec sur les laquelle nombres les variables ottantequisonttransfomésen double,d'autrepartsurtoutlestypesentierdontlatailleestplus à virgule petite type que un-aire l'entier telles naturel. que décrites Lors dans l'appel le tableau d'une fonction, 8.4. Les les plus paramètres importantes subissent sont les les suivantes: conversions lesparamètresdutype char et short les paramètres du type sonttransformésen int; float Lesconversionstypeayantlieulorsl'appeld'unefonctionsontdécritesdansletableau8.4. sont transformés en double. Les ces variables variables ou ou constantes les constantes sont s transformées types suivants en leur sont équivalent utilisées dans en entier une expression, avant faire les les valeurs calculs. Ceci lamêmefaçonquesentiers.leprincipepermetd'utiliseràlaplaced'unentier: permet d'utiliser s caractères, s entiers courts, s champs bits et s énumérations scaractèresetsentierscourtssignésounonsignés; La schampsbitsetsénumérationssignésounonsignés. n'ont pas norme d'interface C99 maintient connue ce avant comportement l'appel. Dans pour le s cas questions normal (les compatibilités fonctions ont si une les fonctions connue avant leur utilisation) les valeurs s variables sont passées en maintenant leur type. interface 8.6 Récursivité sur En ces C, problèmes toute fonction dans le peut chapitre appeler 9 sur toute la visibilité). fonction En dont particulier, elle connaît elle le peut nom s'appeler (nous reviendrons Il est donc possible d'écrire s fonctions récursives. elle-même. rielle Prenons peut s'écrire l'exemple la le manière plus connu suivante: en matière récursivité: la factorielle. Cette fonction facto- int fac(int n) { if (n == 0) return 1 ; else return n*fac(n-1) ; } du programme Leslimitescetterécursivitésontimposéesparlataillelapiled'exécution,auchargement fonction, vous serez en mémoire sûrement si limité, le système non utilise par la une taille gestion la pile, pile mais statique. par l'espace Si vous testez valeur cette entier. d'un Pour montrer la concision du langage, voici une factorielle écrite en une seule ligne: int fac(int n){ return n? n*fac(n-1) : 1; }

117 CHAPITRE8. FONCTIONS Arguments la fonction main() La structure s arguments la fonction main() système d'exploitation, en particulier le système UNIX. Dans reète un la système liaison entre type le UNIX, langage les C paramètreslafonction et le une s fonctions du main()sontpassésparle type exec(3). Ces paramètres shelldanslamajoritéscas.ilssontpasséspar lamanièresuivante: ont une structure prédénie. Ils sont décrits int main(int argc,char *argv[], char *envp[]) Les noms argc, argv et envp sont s noms mnémoniques. Ils signient argument count, argument values et environment pointer. La fonction main() système. Ces paramètres dispose sont un donc entier toujours et ux tableaux trois paramètres pointeurs passés sur par s l'environnement signication ces arguments est la suivante: caractères. La argc (nombre contient le nombre mots dans d'arguments la ligne qui comman); ont été passés lors l'appel du binaire exécutable argv découpésenmotsparle contient les arguments la ligne comman au niveau du shell. Ces arguments sont shell Ilyatoujours aumoinsunargumentquicorrespondaunomdubinaireexécutableappelé; etchaquemotestréférencéparunpointeurdansletableau. le variable nombre entière(nombre pointeurs valis d'arguments dans le argc); premier tableau est donné par le contenu la lachaînepointéeparlapremièreentréedutableau elle-même. argvcontientlenomlacomman envp contientlesvariablesd'environnementdu shell Contrairement au premier tableau, la taille ce au uxième momentl'appelduchierexécutable. nombre mots valis. La n ce uxième tableau est tableau donnée n'est par pas un donnée marqueur. par Ce un marqueur cas, cette adresse est un pointeur est du NULL, c'est-à-dire, un pointeur qui contient l'adresse 0. Dans ce type(char *) ou bien encore adresse d'un caractère. Lagure8.5donnelavisioninternesparamètresissuslacomman: echo essai passage parametres Les programmes 8.1 et 8.2 donnent ux exemples d'utilisation s arguments du main s variables d'environnement, en utilisant l'impression chaîne caractéres par et printf() utilisant le format en %s ou en imprimant chaque caractère un-à-un, en utilisant le format %c. 8.8 Pointeur fonction En langage C, le nom d'une fonction est considéré comme une adresse manière intique au nom d'un tableau. Le nom d'une fonction correspond à l'adresse la première instruction à l'intérieur du co exécutable, une fois l'édition liens réalisée. 8.9 Étapes d'un appel fonction cinqetsontréaliséessoitparlafonctionappelantesoitparlafonctionappelée: Pourrésumervoyonslesétapesréaliséeslorsd'unappelfonction.Cesétapessontaunombre Mise en pile s paramètres ramètre est une constante (entière, la fonction ottante appelante ou adresse), empile les le copies programme s paramètres. exécutable Si empile le pa- une pourquoi copie vous cette pouvez constante passer et une l'on constante obtient une et variable manipuler cette type constante compatible. comme Ceci explique riabledanslafonctionappelée.encansivousavezcependantlapossibilitédirequela une va- fonction considère ses arguments comme constants.

118 ÉTAPES D'UN APPEL DE FONCTION Fig. 8.5Arguments main()

119 CHAPITRE8. FONCTIONS 105 Programme 8.1 Affichage s arguments main() 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[],char **envp) 4 { 5 int i; 6 printf("nous avons %d arguments : \n",argc); 7 for(i=0;i<argc;i++){ 8 printf("argument %d == %s \n",i,argv[i]); 9 } 10 printf("nous affichons les 5 premières variables d'environnement \n"); 11 printf("mais nous les comptons toutes. \n"); 12 for(i=0; envp[i] ;i++){ 13 if(i<5) 14 printf("envp[%d] : %s \n",i,envp[i]); 15 } 16 printf("il y a %d variables d'environnement : \n",i); 17 return 0; 18 } Données écrites sur le fichier standard sortie Nous avons 3 arguments : argument 0 == c08e01 argument 1 == c08e01 argument 2 == c08e01.c Nous affichons les 5 premières variables d'environnement mais nous les comptons toutes. Envp[0] BIBINPUTS=.:/home/chris/Bib:/usr/share/texmf/bibtex/bib Envp[1] NNTPSERVER=news.int-evry.fr Envp[2] MANPATH=/usr/X11R6/man:/usr/local/man:/usr/share/man Envp[3] COURSC=/home/chris/Enseignement/COURS/C Envp[4] : SYSTEME=Linux Il y a 59 variables d'environnement : partir Si les paramètres la valeur courante sont s variables, la variable. la fonction Ceci explique appelante pourquoi empile la une valeur copie d'un constituée argument à formel peut être diérentes celle son argument réel. Saut à la fonction appelée fonction appelée tout en Lafonctionappelanteprovoqueunsautàl'adressedébutla empilant l'adresse retour. Prologue dans la fonction appelée culier, elle positionne son pointeur la fonction contexte appelée dans prépare la pile tout son en environnement sauvegardant en l'ancien parti- pointeur tion à retrouver contexte. d'un coté Ce pointeur les arguments contexte la servira fonction, pendant l'autre toute les l'exécution variables locales la fonc- fonction. Elle fait ensuite grandir la pile manière à pouvoir ranger une copie s registres à la qu'elle lée le prologue va utiliser et la les fonction. variables Ce locales prologue qui dépend ne sont du pas type en registre. du processeur Cette et étape s est choix appe- réalisation faits par les concepteurs du compilateur. La fonction appelée s'exécute jusqu'à rencontrer un return, ce return à l'épilogue dans la fonction appelée. Lorsque le provoque le passage return est conservée dans un registre calcul(qui sert aussi pour est associé évaluer à les une expressions). valeur cette valeur Épilogue dans la fonction appelée l'épilogue fait le travail inverse du prologue : à savoir, il

120 EXERCICES SUR LES FONCTIONS restitue registres le contexte la fonction appelante au niveau s registres du processeur (sauf les scratch2 restaure les registres qui qu'il contiennent avait sauvegardés(correspondants la valeur retour la fonction). aux registres Pour mandés cela, l'épilogue dénitions variables type register), puis il restaure le contexte pile en reprenant par les l'ancienne qu'il avait valeur avant le dans prologue. la pile. Finalement, Enn, il replace il retourne le pointeur à la fonction sommet appelante pile en à remettant l'adresse dans L'éxécution le pointeur continue d'instruction alors dans la la valeur fonction qui appelante. avait été sauvegardée sur la pile lors l'appel. Récupération du résultat et eacement s paramètres paramètres qu'elle avait empilé au début l'appel et utilise la fonction la(es) appelante valeur(s) dépile retour les la fonction pour calculer l'expression courante dans laquelle la fonction a été appelée Exercices sur les fonctions Exercice 1 Dénirtroisvariables i, j, k typeentieretclasseglobale. Écrireunefonction globadd() quifaitl'addition i et j dans k. Écrire la fonction main() qui réalise la saisie s variables i d'addition puis écrit le résultat contenu dans k. et j, fait appel à la fonction Exercice 2 fonction. Même exercice que le précént mais en utilisant le passage paramètres et le retour Les trois variables i, j, k La fonction d'addition est une fonction type entier retournant sont un déclarées entier. localement Elle accepte dans ux la paramètres fonction main(). entiers (p1 etp2)etretournelasommecesuxparamètres. La fonction main() saisit les ux variables locales i et j récupérant le résultat cette fonction dans la variable locale et k. appelle Elle écrit la fonction le contenu d'addition en k l'appel fonction. après Exercice 3 modier Même une exercice variable que dans le précént la fonction mais appelante. en utilisant le passage paramètres et un pointeur pour Les trois variables i, j, k La fonction d'addition type entier sont clarées localement dans la fonction main(). ptadd() est une fonction sans retour. Elle accepte trois paramètres entiers (p1 la fonction etp2) et appelante un paramètre passe l'adresse type pointeur avec la somme vers un entier ces ux qui sert premiers pour aecter paramètres. la variable dont La fonction main() saisit les ux variables locales i et j passantl'adresselavariablelocale k.elleécritlecontenu et appelle la fonction d'addition en k aprèsl'appelfonction. 2Ce sont les registres les plus utilisés, ils sont considérés par le compilateur comme utilisables pour l'évaluation chaque ligne co.

121 CHAPITRE8. FONCTIONS 107 Programme 8.2 Arguments main() caractères un-à-un 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[],char **envp) 4 { 5 int i; 6 register char *ptc; 7 printf("nous avons %d arguments : \n",argc); 8 for(i=0;i<argc;i++){ 9 printf("argument %d == ",i); 10 for(ptc=argv[i];*ptc;ptc++) 11 printf("%c",*ptc); 12 printf("\n"); 13 } 14 printf("nous affichons les 5 premières variables d'environnement \n"); 15 printf("mais nous les comptons toutes. \n"); 16 for(i=0; envp[i] ;i++){ 17 if(i<5){ 18 printf("environnement %d == ",i); 19 for(ptc=envp[i];*ptc;ptc++) 20 printf("%c",*ptc); 21 printf("\n"); 22 } 23 } 24 printf("il y a %d variables d'environnement : \n",i); 25 return 0; 26 } Données écrites sur le fichier standard sortie Nous avons 3 arguments : argument 0 == c08e02 argument 1 == c08e02 argument 2 == c08e02.c Nous affichons les 5 premières variables d'environnement mais nous les comptons toutes. Environnement 0 == BIBINPUTS=.:/home/chris/Bib:/usr/share/texmf/bibtex/bib Environnement 1 == NNTPSERVER=news.int-evry.fr Environnement 2 == MANPATH=/usr/X11R6/man:/usr/local/man:/usr/share/man Environnement 3 == COURSC=/home/chris/Enseignement/COURS/C Environnement 4 == SYSTEME=Linux Il y a 59 variables d'environnement :

122 EXERCICES SUR LES FONCTIONS Programme 8.3 Suggestion corrigé chapitre 8 exercice 1 1 #inclu <stdio.h> 2 3 /* claration s variables globales */ 4 int i; 5 int j; 6 int k; void 10 globadd(){ /* fonction addition */ 11 k = i + j; 12 } int 15 main(int argc, char *argv[], char **envp){ 16 /* saisie s valeurs */ 17 printf("entrer 1 entier\n"); 18 scanf("%d", &i); 19 printf("entrer un autre entier\n"); 20 scanf("%d", &j); 21 /* appel add et impression du resultat */ 22 globadd(); 23 printf(" i + j = %d\n", k); 24 return 0; 25 } Données en entrée Données écrites sur le fichier standard sortie entrer 1 entier entrer un autre entier i + j = 91

123 CHAPITRE8. FONCTIONS 109 Programme 8.4 Suggestion corrigé chapitre 8 exercice 2 1 #inclu <stdio.h> 2 3 /* fonction addition */ 4 5 int 6 add(int p1, int p2){ 7 return (p1 + p2); 8 } 9 10 int 11 main(int argc, char *argv[], char **envp){ 12 /* clarations s variables locales */ 13 int i, j, k; 14 /* saisie s valeurs */ 15 printf("entrer 1 entier :"); 16 scanf("%d", &i); 17 printf("entrer un autre entier :"); 18 scanf("%d", &j); 19 /* appel add */ 20 k = add (i, j); 21 printf(" i + j = %d\n", k); 22 return 0; 23 } Données en entrée Données écrites sur le fichier standard sortie entrer 1 entier :entrer un autre entier : i + j = 91

124 EXERCICES SUR LES FONCTIONS Programme 8.5 Suggestion corrigé chapitre 8 exercice 3 1 #inclu <stdio.h> 2 3 /* fonction addition */ 4 5 void 6 ptadd(int p1, int p2, int *pti) 7 { 8 *pti = p1 + p2; 9 return; 10 } int 13 main(int argc, char *argv[], char **envp) 14 { 15 /* clarations s variables locales */ 16 int i, j, k; 17 /* saisie s valeurs */ 18 printf("entrer 1 entier :"); 19 scanf("%d", &i); 20 printf("entrer un autre entier :"); 21 scanf("%d", &j); 22 /* appel add */ 23 ptadd(i, j, &k); 24 printf(" i + j = %d\n", k); 25 return 0; 26 } Données en entrée Données écrites sur le fichier standard sortie entrer 1 entier :entrer un autre entier : i + j = 91

125 Chapitre 9 Compilations séparées être La compilées compilation indépendamment séparée permet les unes fragmenter s autres. un grand Dans programme ce chapitre en nous s allons parties voir qui comment peuvent cette possibilité est exploitable en langage C. À partir maintenant, nous appellerons: la déclaration : contient une association aussi le type type s avec arguments un nom la variable fonction), ou fonction (dans ce cas dénition pour cette variable, : une déclaration si c'est une et si fonction c'est une la dénition variable, une du corps man fonction d'allocation contenant d'espace instructions associées à cette fonction. les 9.1 Programme Commenousl'avonsdéjàditdanslechapitre1,unprogrammeenlangageCestun ensemble chiers stinés à être compilés séparément. La structure d'un programme, écrit en langage C, est résumée dans la gure Fichier source suivants Comme dans le un montre ordre schématiquement quelconque: la gure 9.2, chaque chier source contient les éléments s s déclarations dénitions types variables synonymes et fonctions ou modèles externes, sdénitionsvariables structures(voir chapitre 14), 1 s dénitions fonctions,, Les s directives directives pré-compilation pré-compilation et et les s commentaires commentaires. sont traités par le pré-processeur. Le compilateur ne voit que les quatre premiers types d'objets. s Les dénitions chiers inclus types par et le pré-processeur modèles structures. ne doivent contenir que s déclarations externes ou 1Ces dénitions variables globales sont en fait transformées par l'éditeur liens en s mans réservation mémoire à réaliser lors du démarrage du programme.

126 FICHIERSOURCE Fig. 9.1Dusourceàl'exécutable Fig. 9.2Survold'unchiersource

127 CHAPITRE 9. COMPILATIONS SÉPARÉES 113 Règle fondamentale : Toute variable ou fonction doit être déclarée avant d'être utilisée. Tab. 9.1 Règle fondamentale visibilité 9.3 Visibilité Fig. 9.3 Exemple visibilité règles La que compilation nous appellerons séparée s diérentes parties d'un programme implique le respect certaines Règles et fonctions). visibilité. Ces règles s'appliquent aux noms( variables et du Commeilaétéécritdanslechapitre1,lecompilateurnelitlechiersourcequ'uneseulefois, connaître début son jusqu'à type et la sa n. classe Lorsqu'il d'adresse. rencontre l'utilisation d'une variable ou d'une fonction, il doit retourneunevaleurtype Par convention, dans le cas intetilessayed'inférerletypesparamètresàpartirl'appel(les où une fonction n'est pas connue, le compilateur considère qu'elle appels postérieurs vront se conformer à ce premier appel). compilateur La fonction a viné, peut être le compilateur dénie plus loin n'émet dans pas le chier. message Si l'interface d'erreur est et utilise conforme l'adresse à ce que la le fonctionpourlesappelssuivants,maisilnepeutpasmodiercequ'iladéjàgénéré.laliaisondu premier appel avec la fonction est laissée à l'éditeur liens. noms.pourcetexemple,lesrèglesvisibiliténomsquenousvenonsd'énoncernouspermettent Nous allons nous servir l'exemple la gure 9.3 pour continuer à expliquer la visibilité s dire: 1. lafonctionf4peutappelerlesfonctionsf4,f3,f2,etf1; 2. lafonctionf3peutappelerlesfonctionsf3,f2,etf1; 3. lafonctionf2peutappelerlafonctionf2,etf1;

128 VISIBILITÉ 4. la fonction f1 ne peut que s'appeler elle-même; 5. les pilateur fonctions utilise f1, la f2, règle f3, et par f4, défaut peuvent et suppose appeler s que fonctions le résultat inconnues, la fonction dans appelée ce cas le est com- entier. un Espaces nommage et visibilité fonction Nous peut avons utiliser dit dans les le variables chapitre internes sur la généralité qu'elle a dénies sur la syntaxe et les variables et dans globales la section2.1.2 qui ont Une dénies avant la fonction. été Lesnomsvariablesinternesmasquentlesnomsvariablesglobales.Ainsi,danslagure9.3: la dénition la variable locale a type long à l'intérieur la fonction f1() dans cette fonction la variable globale même nom et type entier. L'aectation masque a = 50 réalisée dans la fonction f1() globale; modie la variable locale type long et non la variable par contre la modication a = 10 réalisée dans la fonction f2() type entier; aecte la variable globale même l'argument a type float la fonction f3() variableglobalemêmenomettypeentier.l'aectation masque dans cette fonction la a = 10 réaliséedanslafonction f3() modie l'argument local type oat et non la variable globale Extension la visibilité respondant Pour le moment, à une compilation. nous n'avons Il est pris possible en compte manr que les variables au compilateur dénies dans manipuler le module un objet cor- à déni faire dans une déclaration un autre module, et non en une lui dénition précisant que l'objet. l'objet est classe extern. Ceci revient donc sursontype.ilneproposepasàl'éditeurliensréserverlaplacemémoirepourelle.illui Sil'objetestunevariable,lecompilateuracceptesonutilisationetfaitlescontrôlescohérence man au niveau global retrouver qu'à l'intérieur la variable s dans blocs. les autres modules. Ces déclarations se placent aussi bien les chiers Bien entendu, doivent une être telle associés variable par doit une édition être dénie liens, dans sinon un autre cette chier rnière du se programme termine avec et tous références non résolues et le chier binaire exécutable n'est pas produit. s d'un La même gure programme. 9.4 donne un Dans exemple cet exemple: dénition et déclaration variables entre ux modules les variables a et b par les fonctions contenues sont dénies dans dans ce chier. le chier De prg1.c. plus ces Ces variables variables sont peuvent accessibles être à utilisées s autres modules du programme qui les auront déclarées. partir lavariable fonctions dénies aestdéclaréeentêteduchier dans prg2.c. Le compilateur prg2.c;ellepeutdoncêtreutiliséepartoutesles l'utilisationlavariabledanslesfonctions f2()et fait la f3().ilmanàl'éditeurliens liaison avec cette déclaration lors trouver même, la variable la variable a. b est déclarée localement dans la fonction f3() par cette fonction. Le compilateur fait les vérications grâce aux informations et peut fournies être utilisée la déclaration et man à l'éditeur liens trouver la variable. par

129 CHAPITRE 9. COMPILATIONS SÉPARÉES Prototypes s fonctions Fig. 9.4 Visibilité s variables entre modules variables Les règles globales. visibilité Il est possible s'appliquent déclarer aux fonctions une fonction la même manière qu'elles s'appliquent aux extern diérent celui où elle est dénie. an l'utiliser dans un module appelés La norme parfois ANSI signatures a ajouté s au fonctions, langage C en la incluant possibilité les types déclarer s les arguments prototypes dans s la fonctions, déclaration. Un prototype permet vérier que les arguments passés à une fonction sont ligne corrects en sont nombre décrites et par en les type. prototypes Ainsi, les du interfaces programme s 9.1. fonctions que nous avons vues dans le chapitre 8 s Comme arguments le montrent variables les en nombre lignes 6 et et en 7 du type(comme programme 9.1, pour représenter s fonctions ayant printf() trois points dans la liste s arguments. et scanf()) le langage C utilise Pour décrire le prototype d'une fonction qui n'accepte pas d'argument, on utilise le type void dans la liste s arguments comme le montre la rnière ligne du programme 9.1. Programme 9.1 Exemples prototypes fonctions 1 extern int add (int, int); 2 extern void add2 (int, int, int *); 3 extern long push (int, double); 4 extern int fac (int); 5 extern main (int, char *[], char *[]); 6 extern int scanf (char *,...); 7 extern int printf (char *,...); 8 extern int getchar (void);

130 FONCTIONSEXTERNES Fig. 9.5 Visibilité s fonctions entre modules 9.5 Fonctions externes Fig. 9.6 Visibilité s fonctions dans un module Une fois connues, les fonctions s autres modules peuvent être utilisées. Comme le montre la gure 9.5, si la fonction f1() est dénie dans le chier prg1.c et que l'on veut l'utiliser dans le chier prg2.c, il faut mettre en début prg2.c, le prototype extern int f1(void);. 9.6 Fonctions dénies ultérieurement cette Demême,pourutiliserunefonctiondénieplusloindanslemodule,ilfautfaireunedéclaration Comme fonction. le montre Le la compilateur gure 9.6, la fait déclaration la mise-à-jour la référence lorsqu'il rencontre la dénition. extern int f2(void) fonction sans en connaître le corps. permet l'utilisation d'une 9.7 Vérication s prototypes le prototype Dans la première s fonctions, version ce du qui langage, n'informait la liste pas s le compilateur types d'arguments sur le nombre n'était pas et le mise type dans arguments. Le compilateur ne pouvait donc pas réaliser contrôle cohérence sur le nombre s et

131 CHAPITRE 9. COMPILATIONS SÉPARÉES 117 le langage type s C, la arguments programmation passés lors doit donc l'appel. être très Lorsqu'on soignée. travaille avec s vieux chiers sources en La L'utilitaire normalisation lint, du souvent langage présent C a introduit avec la chaîne manière compilation, complète l'utilisation fait ce genre s s prototypes vérications. manière à garantir une bonne prise en compte s prototypes. 9.8 Multiples déclarations et dénitions lisation En fait, est en candidate langage à C, être une une déclaration dénition. Ainsi, variable il est globale possible qui n'est trouver pas associée plusieurs avec déclarations une initia- variablessanslemot lateurmanàl'éditeurliensrésoudrelesconitspotentiels.ilnepeutbiensûrn'yavoir externdansplusieursmodulesetmêmedansunseulmodule.lecompi- qu'une seule initialisation qui transforme la déclaration candidate en dénition. variables, Pour s ils acceptent questions ces lisibilité, dénitions les compilateurs manière multiple acceptent si le type donc est les intique. dénitions Le candidates compilateur ne comme fait la s man déclarations. réservation Cette facilité d'espace permet qu'une au seule programmeur fois. Il considère mettre les dénitions s déclarations ultérieures variables près s endroits où elles sont manipulées. tion L'exemple d'une même 9.2 montre variable. l'utilisation Dans cet exemple plusieurs les ux déclarations fonctions candidates à venir une déni- plusplus() et moinsmoins() maninpulent la même variable a. Programme 9.2 Déclarations candidates multiple d'une variable 1 int a; 2 void plusplus(void){a++;} 3 4 int a; 5 void moinsmoins(void){a--;} Nous d'éviter recommandons: toujours les déclarations associer la dénition candidates avec à la une dénition, d'utiliser le mot initialisation, extern Le programme 9.3 reprend vant notre programme les déclarations. 9.2 en étant conforme à ces recommandations. Programme 9.3 Déclaration explicite et déclaration candidate d'une variable 1 extern int a; 2 void plusplus(void){a++;} 3 4 int a=0; 5 void moinsmoins(void){a--;} int a; extern int a; void f1(void){ a= a+1; } f1 et f4 manipulent la même variable a void f4(void){ a -- ;} } c ChristianBac

132 MULTIPLES DÉCLARATIONS ET DÉFINITIONS Fig. 9.7 Utilisation chier d'inclusion Fichiers d'inclusion Leschiersd'inclusionsontstinésàcontenirsdéclarations 2 types non prédénis, d'objetsstypessuivants: modèles typesetnomsvariables, et noms structures, Les prototypes chiers d'inclusion fonctions. sieurs modules. contiennent les déclarations s variables et fonctions utilisées par plu- Lagure9.7estunexempledanslequel: le chier fs.h être utilisées dans contient plusieurs les chiers déclarations sources s participant variables globales au programme; et s fonctions qui peuvent les variables qui peuvent être utilisées par plusieurs modules sont a et b dans le module prg1.c; qui sont dénies les fonctions utilisables sont f1() qui est dénie dans le module prg1.c et f3() dénie dans le module prg2.c; qui est le module prg2.c, man l'inclusion du chier fs.h fonction qui fournit la déclaration la f3() fonction lors la compilation. Ceci permet l'utilisation cette fonction dans la f2() sans ambiguïté. 2Ce sont s déclarations et non s dénitions. En eet, les chiers d'inclusion sont associés à plusieurs chiers source et si ces chiers contiennent s dénitions, les variables risquent d'être dénies plusieurs fois.

133 CHAPITRE 9. COMPILATIONS SÉPARÉES Réduction la visibilité Fig. 9.8 Réduction visibilité ilestintéressantd'avoirunmécanismequipermetrestreindrel'accèsvariablesoufonctions Dansunenvironnementquipermetàplusieursprogrammeursconstituerunseulprogramme, pour sans permettre éviter les eets l'accès aux bords fonctionnement et permettre interne une meilleure d'un module. utilisation s interfaces entre modules autres EnlangageC,leprédicat chiers du programme. staticpermetmasquersnomsdonnéesoufonctionsaux Une variable type global static qui la déclare. Elle n'est accessible qu'aux fonctions dénies après elle n'est dans visible le même que chier. du module permet, entre autre, manipuler s données qui ont le même nom dans plusieurs chiers Ceci s dénitions diérentes dans chacun d'entre-eux. avec accessible Commelemontrelagure9.8,unefonctionpeutaussiêtredéclarée aux fonctions s autres chiers constituant le programme. Une static,elleseraalorsin- tentative déclaration extern d'une variable ou d'une fonction statique est inecace Variables locales rémanentes elles Pendantl'exécution,lesvariableslocalessontnormalementcrééesàl'entréedublocdanslequel sont dénies. Les variables locales sont naturellement invisibles l'extérieur à un la bloc, fonction. appelées également variables automatiques,

134 MULTIPLES DÉCLARATIONS ET DÉFINITIONS Fig. 9.9 Variables locales statiques est Le la même langage que C donne celle s la possibilité variables globales. d'avoir s Le variables prédicat internes à un bloc dont la durée vie static modie le lieu où cette variable est implantée; elle est, alors, mise appliqué avec les à une variables variable globales. locale, Son structures nom reste ou s invisible tableaux à l'extérieur gran taille la fonction. internes à Le une prédicat fonction. static Ceci peut permet être utilisé minimiser pour s surcoût causé par la création et la struction l'espace mémoire pour stocker ces variables le grantailleàl'entréeetàlasortielafonction. Cetteisolationn'estpastotaleeneet: L'isolation la variable est sémantique, son nom n'étant pas connu du reste du programme. si peut une être fonction utilisé retourne par le reste un pointeur du programme. contenant Le contrôle l'adresse d'accès d'une variable à la variable statique, est vérié celui-ci la compilation mais non à l'exécution. Une variable locale statique peut aussi être modiée à par statique s eets locale que bord l'éditeur (par exemple lien a un placé déborment après le tableau); tableau peut écraser la variable laduréevied'unevariablelocalestatiqueestlamêmeque chaqueappel,unefonctionretrouve lavaleurd'unevariablelocalestatiquequ'elleamodiée cellesvariablesglobales.a lors compte s le appels nombre précénts. d'appels Nous à cette pouvons fonction. donc avoir une variable interne à une fonction qui l'initialisation non à l'entrée dans d'une la variable fonction. statique interne à une fonction est faite à la compilation, et Lorsque le programme la gure 9.9 s'exécute la variable entière a successivement les valeurs : 1,2,3,4,5,6,7,8,9 et la variable type global prend a valeurs: 1,11,21,31,41,51,61,71,81,91. locale à f1 prend successivement les Travailler en groupe ment La par compilation s programmeurs, séparée permet c'est un le découpage début mais d'un pour programme permettre un en parties travail ecace développées groupe séparé- faut quelques règles supplémentaires. il les règles Le projet utilisées GNU par est les un groupes bon exemple programmeurs quant-à l'utilisation ce projet ce à l'adresse type règles, suivante: vous trouverez http ://

135 CHAPITRE 9. COMPILATIONS SÉPARÉES Exercices sur les fonctions et la visibilité s variables Exercice 1 : simulation d'un ascenseur n'est Le pas programme dans ses buts que vous simuler vez réaliser complètement simule un une fonctionnement partie du fonctionnement d'ascenseur. d'un ascenseur. Il L'ascenseur L'immeuble ssert dans ces lequel étages se et trouve reconnait cet ascenseur les étages est en sous-sol constitué car ils dix corresponnt étages et trois à s sous-sols. négatifs. chires Au départ, l'ascenseur se situe à l'étage 0. Il y l'appell'ascenseuràunétage; a trois étapes fondamentales dans le fonctionnement l'ascenseur: l'entrée le déplacement dans l'ascenseur l'ascenseur suivie qui peut la sélection se faire entre l'étage l'appel désiré; et la scente. et l'entrée ou entre la selection La manrlenumérol'étageou`l'onappellel'ascenseuretlelire; marche l'ascenseur que vous vez réaliser consiste en: acher entre chaque le déplacement étage. La temporisation l'ascenseur est étage obtenue par étage par avec l'appel une système temporisation sleep(); 2 secons signaler manr l'arrivée l'étage à désiré l'étage et le lire; l'appel; Pour se déplacer sortir vers la boucle, l'étage entrer sélectionné. un numéro d'étage particulier(par exemple 100). Le unefonction programme placement(),quiaccepteenargumentlenumérol'étagedésiréetretourne sera structuré la manière suivante: unefonction le numéro appel(),quiréaliselalecturel'étagelaman; l'étage atteint; uneboucledanslafonction une fonction saisie(), qui réalise la lecture l'étage à atteindre; main() danslecasoùl'étagedésiréestégalà11. quicontrolelavaliditéssaisiesettermineleprogramme Exercice 2 : racines d'une équation du uxième gré Calcul s racines d'une équation du uxième gré. Une équation du uxième gré se présentesouslaforme:a x 2 + b x + c. Le calcul programme du discriminant; contient 4 fonctions: calcullaracinedouble; calcul calcul s s racines racines réélles; le programme principal complexes. saisit les coecients a, b le bon sous-programme. et c, il calcule le discriminant et aiguille vers Exercice 3 : utilisation s chiers d'inclusion Reprendre l'exercice en mettant les signatures(prototypes) s fonctions dans un chier d'inclusion. Le chier contenant les fonctions reste inchangé par rapport au corrigé 9.6.

136 EXERCICES SUR LES FONCTIONS ET LA VISIBILITÉ DES VARIABLES Programme 9.4 Suggestion corrigé chapitre 9 exercice 1 fonctions 1 #inclu <stdio.h> 2 /* PROGRAMME DE SIMULATION DE LA MARCHE D UN ASCENSEUR */ 3 int 4 appel (){ 5 int etg; 6 printf ("Appel ascenseur\n"); 7 printf ("A quel etage etes-vous? -3 a 10 fin : 11\n"); 8 scanf ("%d", &etg); 9 return etg; 10 } int 13 selection (){ 14 int selec; 15 printf ("Selection etage? -3 a 10\n"); 16 scanf ("%d", &selec); 17 return (selec); 18 } int 21 placement (int a, int asc){ 22 /* si etage man > etage d appel */ 23 if(a > asc){ 24 do{ 25 printf ("Etage : %d\n", asc); 26 sleep (2); 27 } while(++asc < a); 28 printf("arrivee etage %d\n", asc); 29 } 30 /* si etage man < etage d appel */ 31 else{ 32 do{ 33 printf ("Etage : %d\n", asc); 34 sleep (1); 35 }while(--asc > a); 36 printf("arrivee etage %d\n", asc); 37 } 38 return asc; 39 }

137 CHAPITRE 9. COMPILATIONS SÉPARÉES 123 Programme 9.5 Suggestion corrigé chapitre 9 exercice 1 main() 1 #inclu <stdio.h> 2 3 extern int appel (); 4 extern int selection (); 5 int placement (int, int); 6 int 7 main (int argc, char *argv[], char **envp) 8 { 9 int etg = 0, selec; 10 /* boucle generale */ 11 do{ 12 /* boucle appel */ 13 do 14 selec = appel (); 15 while(selec > 11 selec < -3); 16 if(selec!= 11){ 17 /* placement vers l etage d appel */ 18 etg = placement (selec, etg); 19 /* boucle selection */ 20 do 21 selec = selection (); 22 while(selec > 10 selec < -3); 23 /* placement vers l etage stination */ 24 etg = placement (selec, etg); 25 } 26 } 27 while(selec!= 11); /* test fin */ 28 printf("arret ascenseur\n"); 29 return 0; 30 } Données en entrée Données écrites sur le fichier standard sortie Appel ascenseur A quel etage etes-vous? -3 a 10 fin : 11 Etage 0 Etage : 1 Arrivee etage 2 Selection etage? -3 a 10 Etage 2 Etage : 3 Arrivee etage 4 Appel ascenseur A quel etage etes-vous? -3 a 10 fin : 11 Arret ascenseur

138 EXERCICES SUR LES FONCTIONS ET LA VISIBILITÉ DES VARIABLES Programme 9.6 Suggestion corrigé chapitre 9 exercice 2 fonctions 1 #inclu <stdio.h> 2 3 /* fonction calcul du discriminant */ 4 float 5 dis (float a, float b, float c) 6 { 7 return (b * b - 4 * a * c); 8 } 9 10 /* fonction calculant les racines reelles */ 11 void 12 rac2 (float r, float r1) 13 { 14 printf ("2 racines reelles : %f et %f\n", r + r1, r - r1); 15 } /* fonction calculant les racines complexes */ 18 void 19 complex (float r, float r1) 20 { 21 printf ("2 racines complexes : %f + %f i et %f - %f i\n", r, r1, r, r1); 22 } /* fonction calculant la racine double */ 25 void 26 racd (float r) 27 { 28 printf (" racine double : %f\n", r); 29 }

139 CHAPITRE 9. COMPILATIONS SÉPARÉES 125 Programme 9.7 Suggestion corrigé chapitre 9 exercice 2 main() 1 #inclu <stdio.h> 2 #inclu <math.h> 3 4 extern float dis (float, float, float); 5 extern void rac2 (float, float); 6 extern void complex (float, float); 7 extern void racd (float); 8 9 int 10 main (int argc, char *argv[], char **envp){ 11 float a, b, c, r, r1; 12 double rdis; 13 float res; printf ("calcul s racines ax2 + bx + c\n\n"); 16 printf ("saisie s valeurs a b et c"); 17 scanf ("%f", &a); 18 scanf ("%f", &b); 19 scanf ("%f", &c); 20 if (a == 0){ 21 printf (" Equation du premier gre \n"); 22 printf (" La solution est x = %f \n", -c / b); 23 return 0; 24 } 25 r = -b / (2 * a); 26 res = dis (a, b, c); 27 switch (res < 0? -1 : (res > 0? 1 : 0)){ 28 case 1: 29 rdis = sqrt (res); 30 r1 = rdis / (2 * a); 31 rac2 (r, r1); 32 break; 33 case -1: 34 rdis = sqrt (-res); 35 r1 = rdis / (2 * a); 36 complex (r, r1); 37 break; 38 case 0: 39 racd (r); 40 break; 41 } 42 return 0; 43 } Données en entrée Données écrites sur le fichier standard sortie calcul s racines ax2 + bx + c saisie s valeurs a b et c racine double :

140 EXERCICES SUR LES FONCTIONS ET LA VISIBILITÉ DES VARIABLES Programme 9.8 Suggestion corrigé chapitre 9 exercice 3 chier d'inclusion 1 extern float dis(float, float, float); 2 extern void rac2(float, float); 3 extern void complex(float, float); 4 extern void racd(float);

141 CHAPITRE 9. COMPILATIONS SÉPARÉES 127 Programme 9.9 Suggestion corrigé chapitre 9 exercice 3 main() 1 #inclu <stdio.h> 2 #inclu <math.h> 3 #inclu "c09c03a.h" 4 5 int 6 main (int argc, char *argv[], char **envp){ 7 float a, b, c, r, r1; 8 double rdis; 9 float res; 10 printf ("calcul s racines ax2 + bx + c\n\n"); 11 printf ("saisie s valeurs a b et c \n"); 12 scanf ("%f %f %f", &a, &b, &c); 13 if(a == 0){ 14 printf (" Equation du premier gre \n"); 15 printf (" La solution est x = %f \n", -c / b); 16 return 0; 17 } 18 r = -b / (2 * a); 19 res = dis (a, b, c); 20 switch (res < 0? -1 : (res > 0? 1 : 0)){ 21 case 1: 22 rdis = sqrt (res); 23 r1 = rdis / (2 * a); 24 rac2 (r, r1); 25 break; 26 case -1: 27 rdis = sqrt (-res); 28 r1 = rdis / (2 * a); 29 complex (r, r1); 30 break; 31 case 0: 32 racd (r); 33 break; 34 } 35 return 0; 36 } Données en entrée Données écrites sur le fichier standard sortie calcul s racines ax2 + bx + c saisie s valeurs a b et c racine double :

142 EXERCICES SUR LES FONCTIONS ET LA VISIBILITÉ DES VARIABLES

143 Chapitre 10 Pointeurs et tableaux Cette Cechapitreestconsacréauxtableauxetàleurmanipulationàtraversl'utilisationpointeurs. langage utilisation pour les s débutants, pointeurs elle pour s'avère accér cependant aux contenus l'une s s techniques tableaux est les une plus s utilisées dicultés par du programmeurs expérimentés. les 10.1 Tableaux à une dimension les éléments Ladéclarationd'untableauàunedimensionréserveunespacemémoirecontiguëdanslequel du tableau peuvent être rangés. l'adresse Comme du le début montre du la tableau. gure Les 10.1, éléments le nom du sont tableau accessibles seul est par une : le constante nom du tableau, dont la un valeur crochet est ouvrant, l'indice l'élément et un crochet fermant. servant L'initialisation à initialiser d'un le tableau, tableau et se un fait accola en mettant fermante. une La accola gure 10.2 ouvrante, montre la l'espace liste s mémoire valeurs correspondant à la dénition d'un tableau dix entiers avec une initialisation selon la ligne: int tab[10] = {9,8,7,6,5,4,3,2,1,0}; du tableau Commelemontrentlesexemplesduprogramme10.1,ilestpossiblenepasspécierlataille ou (exclusif) ne pas initialiser tous les éléments du tableau. Dans ce programme, tb1 est déni comme un tableau 6 entiers initialisés, et tb2 est déni comme un tableau Fig. 10.1Tableaudixentiers

144 ARITHMÉTIQUE D'ADRESSE ET TABLEAUX Fig Tableau dix entiers initialisé 10 s entiers premiers dont éléments les 6 premiers d'un tableau sont provoque initialisés. l'initialisation Depuis la normalisation l'ensemble du s langage, éléments l'initialisation y compris pour les tableaux locaux. Les éléments pour lesquels s valeurs ne sont pas du précisées tableau sontinitialisésaveclavaleur0(ensemblesoctetsàzéroquellequesoitlatailleséléments). Programme 10.1 Dénition tableaux et initialisations int tb1[] = {12,13,4,15,16,32000}; int tb2[10] = {112,413,49,5,16,3200}; Lesnomstableauxétantsconstantes,iln'estpaspossiblelesaecter Arithmétique d'adresse et tableaux du tableau, Comme nous plus venons les éléments le dire d'un le nom tableau d'un sont tableau, du même correspond type. à Ces l'adresse éléments du ont premier donc élément même taille, et ils ont tous une adresse qui correspond au même type d'objet (par exemple tous une la adresse d'entier pour chaque élément du tableau tb1 l'exemple la gure 10.2 en le complétant par les adresses du programme chaque 10.1). élément. La gure Ces adresses 10.3 reprend exprimées à partir du début du tableau. sont Ceci il est nous possible amène d'additionner à considérer les ou opérations soustraire possibles un entier à partir (n) d'une à une adresse: calcule une nouvelle adresse la manière suivante: adresse. Cette opération l'opération ux variables suppose contenues que l'adresse dans le même départ tableau. et l'adresse résultante sont les adresses l'opération qu'elle suppose suppose que aussi le programmeur que le tableau doit est être d'une conscient taille susamment s risques gran, dépassement c'est-à-dire bornes du tableau. Dans le cas du tableau s tab adresses doivent être comprises entre pris en exemple dans la gure 10.3, les &tab[0] borne, l'adresse immédiatement supérieure à et la &tab[9]. n du tableau Pour une est calculable. question Il test possible d'écrire est &tab[10] erreur si le rang dépasse la mais taille rien plus ne un. garantit La zone que mémoire l'expression correspondante ne provoque au rang pas une tableau plus un ne doit cependant pas être accédée. Le compilateur garanti qu'il calcule du 1tb1= est une hérésie qui mérite l'exclusion la communauté s utilisateurs du langage C au même titre que 1=.

145 CHAPITRE 10. POINTEURS ET TABLEAUX 131 Fig. 10.3Adressesdansuntableaudixentiers Fig Tableau à ux dimensions correctement mémoire correspondante l'adresse mais soit il possible. ne garantit pas que le fait d'essayer d'accér à la zone selon du nième ces conditions, objet contenu l'addition dans le d'un tableau entier à à partir une adresse l'adresse retourne initiale. une Dans adresse ces qui conditions, est celle tab + n tableau estl'adressedu dix éléments, nième entieràpartirdudébutdutableau.dansnotreexemple n variableàpartirl'adresse(*)nepeutcependants'appliquerquepour doit être compris entre 0 et 10. L'opérateur nvalantentre0 d'accès à la et9.ainsi, *(tab +n) n'estvaliquepour n l'addition ou la soustraction d'un entier est possible comprisentre0et9. Ainsi, pour toute adresse dans un tableau. &tab[3] + 2 donne lamême adresse que &tab[5]. Demême, &tab[3] - 2 la même adresse que &tab[1]. donne il tenant est aussi à un possible même tableau. réaliser Cette une soustraction opération retourne entre les une adresses valeur du ux type variables appar- ptrdiff_t correspond au nombre d'objets entre les ux adresses. Ainsi, qui &tab[5] &tab[3] ner la valeur 2 exprimée dans le type ptrdiff_t. De même, doit don- &tab[3] - &tab[5] la valeur-2 exprimée dans le type ptrdiff_t. retourne 10.3 Tableaux multidimensionnels plus Les internes. tableaux Les à tableaux ux dimensions à n dimensions sont s sont tableaux s tableaux tableaux. tableaux Les indices à n-1 dimensions. droite sont les par Lagure10.4donnelesadressesssous-tableauxetlesnomssdiérentsélémentsconstitués la dénition du tableau à ux dimensions suivant: int tab[8][5];.

146 POINTEURS ET TABLEAUX Instruction Interprétation px = &x[0]; px reçoit l'adresse du premier élément du tableau. y = *px; yreçoitlavaleurlavariablepointéeparpx px++; px (4 octets). est incrémenté Il contient&x[1]. la taille l'objet pointé px = px + i; pxreçoitl'adresseduièmeobjetàpartir l'objet courant. Tab. 10.1Additiond'unentieràunpointeur 10.4 Pointeurs et tableaux Le pointeur taxiquement par est une variable stinée à contenir une adresse mémoire. Il est reconnu syn- l'* d'objet. Ce type est lors celui s sa objets déclaration. qui sont Comme manipulés les adresses, grâce au le pointeur. pointeur L'objet est associé peut à être un type variable ou une fonction. une pas Contrairement la déclaration à implicite ce que beaucoup d'une variable d'apprentis associée espérent, et l'aectation la déclaration l'adresse d'un pointeur la variable n'implique pointeur. Il faut donc déclarer une variable du type correspondant et initialiser le pointeur avec au l'adresse l'accér,ilobtientuneerreurd'exécutiondutypebus-errorsurunix.cecomportementimplique cette variable. Par convention, l'adresse 0 est invali et si le programme cherche à que (comme l'utilisation les autres variables) pointeurs déclarés globaux en sans variables initialisation globales mène sont initialisés à ce résultat, à 0. car les pointeurs initiales Les pointeurs dépendantes déclarés du contenu en variable la locale pile (comme cet instant, toutes qui les variables dépend locales) l'exécution ont s précént valeurs du qui programme utilise un pointeur mais correspond local sans en l'avoir général aecté à n'importe convenablement quoi. Le peut comportement donner s comportements du programme tels programme que violation se déroule l'espace sans erreurs mémoire, agrante mais mais parfois en donnant le pointeur s résultats reçoit une faux(ce adresse que vali d'aucuns et le appellent un eet bord indésirable, ce que d'autres appellent un bug dicile à reproduire). Voici ux exemples dénition pointeurs: int *ptint; pointeur sur un entier char *ptchar; pointeur sur un caractère. pointeur Le compilateur conditionne C les vérie opérations le type arithmétiques s adresses sur qui ce sont pointeur. aectées à un pointeur. Le type du Les aectation opérations d'une possibles adresse sur au un pointeur; pointeur sont les suivantes: utilisation addition d'un du pointeur entier (n) pour à un accér pointeur; à l'objet la nouvelle dont il adresse contient est l'adresse; celle du ne l'adresse initiale; objet à partir soustractionuxpointeursdumêmetype.lecalculestréalisédanslesmêmesconditions que soustraction la diérence calcule entre le nombre ux adresses variables variables entre les contenues adresses contenues dans un dans même les tableau. pointeurs. La Le résultat type ptrdiff_t pointeurs sont bien s adresses n'est variables vali que appartenant si les adresses à un contenues même tableau, dans les sinon ux résultat est indéni. le Le tableau 10.1 est un exemple manipulations en relation avec les pointeurs et les tableaux enutilisantlesvariables:long x[10], *px, y; L'additiondécritedanslarnièrelignedutableau10.1setraduitparlesconversionssuivantes: px = (long *) ( (int) px + i * sizeof (long));

147 CHAPITRE 10. POINTEURS ET TABLEAUX 133 Instruction Interprétation pt1 &tab[0]; pt1 reçoit l'adresse du premier élément du tableau. pt2 = &tab[10]; pt2 reçoit l'adresse du dixième élément du tableau. i = pt2 - pt1; ireçoitladiérencesuxpointeurspt1etpt2. soitlenombred'objetsentrept2etpt1. icontiendra10àlancetteinstruction. Tab Soustraction ux pointeurs Le tableau 10.2 est un exemple soustraction à partir s dénitions variables suivantes: int tab[20], *pt1, *pt2; ptrdiff_t i; contenucettevariabledanslecasd'unevariablesimple.maisunnomtableaudonnel'adresse Par convention, le nom d'une variable utilisé dans une partie droite d'expression donne le du tableau qui est l'adresse du premier élément du tableau. Nous un tableau faisons les est constatations une suivantes: constante un pointeur est une d'adressage; variable Ceci nous amène à regarr l'utilisation d'adressage. pointeurs pour manipuler s tableaux, en prenant lesvariables:long i, tab[10], *pti ; tab est l'adresse du tableau(adresse du premier élément du tableau &tab[0]; pti = ; initialise le pointeur pti riendanslecasd'untableau. avec l'adresse du début tableau. Le & ne sert à pti = certains compilateurs; &tabestinutileetd'ailleursnonreconnuouignorépar &tab[1] estl'adressedu2e pti = &tab[1] estéquivalentà: élémentdutableau. pti = tab ; où pti pointesurle1er pti += 1 ; fait avancer, le pointeur d'une élémentdutableau. 2ème élément du tableau. case ce qui fait qu'il contient l'adresse du Nous pouvons déduire cette arithmétique pointeur que: tab[i] est équivalent à *(tab + i).demême, *(pti+i) est équivalent à pti[i]. élémentsd'utableau La gure 10.5 est un exemple dans lequel sont décrites les diérentes façons d'accér au tab etdupointeur pt aprèsladénitionsuivante: int tab[8], *pt = tab; 10.5 Tableau pointeurs La dénition d'un tableau pointeurs se fait par: type *nom[taille] ; contiennent Le premier les cas adresses d'utilisation s éléments d'un tel du tableau tableau est celui variables. où les C'est éléments le cas du s tableau arguments pointeurs argv envplafonction main()quenousavonseul'occasiond'aborrdanslasection8.7etquenous et avons représentés dans la gure 8.5. variables La gure suivantes: 10.6 est un exemple d'utilisation tableau pointeurs à partir s dénitions int tab[8], *pt[8] = {tab,tab+1,tab+2,tab+3,tab+4,tab+5,tab+6,tab+7};

148 TABLEAU DE POINTEURS Fig Pointeur et tableau Fig. 10.6Tableaupointeurssursvariablesdansuntableau

149 CHAPITRE 10. POINTEURS ET TABLEAUX 135 Fig. 10.7Accèsàuntableauàuxdimensionsavecunpointeur 10.6 Pointeurs vers un tableau globalité Un pointeur ou une structure peut contenir dont l'adresse nous parlerons d'une variable dans le chapitre assez complexe 11. Ce type comme pointeur un tableau permet dans par sa exemple plus détaillée manipuler dans la section les sous-tableaux 14.2 les règles d'un tableau lecture à ux et d'écriture dimensions. d'une Nous déclaration verrons complexe, manière en suivant ces règles, un pointeur sur un tableau pris dans sa globalité se déclare par : type (*nom)[taille] ; entiers La gure (certains 10.7 diraient décrit les un diérentes tableau façons 6 lignes d'accér et 5 colonnes) aux variables à partir d'un d'un tableau pointeur six qui fois peut cinq contenir une adresse sous-tableau( cinq entiers). int tab[6][5]; tableau 6 fois 5 entiers. int (*pt)[5]= tab; ci-ssus Le programme par le pointeur 10.2 montre associé. les diérentes manières d'accér aux éléments du tableau déni 10.7 Exercices sur les tableaux et les pointeurs Exercice 1 : tri tableaux d'entiers en les L'exercice mettant consiste dans ux à lire tableaux, s entiers puis dans trier un chacun tableau, s ux séparer tableaux. les nombres pairs et les impairs 0,cetentierestmisdansletableauetilestconsirécommeunesentinellentableau. Lestableauxontunetaillearbitraire100.Lalecturesentiersseterminelorslasaisie

150 EXERCICES SUR LES TABLEAUX ET LES POINTEURS les adresses Laséparationentrenombrespairsetimpairsestfaitedansunefonctionquireçoitenarguments les tableaux s pairs trois et impairs tableaux(adresse par s zéros. l'élément rang 0 du tableau), cette fonction termine Le tri chaque tableau est realisé par une fonction tri(int *) trisimple,unexempled'algorithmeestdonnéàlancetexte.laréécriturestableauxtriés qui utilise un algorithme permet vérier la validité l'ensemble. qui Le contient programme la fonction doit être composé d'un chier source qui contient les fonctions etd'un autre main() compilateur entre les ux chiers. et d'un chier d'inclusion qui permet faire la liaison pour le s Lefaitmettreszérosenntableaupeutvoussuggérermanipulercestableauxavec pointeurs. Le programme 10.3 est un exemple d'algorithme tri d'un tableau terminé par un zéro.

151 CHAPITRE 10. POINTEURS ET TABLEAUX 137 Programme 10.2 Accès à un tableau à ux dimensions avec un pointeur 1 #inclu <stdio.h> 2 3 int 4 main (int argc, char *argv[]) 5 { 6 int tab[6][5]; 7 int (*pt)[5]= tab; 8 int i,j; 9 10 for(i=0;i<6;i++) 11 for(j=0;j<5;j++) 12 tab[i][j]= i*10+j; for(i=2;i<6;i++) 15 for(j=3;j<5;j++){ 16 printf("tab[%d][%d] = %d\t",i,j,tab[i][j]); 17 printf("%d\t",*(tab[i]+j)); 18 printf("%d\t",*(*(tab+i)+j)); 19 printf("%d\t",*(*(pt+i)+j)); 20 printf("%d\t",*(pt[i]+j)); 21 printf("%d\n",pt[i][j]); 22 } 23 return 0; 24 } Données écrites sur le fichier standard sortie tab[2][3] tab[2][4] tab[3][3] tab[3][4] tab[4][3] tab[4][4] tab[5][3] tab[5][4] =

152 EXERCICES SUR LES TABLEAUX ET LES POINTEURS Programme 10.3 Algorithme d'un tri simple i = 0; Tant que tab[i] faire j = i + 1; Tant que tab[j] faire si tab[j] est inferieur a tab[i] alors faire echanger tab[j] et tab[i] fait finsi j++; fait i++; fait Programme 10.4 Suggestion corrigé chapitre 10 exercice 1 chier d'inclusion 1 extern int saisie(int []); /* fonction saisie tableau 2 * retourne le nombre d'entiers saisis 3 */ 4 extern void tri(int []); /* fonction tri tableau pointe */ 5 extern void imptab(int [],int); /* fonction d'impression du tableau */ 6 extern int separ(int [],int [],int []); /*separation pairs/impairs */

153 CHAPITRE 10. POINTEURS ET TABLEAUX 139 Programme 10.5 Suggestion corrigé chapitre 10 exercice 1 fonctions 1 #inclu <stdio.h> 2 3 int /* fonction saisie du tableau a manipuler */ 4 saisie (int ti[]){ 5 int *ptab = ti; 6 printf (" Entrer s entiers \n"); 7 printf (" Terminer la liste avec 0\n\n"); 8 do 9 scanf ("%d", ptab); 10 while (*ptab++!= 0); 11 return ptab - ti; 12 } int /* separation s pairs et s impairs en ux tableaux */ 15 separ (int t[], int tp[], int ti[]){ 16 register int *pttab = t, *ptimp = ti, *ptpair = tp; 17 while (*pttab) 18 if (*pttab & 0x01) *ptimp++ = *pttab++; 19 else *ptpair++ = *pttab++; 20 *ptimp = *ptpair = 0; /* chien gar fin tableau */ 21 return pttab - t; /* nombre d entiers traites */ 22 } void /* fonction d'impression du tableau */ 25 imptab (int tri[], int type){ 26 register int *ptri = tri, i; 27 if (type == 0) 28 printf ("\n\timpression du tableau initial \n"); 29 else if (type == 1) 30 printf ("\n\timpression du tableau impair \n"); 31 else 32 printf ("\n\timpression du tableau pair \n"); 33 i = 0; 34 while (*ptri){ 35 printf (" %6d ", *ptri++); 36 if (!*ptri) break; 37 if (i++ &&!(i % 8)) printf ("\n"); 38 } 39 }

154 EXERCICES SUR LES TABLEAUX ET LES POINTEURS Programme 10.6 Suggestion corrigé chapitre 10 exercice 1 main 1 #inclu <stdio.h> 2 #inclu "c10c01a.h" 3 /* programme principal realisant les operations suivantes : 4 saisie du tableau 5 separation s nombres pairs et impairs 6 appel la fonction tri 7 * - appel la fonction impression. 8 */ 9 int tab[100], imp[100], pair[100]; 10 int 11 main (int argc, char *argv[], char **envp){ 12 register int count; /* finition 3 pointeurs */ 13 /* saisie du tableau a manipuler */ 14 count = saisie (tab); 15 printf (" Vous avez saisi %d nombres dans le tableau\n", count); 16 /* separation s pairs et s impairs en ux tableaux */ 17 count = separ (tab, pair, imp); 18 printf (" Nous avons séparé %d nombres dans le tableau\n", count); 19 tri (tab); /* tri et impression */ 20 imptab (tab, 0); 21 tri (imp); /* tri et impression */ 22 imptab (imp, 1); 23 tri (pair); /* tri et impression */ 24 imptab (pair, 2); 25 return 0; 26 } Données en entrée Données écrites sur le fichier standard sortie Entrer s entiers Terminer la liste avec 0 Vous avez saisi 11 nombres dans le tableau Nous avons séparé 10 nombres dans le tableau Impression du tableau initial Impression du tableau impair Impression du tableau pair

155 CHAPITRE 10. POINTEURS ET TABLEAUX 141 Programme 10.7 Suggestion corrigé chapitre 10 exercice 1 fonction tri 1 void 2 tri (int ti[]){ /* fonction tri tableau pointe par ptint */ 3 register int tamp, *ptrj, *ptint = ti; 4 while(*ptint){ 5 ptrj = ptint + 1; 6 while(*ptrj){ 7 if(*ptrj < *ptint){ 8 tamp = *ptint; 9 *ptint = *ptrj; 10 *ptrj = tamp; 11 } 12 ptrj++; 13 } 14 ptint++; 15 } 16 }

156 EXERCICES SUR LES TABLEAUX ET LES POINTEURS

157 Chapitre 11 Structures réel Une ou un structure concept. est une variable composée plusieurs champs qui sert à représenter un objet couleur,l'année,... Par exemple une voiture peut être représentée par les renseignements suivants : la marque, la 11.1 Dénition Le langage C permet dénir s modèles structures comme les autres langages évolués. Cela se fait selon la dénition donnée par l'encart suivant. struct nom structure { type1 nom_champ1 ; type2 nom_champ2 ; type3 nom_champ3 ; type4 nom_champ4 ;... typen nom_champ_n ; } variables ; qui Une est optionnel, dénition et à ce dénir type sert s variables à dénir construites un modèle à partir structure ce associé modèle à (cette un nom dénition modèle, optionnelle aussi). est variable Comme à la le dénition montre l'exemple la structure, 11.1 dans dans les ce lignes cas, le 2 modèle à 4, il est structure possible doit ne être pas associé déclarer à un nom manière à pouvoir utiliser celui-ci pour dénir s variables ultérieurement. La dénition d'une structure ne réserve pas d'espace mémoire. Il faut dénir les variables correspondant à ce modèle structure(ligne 6). objetscetypevrontêtredéclarésimmédiatement(lignes8à11).cemodèlestructurene Il est aussi possible ne pas associer un nom modèle à la dénition la structure. Les peutpasêtreréférencéparlasuite,puisqu'iln'apasnom.ilestditanonyme.

158 UTILISATION Programme 11.1 Dénition structures 1 2 struct date { 3 int jour, mois, annee ; 4 } ; 5 6 struct date obdate, *ptdate = &obdate; 7 8 struct { 9 int jour, mois 10 char annee[20] ; 11 } ob1, *pt1; Objet Pointeur obdate.jour 1; ptdate->jour 1; obdate.mois = 1; ptdate->mois = 1; obdate.annee = 85; ptdate->annee = 85; Tab Accès aux champs d'une structure 11.2 Utilisation Les structures peuvent être manipulées champ par champ ou dans leur ensemble Opérations sur les champs nomlavariablesuivid'unpointetdunomduchampdésiré: L'accès aux éléments d'une structure, que nous appelons aussi nom variable.nom_du_champ. champs, se fait en utilisant le Pour accér aux champs d'une structure à partir d'un pointeur ture, il faut remplacer le point par un moins suivi d'un supérieur (qui associé symbolise avec une une éche) struc- nom variable->nom_du_champ. : Une fois ces dénitions réalisées, nous pouvons utiliser les variables obdate et ptdate le montre le tableau comme 11.1, Enprenantlesdénitionsdonnéesdansleprogramme11.1dansleslignes2à6,letableau donne les diérentes possibilités d'aectation pour chaque champ. Nous remarquerons l'équivalence entre: (*ptdate).jour et ptdate->jour mentparrapportaudébutlastructurepuisàaccéràunevariableàcetteadresse. Pour le compilateur, l'accès à un champ d'une structure consiste à faire un calcul déplace Opérations sur la variable dans son ensemble nombreux La normalisation compilateurs du langage qui consiste C a institutionalisé à considérer une une variable pratique construite qui était déjà à partir courante d'un dans structuré comme une variable simple. type Ilestpossibleconstruireunefonctionquiaccepteenargumentouquiretourneunestructure. suivantes En prenant sont possibles les dénitions sur les structures: variables et fonctions du programme 11.2, les opérations

159 CHAPITRE11. STRUCTURES 145 Programme 11.2 Dénition structures 1 2 struct date { 3 int jour, mois, annee ; 4 } ; 5 6 struct date obdate, obdate2e; 7 extern struct date newdate() ; 8 extern int checkdate(struct date) ; 9 int resul ; 1. l'aectationd'unvariableparuneautredumêmetypecomme obdate = obdate2; 2. leretourd'unestructureparunefonctioncomme obdate = newdate(); 3. le passage en argument d'une structure à une fonction. resul = checkdate(obdate2) Structures et listes chaînées type La syntaxe structure. du Ceci langage permet C autorise faire les s dénitions listes chaînées structure comme le contenant montre le s programme pointeurs sur ce Programme 11.3 Structures et listes chaînées 1 2 struct noeud { 3 int val ; 4 struct noeud *suiv 5 struct noeud *pred ; 6 } no, tab[100], *ptnoeud = tab ; méthique Note sur s les adresses pointeurs que l'incrémentation structures : nous d'un avons pointeur vu dans le faisait le chapitre passer sur précént l'élément sur suivant l'arit- lorsque typevariableassociéaupointeur.ilenestmêmepourunpointeurquicontientuneadresse le pointeur contient une adresse qui correspond à un tableau d'éléments correspondants au sont structure. dans un Un tableau. pointeur incrémenté permet l'accès à la structure suivante lorsque les structures pointeur Reprenons sur la le structure programme noeud dans lequel nous avons déni un tableau structures et un Aprésladénitionlavariable ptnoeud pointealorssur tab[0] etsinousécrivons: ptnoeud++; ptnoeud pointe sur tab[1] Champs bits décrites Les structures sur un ensemble donnent d'éléments accès à un binaires découpage dont la s taille octets est pour inférieure obtenir à celle s variables l'octet. qui sont La Il précision est en eet la possible longueur découper chaque logiquement champ est faite un ensemble par l'ajout d'octets en s ensembles bits. : longueur élément la structure. Les structures champs bits sont déclarées selon le modèle à l'encart chaque suivant.

160 EXERCICES SUR LES STRUCTURES struct nom structure { unsigned nom_champ1 : longueur1 ; unsigned nom_champ2 : longueur2 ; unsigned nom_champ3 : longueur3 ; unsigned nom_champ4 : longueur4 ;... unsigned nom_champ_n : longueurn ; } objets ; pas Il que est d'autres recommandé types soient n'utiliser supportés. que s Un éléments champ sans type nom, unsigned. avec simplement La norme X3J11 la taille, n'impose champ remplissage pour cadrer sur s frontières mot machine. est un pondantàschampsbits: Le programme 11.4 donne quelques exemples dénitions modèles structures corres- Programme 11.4 Structures et champs bits 1 struct mot 2 { 3 unsigned sign:1; 4 unsigned val:15; 5 }; 6 7 struct flottant 8 { 9 unsigned exposant:7; 10 unsigned signe:1; 11 unsigned mantisse:24; 12 }; struct mixte 15 { 16 unsigned exposant:7; 17 unsigned signe:1; 18 unsigned mantisse:24; 19 unsigned comp:7; 20 unsigned : 9; 21 }; 11.5 Exercices sur les structures Exercice 1 mois Dénir et l'année. une structure date contenant trois champs type entier pour intier le jours, le Initialiser une variable type structure date. Imprimer àl'ailavariable. cette structure: à l'ai d'un pointeur.

161 CHAPITRE11. STRUCTURES 147 Programme 11.5 Suggestion corrigé chapitre 11 exercice 1 1 #inclu <stdio.h> 2 struct date /* claration du mole structure date */ 3 { 4 int jour; 5 int mois; 6 int annee; 7 }; 8 9 int 10 main (int argc, char *argv[], char **envp) 11 { 12 struct date dat, *ptdate = &dat; 13 /* saisie la date */ 14 printf (" Entrez une date ( jj mm aaaa ) :"); 15 scanf ("%d %d %d", &dat.jour, &dat.mois, &dat.annee); 16 /* impression la date */ 17 printf (" La date est : %d\t%d\t%d\n", dat.jour, dat.mois, dat.annee); 18 /* impression la date avec le pointeur */ 19 printf (" La date est : %d\t%d\t%d\n", ptdate->jour, ptdate->mois, 20 ptdate->annee); 21 return 0; 22 } Données en entrée Données écrites sur le fichier standard sortie Entrez une date ( jj mm aaaa ) : La date est : La date est : Exercice 2 Dénir un tableau structures date. Dénir un pointeur sur ce tableau. Initialiser ce tableau. Imprimer le contenu du tableau.

162 EXERCICES SUR LES STRUCTURES Programme 11.6 Suggestion corrigé chapitre 11 exercice 2 1 #inclu <stdio.h> 2 /* claration du mole structure date */ 3 struct date{ int jour, mois, annee;}; 4 int 5 main (int argc, char *argv[], char **envp) 6 { 7 struct date dat[5], *ptdate=dat; 8 int i = 0; 9 /* remplissage du tableau */ 10 printf ("Entrez 5 dates au format ( jj mm aaaa )\n"); 11 while (i < 5){ 12 scanf ("%d %d %d", &dat[i].jour, &dat[i].mois, &dat[i].annee); 13 i++; 14 } 15 /* impression du tableau */ 16 for (i = 0; i < 5; i++, ptdate++) { 17 /* sans pointeur */ 18 printf (" Date numero %d : %d\t%d\t%d\n", i + 1, dat[i].jour, 19 dat[i].mois, dat[i].annee); 20 /* avec pointeur */ 21 printf (" Date numero %d : %d\t%d\t%d\n", i + 1, ptdate->jour, 22 ptdate->mois, ptdate->annee); 23 } 24 return 0; 25 } Données en entrée Données écrites sur le fichier standard sortie Entrez 5 dates au format ( jj mm aaaa ) Date numero 2003 Date numero Date numero 2003 Date numero Date numero 2003 Date numero Date numero 2003 Date numero Date numero Date numero 5 :

163 Chapitre 12 Unions Les unions permettent l'utilisation d'un même espace mémoire par s données types diérents à s moments diérents Dénition Ladénitiond'uneunionrespecteunesyntaxeprochecelled'unestructureetquiestdonnée dans l'encart suivant. union nom union { type1 nom_champ1 ; type2 nom_champ2 ; type3 nom_champ3 ; type4 nom_champ4 ;... typen nom_champ_n ; } variables ; Le programme 12.1 dénit ux variables z1 et z2 peutcontenirsoitunentier,soitunentierlong,soitunnombreavecpointdécimal,soitunnombre construites sur le modèle d'une zone qui avec point décimal long. Programme 12.1 Utilisation d'une union 1 union zone { 2 int entier; 3 long entlong; 4 float flottant; 5 double flotlong; 6 } z1,z2; mémoire Lorsque nécessaire l'on dénit pour une stocker variable le correspondant plus grand s à un champs type union, appartenant le compilateur à l'union. réserve Dans l'espace exemple, le compilateur réserve l'espace mémoire nécessaire pour stocker un notre double svariables pour chacune z1 et z2.

164 ACCÈS AUX CHAMPS 12.2 Accès aux champs d'une La structure(voir syntaxe d'accès section aux champs ). d'une union est intique à celle pour accér aux champs pourobtenirunevaleur,doitêtrefaitdansletypequiaétéutilisépourstockerlavaleur.sicette Une union ne contient cependant qu'une donnée à la fois et l'accès à un champ l'union uniformité n'est pas respectée dans l'accès, l'opération vient dépendante la machine. un Les même unions espace ne mémoire sont pas avec stinées s types à faire s données conversions. diérents Elles dans ont s étés étapes inventées diérentes pour utiliser même programme. Elles sont, par exemple, utilisées dans les compilateurs. d'un vantes Les sont diérents vraies: champs d'une union sont à la même adresse physique. Ainsi, les égalités sui- &z1.entier == (int*)&z1.entlong &z1.entier == (int*)&z1.flottant &z1.entier == (int*)&z1.flotlong Programme 12.2 Utilisation d'une union 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) 4 { 5 union etiq 6 { 7 short int ent; 8 unsigned short int ent1; 9 } lmot = { -1, }; 10 printf ("Valeur lmot.ent : %hd\n", lmot.ent); 11 printf ("Valeur lmot.ent1 : %hd\n", lmot.ent1); 12 return 0; 13 } Données écrites sur le fichier standard sortie Valeur lmot.ent : -1 Valeur lmot.ent1 : Dansl'exemple 12.2, lazonemémoirecorrespondantàlavariable ouavecsigne.ainsisilavaleur peutêtrevuesanssigne -1 plus gran que zéro (puisque égale estaectéeàlmot.ent.cettevaleurpeutêtreconsidéréecomme est vue à travers à USHRT_MAX ou 65535U) ou plus petite suivant qu'elle lmot.ent ou lmot.ent1. Ainsi le programme 12.1 donne le résultat suivant: Valeur lmot.ent : -1 Valeur lmot.ent1 : Exercices sur les unions et les champs bits Exercice 1 Dénir une union pouvant contenir une variable s types suivants: entier, réel et caractère. Pourchacunsmembresl'union:

165 CHAPITRE12. UNIONS 151 lire acher une l'adresse valeur correspondante du membre; au clavier; puis acher son contenu. Programme 12.3 Suggestion corrigé chapitre 12 exercice 1 1 #inclu <stdio.h> 2 union test { /* finition du mole l'union */ 3 char un_char; 4 int un_int; 5 float un_float; 6 } ; 7 int 8 main (int argc, char *argv[], char **envp) 9 { 10 union test un_test; 11 /* saisie du caractere et impression */ 12 printf(" Entrer un caractere : "); 13 scanf("%c",&un_test.un_char); 14 printf(" caractere : %c \t adresse : %x \n", 15 un_test.un_char, &un_test.un_char); 16 /* saisie l'entier et impression */ 17 printf(" Entrer un entier : "); 18 scanf("%d",&un_test.un_int); 19 printf(" entier : %d \t adresse : %x \n", 20 un_test.un_int, &un_test.un_int); 21 /* saisie du flottant et impression */ 22 printf(" Entrer un flottant : "); 23 scanf("%f",&un_test.un_float); 24 printf(" flottant : %f \t adresse : %x \n", 25 un_test.un_float, &un_test.un_float); 26 return 0; 27 } Données en entrée c Données écrites sur le fichier standard sortie Entrer un caractere : caractere : c adresse : bffff564 Entrer un entier : entier : 22 adresse : bffff564 Entrer un flottant : flottant : adresse : bffff Exercice 2 Denirunchampbitscomposé: 2bits, 7bitspourunpremiercaractère, 7bitspourunuxièmecaractère, Initialiser 16bitspourunentier. ce champ bits. Imprimer ce champ en hexadécimal.

166 EXERCICES SUR LES UNIONS ET LES CHAMPS DE BITS Imprimer les diérentes composantes ce champ. Programme 12.4 Suggestion corrigé chapitre 12 exercice 2 1 #inclu <stdio.h> 2 struct champ_bit { /* finition du champ bits */ 3 unsigned left 2; 4 unsigned car1 7; 5 unsigned car2 7; 6 unsigned nbre : 16; 7 } champ = { 01, 'a', 'Z', 4532 }; /* initialisation */ 8 int 9 main (int argc, char *argv[], char **envp) 10 { 11 /* impression du champ globalement */ 12 printf(" Valeur du champ : %x\n", champ); 13 /* impression chaque partie du champ */ 14 printf(" Caractere %c\n", champ.car1); 15 printf(" Caractere 1 %x\n", champ.car1); 16 printf(" Caractere %c\n", champ.car2); 17 printf(" Caractere 2 : %x\n", champ.car2); 18 printf(" Nombre %d\n", champ.nbre); 19 printf(" Nombre : %x\n", champ.nbre); 20 printf(" Bits gauche : %x\n", champ.left); 21 return 0; 22 } Données écrites sur le fichier standard sortie Valeur du champ : 11b4b585 Caractere a Caractere 1 61 Caractere Z Caractere 2 : 5a Nombre 4532 Nombre : 11b4 Bits gauche : 1

167 Chapitre 13 Énumérations langage Les énumérations C. Ces énumérations servent à sont orir un s apport possibilités la norme gestion ANSI et constantes permettent énumérées d'exprimer dans s le valeurs constantes type entier en associant ces valeurs à s noms. constantes(voir Les énumérations chap. orent 15). une alternative à l'utilisation du pré-processeur dans la scription 13.1 Dénition La dénition d'une énumération respecte la syntaxe donnée dans l'encart suivant. enum nom énumération { énumérateur1, énumérateur2, énumérateur3, énumérateur4,... énumérateurn } variables ; rateurs Les diérents sont, par énumérateurs défaut, dénies sont s la manière constantes suivante symboliques. : la première Les valeurs constante associées est associée aux énumé- valeur 0, les constantes suivantes suivent une progression 1. à la signe Il égal est possible et la valeur xer entière une valeur exprimée à chaque par une énumérateur constante; en si faisant l'énumérateur suivre l'énumérateur suivant n'est pas du associéàunevaleur,laprogression1reprendàlavaleurcourante. Nous baserons nos exemples sur le programme Les lignes 2 et 3 cet exemple d'énumération dénissent les constantes symboliques: 1. rouge quicorrespondàlavaleur0; 2. vert quicorrespondàlavaleur1; 3. bleu quicorrespondàlavaleur2. Elles dénissent la variable rvb possibilités standard s énumérations. construite sur ce modèle d'énumération. Cette partie utilise les

168 UTILISATION Programme 13.1 Utilisation d'énumérations 1 #inclu <stdio.h> 2 enum couleurs { 3 rouge, vert, bleu 4 } rvb; 5 enum autrescouleurs { 6 violet=4, orange, jaune=8 7 } arcenciel; 8 enum typefic { 9 normal = , 10 repertoire = , 11 special_bloc = , 12 special_car = , 13 sock_unix = , 14 tube_nomme = , 15 lien_symb = }tfic; 17 int 18 main (int argc, char *argv[]) 19 { 20 rvb = 12 ; 21 arcenciel = violet + jaune; 22 if(rvb == arcenciel) 23 tfic = repertoire; 24 else 25 tfic = normal; 26 rvb = sock_unix; 27 return 0; 28 } boliques Les lignes suivantes: 5 à 7 xent les valeurs certains énumérateurs eet dénissent les constantes sym- 1. violet quiestassociéeàlavaleur4; 2. orange quicorrespondàlavaleur5(violet + 1); 3. jaune quiestassociéeàlavaleur8. Elles dénissent la variable arcenciel construite sur le modèle d'énumération autrescouleurs. chiers Les dans lignes les 8 inos à 16 montrent d'un système une utilisation chiers s type énumérations UNIX. pour diérencier les types 13.2 Utilisation constantes Lesénumérateurspeuventêtreutilisésdanssexpressionsdulangageàlamêmeplaceques et pour réaliser du type s entier. tests. Ainsi, ils peuvent se situer dans s calculs, pour aecter s variables

169 CHAPITRE13. ÉNUMÉRATIONS Limites s énumérations l'avantage Les énumérations pouvoir sont réaliser s s types expressions synonymes combinant (voir chap. s variables 14) du type type entier. énuméré Ceci avec présente entiers. Elles permettent d'utiliser s constantes symboliques. Les variables dénies à partir s type énuméré sont cependant traitées comme s entiers. correspondant Le compilateur aux n'impose constantes pas symboliques qu'une variable associées type avec énuméré ce type. soit Ainsi aectée nous avec pouvons une s écrire valeurs lignes 20, 22 et 26 du programme 13.1 sans que le compilateur proteste. Dans ces lignes nous les mélangeons avoir message les constantes d'avertissement symboliques du compilateur. appartenant à s types d'énumération diérents sans

170 LIMITES DES ÉNUMÉRATIONS

171 Chapitre 14 Types synonymes et complexes Ce chapitre abor la dénition types complexes Types synonymes Il est possible grâce au déclarateur typef nonyme. L'introduction du mot réservé dénir un type nouveau qui est un type sy- typef provoque le fait que les noms qui seraient s noms comme variables premier sur mot la d'une même ligne ligne sans dénitions réservé viennent s noms types synonymes. Chaque nom type synonyme correspond ce mot type qu'aurait eu la variable sur la même ligne sans typef. au Ainsi la dénition suivante: typef int entier ; dénituntypesynonymeappelé entier Une fois cette dénition réalisée, nous pouvons ayantlesmêmescaractéristiquesqueletypeprédéni utiliser ce nouveau type pour dénir s variables int. et expressions. nous pouvons mélanger les variables ce type avec s variables entières pour réaliser s entier e1=23, e2=5, te[50]={1,2,3,4,5,6,7}; int i; i = e1 + e2; te[20] = i - 60; nomtype. Danslecasladéclarationtableaux,latailledunouveautypesetrouveaprèslenouveau typef int tab[10]; tab tt ; Dans cet exemple, tab vient un type synonyme correspondant au type tableau 10 int. La variable tt estuntableau10entiers. typef compilateur. est très semblable à une directive du pré-processeur (chap. 15) mais il s'adresse au Attention: typef inaccessibles comme variables. ne réserve pas d'espace mémoire. Les noms sont s types; ils sont donc

172 TYPESCOMPLEXES L'utilisation typef programmeurs d'écrire du co permet plus lisible. faciliter les dénitions prototypes pour permettre aux Ilestaussipossibledéniruntypeéquivalentàunestructure: typef struct { int jour int mois ; int annee ; } date ; et d'utiliser directement ce type. Ceci évite les répétitions fastidieuses du mot réservé struct. date obdate, *ptdate ; Ainsi obdate est un objet correspondant au type date qui est synonyme d'une structure anonyme contenanttroisvariablesentièresappelées jour, mois etannee.lavariable ptdate estunpointeur qui peut contenir l'adresse d'une variable du type date mais qui dans l'exemple n'est pas initialisé Types complexes par Nous un autre allons rédacteur. nous intéresser Ainsi notre aux types premier complexes objectif est sous l'angle pouvoir du comprendre lecteur d'un une programme ligne comprenant s déclarations ou s dénitions variables qui semblent à première vue complexes. écrit Pour ilfautpartirdunoml'objet; réaliser cette lecture correctement nous appliquerons la règle suivante: et le tableau ensuite il 5.6. faut appliquer les règles précénce s opérateurs telles que données dans portent Les parties sur les du parenthèses tableau correspondant précénce qui aux nous regroupement intéressent dans ou aux cette fonctions, entreprise aux sont crochets celles correspondant qui les règles aux précénces tableaux, sont et aux les étoiles suivantes: correspondant aux pointeurs. Parmi ces quatre opérateurs () àdroite; représentant le regroupement est priorité la plus élevée et une associativité gauche () correspondant à l'intication d'une fonction et [] tableau sont priorité égale et immédiatement inférieure correspondant au regroupement à la dénition avec une associativité gauche à droite; d'un * àgauche. est priorité la plus basse parmi nos quatre opérateurs avec une associativité droite variable. Le tableau 14.1 donne un ensemble dénitions variables et décrit le type chaque 14.3 Fonctions et tableaux Comme le montre les exemples précénts, il est possible dénir s tableaux pointeurs sur une fonction. int (*t1[10])(); int *(*t2[10])();

173 CHAPITRE 14. TYPES SYNONYMES ET COMPLEXES 159 Déclaration Objet int *tab[10]; tableau 10 pointeurs d'entier int **ta[10]; tableau d'entier 10 pointeurs sur s pointeurs int (*tb)[10]; pointeur sur un tableau 10 entiers int *(*tb)[10]; pointeur sur un entier sur un tableau 10 pointeurs int *fp(); fonction sur un entier qui retourne un pointeur int (*fp)(); pointeur retourne sur un entier une fonction qui union u { Modèle d'union ux structures type struct t1 u1; t1ett2 struct t2 u2; } int tt()[10]; dénition tableau. illégale fonction qui retourne un int tt[10](); dénition illégale tableau fonctions int (*t1[10])(); Tableau fonctions qui 10 retournent adresses un entier int *(*t2[10])(); Tableau fonctions qui 10 retournent adresses un pointeur d'entier int t3[]; tableau l'objet est taille obligatoirement inconnue la dénition externe int *t4[]; tableau pointeurs externe int t5[][]; déclaration illégale il faut xer la taillela2e int **t7; Pointeur sur un dimension (Souvent utilisé pour pointeur décrire d'entier pointeurs d'entier) un tableau float (*pf[5])()= Tableau pointeurs sur {sin,cos} s fonctions qui retournent s float Les initialisées ux premières par les adresses entrées du tableau sont cos et sin Tab Exemples d'objets complexes

174 EXERCICES SUR LES DÉCLARATIONS COMPLEXES Le tions premier qui retournent exemple dénit un entier. un tableau Le second exemple 10 pointeurs dénit qui un peuvent tableau recevoir 10 pointeurs s adresses fonctions fonc- qui peuvent recevoir s adresses fonctions qui retournent un pointeur sur un entier. consiste En langage à dé-référencer C, le nom son d'une adresse fonction pour est provoquer considéré un comme saut du une pointeur adresse et programme l'appel d'une courant fonction cette adresse. à 14.4 Exercices sur les déclarations complexes Exercice 1 Dénir structure les types date suivants: pointeur sur une telle structure que dénie date, dans le programme 11.5, tableaudixobjetsstructuredate. Programme 14.1 Suggestion corrigé chapitre 14 exercice 1 1 struct date /* finition du mole structure date */ 2 { int jour, mois, annee; }; 3 4 /* finition s types synonymes */ 5 typef struct date tdate; 6 typef tdate * ptdate; 7 8 #inclu <stdio.h> 9 int 10 main (int argc, char *argv[], char **envp) 11 { 12 tdate dat; 13 ptdate ptd=&dat; 14 /* saisie la date */ 15 printf (" Entrez une date ( jj mm aaaa ) :"); 16 scanf ("%d %d %d", &dat.jour, &dat.mois, &dat.annee); /* impression la date */ 19 printf (" La date est : %d\t%d\t%d\n", dat.jour, dat.mois, dat.annee); /* impression la date avec le pointeur */ 22 printf (" La date est : %d\t%d\t%d\n", ptd->jour, ptd->mois, ptd->annee); 23 return 0; 24 } Données en entrée Données écrites sur le fichier standard sortie Entrez une date ( jj mm aaaa ) : La date est : La date est :

175 CHAPITRE 14. TYPES SYNONYMES ET COMPLEXES Exercice 2 Dénir un type correspondant à la dénition suivante: Une untableau10pointeurssursentiers, union pouvant contenir: untableau10pointeurssursottants, untableau10entiers, untableau10ottants Exercice 3 permettre Cet exercice son édition, a pour à but partir d'un manipuler menu en le utilisant remplissage l'appel d'un tableau fonction à structures travers s date pointeurs. et Pourcelailfautécriretroisfonctions: une une fonction fonction saisie, une fonction consultation, La fonction permettant sortir l'application. main() d'une structure, édition contient et arrêt. une boucle innie donnant un menu qui ore le choix entre saisie

176 EXERCICES SUR LES DÉCLARATIONS COMPLEXES Programme 14.2 Suggestion corrigé chapitre 14 exercice 2 1 /* claration s differents types tableaux */ 2 typef int int_10[10]; 3 typef int *ptint_10[10]; 4 typef float float_10[10]; 5 typef float *ptfloat_10[10]; 6 /* finition s differents objets pouvant etre contenus dans l'union */ 7 union u1 { 8 int_10 o1; 9 ptint_10 o2; 10 float_10 o3; 11 ptfloat_10 o4; 12 }; 13 /* finition du type union */ 14 typef union u1 utab; 15 /* finition d'un objet ce type */ 16 utab my_union ; 17 #inclu <stdio.h> 18 int 19 main (int argc, char *argv[], char **envp){ 20 int i; 21 /* initialisation s entiers avec leur rang */ 22 for(i=0; i < 5;i++ ) my_union.o1[i] = i; 23 /* impression du tableau */ 24 for(i=0; i < 5;i++ ) 25 printf("my_union.o1[%d] = %d \n", i, my_union.o1[i]); 26 /* initialisation s pointeurs avec leurs propres adresses */ 27 for(i=0; i < 5;i++ ) 28 my_union.o2[i] = & my_union.o1[i]; 29 /* impression du tableau pointeurs */ 30 for(i=0; i < 5;i++ ) 31 printf("my_union.o2[%d] = %x \n", i, my_union.o2[i]); 32 return 0; 33 } Données écrites sur le fichier standard sortie my_union.o1[0] 0 my_union.o1[1] 1 my_union.o1[2] 2 my_union.o1[3] 3 my_union.o1[4] 4 my_union.o2[0] 80495a0 my_union.o2[1] 80495a4 my_union.o2[2] 80495a8 my_union.o2[3] 80495ac my_union.o2[4] = 80495b0

177 CHAPITRE 14. TYPES SYNONYMES ET COMPLEXES 163 Programme 14.3 Suggestion corrigé chapitre 14 exercice 3 chier d'inclusion 1 struct date { 2 int jour, mois, annee; 3 }; 4 5 void saisie(struct date *); 6 void edition(struct date *); 7 void sortie(); Programme 14.4 Suggestion corrigé chapitre 14 exercice 3 fonctions 1 #inclu <stdio.h> 2 #inclu "c14c03.h" 3 4 void saisie(struct date * ptd) 5 { 6 int i; 7 /* rang dans le tableau dates */ 8 printf(" Entrez le rang dans le tableau date :"); 9 scanf("%d", &i); 10 ptd += i; 11 /* saisie la date */ 12 printf(" Entrez une date ( jj mm aaaa ) :"); 13 scanf("%d%d%d", &ptd->jour, &ptd->mois, &ptd->annee); 14 } 15 void edition(struct date * ptd) 16 { 17 int i; 18 /* rang dans le tableau dates */ 19 printf("entrez le rang dans le tableau date :"); 20 scanf("%d", &i); 21 ptd += i; 22 /* edition la date */ 23 printf("date dans le tableau :"); 24 printf("%d %d %d\n", ptd->jour, ptd->mois, ptd->annee); 25 } void sortie() 28 { exit(0); }

178 EXERCICES SUR LES DÉCLARATIONS COMPLEXES Programme 14.5 Suggestion corrigé chapitre 14 exercice 3 1 #inclu <stdio.h> 2 #inclu "c14c03.h" 3 4 static struct date dat[10]; 5 6 int 7 main (int argc, char *argv[], char **envp) 8 { 9 int i; 10 static void (*f[3])() = { saisie, edition, sortie }; for(;;) { 13 printf("\tsaisie\t1\n"); 14 printf("\tedition\t2\n"); 15 printf("\tarret\t3\n"); 16 printf("choix :"); 17 scanf("%d",&i); 18 f[i-1](dat); 19 /* on peut aussi ecrire : (*f[i-1])(dat); */ 20 } 21 } Données en entrée Données écrites sur le fichier standard sortie saisie 1 edition 2 arret 3 Choix : Entrez le rang dans le tableau date : Entrez une date ( jj mm aaaa ) : saisie 1 edition 2 arret 3 Choix :Entrez le rang dans le tableau date :Date dans le tableau : saisie 1 edition 2 arret 3 Choix : Entrez le rang dans le tableau date : Entrez une date ( jj mm aaaa ) : saisie 1 edition 2 arret 3 Choix :

179 Chapitre 15 Préprocesseur Processor Comme ou nous CPP) l'avons traite dit le dans chier la section source avant 1.4, le le pré-processeur compilateur. ou Il ne pré-compilateur(alias manipule que s chaînes C Pre commençant caractères. par Il retire un# pour les parties créer le commentaires co que le compilateur (entre /* et analysera. */). Il prend en compte les lignes Sespossibilitéssont4ordres: inclusion chier en utilisant la directive #inclu dénition variables précompilation: #fine NOM valeur #unf NOM dénition macro-fonction ou macro-expression: #fine m(x) (128*(x)+342*(x)*(x)) sélection du co en fonction s variables du pré-processeur: #if #iff #ifnf #else #endif 15.1 Commentaires ne sont Les commentaires d'aucune utilité sont au stinés compilateur, à faciliter et il est la compréhension naturel qu'ils n'apparaissent du source lors pas la dans relecture. le source Ils quiluieststiné.lepré-processeurretirelescaractèrescomprisentre/*et*/.ilnegèrepasles imbrications erreurs compilation commentaires. comme le La montre mise en le commentaire programme d'une section source peut alors créer s le compilateur. Le tableau 15.1 montre le retrait s commentaires dans un chier source avant le passage vers nouveaucommentairecequiprovoqueuneerreursyntaxesurlaligne La gure15.2 montre le retrait s commentaires dans un chier source après l'introduction du a = 2; carlecompilateur voit */ a = 2; Inclusion chiers L'inclusion chiers par le pré-processeur est déclenchée par la rencontre la directive:

180 INCLUSION DE FICHIERS Programme 15.1 Traitement s commentaires 1 int 2 main (int argc, char *argv[]) 3 { 4 int a,b,c; 5 a=1; 6 b=1; 7 c=1; 8 /* ajout a+b a c */ 9 c += a +b ; 10 a=2; 11 return 0; 12 } Source après précompilation 1 "c15e01.c" 2 "<interne>" 3 "<ligne comman>" 4 # 1 "c15e01.c" 5 int 6 main (int argc, char *argv[]) 7 { 8 int a,b,c; 9 a=1; 10 b=1; 11 c=1; c += a +b ; 14 a=2; 15 return 0; 16 } #inclu nom fichier Par convention, les chiers à inclure ont s noms terminés par.h pour signier hear. pré-processeur Il existe trois cherche façons le chier. nommer un chier à inclure. Ces façons déterminent l'endroit où le 1. par nom son chemin chemin correspondant absolu, ce qui au se traduit chier commence dans un système par /; type UNIX par le fait que le #inclu "/users/chris/essai/hear.h" #inclu < /users/chris/essai/hear.h > 2. àpartirducataloguecourant,silenomchierestentouréparsguillemets; #inclu "hear.h" #inclu "h/mem.h" #inclu "../h/uucp.h" 3. à chier partir est d'un entouré catalogue par un prédéni inférieur correspondant et un supérieur. à l'installation Ce catalogue du compilateur, est manière si le standard nom /usr/inclu dans les systèmes UNIX. #inclu < stdio.h > #inclu < sys/dir.h > utilisant Il est une possible option manr compilation au pré-processeur à l'appel l'en-chaîneur d'ajouter d'autres passes. catalogues Cette option à sa recherche, est dans un en

181 CHAPITRE15. PRÉPROCESSEUR 167 Programme 15.2 Erreur due au traitement s commentaires 1 int 2 main (int argc, char *argv[]) 3 { 4 int a,b,c; 5 a=1; 6 b=1; 7 /* Ceci ne nous interesse plus 8 c=1; 9 /* ajout a+b a c */ 10 c += a +b ; 11 */ 12 a=2; 13 return 0; 14 } Source après précompilation 1 "c15e02.c" 2 "<interne>" 3 "<ligne comman>" 4 # 1 "c15e02.c" 5 int 6 main (int argc, char *argv[]) 7 { 8 int a,b,c; 9 a=1; 10 b=1; c += a +b ; 15 */ 16 a=2; 17 return 0; 18 } en-chaîneur manière à spécier passe plusieurs UNIX -Inom_du_catalogue. catalogues recherche. Cette option peut être utilisée plusieurs fois Lorsque le chier à inclure est spécié entre guillemets, le pré-processeur cherche le chier: 1. dans le catalogue courant, 2. puis dans les catalogues spéciés par les options -I. Silenomduchieràincluestentre < et>,lepré-processeurcherchelechier: 1. dans les catalogues spéciés par les options -I, 2. puis dans le catalogue par défaut du compilateur. chiers. Les chiers inclus sont traités par le pré-processeur. Ils peuvent contenir d'autres inclusions

182 VARIABLES DE PRÉ-COMPILATION Sans constante précompilation Avec constante précompilation int tab[20] #fine LG 20 int tab[lg] for ( i = 0; i < 20; i++ ) for ( i = 0; i < LG; i++ ) Tab Utilisation d'une constante compilation 15.3 Variables pré-compilation Les variables pré-compilation ont ux utilisations: la dénition constantes utilisées pour la compilation; ladénitionvariablesquijouentunrôlebooléenetpermettentlasélectionduco Dénition constantes compilation associéàlamanipulationtableaux.ilestplussimpleetplussûrd'avoiruneconstantequisoit Comme le montre la table 15.1, l'usage le plus courant s constantes compilation est utilisée précompilation lors la dénition se fait par: et lors la manipulation du tableau. La dénition d'une constante #fine nom la_variable valeur lorsque Ceci cette évite taille rechercher change. Lorsqu'une dans le source constante les instructions compilation qui font a été référence dénie, à CPP la taille change du tableau lesoccurrencesdunomlaconstanteparsavaleur,sauflorsquelenomsetrouvedansunechaîne toutes caractères.lechangementnesefaitquelorsquelenomlavariableestisolé.letableau15.3 est un exemple d'utilisation s variables précompilation Dénition stinée à la sélection sélection CPP permet parties dénir chier s source. variables Ces variables précompilation n'ont pas qui besoin permettent d'être associées réaliser à les une tests valeur. Ellesjouentenquelquesortelerôlebooléenspuisqueleprécompilateurtestesiellessontdénies ou section non Elles servent à déterminer les parties cos à compiler comme nous le verrons dans la La dénition d'une variable précompilation se fait par: #fine nom la_variable 15.4 Dénition macro-expressions expressions CPP permet sont très la dénition semblables à macro-expressions celles macro-assembleurs. encore appelées macro-fonctions. Ces macro- est La suivi dénition d'une parenthèse d'une macro-expression ouvrante, la se liste fait s aussi arguments, par la directive d'une #fine. parenthèse Le fermante, nom la et macro dénition du corps la macro. la #fine add(x1,x2) ((x1) += (x2)) Lorsque le préprocesseur rencontre une expression du type add(a,b), il génère ((a) += (b)). nique Il faut la plus faire simple attention est l'utilisation à l'ordre d'évaluation intensive du pour parenthésage s macro-expressions en encadrant complexes, les noms s et pseudoc Christian Bac la tech

183 CHAPITRE15. PRÉPROCESSEUR 169 Programme 15.3 Interprétation s variables par le préprocesseur 1 #fine PI #fine LG int 5 main (int argc, char *argv[]) 6 { 7 int i,t[lg]; 8 for (i=0; i<lg; i++){ 9 printf("valeur PI \%d",t[i] = PI); 10 } 11 return 0; 12 } Source après précompilation 1 "c15e03.c" 2 "<interne>" 3 "<ligne comman>" 4 # 1 "c15e03.c" int 9 main (int argc, char *argv[]) 10 { 11 int i,t[20]; 12 for (i=0; i<20; i++){ 13 printf("valeur PI \%d",t[i] = ); 14 } 15 return 0; 16 } variables par s parenthèses mais aussi en encadrant la macro-expression elle-même. Comme le montre l'exemple 15.4, le parenthésage garantit que l'expression résultante est correctement interprétée, la ligne 16 l'exemple montre que l'expression m(a+b) est mal évaluée Eacement d'une dénition Il est possible d'eacer une dénition variable par: #unf nom la_variable La variable est alors considérée comme non dénie. Dans le cas où la variable est associée à unevaleur,lesoccurrencessonnomnesontplusremplacéesparsavaleur Dénition à l'appel l'enchaîneur passes passes: Il existe ux possibilités pour dénir les variables précompilation à l'appel l'enchaîneur enutilisantl'option traité par le préprocesseur -Dnomaveclenomlavariableprécompilation. comme si la variable précompilation Lechierseraalors nom était dénie, par la

184 SÉLECTION DE CODE directive #fine nom. en utilisant l'option -Dnom=valeur signe = et la valeur à associer avec à cette le nom constante la constante précompilation. précompilation Le préprocesseur suivi du changera les occurrences la variable nom précompilation par la valeur valeur, comme si la constante nom était dénie, par la directive #fine nom Il existe s variables précompilation qui sont prédénies. Elles valeur. la machine, au compilateur et à l'environnement. Elles sont la plupart du sont temps associées d'une au part type xées par par ce la compilation rnier. l'enchaîneur passe lui-même ou par la détection l'environnement passes: Par exemple, sur un PC au 05/04/2003 les variables suivantes sont prédénies par l'enchaîneur ELF unix gnu_linux linux i386 i386 i386 L'utilisation l'option dumpspecs avec gcc ou cpp d'autres. donne ces informations parmi beaucoup prédénie Pour nir, appelée les STDC. compilateurs à la norme ANSI doivent avoir une variable préprocesseur l'option Il est -Unom. possible d'eacer ces dénitions au niveau l'appel à l'enchaîneur passes, en utilisant Ceci ne peut pas inhiber les dénitions qui apparaissent dans le co par s #fine Sélection co cutables La sélection qui se comportent co permet diéremment. générer Cela à partir permet d'un en particulier même chier partir source s s même chiers chiers exé- sourcespourobtenir:sbinairesexécutablespoursmachinesetssystèmesdiérents,ous environnements qui donnent s d'exécution informations diérents. sur les variables Cela permet (traces), aussi et d'avoir pouvoir un générer source avec le chier s instructions avecousanscestraces. exécutable xées Leprincipebaseconsisteàpasserouàsupprimerspartiescosuivantsconditions à partir s variables précompilation. Lasélectionsefaitàpartirslignesdirectivessuivantes: #if #iff #ifnf #else #endif avec Touteconditionsélectioncocommenceparun éventuellement une partie #else. #if[n[f]],etseterminepar #endif, aucompilateur.sielleestfausse,lecopasséestceluientrele Lorsquelaconditionestvraie,lecoquisetrouveentrele #if[n[f]]etle #elseetle #endif.s'iln'yapas #elseestpassé partie #else aucun co n'est passé.

185 CHAPITRE15. PRÉPROCESSEUR Sélection avec #if La sélection avec #if ne peut mettre en jeu que se s fait constantes par test d'une et s expression variables vali précompilation. du langage C. Le Cette programme expression quelques exemples d'utilisaiton #if variableenutilisantlemot En plus s expressions du langage C, le préprocesseur permet tester l'existence d'une fined danslalignetest. #fine DEBUG #if fined DEBUG co passe #endif #if fined(debug) co passe #endif Sélection avec #iff et #ifnf La sélection avec #iff et #ifnf est semblable à celle avec #if fined Dansleprogramme15.6extraitdulogiciellibre sendmail,letestcompilationaveclogpermet ou #if!fined. De déterminer plus le type si s retour informations la fonction sont envoyées au système trace du système d'exploitation. xalloc() type standard ANSI ou non. Comme le montre le programme dépend du 15.7, fait lui que aussi le compilateur extrait du co soit du sendmail, les sélections peuvent être imbriquées Exercices sur le préprocesseur Exercice 1 Dénir valeur les absolue macros d'une fonctions expression, suivantes: minimum maximum ux ux expressions, minimum trois expressions, expressions, maximum minimum en valeur trois expressions, et en ne l'utilisant pas), absolue ux expressions(en utilisant valeur absolue d'une expression maximum et en ne l'utilisant envaleurabsolue pas), trois expressions(enutilisant valeur absolued'une expression Utiliser auclavier.utiliserlesoptions-eou-pl'enchaineurpassespourlireleprogrammecgénéré. ces dénitions pour faire imprimer leurs résultats sur s entiers puis s ottants entrés Exercice 2 lignes Reprendre bug l'exercice imprimant sur la le valeur calcul s du discriminant racines d'une et équation les calculs du intermédiaires. second gré, pour ajouter s lorsqu'on Ces lignes passe doivent l'option-ddebug se trouver dans à la s compilation. test du préprocesseur manière à n'être présente que

186 EXERCICES SUR LE PRÉPROCESSEUR Le chier d'inclusion est intique à celui du programme 9.8 et les fonctions sont les mêmes que dans le programme 9.6.

187 CHAPITRE15. PRÉPROCESSEUR 173 Programme 15.4 Evaluation macros par CPP 1 2 #fine add(x1,x2) ((x1) += (x2)) 3 #fine m(x) 128*x+342*x*x 4 #fine y(x) (128*(x)+342*(x)*(x)) 5 int 6 main (int argc, char *argv[]) 7 { 8 int a,b,c; 9 int e,f,g; 10 a b c 1; 11 d = e = f = 2; 12 add(a,b); 13 add(a,b+1); 14 d m(a); 15 e y(a); 16 m(a+b); 17 d y(a+b); 18 m(add(a,b)); 19 f = y(add(a,b)); 20 return 0; 21 } Source après précompilation 1 "c15e04.c" 2 "<interne>" 3 "<ligne comman>" 4 # 1 "c15e04.c" int 10 main (int argc, char *argv[]) 11 { 12 int a,b,c; 13 int e,f,g; 14 a b c 1; 15 d = e = f = 2; 16 ((a) += (b)); 17 ((a) += (b+1)); 18 d 128*a+342*a*a; 19 e (128*(a)+342*(a)*(a)); *a+b+342*a+b*a+b; 21 d (128*(a+b)+342*(a+b)*(a+b)); *((a) += (b))+342*((a) += (b))*((a) += (b)); 23 f = (128*(((a) += (b)))+342*(((a) += (b)))*(((a) += (b)))); 24 return 0; 25 }

188 EXERCICES SUR LE PRÉPROCESSEUR Programme 15.5 Exemple d'utilisation du #if 1 #fine vrai 1 2 #fine faux 0 3 #if vrai 4 vrai_est_vrai 5 #else 6 vrai_est_faux 7 #endif 8 #if faux 9 faux_est_vrai 10 #else 11 faux_est_faux 12 #endif 13 #if vrai faux 14 vrai_ou_faux_est_vrai 15 #endif 16 #if!faux 17 not_faux_est_vrai 18 #endif 19 #if vrai &&!faux 20 vrai_et_not_faux_est_vrai 21 #endif Source après précompilation 1 "c15e05.c" 2 "<interne>" 3 "<ligne comman>" 4 # 1 "c15e05.c" vrai_est_vrai faux_est_faux vrai_ou_faux_est_vrai not_faux_est_vrai vrai_et_not_faux_est_vrai

189 CHAPITRE15. PRÉPROCESSEUR 175 Programme 15.6 Exemples sélection co par #iff #iff LOG if (LogLevel > 20) syslog(log_debug, "%s: unlink %s", CurEnv->e_id, f); #endif /* LOG */ #iff STDC void * #else /*! STDC */ char * #endif /* STDC */ xalloc(sz) register int sz; { #iff STDC register void *p; #else /*! STDC */ register char *p; #endif /* STDC */ Programme 15.7 Sélection co par #iff imbriqués #iff _PATH_SENDMAILPID void WritePid() { extern char *PidFile; FILE *f; (void) unlink(pidfile); /* try to be safe :-) */ if ((f = dfopen(pidfile, "w"))!= NULL) { fprintf(f, "%d\\n", getpid()); (void) chmod(pidfile, 0444); (void) fclose(f); } # iff LOG else syslog(log_notice, "Could not log daemon " "pid %d to file %s: %m", getpid(), PidFile); # endif /* LOG */ } #endif /* _PATH_SENDMAILPID */

190 EXERCICES SUR LE PRÉPROCESSEUR Programme 15.8 Suggestion corrigé chapitre 15 exercice 1 dénition s macros 1 #fine abs(a) ((a) < 0? (-(a)) : (a)) 2 #fine min(a1,a2) ((a1) < (a2)? (a1) : (a2)) 3 #fine max(a1,a2) ((a1) > (a2)? (a1) : (a2)) 4 #fine min3(a1,a2,a3) ((a1) < (a2)? (a1) < (a3)? (a1) : (a3) : \ 5 (a2) < (a3)? (a2) : (a3)) 6 #fine max3(a1,a2,a3) ((a1) > (a2)? (a1) > (a3)? (a1) : (a3) : \ 7 (a2) > (a3)? (a2) : (a3)) 8 #fine min_abs(a1,a2) (min(abs(a1),abs(a2))) 9 #fine max_abs2(a1,a2) \ 10 (((a1) > && (a2) 0) ((a1) > (a2)? (a1) : (a2)) : \ 11 (((a1) < && (a2) > 0) ((-(a1)) (a2) (-(a1)) (a2)) 12 (((a1) > 0 && (a2) < 0)? ((-(a2)) > (a1)? (-(a2)) : (a1)) : \ 13 ((-(a2)) > (-(a1))? (-(a2)) : (-(a1)))))) #fine max_abs2bis(a1,a2) \ 16 (((a1) -(a1) (a1)) > ((a2) 0) (-a2) (a2))? \ 17 (((a1) < 0? -(a1) : (a1)) : ((a2) < 0)? (-a2) : (a2)) #fine max_abs3(a1,a2,a3) max3(abs(a1),abs(a2),abs(a3))

191 CHAPITRE15. PRÉPROCESSEUR 177 Programme 15.9 Suggestion corrigé chapitre 15 exercice 1 1 #inclu <stdio.h> 2 #inclu "c15c01.h" 3 4 int 5 main (int argc, char *argv[], char **envp) 6 { 7 int i,j,k; 8 printf("rentrez les valeurs i j et k :"); 9 scanf("%d%d%d",&i,&j,&k); printf("valeurs absolues : %d %d %d \n", abs(i), abs(j), abs(k)); 12 printf("minimum et j %d \n", min(i,j)); 13 printf("maximum et k : %d \n", max(i,k)); 14 printf("minimum et %d \n", min3(i,j,k)); 15 printf("maximum i j et k : %d \n", max3(i,j,k)); 16 printf("minimum s valeurs absolues %d \n", min_abs(i,j)); 17 printf("maximum s valeurs absolues : %d \n", max_abs2(i,j)); 18 printf("maximum s trois en valeur absolue : %d \n",max_abs3(i,j,k)); 19 return 0; 20 } Données en entrée Données écrites sur le fichier standard sortie Rentrez les valeurs i j et k :Valeurs absolues : Minimum et j -23 Maximum et k : 12 Minimum et -23 Maximum i j et k : 12 Minimum s valeurs absolues 12 Maximum s valeurs absolues : 23 Maximum s trois en valeur absolue : 23

192 EXERCICES SUR LE PRÉPROCESSEUR Programme Suggestion corrigé chapitre 15 exercice 2 1 #inclu <stdio.h> 2 #inclu <math.h> 3 #inclu "c09c03a.h" 4 int 5 main (int argc, char *argv[], char **envp){ 6 float a,b,c,r,r1; 7 double rdis; 8 float res; 9 printf("calcul s racines ax2 + bx + c\n\n"); 10 /* saisie s coefficients */ 11 printf("saisissez les coefficients a b et c\n"); 12 scanf("%f %f %f",&a,&b,&c); 13 if( a == 0 ){ 14 printf(" Equation du premier gre \n"); 15 printf(" La solution est x = %f \n", -c / b); 16 exit(0); 17 } 18 r = -b/(2 * a); 19 #iff DEBUG 20 printf(" -b/2*a : %f \n", r); 21 #endif 22 res = dis(a,b,c); 23 #iff DEBUG 24 printf(" discriminant : %f \n", res); 25 #endif 26 switch ( res < 0? -1 : (res >0? 1 : 0 )) { 27 case 1: 28 rdis = sqrt(res); 29 #iff DEBUG 30 printf(" racine du discriminant : %f \n", rdis); 31 #endif 32 r1 = rdis / ( 2 * a); 33 #iff DEBUG 34 printf(" r1 : %f \n", r1); 35 #endif 36 rac2(r,r1); 37 break; 38 case -1: 39 rdis = sqrt(-res); 40 #iff DEBUG 41 printf(" racine du discriminant : %f \n", rdis); 42 #endif 43 r1 = rdis / ( 2 * a); 44 #iff DEBUG 45 printf(" r1 : %f \n", r1); 46 #endif 47 complex(r,r1); 48 break; 49 case 0: racd(r); 50 break; 51 } 52 return 0; 53 }

193 Chapitre 16 Entrées-sorties la bibliothèque réaliser Comme s nous programmes l'avons vu, sans le langage être obligé C est réinventer bas niveau. les Pour fonctionalités permettre les aux plus programmeurs bibliothèque du langage C fournit s fonctions plus haut niveau ainsi que s fonctions courantes, qui la permettent la réalisation s entrée-sorties. La bibliothèque standard contient: 1. s fonctions permettant la gestion s entrées-sorties(e/s); 2. s fonctions manipulation chaînes caractères; 3. s fonctions d'allocation dynamique mémoire; 4. s fonctions à caractère général qui permettent l'accès au système. appellé L'ensemble BIO (Basic s fonctions Input Output). qui permettent Ces fonctions faire et s les entrée-sorties structures associées standards sont décrites bas niveau dans est chier le < >. Tout programme désirant manipuler les E/S vra contenir la ligne: #inclu<stdio.h> Le chier stdio.h les dénitions contient: les prototypes s macro-expressions; les dénitions constantes: fonctions; la dénition du tableau s chiers EOF, stdin, ouverts. stdout,...; une Le suite langage d'octets C donne (un caractère une vision = "UNIXienne" 1 octet). Le chier s entrée-sorties. n'a pas structure En langage propre C, un qui chier lui est est attachée. d'enregistrements Il est cependant correspondant possible à au une niveau structure. programme considérer un chier comme une suite Leprincipelamanipulationd'unchierestlesuivant: 1. ouverture du chier; 2. lecture, écriture, et déplacement dans le chier; 3. fermeture du chier Entrée-sorties standards par Conformément l'environnement à la vision programmation UNIXienne lorsque s entrées-sorties, le programme commence trois pseudo-chiers à s'exécuter. sont Ces ouverts pseudo-chiers permettent l'accès au terminal l'utilisateur. trois Ilsontpournom:

194 ENTRÉE-SORTIESSTANDARDS stdin pour chier standard d'entrée; ce chier est le plus souvent associé au clavier; stdout pour chier standard sortie; ce chier désigne le plus souvent l'écran et les fonctions d'accèsassociéesutilisentunetechniquetampon1 pourlesécrituresquiluisontassociées; strr les pour écritures chier sont standard non tamponnées. d'erreur, ce chier correspond lui aussi le plus souvent à l'écran mais sation Ces s chiers symboles peuvent être redirigés au niveau l'interprète commans [Bou78] par l'utili- > et < les commans sont enchaînées à l'appel par s du tubes programme. en utilisant Ils sont le symbole automatiquement. Voici quelques redirigés exemples lorsque non exaustifs d'utilisation s redirections: prog >fichier lorsque prog écrit, les octets sont dirigés vers le chier fichier prog <fichier : prog litdanslechier fichier prog 2 >fichier : prog écrit ses messages d'erreur dans le chier fichier prog1 prog2 : la sortie standart prog1 est associée à l'entrée standard prog2. opérations À ces chiers suivantes: standards sont associées s fonctions prédénies qui permettent réaliser les lecture lecture et et écriture écriture caractère ligne par ligne; par caractère; lecture et écriture formatées Échanges caractère par caractère parfoisréduitàuneversionl'asciisurseptbits. Dans ces échanges, l'unité base est le caractère que le système considère comme un octet (voir Lesuxfonctionsquenousprésentonsicisontsouventsmacro-expressionsdupréprocesseur chapitre 15); nous les considérerons comme s fonctions pour simplier la présentation. int getchar(void); synopsis : est considéré cettefonctionpermetlireuncaractèresur comme étant du type stdins'ilyenaun.cecaractère unsigned char; argument : aucun; retour : chier(eof). la fonction retourne L'entier un contient entier soit pour la valeur permettre du caractère la reconnaissance lu soit EOF; la valeur n conditions d'erreur : en n chier la fonction retourne la valeur EOF. int putchar(int ); synopsis : cette fonction permet d'écrire un caractère sur stdout; argument : Elle est dénie comme recevant un entier2 Ceci permet d'écrire putchar(getchar()). pour être conforme à getchar(). retour : Elle retourne la valeur du caractère écrit toujours considéré comme un entier. conditions d'erreur : en cas d'erreur la fonction retourne EOF. et reproduit Le programme les caractères 16.1 réalise son la lecture chier standard son chier d'entrée standard sur son d'entrée chier standard caractère par sortie. caractère rôle est similaire à celui l'utilitaire Son cat(1) du système UNIX lorsqu'il est utilisé comme ltre. 1Souvent nommé par l'anglicisme buer, ce tampon permet ne pas trop solliciter le système d'exploitation lors s écritures. Sa taille la plus courante est un kilo-octets. 2Avant la norme C99, la promotion implicite s arguments fonctions (voir 3.8.1) faisait que toute façon la valeur d'un caractère était convertie en une valeur d'entier lors du passage d'arguments à une fonction.

195 CHAPITRE 16. ENTRÉES-SORTIES DE LA BIBLIOTHÈQUE 181 Programme 16.1 Lecture et écriture caractère par caractère sur les fichiers standards 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) 4 { 5 int c; 6 while ((c = getchar ())!= EOF) 7 putchar (c); 8 return 0; 9 } Données en entrée The quick brown fox jumped over the lazy dog, Données écrites sur le fichier standard sortie The quick brown fox jumped over the lazy dog, Échanges ligne par ligne une Dans suite ces caractères échanges, l'unité base est la ligne caractères. La ligne est considérée comme char n du chier. Le caractère terminée n ligne par un a une caractère valeur entière n égale ligne à ou 10 par et est la détection représenté par la l'abréviation '\n'. char *gets(char *); synopsis : octet) dans lire une la mémoire ligne sur stdin; à partir les caractères l'adresse donnée la ligne en sont argument rangés(un à la caractère fonction. par retourchariotestlumais n'estpasrangéenmémoire.ilestremplacéparuncaractère Le nul '\0' comme une chaîne manière à caractères. ce que la ligne, une fois placée en mémoire, puisse être utilisée argument : lus. l'adressed'unezonemémoiredanslaquellelafonctiondoitrangerlescaractères retour : permettre Si s une caractères imbrication ont été dans lus, les la appels fonction retourne fonction. l'adresse son argument pour conditions d'erreur : n'est lu), la fonction Si retourne la n un chier pointeur est atteinte, caractère lors valeur l'appel 0 (aucun caractère (NULL déni dans < stdio.h >). remarque : lataillelazonemémoiredanslaquelleilluiestmandéplacerlescaractères.il Cette fonction ne peut pas vérier que la taille la ligne lue est inférieure à faut lui préférer la fonction fgets() pour tout logiciel qualité. int puts(char *); synopsis : écriture d'une chaîne caractères, suivie d'un retour chariot sur stdout. argument : l'adresse d'une chaîne caractères. retour : unevaleurentièrenonnégativeencassuccès. conditions d'erreur : Elle retourne la valeur EOF en cas problème. d'entréeetlechierstandardsortiemaisréalisecesentrées-sortiesligneparligne.lechoixd'un Laversion16.2reprendleprogrammeprécéntlectureetréécritureentrelechierstandard

196 ENTRÉE-SORTIESSTANDARDS tableau parlafonction 256 gets().ceciresteunespoiretpeutêtredémentisileprogrammeestconfrontéà caractères permet d'espérer qu'aucune ligne lue ne provoquera un déborment uneligneplusgrantaille,danscecaslecomportementduprogrammeestnondéni3. Programme 16.2 Lecture ligne par ligne sur les fichiers standards 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) 4 { 5 char BigBuf[256]; 6 while (gets (BigBuf)!= NULL) 7 puts (BigBuf); 8 return 0; 9 } Données en entrée The quick brown fox jumped over the lazy dog, Données écrites sur le fichier standard sortie The quick brown fox jumped over the lazy dog, Échanges avec formats permettantdébuterlaprogrammation(chapitre4).lesfonctionspermettantfairesentréesorties formatées sur les chiers standards d'entrée et sortie sont les suivantes: Nous avons déjà parlé s entrée-sorties formatées dans le chapitre sur les éléments base int scanf(const char *,...); synopsis : lecture formatée sur stdin. arguments : guments variable comme l'indique à partir du la second spécication argument...., cette fonction accepte une liste d'ar- 1. le s premier variables argument à saisir. est une chaîne caractères qui doit contenir la scription 2. les donnée autres dans arguments le premier sont argument) les adresses qui s sont variables(conformément aectées par la lecture. à la scription retour : nombre variables saisies. conditions d'erreur : la valeur EOF standard fermé. est retournée en cas d'appel sur un chier d'entrée int printf(const char *,...); synopsis : écriture formatée sur stdout arguments : ments à écrire, chaîne suivie caractères s valeurs contenant s variables. s commentaires et s scriptions d'argu- retour : nombre caractères écrits. conditions d'erreur : la valeur EOF standard fermé. est retournée en cas d'appel sur un chier sortie 3Cette fonction est l'un s points faibles s programmes écrits en langage C face à une attaque type déborment buer, l'utilisation fgets() que nous verrons plus loin et qui permet d'éviter ces déborments doit lui être préférée.

197 CHAPITRE 16. ENTRÉES-SORTIES DE LA BIBLIOTHÈQUE 183 sont Des données exemples manière formats exhaustive sont donnés dans dans la partie le tableau sur les 4.2. entrée-sorties Les possibilités formatées en matière (voir section format 16.5) Ouverture d'un chier doit À être part ouvert les trois avant pseudo-chiers pouvoir accér dont nous à son avons contenu parlé dans en lecture, le paragraphe écriture précént, ou modication. tout chier d'exécution. L'ouvertured'unchierestl'associationd'unobjetextérieur(lechier)auprogrammeencours système chiers Une fonction et s attributs d'ouverture d'ouverture. spécie le nom du chier à l'intérieur l'arborescence du L'ouverture d'un chier est réalisée par la fonction fopen() selon la scription suivante: FILE *fopen(const char *, const char* ); synopsis : le système ouverture chiers d'un sous chier forme référencé d'une chaîne par le premier caractères) argument selon (nom le mo du d'ouverture chier dans décrit par le second argument(chaîne caractères). arguments : 1. la lechierdansl'arborescence.cenomestdépendantdusystèmed'exploitationdans première chaîne caractères contient le nom du chier manière à référencer lequel le programme s'exécute. 2. Le d'ouverture. uxième argument est lui aussi une chaîne caractères. Il spécie le type retour : pointeursurunobjettype FILE (typedénidans < stdio.h par les opérations manipulation du chier ouvert(lecture, écriture >)quiserautilisé ou déplacement). conditions d'erreur : le pointeur NULL ((void être ouvert(problèmes d'existence du chier ou *)0) est droits retourné d'accès). si le chier n'a pas pu le chier Le type est d'ouverture considéré est comme spécié une à chier partir d'un type mo texte base (c'est-à-dire et compléments. qu'il ne contient Sans précision, caractères ASCII). Le type d'ouverture base peut être: que s "r" lechierestouvertenlecture. Silechiern'existepas,lafonctionnelecréepas. "w" le existe chier la est fonction ouvert le en vi. écriture. Si le chier n'existe pas, la fonction le crée. Si le chier "a" lechierestouvertenajout. lieuàlanduchier. Silechiern'existepas,lafonctionlecrée. Lesécrituresauront Le type d'ouverture peut être agrémenté ux caractères qui sont: "b" le sans chier interprétation est considéré par en mo les fonctions binaire. Il la peut bibliothèque. donc contenir s données qui sont transférées "+" le ouvert chier dans est le ouvert mo dans "r+" le cela mo signie complémentaire qu'il est ouvert du en mo mo lecture base. Par et plus, exemple soit lecture s'il est et écriture. La combinaison s mos base et s compléments donne les possibilités suivantes: "r+" pas.lechierpeutêtrelu,modiéetagrandi. le chier est ouvert en lecture plus écriture. Si le chier n'existe pas, la fonction ne le crée "w+" le le chier chier existe, est ouvert la fonction en écriture le vi. plus lecture. Le chier Si peut le chier être manipulé n'existe pas, en écriture la fonction et relecture. le crée. Si

198 FERMETURE D'UN FICHIER "a+" écrituresaurontlieuàlanduchier.lechierpeutêtrelu. le chier est ouvert en ajout plus lecture. Si le chier n'existe pas, la fonction le crée. Les "rb" crée lechierestouvertenlectureetenmobinaire. pas. Silechiern'existepas,lafonctionnele "wb" crée. le chier Si le est chier ouvert existe, en écriture la fonction et en le mo vi. binaire. Si le chier n'existe pas, la fonction le "ab" lechierestouvertenajoutetenmobinaire. Lesécrituresaurontlieuàlanduchier. Silechiern'existepas,lafonctionlecrée. "r+b" n'existepas,lafonctionnelecréepas.lechierpeutêtrelu,modiéetagrandi. ou "rb+"le chier est ouvert en lecture plus écriture et en mo binaire. Si le chier "w+b" ou "wb+" n'existe pas, le la chier fonction est le ouvert crée. en Si écriture le chier plus existe, lecture la fonction et en le mo vi. binaire. Le chier Si peut le chier écritpuisluetécrit. être "a+b" pas,lafonctionlecrée. ou "ab+"lechierestouvertenajoutplus Lesécrituresaurontlieuàlanduchier. lectureetenmobinaire. Silechiern'existe La fonction fopen() les autres opérations. Le retourne pointeur une qui référence reçoit cette vers référence une structure (souvent données appelé qui pointeur sert pour toutes par une traduction chier FILE *) doit être déclaré comme dans le programme 16.3 Si le système Programme 16.3 Ouverture d'un chier 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) 4 { 5 FILE *MyFich; 6 MyFich = fopen ("/etc/passwd", "r"); 7 /*... */ 8 return 0; 9 } d'exploitation ne peut pas ouvrir le chier, il retourne une référence égale au pointeur NULL. Si un chierquin'existepasestouvertenmoécritureouajout,ilestcrééparlesystème Fermeture d'un chier la fonction Avantd'étudierlesfonctionspermettantd'accérauxdonnéesd'unchierouvert,considérons fermeture du qui chier permet ouvert. terminer Elle a le la prototype manipulation suivant: d'un chier ouvert. Cette fonction réalise la int fclose(file *); synopsis : la structure c'est la fonction inverse fopen(); elle détruit le lien entre la référence vers FILE fermeture provoque et l'écriture le chier physique physique. s Si données le chier du ouvert tampon(voir est en mo 16.7). écriture, la arguments : une référence type FILE vali. retour : 0danslecasnormal. conditions d'erreur : la fonction retourne EOF en cas d'erreur. Tout programme manipulant un chier doit donc être encadré par les ux appels fonctions fopen() et fclose() comme le montre la gure 16.4.

199 CHAPITRE 16. ENTRÉES-SORTIES DE LA BIBLIOTHÈQUE 185 Programme 16.4 Ouverture et fermeture d'un chier 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) 4 { 5 FILE *MyFich; 6 MyFich = fopen ("/etc/passwd", "r"); 7 /*... */ 8 fclose (MyFich); 9 return 0; 10 } 16.4 Accès au contenu du chier Unefoislechierouvert,lelangageCpermetplusieurstypesd'accèsàunchier: par parligne, caractère, par par enregistrement, Dans tous données les cas, formatées. comportement séquentiel. les fonctions L'appel d'accès ces fonctions au chier provoque (sauf les le opérations déplacement déplacement) du pointeur courant ont un relatif une impression au chier ouvert. consommation Si le chier s est données ouvert contenues en mo lecture, dans le les chier opérations jusqu'à la lecture rencontre donnent n du chier. la Accès caractère par caractère Les fonctions suivantes permettent l'accès caractère par caractère: int fgetc(file *); synopsis : lecture d'un caractère(unsigned char) dans le chier associé; argument : uneréférencetype FILE valicorrespondant àunchierouvertenlecture; retour : lavaleurducaractèrelupromuedansunentier; conditions d'erreur : à la rencontre la n chier, la fonction retourne EOF et positionne les indicateurs associés(voir 16.8). int getc(file *); synopsis : cette fonction est intique à fgetc() mais peut être réalisée par une macro déniedans < stdio.h >. int ungetc(int, FILE *); synopsis : cette fonction permet remettre un caractère dans le buer lecture associé àunuxd'entrée. int fputc(int, FILE *); synopsis : dans le écrit premier dans argument. le chier Ce associé caractère décrit est par converti le second en un argument un caractère spécié unsigned char; argument : référence le premier type argument contient le caractère à écrire et le second contient la FILE du chier ouvert; retour : lavaleurducaractèreécritpromuedansunentiersaufencasd'erreur;

200 ACCÈS AU CONTENU DU FICHIER conditions d'erreur : en cas d'erreur d'écriture, la fonction retourne EOF indicateurs associés(voir 16.8). et positionne les int putc(int, FILE *); synopsis : cettefonctionestintiqueà fputc() dans maiselleestréaliséeparunemacrodénie < stdio.h >. Les fonctions (macro-expressions) getc() et putc() sont en fait la base getchar() et putchar que nous avons utilisées jusqu'ici. putchar(c) est déni comme putc(c,stdout); getchar() Comme est déni comme getc(stdin). getchar() la fonction getc() retourne un entier pour pouvoir retourner la valeur EOF en rangé n dans chier. un entier Dans en le considérant cas général, l'octet l'entier comme retourné étant correspond du type caractère à un octet non lu dans signé le chier et (unsigned char). est Le donné programme en argument 16.5 (comportement est un exemple intique d'écriture à à la l'écran comman du contenu d'un chier dont le nom cat(1) commeargumentunseulnomchier).lechierestouvertenmolectureetilestconsidéré du système UNIX avec comme étant en mo texte. Programme 16.5 Lecture caractère par caractère d'un fichier après ouverture 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) 4 { 5 FILE *MyFic; 6 int TheCar; 7 if (argc!= 2) 8 return 1; 9 MyFic = fopen (argv[1], "r"); 10 if (MyFic == NULL) 11 { 12 printf ("Impossible d ouvrir le fichier %s \n", argv[1]); 13 return 2; 14 } 15 while ((TheCar = fgetc (MyFic))!= EOF) 16 fputc (TheCar, stdout); 17 fclose (MyFic); 18 return 0; 19 } Données en entrée The quick brown fox jumped over the lazy dog, Données écrites sur le fichier standard sortie The quick brown fox jumped over the lazy dog, Accès ligne par ligne opérations Comme pour lecture les entrée-sorties et d'écriture sur ligne les par pseudo-chiers ligne à l'intérieur standards, chiers il est ouverts. possible Cet réaliser accès ligne s parlignesefaitgrâceauxfonctions: c ChristianBac

201 CHAPITRE 16. ENTRÉES-SORTIES DE LA BIBLIOTHÈQUE 187 char *fgets(char *, int, FILE *); synopsis : au uxième lit une argument ligne caractères moins un, ou dans au le plus chier le nombre associé au caractéres troisième argument. correspondant caractères la ligne sont rangés dans la mémoire à partir l'adresse donnée Les premier argument. Si le nombre caractères lu est inférieur à la taille, le retour en chariotestluetrangéenmémoire.ilestsuiviparuncaractèrenul '\0' ce que la ligne une fois placée en mémoire, puisse être utilisée comme une manièreà caractères. chaîne arguments : 1. adresselazonestockagescaractèresenmémoire, 2. nombre maximum caractères(taille la zone stockage), 3. etlaréférencetype FILE duchierouvert. retour : adressereçueenentréesaufencasd'erreur; conditions d'arrêt : rencontrée,lenombrecaractéreluestégalàlatailledubuermoinsun. un ligne est lue (rencontre du retour chariot), la n chier est conditions d'erreur : à la rencontre la n chier, la fonction retourne NULL sitionne les indicateurs associés(voir 16.8). et po- int fputs(const char *, FILE *); synopsis : argument cettefonctionpermetd'écrireune dans le chier décrit par le second chaînecaractèresréférencéeparlepremier argument. argument : les caractères 1. le premier à écrire. argument Cette zone contient doit l'adresse être un chaîne la zone caractères mémoire (terminée qui contient uncaractèrenul).elledoitcontenirunretourchariotpourobtebirunpassageàla par ligne suivante. 2. le second argument contient la référence type FILE les caractères seront écrits. du chier ouvert dans lequel retour : une valeur positive si l'écriture s'est correctement déroulée. conditions d'erreur : en cas d'erreur d'écriture, la fonction retourne EOF indicateurs associés(voir 16.8). et positionne les laligne.deplus,ilfautdonnerlataillecetableaupourquelafonction Pour la lecture ligne à ligne, il est nécessaire donner l'adresse d'un tableau fgets()nedéborpas pouvant contenir du tableau. La fonction fgets() après le rnier caractère qu'elle a lit mis au dans plus n-1 le tableau. caractères La rencontre et elle ajoute du caractère un caractère n nul ('\0') oulanchierprovoquelanlalecture.lecaractèrenlignen'estpasmisdans ligne le tableau avant le caractère nul. La fonction fputs() paruncaractèrenul('\0').ilfautmettreexplicitementlanlignedanscetableaupourqu'elle écrit une ligne dans le chier. Le tableau caractères doit être terminé soit présente dans le chier. la ligne Le programme comman 16.6 et réalise l'écriture la lecture ces du lignes chier sur correspondant le chier standard au nom passé sortie. en Les argument opérations sur sont réalisées ligne par ligne. Les diérences entre gets() et fgets(), d'une part, et puts() peuvent s'expliquer par le fait que les fonctions et fputs(), d'autre part, puts et gets agissent sur les pseudo-chiers stdin et stdout qui sont le plus souvent s terminaux(écran + clavier). Les lafonction diérences sont les suivantes: gets() : 1. ne les nécessite lignes saisies pas seront que lui plus soit courtes fournie que la taille la taille du du tableau tableau. lecture. Comme Il ces faut lignes espérer viennent que a priori d'un terminal, elles font souvent moins 80 caractères.

202 ACCÈS AU CONTENU DU FICHIER Programme 16.6 Lecture ligne à ligne d'un fichier après ouverture 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) 4 { 5 FILE *TheFic; 6 char BigBuf[256]; 7 8 if (argc!= 2) 9 return 1; 10 TheFic = fopen (argv[1], "r"); 11 if (TheFic == NULL) 12 { 13 printf ("Impossible d ouvrir le fichier %s \n", argv[1]); 14 return 2; 15 } 16 while (fgets (BigBuf, sizeof BigBuf, TheFic)!= NULL) 17 fputs (BigBuf, stdout); 18 fclose (TheFic); 19 return 0; 20 } Données en entrée The quick brown fox jumped over the lazy dog, Données écrites sur le fichier standard sortie The quick brown fox jumped over the lazy dog, ne lecaractèrenchaîne. met pas le caractère n ligne dans le tableau. Ce caractère est remplacé par lafonction Ce caractère puts():nenécessitepaslaprésenceducaractèrenlignedansle est ajouté automatiquement lors l'écriture. tableau Accès enregistrement par enregistrement objets L'accès structurés par enregistrement sont le plus souvent permet représentés lire et d'écrire en mémoire s objets par structurés s structures. dans un Pour chier. ce type Ces d'accès, échangées le ne chier sont doit pas être traitées ouvert comme en mo s caractères. binaire(voir le programme 16.7 ligne 13). Les données L'accès par enregistrement se fait grâce aux fonctions: size_t fread(void *Zone, size_t Taille, size_t Nbr, FILE *fp); size_t fwrite(void *Zone, size_t Taille, size_t Nbr, FILE *fp); Ces retournent fonctions le même ont une type interface résultat. homogène. Les arguments Elles acceptent sont les suivants: une liste intique d'arguments, et 1. le duquel premier l'échange argument, avec que le chier nous avons est fait. appelé L'espace Zone, mémoire est l'adresse correspondant l'espace reçoit mémoire les enregistrements à partir que l'espace lus, mémoire ou fournit correspondant les données à à écrire l'adresse dans soit les enregistrements. taille susante Il faut, pour bien supporter entendu, transfert s données, c'est-à-dire d'une taille au moins égale à le (Taille * Nbr).

203 CHAPITRE 16. ENTRÉES-SORTIES DE LA BIBLIOTHÈQUE le nombre uxième d'octets. argument, que nous avons appelé Taille, est la taille d'un enregistrement en 3. le désire troisième échanger. argument, que nous avons appelé Nbr, est le nombre d'enregistrements que l'on 4. lernierargument,quenousavonsappelé fp, estuneréférenceversunestructuretype FILE correspondant à un chier ouvert dans un mo transfert binaire. Ces ux fonctions retournent le nombre d'enregistrements échangés. explique Ces fonctions la présence ont s été ux conçues arguments manière qui à fournissent permettre la l'échange taille totale plusieurs s données structures, à transférer. ce qui la lecture Le programme du contenu 16.7 d'un est chier un exemple, appelé d'utilisation la fonction fread(). Cet exemple réalise FicParcAuto un tableau en mémoire ParcAuto. Les cases du tableau avec sont stockage s structures du contenu contenant ce chier un entier, dans une chaîne vingt caractères et trois chaînes dix caractères. Programme 16.7 Lecture d'enregistrements dans un chier 1 #inclu <stdio.h> 2 #inclu <stdf.h> 3 struct automobile { 4 int age; 5 char couleur[20], numero[10], type[10], marque[10]; 6 } ParcAuto[20]; 7 8 int 9 main (int argc, char *argv[]) { 10 FILE *TheFic; 11 int i; 12 size_t fait; 13 TheFic = fopen ("FicParcAuto", "rb+"); 14 if (TheFic == NULL) 15 { 16 printf ("Impossible d ouvrir le fichier FicParcAuto\n"); 17 return 1; 18 } 19 for (i = 0; i < 20; i++) 20 { 21 fait = fread (&ParcAuto[i], sizeof (struct automobile), 1, TheFic); 22 if (fait!= 1) 23 { 24 printf ("Erreur lecture fichier parcauto \n"); 25 return 2; 26 } 27 } 28 fclose (TheFic); 29 return 0; 30 } Il est possible manr la lecture s vingt enregistrements en une seule opération, en remplaçantleslignes18à24parleslignessuivantes: fait = fread(parcauto,sizeof(struct automobile),20,thefic); if(fait!= 20){

204 ENTRÉE-SORTIESFORMATÉES } printf ("Erreur lecture fichier parcauto \n"); return 2; 16.5 Entrée-sorties formatées Nous avons déjà vu comment utiliser printf() connaissances sur ces fonctions et sur les autres fonctions et scanf(). qui font s Nous conversions allons approfondir format. Les nos fonctions machines que et le nous modèle allons nécessaire étudier à utilisent la vision s humaine(chaîne formats conversion caractères). entre le modèle s données Les leformatscriptionslecturesàfaire; lectures formatées nécessitent: uneadresse 4 pourchaquevariablesimpleoupouruntableaucaractères 5 Les écritures formatées nécessitent:. le les format valeurs s scription variables s simples écritures à écrire. à faire; ensemble caractères est une opération Comme particulière dans qui le peut cas se la faire lecture, à partir l'écriture l'adresse d'un du premier caractère Formats : cas la lecture Les Les formats formats peuvent conversion contenir: servent à décrire les types externes et internes s données à lire. 1. s lorsque caractères s caractères "blancs" blancs(espace, (espace, tabulation). tabulation, La retour présence chariot) d'un sont caractère lus ils sont blanc consommés fait que etmisàlapoubelle; 2. s caractères ordinaires(ni blanc, ni %). Ces caractères vront être rencontrés à lalecture; 3. s spécications conversion, commençant par le caractère %. Une conversion consiste en: 1. un caractère pourcentage(%); 2. uncaractère(optionnel)d'eacement(*);danscecasladonnéelueestmiseàlapoubelle; 3. unchamp(optionnel)dénissantlatailleladonnéeà enbasedix; lireexpriméeparunevaleurentière 4. uncaractère(optionnel)précisiontaillequipeutêtre: l,h surlesmosspécicationlamanièresuivante: ou L.Cescaractèresagissent (a) sileformatinitialestdutype d oui oun,lescaractères l eth que la donnée est du type entier long précisent respectivement (long int) ou entier court (short qu'entier ordinaire(int). int) plutôt (b) sileformatinitialestdutype o oux ouu,lescaractères l eth queladonnéeestdutypeentierlongnonsigné précisent respectivement (unsigned long non signé int)ouentiercourt (unsigned short int) plutôt qu'entier non signé(unsigned int). (c) sileformatinitialestdutype que la donnée est du type nombre eou fou avec g,lescaractères point décimal let gran Lprécisentrespectivement nombre avec point décimal très gran précision double) ou précision(long nombre avec point décimal(float). double) plutôt que du type 4Ce qui explique pourquoi il faut un & vant les noms données à lire quand ces noms ne sont pas s tableaux. 5 Des formats particuliers permettent la lecture plusieurs caractères à l'intérieur d'un tableau caractères.

205 CHAPITRE 16. ENTRÉES-SORTIES DE LA BIBLIOTHÈQUE 191 co conversion réalisée d % entier litun% i entier signé signé exprimé exprimé en en base base décimale o entier non signé exprimé en base décimale u entier non signé exprimé en base octale x entier non signé exprimé en hexadécimal décimale e c f g nombre caractère avec partie décimale en notation point décimal ou exponentielle s mots ou chaîne caractères sans blanc [spécication] p chaîne adresse, pour caractères faire l'opération parmi un inverse alphabet n permet d'obtenir le nombre d'octets lus dans l'écriture cet appel avec%p Tab Co conversion pour scanf() (d) dans tous les autres cas, le comportement est indéni. 5. un co conversion. Les cos conversion pour scanf() sont décrits dans la table La spécicationentrelescrochetsdénitunalphabet6 conforme à cette spécication. La lecture avec un format caractères.ladonnéeluedoitêtre caractères. spécication retourne une chaîne Formats : cas l'écriture Les Les formats formats peuvent conversion contenir: servent à décrire les types externes et internes s données à écrire. 1. s caractères qui sont recopiés dans la chaîne engendrée par l'écriture; 2. et s spécications conversion. Une spécication conversion consiste en: 1. un caractère pourcentage(%); 2. s drapeaux(ags) qui modient la signication la conversion; 3. latailleminimumduchampdanslequelestinséréel'écritureladonnée; (a) la taille est donnée en nombre caractères, (b) pourleschires,silataillecommencepar - ladonnéeestcadréeàgauche. (c) pourunechaînecaractère,silatailleestprécédée0,lachaîneestcadréeàdroite et est précédée zéros; 4. un une point donnée suivi type la entier, précision. ou La le nombre précision dénit chires le après nombre la virgule chires pour signicatifs une donnée pour type ottant. Elle indique le nombre caractères pour une chaîne; 5. un h ouun l ouun L signiantcourtoulongetpermettantpréciser: (a) danslecasd'uneconversiond'unentier(format d, i, o, u, x,ou X) quel'entieràécrire estunentiercourt(h)oulong(l); 6Cet alphabet est déni soit par la liste s caractères signicatifs, soit par le premier caractère suivi d'un tiret et le rnier caractère dans l'ordre croissant la table ASCII. La négation l'alphabet peut être obtenue en mettant un après le crochet ouvrant. Pour que le crochet fermant soit dans l'alphabet, il faut qu'il suive immédiatement le crochet ouvrant.

206 ENTRÉE-SORTIESFORMATÉES co conversion réalisée d % entier écritun% i entier signé signé exprimé exprimé en en base base décimale o entier non signé exprimé en base décimale u entier non signé exprimé en base octale x, X entier non signé exprimé en hexadécimal décimale e, f E nombre nombre avec avec partie partie décimale décimale en en notation notation exponentielle g,g nombreavecpartiedécimale,pluspetitentaillesformatsfoue point décimal c s caractère p chaîne la valeur passée caractères n permet d'obtenir est le une nombre adresse d'octets écrits Tab Cos conversion pour printf() drapeau modication apportée - + la siladonnéeestpositivelesigne+estmis donnée convertie est cadrée à gauche blanc si parunsigne,unblancestajouté le résultat la conversion ne commence pas 0 ' remplissage pour les conversions avec s décimales 0 vant plutot groupement que s s blancs # pourformatoaugmentelaprécisionmanièreàforcerun0vantladonnée chires par 3 pourformatxetxforce0xvantladonnée pourformate,e,f,g,etgforcelepointdécimal pourformatgetgleszérosaprèslepointdécimalsontconservés Tab Modicateurs format pour printf (b) danslecasd'uneconversiond'unnombreavecpartiedécimale(format e, f, g, E,ou G) quelenombreàécrireestunnombreavecpointdécimaltrèsgranprécision(long double). 6. un co conversion. unargumentà[sf]printf.parexempleleslignessuivantesd'appelà Leschampstailleetprécisionpeuventcontenirune *.Danscecaslatailledoitêtrepasséedans printf() sontéquivalentes: printf("valeur l'entier Indice %*d\n",6,indice); printf("valeur l'entier Indice : %6d\n",Indice); Les cos conversion sont décrits dans la table La diérence entre x et X Dans le premier cas, elles sont vient écrites en la minuscule forme d'écriture (a-f), dans s le valeurs second décimales cas, elles entre sont écrites 10 et 15. majuscule (A-F). De même, le caractère en E lesformats la notation exponentielle est mis en minuscule par e et g.ilestmisenmajusculeparlesformats E et G. unappelauxfonctionstype Selon la norme [ISO89], Le nombre maximum caractères qui peuvent être construits dans fprintf() nedoitpasdépasser 509. Les drapeaux sont décrits dans la table 16.3.

207 CHAPITRE 16. ENTRÉES-SORTIES DE LA BIBLIOTHÈQUE Conversion sur les entrée-sorties standards formatées Nous avons qui sont: déjà exploré dans la section les ux fonctions d'entrée-sorties standards int printf(const char *format,...); int scanf(const char *format,...); Conversion en mémoire Les ux fonctions conversion en mémoire s'appellent sprintf les suivants: et sscanf. Les appels sont int sprintf(char *string, const char *format,...); synopsis : conversion données en mémoire par transformation en chaîne caractères. arguments : 1. zone dans laquelle les caractères sont stockés; 2. format d'écriture s données; 3. valeurs s données. retour : nombre caractères stockés. int sscanf(char *string, const char *format,...); synopsis : lecture formatée à partir d'une zone mémoire. arguments : 1. zone dans laquelle les caractères sont acquis; 2. format lecture s données; 3. adresse s variables à aecter à partir s données. retour : nombre variables saisies. conditions d'erreur : la valeur EOF est retournée en cas d'erreur empêchant toute lecture. sprintf() convertit les arguments arg1,..., argn résultat dans suivant le format contrôle et met le string (chaîne caractères). Inversement, sscanf variables suivant le format extrait contrôle. d'une chaîne caractères s valeurs qui sont stockées dans s Conversion dans les chiers Deux fonctions fprintf() et fscanf() permettent réaliser le même travail que printf et scanf() surschiersouvertsenmotexte: int fprintf(file *,const char *,...); synopsis : écriture formatée sur un chier ouvert en mo texte. arguments : 1. référence rangés; vers la structure décrivant le chier ouvert dans lequel les caractères sont 2. format d'écriture s données; 3. valeurs s données. retour : nombre caractères écrits. conditions d'erreur : une valeur négative est retournée en cas d'erreur d'écriture. int fscanf(file *,const char *,...);

208 DÉPLACEMENT DANS LE FICHIER synopsis : lecture formatée dans un chier ouvert en mo texte. arguments : 1. référence lus; vers la structure décrivant le chier ouvert dans lequel les caractères sont 2. format lecture s données; 3. adresse s variables à aecter à partir s données. retour : nombre conversions réussies. conditions d'erreur : la valeur EOF avant la première conversion). est retournée en cas d'erreur (n chier atteinte sateurs)etquiextraitlesdiérentschampsdontlesnumérosd'utilisateuretgroupe,enmettant Le programme 16.8 ouvre le chier /etc/passwd(chier contenant les intications s utili- ces champs numéros suivants dans séparés s variables par le caractère type entier. ux points Rappelons ':'. qu'une ligne ce chier contient les le lemotpasse(crypté)ouun nom l'utilisateur, lesmotspasse, xsilesystèmeutiliseunchierséparé(shadowpourstocker le le numéro numéro d'utilisateur, un champ servant groupe à dans mettre lequel s l'utilisateur informations est complémentaires placé à la connexion, champ peut contenir s caractères blancs); appelé champ GCOS (ce le lechierbinaireexécutableàchargerlorslaconnexion(leplussouventunshell). répertoire connexion l'utilisateur, 16.6 Déplacement dans le chier pointeur Jusqu'à courant maintenant dans le nous chier avons correspondant vu s fonctions (adresse qui modient l'octet dans le manière chier à automatique partir duquel le se connaitre fait la prochaine la valeur opération cette position d'entrée-sortie). courante Nous dans allons le chier voir et les fonctions la modier. qui permettent Ces fonctions associéesàlapositiondanslechiersont: int fseek(file *, long, int); synopsis : change la position courante dans le chier. arguments : 1. référence vers la structure décrivant le chier ouvert; 2. déplacement à l'intérieur du chier en nombre d'octets; 3. point quiselonlanormedoiventêtredéniesdanslechier départ du déplacement. Cet argument peut prendre les valeurs suivantes < stdio.h > danslechier maissontsouvent < unistd.h >surlesmachinestype"unixsystemv": SEEK_SET le déplacement est relatif au début du chier; SEEK_CUR le déplacement est relatif à la position courante; SEEK_END ledéplacementestrelatifàlanduchier; retour : 0encassuccès conditions d'erreur : pas être réalisé. une valeur diérente zéro est retournée si le déplacement ne peut long ftell(file *); synopsis : retourne la valeur la position courante dans le chier. argument : référence vers la structure décrivant le chier ouvert;

209 CHAPITRE 16. ENTRÉES-SORTIES DE LA BIBLIOTHÈQUE 195 retour : 1. surles chier. chiersbinaires :nombre d'octets entrela position couranteetledébutdu 2. sur les chiers texte: une valeur permettant à fseek() courant à l'endroit actuel. repositionner le pointeur conditions d'erreur : la valeur -1L est retournée, et la variable errno est modiée. int fgetpos(file *, fpos_t *); synopsis : acquiert la position courante dans le chier. arguments : 1. référence vers la structure décrivant le chier ouvert; 2. référence type d'une zone permettant conserver la position courante du chier (le fpos_t est souvent un type équivalent du type entier long); retour : 0encassuccès conditions d'erreur : une valeur diérente 0 est retournée, et la variable errno est modiée. int fsetpos(file *, const fpos_t *); synopsis : change la position courante dans le chier. arguments : 1. référence vers la structure décrivant le chier ouvert; 2. référence d'une zone ayant servi à conserver la position courante du chier par un appel précént à fgetpos(); retour : 0encassuccès conditions d'erreur : une valeur diérente 0 est retournée, et la variable errno est modiée. void rewind(file *); synopsis : si la référence vers la structure décrivant le chier ouvert fp fonction est équivalente à (void)fseek(fp,0l,0). est vali cette dication Pour illustrer l'âge le s déplacement voitures dans à l'intérieur le chier d'un chier, nous allons prendre pour exemple la mo- FicParcAuto réalise la modication d'un enregistrement dans un chier en vu procédant précémment. la Le manière programme suivante: illitunenregistrementduchierdansunezoneenmémoire; 2. ilmodielazoneenmémoire; 3. il cet replace enregistrement; le pointeur courant du chier sur le début l'enregistrement pour pouvoir réécrire 4. ilécritlazonemémoiredanslechier. Cette la ligne modication 19 correspond est réalisée à une par lecture le programme d'un enregistrement 16.9 selon les du instructions chier dans C la suivantes: zone mémoire UneAuto du type struct laligne24modielavaleurduchamp automobile. age la ligne 25 modie la position courante du danslastructureenmémoire; l'adress début l'enregistrement qui est chier en mémoire. pour positionner le pointeur courant à laligne28écritdanslechierlecontenulazonemémoire la modication l'enregistrement sur disque. UneAuto.Cetteécritureprovoque Ce même exemple peut aussi être réalisé avec les fonctions fgetpos() et fsetpos() le montre la gure La diérence majeure entre ces ux exemples vient du fait que comme la version le programme conserve l'information permettant repositionner le pointeur dans courant taille d'un dans enregistrement. le chier, alors Les que fonctions dans le programme 16.9 le programme revient en arrière la fgetpos() et fsetpos() déplacements dans un chier avec s tailles d'enregistrement variables. sont plus appropriées pour s

210 GESTION DES TAMPONS 16.7 Gestion s tampons Lesentrée-sortiessontengénéralbuerisées7 (sauf strr). entrée-sortie, Dans le cas la général, taille l'allocation ce tampon est du tampon l'ordre se du fait kilo-octet. manière Il est automatique cependant lors possible la d'associer première un taille buer ce avec tampon un chier par rapport ouvert par aux les écritures fonctions réalisées décrites par ci-après, le programme. pour par Cette exemple association optimiser doit la être l'utilisateur. faite avant Les tout appels échange fonctions dans le chier associées ouvert. à la présence Le buer d'un se trouve buer dans sont: l'espace adressable void setbuf(file *,char *); synopsis : entrée-sorties associe du un chier buer sont à un non chier buerisées ouvert, dans (chaque le cas échange où le donne pointeur lieu est à un NULL, appel les système). arguments : 1. référence vers la structure décrivant le chier ouvert; 2. adresse chier ouvert, d'une zone cette mémoire zone doit stinée avoir une à taille venir prédénie le buer dont d'entrée-sortie la valeur est associé BUFSIZE. au buerisées. Elle peut être égale au pointeur NULL, ce qui rend les entrée-sorties du chier non int setvbuf(file *, char *, int, size_t ); synopsis : contrôle la gestion la buerisation d'un chier ouvert avant son utilisation. arguments : 1. référence vers la structure décrivant le chier ouvert; 2. adresse chier ouvert, d'une zone cette mémoire zone doit stinée avoir à la venir taille donnée le buer en d'entrée-sortie quatrième argument. associé au l'adresse est égale à NULL, la fonction alloue manière automatique un buer Si la taille correspondante. 3. le dans type buerisation, ce paramètre peut prendre les valeurs suivantes dénies < stdio.h >: _IOFBF exemple signiequelesentrée-sortiescechierseronttotalementbuerisées(par les écritures n'auront lieu que lorsque le tampon sera plein). _IOLBF signie que les entrée-sorties seront buerisées ligne par ligne(i.e. cas l'écriture un retour chariot provoque l'appel système). dans le _IONBF les entrée-sorties sur le chier sont non buerisées. 4. lataillelazonemémoire(buer). int fflush(file *); synopsis : vi le buer associé au chier; argument : mo mise-à-jour. référence vers Cette la référence structure peut décrivant être égale le chier à ouvert en mo écriture ou en NULL sur l'ensemble s chiers ouverts en écriture ou en mise-à-jour; auquel cas l'opération porte retour : 0danslecasnormalet EOF encasd'erreur. conditions d'erreur : la fonction retourne EOF si l'écriture physique s'est mal passée. Les entrée-sorties sur les terminaux sont buerisées ligne par ligne. La fonction fflush() permet forcer l'écriture s rnières informations. 7Anglicisme que l'on peut traduire par tamponnées. Prenons le cas s écritures. Elles sont d'abord réalisées dans un espace mémoire local au programme que l'on appelle tampon (buer en anglais). Les caractères sont ensuite transférés au système d'exploitatin en bloc. Ceci permet minimiser les appels au système d'exploitation (car le tampon caractères est dans l'espace mémoire du programme) et en général d'améliorer les performances. Cette gestion tampons intermédiaires peut se traduire par une représentation non exacte l'état du programme par les écritures. En eet, les écritures sont diérées et le tampon d'écriture n'est vidé que lorsqu'une n ligne est transmise.

211 CHAPITRE 16. ENTRÉES-SORTIES DE LA BIBLIOTHÈQUE Gestion s erreurs riables Les sont erreurs associées s fonctions aux erreurs d'entrée-sorties sur chaque peuvent ux d'entrée-sortie. être récupérées Ces variables par le programme. ne sont pas Des directement va- lestesteroulesremettreàzéro. modiables mais elles sont accessibles à travers un ensemble fonctions qui permettent utilisent De plus, une pour variable donner globale plus d'informations type entier appelé sur les errno. causes Cette d'erreur, variable les fonctions est aussi d'entrée-sorties fonctionsbibliothèqueservantàréaliserlesappelssystème.lavaleur utilisée par les errno que lorsqu'une opération a échoué et que l'appel fonction correspondant a retourné n'estsignicative spéciant l'échec. une valeur Les fonctions associées à la gestion s erreurs sont: int ferror(file *); synopsis : moriser Cettefonctionretourneunevaleurdiérentezérosilavariablequisertàmé- précénte. les erreurs sur le chier ouvert correspondant a été aectée lors d'une opération argument : d'erreur est la référence faite. vers la structure décrivant le chier ouvert pour lequel la recherche retour : une valeur diérente zéro si une erreur s'est produite. int feof(file *); synopsis : ouvert correspondant Cettefonctiontestesil'indicateurnchier à la référence en argument. aétépositionnésurlechier argument : chier leréférenceverslastructuredécrivantlechier est désiré. ouvertsurlequelletestn retour : retournevraisilanchierestatteinte. void clearerr(file *); synopsis : correspondant Cette fonction à la référence eace les donnée indicateurs en argument. n chier et d'erreur du chier ouvert argument : eacer les la valeurs référence vers la variable la structure mémorisant décrivant les le chier erreurs ouvert et pour la variable lequel on servant désire mémoriserlarencontrelanchier. à void perror(const char *); synopsis : Cette fonction fait la correspondance entre la valeur contenue dans la variable errno dante. et une chaîne caractères qui explique manière succincte l'erreur correspon- argument : personnaliser Cette fonction le message. accepte un argument du type chaîne caractères qui permet parcours Le programme du chier"ficparcauto" illustre cette gestion avec modication d'erreur, par l'ajout l'âge dans s tests les diérents d'erreur dans champs. l'exemple

212 GESTION DES ERREURS Programme 16.8 Lecture avec format dans un fichier texte 1 #inclu <stdio.h> 2 int 3 main (int argc, char *argv[]) { 4 FILE *pwf; 5 int i, res; 6 char nom[10], passwd[16], gcos[128], rep[255], shell[255]; 7 int uid, gid; 8 9 pwf = fopen ("passwd", "r"); 10 if (pwf == NULL){ 11 printf ("Impossible d ouvrir le fichier %s \n", "/etc/passwd"); 12 return 1; 13 } 14 while (!feof (pwf)){ 15 res = fscanf (pwf, " %[^:]:", nom); 16 if (res!= 1) break; 17 res = fscanf (pwf, "%[^:]:", passwd); 18 if (res!= 1) break; 19 res = fscanf (pwf, "%d:", &uid); 20 if (res!= 1) break; 21 res = fscanf (pwf, "%d:", &gid); 22 if (res!= 1) break; 23 for (i = 0; i < 128; i++){ 24 res = fgetc (pwf); 25 if (res == ':'){ 26 gcos[i] = '\0'; 27 break; 28 } else gcos[i] = res; 29 } 30 res = fscanf (pwf, "%[^:]:", rep); 31 if (res!= 1) break; 32 res = fgetc (pwf); 33 if (res!= '\n'){ 34 ungetc (res, pwf); 35 res = fscanf (pwf, "%s", shell); 36 if (res!= 1) break; 37 } else shell[0] = '\0'; 38 printf ("%s %s %d %d %s %s %s\n", nom, passwd, uid, gid, gcos, 39 rep, shell); 40 } 41 fclose (pwf); 42 return 0; 43 } Données écrites sur le fichier standard sortie root x 0 0 root /root /bin/bash daemon x 1 1 daemon /usr/sbin /bin/sh bin 2 2 bin /bin /bin/sh sys 3 3 sys /v /bin/sh gdm x Gnome Display Manager /var/lib/gdm /bin/false

213 CHAPITRE 16. ENTRÉES-SORTIES DE LA BIBLIOTHÈQUE 199 Programme 16.9 Modications par déplacement dans un chier 1 #inclu <stdio.h> 2 #inclu <stdf.h> 3 struct automobile { 4 int age; 5 char couleur[20], numero[10], type[10], marque[10]; 6 } uneauto; 7 8 int 9 main (int argc, char *argv[]) { 10 FILE *fparc; 11 int i; 12 size_t fait; 13 fparc = fopen ("FicParcAuto", "r+b"); 14 if (fparc == NULL){ 15 printf ("Impossible d ouvrir le fichier FicParcAuto \n"); 16 return 1; 17 } 18 for (i 0; i < 20; i++) { 19 fait = fread (&uneauto, sizeof uneauto, 1, fparc); 20 if (fait!= 1) { 21 printf ("Erreur lecture fichier FicParcAuto \n"); 22 return 2; 23 } 24 uneauto.age++; 25 fait = fseek (fparc, (long) -sizeof uneauto, SEEK_CUR); 26 if (fait!= 0){ 27 printf ("Erreur placement fichier FicParcAuto \n"); 28 return 3; 29 } 30 fait = fwrite (&uneauto, sizeof uneauto, 1, fparc); 31 if (fait!= 1) { 32 printf ("Erreur ecriture fichier FicParcAuto fait = %d \n", fait); 33 return 4; 34 } 35 } 36 fclose (fparc); 37 return 0; 38 }

214 GESTION DES ERREURS Programme Déplacements dans un chier avec fgetpos() 1 #inclu <stdio.h> 2 #inclu <stdf.h> 3 struct automobile { 4 int age; 5 char couleur[20], numero[10], type[10], marque[10]; 6 } parc[20]; 7 8 int 9 main (int argc, char *argv[]) { 10 FILE *fparc; 11 int i; 12 size_t fait; 13 fpos_t curpos; 14 fparc = fopen ("FicParcAuto", "r+b"); 15 if (fparc == NULL){ 16 printf ("Impossible d ouvrir le fichier FicParcAuto \n"); 17 return 1; 18 } 19 for (i 0; i < 20; i++) { 20 fait = fgetpos (fparc, &curpos); 21 if (fait!= 0) { 22 printf ("Erreur acquisition Position \n"); 23 return 2; 24 } 25 fait = fread (&parc[i], sizeof (struct automobile), 1, fparc); 26 if (fait!= 1) { 27 printf ("Erreur lecture fichier FicParcAuto \n"); 28 return 3; 29 } 30 parc[i].age++; 31 fait = fsetpos (fparc, &curpos); 32 if (fait!= 0) { 33 printf ("Erreur restitution Position \n"); 34 return 4; 35 } 36 fait = fwrite (&parc[i], sizeof (struct automobile), 1, fparc); 37 if (fait!= 1) { 38 printf ("Erreur ecriture fichier parcauto fait = %d \n", fait); 39 return 5; 40 } 41 } 42 fclose (fparc); 43 return 0; 44 }

215 CHAPITRE 16. ENTRÉES-SORTIES DE LA BIBLIOTHÈQUE 201 Programme Gestion s cas d'erreurs pendant la manipulation d'un fichier 1 #inclu <stdio.h> 2 #inclu <stdf.h> 3 #inclu <unistd.h> 4 struct automobile { 5 int age; 6 char couleur[20], numero[10], type[10], marque[10]; 7 } parc; 8 9 int 10 main (int argc, char *argv[]) { 11 FILE *fparc; 12 size_t fait; 13 fparc = fopen ("FicParcAuto", "r+b"); 14 if (fparc == NULL) { 15 perror ("Impossible d ouvrir FicParcAuto"); 16 return 1; 17 } 18 while (1){ 19 fait = fread (&parc, sizeof parc, 1, fparc); 20 if (fait!= 1) { 21 if (feof (fparc)) 22 fprintf (strr, "Fin fichier FicParcAuto \n"); 23 else 24 fprintf (strr, "Erreur lecture FicParcAuto\n"); 25 break; 26 } 27 parc.age++; 28 fait = fseek (fparc, (long) -sizeof (parc), SEEK_CUR); 29 if (fait!= 0) { 30 perror ("Erreur placement FicParcAuto"); 31 break; 32 } 33 fait = fwrite (&parc, sizeof parc, 1, fparc); 34 if (fait!= 1) { 35 fprintf (strr, "Erreur ecriture FicParcAuto fait = %d \n", fait); 36 break; 37 } 38 fflush (fparc); 39 } 40 clearerr (fparc); 41 fclose (fparc); 42 return 0; 43 } Données écrites sur le fichier standard d'erreur Fin fichier FicParcAuto

216 GESTION DES ERREURS

217 Chapitre 17 Autres fonctions la bibliothèque 17.1 Fonctions manipulation chaînes caractères La bibliothèque standard fournit s fonctions manipulation chaînes caractères. Il est nécessaire d'inclure le chier < string.h > pour avoir la dénition s fonctions décrites dans les tables 17.1 et Types caractères Il existe s macros expressions dénies dans < ctype.h > changer le type d'un caractère. Ces macros expressions test qui retournent permettent un résultat déterminer non nul ou letestestvrai. si isalpha(c) vrai si c est une lettre(alphabétique). isupper(c) vraisicestunemajuscule(uppercase). islower(c) vraisicestuneminuscule(lowercase). isdigit(c) vraisicestunchire. isspace(c) vraisicestunblanc,interligneoutab. ispunct(c) vrai si est un caractère ponctuation. isalnum(c) vrai si c est alphabétique ou numérique. isprint(c) vraisicestachable040à0176. isgraph(c) vraisicestgraphique041à0176. iscntrl(c) vraisicestl(0177)ouuncaractèrecontrôle(<040). Déclaration Travail Retour char *s1, *s2; int n; char *strcat (s1, s2) ajoute la chaîne s2 rrière s1 pointeur sur s1 char *strncat (s1, s2, n) ajoute au plus n caractères pointeur sur s1 int strcmp (s1, s2) compare s1 et s2 nombre positif, nul, négatif int strncmp (s1, s2, n) compare au plus n caractères s1>s2, s1==s2, s1<s2 char *strcpy (s1, s2) copie s2 dans s1 char *strncpy (s1, s2, n) copie sur au plus n caractères char *s; int strlen (s) taille s Tab Fonctions manipulation simples chaînes caractères

218 QUELQUES FONCTIONS GÉNÉRALES Déclaration Travail Retour char *s1, *s2; int n; int c; char *strchr (s, c) cherche caractère c dans s pointeur sur première occurrence char *strrchr (s, c) im pointeur sur rnière occurrence char *inx(s, c) im que strchr char *rinx(s, c) im que strrchr char *strpbrk (s1, s2) cherche dans s1 1 caractère s2 pointeur sur première occurrence int strspn (s1, s2) 1 quescaractèress2 motifdanss1necontenant longueur er int strcspn (s1, s2) 1 aucun motifdanss1necontenant longueur er caractère s2 Tab Fonctions manipulation motifs dans s chaînes caractères isascii(c) Les macros qui vraisicestascii(<0200). transforment un caractère: toupper(c) retourne le caractère majuscule correspondant c. tolower(c) retourne le caractère minuscule correspondant à c. toascii(c) masque c avec 0x7f Quelques fonctions générales system() Il est possible manr au système l'exécution d'un utilitaire. La fonction system(s) provoque l'exécution l'utilitaire correspondant à la chaîne caractère s. Exemple:system("date"); l'espace Nous avons dynamiquement peu parlé d'implantation par les fonctions données en mémoire. Il est possible gérer une partie calloc() et cfree(). calloc(n, sizeof (objet)) alloue la place pour n la zone. objets et retourne un pointeur sur cfree(p) restituel'espacepointépar p où p aétéobtenuparun calloc() exit() intéressantconsidérerle Bienquen'étantpasuneinstructiondulangagemaisunappelàunefonctiondusystème,ilest exit() land'unefonction;mêmel'appelàlafonction commeuneruptureséquence.l'instructionreturnprovoque fonction exit()provoquelanduprogramme.cette exit() obtenue est retournée peut être au processus aussi associée père. à La une valeur expression. 0 signie Cette que expression le programme est évaluée s'est bien et la passé. valeur qui Prenons est chargée le cas du l'ouvrir programme peut décir 17.1 qui l'arrêt doit du lire programme. un chier. Si Nous ce chier allons est écrire absent, cette la fonction. fonction

219 CHAPITRE 17. AUTRES FONCTIONS DE LA BIBLIOTHÈQUE 205 Programme 17.1 Utilisation l'appel système exit() 1 int 2 ouvre (const char *nom_fichier) 3 { 4 int o; 5 o = open (nom_fichier, 0); 6 if (o == -1) 7 { 8 printf ("impossible d'ouvrir %s\n", nom_fichier); 9 exit (1); 10 } 11 return o; 12 }

220 QUELQUES FONCTIONS GÉNÉRALES

221 GNU Free Documentation License Version 1.1, March 2000 Copyright c 59 Temple Place, 2000 Suite Free 330, Software Boston, MA Foundation, Inc. Everyone is permitted to copy and distribute verbatim USA gingitisnotallowed. copies of this license document, but chan- Preamble in the The sense purpose of freedom of this License : to assure is to everyone make a manual, the eective textbook, freedom or other to copy written and document redistribute free with or without modifying it, either commercially or noncommercially. Secondarily, this License it, preservesfortheauthorandpublisherawaytogetcreditfortheirwork,whilenotbeingconsired responsible for modications ma by others. themselves This License be free is a in kind the same of copyleft, sense. It which complements means that the rivative GNU General works Public of the License, document which must a copyleft license signed for free software. is software We have needs signed free documentation: this License in a free orr program to use should it for manuals come with for manuals free software, providing because the same free freedoms used for any that textual the software work, does. regardless But this of subject License matter is not or limited whether to software it is published manuals; as a it printed can be book. We recommend this License principally for works whose purpose is instruction or reference Applicability and Denitions holr ThisLicenseappliestoanymanualorotherworkthatcontainsanoticeplacedbythecopyright toanysuchmanualorwork.anymemberofthepublicisalicensee,andisaddressedasyou. saying it can be distributed unr the terms of this License. The Document, below, refers of it, A either Modied copied Version verbatim, of the or Document with modications means any and/or work translated containing into the Document another language. or a portion als A exclusively Secondary with Section the relationship is a named of appendix the publishers or a front-matter or authors of section the Document of the Document to the Document's that that overall overall subject.(for subject(or example, to related if matters) the Document and contains is in part nothing a textbook that of could mathematics, fall directly a Secondary within connection Section with may the not subject explain or any with mathematics.) related matters, The or relationship of legal, commercial, could be a philosophical, matter of historical or political position regarding them ethical ċ Christian Bac

222 208 GNU FREE DOCUMENTATION LICENSE those The of Invariant Invariant Sections Sections, are in the certain notice Secondary that says Sections that the whose Document titles are is signated, released unr as being License. this Back-Cover The Cover Texts, Texts in the are notice certain that short says passages that the of Document text that is are released listed, as unr Front-Cover this License. Texts or whose ATransparent specication copyofthedocumentmeansamachine-readablecopy,representedinaformat directly and straightforwardly is available with to the generic general text public, editors whose or(for contents images composed can be viewed of pixels) and generic edited paint input programs to text formatters or (for drawings) or for automatic some wily translation available to a drawing variety of editor, formats and suitable that is for suitable input for text formatters. A copy ma in an otherwise Transparent le format whose markup has been to signed that is not to Transparent thwart or discourage is called subsequent Opaque. modication by rears is not Transparent. A copy Texinfo Examples input of format, suitable LATEX formats input for format, Transparent SGML or copies XML inclu using a plain publicly ASCII available without DTD, markup, standard-conforming simple HTML signed for human modication. Opaque formats inclu and PostScript, cessors, SGML PDF, or proprietary XML for which formats the that DTD can and/or be read processing and edited tools only are by not proprietary generally word available, pro- and the machine-generated HTML produced by some word processors for output purposes only. areneedtohold,legibly,thematerialthislicenserequirestoappearinthetitlepage.forworks The Title Page means, for a printed book, the title page itself, plus such following pages as in prominent formats appearance which do not of have the work's any title title, page preceding as such, the Title beginning Page of means the body the text of the near text. the most 17.5 Verbatim Copying mercially, You may provid copy and that distribute this License, the Document the copyright in any notices, medium, and either the license commercially notice or saying noncom- License applies to the Document are reproduced in all copies, and that you add no other conditions this control whatsoever the reading to or those further of this copying License. of the You copies may you not make use technical or distribute. measures However, to obstruct you may or accept must also compensation follow the conditions in exchange in for section copies. 3. If you distribute a large enough number of copies you display You copies. may also lend copies, unr the same conditions stated above, and you may publicly 17.6 Copying in Quantity license If you notice publish requires printed Cover copies Texts, of the you Document must enclose numbering the copies more in than covers 100, that and carry, the Document's legibly, all these Cover Texts : Front-Cover Texts on the front cover, and Back-Cover clearly Texts and the back cover. Both covers must also clearly and legibly intify you as the publisher of these on copies.thefrontcovermustpresentthefulltitlewithallwordsofthetitleequallyprominentand visible. thecovers,aslongastheypreservethetitleofthedocumentandsatisfytheseconditions,canbe You may add other material on the covers in addition. Copying with changes limited to treated as verbatim copying in other respects. ones Iftherequiredtextsforeithercoveraretoovoluminoustotlegibly,youshouldputtherst pages. listed (as many as t reasonably) on the actual cover, and continue the rest onto adjacent

223 17.7. MODIFICATIONS 209 must If eitherinclu you publish or amachine-readable distribute Opaque Transparentcopy copies of the Document alongwitheachopaquecopy, numbering more than orstate 100, you or with each Opaque copy a publicly-accessible computer-network location containing a complete in Transparent has access to copy download of the anonymously Document, free at no of add charge material, using public-standard which the general network network-using protocols. public use the latter option, you must take reasonably prunt steps, when you begin distribution If you Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the of stated or through location your until agents at least or retailers) one year of after that the edition last to time the you public. distribute an Opaque copy(directly redistributinganylargenumberofcopies,togivethemachancetoproviyouwithanupdated It is requested, but not required, that you contact the authors of the Document well before version of the Document Modications sections You may 2 and copy 3 above, and distribute provid that a Modied you release Version the of Modied the Document Version unr unr the precisely conditions this License, of modication with the of the Modied Modied Version Version lling to the whoever role of possesses the Document, a copy of thus it. licensing In addition, distribution you must and these things in the Modied Version: do UseintheTitlePage(andonthecovers,ifany)atitledistinctfromthatoftheDocument, andfromthoseofpreviousversions(whichshould,iftherewereany,belistedinthehistory section publisher of of the that Document). version gives You permission. may use the same title as a previous version if the original ListontheTitlePage,asauthors,oneormorepersonsorentitiesresponsibleforauthorship of authorsofthedocument(allofitsprincipalauthors,ifithaslessthanve). the modications in the Modied Version, together with at least ve of the principal StateontheTitlepagethenameofthepublisheroftheModiedVersion,asthepublisher. Preserve Add an appropriate all the copyright copyright notices notice of the for Document. notices. your modications adjacent to the other copyright Inclu,immediatelyafterthecopyrightnotices,alicensenoticegivingthepublicpermission to Adndum use the below. Modied Version unr the terms of this License, in the form shown in the Preserve given in the in that Document's license notice license the notice. full lists of Invariant Sections and required Cover Texts Inclu Preserve an the unaltered section entitled copy of this History, License. the title, year, new authors, and publisher and its of the title, Modied and add Version to it an as item given stating on the at Title least Page. year, authors, If there is and no publisher section entitled of the Document History in as the given Document, on its Title create Page, one then stating add the an title, scribing the Modied Version as stated in the previous sentence. item Preserve parent copy the of network the Document, location, if and any, likewise given in the the network Document locations for public given access in the to Document a Trans- for may previous omit a network versions location it was based for a on. work These that may was be published placed at in least the History four years section. before You Document itself, or if the original publisher of the version it refers to gives permission. the In preserveinthesectionallthesubstanceandtoneofeachofthecontributoracknowledgements any section entitled Acknowledgements or Dedications, preserve the section's title, and Preserve and/or dications all the Invariant given therein. titles. Section numbers or the Sections equivalent of the are Document, not consired unaltered part of in the their section text and titles. in their

224 210 GNU FREE DOCUMENTATION LICENSE Delete Modied any Version. section entitled Endorsements. Such a section may not be includ in the DonotretitleanyexistingsectionasEndorsements Section. ortoconictintitlewithanyinvariant condary If the Sections Modied and Version contain inclus no material new front-matter copied from sections the Document, or appendices you may that at qualify your option as Se- signate variant Sections some or in all the of Modied these sections Version's as invariant. license notice. To do These this, add titles their must titles be distinct to the list from of any In- other section titles. of your YoumayaddasectionentitledEndorsements,providitcontainsnothingbutendorsements text has Modied been approved Version by by an various organization parties as for the example, authoritative statements nition of peer of a standard. review or that the 25 words You may as a add Back-Cover a passage Text, of up to to the ve end words of the as a list Front-Cover of Cover Texts Text, in and the a Modied passage of Version. up to OnlyonepassageofFront-CoverTextandoneofBack-CoverTextmaybeaddby(orthrough arrangementsmaby)anyoneentity.ifthedocumentalreadyinclusacovertextforthesame cover, behalfof,youmaynotaddanother;butyoumayreplacetheoldone,onexplicitpermissionfrom previously add by you or by arrangement ma by the same entity you are acting on the previous publisher that add the old one. their The names author(s) for publicity and publisher(s) for or to assert of the or Document imply endorsement do not by this of any License Modied give permission Version. to use 17.8 Combining Documents the You terms may ned combine in section the Document 4 above with for modied other documents versions, released provid unr that this you License, inclu in unr combination all of the Invariant Sections of all of the original documents, unmodied, and the them all as Invariant Sections of your combined work in its license notice. list Sections ThecombinedworkneedonlycontainonecopyofthisLicense,andmultipleinticalInvariant name but may dierent be replaced contents, with make a single the copy. title If of there each are such multiple section Invariant unique by Sections adding with at the the end same it, in parentheses, the name of the original author or publisher of that section if known, or else of unique number. Make the same adjustment to the section titles in the list of Invariant Sections in a the license notice of the combined work. documents, In the combination, forming one you section must entitled combine History; any sections likewise entitled combine History any sections in the various entitled original nowledgements, and any sections entitled Dedications. You must lete all sections entitled Ack- Endorsements Collections of Documents this You License, may make and replace a collection the individual consisting copies of the of Document this License and in other the various documents documents released with unr singlecopythatisincludinthecollection,providthatyoufollowtherulesofthislicensefor a verbatim copying of each of the documents in all other respects. this You License, may extract provid a single you insert document a copy from of this such License a collection, into the and extracted distribute document, it individually and follow unr this License in all other respects regarding verbatim copying of that document.

225 AGGREGATION WITH INDEPENDENT WORKS Aggregation With Inpennt Works cuments A compilation or works, of in the or on Document a volume or of its a rivatives storage or distribution with other separate medium, and does inpennt not as a whole do- count the compilation. as a Modied Such Version a compilation of the Document, is called an provid aggregate, no compilation and this License copyright does is not claimed apply for the other self-contained works thus compiled with the Document, on account of their being thus to compiled, if they are not themselves rivative works of the Document. ifthedocumentislessthanonequarteroftheentireaggregate,thedocument'scovertextsmay IftheCoverTextrequirementofsection3isapplicabletothesecopiesoftheDocument,then be appear placed on on covers covers around that surround the whole only aggregate. the Document within the aggregate. Otherwise they must Translation Document Translation unr is the consired terms of a section kind of 4. modication, Replacing Invariant so you Sections may distribute with translations translations requires of the special Invariant permission Sections in from addition their to copyright the original holrs, versions but of you these may Invariant inclu translations Sections. You of may some inclu or all a License. translation In case of of this a disagreement License provid between that the you translation also inclu and the the original original English English version version of of this this License, the original English version will prevail Termination for You unr may this not License. copy, modify, Any other sublicense, attempt or to distribute copy, modify, the Document sublicense except or distribute as expressly the Document provid is have void, received and will copies, automatically or rights, from terminate you unr your this rights License unr will this not License. have their However, licenses parties terminated who so long as such parties remain in full compliance Future Revisions of This License tationlicensefromtimetotime.suchnewversionswillbesimilarinspirittothepresentversion, The Free Software Foundation may publish new, revised versions of the GNU Free Documen- but may dier in tail to address new problems or concerns. See thataparticularnumberedversionofthislicense"oranylaterversion"appliestoit,youhavethe Each version of the License is given a distinguishing version number. If the Document species option that has of been following published the terms (not and as a conditions draft) by the either Free of Software that specied Foundation. version or If the of any Document later version not specify a version number of this License, you may choose any version ever published (not does a draft) by the Free Software Foundation. as ADDENDUM : How to use this License for your documents To use this License in a document you have written, inclu a copy of the License in the document and put the following copyright and license notices just after the title page:

226 FUTURE REVISIONS OF THIS LICENSE Copyright c modify this document YEAR YOUR unr NAME. the terms Permission of the GNU is granted Free Documentation to copy, distribute License, and/or sion 1.1 or any later version published by the Free Software Foundation; with Ver- Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being the LIST,andwiththeBack-CoverTextsbeingLIST.Acopyofthelicenseisincludin the section entitled GNU Free Documentation License. ones If are you invariant. have no Invariant If you have Sections, no Front-Cover write with Texts, no Invariant write no Sections Front-Cover instead Texts of saying instead which Front-Cover Texts being LIST; likewise for Back-Cover Texts. of examples If your in document parallel unr contains your nontrivial choice of examples free software of program license, co, such we as recommend the GNU General releasing Public these License, to permit their use in free software.

227 Table s programmes exemples 3.1 Exemplechier limits.h 3.2 Exemplechier 16 float.h 3.3 Exemplechier. 17 stdf.h 3.4 Suggestioncorrigéchapitre3exercice Suggestioncorrigéchapitre3exercice1secondchier Suggestioncorrigéchapitre3exercice Suggestioncorrigéchapitre3exercice Suggestioncorrigéchapitre3exercice Lectureetécriturechaînepar scanf()et 26 printf() 4.2 Lecturesmultiplesavec 28 scanf() 4.3 Suggestioncorrigéchapitre4exercice Suggestioncorrigéchapitre4exercice2 Suggestioncorrigéchapitre4exercice Suggestioncorrigéchapitre4exercice Dénitionsvariablesetd'unpointeur Utilisationsopérateursmasquage Utilisationsopérateursdécalage Suggestioncorrigéchapitre5exercice Suggestioncorrigéchapitre5exercice2 Suggestioncorrigéchapitre5exercice Suggestioncorrigéchapitre5exercice Suggestioncorrigéchapitre5exercice Suggestioncorrigéchapitre5exercice Exempletestsimbriqués Exempletablesauts Exempletablesauts Exempletablesauts Lectured'uneligneavec 69 while 6.6 Recopied'unechaîneavecuneboucle while 6.7 Lectured'uneligneavecfor Décompositionspuissancesdixd'unnombreavecun do while 6.9 Utilisationducontinuedansuneboucle 71 for 6.10 Utilisationsrupturesséquencedansuneboucle for 6.11 Lectured'uneligneavec 72 for et break 6.12 Utilisationl'infâme 73 goto 6.13 Utilisationplusieurs.. 74 return 6.14 Suggestioncorrigéchapitre6exercice Suggestioncorrigéchapitre6exercice2 Suggestioncorrigéchapitre6exercice Suggestioncorrigéchapitre6exercice Suggestioncorrigéchapitre6exercice Suggestioncorrigéchapitre6exercice

228 214 TABLE DES PROGRAMMES EXEMPLES Ensembletestsnonstructuré. Ensembletestsstructurénonmisenpage Ensembletestsstructuréetmisenpage Ensembletestsstructuréetmisenpageaveccommentaires Ensembletestsstructuré,misenpageetétiqueté Ensembletestspartablebranchement Boucleréaliséeparstestsetsauts Boucleréaliséeparunfor() Boucleréaliséeparunfor()etmiseenpage Achagesarguments main() 8.2 Arguments main() 8.3 Suggestioncorrigéchapitre8exercice1 caractèresun-à-un Suggestioncorrigéchapitre8exercice2 Suggestioncorrigéchapitre8exercice Exemplesprototypesfonctions Déclarationscandidatesmultipled'unevariable Déclarationexpliciteetdéclarationcandidated'unevariable Suggestioncorrigéchapitre9exercice1fonctions Suggestioncorrigéchapitre9exercice1 122 main() 9.6 Suggestioncorrigéchapitre9exercice2fonctions Suggestioncorrigéchapitre9exercice2 main() 9.8 Suggestioncorrigéchapitre9exercice3chierd'inclusion Suggestioncorrigéchapitre9exercice3 main() 10.1 Dénitiontableauxetinitialisations Accèsàuntableauàuxdimensionsavecunpointeur Algorithmed'untrisimple Suggestioncorrigéchapitre10exercice1chierd'inclusion Suggestioncorrigéchapitre10exercice1fonctions Suggestioncorrigéchapitre10exercice1 139 main 10.7 Suggestioncorrigéchapitre10exercice1fonctiontri Dénitionstructures Dénitionstructures Structuresetlisteschaînées Structuresetchampsbits Suggestioncorrigéchapitre11exercice Suggestioncorrigéchapitre11exercice2 Utilisationd'uneunion Utilisationd'uneunion Suggestioncorrigéchapitre12exercice Suggestioncorrigéchapitre12exercice2 Utilisationd'énumérations Suggestioncorrigéchapitre14exercice Suggestioncorrigéchapitre14exercice2 Suggestioncorrigéchapitre14exercice3chierd'inclusion Suggestioncorrigéchapitre14exercice3fonctions Suggestioncorrigéchapitre14exercice Traitementscommentaires Erreurdueautraitementscommentaires Interprétationsvariablesparlepréprocesseur EvaluationmacrosparCPP Exempled'utilisationdu#if Exemplessélectioncopar 174 #iff 15.7 Sélectioncopar 175 #iff 15.8 Suggestioncorrigéchapitre15exercice1dénitionsmacros imbriqués

229 TABLE DES PROGRAMMES EXEMPLES Suggestioncorrigéchapitre15exercice2 Suggestioncorrigéchapitre15exercice Lectureetécriturecaractèreparcaractèresurleschiersstandards Lectureligneparlignesurleschiersstandards Ouvertured'unchier Ouvertureetfermetured'unchier Lecturecaractèreparcaractèred'unchieraprèsouverture Lectureligneàligned'unchieraprèsouverture Lectured'enregistrementsdansunchier Lectureavecformatdansunchiertexte Modicationspardéplacementdansunchier Déplacementsdansunchieravecfgetpos() 16.11Gestionscasd'erreurspendantlamanipulationd'unchier Utilisationl'appelsystème exit()

230 216 TABLE DES PROGRAMMES EXEMPLES

231 Table s gures 1.1 Structured'unprogrammeC 1.2 Fichiersource Structured'unefonctionC Schémafonctionnement cc Chaînecaractèresconstante ProgrammequiécritBonjour Exemplerelationentrepointeuretvariable Miseenrelationd'unpointeuretd'unevariable Organigrammedu while Organigrammedu for Organigrammedu do while break et continue dansun for break et continue dansun while break et continue dansun do while Structured'unefonction Pileetpassageconstantes Pileetpassagevariables Pileetpassagevariablesavecréférence Arguments main() Dusourceàl'exécutable Survold'unchiersource Exemplevisibilité Visibilitésvariablesentremodules Visibilitésfonctionsentremodules Visibilitésfonctionsdansunmodule Utilisationchierd'inclusion Réductionvisibilité

232 218 TABLE DES FIGURES 9.9 Variableslocalesstatiques Tableaudixentiers Tableaudixentiersinitialisé Adressesdansuntableaudixentiers Tableauàuxdimensions Pointeurettableau Tableaupointeurssursvariablesdansuntableau Accèsàuntableauàuxdimensionsavecunpointeur

233 Liste s tableaux 3.1 Longueurstypesbasesurquelquesmachines Variablesetclassesmémoire Exemplesd'initialisations Exemplesconversionimplicite Conversionsusuelles printf et scanf Exemples printf et scanf Listesopérateursunaires Listesopérateursbinaires Listesopérateursbinairesd'aectation Exemplesd'opérateursbinairesd'aectation Opérateurternaire Précéncesopérateurs Syntaxedu while Comparaisondu for etdu while CetStructuresFondamentales Exemplesdénitionfonctions Exemplesd'appelsfonctions Pointeursetappelsfonctions Conversionstypeun-aire Règlefondamentalevisibilité Additiond'unentieràunpointeur Soustractionuxpointeurs Accèsauxchampsd'unestructure Exemplesd'objetscomplexes

234 220 LISTE DES TABLEAUX 15.1 Utilisationd'uneconstantecompilation Coconversionpour scanf() Cosconversionpour printf() Modicateursformatpourprintf Fonctionsmanipulationsimpleschaînescaractères Fonctionsmanipulationmotifsdansschaînescaractères

235 Bibliographie [BK78] D.M. Ritchie B.W. Kernighan. The C Programming glewood Clis, New Jersey, Mars Language. Prentice Hall Inc., En- [BK88] D.M. Ritchie B.W. Kernighan. The C Programming Language Second Hall Inc., Englewood Clis, New Jersey, Edition. Prentice [Bou78] S. Bourne. The UNIX Shell. Bell System Technical July/August Journal, 57(6) : , [Dax92] P. Dax. Langage C 7eme Edition. Eyrolles, 61, Boulevard Saint-Germain, Paris, [Dij65] E.W. Dijkstra. Programming Consired as a Human Activity. In Proc. IFIP pages , Congress, [Dij68] E.W. Dijkstra. GO TO Statements Consired Harmful. Communications of the 11(3):147148, Mars ACM, [DR78] S.C. Johnson D.M. Ritchie. Portabilty of C Programs and the UNIX Operating System. Bell System Technical Journal, 57(6): , July/August [ISO89] ISO/IEC, editor. Programming Language C. ISO/IEC, [ISO99] ISO/IEC, editor. Programming Language C. ISO/IEC, [SJ78] M.E. Lesk S.C. Johnson. Language Development Tools. Bell System Technical 57(6): , July/August Journal, [Str86] B. Stroustrup. The C++ Programming New Jersey, Language. Prentice Hall Inc., Englewood Clis, [Wir71] N. Wirth. Program Development by Stepwise Renement. Communications of the 14(4):221227, Avril ACM, [Wir74] N. Wirth. On the Composition of Well Structured Programs. ACM Computing 6(4):247259, Decembre Survey,

236 222 INDEX Inx #ne, #else, 165, 165, , 170 chaîne, 2, #endif, #if,165,170, , ,60,65,66,86,103,117,165,168, 3, 7, 10, 14, 15, 21, 23, 28, 29, 31, 179,181183,187191,193,197,203, #iff, #ifnf, 165, 165, 170, 170, 171 #inclu, 165, 166, 171 champ, 9, , 102, , , 190 #unf, 165, champs 192,194,195,197 accola,5,10,21,28,47,85,96,129 char,1,103,132,182,183,187,193,196,197 bit,22,102,145,146 adresse,11,15,19,20,23,24,29,38,39,48, chargeable, 97,99,103,105,106,113,120,129 classe,10,11,17,106,113, , 157, 135, 158, 136, 160, 144, 181, 145, 182, 150, 187, 151, commentaire, 190,193,194, , compilateur, 7, 85, 111, 165, , 13, 5, 79, 1113, 15, 16, 18 aectation, 47,49,57,62,99,114,132,144 3, 15, 17, 19, 20, 29, 37, 43, 44, 105, 27, 28, 40, 41, 46, 60, 65, 84, 130, 106, 132, 111, 133, 113, 136, 114, 144, 116, 149, 117, 150, alias, appel, 7, 13, ,42,43,46,63,65,9597,99,102, 5, 11, 17, 19, 22, 23, 28, 29, 39, compilation,2,5,8,9,18,25,28,84,95,111, 155, 157, , 170, , 114, 117, 118, 120, 165, 166, 103, 121, 157, 105, 158, 106, 160, , 161, 117, 166, ,180182,184,185,188,189, constante, ,102,103,129,130,133,153155, 911, 1315, 17, 22, 37, 40, 59, argument,11,23,27,28,65,97,99,102,103, 197, 204 continue,10,59,62,86, ,170,171, ,111,114117,121,133,136,144, contrôle, 1, 5, 7, 27, 43, 47, 57, 6062, 114, associativité, 145, 46, 168, 47, , conversion,21,22,29,99,102,132,150, ,120,193,196,203 bibliothèque, 197, 3, 203 7, 27, 28, 63, 96, 179, 183, corps,5,23,65,95,96,111,116, binaire,2,5,4042,44,46,47,103,114,145, déclaration, 3, 18, 23, 29, 95, 96, 111, 114 bit,2,3,1113,15,20,22,4044,47,49,102, 170,183,184,188,189,194,195 fault, 119,129,132,135,157,158,160 bloc, 5, 17, 145,146,151,180 dénition, , 47, , 63, 65, 95, 96, 114, 119, 40,43,47,83,95,96,106,111,114, 3, 5, 7, 11, 12, 1521, 23, 28, 38, ,129,131133,143146,149, booléen, boucle, 5, 57, 6064, ,157,158,161,165,168171,179, 66, 8486, 121, 161 double,10,43,65, caractère, 31, 13, 32, 7, 44, 911, 59, 1315, 60, 6266, 1925, 86, 2729, durée 103, 132, 150, 151, 165, 168, , vie,17,18,120 case,46,59,99, , , 196, 197, 203, 204 écrire, 1, 43,44,48,49,62,66,8385,96,102, 3, 12, 15, 23, 24, 27, 29, 31, 32, 37,

237 INDEX , 185, 187, 130, 188, 155, , 158, 161, 195, 180, , instruction,2,5,7,10,20,23,28,29,38,39, écriture, , 2, 28, 29, , 31, 42, 59, 195, 66, , 136, 42,43,47,49,5766,83,84,95,96, édition int,10,41,63,116,117,132,186, ,106,111,168,170,195,204 else,10,57 lien,3,7,8,23,103,114 interface,5,27,28,95,96,102,113,115,119, 188 enchaîneur langage, 13, entier, passe,169,170 41, 5, 812, 16, 23, 27, 29, 37, 40, 1, 3844, 1113, 48, 15, 49, 19, 62, 20, 63, 2225, 66, 85, 29, 31, 97,102,103,111,115117,119,129, 44, 46, 47, 57, 59, 8385, 95, 99,102,103,106,114,129132,135, 97, 130,143145,153,154,160,171,179, 146,149151,153155,157,160,161, lecture,7,15,28,29,31,32,42,46,62,63,66, 182, 185, ,180,185,186,189191,194,195, 83, 85, 121, 135, 158, 165, , entry, lire,2729,32,44,66,121,135,150,171,180, , énumération, étiquette,9,10,65,85 22, 102, local,18,23,114,132, ,188,190,204 exécutable,2,5,8,42,103,114,170,194 long,10,15,22,25,40,114,190,191 exécution,5,11,15,1719,39,40,59,6163, 65, 170, 97, 183, 99, , 105, 119, 120, 132, main, 5, 23, 28, 31, 65, 102, 103, 106, 121, expression,5,7,10,11,2123,3747,49,57, mémoire,1,11,12,15,1720,28,38,42,95, 133, 136, , 154, 155, 65, 157, 96, 102, 165, 106, 168, 130, 169, 133, 97, 179,180,203, , 143, 99, 102, 111, 114, 120, , 189,193,195,196, , 150, 157, 179, 181, 187 extern, externe,3,23,111,190, norme, 13, 115,146,153,170,180,192,194 8, 9, 11, 12, 15, 21, 22, 40, 102, faux,40,57,132 chier,2,3,5,7,8,11,15,16,18,23,27,28, objet, 2, 31, 113,114,116119,121,136,154, , 60, 62, 64, 96, 103, 111, ,143,146,158,160,183,188, 8, 1820, 28, 29, 99, 111, 114, 118, oat, 10, 171, , , 203, 204 octet,13,11,12,14,15,38,40,60,130,145, 204 ottant, fonction, 2325, 3, 5, 7, 31, 911, 32, 161, 1618, 171, 22, 191 opérateur, 179, 12, 180, 16, 186, 20, 29, 189, 32, , 57, 62, 29,31,46,57,60,63,65,86,9597, 23, 27 optimiseur, 66,131,158 5, 7 99,102,103,105,106,111,113121, 132, 160, 161, 133, 165, 135, 168, 136, 171, 144, 172, 145, , paramètre, 5, 95, 97, 99, 102, 103, 105, 106, for,3,10,61 190, , 203, 204 pile,17,97,99,102,103,105,106, , 196 pointeur, format, 7, 185, 9, 28, , 31, 103, 180, 182, 183, 97,99,103,105,106,120,121,129, 1, 11, 1820, 23, 24, 38, 39, 48, ,135,136,145147,158,160, fortran, 10 précénce, 161, 181, , , 204 global,17,20,23,114,120 préprocesseur, 45, 46, 158 goto, 10 printf,28,29,31,66,103,115,182,190,192, , 180 if,10,19,57,158 procédure, initialisation, 120,129,130,132 10, 11, 17, 20, 21, 61, 62, 117, programmation, 179, 182 2, 3, 5, 63, 66, 83, 84, 117, prototype, 3, , 158, 179, 184

238 224 INDEX qualicatif, 11, 12, 15, 18 unsigned, 10 référence, 184, 2, 3, 185, 7, 18, 187, 23, 189, 40, , 116, 168, valeur,2,1114,16,17,1923,25,28,3845, register, relogeable, ,57,5963,65,66,85,96,97, retour, 11, 14, 7 99,102,105,106,113,120,129132, 106,145,171,180185,187,190,193 31, 45, 6366, 9597, 99, 105, 150,153155,168171,180182,185 return,10,65,96,102, variable, 187, 190, , ,32,3745,47,49,57,59,62,65, 3, 5, 7, 912, 1520, 22, 23, 2729, rupture,5,10,62,63,66, , ,117120,130133,135,143 99, 102, 103, 105, 106, 111, scanf,28,29,31,99,115,182,190,191, ,149,150,153155,157,158,165, short,10,41,190 sizeof,10,12,40,132,204 visibilité,3,11,17,18,113,115, , 182, 190, , 197 source, 2, 113,117,118,136,165,168,170 3, 5, 7, 18, 43, 46, 85, 95, 96, 111, void, vrai,40,57,197, static, statique, 120 struct, 10, 18, 19 23, 102, 119, 120 while, 62 structure, 118,120,135,143147,149,150,158, 13, 9, 1921, 47, 8385, 103, 111, 160, , 179, 184, 188, 189, 193 structuré, système, 1, 83, 2, 84, 5, 7, 121, 8, 144, 15, 27, ,85,102,103,121,154,166,170, 28, 41, 42, 60, 171, 196, 197, 179, , 183, 184, 186, 194, table tableau, branchement,58,85 46, 12, 48, 15, 6064, 1825, 66, 28, 84, 29, 37, 86, 41, 96, 44, 99,102,103,120,129133,135,136, 97, 144, 165, 168, 145, 179, 147, 181, 157, 183, 158, , 161, ternaire, test, 5, 4245, 45, 47, 47, ,168,171,197,203 57, 5962, 65, 84, 85, 130, type, 13, 57,60,62,63,65,66,84,85,9597, 5, 7, 923, 2729, 31, 3844, 47, 99,102,103,105,106,111,113120, ,135,143146,149,150, , 170, 157, 171, 158, 179, 160, 180, 161, , 166, , typef, , 203 types prédénis,11,16 unaire, union, 149, 12 UNIX,1,2,5,7,8,27,28,41,42,60,85,103, 150, ,154,166,180,186,194

Support de Cours de Langage C. Christian Bac

Support de Cours de Langage C. Christian Bac Support de Cours de Langage C Christian Bac 15 février 2013 ii Table des matières Avant-propos xi 1 Historique et présentation 1 1.1 Historique........................................... 1 1.2 Présentation

Plus en détail

Programmation Structurée en Langage C

Programmation Structurée en Langage C École Centrale Marseille Programmation Structurée en Langage C Stéphane Derrode Mathématique et Informatique Révision 2.5, 2006. Table des matières 1 En guise d'introduction... 7 1.1 Quelques repères

Plus en détail

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP COURS PROGRAMMATION INITIATION AU LANGAGE C SUR MICROCONTROLEUR PIC page 1 / 7 INITIATION AU LANGAGE C SUR PIC DE MICROSHIP I. Historique du langage C 1972 : naissance du C dans les laboratoires BELL par

Plus en détail

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation impérative et structures de données simples Introduction au langage C Sandrine Blazy - 1ère année 24 octobre 2007 Cours d Algorithmique-Programmation

Plus en détail

UE Programmation Impérative Licence 2ème Année 2014 2015

UE Programmation Impérative Licence 2ème Année 2014 2015 UE Programmation Impérative Licence 2 ème Année 2014 2015 Informations pratiques Équipe Pédagogique Florence Cloppet Neilze Dorta Nicolas Loménie [email protected] 2 Programmation Impérative

Plus en détail

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3. 1. Structure d un programme C Un programme est un ensemble de fonctions. La fonction "main" constitue le point d entrée pour l exécution. Un exemple simple : #include int main() { printf ( this

Plus en détail

Introduction au langage C

Introduction au langage C Introduction au langage C Cours 1: Opérations de base et premier programme Alexis Lechervy Alexis Lechervy (UNICAEN) Introduction au langage C 1 / 23 Les premiers pas Sommaire 1 Les premiers pas 2 Les

Plus en détail

Licence ST Université Claude Bernard Lyon I LIF1 : Algorithmique et Programmation C Bases du langage C 1 Conclusion de la dernière fois Introduction de l algorithmique générale pour permettre de traiter

Plus en détail

UE C avancé cours 1: introduction et révisions

UE C avancé cours 1: introduction et révisions Introduction Types Structures de contrôle Exemple UE C avancé cours 1: introduction et révisions Jean-Lou Desbarbieux et Stéphane Doncieux UMPC 2004/2005 Introduction Types Structures de contrôle Exemple

Plus en détail

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux. UEO11 COURS/TD 1 Contenu du semestre Cours et TDs sont intégrés L objectif de ce cours équivalent a 6h de cours, 10h de TD et 8h de TP est le suivant : - initiation à l algorithmique - notions de bases

Plus en détail

Les chaînes de caractères

Les chaînes de caractères Les chaînes de caractères Dans un programme informatique, les chaînes de caractères servent à stocker les informations non numériques comme par exemple une liste de nom de personne ou des adresses. Il

Plus en détail

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski [email protected]

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski cegielski@u-pec.fr Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski [email protected] Mars 2002 Pour Irène et Marie Legal Notice Copyright c 2002 Patrick Cégielski Université

Plus en détail

Bases de programmation. Cours 5. Structurer les données

Bases de programmation. Cours 5. Structurer les données Bases de programmation. Cours 5. Structurer les données Pierre Boudes 1 er décembre 2014 This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License. Types char et

Plus en détail

Programmation en langage C

Programmation en langage C Programmation en langage C Anne CANTEAUT INRIA - projet CODES B.P. 105 78153 Le Chesnay Cedex [email protected] http://www-rocq.inria.fr/codes/anne.canteaut/cours C 2 Table des matières 3 Table des

Plus en détail

Algorithmique et Programmation, IMA

Algorithmique et Programmation, IMA Algorithmique et Programmation, IMA Cours 2 : C Premier Niveau / Algorithmique Université Lille 1 - Polytech Lille Notations, identificateurs Variables et Types de base Expressions Constantes Instructions

Plus en détail

Le langage C. Introduction, guide de reference

Le langage C. Introduction, guide de reference Le langage C Introduction, guide de reference Ce document est une présentation du langage de programmation C, de sa syntaxe et de ses spécificités. Il est destiné essentiellement à servir de mémo-guide

Plus en détail

Langage C. Patrick Corde. [email protected]. 22 juin 2015. Patrick Corde ( [email protected] ) Langage C 22 juin 2015 1 / 289

Langage C. Patrick Corde. Patrick.Corde@idris.fr. 22 juin 2015. Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin 2015 1 / 289 Langage C Patrick Corde [email protected] 22 juin 2015 Patrick Corde ( [email protected] ) Langage C 22 juin 2015 1 / 289 Table des matières I 1 Présentation du langage C Historique Intérêts

Plus en détail

Conception de circuits numériques et architecture des ordinateurs

Conception de circuits numériques et architecture des ordinateurs Conception de circuits numériques et architecture des ordinateurs Frédéric Pétrot Année universitaire 2014-2015 Structure du cours C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 Codage des nombres en base 2, logique

Plus en détail

Cours Langage C/C++ Programmation modulaire

Cours Langage C/C++ Programmation modulaire Cours Langage C/C++ Programmation modulaire Thierry Vaira BTS IRIS Avignon [email protected] «v0.1 Rappel Programmation modulaire (1/2) Le découpage d'un programme en sous-programmes est appelée programmation

Plus en détail

Rappels Entrées -Sorties

Rappels Entrées -Sorties Fonctions printf et scanf Syntaxe: écriture, organisation Comportement Données hétérogènes? Gestion des erreurs des utilisateurs 17/11/2013 Cours du Langage C [email protected] ibrahimguelzim.atspace.co.uk

Plus en détail

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java Info0101 Intro. à l'algorithmique et à la programmation Cours 3 Le langage Java Pierre Delisle, Cyril Rabat et Christophe Jaillet Université de Reims Champagne-Ardenne Département de Mathématiques et Informatique

Plus en détail

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu. Seance 2: Complétion du code de jeu. (durée max: 2h) Mot clé const et pointeurs: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu. Implémentez jeu_recupere_piece

Plus en détail

SUPPORT DE COURS. Langage C

SUPPORT DE COURS. Langage C Dpt Informatique 2010-2011 SUPPORT DE COURS Langage C Semestre 1 par : «CaDePe» Marie-Françoise Canut Marianne de Michiel André Péninou Table des Matières 1 Généralités...8 1.1 Introduction aux langages

Plus en détail

TP 1 : 1 Calculs en binaire, octal et hexadécimal

TP 1 : 1 Calculs en binaire, octal et hexadécimal Univ. Lille 1 - Licence Informatique 2ème année 2013-14 Objectifs du TP Ce TP a pour but Codage de l'information TP 1 : 1. de découvrir quelques opérations logiques sur les nombres 2. et quelques formats

Plus en détail

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile Dans ce TP, vous apprendrez à définir le type abstrait Pile, à le programmer en Java à l aide d une interface

Plus en détail

Programmation C. Apprendre à développer des programmes simples dans le langage C

Programmation C. Apprendre à développer des programmes simples dans le langage C Programmation C Apprendre à développer des programmes simples dans le langage C Notes de cours sont disponibles sur http://astro.u-strasbg.fr/scyon/stusm (attention les majuscules sont importantes) Modalités

Plus en détail

Télécom Nancy Année 2013-2014

Télécom Nancy Année 2013-2014 Télécom Nancy Année 2013-2014 Rapport 1A Ajout du langage C dans la Programmer's Learning Machine GIANNINI Valentin Loria 615, rue du Jardin Botanique 54600, Villers-Lès-Nancy Maître de stage : QUINSON

Plus en détail

Travaux pratiques. Compression en codage de Huffman. 1.3. Organisation d un projet de programmation

Travaux pratiques. Compression en codage de Huffman. 1.3. Organisation d un projet de programmation Université de Savoie Module ETRS711 Travaux pratiques Compression en codage de Huffman 1. Organisation du projet 1.1. Objectifs Le but de ce projet est d'écrire un programme permettant de compresser des

Plus en détail

IN 102 - Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

IN 102 - Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C IN 102 - Cours 1 Qu on le veuille ou non, les systèmes informatisés sont désormais omniprésents. Même si ne vous destinez pas à l informatique, vous avez de très grandes chances d y être confrontés en

Plus en détail

MICROINFORMATIQUE NOTE D APPLICATION 1 (REV. 2011) ARITHMETIQUE EN ASSEMBLEUR ET EN C

MICROINFORMATIQUE NOTE D APPLICATION 1 (REV. 2011) ARITHMETIQUE EN ASSEMBLEUR ET EN C Haute Ecole d Ingénierie et de Gestion Du Canton du Vaud MICROINFORMATIQUE NOTE D APPLICATION 1 (REV. 2011) ARITHMETIQUE EN ASSEMBLEUR ET EN C Programmation en mode simulation 1. DOCUMENTS DE RÉFÉRENCE...

Plus en détail

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme Rappel Ralf Treinen Université Paris Diderot UFR Informatique Laboratoire Preuves, Programmes et Systèmes [email protected] 6 mai 2015 Jusqu'à maintenant : un petit langage de programmation

Plus en détail

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation : Algorithmique et programmation : STRUCTURES DE DONNÉES A. Structure et enregistrement 1) Définition et rôle des structures de données en programmation 1.1) Définition : En informatique, une structure de

Plus en détail

Généralités sur le Langage Java et éléments syntaxiques.

Généralités sur le Langage Java et éléments syntaxiques. Généralités sur le Langage Java et éléments syntaxiques. Généralités sur le Langage Java et éléments syntaxiques....1 Introduction...1 Genéralité sur le langage Java....1 Syntaxe de base du Langage...

Plus en détail

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

INTRODUCTION A JAVA. Fichier en langage machine Exécutable INTRODUCTION A JAVA JAVA est un langage orienté-objet pur. Il ressemble beaucoup à C++ au niveau de la syntaxe. En revanche, ces deux langages sont très différents dans leur structure (organisation du

Plus en détail

Programmation C. J.-F. Lalande. 15 novembre 2012

Programmation C. J.-F. Lalande. 15 novembre 2012 Programmation C J.-F. Lalande novembre 0 Ce cours est mis à disposition par Jean-François Lalande selon les termes de la licence Creative Commons Attribution - Pas d Utilisation Commerciale - Partage à

Plus en détail

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles [email protected]

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles [email protected] Table des matières 1 Les bases 3 2 Variables et constantes 5 3 Quelques fonctions indispensables

Plus en détail

Annexe : La Programmation Informatique

Annexe : La Programmation Informatique GLOSSAIRE Table des matières La Programmation...2 Les langages de programmation...2 Java...2 La programmation orientée objet...2 Classe et Objet...3 API et Bibliothèque Logicielle...3 Environnement de

Plus en détail

I. Introduction aux fonctions : les fonctions standards

I. Introduction aux fonctions : les fonctions standards Chapitre 3 : Les fonctions en C++ I. Introduction aux fonctions : les fonctions standards A. Notion de Fonction Imaginons que dans un programme, vous ayez besoin de calculer une racine carrée. Rappelons

Plus en détail

Cours Informatique 1. Monsieur SADOUNI Salheddine

Cours Informatique 1. Monsieur SADOUNI Salheddine Cours Informatique 1 Chapitre 2 les Systèmes Informatique Monsieur SADOUNI Salheddine Un Système Informatique lesystème Informatique est composé de deux parties : -le Matériel : constitué de l unité centrale

Plus en détail

Conventions d écriture et outils de mise au point

Conventions d écriture et outils de mise au point Logiciel de base Première année par alternance Responsable : Christophe Rippert [email protected] Introduction Conventions d écriture et outils de mise au point On va utiliser dans cette

Plus en détail

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51 DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51 PLAN DU COURS Introduction au langage C Notions de compilation Variables, types, constantes, tableaux, opérateurs Entrées sorties de base Structures de

Plus en détail

Programmation en C. École Nationale Supérieure de Techniques Avancées. Pierre-Alain Fouque et David Pointcheval

Programmation en C. École Nationale Supérieure de Techniques Avancées. Pierre-Alain Fouque et David Pointcheval École Nationale Supérieure de Techniques Avancées Programmation en C Pierre-Alain Fouque et David Pointcheval E-mail : [email protected] Web : http://www.di.ens.fr/~fouque/ Table des matières

Plus en détail

Initiation à la programmation en Python

Initiation à la programmation en Python I-Conventions Initiation à la programmation en Python Nom : Prénom : Une commande Python sera écrite en caractère gras. Exemples : print 'Bonjour' max=input("nombre maximum autorisé :") Le résultat de

Plus en détail

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie Chapitre I : Les bases du C++ Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie du logiciel, et ce depuis

Plus en détail

Chapitre 1 : La gestion dynamique de la mémoire

Chapitre 1 : La gestion dynamique de la mémoire Chapitre 1 : La gestion dynamique de la mémoire En langage C un programme comporte trois types de données : Statiques; Automatiques ; Dynamiques. Les données statiques occupent un emplacement parfaitement

Plus en détail

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java Langages objets Introduction M2 Pro CCI, Informatique Emmanuel Waller, LRI, Orsay présentation du module logistique 12 blocs de 4h + 1 bloc 2h = 50h 1h15 cours, 45mn exercices table, 2h TD machine page

Plus en détail

Cours d initiation à la programmation en C++ Johann Cuenin

Cours d initiation à la programmation en C++ Johann Cuenin Cours d initiation à la programmation en C++ Johann Cuenin 11 octobre 2014 2 Table des matières 1 Introduction 5 2 Bases de la programmation en C++ 7 3 Les types composés 9 3.1 Les tableaux.............................

Plus en détail

Cours d Algorithmique et de Langage C 2005 - v 3.0

Cours d Algorithmique et de Langage C 2005 - v 3.0 Cours d Algorithmique et de Langage C 2005 - v 3.0 Bob CORDEAU [email protected] Mesures Physiques IUT d Orsay 15 mai 2006 Avant-propos Avant-propos Ce cours en libre accès repose sur trois partis pris

Plus en détail

LES TYPES DE DONNÉES DU LANGAGE PASCAL

LES TYPES DE DONNÉES DU LANGAGE PASCAL LES TYPES DE DONNÉES DU LANGAGE PASCAL 75 LES TYPES DE DONNÉES DU LANGAGE PASCAL CHAPITRE 4 OBJECTIFS PRÉSENTER LES NOTIONS D ÉTIQUETTE, DE CONS- TANTE ET DE IABLE DANS LE CONTEXTE DU LAN- GAGE PASCAL.

Plus en détail

Base de l'informatique. Généralité et Architecture Le système d'exploitation Les logiciels Le réseau et l'extérieur (WEB)

Base de l'informatique. Généralité et Architecture Le système d'exploitation Les logiciels Le réseau et l'extérieur (WEB) Base de l'informatique Généralité et Architecture Le système d'exploitation Les logiciels Le réseau et l'extérieur (WEB) Généralité Comment fonctionne un ordinateur? Nous définirons 3 couches Le matériel

Plus en détail

Introduction à l algorithmique et à la programmation M1102 CM n 3

Introduction à l algorithmique et à la programmation M1102 CM n 3 Introduction à l algorithmique et à la programmation M1102 CM n 3 DUT Informatique 1 re année Eric REMY [email protected] IUT d Aix-Marseille, site d Arles Version du 2 octobre 2013 E. Remy (IUT d

Plus en détail

Chap III : Les tableaux

Chap III : Les tableaux Chap III : Les tableaux Dans cette partie, on va étudier quelques structures de données de base tels que : Les tableaux (vecteur et matrice) Les chaînes de caractères LA STRUCTURE DE TABLEAU Introduction

Plus en détail

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars 2014. http://homepages.laas.fr/matthieu/cours/java/java.pdf

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars 2014. http://homepages.laas.fr/matthieu/cours/java/java.pdf Introduction à Java Matthieu Herrb CNRS-LAAS http://homepages.laas.fr/matthieu/cours/java/java.pdf Mars 2014 Plan 1 Concepts 2 Éléments du langage 3 Classes et objets 4 Packages 2/28 Histoire et motivations

Plus en détail

Informatique Générale

Informatique Générale Informatique Générale Guillaume Hutzler Laboratoire IBISC (Informatique Biologie Intégrative et Systèmes Complexes) [email protected] Cours Dokeos 625 http://www.ens.univ-evry.fr/modx/dokeos.html

Plus en détail

ACTIVITÉ DE PROGRAMMATION

ACTIVITÉ DE PROGRAMMATION ACTIVITÉ DE PROGRAMMATION The purpose of the Implementation Process is to realize a specified system element. ISO/IEC 12207 Sébastien Adam Une introduction 2 Introduction Ø Contenu Utilité de l ordinateur,

Plus en détail

Programmation C++ (débutant)/instructions for, while et do...while

Programmation C++ (débutant)/instructions for, while et do...while Programmation C++ (débutant)/instructions for, while et do...while 1 Programmation C++ (débutant)/instructions for, while et do...while Le cours du chapitre 4 : le for, while et do...while La notion de

Plus en détail

Utilisation d objets : String et ArrayList

Utilisation d objets : String et ArrayList Chapitre 6 Utilisation d objets : String et ArrayList Dans ce chapitre, nous allons aborder l utilisation d objets de deux classes prédéfinies de Java d usage très courant. La première, nous l utilisons

Plus en détail

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère L'héritage et le polymorphisme en Java Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère En java, toutes les classes sont dérivée de la

Plus en détail

Représentation d un entier en base b

Représentation d un entier en base b Représentation d un entier en base b 13 octobre 2012 1 Prérequis Les bases de la programmation en langage sont supposées avoir été travaillées L écriture en base b d un entier est ainsi défini à partir

Plus en détail

Langages et Concepts de Programmation Introduction à la programmation en langage C

Langages et Concepts de Programmation Introduction à la programmation en langage C Langages et Concepts de Programmation Introduction à la programmation en langage C Cours 1A 2013-2014 Jean-Jacques Girardot, Marc Roelens [email protected], [email protected] Septembre 2013 École Nationale

Plus en détail

Le langage C. Séance n 4

Le langage C. Séance n 4 Université Paris-Sud 11 Institut de Formation des Ingénieurs Remise à niveau INFORMATIQUE Année 2007-2008 Travaux pratiques d informatique Le langage C Séance n 4 But : Vous devez maîtriser à la fin de

Plus en détail

Recherche dans un tableau

Recherche dans un tableau Chapitre 3 Recherche dans un tableau 3.1 Introduction 3.1.1 Tranche On appelle tranche de tableau, la donnée d'un tableau t et de deux indices a et b. On note cette tranche t.(a..b). Exemple 3.1 : 3 6

Plus en détail

Compilation (INF 564)

Compilation (INF 564) Présentation du cours Le processeur MIPS Programmation du MIPS 1 Compilation (INF 564) Introduction & architecture MIPS François Pottier 10 décembre 2014 Présentation du cours Le processeur MIPS Programmation

Plus en détail

Algorithme. Table des matières

Algorithme. Table des matières 1 Algorithme Table des matières 1 Codage 2 1.1 Système binaire.............................. 2 1.2 La numérotation de position en base décimale............ 2 1.3 La numérotation de position en base binaire..............

Plus en détail

Programmation système I Les entrées/sorties

Programmation système I Les entrées/sorties Programmation système I Les entrées/sorties DUT 1 re année Université de Marne La vallée Les entrées-sorties : E/O Entrées/Sorties : Opérations d échanges d informations dans un système informatique. Les

Plus en détail

TP 1. Prise en main du langage Python

TP 1. Prise en main du langage Python TP. Prise en main du langage Python Cette année nous travaillerons avec le langage Python version 3. ; nous utiliserons l environnement de développement IDLE. Étape 0. Dans votre espace personnel, créer

Plus en détail

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if Pierre Boudes 28 septembre 2011 This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike

Plus en détail

INITIATION A LA PROGRAMMATION

INITIATION A LA PROGRAMMATION 2004-2005 Université Paris Dauphine IUP Génie Mathématique et Informatique INITIATION A LA PROGRAMMATION PROCEDURALE, A L'ALGORITHMIQUE ET AUX STRUCTURES DE DONNEES PAR LE LANGAGE C Maude Manouvrier La

Plus en détail

L informatique en BCPST

L informatique en BCPST L informatique en BCPST Présentation générale Sylvain Pelletier Septembre 2014 Sylvain Pelletier L informatique en BCPST Septembre 2014 1 / 20 Informatique, algorithmique, programmation Utiliser la rapidité

Plus en détail

Langage Éric Guérin 5 octobre 2010

Langage Éric Guérin 5 octobre 2010 Langage Éric Guérin 5 octobre 2010 Langage C TABLE DES MATIÈRES Table des matières 1 Introduction 7 1.1 Historique........................................... 7 1.2 Architecture matérielle....................................

Plus en détail

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre 2009. [email protected]

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre 2009. Enrica.Duchi@liafa.jussieu.fr . Cours intensif Java 1er cours: de C à Java Septembre 2009 Enrica DUCHI LIAFA, Paris 7 [email protected] LANGAGES DE PROGRAMMATION Pour exécuter un algorithme sur un ordinateur il faut le

Plus en détail

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Structure d un programme et Compilation Notions de classe et d objet Syntaxe Cours1 Structure d un programme et Compilation Notions de classe et d objet Syntaxe POO 1 Programmation Orientée Objet Un ensemble d objet qui communiquent Pourquoi POO Conception abstraction sur les types

Plus en détail

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application Université de Provence Licence Math-Info Première Année V. Phan Luong Algorithmique et Programmation en Python Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application 1 Ordinateur Un

Plus en détail

La mémoire. Un ordinateur. L'octet. Le bit

La mémoire. Un ordinateur. L'octet. Le bit Introduction à l informatique et à la programmation Un ordinateur Un ordinateur est une machine à calculer composée de : un processeur (ou unité centrale) qui effectue les calculs une mémoire qui conserve

Plus en détail

Compléments de documentation Scilab : affichage de texte et formatage de nombres

Compléments de documentation Scilab : affichage de texte et formatage de nombres Université des Sciences et Technologies de Lille U.F.R. de Mathématiques Pures et Appliquées Agrégation externe Année 2002-2003 Compléments de documentation Scilab : affichage de texte et formatage de

Plus en détail

Programmation en langage C d un µcontrôleur PIC à l aide du compilateur C-CCS Sommaire

Programmation en langage C d un µcontrôleur PIC à l aide du compilateur C-CCS Sommaire Programmation en langage C d un µcontrôleur PIC à l aide du compilateur C-CCS CCS Sommaire Généralités sur le langage. 2 Structure d un programme en C.. 3 Les constantes et équivalences.. 4 Les variables...

Plus en détail

Les structures. Chapitre 3

Les structures. Chapitre 3 Chapitre 3 Les structures Nous continuons notre étude des structures de données qui sont prédéfinies dans la plupart des langages informatiques. La structure de tableau permet de regrouper un certain nombre

Plus en détail

Cours Informatique Master STEP

Cours Informatique Master STEP Cours Informatique Master STEP Bases de la programmation: Compilateurs/logiciels Algorithmique et structure d'un programme Programmation en langage structuré (Fortran 90) Variables, expressions, instructions

Plus en détail

Chapitre 2. Classes et objets

Chapitre 2. Classes et objets Chapitre 2: Classes et Objets 1/10 Chapitre 2 Classes et objets Chapitre 2: Classes et Objets 2/10 Approche Orientée Objet Idée de base de A.O.O. repose sur l'observation de la façon dont nous procédons

Plus en détail

Java Licence Professionnelle CISII, 2009-10

Java Licence Professionnelle CISII, 2009-10 Java Licence Professionnelle CISII, 2009-10 Cours 4 : Programmation structurée (c) http://www.loria.fr/~tabbone/cours.html 1 Principe - Les méthodes sont structurées en blocs par les structures de la programmation

Plus en détail

Rappels d architecture

Rappels d architecture Assembleur Rappels d architecture Un ordinateur se compose principalement d un processeur, de mémoire. On y attache ensuite des périphériques, mais ils sont optionnels. données : disque dur, etc entrée

Plus en détail

Claude Delannoy. 3 e édition C++

Claude Delannoy. 3 e édition C++ Claude Delannoy 3 e édition Exercices Exercices C++ en en langage langage delc++ titre 4/07/07 15:19 Page 2 Exercices en langage C++ AUX EDITIONS EYROLLES Du même auteur C. Delannoy. Apprendre le C++.

Plus en détail

Plan du cours. Historique du langage http://www.oracle.com/technetwork/java/index.html. Nouveautés de Java 7

Plan du cours. Historique du langage http://www.oracle.com/technetwork/java/index.html. Nouveautés de Java 7 Université Lumière Lyon 2 Faculté de Sciences Economiques et Gestion KHARKIV National University of Economic Introduction au Langage Java Master Informatique 1 ère année Julien Velcin http://mediamining.univ-lyon2.fr/velcin

Plus en détail

COMPARAISONDESLANGAGESC, C++, JAVA ET

COMPARAISONDESLANGAGESC, C++, JAVA ET REPUBLIQUE DU BENIN *******@******* MINISTERE DE L ENSEIGNEMENT SUPERIEUR ET DE LA RECHERCHE SCIENTIFIQUE(MESRS) *******@******* UNIVERSITE D ABOMEY CALAVI(UAC) *******@******* ECOLE POLYTECHNIQUE D ABPOMEY

Plus en détail

Langage Java. Classe de première SI

Langage Java. Classe de première SI Langage Java Table des matières 1. Premiers pas...2 1.1. Introduction...2 1.2. Mon premier programme...2 1.3. Les commentaires...2 2. Les variables et les opérateurs...2 3. La classe Scanner...3 4. Les

Plus en détail

Cours de programmation avancée. Le langage C. Université du Luxembourg 2005 2006

Cours de programmation avancée. Le langage C. Université du Luxembourg 2005 2006 Université du Luxembourg 2005 2006 Cours de programmation avancée. Le langage C Sébastien Varrette Version : 0.4 Nicolas Bernard 2 Table des matières

Plus en détail

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février 2014 17:30 à 20:30

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février 2014 17:30 à 20:30 Examen intra 20 février 2014 17:30 à 20:30 Nom, prénom : Code permanent : Répondez directement sur le questionnaire. Question #1 5% Quelle influence peut avoir le typage dynamique sur la maintenabilité

Plus en détail

REPUBLIQUE ALGERIENNE DEMOCRATIQUE ET POPULAIRE UNIVERSITE M HAMED BOGARA DE BOUMERDES

REPUBLIQUE ALGERIENNE DEMOCRATIQUE ET POPULAIRE UNIVERSITE M HAMED BOGARA DE BOUMERDES REPUBLIQUE ALGERIENNE DEMOCRATIQUE ET POPULAIRE MINISTERE DE L ENSEIGNEMENT SUPERIEUR ET DE LA RECHERCHE SCIENTIFIQUE UNIVERSITE M HAMED BOGARA DE BOUMERDES FACULTE DES SCIENCES - DEPARTEMENT PHYSIQUE

Plus en détail

Éléments d'architecture des ordinateurs

Éléments d'architecture des ordinateurs Chapitre 1 Éléments d'architecture des ordinateurs Machines take me by surprise with great frequency. Alan Turing 1.1 Le Hardware Avant d'attaquer la programmation, il est bon d'avoir quelques connaissances

Plus en détail

COURS DE LANGAGE C. DIAO Oumar. [email protected]. Université de Rennes 1. Master 1

COURS DE LANGAGE C. DIAO Oumar. oumar.diao@univ-rennes1.fr. Université de Rennes 1. Master 1 COURS DE LANGAGE C DIAO Oumar [email protected] Université de Rennes 1 Master 1 théorie de l'information & cryptographie analyse numérique & modélisation Année universitaire 20112012 1 Table des

Plus en détail

BTS IRIS Cours et Travaux Pratiques. Programmation C. A. Lebret, TSIRIS, Lycée Diderot, 1995/06. en conformité avec le référentiel du BTS IRIS

BTS IRIS Cours et Travaux Pratiques. Programmation C. A. Lebret, TSIRIS, Lycée Diderot, 1995/06. en conformité avec le référentiel du BTS IRIS BTS IRIS Cours et Travaux Pratiques Programmation C A. Lebret, TSIRIS, Lycée Diderot, 1995/06 en conformité avec le référentiel du BTS IRIS Activité Codage et Réalisation Tâches T3.3, T3.4 et T3.5 Temps

Plus en détail

length : A N add : Z Z Z (n 1, n 2 ) n 1 + n 2

length : A N add : Z Z Z (n 1, n 2 ) n 1 + n 2 1 Univ. Lille1 - Licence info 3ème année 2013-2014 Expression Logique et Fonctionnelle... Évidemment Cours n o 1 : Introduction à la programmation fonctionnelle 1 Introduction La programmation fonctionnelle

Plus en détail

CRÉER UNE BASE DE DONNÉES AVEC OPEN OFFICE BASE

CRÉER UNE BASE DE DONNÉES AVEC OPEN OFFICE BASE CRÉER UNE BASE DE DONNÉES AVEC OPEN OFFICE BASE 2 ème partie : REQUÊTES Sommaire 1. Les REQUÊTES...2 1.1 Créer une requête simple...2 1.1.1 Requête de création de listage ouvrages...2 1.1.2 Procédure de

Plus en détail

Partie 1. Professeur : Haouati Abdelali. CPGE Lycée Omar Ibn Lkhattab - Meknès www.haouati.com [email protected]

Partie 1. Professeur : Haouati Abdelali. CPGE Lycée Omar Ibn Lkhattab - Meknès www.haouati.com haouaticpge@gmail.com Partie 1 Professeur : Haouati Abdelali CPGE Lycée Omar Ibn Lkhattab - Meknès www.haouati.com [email protected] Partie I : Généralités et algorithmique de base 1. Environnement matériel et logiciel

Plus en détail

Programmer en JAVA. par Tama ([email protected]( [email protected])

Programmer en JAVA. par Tama (tama@via.ecp.fr( tama@via.ecp.fr) Programmer en JAVA par Tama ([email protected]( [email protected]) Plan 1. Présentation de Java 2. Les bases du langage 3. Concepts avancés 4. Documentation 5. Index des mots-clés 6. Les erreurs fréquentes

Plus en détail

Permis de conduire info

Permis de conduire info Permis de conduire info Questions théoriques DB - 6 octobre 2014 1 Module(s) 1 1. M1.- L'affirmation suivante est-elle vraie ou fausse? "Un ordinateur ne manipule que des données binaires. Il ne comprend

Plus en détail

Algorithmique & Langage C IUT GEII S1. Notes de cours (première partie) cours_algo_lgc1.17.odp. Licence

Algorithmique & Langage C IUT GEII S1. Notes de cours (première partie) cours_algo_lgc1.17.odp. Licence Licence Algorithmique & Langage C Paternité - Pas d'utilisation Commerciale Partage des Conditions Initiales à l'identique 2.0 France Vous êtes libres : * de reproduire, distribuer et communiquer cette

Plus en détail

SYSTÈME DE GESTION DE FICHIERS

SYSTÈME DE GESTION DE FICHIERS SYSTÈME DE GESTION DE FICHIERS - DISQUE 1 Les couches logiciels réponse requête Requêtes E/S Système E/S Pilote E/S Interruptions utilisateur traitement S.E. commandes S.E. S.E. matériel Contrôleur E/S

Plus en détail

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions Cours d introduction à l informatique Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions Qu est-ce qu un Une recette de cuisine algorithme? Protocole expérimental

Plus en détail

Programmation en Java IUT GEII (MC-II1) 1

Programmation en Java IUT GEII (MC-II1) 1 Programmation en Java IUT GEII (MC-II1) 1 Christophe BLANC - Paul CHECCHIN IUT Montluçon Université Blaise Pascal Novembre 2009 Christophe BLANC - Paul CHECCHIN Programmation en Java IUT GEII (MC-II1)

Plus en détail