You are on page 1of 60
Faculté des Sciences Langage C Me + main() précise que ce qui suit est le programme principal. + Test délimité par les accolades 'f’ et '?" + Dans cet exemple nous avons une seule instruction pringf(. + Le point-virgule qui termine cette instruction est obligat * Toute instruction simple est sumvie d'un point-virgule id ‘bonjour Fee Me we tout le monde Fe dO i * Cette fois le programme p: ‘ipal comporte 2 instructions: la notati «La premiére iastex contient n ‘ia’ : st le caractére de fin de ligne I pro siivante. voque un passage @ la ligne ‘cit une notation de dits: caractéres de controle © pré @ type pour différents caractére! + La premigre instruction est une déc variable nommée n est de type int (ex ation, Elle précise que ta ier). 4 a Présentation intuitive du langage C 4—Le type caractére et le code format %c ra m f oe a feet ee i able de type char (caractér Declaration que x est une v +La notation ‘e' dé: ctere (me pas afondre avec "e contenant qu'nn seul de caractéres pelle mat %c affiche une valeur de type caractére q Présentation intuitive du langage C 5 — Afficher un seul caractére: putchar() + Linstmmction putchar(x); demande dafficher la valeur du contenu dev * Ce programme ne fonctionne pas ive de Ia faire précéder il est néces: ps «putchar() est une m instruction qui doit étre incorporée ant compilation ne directive #inelude cro- am code source av *Liinstruction #inelude demande d'insérer le contean du fichier stdio.h au programme Coa eee + getchar() est de aucun argument ume macro mais me poss pemmetient de re it une ae variable + getchar fournit une vale Cest cette valeur qui est affectée ala v Les parenthés tre que getchar fonction et pa: fn retour: le caractére ty au cl: ible ¢ Présentation intuitive du langage C 7 — Lecture d'information au clavier pee Pert) et Pntet ent et Be] printf ("dormex deux nombres: "); [ij leur some ext 23 er ed Tee ied Ei éde en argument un format sous spond a deux des variables + Comme prinf scanf p forme de chaine de caractére "Yad%ed” q1 et une liste indiqua ade valeurs en veut récupérer ces valeurs. + & est un opérateur Présentation intuitive du langage C § — faire des boucles... eee esis ee) eT Ted Fa eee) pe aed PM Eee ae erred Ce Te ee ees) red La répétition est réalisée par for (1-1; i< ensemble d'instructions délimité par {}que l'on nomme bloc “Ce qui sigmifie: répéter le bloc dinstructions qhi suit en respectant les consignes suivantes: i++) suivie par un Présentation intuitive du langage C §—faire des boucles...consignes ote Rear im alee Bonjour aren Pe er ee ey ee pring (“je vais vous caleuler 3 carrés\n"); | som carré est 9 rs aay, Cee eed ee i ee ers Be ie Ce Er a De Te a to ral } Cre ve nowvelle exécution tester la condition i<=3. Si oui at lebloc exeécuter le bk Ala fin de chaque execution du bloc, réaliser >> inon passer a l'instructioz Présentation intuitive du langage C 9— La directive #define «Dans cet exemple on a fait apparaitre la constante 3 4 deux reprises. Cette maniére de faire ne facilite pas les eg oe Pr ee modifications dans un id", de). programme... Ce ae fagon classique fe teed daméliorer la situation F comsiste a placer cette valeur dans une variable ne: pe eS Fe Re ee a Présentation intuitive du langage C 9— La directive #define Pe tye Cale; "je vais vous calculer 2 ry A +Le programme devient Pet es - Senta ———~ Présentation intuitive du langage C 9 —La directive ¢define + La directive #define NC 3 permet de — remplacer partout of il appa par 3 (sauf dans les de caractéres) Se ae ed Avantage éviter la modification imvol: de la valeur NC- NC=NC+1 deviendrai 3=3+1 et pro exren: yuerai une Présentation intuitive du langage C 10 — faire des choi: fe ied eee ee if(!=0) 3 Ce Mew } + if réalise un choix basé sur la condition b exécute le bloc sinon on exécute l'instructi: si elle est vrai on itée aprés elle. “Un programme est une suite d'imstructions a destination d'une machine. * Pour qu'une machine pnisse exécuter un programme. il faut que celui-ci soit en langage machine qni se compose de deux symboles le O et le 1 = Pour créer des programmes il faut piogrammer... c'est-a- dire écrire une suite d'instructions a destination de la machine. + Il existe de nombreux langage de programmation comme fe BASIC. le FORTRAN. le Pascal. Je C ... Ils servent a rendre humainement possible l'écriture de programmes «Le programmeur écrit des imstructions proches du langage humain et 4 aide d'un interpréteur ou d'un compilateur. ce code est traduit en langage machine. is Haut niveau Langage humain Langage de programmation haut niveau Langage assembleur Bas niveau Langage machine - Un programme écrit dans un langage de haut miveau est un fichier texte comportant de: instructions et des mots clés proches dn langaze humain: fichier source - * Pour étre execute. un programme écrit dans un langage de haut niveau doit étre interprété on compile. + Il existe différents interpréteurs et compilatenrs pour chaque langage selon la plateforme et le systéme d’exploitation. -Le résultat de Ja compilation est le "module objet". U est rangé dans un fichier ayant l'extension obj w ~Caractéristiques: *Modulaire: Permet de découper une application en modules qui peuvent étre compiles séparément *Structuré: Traite les taches en les mettant dans des blocs. *Efficace: Posséde de grandes possibilités de comtréle de la machine et génére un code compact et rapide. Portable: Permet d'utiliser le méme code source sur d'autres type de machines simplement en le recompilant +Extensible: Animé par des bibliothéques de fonctions qui enrichissent le langage. -Souple et permissif: Honus la syntaxe. peu de verifications et dinterdits ce qni peut poser des problemes ... 8 Historique + C a été créer en 1972 dans les ‘Bell Laboratories! par Dennis M. Ritchie En 1978 publication de ‘The C Programming Language! par Brian W. Kermighaa et Dennis M, Ritchie +En 1983. ANSI commence le processus de normalisation du langage C. Le résultat était le standard ANSI-C + En 1988: deuxime édition du livre ‘The C Programming Language’. qui respecte le standard ANSI-C. Elle est deveaue la référence des programmers en C. Création d'un Programme: lassiquement 3 étapes: + L’édition: Saisie et modification du texte du programme +La compilation: Traduire en langage machine le texte constituant le programme, le module objer est rangé dans un fichier ayant extension obj. + L'édition de liens: incorporation des modules objets par simple recopie de fichiers obj ou recherche dans un fichier lib qui regroupe plusieurs modules objets. Le résuitat de U'édition des liens est un "exéeutable". Il est rangé dans un fichier dextension exe 2 Création d'un Programme: Pour obtenir un executable 11 faut réussir successivement 1. da saisie les instructions des différents modules . 2. la compilation de tous les modules faisant partie du programme... 3. Le lien des différents modules objets pour obtenir l'executable. Création d'un Programme: On a deux possibilités: 1. Soit on récupére chacun de ces trois programmes séparément. C'est la méthode Ia plus compliquée mais elle fonctionne 2. Sort on utilise un programme "trois-en-un" qui combine léditenr de texte. le compilateur et l'éditeur des liens. Ces programmes sont appelés "Environnements de Développement Intésré" ou IDE Les Environnements de Développement Intégré (IDE) pemmeitent de mettre en ceuvre les étapes de développement dun programme: édition, compilation. édition des liens. exécution, gestion de projets. mise au poimt..) + Iexiste plusieurs IDE disponibles gratuitement. *Les IDE vous permettent de programmer sans probléme: Certains sont plus complets au niveau des options. d'autres un peu plu juitifs a utiliser. mais dans tous les cas i proprammes que vous créerez seront les mémes quel que soit TIDE qe vous wtilisez. Exemples d'Envirounements de Développement Intégré: + Qt Creator www.gt.io/download! www.codeblocks.or * Microsoft Visual Studio = www.viswalstudio.com/ *Gee gcc.gnt.org! 2 ‘Un programme © est composé de: * Directives du préprocesseur + Déclarations et définitions + Fonctions * Des commentaires Eo Directives du préprocesseur: «le texte du Elles permettent d'effectner des manipulation: programme source avant la compilation «inclusion de fichiers * substitutions * macros * compilation conditionnelle Une directive du préprocesseur est une ligne de programme source commengant par le caractére diése '#. Le préprocessenr est appelé automatiquement. en tout premier. par la commande le compilateur Déclarations et définitions: eLa déclaration dun objet donne simplement caractéristiques au compilateur La définition d'un objet declare cet objet et réserve effectivement l'espace memoire pour cet objet *Ce sont des sous-programmes dont les instructions ssent un traitement sur des variables. Un programme est composé d'une on plusieurs fonctions dont une doit s'appeler main, stockées dans un ou plusienrs fichiers. *Une fonction est constituee de: = entéte : type et identifiant de la fonction suiv liste d'arguments entre parenthéses Pune * instruction composeée constituant le corps de la fonction. a Commentaires: “Ce sont des fextes explicatifs destimé: aux lecteurs du programme et éliminés par le préprocesseur. Ils sont formés de caractéres quelconques placés entre les symboles /* et */ «Tis ne doivent pas étre imbriqués et peuvent apparaitre en tout point d'un programme. * programme de calcul de racines carrées */ * commentaire s‘étendant * * sur plusieurs lignes * * duprogramma source = * * /* Commantaire fantaisiste &g#{<>]? 96!!!" @ * == + + Pour ignorer une partie de programme il est préférable d'utiliser nae directive du préprocesseur #if () .. Fendi a "Hinclude Adefine PI 314159 main() float rayon, surface; fleat calcul(fleat rayon); ‘printf"Rayon = ? "), ‘scanff"'%6f", &rayon): surface = caleul(rayon): printf"Surface = %fin". surface); t float caleul (float r) f float a; a= Pl *r *r; return(a); Directives de compilation Programme principal Debut bioc Declarations Appel fonction écrire Appel fonction lize Appel fonction calcul Appel fonction écrire Fin de bloc Définition fonction Declarations locale affectation Retour de la fonctiog Regles générales d'écriture en C Les identifiants: + Les identifiants sont les noms des objets (fonctions. variables. constantes, ...). ce sout des suites de lettres et ou de chifires. +Le premier caractée est obligatoirement une lettre. Le caractére sonligné '_' est considéré comme une lettre. + L'ensemble des symboles utilisables est done: O, 1, 25 sng 9y Ay By sony Zy 9 y By on + Le C distingue les minuscules des majuscules. Exemple : var Var VaR VAR sont des identifiants valides et tons differents. * La longueur des identifiants n'est pas limitée_ mais C Aistingie seulement les 31 premiers caractéres Les identifiants: Exemples Identifiants corrects Identifiants incorrects nomi inom nom_2 nom,.2 _hom_3 =nom-3, Nom_de_varlable Nom de warlable detixieme_choix deuxigme_choix mot_francais mot_frangais “Les mots clés: Ce sont des mots réservés par le langage C et qui ne peuvent pas étre affectés a de identifiants enum extern a Tet | tee at oie ___ seta __ sizeat_| struct ‘switch Instructions: Une instruction est instruction simple. * soit instruction composée ou bloc: Une instruction simple est: soit une instruction de contréle soit une expression suivie de "y" Une instruction composée * une accolade ouvrante " «ume liste de definitions locales an bloc (optionnelle) * une suite instructions une accolade fermante "}" bloc est: Les s€parateurs: + Denx identifiants successify, entre lesquels il n'y a aucun opérateur. doivent étre séparés par un espace ou une fin de ligne. On doit éerire int sy etnoa ints Mais on pent écrire indifféremment: int n. compte.total_p Ou plus clairement: int n, compte. total. p Le format libre: + Le langage C antorise une "mise en page" libre. + Les fing de Hgne ne joue pas de réle particulier si ce n'est celui de séparateur * Une imstruction peut s'etendre sur plusieurs lignes et une ligne peut contenir plnsienrs instructions + Cette liberte peut aboutir. si on ne fait pas attention. a des programmes peu lisibles: Respecter un certain nombres de régles de présentation : + Ne pas placer plusieurs instructions sur une méme ligne. + Utiliser des identifiants significatifs. + Réserver les identifiants en majuscules pour le préprocesseur. « Faire ressortir la structure syutaxique du programme. +Mettre une ligne entre les déclarations et les instructions = Une accolade fermante est senile sur une ligne et fait référence. par sa position horizontale. au début du bloc qu'elle ferme. + Aerer les lignes de programme en entourant par exemple les opérateurs avec des espaces. + Commenter les listings mais éviter les commentaires tritiaux Justification de la notion de type: Tonte information quelle que soit sa nature est codée sous forme binaire. Tl ne suffit pas de connaitre le contenu dune zone pour luni attribuer une signification. En C. ume variable se caractérise 4 partir de son hpe La motion de type sert a: = définir le domaine de valeurs (taille en mémoire et représentation machine) + définir les opérations possibles sur cette variable Tepes de base Ce sont les types prédéfinis. Ils sont au nombre de six void : c'est le type vide. Il est surtout ui fonctions sams argument on sans retour. lisé pour préciser les int - c'est le type entier. Il se décline avec des qualificatifs pour préciser sa taille (long ou short). et le fait qu il soit que positif (unsigned) ou positif et négatif (signed). Par défaut signed est appliqué char : ce type représente un entier sur huit bits. C'est le support des caractéres codés en ASCIL. Comme le type int le type char peut étre qualifié de signed ou unsigned. ™ Types de base 2/2: Sloat : ce type sert pour les calculs avec des parties décimales. double : c'est un type qui permet de représenter des valeurs ayant une partie décimale avec une plus grande précision que le type float. ce type est le plus courant pour représenter des valeurs avec parties décimales long double: ce type permet de representer des mombres avec parties décimales qui nécessitent une trés grande précision. > Remarque: In pas de type booléen ! ‘Remarques Avant de pouvoir declarer nne variable numérique. nous devons nous intéresser 4 deux caractéristiqnes de son type: danissibles ® Toccupation mémoire nécessaire "Tocoupation mémoire qu’occupent les différents types dépend de la machine sur laquelle est implanté le compilateur mLes fichiers den-téte limits.h et float. contiennent des constantes symboliques qui précisent les tailles et les valeurs limites des entiers et des flottants. "Les tableaux suivants donnent une idée de la taille meninite sur une machine 32 Bits - Sion ajowe le préfixe unsigned les domaines des variables sont déeplacés comme suit ‘Types décimaux: ® Le type long double est récent et permet de représenter des nombres avec parties. décimales sur une trés grande précision, sila machine le permet Déclaration de variables de type simple: ,,...,; Exemples: int compteur, X, ¥,q_livree; float lauteur, largenr; double masse_atourique; char touche; * Jnitialisation de variables: + C'est affectation d une valeur lors de la déclaration. sll suffit de fawe suivre la définition du signe = et de la valeur que l'on veut voir attribuée a la variable. int compteur = 9, X,Y, q_ livree = 0; float hautenr = 2.5, largeur = 1.2; double masse_atomique; char touche ='c'; *On ntilise I'attribut const pour indiquer que la valeur d'une variable ne change pas au cours d'un programme: constint MAX = 767; const double e =2.71828182845905; const char NEWLINE = ‘in‘; is Chaque constante a une valeur et un type Les constantes et les expressions constantes sont évaluées ala compilation Llexpression 1 + 2 ° 3 est traduite comme l'expression entigre 7 Les constantes enti¢res peuvent étre exprimées sous les formes: * Décimale- 1234 * Octale O77 * Hexadécimale : OxiBf OXFla L’entier top grand pow un int est cousidéré comme du type long (On peut mposer 4 me constante entiére d'étre du type - + long: 1231 123L * unsigned 3456U * unsigned long 78UL s ‘Chaque constante a une valeur et un type Les constantes réelles sont. par défaut. de type double + Elles peuvent étre exprimées sons les formes Décimale: 1234.56 4 ~3456 ou Scientifique: 123-12 12.3456E4 anclure un suffixe ¢ * Elles peuvent an: Jou F impose le type float a la constante: Exemple - 1.23f Tou L ; impose le type long double Exemple : 123 4567E45L ‘Chaque constante a une valeur et un type Les Constantes caractéres sont écrites entre apostrophes. + Elles penvent étre exprimées sous les formes snivantes Normale : ' Octale \007" Hexadécimale: ‘xb! On yunbolique : saut de ligne (LF) bip tabulation horizontale retour arriere ispose d'un grand nombre d’opérateurs: * Opérateurs classiques (arithmeétique. relationnels. logique) * Opérateurs originaux d'affectation et d'incrémentation *Opérateurs moins classiques (manipulation de bits) ¥ In'existe pas d'opérateur d'élévation a la puissance | > Les opérateurs binaire ne sont définis que lorsque leurs denx opérandes sont du méme type } On pent écrire des expressions mixtes dans lesquelles interviennent des opérandes de types différents. L'évaluation de expression nécessite dans ce cas une conversion d'ajustement de type > La conversion d'ajustement de type suit une hiérarchie qui permet de ne pas altérer la valeur initiale: int +tlong float + double +iong double » Pour le type char, toute valeur apparaissant dans une expression est d'abord convertie en int a Priorités relatives des opérateurs arithmétiques: + Llopérateur unaire — a la plus grande priorité + On trouve ensuite et 4 un méme niveau * 4 % + En demier niveau les opérateurs binaires + et — Si les priorités sont identiques on calenle de gauche a droite } Les parenthéses permettent dioutrepasser ces régles Exemples: a-bte > at+(b*c) a*b+e%d > fa*bj)+(c%d) -c%d > (-0) %d -ate%d > f-a}+ (¢%d) -a/-b+e¢ 3 (f-a)i(-b) Jee -a/-(b+e} > (-a)/(-(bro)e Opérateurs relationnels: Le C se distingue des autres langages par deux points: 1. Le résultat de la comparaison est un entier valant: 0 sile résultat de la comparaison est faux I sile résultar de la comparaison est vrai 2. Les expressions comparées peuvent étre d'un type de base quelconque et sont sommises aux régles de conversion. On ne compare que des expressions de type aumeénique. » Les opérateurs relationnels sont moins prioritaires qne les opérateurs arithmétiques. } Les opératews =, >= ont la méme prionité. Les opérateurs == et /= ont la méme priorité mais celle-ci est inférieure aux premiers s Opérateurs logiques: C dispose des trots opérateurs logiques classiques et . ov. mon Comme pour opérateurs relationnels vrai estreprésentée par 1 et faux par 0 ale résultat d'une comparaison est numérique de type int = Ces operatenrs acceptent n'importe quel opérande numenique en utilisant les régles de conversion implicites 0 correspond a faux Toute autres valeur correspond a vrai Opérateurs logique: " Opérande 1 oe To a Opérateurs logiques: + Lopérateur / a une priorité supérieure a celle de tous les opérateurs arithmetiques binaires et aux opérateurs relationnels + Le contraire de a est /fa==b) (avec parenthés + Lopérateur || est moins prioritaire que &&. Tous deux sont de priorit inférieure 4 celle de tous les opératenrs anthmeétiques binaires et aux opératenrs relationnels > Llopérande de droite n'est évalué que si la coanaissance de vale est indispensable. Dans l'expression a Clest nn opérateur naire qui fait la conversion en donble du résultat de Vexpression mais pas des différentes valeurs. > La priorité de ces opérateurs est élevée. > Tleniste autant d'opératemrs de cast que de types différents is Operateur conditionnel: Considerons Ja structure de-choix: Si a>b alors max=a sinen max=b Tl existe un opérateur qui réalise la méme tache: max =a>b?azb Llexpreszion a droite de Vopérateur d'affectation est en fait constitné de 3 opérandes séparés par les symboles ? et : Cet opérateur évalue la premiére expression. si elle est differente de zéro, il évalue le deuxieme operande et donne le résultat sinon il évalue le troisiéme opérande et fourni le résultat Sa priozité est faible; juste avant Vafiectation. “4 ‘Opérateur séquentiel: La notion d'expression est trés large en C a*b,izj est une expression qui évalue d'abord a * b puis i+jet qui prend la valeur de 1+j + Dans cet exemple le premier calcul est inutile. par contre itt, a+b peut représenter un intérét + L'opérateur séquentiel "," est associatif de gauche a droite. sa faible priorité évite 'usage des parenthéses: i++, jettk,j— * Tl permet de réunir plusienrs instructions en une seule. « Dans la pratique il est fréquemment utilise dans les boucles et les instmction de choix 8 “Operateurs de manipulation de bits: C'es opérateurs permettent de travailler directement sur le “motif binaire". ils ne portent que sur les types entiers Operateurs et expressions Opérateurs de manipulation de bits: Exemples wares! En binaire Hexa. Decimal Operateur n 0000 0191 0110 1110 056E 1390 P 0000 0011 1911 0011) 03B3 947 n&p 00000001 0010 0010, 0127 290 nip GOO00111 11111111 O7FE 2047 n*p 00000110 1101 1101 /o6DD 175 ~m 11111010 1001 0001 FA91 _-1391(signed) ~n 1111 1010 1001 0001 FAS1 64145 (unsigned) Operateurs et expressions Operateurs de manipulation de bits: Exemples Variable / GREG Cas 1 Cas 2 (signed) nm 00000101 0110 1110 | 1010 1101 1101 1110 (unsigned) p | 0000 0101 0110 1110 | 1010 1101 1101 1110 ne<2 0001 0161 10111000 | 1011 0111.0111 1000 n>>3 0000 0000 1010 1101 | 11110101 1011 1011 pos 0000 0000 1010 1101 0001 0101 1011 1011 a << 2: décale n de 2 bits vers auche: 2 bits de poids fort sont perdus et 2 bits a 0 apparaissent a droite. n >> 3: décale n de 3 bits vers la droite: 3 bits de droite sont perdus et 3 bits apparaissent 4 gauche. = si nest unsigned les bits créés sont 4 0. “ + si nest signed les bits ajoutés sont identiques au bit dé4uigne Onpérateurs et expressions ‘Operateur sizeof: * Tlretourne la taille d'un objet en octets. Dans ce cas on ne met pas de parenthéses + Ii donne Ia taille en nombre d’octets du type dont le nom est entre parentheses double n; unsigned int si unsigned int sé = Interét: * Ecrire des programmes portables en connaissant la taille exacte de certains objets + Eviter de calculer la taille des objet par soméme d'un type complexe a of an_int= sit of n= sizeof n; “of (int); (epee Priorités des operateurs Rang Opératenr ordre de priorité 1 gauche a droite 2 droite a gauche a gauche a droite a +. gauche a droite 3 > gauche a droite 6 > gauche a droite 7 E gauche a droite g & gauche a droite 8 gauche a droite 10 gauche a droite ii && gauche 4 droite PP ganche a droite 3 Op. conditionnel droite A gaughe 14 = droite a gauche La puissance d'un langage provient de la possibilité de faire: *Des comportement différent selon les circonstances De repéter des instructions -Des branchements conditionnels ou imconditionnels En C ces instructions de contréle sont: if...else et switch pour les choix do... while, while et for pour les boucles goto_ break et continue pour les branchements in ‘Liinstruction if af (expression) instruction_1 else instruction_2 else et linstruction qui le suit sont facultatifs. On peut avoir: if (expression) instruction Avec: expression: expression qnelconque Instruction: instructions simple. bloc d'instructions, instruction structurée é pring ("ordormé"); else prinif (non ordonné"); ® Ty aune ambiguité sur le else Laregle est: else se rapporte au dernier if rencontré auquel un else n'a pas été attribué. > Limiroduction des accolades outrepasse cette régle! instruction switcl: switch (expression) { case constante_1: [ instruction_1j case constante_2: [ instruction_2] case constante_u : [instruction_n] [ defanlt 2 instructions] expression: expression entiére quelconque constante: expression constante de type entier instruction: instructions quelconques > Les crochets [] indiquent que le terme est facultatif “ Liinstruction switch: switch (expression) { case constante_1 ; [ tustruction_1] case constante_2: [ instrwction_2j} case constante_n: [ insiruction_n] {default instructions] i + On évalue l'expression pnis on cherche s'il existe une étiquette avec ala valeur obtenue. Si c'est le cas on exécute les instructions figurant aprés cette étiquette. Sinon si le mot clé default existe on exécute les instructions qui le suivent. sinon on passe a l'instruction qui suit le bloc « Linstrnction break faire sortir dn bloc switch a ‘Linstruction switch: ch (expression) f case constante 1: [ instruction_1] case coustante 2: [ instruction_2, case constante_n : [instruction_n] [default 3 instructions] } + Une fois le branchement a I'étiquette de cas effectué, Vexécution se poursuit. par défant, juaqu'a la fin du bloc switch + Linstmetion déchappement break permet de forcer Ia sortie du bloc ‘Linstruction do...while: do instruction while (expression) ; Action: répéte instruction tant que expression est vraie. > Liimstruction ov bloc d'instructions est parcourue au moins une fois parce que la condition qui régie cette boncle (valeur de expression) n'est examinée qu’a la fin de chaque répétition. } Notez la présence de la parenthése autour de l'expression de controle et le ; ada fin de cette instruction L'expression pent étre anssi élaborée que vous voulez > Limstmction pent étre vide. os Exemple: do; whilef..) ou do fjwhile(.. ‘L'instruction do...while: xemple L do { printf ( "donnez un nb > 0 scanf ( "ed", &n ); printf ("vous avez fourni %d ", n); } while (in <= 0) ; Exemple do c= getchar(); while (ec != x"); while (expression) instruction Action: répéte instruction tant que expression est vraie. > La condition de poursuite est examinée avant chaque exécution de linstmiction ou bloc d'instructions. Une telle boucle peut trés bien n'étre parcourme aucune fois sila condition est fausse dés le depart. } Notez Ia présence de la parenthése autour de l'expression de contréte et l'absence du : (il y a déja un dans instruction !} >» L’expression est évaluée avant la boucle. Sa valeur doit étre définie .. int K=O, nbr while (nbr!=0) printf %6din" Ie): oy L'instruction for: for ( expression_1]; [expression_2]; [expression_3]) instruction Action: Répéte instruction tant que expression_2 est vraie. } Les crochets [ ] signifient que leur contenu est facultatif } Elle est équivalente a: expression_1 while (expression_2) f instruction expression_3 } > Siexpression_ est Vide elle est comsidérée comme viBie printfédin"iti); } prindfi"a la fin la valeur da i est Sedin",t); prinif est utilisée pour transférer du texte. des valeurs de variables ou des résultats d'expressions vers le fichier de sortie standard stdout (par defaut l'écran) Syntaxe: printf ( format, liste_d'expressions ) Avec format. format de représentation est en fait une chaine de caractéres qui peut contenir * du texte + des sequences d'échappement + des spécificateurs de format liste_d'expressions: suite dexpressions séparées par des les d'un type em accord avec le format correspondant "" “ + Les séquences d'échappement sont des couples de symboles qui contrdlent l'affichage on l'impression de texte. * Ces séquences d'échappement sont toujours précédées par Je caractére d'échappement "! pa joint d'interrogation a & * Les spécificateurs de format indiquent la maniére dont les alenrs des expressions sont imprimées. Ils commencent toujours par le symbole % et se temminent par un ou deux caractéres qui indiquent le format d'impression. + Les spécificatenrs de format impliquent une e! nm dua nombre en chaine de caractéres. + La partie "" contient exactement un spécificateur de format pour chaque expression. Pons le type long. i faut utiliser les spécificatenrs: %eld oli San Belov 2 ns, Les entrées-sorties conversationnelles La fonction printf Spécificateurs de format pour: printf (suite) Symbole Type Impression comme cof double _rationnel en notation décimale %e double satioanelen aotation scientifique 6s char* chaine de caractéres Pour le type long double, il faut utiliser les spécificateurs %Lf on %Le Les entrées-sorties conversationnelles La fonerion printf Longueur minimale de cadrage: * Le code %3d affiche une vi trois caractéres cadrés 4 droite * Le code %3d affiche une valeur de type int sur an n acteres ma . ur de type fut sur au moins noins Les entrées-sorties conversationnelles La fonction printf cers oe Pe ol /D Brera] * %6f affiche la valeur avec 6 chiffres aprés la virgule * %610f préc © %103f precise une Lo aprés la v ir mgueur minimale de 10 caract weur munimal de | Les entrées-sorties canversationnelles La fonction printf ctéres dont 3 © en no wat et max 6 aprés la virgule pour lexp: * %12.de précise me longueur valeur affichée occupera 1 caract! et une précision 4. ici la La valeur de retour de printf: Pe ae n=25 et ae Ed SEs oe see ee ee } printf étant une fonction elle retoume le nombre de caractéres qu'elle a effectivement affiché ou la valeur -1 en cas dereur H controler Ja mise en r intéressant si on 1 Ceci peut se rev page et ae forcer Ie retour a la Ligne que quand clest nécessaire C cherche toujours a satisfaire le contenu du format ! printi("Sod".2.p}) > lavaleurdep ne sera pas affichée printi{"ed°d"n) > affichera a puis _ a'importe quoi Nous avons déja employe putchar et nous ponvons dire que putchar(c) joue le méme 1dle que printf{"%6e",¢) Mais son exécution est plus rapide dans la mesure ot elle ne fait pas appel an mécanisme d/analyse de format scanf est la fonction symeétrique a printf qui recoit ses données. a partir du fichier d'entrée standard stdin (clavier par defaut) Syntaxe: scanf ( format, liste_d'adresses ) Avec: format: des spécificateurs de format (entre "") qui détermine comment les données reques doivent étre interprétées_ liste_d'advesses- liste S'adresses de "Iwalue" séparées par des virgules d'un type en accord avec le format correspondant = Les donné guccessivement aux adresses indiquées par liste d’adresses. comrectement regues sont mémorisées = Lladresse d'une variable est indiquée par le nom de la variable précéde du signe & 4 Réle des séparateurs: sean: "5 — &n) n=12 De n=12 12 # n=12 2 @ 1 # n=1? scan ("%d*%d", &n, &p pou scanf( "%d%a”, &n, &p) 1225¢ n=l? p=25 1g 2g a12 p Quand on impose une longueur maximale: seanff"%3d" 863d", &n, &p) ou scanfi"%3d%3d", &n, kp) 1234356 1234569 12345 Lecture de caractéres: scanf( "%d*%c", &n, &e ) 12aet n=12 co's 12°“agF nel? = a! 1d ag ne12 cas 12ad nel? c= 's scan ("%6d%e", &n, &e) ad n=12 12a mize * getchar, lit un caractére du fichier d’entrée standard srdin Type du résultat le type résultat de gefchar est int Les valeurs retoumees sont on bien des caracteres (0 - bien le symbole EOF. ou En général. getchar est utilisé dans une affectation: int C; C= getchart); # Apartir des types prédéfinis du C (char, entiers, flottants). on peut créer de nouveaux types qui permettent de représenter des ensembles de données organises = Les tableaux: ensemble fini d'éléments de méme type. Sstockés en mémoire a des adresses contigués = Les structures: suite finie d'objets de types différents appelé champ et désiené par un identificatenr = Les champs de bits = Les unions = Les énumeérations ‘Les tableaux unidimensionnels: ensemble fini d'élements de méme type. stockés en mémoire 4 des adresses contigui référencées par un indice al TT her Correspond en mathématiques a aun vecteur de dimension N M eomponenies Déclaration d'un tableau a une dimension: type nom-du-tableaufuom bre-cléments}; nombre-éléments est nne expression constante entiére positive int tab[ 10]; indique que tab est un tableau de 10 éléments de type int. Cette declaration réserve pour fab un espace mémoire consécutifs de 10 cases de type int * Les tableaux unidimensionnels : Piles indices d'un tableau t de taille n vont de 0 an-1. Tout acces a ¢{n] peut provoquer une erreur grave pendant Yexécntion dn programme. ¥ un tablean doit avoir une taille fixe connue a la compilation. Cette taille peut étre nn nombre ou une variable constante. mais pas une variable. 108 Tnittalisation de tableaux unidimensionnels : Elle peut se faire au moment de 1a déclaration: int tab[6] = {1,2,8,0,5, 9}; Si initialisation et la déclaration sont simultanées. la taille du tableau peut étre omise. le compilatenr 1a calcule d'aprés le nombre de valeurs d'initialisation: int tabf] = {10,26,30,40,50,60,70,80, 90}; On peut n'initialiser que le début d'un tableau: double resistances[12]=/1., 1.2, 1.8, 2.2}; ® Si om spécifie trop de valeurs, ua ge dlerreur le signale. *Si tout le tableau n'est pas imitialisé lors de la declaration, les éléments non initialisés sont mis a 0!" Thitialisation de tableaux unidimensionnels: Un tablean peut étre initialisé plus tard. en affectant une valeur achaque élément - int notes[36}, for (10; 1<36; i+) f notes{iJ=20; i notes[3] = 13; notes[55] = ¥Iin'y a pas d’affectation, de comparaison. dopérations anthmeétiques directes sur les tableaux. * Les tableaux multidimensionnels: Dimension 2 Un tableau 4 denx dimensions L et C est un tableau de dimension L dont chaque élément est un tableau de C elements Lest le nombre de lignes. C est le nombre de colonnes Un tableau 4 denx dimensions contient donc L*C composantes 8 Les tableaux multidimensionnels: Dimension 2 Un tableau a deux dimensions L et C comespoad en mathématique 4 une muatrice de L lignes et C colonnes Declaration d'un tableau 4 une dimension: type nom-du-tableau[nb-lignes] [ub-colounes; Exemple int tabf4)[ 6]; indiqne que rab est un tablean de 4 lignes et 6 colonnes tons de type int. Cette déclaration réserve pour tab un espace mémoire consécutifs de 4*6=24 cases de type int Chaqne élement est identifie par 2 entiers: Vindice de hene eat celui de la colome Les tableaux multidimensionnels: Dimension 2 Exemple tableau de dimension 2: main{) f int tab[S}[19]; int ij; f..} Maffectations...*/ (for G70; 1<3; i++) /* Pour chaque ligne... r ft (for G=0; j<10; j++) * pour chaque calonne */ printf("% 7d", tabfij{i]); printf("\n"); /* Retour a la ligne */ f 18 Z Les tableaux multidimensionnels: Dimension 2 On peut initialiser les composantes du tableau lors de sa declaration, en domnant Ja liste des valeurs entre accolades. les composantes de chaque ligne sont encore une fois comprises entre accolades. int A[3][10] ={f 0,10,20,30,40,50,60,70,80,90}, (10,11,12,13,14,15,16,17,18,19}, £1,12,23,94,45,56,67, 78, 89,9033: float B[3}[2] = (1.05, -1.10 }, [S6e-5, 872-5}, f-12,5E4, -12.3E4}}: Les valeurs sont affectées ligne par ligne en passant di droite. Les valeurs manquantes sont imitialisées par zér uche a i Les tableaux multidimensionnels: Dimension 2 Exemples d initialisations ne e118) = U2, 8, 9, a) se ©1e}C4) “U0, 41, 4, a7 8: oh Eee Gtk th, a Ta Tete Z os int CLAN(4) (00), ), 1d, (UN; c Ant cf4) Ca) C4, a, 2, 4, 10, % eeneur 7 7 7 7 7 @ 107 Les tableaux multidimensionnels: Dimension 2 Réservation automatique Si le nombre de lignes n'est pas indiqué lors de I'initialisation. lordinateur réserve automatiquement le nombre d'octets nécessaires. int A[][10] = {f 0,10,20,30,40,50,60,70,80,90}, {10,11,12,13,14,15,16,17,18,19}, {1,12,23,34,45,56,67,78,89,9033; réservation de 3*10 Sloat B[][2] = {{-1.05, -1.10 }, {86e-. £-12.5E4, - réservation de 3*2 a Les tableaux multidimensionnels: Cas général Hi se définit par type Nom_du_tableau [alJfa2)[a3} ... [aN] Chaque élément entre crochets désigne le nombre d'éléments dans chaque dimension Le nombre de dimensions n'est pas limité Un tableau aN dimensions est un tableau de tableaux a N-1 dimensions. ue chaine de caractéres est un tableau qui ne contient que des éléments de type char et termine par le caractére \0' On peut omettre Ia taille du tableau lors de la déclaration, s'il ya initialisation: char ville[] = "Rabat"; EY ete TR] "ot Liaccés aun element d'une chaine de caracter méme fagon que I'accés 4 un élément d'un tableau ¢ fait de la no Les bibliotheques de fonctions de C contiennent une série de fonctions spéciales pour le traitement de chaines de caractéres. Exemple: string.h strlen(s) foumit la longueur de s sans compter le "10" strepy(s,t) copie fverss streat{s, t) ajoute fa la fin de s stremp(s, t) compare s et ¢ lexicographiquement et fournit at! négatif sis précéde r zero sisest égalart positif sis suit f strnepy(s, fn) copie au plus n caractéres de t vers s strncai(s, tn) ayoute au plus n caractéres de fa la fin de 5 stdlib.h contient des déclarations de fonctions pour 1a sion de chaines de caracteres en nombres atoi(s) — rerourne 1a valeur numérique représentée par s cont comme int atol(s) — retourne Ia valeur numérique représentée pars comme long atof(s} retoume Ia valeur mmmérique représentée par s comme double > Les espaces au début d'une chaine sont ignorés > Iln'y a pas de contréte du domaine de la cible » La conversion s'aréte au premier caractére non convertible » Pour une chaine non convertible. ces fonctions retournent zero wt Fonctions de classification et de conversion etypesh fonction: retourne un int différent de zéro, isupper(c) sic est une majuscule (/A'.'Z') islower{c¢) sic estune minuscule ('a’...'z') isdigit( c ) sicestun chiffre décimal (0. isalpha(c) si islower(c ) on isupperf ¢ ) isalnnm( ec) sitsalphay ¢ ) ov isdigit( ¢ } isxdigit( c ) sic estun chifite hexadecimal isspace(c) sic est un signe d'espacement ("a'r \f) tolower(c) — retourne ¢ converti en minuscule foupper{c) — retourne ¢ converti en majnscule 1" Pour mémoniser une suite de mots. il est pratique de considérer un tableau de chaines de caractéres Tl comespond 4 un tablean 4 deux dimensions du type chiar. ob chaque ligne contient une chaine de caractéres: char jour 7)[9]; réserve Vespace en mémoize pour 7 mots contenant 9 caractéres (dont 8 caractéres significatifs) On accéde aux différentes chaines de caractéres du tableau_en dadiquant simplement la ligne correspondante. char jour{7)[9}= f"lundi", "mardi", "mercredi", "jeudi", “vendredi", "samedi", "dimanche", ujourd hui, c'est %s fn", Jourf2p); printf affichera la phrase: Aujourd’hni, clest mercredi ! i Le langage C permet de créer de nouveaux types de variables en utilisant la notion de structure. C'est une suite finie d'objets de types différents appelés champs et désigné par un seul identifiant La declaration d'une structure ne fait que donner lallure de 1a stricture: struct modele type_I membre_2; pe_2 membre type_n membre_n; h Elle ne réservep fespace memoir. “La definition d'une variable structurée consiste a créer une variable ayant comme type celui d'une structure que l'on a précédemment déclarée Pour une variable d'identifiant X de type modele on utilise la syntaxe: struct modele X; Ou peut aussi faire les deux déclarations (du type et de la variable) en méme temps: struct modele type_I membre_1; type_2 membre_2; type_n membre_n; dX Ww Exemple: dans un plan un potnt est identifié par ses coordonnées x et y. on crée une structure nommeé coordonnées - struct coordounses B int x; int yy iB Si ona besom de 3 points_a. point_b et point_c on déclare: struct coordannées paints_a, point_b, point_c; Chacun de ces points a 2 coordomnées x et y Pour y accéder. il suffit de mettre un point entre le nom de la variable et le champs désiné: point_b.x=3; points_b. Points_a. ints points_a.y=points_b.x ‘Abscisses / Ordounées v ‘Utilisation de typedef Limstruction typedef crée un alias typedef struct coordonnees coordannees; Cette ligne indique: “le mot coordonnees est équivalent a struct coordonnees" En mettant cette instruction. on n'aura plus besoin de mettre le mot struct 4 chaque définition Exemple coordounees a, bj déclare 2 variables nommeées a et b de type struct coordonnees Tes structures se manipulent comme les autres types. La definition. affectation, ‘initialisation. ... tout est semblable an comportement des types de base. On utilise des accolades pour préciser les valeurs des champs en cas d'initialisation (comme pour un tableau). On peut évidemment déclarer des tableaux de structures et méme définir un champ de type structure ou tableau ._. coordonnees a={2,13},b=a, ¢, tabf10}: ca; >» Par contre écrire b=/@, donne une erreur! ® Comme pour les tableaux. la syntaxe utilisée pour LV initialisation ne marche pas pour une affectation. Struct Personne { char nom[100}; char prenomf160]; char adressef1 000}; int age; int garcon; }; typedef struct Personne fiche; main() { fiche utilisateur; pring" Quel est votre nom ? "); scanf(""es", urilisateur.nom); printfi"Vatre prenom ? "); scanf('"%és", utilisateur.prenom); printf{"Tous vous appelez ‘as %s", utilisateurprenom, utilisatewr.nom); } 120

You might also like