Vous êtes sur la page 1sur 96
INFORMATIQUE APPLIQUEE: CS! 2203 INTRODUCTION A LA J PROGRAMMATION STRUCTURE % Jean Marie Dembele Introduction & la programmation structurée Avant-propos LUniversité virtuelle africaine (UVA) est fiére de participer & I'accés croissant a I’éducation dans les pays africains grace & la production de matériaux dapprentissage de qualité, Nous sommes également fiers de contribuer a la connaissance globale car nos ressources éducatives ouvertes sont principalement accessibles depuis le continent african. Ce module a été développé dans le cadre d'un programme de dipléme et d'études en informatique appliquée, en collaboration avec 18 institutions partenaires africaines de 16 pays. Au total, 156 modules ont été développés ou traduits pour assurer la disponibilité en anglais, en frangais et en portugais. Ces modules ont également été mis & disposition en tant que ressources éducatives ouvertes (OER) sur oeravu.org ‘Au nom de Université virtuelle africaine et de notre patron, nos institutions partenaires, la Banque africaine de développement, je vous invite a utiliser ce module dans votre institution, pour votre propre éducation, & le partager aussi largement que possible et & participer activement a FAVU Communautés de pratique de votre intérét. Nous nous sommes engagés a en premigre ligne de développement et de partage de ressources éducatives ouvertes. Luniversité virtuelle africaine (UVA) est une organisation intergouvernementale panafticain créée par une charte qui a pour mandat d'augmenter considérablement laccés 8 une éducation et a une formation supérieures de qualité grace a l'utilisation innovante des technologies de communication d'information, Une charte établissant 'UVA en tant qu'organisation intergouvernementale a été signée 8 ce jour par dix-neuf (19) gouvernements afticains - Kenya, Sénégal, Mauritanie, Mali, Céte d'Ivoire, Tanzanie, Mozambique, République démocratique du Congo, Bénin, Ghana, République de Guinée, Burkina Faso, Niger, Soudan du Sud, Soudan, Gambie, Guinée-Bissau, Ethiopie et Cap-Vert. Les institutions suivantes ont participé au Programme des sciences informatiques appliquées: (1) Université d’Abomey Calavi au Bénin; (2) Université de Ougagadougou au Burkina Faso; (3) Université Lumiére de Bujumbura au Burundi; (4) Université de Douala au Cameroun; (6) Université de Nouakchott en Mauritanie; (6) Université Gaston Berger au Sénégal; (7) Université des Sciences, Techniques et Technologies de Bamako au Mali (8) Institut de gestion et d’administration publique du Ghana; (9) Université Kwame Nkrumah de Science et Technologie au Ghana; (10) LUniversité Kenyatta au Kenya; (11) Egerton University au Kenya; (12) Université d’Addis-Abeba en Ethiopie (13) Université du Rwanda; (14) Université de Dar es-Salaam en Tanzanie; (15) Université Abdou Moumouni de Niamey au Niger; (16) Université Cheikh Anta Diop au Sénégal; (17) Université Pedagégica au Mozambique; Et (18) “Université de Gambie en Gambie. Bakary Diallo Le Recteur Université virtuelle africaine Credits de production Crédits de production Auteur Jean Marie Dembele Pair Réviseur Pelagie Houngue UVA - Coordination Académique Dr. Marilena Cabral Coordinateur global Sciences Informatiques Apliquées Prof Tim Mwololo Waema Coordinateur du module Jules Degila Concepteurs pédagogiques Elizabeth Mbasu Benta Ochola Diana Tuel Equipe Média Sidney McGregor Michal Abigeel Koyier Barry Savala Mercy Tabi Ojwang Edwin Kiprono Josiah Mutsogu Kelvin Muciithi Kefa Murimi Vietor Oluoch Otieno Gerisson Mulongo Introduction & la programmation structurée Droits d'auteur ‘Ce document est publié dans les conditions de la Creative Commons Attribution htte://creativecommons.ora/licenses/by/2.5/ Le gabarit est copyright African Virtual University sous licence Creative Commons Attribution- ShareAlike 4.0 International License. CC-BY, SA Supporté par Projet Multinational II de 'UVA financé par le Banque africaine de développement. Table Des Matiéres Avant-propos 2 Crédits de production 3 Droits d’auteur 4 6 Apercu du cours Bienvenue a Introduction & la programmation structurée...........-. 6 Prérequi Matériaux Objectifs du cours Unités . Unité 0: Evaluation diagnostique 6 Unité 1 : Types, opérateurs et expressions, lecture et écrit 7 Unité 2: Instructions de conteéle, fonctions 7 Unité 3: Tableaux, pointeurs et chaines de caractéres, structures, unions et énumérations 7 Unité 4: Fichiers, tests de programme et débogage 7 Evaluation Unité 0. Evaluation diagnostique 12 Introduction a l'unité. 12 Objectifs de I'unit. Evaluation de lunité 12 Unité 1. Types, opérateurs et expressions, lecture et 14 Introduction a unit. Objectifs de unite eee 14 Activités d’apprentissage Activité 1 - Revue des types de base en C 4 Introduction & la programmation structurée Activité 3 - Manipulation des opérations de lecture et écriture 25 Evaluation 25 Conclusion . 27 Evaluation 28 Unité 2. Instructions de contréle, fonctions 31 Introduction a l'un 31 Objectifs de r'unité 31 Activités d’apprentissage 32 Activité 1 — Les instructions de contréle 22 Conclusion .7 40 49 Evaluation .5t Unité 3. Tableaux, pointeurs et chaines de caractéres, structures, unions et énuméra 53 Introduction aM'unité. ee eee - 53 Objectifs de lunité : sees : 53 Activités d’apprentissage 54 Activité 1 ~Tableaux et pointeurs 54 Conclusion 6 Activité 2 — Correspondances entre pointeurs et tableaux, chaines de caractres. 63 Conclusion 67 Conclusion 73 Evaluation 76 Unité 4. Fichiers, tests de programme, débogage 79 Introduction a Muri 79 Objectifs de luni 79 Activités d’apprentissage = 80 Activité 1 — Fichiers 80 Conclusion . 86 Activité 2 ~ Tests de programme at débogage 86 Conclusion Evaluation Evaluation Evaluation Introduction & la programmation structurée Apergu du cours Bienvenue a Introduction a la programmation structurée Ce module conceme l'acquisition des concepts de type de données, de variables, dopérateurs et expressions dans une programmation structurée avec le langage C. II explique aussi les notions d'entrée/sortie, de structures de contréle, de sous programmes, de tableaux, de pointeurs et dallocation dynamique de la mémoire ainsi que des notions de tests de programme et de débogage BB rérequis rincipes de la programmation U Matériaux Les matériaux nécessaires pour compléter ce cours comprennent: Ordinateur Compilateur C/C++; IDE! ©oobjectifs du cours Aprés avoir fini le module, vous devriez étre capable de décomposer n‘importe quel probleme en étapes algorithmiques et de le traduire dans un code source puis de le compiler pour obtenir un exécutable. Ce sujet est trés important car il introduit 'apprenant 8 la programmation structurée, qui lui donne les bases pour tout autre paradigme de programmation Cette unité vous permetira de vérifier les connaissances que vous devez avoir avant de commencer le cours Apercu du cours Cette unité présente les notions de typage en C et les opérateurs et expressions. Elle introduit aussi les fonctions élémentaires d’entrées sorties, notamment de lecture et d’écriture ainsi que leurs formats, sur les entrées et sorties standards. Unité 2: Instructions de contréle, fon: ns Dans cette unité, vous découvrirez la syntaxe des différentes instructions de contréle existant en C ainsi que la notion de fone: ns et de structure d'un programme en C avec différents modules. Unité 3: Tableaux, pointeurs et chaines de caractéres, structures, nions et énumérations Les tableaux de différents types de base, ainsi que les pointeurs et chaines de caractares seront introduits dans cette unité, Les types composés a partir de type simples seront également détaillés Unité 4: Fichiers, tests de programme et débogage Le traitement de fichiers, et de maniére générale, celui des entrées sorties sera fait dans cette Unité qui se terminera par des te: de programme et des techniques de débogage. Me ‘i Evaluation Les évaluations formatives (vérification de progrés) sont incluses dans chaque unité, Les évaluations sommatives (tes et travaux finaux) sont fournies a la fin de chaque module et traitent des connaissances et compétences du module. Les évaluations sommatives sont gérées & la discrétion de I tablissement qui offre le cours. Le plan d’évaluation proposé est le suivant: 1_| Devoir sur table 25% 2_| Projet en équipe 25% 3_| Examen sur table 50% Introduction & la programmation structurée & Plan Mea Nery Pree Cae Revue des types de base en C: Retenirla structure générale du programme, Décounrir et utiliser les types de base du langage C, Déclarer ot utiliser des variables de types de base, Conversions implicite et explicite de types, Constantes de types de base}. Types, opératours et expressions, Découverte des opérateurs et des expressions: lecture et . 25h . Se familiarser avec les opérateurs écriture Tableau des priorités des opérateurs Expressions Manipulation des opérations de lecture et écriture Lecture et Ecriture Autres fonctions et macros usuelles Apercu du cours Instructions de contréle, fonctions Les instructions de contréle: Découvrir les instructions alternatives Découwrir les instructions répétitives Terminer avec les instructions de branchement, Les instructions de branchement dans les Les fonctions en C: Def ir une fonction en langage C Variables locales, globales, statiques et temporaires Distinguer le passage par adresse du passage par valeur Utiliser les arguments de la fonction main) Ectire un programme medulaire Régles de compilation 35h Introduction & la programmation structurée Tableaux, pointeurs et chaines de caractéres, structures, unions et énumérations Tableaux et pointeurs: Défnir des tableaux et pointours (définitions ¢tinitialsations des tableaux, les tableaux de caractares, les tableaux & plusiours dimensions, définitions et initialisations des pointeurs, arithmétiques des pointeurs) Comprendre lallocation dynamique ( Correspondances entre pointeurs et tableaux, chaines de caracteres: Bien cemner léquivalence entre tableau et pointour {tableau & une dimension, tableau & deux dimensions) Manipulations de chaines (les fonctions usuelles) Strutures, Unions, Enumerations: Définir une structure (définition avec ou sans nom, utilisation des champs de la structure, les structures et les pointeurs, passage par adresse des structures, redéfinition de type, opérations sur les structures, Définir une union Définir une énumération 35h 10 Apercu du cours Fichiers: Définir un fichier Ouverture d'un fichier Mode d’accés aux fichiers Fermeture de fichiers Généralisation : entrées sorties formatées Impression et lecture de caractéres Les entrées-sorties binaires Positionnement dans le fichier Fichiers, Tests de programmes et débogage: tests de Détection des erreurs 25h programme et débogage Débogage Couverture et profilage de code Makefiles Analyseurs de code Lectures et autres ressources Los lectures et autres ressources dans ce cours sont indiquées ci-dessous. D.M., Ritchie, B.W., Kernighan., 1988. The C Programming Language Second Edition, Prentice Hall Inc., Englewood Cliffs, New Jersey. S.P. Harbison, G.L. Steele Jr, C A Reference Manual 2nd Ed, Tartan Laboratories, Prentice-Hall Software series, 1987. Peter Van Der Linden, Expert C Programming, Deep C Secrets, Prentice Hall, 194, BRAQUELAIRE Jean-Pierre, Méthodologie de la programmation en C, Masson, 1998, CHARBONNEL Jacquelin, Langage C — les finesses d'un langage redoutable, ‘Armand Colin, 1992. FEUER R. Alan, Langage C - problémes et exercices, Masson, 1991 Claude Delannoy, Programmer en langage C, Cours et Exercices Corrigés, Eyrolles, 2014 " Introduction & la programmation structurée Unité 0. Evaluation diagnostique Introduction a I'unité Cette unité vous permettra de vérifier les connaissances que vous devez avoir avant de commencer le cours. Vous pouver faire I'évaluation de I'unité avant de faire des activités d'apprentissage pour aider & rafraichir vos connaissances en informatique. ©objectits de runies Alla fin de cette unité, vous devriez étre capable de: Verifier et raffermir vos connaissances de base en informatique & Evaluation de I'unité Vérifiez votre compréhension! Devoir sur table 0 Directives Répondre aux questions posées, 'évaluation dure 1h. Systame de notation Le baréme est indiqué & la suite des questions Evaluation Question de culture générale (20 pts) Qu’est ce que l'informatique? Rappeler les grandes dates de I'évolution de ordinateur. Que stipule la loi de Moore ? Citer 04 langages de programmation découverts & partir de votre recherche personnelle Donner l'architecture générale d'un ordinateur (sous forme de schéma) et le réle des différents composants Quelles sont les grandes phases de la programmation ? 12 Unite 0. Evaluation diagnostique Donner sous forme d'organigrammes, les différentes instructions de contrdle que vous Quelles sont les différences entre arguments formels et arguments effectifs dans l'écriture de fonctions Expliquer le notion de passage par adresse Donnerla structure générale d'un programme qui comporte une fonetion ou plusieurs fonctions j| Lectures ot autres ressources Les lectures et ressources de cette unité sont se trouvent au niveau des lectures et autres ressources du cours, 13 Introduction & la programmation structurée Unité 1. Types, opérateurs et expressions, lecture et écriture Q Introduction a I'unité Cette unité présente les notions de typage en C et les opérateurs et expressions. Elle introduit aussi les fonctions élémentaires d’entrées sorties, notamment de lecture et d'écriture ainsi que leurs formats, surles entrées et sorties standards. ©Obiectits de runits Al fin de cotte unit , vous devriez étre capable de: Définir une variable de type de base dans un programme informatique Uitiliser une variable (éléments du monde réel) de type de base dans une opération Constituer une expression correcte (phrase du langage) en C, Effectuer des opérations d'entrée et de sortie (de lecture et d’écriture sur le clavier et 'écran) Ecrire votre premier programme en C. [lactivités d'apprentissage Activité 1 - Revue des types de base en C 4 Unite |. Types, operateurs et expressions, lecture et ecriture Introduction Cotte activité présente les types de base du langage C. Elle vous permettra de bien connaitte les types du langage C et de définir des variables et des constantes de types simples. Détails de activité Retenir la structure générale du programme Avai générale d'un programme en C avec la figure suivante le passer au détail de cette activité, nous proposons de présenter d’abord la structure ‘#include . ‘+ int: représente des entiers; 2 ou 4 octets ( selon les machines) + float : représente des réels 8 virgule flottante; 4 octets + double = réels 8 virgule flottante en double précision; 8 octets + long double : type plus récent qui permet de représenter des nombres avec parties décimales sur une tres grande précision, sila machine le permet, ‘+ Les modificateurs: précisent le signe du type; positif (unsigned) ou positif et négatf (signed) ou le taille (long ou short). Ces demiers peuvent étre utilisés seuls ou avec int, donnant la possibilité d’avoir : short int (short) ou long int (long). signed char (8 bits) “128 a 127 unsigned char 0 a 285 short (16 bits) -32767 a 32767 unsigned short 0 a 65535 16 Unite 1. Types, operateurs et expressions, lecture et ecriture int (cas 16 bits) -32767 a 32767 unsigned int 0 a 65535, long (32 bits) -2147483647 2147483647 unsigned long 0 4294967295 Déclarer et utiliser des variables de types de base Faire précéder le nom du type et suivre avec celui des variables Type var, var2, ., varN Exemple; —intx y: char ch; float val, Une variable peut étre initialisée lors de sa déclaration inta =0; int =16* 15; char ch = ‘c’ Portée des variables Une variable est dite locale, si elle est définie a lintérieur d'une fonction finie en-dehors. (ou bloc) et globale si elle est Conversions implicite et explicite de types Lorsque des variables de différents types sont impliquées dans une opération, il peut se produire une conversion pour que opération se réalise (ce qui n’est pas le cas pour tous les langages de programmation). II y'a deux sortes de conversion : la conversion implicite et la conversion explicte. Conversion implicite de type : effectuée par le compilateur pour une perte minimum diinformation. (voir les ragles ISO 89) v7 Introduction & la programmation structurée float #; double dj int i; long li; Ti = f + i; | fest transformé en float puis additionné & f, le résultat est transformé en long et rangé dans li d= Li + 45 | ‘est transformé en long puis additionné li, le résultat est transformé en double et rangé dans d. Tsf+d; si l'un des deux op. est du type long double alors calculer avec long double; sinon, sil'un des deux op. est du type double alors calculer avec double ; sinon, sil'un des deux op. est du type float alors calculer avec float ; sinon, appliquer la régle de promotion en entior, puis : (@) sil'un des deux op. est du type unsigned long int alors calculer avec ce type ; ()si Fun des deux op. est du type long int alors calculer avec ce type; (6) si un des deux op. est du type unsigned int alors calculer avec ce type ; (@)si fun des deux op. est du type int alors calculer avec ce type. Conversion explicite de type : celle qui est effectuée par le programmeur avec l'opérateur de cast (type) expression ex: (int); (intj2.35 42 (float) 2 + 2.0 ‘Attention, ces deux instructions ne sont pas forcément égales isfea, et i=(int)f+ (int) 4; Constantes de types de base Constantes de type entier : construites 4 partir de chifres et naturellement exprimées en base dix. Elles peuvent aussi étre exprimées en base huit (octal) lorsque le premier caractére est un 0 ou en base seize (hexadiécimal) lorsque les deux premiers caractéres sont OX ou Ox. Elles peuvent étre suffixées par 'I','U, ou ‘u’,'U' pour faire référence & des types long ou unsigned, sans précision de type : 0342 (oct.), OXOFF hex.) 123 (déc.), -280 (décimal. longue: 120L, 0364I, Oxifal. non signée : 120U, 0364U, Oxifau 18 Unite 1. Types, operateurs et expressions, lecture et ecriture longue non signée :120ul, 0364UL, Oxtfaul, Constantes de type réel : ont le type double par défaut et peuvent étre suffixées par f,’F’ ou ‘VL! pour faire référence 8 une valeur float ou long double. Notation avec point décimal : 121.34, notation exponentielle : 12134e-2 rotation exponentielle : +121346-2 notation de type float : 121.34 notation de type long double : 121.341 Constantes de type caractare : se notent en écrivant le caractére entre apostrophes. ‘A’ '2" “«'. Les seuls caractéres imprimables qu'on ne peut pas représenter de cette fagon sont Vantislash et apostrophe, qui sont respectivement désignés par \\ et V Les caractéres non imprimables peuvent étre désignés par “\code-octal’ oi code-octal est le code en octal du caractare. Ceux qui sont plus fréquents disposent aussi d'une notation plus simple \n nouvelle ligne \t tabulation horizontale \w tabulation verticale \a signal d’alerte \b retour arrigre \r retour chariot Constantes de type chaine de caractéres : Une chaine de caractéres est une suite de caractéres entourés par des guillemets (elle se termine en mémoire par le caractére \0") Exemple «Voici est une chaine de caractérest» Elles peuvent contenir des caractéres non imprimables, désignés par les représentations déja 9 Introduction & la programmation structurée «Apres ceci allez a la ligne \n nous sommes a la ligne suivante» ‘A lintérieur d’une chaine de caractires, le caractére « doit étre désigné par \». Enfin, le caractére \ suivi d'un passage 8 la ligne est ignoré. Cela permet de faire tenir de longues chaines de caractéres sur plusieurs lignes. «Une longue longue longue longue longue longue longue longue longue longue \ chaine de caractéres» Conclusion Voila, tous les types de base sont présente Une petite évaluation vous permettra de revenir sur la déclaration. les autres suivront avec les chapitres suivants. Evaluation ‘+ Déclarer des variables de type de base (entier, réel, caractere, ...) ‘+ Reprendre lexercice en utilisant des modificataurs de type. ‘+ En utilisant les caractéres non imprimables, présenter une constante chaine de caractéres mise en forme (avec des paragraphes, des tabulations, ...) Activité 2 - Découverte des opérateurs et des expressions en C Introduction Une fois les types wus, passons maintenant aux opérations possibles sur ce type. Cette activité permet de voir les opérateurs et les conversions de type quill faut bien comprendre lorsque fon met des opérandes de types différents dans une méme opération Détails de l'activité Se familiariser avec les opérateurs. En langage C, les opérateurs peuvent étre classés suivant le nombre d’opérandes. On parlera d’opérateurs unaires, binaires et ternaires. Opérateurs unaires Opérateur d'incré mentation et de décrémentation et ++ permettent de décrémenter et diincrémenter des variables de type entier (ou pointeur) 20 Unite 1. Types, operateurs et expressions, lecture et ecriture val — est équivalent & val = val-1 vali+ est équivalent & val = val + 1 Dans le cas ois "operation est post-fixée a une autre (ex affectation), la valeur de la variable avant lopération est utlisée pour laffectation et ensuite ropération est appliquée, i.e Postincrémentation y=valt+; €9 {y=val; val = val + 1; Lorsque l'opér Vraffectation ne soit réalisée tion est préfixée & une autre (ex affectation), elle est appliquée avant que Pre-incrémentation y=+#val; = (val = val + 1;y=\ Opérateur de taille Lropérateur sizeof donne le taille en octets de la variable dont le nom suit. II peut aussi donner la taille d'un type, le type doit étre entre parentheses. sizeofit) = taille du tableau t; sizeoft)/ sizeo }) = nombre d’éléments de t Opérateur de négation logique La négation logique sert 8 inverser une condition en la faisant passer de vrai 8 faux et réciproquement. En C, une expression est fausse sila valeur qu'elle retourne est égale a 0, elle est vraie sinon. 10 vaut 1 Llopérateur ~ donne le complément a un de lexpression entiare qui le suit. x val 10101100 ~ val 01010011 Opérateurs binaires Opérateurs arithmétiques (+, -,/,*, %) le type de l'opération est déterminé parle type des valeurs sur lesquelles portent lopération (voir la conversion implicite de type) Opérateurs de masquage (&, |, “) ex 0011 0011 0011 & H a 2 Introduction & la programmation structurée o101 0101 0101 = 0001 =011 = = 0110 Opérateurs de décalage (<<, >>) Manipulent les valeurs contenues dans les variables de type entier en poussant les bits vers la gauche ou la droite. Le décalage vers la droite peut étre signé si expression est signée mais le résultat dépend de I'implantation (éviter le décalage a droite sur une valeur négative) Exemple expr b1b2b3b4 expr=expri << b2b3b40 Opérateurs logiques (&&, |) Les expressions dans lesquelles figurent ces opérateurs sont évaluées de gauche a droite, et revaluation cesse dés que la véracité ou la fausseté du résultat est établie (expressions avec court circuit), Ex: pour savoir si j est comprise entra12 et 143 il faut écrire >= 12 8&j <= 143 Ex pour savoir si un caractére car contient un ‘a’ en minuscule ou en majuscule: Opérateurs d’affectation et de succession Llaffectation est une expression comme les autres, ce qui nous permet de faire des affectations multiples comme : a= b= = 1 qui vaut a=(b=(c=1)) dans expr1=exp2, exp! est une Ivalue et expr2 une rvalue La virgule (ou succession) sert 8 s6parer deux expressions qui sont évaluées successivement. La valeur associée a cette expression sera la derniére valeur calculée, 5, k=100) associe 8 i la valeur 100. Opérateurs d'affectations étendues Certains opérateurs peuvent étre superposés avec celui de laffection pour obtenir une affectation étendue. Le tableau suivant en donne un résumé 22 Unite 1. Types, operateurs et expressions, lecture et ecriture ‘expression | résultat | équivalence | lecture opérateurs arithinétiques i 110] i = i + 10 | ajoute 10a7 i U5 | i= i+ 5 | ajoutejai i 0 |i =i - 5 | retranche 5 ai i 105 | i= i - j | retranche j ai i 1050 | 4 = i + 10) multiplie i par 10 i 5250 |i =i * 5 | multiplic i par j i 525 | i= i / 10 | divise i par 10 i 105 | i= i / 5 | divisei parj i 5 | 4 = 4 % 10| iregoit le reste de la division entiére de i par 10 opérateurs de masquage i 8 O[i=ik 8] ET dei acs il 8 8)i-il 8] OUdeiavecs is 4 ox0C | i = i > 4 | OU exclusif dei avec 4 opérateurs de décalage Tea OxCO [i = i <4 | décale i A gauche de 4 positions ips Ox0C | 4 = i >> 4 | décale i a droite de 4 positions Opérateur ternaire len existe qu'un seul dont la syntaxe est la suivante expel ? expr? : expr expr1 est d’abord évaluée Si sa valeur # 0, expr2 est évaluée et définit la valeur de 'expression conditionnelle, expr3 rest pas évaluée, Sinon expr3 est évaluée et définit a valeur de l'expression conditionnelle, expr2 pas évaluée, Ainsi expression max = a >= b 2a: b permet de mémoriser dans la variable max la valeur maximum des deux valeurs contenues dans les variables a etb. Tableau des priorités des opérateurs Le tableau suivant donne la priorité des opérateurs en langage C. II faut le lire de haut en bas ‘et de la gauche vers Ia droite pour conn: par des parenthéses ouvrantes et fermantes) re les opérateurs prioritaires (sau si ils sont séparés Introduction & la programmation structurée Classe Poperat ‘Operatour(s) Associative Parenthésage oO ‘de gauche a droite ‘Appel de fonction | O ‘de gauche & droite Suffixes ou o Unaines bees oT de droite & gauche prefixes sizeot sizeof ‘Changement de type | (type) de droite & gauche Multiplicatits s/h de gauche a droite ‘Addit _ ‘de gauche a droite Décalages <> ‘de gauche & droite ‘Comparaisons <= ‘de gauche & droite Fgalites = ‘de gauche a droite cet bit A bit & ‘de gauche & droite ‘ou exclusif bit & bit | ~ de gauche & droite ‘ou bit A bit T ‘de gauche & droite et Togique ‘de gauche A droite ‘ou Togique TT ‘de gauche & droite Condition 7 de droite a gauche ‘Aifectations = ‘de droite & gauche be ‘i de gauche & droite Expressions Une expression est une suite syntaxiquement correcte d'opérateurs et dopérandes. Elle retourne donc une valeur (I'instruction, elle, détermine une action a faire). Toute expression posséde au moins 2 attributs : un type et une valeur. Exemple : Si est un entier de valeur 10, alors 2*i+3 a pour type entier et pour valeur 23 Lvalue (cas des variables en général): représentent un emplacement mémoire. La valeur de expression est alors définie comme le contenu de cet emplacement. Une Ivalue posséde 3 attributs : adresse, type, valeur. Ex: a,b, ti Rvalue (cas des valeurs en général): ont un type et une valeur, mais pas d'adresses (disponible). Ex: 24a+3, 12; (On peut aussi tomber sur des expressions avec effet de bord, qui modifie des éléments. Ex: at+ (retourne a et remplace a par a+1), y = 2 (retourne 2 et donne a y la valeur 2). Conclusion Vous voici familiers aux types et opérateurs, il ne reste qu’a voirles entrées sorties 6lémentaires pour écrire un premier programme simple en C. 24 Unite |. Types, operateurs et expressions, lecture et ecriture Evaluation Dans les expressions suivantes, enlever les parentheses superfiues +5) a= (ay) +2 a= Gey) (a 25 Introduction & la programmation structurée Pour l'affichage: printf Permet d’envoyer vers le fichier courant de sortie (notamment I'écran), des informations formatées. Syntaxe : printi{, v1, v2, ..., vn); ou printf{chaine); - est une chaine de caractéres contenant du texte et des spécificatours de format (% suivi d'un caractére de conversion). ex: print{{"i vaut : %d’, i); printi("x = %d\t y = 96f\n" x y); print{("Bonjour a tous! Pour la saisie: scanf Permet de recevoir des informations, selon un format précisé depuis le fichier courant des entrées. Syntaxe : scanfi, 81, Bv2, ..., avn) ex: scanf("%d%d%!", Ba, &b, Be Lopérateur d’adresse & doit étre mis devant le nom des variables a saisir (en effet scanf a besoin de l'adresse des variables) sauf pour les variables de type chaines de caracteres (cf. tableau de tous les formats sur diapo suivante) Le tableau suivant donne les formats d’affichage pour les différents types déja vus (ainsi qu'un que nous découvrirons plus tard ; les chaines de caractéres). ([Aéciaration T [ feritre [format externe—]) ant ti printt Ole aseimal amet eines (Zo fetal snes primes (he hexadecimal sunsigned int i; rants Aseimal short ji primes at ‘eit short 3 printf (to ‘octal Short 32 feane C9 eames (he hexadecimal unsigned short j; | scant ("ik prames(o Asim Tong ks ‘Scant hid" ,gx) 3) prante i ‘ecm tong seant iio" ek) ; | print fetal ong scant Czas") ; | prantt (ae A) ; | hexadécimal unsigned tong x: | seane"au" a: | pranee(~au" i) ; | decimal Float 1: Scant CHa) 7] prante CH point decimal float 13 Seane Cer ian); | prints (Ze! float 13 primes Oe cant print Ol point decir sseant Cas Deane (he exponentiele prints Ct la plas courte primes OL pout deel prints (hLe" ia); | expo 5 prince ig"); | la plus courte ‘dae de caractéves Autres fonctions et macros usuel getchar(): renvoie le caractére suivant du fichier courant des entrées (clavier). Sila fin du fichier est rencontrée, la valeur EOF (Ctrl+D dans Unix) est retournée. 26 Unite 1. Types, operateurs et expressions, lecture et ecriture char ¢; c= getcharQ; putchar(c): envoie le caractére précisé en paramétre dans le fichier courant de sortie (écran) gets(s): lt une ligne a partir de entrée standard et la mémorise dans une zone réservée par Vappelant en la complétant par \0" char s[20}; gets(s); putsls): écrit sur la sortie standard la ligne fournie en paramatre, Le caractére “Wn est automatiquement ajouté aprés le dernier caractére de la ligne. Conclusion Les entrées sorties pourront étre détaillées dans les chapitres suivants. Ici, seules les fonctions scanf ot printf ont été présentées mais d'autres seront vues pour manipuler les entrées sorties de maniére générale comme des fichiers. Evaluation Réaliser un programme contenant une fonction main) qui réalise les écritures suivantes écrire le caractére «a; crire la chaine de caractéres «bonjour» ; écrire hentier 32567 dans les formats décimal, hexadécimal, octal et non signé; crite le flottant 3.1415927 dans les formats exponentiele et variable. Errand Vous étes a la fin de cette activité. Vous avez tout en main pour écrire un premier programme en C. Un bon IDE devrait vous permettre de programmer en C. Pour le choix de IIDE veuillez vous référer au site : http://en.wikipedia.org/wiki ‘Comparison_of_integrated_development_environments © Evaluation de l'units Verifiez votre compréhension! Devoir sur table 1 Directives Répondre aux questions posées, 'évaluation dure 2h. Ea Introduction & la programmation structurée ‘Systeme de notation Le baréme est indiqué & la suite des questions Evaluation Question 1 (2 pts) (On considére les expressions suivantes ntk+m/5+12 N+8 tise] =5 S=tlir+] fie] th] Dire quelles sont les expressions correctes et celles incorrectes. Evaluer les expressions correctes en donnant des valeurs aux variables. (On supposera que n, k, m et x sont des entiers et t un tableau d’entiers Question 2 (2 pts) Soit x et y deux variables de type double et a et b deux variables de type int. Trouver les erreurs dans les instructions suivantes 1, printf («La valeur dea est %d\n»); 2. printt («x/y = %d\n», x/y); 3. printf (°x= %IF\n", x); 4, scanf{«%bb», x); 5. scanf(«%d%do, a, b); 6. scanf(a%d, %d>, a,b); Question 3 (3 pts) Quelles sont les valeurs lues dans les variables n et p (de type int), par instruction suivante scanf (4%d%d> , &n, &p) 28 Unite 1. Types, operateurs et expressions, lecture et ecriture Torsqu’on lui fournt les données suivantes (le symbole © représente un espace et le symbole @ représente une validation) a) 25345@ b) A2534@ a a4ns@ Question 4: opérateur ternaire (4 pts) En utilisant 4 entiers i,j, ket |, aveck initialisé & 12 et 1a 8, écrire le programme quilit les valeurs de i et, écrit la valeur de k si est nul, écrit la valeur de i + | sii est non nul et] est nul et écrit la valeur de i + j dans les autres cas. ‘Question 5 (4 pts) Soient les déclarations suivantes : intn = 5,p=9; intq ; float x; Quelle est la valeur affectée aux différentes variables par chacune des instructions suivantes q=nn; x=(p+05) /n; int) (p+ 05) /n; gent (p>n?n:p); gent (pen?nip); Question 6 (6 pts) Quels résultats fournira ce programme : 4# include mainQ( Introduction & la programmation structurée int, pas a [* cas 1*/ g=ne+>p||pet!=3; printi(«A :n = %d p = %d q = %d \n>.n, p, a); n=5;p=25 /* cas 2*/ q=nt+.n, pa); 5 [Peas4*/ Q= +n == 6 && +p ==3; printf[«D :n = %d p=%dq=%d \non, p, @); , ee Les lectures et autres ressorces de cette unité se trouvent au niveau des lectures et autres ressources du cours. 30 Unite 2. Instructions de controle, fonctions Unité 2. Instructions de contréle, fonctions introduction a l'unité Dans cette unité, vous découvrirez la syntaxe des différentes instructions de contrdle existant ‘en C ainsi que la notion de fonctions et de structure d'un programme en C avec différents modules. ©oobjectits de l'units Ala fin de cette unité, vous devriez étre capable de: * Ecrire un programme avec une instruction de contréle + Répéter, sélectionner et sauter une suite d'instructions + Ecrire une fonction qui est un sous programme + Définir une fonction recursive et programmer en ligne de commande + Constituer un programme de maniére modulaire 31 Introduction & la programmation structurée [EZlActivités d’apprentissage Activité 1 — Les instructions de contréle Introduction dle. Elle vous permettra de découvrir les Cette activité introduit les instructions de con instructions alternatives, répétitives et celles de branchement, Au sortir de cette activité, vous serez capable d’écrire des programmes plus complexes. Détails de l'acti Découvrir les instructions alternatives Les instructions alternatives permettent de réaliser des tests et d'exécuter des parties de code différentes suivant le résultat de cos tests. Premiére instruction A ifelse Syntaxe if expression ) instruction if( expression ) instruction1 else instruction Ex d'expressions: if(a==b); J/ vrai sia est égal ab if(@=b); // vrai sib est différent de 0 if (c= getchar(); J/ vrai si getchar ne retourne pas ‘\0" if: // vrai si cest different de 0 Ex avec instructions: if(a!=0) b= 1/a; if (¢>='0' && c <='9') printifechiffre”); else printi(“autr Deuxiéme instruction » switeh 32 Unite 2. Instructions de controle, fonctions Syntaxe switch (expression) { case valuel : instruction] break; case value? : instruction? break; case valueN : instructionN break; default : instruetionN+1} ‘expression est une valeur enti@re * les valeurs des case sont des constantes entiéres ; Découvrir Vexécution se fait 8 partir du case dont la valeur correspond a l'expression. Elle s‘exécute en séquence jusqu’a la rencontre d'une instruction break ; les instructions qui suivent la condition default sont exécutées lorsqu’aucune constante des case n'est égale & la valour retournée par ‘expression ; exécution a partir d’un case continue sur les instructions des autres case tant qu'un break n’est pas rencontré ; plusieurs valeurs de case peuvent aboutir sur les mémes instructions ; les instructions répétitives Les instructions répétitives permettent de réaliser des tests et de répéter des parties de code suivant le résultat de ces tests. Premiére instruction for Syntaxe for( exp1 ; exp2 ; exp3 ) instruction expression expr1 est réalisée une seule fois lors de lentrée dans la boucle, c'est expression dinitialisation ; expression expr2 est la condition d'exécution de I'instruction, Elle est testée 8 chaque itération, y compris la premiére. expression expr3 contréle 'avancement de la boucle. Elle permet de maniére générale de calculer la prochaine valeur avec laquelle la condition de passage va atre retestée 33 Introduction & la programmation structurée Exemples: for (i= 0;i< 10; i++) printf("%d", i); // affiche de 0 jusqu’a 9 for (i= 0, j= 10;4 while Syntaxe while( expression ) instruction La boucle while répate hinstruction tant que la valeur de bexpression est vraie (différente de Correspondance entre for et while : for(expls exp2; exp3) expt; instruction while(exp2) ( est équivalenta | instruction exp; ) Ex for (c='aie while(e-<="'2) putchar(c); ( estéquivalenta | putchar(«); +h Troisiéme instruction » do..while Syntaxe 34 Unite 2. Instructions de controle, fonctions do instruction while( expression ) Alinverse du while, do while place son test en fin d’exécution, d’ou au moins une exécution Ex dot printf("donnez un nb > 0 scanf("%d", &in}; } while (n <= 0); Terminer avec les instructions de branchement continue Lin uction continue est utilisée en relation avec les boucles. Elle provoque le passage a l'itération suivante de la boucle en sautant a la fin du bloc. Elle provoque donc la non exécution des instructions qui la suivent & lintérieur du bloc. break Il permet de sortir d'un bloc d'instruction associé & une instruction répétitive ou alternative. Il re sort que d'un niveau d'imbrication Exemple dans un programme: int n, N=10; do {print{("Donnez un nbre positif"); scanf("%d’, &n); if (n == N) break; if (n <0) { printf(‘le nbre doit étre positif”); continue; } printi(’Son carré est : d\n", n* n); }while(n); Les instructions de branchement dans les boucles La figure suivante donne, de la gauche vers la droite Impact des instructions de banchement sur les boucles for, while et do..while 35 Introduction & la programmation structurée ‘astcto ‘nstneto inset Faw return return expression; return; instruction return provoque la terminaison de lexécution de la fonction dans laquelle elle se trouve et le retour & la fonction appelante. Cette instruction peut étre mise 8 tout moment dans le corps d'une fonction ; son exécution provogue la fin de celle-ci, Exemple avec une fonction (a voir dans l'activité suivante}: int chercher(int x, int t() int N) { inti; return <1; 36 Unite 2. Instructions de controle, fonctions goto (a éviter) goto etiquette; etiquette: instruction goto permet dialler n‘importe ot Fintérieur d'une fonction. Son utilisation systématique nuit ala lisibiité des programmes. Toutefois, il permet de sortir de plusieurs blocs imbriqués. Il est relié & une étiquette qui est une chaine de caractéres suivie de Exemple dans boucles imbriqui for goto sortie; Conclusion Vous étes maintenant prét 8 aborder des programmes un peu plus complexes grace aux instructions de contéle qui comme leurs noms lindiquent permettent de gérer le cours d'execution du programme. Les évaluations suivantes vont renforcer votre utilisation des instructions de contréle. Evaluation + Ya'll des erreurs commises dans les instructions suivantes 37 Introduction & la programmation structurée - if (a (4* plus(xy)); return 0; ) Quand une fonction ne renvoie pas de valeur, on le précise & la fois dans I'interface et dans sa déclaration par void Di inguer le passage par adresse du passage par valeur En C le passage des paramétres se fait toujours par valeur. La fonction appelante (dans notre exemple la fonction main) fait une copie de la valeur passée en paramatre ('entier j et passe cette copie & la fonction appelée (la fonction chg) 8 l'intérieur d'une variable créée momentanément dans l'espace mémoire. Introduction & la programmation structurée Exemple: include void chg(int ) { ines printf(«Paramétre incrémenté a: %d\n»,j); // affiche 1 ne main( { intj-0 che(j); print((«Paramétre non incrémenté: %d\n»,j}; // afiche 0 return 0; + Passage par adresse: Le langage C ne prévoit aucun mécanisme de passage par adresse. Celui ci doit étre programme explicitement en utilisant comme argument un pointeur vers les variables. Attention: Ceci est valable pour les variables de type de base, de type pointeur, struct ou union, On verra le cas particulier des tableaux. Comment utiliser un argument comme pointeur vers une variable? Pour rappel (et par anticipation), un pointeur est une variable dont la valeur est I'adresse d'une autre variable. Passer un pointeur vers une variable comme argument, revient & donner 8 la fonction appelée l'adresse (et non la valeur) de la variable et ainsi la possibilité de pouvoir la modifier & souhait. Opérateur d'adressage et de déréférencement: & et * si ad=&a; alors *ad retourne la valeur a Exemple 1 Modification d'un paramétre #include void chg(int*}) { /{ passage par adresse de j Cis // mise a jour effective de la valeur de j Unite 2. Instructions de controle, fonctions printf{«Paramétre incrémenté a: %d\n»,*j); // affiche 1 I int main() { int chg(&i); //on donne ‘adresse de jAl'appel printf{«Paramétre incrémenté : %d\n",); // affiche 1 return 0; J Exemple 2 : une fonct tilisée et qui utilise le passage par adresse scanf("%d", &i) + Cas des tableaux (le nom des tableaux sont déja des adresses...) Le nom d'un tableau d’éléments de type T est considéré comme ayant pour type « adresse dun T » et pour valeur adresse du premier élément du tableau. II n'est donc pas nécessaire pour les tableaux de faire un passage par adresse, puis que le nom des tableaux sont des adresses. Dans la déclaration d'un argument formel t de type « tableau de T » indication du nombre d’éléments de t est sans utilité Les expressions type t] et type *t sont tout a fait équivalentes La fonction pourra étre indifféremment appelée avec un tableau ou un pointeur pour argument effectif int longueur( char s[80] }; int longueur( char s{]); int longueur ( char *s) ; peuvent toutes servir dans la définition ou la déclaration d'une fonction de calcul de longueur d'une chaine de caractéres. Exemple: char* s; scanf("%s",s); 45 Introduction & la programmation structurée Utiliser les arguments de la fonction main int main(int arge,char *argv{]) Les noms argc et argv sont des noms mnémoniques. Ils signifient argument count et argument values. La fonction maind dispose donc toujours de paramétres passés par environnement systéme. Parmi ces paramétres on a un entier et un tableau de pointeurs sur des caractéres qui vont nous interesser. argc: contient le nombre d'arguments qui ont été passés lors de l'appel du binaire exécutable (nombre de mots dans la igne de commande inclus le nom du binaire) ; argv : contient les arguments de la ligne de commande au niveau du shell. Ces arguments sont découpés en chaine de caractéres et constituent le tableau argy. Ily a toujours au moins un argument qui correspond au nom du binaire exécutable appelé ; Exemple sinclude int main (int arge, char "argv{) ( inti printf(«Nous avons Yd arguments: \nnarge); for(i=0; icarge; i++) printf("argument 9d == %s \n’, 1, argv[i); return 0; } sion sauvegarde ce programme avec le nom exomain.c, execution en ligne de commande de la suite de terme : exomain essai passage parametres provoquera le résultat suivant: Nous avons 4 arguments argument 0 == exomain argument 1 == essai argument 2 == passage argument 3 == parametres 46 Unite 2. Instructions de controle, fonctions Ecrire un programme modulaire Enjoux d'une programmation modulaire Nécessité de se fixer un certain nombre de régles oécriture pour les programmes de taille importante destinés 8 étre utilisés et maintenus par d'autres personnes. Pour cela, il est nécessaire de fractionner le programme en plusieurs fichiers sources, que I'on compile séparément, Trois principes essentiels doivent guider I'écriture d'un programme C: La factorisation du code; une méme portion de code & plusieurs endroits du programme n’est pas souhaitable. Utiliser systématiquement des fonctions. II ne faut pas éviter de définir une multitude de fonctions de petite taille. La fragmentation du code; découper un programme en plusiours fichiers. De plus, cette régle permet de réutiiser facilement une partie du code pour d'autres applications, Comment s'y prendre ? Placer une partie du code dans un fichier en-téte (ayant l'extension .h) et inclure dans le fichier contenant le programme principal a l'aide de la directive #inclide»nomfichierh». Par exemple, pour écrire un programme qui saisit deux entiers au clavier et affiche leur produit, on peut placer le fonction produit dans un fichier produith, et inclure dans le fichier main.c. a7 Introduction & la programmation structurée main produit:h include int produit(int, int); include int produit{int a, int b) { include "produith" return(a*b); int main(void) { } inta,b, scanf{«Qd» 8a); scanf(«Qd»,&b); c= produit(a,b); printf(«\nle produit vaut %d\n»,0); return EXIT_SUC 1 gles de compilation Unités de compilation Un fichier h n’est pas une unité de compilation Un fichier .c est une unité de compilation qui inclutle fichier .h Regle de base Compiler un module (le fichier .<) avant toute unité utilisatrice Modification du corps d'un module Recompiler le fichier .c du module Edition des liens sans recompiler les unités utiisatrices Modification de interface d’un module Recompiler le fichier .c du module Recompiler toutes les unités utilisatrices Un autre exemple d’organisation modulaire est présenté dans la figure suivante. 48 Unite 2. Instructions de controle, fonctions | faut remarquer ic utilisation de tris fichiers au lieu de deux comme l'exemple précédent (oi la définition et la déclaration de la fonction produit étaient dans le méme fichier produith). Il est done conseillé de séparer les définitions des déclarations et dien fare deux fichiers séparés (tabio.h et tabio.c par exemple). Void saisirTableau(int *t, int n): void afficherTableau(int *t, int n); ‘tabio.c void triSelection(int *t, int n): #include "tabio.h’ #include main void saisirfableautint +t int n) {|| define N10 #include " tabio.h" Void afficherlableau (int +, int n) Dora { saisirTableau(t, N); triSelection(t, N); Void triSelection(int *t, int n) { } afficherfableau{t, N): } Module tabio.c Module principal Conclu: Voila, vous connaissez maintenant les fonctions en C ainsi que le programmation modulaire. Nihésitez plus & écrire vos programmes sous forme de fonctions méme sills vous paraissent simples. Pour la programmation modulaire, les exercices viendront dans les chapitres suivants avec la découverte des structures de données plus complexes (tableaux, pointeurs, structures, ). Les évaluations suivantes vont juste vous permettre de poser les bases diutllisation des fonctions. Essayez de les coder tous pour vous faire une idée de leur exécution. Evaluation Ecrire une fonction qui recoit en argument 2 nombres flottants et un caractare et fournit le résultat correspondant a 'une des 4 opérations appliquées 3 ses deux premiers arguments, fen fonction de la valeur du dernier (addition avec ‘+’, soustraction avec ‘~, multiplication avec '*’, division avec ‘/", tout autre sera considéré comme une addition). Utiliser ensuite cette fonction dans un main pour afficher le résultat de toutes les opérations entre deux flottants. 49 Introduction & la programmation structurée > Qu'affiche le programme suivant # include void f1 (int, int*b) (a=*b;) void £2 (int*b, inte) {*b=c; } void £3 (int*a, inte) (*a=c;) int main () ( int v1, v2,v3; vL=5;v2= ivB=10; printf(«Au départ: v1 = %d v2 = 9d v3= %d\n-«, v1, v2, v3); F(v1,&v2) ; printf(«Apres f1 : v1 = 96d v2 = %d v3 = %d\n«, vi, v2, v3); 12 (8v3,"(8v1)); printf («Apres £2 : v1 = %d v2 = %d v3 = %d\n«, v1, v2,v3); 13 (&v3 v2); printf («Apres f3 : v1 = %d v2 = %d v3 = %d\n «, V1, v2, v3); , + Ectire une fonction qui affiche la moyenne d'une suite d’entiers positifs entrés au clavier. On arrétera la saisie quand le nombre -1 est entré, comme dans l'exemple suivant Entrez un entier positif: 5 Entrez un entier positif: 2 Entrez un entier positif: 3 Entrez un entier posit: -1 La moyenne de ces 3 entiers vaut 3.333333, eae td Vous venez de voir les instructions de contréle pour gérer le cours d’execution d'un programme, ainsi que l'organisation en fonctions pour factoriser le code et permettre sa réutilisation. Vous avez maintenant tout ce qu'il faut pour démarrer un bon projet en langage Cc. Les chapitres suivants viendront juste pour rajouter des structures de données & implémenter en plus (tableaux, pointeurs, structures, fichiers). 50 Unite 2. Instructions de controle, fonctions Cos structures permettront alors de modéliser des problémes de plus en plus complexes Bonne continuation [&Y Evaluation de l'unité Verifiez votre compréhension! Devoir sur table 2 Directives Répondre aux questions posées, évaluation dure 2h. Systéme de notation Le baréme est indiqué 3 la suite des questions Evaluation Question 1 (3 pts) Ecrire un programme qui calcule les solutions d'une équation du second degré, a X2 + bX +c=0, ota, bet c sont trois entiers entrés au clavier. Question 2 6 pts) On considére un texte formé de caractéres composés uniquement de lettres et despaces. Ce texte est lu au clavier caractére par caractére etil se termine parle caractére ‘Un mot est une suite de lettres délimitée par des espaces ou par les extrémités du texte. Ecrire un programme qui permet de saisir un texte caractére par caractare et qui affiche ensuite un message indiquant si le texte est un tautogramme, c'est-a-dire si tous les mots du texte commencent par la méme lettre. Exemple : le lion lape le lait lentement NB : Les espaces superflus devront étre éliminés. st Introduction & la programmation structurée Question 3 (4 pts) Ecrire une fonction qui ne renvoie aucune valeur et qui détermine le chifre le plus petit et le chiffre le plus grand d'un entier positif. I faudra done prévoir 3 arguments : lentier posit, minchiffre, maxchiffr. Question 4 (4 pts) Une maniére originale pour calculer le carré d'un nombre entier positif N est d'effectuer la somme des N premiers nombres impairs. Exemples pourn=4;16=1+3+5+7; pourn=5;25=1+3+5+7+9 Définissez une fonction qui ne retourne rien et calcule le carré d'un nombre entier positif en utilisant la méthode ci-dessus Question 5 (4 pts) Ecrire une fonction void ordrelnverse() qui affche & I’écran (sans utiliser de tableau) des entiers posiifs lus au clavier dans ordre inverse ot ils sont entrés, La suite sera terminée par une valeur négative. ee Les lectures et autres ressorces de cette unité se trouvent au niveau des lectures et autres ressources du cours. 82 Unité 3. Tableaux, pointeurs et chaines de caractéres, structures, unions e énumérations Unité 3. Tableaux, pointeurs et chaines de caractéres, structures, unions et énumérations introduction a l'unité Dans cette unité, vous découvrirez les types structurés en langage C. lly sera beaucoup question de représenter et d'utiliser des données qui seront de type plus complexes que les types de base vus jusquiici ©obijectifs de units Ala fin de cette unité, vous devriez étre capable de: Ecrire un programme avec des types composés Manipuler des tableaux Utiliser des pointeurs Effectuer une allocation de la mémoire Definir des structures dynamiques 53 Introduction & la programmation structurée E=lactivités d'apprentissage Activité 1 — Tableaux et pointeurs Introduction Cette activité introduit les types tableaux et pointeurs, activité suivante reviendra sur leur équivalence. Ic, il sera question de les définir et de les utiliser séparément dans des programmes simples. Détails de l'acti Definir des tableaux et pointeurs, Les tableaux Un tableau est un ensemble fini d’éléments de méme type, stockés en mémoire a des adresses contigués. La décleration d'un tableau a une dimension se fait de la avec la syntaxe type nom-tableau[nbr-ele]; Exemple: la déclaration int tabl10}; indique que tab est un tableau de 10 éléments de type entier (int). (allocation en mémoire d'un espace de 10 x 4 octets consécutifs, espace est désigné pat tab). 01 01 51 01 =0i9) Pour accéder & un élément du tableau on applique 'opérateur d'indexation []. Ces éléments sont numérotés de 0a nbt-ele - 1 Initialisation des tableaux On peut intialiser un tableau lors de sa déclaration par une liste de constantes de la fagon 54 Unité 3. Tableaux, pointeurs et chaines de caractéres, structures, unions et énumérations type nom-ductableau[N] = {constante-1,constante-2,.,constante-N}; Si le nombre de données dans la liste d'initialisation est inférieur a la dimension du tableau, seuls les premiers éléments seront initialisés. Les autres éléments seront mis a zéro si le tableau est une variable globale ou une variable locale static. Exemple : int t(10] = (9,8,7,6,5.4,3,2.1.0}; Initialisation par saisie manuelle des define N10 int main() {int t{N]; int i for (i= 0;1 = &tabf0}; p~) printf" od \n"*p); ) 58 Unité 3. Tableaux, pointeurs et chaines de caractéres, structures, unions et énumérations Si p et q sont deux pointeurs sur des objets de type type, l'expression p -q désigne un entier dont la valeur est égale a (p - ql/sizeofitype) Comprendre Avant de manipuler un pointeur, il faut Iintialiser. Par défaut, la valeur d'un pointeur est égale a une constante symbolique notée NULL (stdio.h). Le test JUL permet de savoir si le pointeur p pointe ou pas vers un objet. On peut initialiser un pointeur p en affectant p adresse d'une autre variable (ce qu’on faisaitjusqu’a présent) lest également possible d'affecter directement une valeur 8 *p. Mais il faut d’abord réserver a p un espace-mémoire de taille adéquate. adresse de cet espace-mémoire sera la valeur dep. Cette opération consistant & réserver un espace-mémoire pour stocker objet pointé s‘appelle allocation dynamique La fonction malloc La fonction malloc de la librairie standard stdlib.h a la syntaxe suivante: malloc(nombre-octets) malloc retourne un pointeur de type char * ou void * pointant vers un objet de taille nombreoctets octets. II faut donc convertir la sortie de la fonction malloc a l'aide d'un cast pour initialiser un pointeur de type différent de char *, argument nombre-octets est souvent donné a l'aide de la fonction sizeof) qui renvoie le nombre d'octets utilisés pour stocker un objet. Hinclude int *p; p= (int*)malloc(sizeofint)}; //ou bien (int*)malloc(4}; moins portable ~ Initialisation d'un pointeur avec malloc ‘include include main() ( int 59 Introduction & la programmation structurée int*p; printf(«valeur de p avant initialisation = %6ld\n»,p); // affiche 0 p= (int*)malloc(sizeof{int)); printf(«valeur de p apres initialisation = %ld\n»,p); // ex : 5368711424 "pe printf(«valeur de *p = %d\n>,*p}: //alfiche 3 } = initialisation sans malloc (affectation directe avec l'adresse d’un objet existant) #include ‘include main(){ inti= int*p: printf{«valeur de p avant initialisation = %ld\n»,p); // affiche 0 printf(«valeur de p apres initialisation = %ld\n»,p); // ex. 4831836000 printf(«valeur de *p = %d\n»,*p}; J/affiche 3 } = Acetenir La fonction malloc permet également d’allouer un espace pour plusieurs objets contigus en mémoire (penser aux tableaux!) include include main() { 60 Unité 3. Tableaux, pointeurs et chaines de caractéres, structures, unions et énumérations p= (int*)malloc(2 * sizeof(int)); i (ped) printf(ap = 96ld \t*p = 96d \t p+ = 9ld \t*(p+) = %d \m>,p,*p.p+1,"(p+1)); d On a ainsi réservé, & I'adresse donnée parla valeur de p, 8 octets en mémoire, qui permettent de stocker 2 objets de type int. Le programme affiche p = 5368711424 > 368711428 *(p+1) = Libérer espace alloué Lorsque l'on n‘a plus besoin de I'espace-mémoire alloué dynamiquement il faut libérer cette place 8 baide de hinstruction free free{nom-du-pointeur); A tout malloct) doit étre associée une instruction de type freed Conclusion Voici donc les premiers éléments a savoir sur les tableaux et pointeurs ainsi que I'allocation de la mémoire avec le fonction malloc), Un peu d’exercices va nous permettre d’appliquer ce qui vient d'étre vu. A vos compllateurs. Evaluation Utiliser la programmation modulaire vue dans la section précédente pour écrire un programme avec les fonctions qui permettent de retourner le maximum d'un tableau a une dimension den nombres entiers, retourner la somme des éléments d'un tableau d’entiors passé en paramétre, dlafficher toutes les valeurs qui apparaissent au moins deux fois dans un tableau de renvoyer 1 siun élément x est dans un tableau T et 0 sinon. Faites une trace a la main du programme qui suit. Dites ce quill e supposé afficher. Vous pouvez vérifier votre solution en allant exécuter ce programme a 'aide de votre compilateur 6 Introduction & la programmation structurée void fet (int, int b); void fert(int aint | void fer2{ine® per, ine* void fet2(int* ptrt, int* ptr2); » pura) int main(void) ‘ ‘ \ ine pert; ine* pers; inea=3 ine* per; ine per; imb=a; ptrl = Ba; ptr3 = ptr2; seta ptr? = &b; ptrt= ptr; pert spied =*ptri + *ptr3; printf("%ed %d \n', a b); *ptr2 = *ptr2 + *ptrd; fet2(Ba, &b); puresvpuee' print{(“%d %d \n a,b); , , return 0; } ~ Quels résultats fournira ce programme ‘include main() ‘ int © (3) 7 int i, 35 int © adt 7 for (1n0, Jo0 ¢ <3; t+) LA] = Se + 4 wa for (ind j ic3 7 i6+) printé ("ed ", tLL1) 7 maw print (*\n") ; for (in0 ; icd ; ie+) printe ("Md") (tei) way printé (*\n") 5 for (adt printé ("\n' fp adt main() { int (4) = {10, 20, 30, 40) ; int * ad [4] 7 int i 7 for ( ica; itt) adfi] = tei may for (i=0 ; i main) { inti; char *ch; chaine = uchaine de caracteres»; 65 Introduction & la programmation structurée for (i 0; *ch !="\0's i++) ches; printf{(«nombre de caractéres = %d\n»,); } Manipulations de chaines, fonctions usuelles //plusutilisées _ printf, scant, gets, puts char lieu[25]; char * s; int jour, mois, annee; printf(« Donner le nom: \n»); gets (8), printf(« Entrez lieu et date de naissance : \n» ); scanfle %s 9d %d %d «lieu, &jour, &mois, &annee); // les plus utilisées. stropy, trea, stremp, strlen Copie: s1 = 2 ne copie pas la chaine s2 dans st; utiliser plutot_ void strepy(char *s1,char's2) Concaténation : void streat(char “st, char *s2) Comparaison : int stremp(char *s1, char *s2) =0 sist =s2, Osisl>s2 Longueur : int strlen(char *s1) —nbre de caractéres de la chaine sans le caractére nul atoils) - retourne la valeur numérique représentée par s comme int atolls) - retourne la valeur numérique représentée par s comme long atoffs)- retoure la valeur numérique représentée par s comme double 66 Unité 3. Tableaux, pointeurs et chaines de caractéres, structures, unions et énumérations Conclusion Nous venons de terminer cette activité surla correspondance entre tableaux et pointeurs, ainsi que sur les chaines de caractares, Vous devez maintenar capables de traiter rimporte quel probléme faisant intervenir les pointeurs. Exergons nous un peu d'ailleurs. a Evaluation (On veut écrire un programme qui comporte un ensemble de fonctions permettant de manipuler des matrices définies comme suit: float **m ; Ecrire: Une fonction de création de la matrice. Cette fonction fait l'allocation dynamique de la matrice a partir d'un nombre de lignes et d'un nombre de colonnes spécifiés, et ses éléments 80; tialise tous tune fonction qui permet de détruire la matrice ; une fonction d'affichage d'une matrice; une fonction qui permet de faire le produit de deux matrices ; Ecrire ensuite une fonction main) qui crée deux matrices, affecte des valeurs & leurs différents éléments, calcule leur produit, affiche les matrices de départ et la matrice produit, et finalement détruit les différentes matrices. Ecrire un programme qui demande a l'utilisateur de lui fournir un nombre entier compris, entre 1 et 7 et qui affiche le nom du jour de la semaine correspondant (Lundi pour 1, Mardi pour 2,...). Utliser un tableau de chaine de caractéres comprenant les jours de le semaine. Ecrire un programme qui lit, en donnée, un verbe du premier groupe et qui en affiche la Conjugaison au présent de lindicatif, sous la forme Je chante Tu chantes I chante Nous chantons Vous chantez lis chantent 7 Introduction & la programmation structurée On s'assurera que le mot fourni se termine par « er » et on supposera qui s‘agit d'un verbe réqulier ("utilisateur ne fournira pas de verbe comme « manger » par exemple). Indication utiliser un tableau de sujets et tableau de terminaisons. Activité 3.3 - Strutures, Unions, Enumerations. Présentation Apri les pointeurs et tableaux, nous allons poursuivre avec nos types avancés en occurrence les structures, unions et énumérations. Ces types vont beaucoup se rapprocher des objets manipulés dans la vie courante et ils en seront plus qu‘intéressants 8 étudier. Cette activité va nous permettre de nous en approprier. Détails de activité Définir une structure Une structure est un type composé de plusieurs champs. Elle permet de se représenter un objet du monde réel, un concept, une abstraction, Par exemple une personne peut étre représentée par les caractéristiques suivantes : numéro Giidentification nationale, nom, prénom, age, sexe struct nom_de_structure { typet nom_du_champ1; type2 nom_du_champ2; type3 nom_du_champ3; typed nom_du_champ4; typeN nom_du_champ_N;} variables ; ll est possible de ne pas déclarer de variable a le définition de la structure. Il faut, dans ce cas, associer le modéle de structure 4 un nom (nom_de_structure) de maniére 4 pouvoir utiliser celui-ci pour définir des variables ultérieurement. 6 Unité 3. Tableaux, pointeurs et chaines de caractéres, structures, unions et énumérations ~ nom de structure pour déclarer des variables ultérieurement struct date { int jour, mois, annee ; hi struct date obdate; sans nom de structure pour déclarer des variables immédiatement struct { int jour, mois ; char annee[20] ; }obdate; Definitions de structures imbriquées fidefine N 2 struct Point) { struct Point2{ float x, float x{N]; floaty: int couleur, i » struct Point! pl: struct Point2. p2; struct Rectangle! { struct Rectangle? { struct Point! phg; struct Point2 pIN}; struct Point! pod int couleur, ‘ x struct Rectangle! 11; struct Rectangle2 12: Utilisation des champs des structures pIx=25; plxtt; scantle%tr, &pt.x); printile Sf» , pt); p2xl0]= 1.8; r1.phg.x = 1.7; -2.pl1].x(0] = 3.5; p2.couleur = 2; Utilisation globale Point! pt, qt: il sera également possible d’écrire plx=ply=15; q1=pt; printed %F «, qx, ql y): Se méfier avec de telles affectations lorsque les champs d'une structure sont de types pointeur, “3 Introduction & la programmation structurée Structures et pointeurs struct date { intjoury int mois; intannee; struct date *dat ; // pointeur vers une structure struct date tdate[S]; // tableau de structure tdate[0} jour = 12; tdate[2}.mois = 4; dat = &tdate[2}; dat > jour = 12; datt4; dat-> mois = 2; Passage par adresse des structures, struct date { intjour; int mois; intannee; void initjour (struct date *s, int ){ s >jourj; } maind { struct date dt; initjourl&dt,12); printi("séd ", dtjour) 70 Unité 3. Tableaux, pointeurs et chaines de caractéres, structures, unions et énumérations Redéfinition de type lest possible grace au déclarateur typedef de définir un nouveau type. typedef type-connu nouveau-type Ainsi la définition suivante : typedef int enti défini prédéfini int. Une fois cette définition réalisée, nous pouvons utiliser ce nouveau type pour in type synonyme appelé entier ayant les mémes caractéristiques que le type définir des variables. entier e1=23, e2=5, te[50] = {1,2,3,4,5,6,7 Dans le cas de la déclaration de tableaux, la taille du nouveau type se trouve aprés le nouveau nom de type. typedef int tabl10}; tab tt; Autres exemple: typedef float MATRICE[01[10}; typedef char TAMPON [80]; typedef long * PTR; utilisation de typedef permet de faciliter la définition des structures. Il est alors possible de définir un type équivalent & une structure typedef struct { intjour; int mois; annee ; } date ; et d'utiliser directement ce type. Ceci évite les répétitions fastidieuses du mot réservé struct. date vdate, obdate, *ptdate ; Opérations sur les structures Les opérations suivantes sont possibles sur les structures, Vraffectation d'une variable par une autre du méme type comme vdate = obdate ; n Introduction & la programmation structurée le retour d'une structure par une fonction comme vdate = newdate) ; le passage en argument dune structure & une fonction resul = checkdate(obdate); Définir une union Les unions permettent l'utilisation d'un méme espace mémoire par des données de types différents 4 des moments différents. union nom deunion typel nom champ type2 nom. champ2; type3 nom.champ3; typed nom,champ4; typeN nom_champN; } variables; La syntaxe diaccas aux champs d'une union est identique a celle pour accéder aux champs d'une structure. Une union ne contient qu'une donnée a la fois Vace’s 8 un champ de l'union pour obtenir une valeur, doit étre fait dans le type qui a & utilisé pour stocker la valeur. Définir une énumération Les énumérations servent 8 énumérer des constantes dans le langage C. Elles permettent dexprimer des valeurs constantes de type entier en associant ces valeurs 4 des noms. 72 Unité 3. Tableaux, pointeurs et chaines de caractéres, structures, unions et énumérations enum nom_de_énumération { énumérateurt, énumérateur?, énumérateur3, énumérateurd, énumérateurN } variables Les différents énumérateurs sont des constantes symboliques. La premigre constante est associée & la valeur 0, les constantes suivantes suivent une progression de 1. Il est possible de fixer une valeur & chaque énumérateur en faisant suivre 'énumérateur du signe égal et de la valeur entiére exprimée par une constante ; si'énumérateur suivant n’est pas associé 8 une valeur, la progression de 1 reprend a la valeur courante. enum jourouvrable {lundi, mardi, mercredi, jeudi, vendredi x, y; x= lundi; Conclusion Nous avons fini avec les structures, unions et énumérations qui permettent de modéliser des objets plus complexes que les tableaux. Elles peuver it tre combinées avec les pointeurs par exemple pour créer les listes chainées, piles, files, arbres (structures de données dynamiques) quil sera intéressant de voir accésoirement. Evaluation Soit la structure suivante struct point { chare; intx,y ) Ecrire une fonction qui regoit en argument une structure de type point et qui affiche le contenu sous la forme « Point A de coordonnées 7 4» en transmettant en argument la valeur de la structure 73 Introduction & la programmation structurée puis en transmettant en argument l'adresse de la structure montrer comment faire appel a ces fonctions au sein d’un programme. écrire une fonction qui recoit 'adresse d'une structure de type point et qui retourne une structure de méme type comportant le mame nom et des coordonnées opposées, (On souhaite créer un programme d'annuaire trés simplifié qui associe & un nom de personne un numéro de téléphone. créer une structure Personne pouvant contenir ces informations (nom et téléphone). Le nom peut contenir 32 caractares et le numéro 16 caractéres. créer une nouvelle structure qui va représenter le carnet d'adresses. Cette structure Carnet contiendra un tableau de 20 Personne et un compteur indiquant le nombre de personnes dans le tableau. exéer ensuite une fonction qui renvoie une structure Personne en prenant en argumer nom et un téléphone. rajouter une fonction qui affiche les informations contenues dans la structure Personne passée en argument. créer une fonction qui ajoute une personne dans un carnet créer une fonction qui affiche un carnet. faire un programme qui demande de saisir 5 personnes, qui les ajoute dans un carnet puis qui affiche son contenu 8 partir des étapes précédentes, faire un programme gérant un camet dadresse. créer un menu qui propose d'ajouter une nouvelle personne, d'afficher le carnet ou de quitter. Programmation modulaire (On veut manipuler un ensemble de structures et fonctions permettant de manipuler des points ou listes de points. Placez dans un nouveau fichier d’en-tte « liste.h », la définition de type et les modeles de structure suivants 74 Unité 3. Tableaux, pointeurs et chaines de caractéres, structures, unions et énumérations typedef struct point | typedefstruct place | typedef struct liste { { { intx; POINT telement; PLACE *courant; //Pointeur courant inty; struct place * suivant; PLACE *debut; // Pointeur début } POINT; 4} PLACE; }LISTE ; Déclarez et définissez respectivement dans les fichiers « iste.h » et « lste.c » (fichier source & créer) les fonctions de création et de manipulation de points et de listes suivantes POINT* construire_point(intx, inty) ; void detruire_point(POINT *pt); void _afficher_point(POINT *pt) : PLACE * construireplace(POINT *pt) ; LISTE * liste vide( ; LISTE * ajouter_point(POINT *pt, LISTE *pl) ; void detruire Liste(LISTE *pl) ; void init(LISTE *pl) ; POINT * prochain(LISTE *pl) ; int existe(LISTE *pl) ; void afficher_liste(LISTE *pl) ; Elles permettront respectivement de construire un point partir de coordonnées «x» et«y», de détruire un point, dafficher un point, de construire une place a partir d'un point, de créer une liste vide, dajouter un point une liste (pour cela, il faudra construire une place & partir d'un point et Vinsérer en début de liste), de détruire une liste, d initialiser le parcours d’une liste, 75 Introduction & la programmation structurée d'obtenir le prochain élément a traiter, de tester sil reste des éléments a traiter, d'afficher la liste, Définir dans le fichier « main.c » une fonction « main » dans laquelle vous allez faire appel aux fonctions déja définies. Pour cela, vous allez créer une liste vide, ajouter un certain nombre de. points que vous aurez construits, afficher la liste et finalement la détruire. Pea ed Vous venez de voir le chapitre sur les tableaux, pointeurs et chaines de caracteres, structures, unions et énumérations. Vous étes maintenant bien avertis sur les données en programmation. Y Evaluation de I'unité Verifiez votre compréhension! Devoir sur table 3 Directives Répondre aux questions posées, 'évaluation dure 2h. ‘Systéme de notation Le baréme est indiqué a la suite des questions Evaluation Question 1 (10 pts) Ecrire un programme permettant d'effectuer un ensemble d'opérations sur une chaine de caractéres quelconque saisie & partir du clavier. Ce programme est constitué d'un menu comportant le choix de l'opération & effectuer. Les opérations sur cette chaine sont les suivantes fonction saisir: elle lit une chaine de caractares et retourne cette chaine ; fonction afficher : affiche la chaine argument ; 76 Unité 3. Tableaux, pointeurs et chaines de caractéres, structures, unions et énumérations fonction inverse : inverse la chaine argument (elle la modifie donc) ; fonction mots : compte le nombre de mots de la chaine. On considére le caractére “ (blanc) comme le caractére séparateur de mots. Il peut y avoir plusieurs blancs consécutifs dans la chatne. Aprés chaque opération, le retour au menu s‘effectue aprés l'affichage du message « Frappez une touche pour revenir » Question 2 (5 pts) Ecrire un programme qui affiche le signe du zodiaque correspondent & une date fournie sousla forme : jour mois Le jour est donné sous forme numérique et le mois sous forme de chaine de caractéres. Pour rappel Capricorne 23 Décembre— 19 Janvier Verseau 20 Janvier - 19 Février Poisson 20 Février - 20 Mars Bélier 21 Mars - 19 Avril Taureau 20 Avril = 20 Mai Gémeau 21 Mai - 20 Juin Cancer 21 Juin - 21 Juillet Lion 22 Juillet - 22 Aout Vierge 23 Aout - 22 Septembre Balance 23 Septembre - 22 Octobre Scorpion 23 Octobre - 21 Novembre Sagittaire 22 Novembre - 22 Décembre Indication : Déclarer une structure date regroupant un jour (numérique), un mois (chaine de caractéres) et un signe (chaine de caractires) et un tableau de cette structure {qui sera initialisé de maniére judicieuse. Question 3 (5 pts) ‘On considére la structure suivante struct etudiant { 7 Introduction & la programmation structurée int numero, char nom{30], prenom[30]; } Ecrire un programme dans lequel il faudra : Définir le type ETUDIANT & partir de cette structure ; Ecrire une fonction creer_Etudiant qui crée un étudiant & partir d'un numéro, d'un nom et d'un prénom donnés en argument. Ecrire une fonetion « main » qui fait une affectation globale de deux étudiants et affiche la variable destination. La variable source sera créée par la fonction creer_Ftudiant. Bh) Lectures ot autres ressources Les lectures et autres ressorces de cette unité se trouvent au niveau des lectures et autres, ressources du cours, 78 Unité 4. Fichiers, tests de programme, débogage Unité 4. Fichiers, tests de programme, débogage Q Introduction a luni Cette derniére unité vous permettra de voir les entrées sorties, spécialement les fichiers en G. Ils permettront de rendre permanentes les données qui jusque la étaient chargées ‘en mémoire (sous forme de tableaux, de structures, et d'autres types de données. Nous ‘terminerons par la partie tests de programme et débogage en donnant un lien vers des ressources necessaires suivant IDE utilisé ©ocijectits de Vunité Ala fin de cette unité, vous devriez étre capable de: Définir un fichier de données Utiliser un fichier de données + Exploiter toutes entrées/sorties Garder les données permanentes Tester des programmmes et les déboguer 79 Introduction & la programmation structurée Activités d’apprentissage Activi Fichiers Introduction Cette activité traite les fichiers dans leurs définitions, leurs fonctionnements, leurs modes douverture. Elle vous permettra d’écrire vos premiers programmes permettant de rendre vos données persistantes, Détails de l'activi Définir un fichier Le C offre la possibilité de manipuler les fichiers. Ceci passe par 'intermédiaire d'une mémoire-tampon (buffer) qui permet de réduire le nombre d'accés aux périphériques (disque... Pour manipuler un fichier, un programme a besoin de: + adresse de lendroit de la mémoire-tampon ol! se trouve le fichier, + la position de la téte de lecture, + le mode daccés au fichier (lecture ou écriture) Ces informations sont rassemblées dans une structure dont le type FILE * est defini dans stdio.h. Un objet de type FILE * est appelé flot de données (en anglais, stream) Ouverture d'un fichier fopen Cette fonction, de type FILE* ouvre un fichier et lui associe un flot de données. fopen(unom-de-fichiers,»mode») La valeur retournée par fopen est un flot de données. Si I'exécution de cette fonction ne se déroule pas normalement, la valeur retournée est le pointeur NULL. Il est donc recommandé de toujours tester sila valeur renvoyée par la fonction fopen est égale & NULL afin de détecter les erreurs (lecture d'un fichier inexistant...), Le premier argument de fopen est le nom du fichier concemé, Le second argument, mode, est une chaine de caractéres qui spécifie le mode d'accés au fichier (comme I'indique la figure 80 Unité 4. Fichiers, tests de programme, débogage suivante). "x" ouverture d'un fichier texte en lecture we louverture d'un fichier texte en écriture "a" ouverture d'un fichier texte en écriture & la fin "rb" ouverture d'un fichier binaire en lecture wo" ouverture d'un fichier binaire en écriture "ab" [ouverture d'un fichier binaire en écriture & la fin "z+" jouverture d'un fichier texte en lecture/écriture "w+" ouverture d'un fichier texte en lecture/écriture "a+" louverture d'un fichier texte en lecture/écriture & la fin "c+b" ouverture d'un fichier binaire en lecture/écriture "web" ouverture d'un fichier binaire en lecture/écriture "a+b" ouverture d'un fichier binaire en lecture/écriture & la fin| Mode d’accas aux fichiers Si le mode contient la lettre r, le fichier doit exister. Si le mode contient la lettre w, le fichier peut ne pas exister. Dans ce cas, il sera créé. Sile fichier existe déja, son ancien contenu sera perdu Si le mode contient la lettre a, le fichier peut ne pas exister. Dans ce cas, il sera créé. Si le fichier existe déja, les nouvelles données seront ajoutées & la fin du fichier précédent. Trois flots standard peuvent étre utilisés en C sans quill soit nécessaire de les ouvrir ou de les fermer + stdin (standard input) : unité chentrée (par défaut, le clavier) + stdout (standard output): unité de sortie (par défaut, bécran) ; * stderr (standard error): unité cbatfichage des messages cherreur (par défaut, bécran) * Fermeture de fichiers felose Elle permet de fermer le flot qui a &t8 associé & un fichier par la fonction fopen felose(flot) ot flot est le flot de type FILE* retourné par la fonction fopen correspondant. a1 Introduction & la programmation structurée La fonction fclose retourne un entier qui vaut zér0 si lopération s'est déroulée normalement (et une valeur non nulle en cas d’erreur) Généralisation : entrées sorties formatées {printf La fonction fprintf, analogue a print’, permet d'écrire des données dans un fichier. {printf(flot »chaine de contréle»,expression-t, ., expression-n) oli flot est le flot de données retourné par Ia fonction fopen. Les spécifications de format utilisées pourla fonction fprintf sont les mémes que pour printf fscant La fonction fecanf, analogue a scanf, permet de lire des données dans un fichier. Sa syntaxe est semblable a celle de scant fecan{{flot»»chaine de contréle»,argument-1,..argument-n) oi flot est le flot de données retourné par fopen. Les spécifications de format sont ici les mémes que celles de la fonction scanf. Impression et lecture de caractéres fgete et fpute permettent de lire et d’écrire un caractare dans un fichier. fgetc, de type int, retourne le caractére lu dans le fichier. Elle retourne la constante EOF lorsqu’elle détecte la fin du fichier. int fgetc(PILE* flot); ‘lot est le flot de type FILE* retourné par la fonction fopen. foute écrit caractére dans le flot de données int fpute(int caractere, FILE *flot); Elle retourne Fentier correspondant au caractére Iu (ou la constante EOF en cas d'erreur). Ul existe aussi getc et putc. Leur syntaxe est similaire & celle de fgetc et fpute fot); int putclint caractere, FILE “flot) int getc(F Exemple d'utilisation des fonctions include #include define ENTREE “entreetet” ez Unité 4. Fichiers, tests de programme, débogage Hdefine SORTIE “sortie.txt » int main(void) { FILE “Lin, *Lout; int ¢; if ((Lin = fopen(ENTREE ULL) { fprintf(stderr, «\nErreur: Impossible de lire le fichier %s\n» ENTREE); return(EXIT_FAILURE);} if((f_out = fopen(SORTIE?w")) == NULL) { fprintf(stderr, «\nErreur: Impossible d'ecrire dans le fichier %s\n», SORTIE); return, (EXIT_FAILURE); while ((c= fgetc({Lin)) != BOF) fpute(c, Lout); felose(f_in); felose(fout); return(EXIT_SUCCESS); } Les entrés ros Les fonctions d'entrées-sorties binaires permettent de transférer des données dans un fichier sans transcodage. Elles sont donc plus efficaces que les fonctions d’entrée-sortie standard, mais les fichiers produits ne sont pas portables puisque le codage des données dépend des machines. Elles sont notamment utiles pour manipuler des données de grande taille ou ayant Un type composé, size_t fread(void *pointeur, size_t taille, size_t nombre, FILE *flot); size_t furite(void *pointeur, size_t taille, size_t nombre, FILE *lot) ot pointeur est l'adresse du début des données a transférer, taille la taille des objets 8 transférer, nombre leur nombre. Rappelons que le type size_t, defini dans stddeth, at de 'évaluation de sizeof. Il s'agit du plus grand type entier cortespond au type du rést non signé.La fonction fread lit les données sur le “lot flot et la fonction fwrite les écrit. Elles retournent toutes deux le nombre de données transférées, Le programme suivant écrit un tableau dentiers (contenant les 50 premiers entiers) avec fwrite dans le fichier sortie, puis lit ce fichier avec fread et imprime les éléments du tableau. 83 Introduction & la programmation structurée #inciude Hinelade faesine xB 50 factine FUSORTIE “sortie” int main(void) « FILE *f in, +f outs ine stabi, '*taba; ine tabi = (int+)mazioc( fab? = (ints)malloc(ne for (iS 0 2 < Noy att) ‘eabltiy = "ay (+ eceiture du tableau dane F_SORTIE +/ {2 (UELue open (e SORTIE, "we)) == MULL) zeok(int)) sizeof (int) ) fprintf(stderr, "\ntnpossible d'ecrire dans le fichier 4s\n",F_SORTIE); Feturn (EXIT. PAILURE) 7 2 fwiste(tabl, NB * aizeof(int), 1, £ out); felose( out); (+ lecture dans F_SoRTIE +/ fe ((lin’=“fopen(e_soRTrE, “r")) == NULL) « Eprinte(atdere, "\nImpossible de lire dans le fichier ¥e\n",F_SORTIE); return (EXIT. FAILURE)? > froad(tab2, NB * sizeof(int), 1, fin); felose(# in) for (l= 07, < mBy i++) eines ("aa\e"yeab2(i)? peinee("\n") Eetura(Exi7 SUCCESS); Positionnement dans le fichier Les différentes fonctions d'entrées-sorties permettent daccéder a un fichier en mode séquentiel: les données di fichier sont lues ou écrites les unes a la suite des autres. II est également possible d'accéder a un fichier en mode direct, c'est-a-dire que l'on peut se positionner & nvimporte quel endroit di fichier. La fonction fseek permet de se positionner & un endroit précis ; Int f5eeK(FILE “lot, long deplacement, nt origine); deplacement détermine la nouvelle position dans le fichier. Is‘agit d'un déplacement relatif par rapport a lorigine ; il est compté en nombre d'octets. La variable origine peut prendre trois valeurs SEEK SET (égale & 0) : début du fichier SEEK_CUR (égale 8 1) : position courante ; SEEK_END (6gale A 2) : fin du fichier La fonction. int rewind(FILE *flot); permet de se positionner au début du fichier: Elle est équivalente & fseek (Flot, 0, SEEK SET); 84 Unité 4. Fichiers, tests de programme, débogage La fonction long ftellFILE *flot) retourne le position courante dans le fichier {en nombre d'octets depuis l'origine). Exemple d'utilisation include include define NB 50 ‘define F_SORTIE «sortiey int main(void) { FILE*Lin, *Lout; int tab, inti; tab = (int*)malloc{NB * sizeof{int)); for (i= 0; 1 < NB; i++) tabi ; /* ecriture du tableau dans F_SORT if ((Lout = fopen(F_SORTIE, “w")) == NULL) { fprint{(stderr, «\nimpossible d’ecrire dans le fichier %s\n»F_ SORTIE); return (EXIT_FAILURE); } fwrite(tab, NB* sizeof{int), 1, fout); folose(f_out); /* lecture dans F SORTIE */ if ((Lin = fopen(F_SORTIE, “r’) NULL) { fprintf(stderr, «\nImpossible de lire dans le fichier 9s\n» F_SORTIE); return (EXIT_FAILURE); } /* on se positionne ala fin du fichier */ fseek({_in, 0, SEEK END); printf("\n position 941d’, ftell(Lin)); /* deplacement de 10 int en arriere */ fseek(F_in, -10 * sizeof{int), SEEK END); printf("\n position 961d’, tell(Lin)); 85 Introduction & la programmation structurée fread(&i, sizeof(i), 1, Lin); printf("\ti=%d", i); retour au debut du fichier */ rewind{(f_in); printf("\n position 9ld’,ftell(£in));, fread(&i, sizeof{i), 1, in); printi("\ti = %d" i); /* deplacement de S int en avant */ fseek(fin, 5 * sizeoftint), CUR); printf("\n position 96ld, tel(Fin)); fread(&i, sizeof(i), 1, Lin); printf("\ti= %d\n' i); felose(t in); return(EXIT_SUCCESS); } Conclusion Vous venez de finir 'étude des fichiers ainsi la manipulation de données. II ne vous reste pas grand chose dans ce cours de langage C, vous voici bien avertis pour gérer des programmes tres complexes en langage. Entrainez vous avec les exercices suivants. Evaluation Ecrire un programme qui lit une suite de valeurs dans le fichier fict, en calcule la somme et la moyenne et les écrit dans le fichier fic2. Les noms des fichiers seront donnés sur la ligne de commande. Ainsi, si la commande s'appelle calcul, 'exécution se fera sous la forme caleul fiel fle2, NB = La fonction fscanf permet de lire & partir d'un fichier. Elle regoit comme arguments, le descripteur de fichier, et les mmes arguments que la fonction scanf. Activité 2 — Tests de programme et débogage Présentation Voyons maintenant les tests et débogage des programmes. 86 Unité 4. Fichiers, tests de programme, débogage Det de acti Pour cette activité, nous vous recommandons de lire l'article « Autour du Langage C » du «GNU/Linux Magazine n° 171 | mai 2014" bttpu/connect.ed-diamond.com/GNU-Linux-Magazine/GLME.171/Autour-du-langage-C Conclusion Jespere que vous avez bien lu cet article sur le débogage et les tests, les makefiles, les détecteurs de fuites de mémoires, les versionings... I s‘agit d'un plus pour un programmeur désirant se placer dans le cadre professionnel de développement. Evaluation + Qu'est ce qu'un makefile ? Donner un exemple simple diutlisation * Donner des exemples d’éditeurs de texte pouvant servir& la programmation + Qu’est ce qu'un analyseur de code ? Donner des exemples d'analyseurs de code. * Que pouvez vous dire sur les gestionnaires de versions ? Peta Nous sommes 8 la fin de cette unité qui traitait des fichiers et des tests de débogage. Vous aver fini avec ce module d'introduction & la programmation structurée, a vos claviers et IDE & Evaluation de units Vériiez votre compréhension! Dovoir sur table 4 Directives Répondre aux questions posées, 'évaluation dure th ‘Systéme de notation Le baréme est indiqué a la suite des questions 7 Introduction & la programmation structurée Evaluation ‘Question (20 pts) Soit un fichier de données structurées en une suite de lignes contenant chacune un nom de personne, un nom de piéce, un nombre et un prix. Exemple Fall raquette 10 1000 Dem brosse 50567 1) Ecrire un programme qui contient les fonctions suivantes Une fonction qui it le fichier et mémorise son contenu dans un tableau de structures, chaque structure permettant de mémoriser le contenu d'une ligne (nom, article, nombre et prix) et correspondant ainsi a une commande. La lecture se fera par un appel a fscant Une fonction qui parcourt ensuite ce tableau en imprimant le contenu de chaque structure Les fonctions seront appelées du programme principal. Ey Lectures ot autres ressources Les lectures et autres ressorces de cette unité se trouvent au niveau des lectures et autres, ressources du cours. Evaluation du cours Examen sur table 1 Directives Lévaluation dure 2h. 1@ de notation syst Le baréme est indiqué 3 la suite des exercices 88 Unité 4. Fichiers, tests de programme, débogage Evaluation Exercice 1 : Chaines de caractéres (6 points) Ecrire un programme qui supprime toutes les lettres ’e" (minuscule) d'un texte fourni ‘en donnée et ne dépassant pas 128 caractéres. On s‘arrangera pour que le texte ainsi modifié soit créé en mémoire & la place de l'ancien (il ne faut ni allouer ni utiliser un. nouvel espace) Indications : utiliser les fonctions de = strchrich, c) : permet de trouver un caractére donné c dans une chaine ch et de retourer l'adresse a laquelle on a trouvé le premier caractére indiqué (ou la valeur 0 si ce caractére n’existe pas dans la chaine) strepylcht, ch2) : permet de copier la chaine ch2 dans chi Exercice 2 : manipulation de tableaux (14 points) Ecrire une fonction qui retourne la somme des éléments d'un tableau d’entiers passé en paramétre. Ecrire une fonction qui permet ciafficher toutes les valeurs qui apparaissent au moins deux fois dans un tableau. Soit T un tableau d’entiers ordonné de taille n. Ecrire une fonction itérative appartientT(T.n.x) qui renvoie 1 si un élément x est dans un tableau T et 0 sinon, Donner une fonction itérative compareT(T1,12,n1,n2) qui compare deux tableaux T1 et 72 de tailles respectives n1 et n2 et renvoie 1 si les deux tableaux sont identiques et 0 sinon. Directives evaluation dure 2h. ‘Systéme de notation Le baréme est indiqué 3 la suite des questions 89 Introduction & la programmation structurée Evaluation Exercice 1: Questions de cours (4 points) + Quelle est la structure générale d’un programme en C? + Donner les trois grandes étapes de la compilation d'un programme C ‘+ Quels sont les modificateurs de type en C + Quelle est la différence entre un pointeur vers un entier et un tableau d'entiers, Exercice 2 : Tableaux et pointeurs (8 points) (On souhaite disposer d’un programme qui acquiert et mémorise un texte formé de plusieurs lignes (10 au plus) lues au clavier. Lutilisateur frappe sur la touche « retour chariot » a la fin de chaque ligne. Une ligne réduite au mot « fin » termine le texte. On supposera qu'une ligne ne dépasse jamais 100 caractéres. donner une fonction int ReadText(char “lines[], int maxlines) qui lt ligne par ligne un texte dau plus maxlines lignes et reourne le nombre de lignes lues. Les lignes sont stockées dans des tableaux de caractéres alloués dynamiquement et dont les pointeurs sont rangés dans le tableau lines. écrire une fonction void SortByLength{char *linesf), int nblines) qui tre les lignes pointées par lines} de la plus petite a la plus longue. ze 3: Ligne de commande (8 points) Ecrire un programme qui affiche des motifs répétitifs sur sa sortie standard. Pour cela, il doit recevoir en argument le nombre de lignes, le nombre de colonnes, le premier motif et le second motif. I doit y avoir alternance des motifs sur la ligne et sur la colonne. Ainsi, sile programme a pour nom affiche, 'exécution de Examen sur table 3 Directives Répondre aux questions posées, I'évaluation dure 2h. ‘Systéme de notation Le baréme est indiqué 8 la suite des questions 90 Unité 4. Fichiers, tests de programme, débogage Evaluation Exercice 1 (10 pts) Ecrire un programme qui lit, en donnée, un verbe du premier groupe et qui en affiche la conjugaison au présent de lindicatif, sous la forme Je chante Tu chantes Ii chante Nous chantons Vous chantez Ils chantent On s'assurera que le mot fourni se termine par « er » et on supposera qu'il s‘agit d’un verbe régulier (Iutilisateur ne fournira pas de verbe comme « manger » par exemple’ Indication : utiliser un tableau de sujets et tableau de terminaisons. Exercice 2 (10 pts) Pour cet exercice présenter le programme sous forme de modules (deux fichiers .c et un fichier .h) Soit la structure suivante : typedef struct point {char ¢; int x, y} Point ; Ecrire les fonctions qui permettent dlafficher le Point P sous la forme « Point A de coordonnées 7 4» de faire une translation de vecteur V du Point P (demander les composantes du vecteur) Définir le type Dessein qui est un tableau de Point Ecrire les fonctions qui permettent de saisir un Dessin qui est une suite de N points diafficher un Dessin qui est une suite de N points ” Introduction & la programmation structurée Références du cours ‘+ D.M,, Ritchie, B.W., Kernighan., 1988. The C Programming Language Second Edition. Prentice Hall Inc., Englewood Cliffs, New Jersey. ‘+ S.P_Harbison, G.L. Steele Jr, C A Reference Manual 2nd Ed, Tartan Laboratories, Prentice-Hall Software series, 1987. ‘+ Peter Van Der Linden, Expert C Programming, Deep C Secrets, Prentice Hall, 1994, © BRAQUELAIRE Jean-Pierre, Méthodologie de la programmation en C, Masson, 198 ‘+ CHARBONNEL Jacquelin, Langage C - les finesses d’un langage redoutable, Armand Colin, 1992. ‘+ FEUER R. Alan, Langage C - problémes et exercices, Masson, 1991 + Claude Delannoy, Programmer en langage C, Cours et Exercices Corrigés, Eyrolles, 2014. 92 Unité 4. Fichiers, tests de programme, débogage 3 DOM Nn Rec Nr’ Myre UN ne eg ec eRe d Gen ere PO Box 25405-00603 DE SA BCE POPE EEEED contact@avu.org eer l CMe oC ancy Mee TODr cg Vinee Nine ere Ceo euc Re CIP CUR cake’ Sie eee RR en WEEN Eee ce ea ec ACE PAERLOEYZy Pees en UR]

Vous aimerez peut-être aussi