Cours de Programmation en Langage C - PDF
Document Details
Uploaded by Deleted User
Eric Petit et étendu par J. B. Othman
Tags
Summary
Ce document est un cours de programmation en langage C pour les étudiants de première et deuxième année de licence en sciences et technologie. Il couvre des sujets tels que l'introduction à la programmation, les différents types de données (entiers, caractères, réels), les expressions et les opérateurs. Le document est structuré en chapitres et sections, facilitant la navigation et la compréhension des concepts.
Full Transcript
LICENCE SCIENCES, TECHNOLOGIE 1ère et 2ème année U.E. Programmation pour l’Ingénieur 1 et 2 COURS DE PROGRAMMATION en Langage C Eric PETIT et étendu par J. B. Othman -1- Sommaire CHAPITRE 1 INTRODU...
LICENCE SCIENCES, TECHNOLOGIE 1ère et 2ème année U.E. Programmation pour l’Ingénieur 1 et 2 COURS DE PROGRAMMATION en Langage C Eric PETIT et étendu par J. B. Othman -1- Sommaire CHAPITRE 1 INTRODUCTION A LA PROGRAMMATION....................................................................................................................................................................................6 CHAPITRE 2 INTRODUCTION A LA PROGRAMMATION EN LANGAGE C............................................................................................................................................... 21 1 PREMIER PROGRAMME............................................................................................................................................................................................................................................ 24 1.1 NOTION DE FONCTION.............................................................................................................................................................................................................................................. 24 1.2 LA FONCTION PRINCIPALE........................................................................................................................................................................................................................................ 25 1.3 PREMIER EXEMPLE DE FONCTION PRINCIPALE AFFICHANT UN MESSAGE A L’ECRAN................................................................................................................................................ 25 1.4 PROCEDURE A SUIVRE POUR EXECUTER UN PROGRAMME........................................................................................................................................................................................ 26 2 ENVIRONNEMENT DE PROGRAMMATION.................................................................................................................................................................................................................. 27 3 ELEMENTS DE BASE DE PROGRAMMATION C............................................................................................................................................................................................................ 27 3.1 DECLARATION, AFFECTATION ET AFFICHAGE D’UNE VARIABLE............................................................................................................................................................................... 29 3.2 AFFECTATION D’UNE VARIABLE PAR SAISIE D’UNE VALEUR AU CLAVIER................................................................................................................................................................ 32 3.3 REGLES DE CREATION D’IDENTIFICATEURS.............................................................................................................................................................................................................. 34 3.4 COMMENTAIRES...................................................................................................................................................................................................................................................... 35 3.4.2 DECLARATION DE CONSTANTES.......................................................................................................................................................................................................................... 36 CHAPITRE 3 LES DIFFERENTS TYPES DE DONNEES............................................................................................................................................................................................ 37 3.1 INTRODUCTION............................................................................................................................................................................................................................................................ 37 3.2 LES CARACTERES.................................................................................................................................................................................................................................................... 44 3.2.1 MODE DE REPRESENTATION DES CARACTERES EN MEMOIRE..................................................................................................................................................................................... 44 3.2.2 TABLES ETENDUES DES CODES ASCII................................................................................................................................................................................................................. 46 3.2.3 CARACTERES DE CONTROLE ET NOTATION SPECIALE............................................................................................................................................................................................... 50 3.2.4 DECLARATION, AFFECTATION ET AFFICHAGE D’UNE VARIABLE CARACTERE...................................................................................................................................................... 53 3.3 LES ENTIERS............................................................................................................................................................................................................................................................ 56 3.2.1 MODE DE REPRESENTATION DES ENTIERS EN MEMOIRE............................................................................................................................................................................................ 56 3.2.2 LES DIFFERENTS TYPES D’ENTIERS...................................................................................................................................................................................................................... 61 3.3.3 ECRITURE DES ENTIERS EN BASE OCTALE ET HEXADECIMALE............................................................................................................................................................................. 62 3.3.4 AFFICHAGE ET SAISIE DE VARIABLES ENTIERES EN FORMAT OCTAL OU HEXADECIMAL...................................................................................................................................... 63 3.4 LES REELS................................................................................................................................................................................................................................................................ 64 3.4.1 MODE DE REPRESENTATION DES REELS EN MEMOIRE............................................................................................................................................................................................... 64 3.4.3 LES DIFFERENTS TYPES DE REELS........................................................................................................................................................................................................................ 65 3.4.4 DECLARATION DE CONSTANTES.......................................................................................................................................................................................................................... 67 CHAPITRE 4 LES EXPRESSIONS.................................................................................................................................................................................................................................. 68 1 NOTION D’EXPRESSION............................................................................................................................................................................................................................................ 68 2 L’OPERATEUR D’AFFECTATION =............................................................................................................................................................................................................................. 70 3 EVALUATION DES EXPRESSIONS............................................................................................................................................................................................................................... 71 3.1 CONVERSIONS SYSTEMATIQUES............................................................................................................................................................................................................................... 71 3.2 EXPRESSIONS INCOHERENTES.................................................................................................................................................................................................................................. 71 3.3 OPERATEUR DE CONVERSION (OPERATEUR DE « CAST »)......................................................................................................................................................................................... 72 3.4 PRESENTATION GENERALE DES OPERATEURS........................................................................................................................................................................................................... 75 3.5 PRESENTATION DES OPERATEURS LES PLUS COURANTS........................................................................................................................................................................................... 76 3.5.1 OPERATEURS ARITHMETIQUES............................................................................................................................................................................................................................ 76 -2- 3.5.2 OPERATEURS UNAIRES D’INCREMENTATION OU DE DECREMENTATION............................................................................................................................................................... 76 3.5.3 OPERATEURS RELATIONNELS.............................................................................................................................................................................................................................. 77 3.5.4 OPERATEURS LOGIQUES (OU BOOLEENS)............................................................................................................................................................................................................ 78 3.5.5 OPERATEURS AGISSANT SUR LE MOTIF BINAIRE.................................................................................................................................................................................................. 79 3.5.6 OPERATEURS CONDENSES D’AFFECTATION......................................................................................................................................................................................................... 80 3.5.7 OPERATEUR SIZEOF( )......................................................................................................................................................................................................................................... 81 CHAPITRE 5 LES INSTRUCTIONS DE CONTROLE..............................................................................................................................................................................................82 1. INTRODUCTION........................................................................................................................................................................................................................................................ 82 2. INSTRUCTIONS DE CHOIX (APPELEES AUSSI INSTRUCTIONS CONDITIONNELLES)...................................................................................................................................................... 84 2.1. INSTRUCTION DE CHOIX SIMPLE IF…ELSE......................................................................................................................................................................................................... 84 2.2. INSTRUCTION DE CHOIX MULTIPLE SWITCH...................................................................................................................................................................................................... 87 3. INSTRUCTIONS ITERATIVES...................................................................................................................................................................................................................................... 90 3.1. INSTRUCTIONS WHILE ET DO….WHILE........................................................................................................................................................................................................... 90 3.2. INSTRUCTION FOR.............................................................................................................................................................................................................................................. 93 3.3. CHOIX D’UNE INSTRUCTION DE CONTROLE ITERATIVE........................................................................................................................................................................................ 96 3.4. INTRUCTION D’ECHAPPEMENT GOTO................................................................................................................................................................................................................. 101 4. SYNTHESE DU CHAPITRE 5..................................................................................................................................................................................................................................... 103 CHAPITRE 6 LES FONCTIONS.................................................................................................................................................................................................................................... 104 1. INTRODUCTION...................................................................................................................................................................................................................................................... 104 2. CREATION ET UTILISATION D’UNE FONCTION......................................................................................................................................................................................................... 105 3. VARIABLES LOCALES............................................................................................................................................................................................................................................. 109 4. « RE-UTILISABILITE» DES FONCTIONS.................................................................................................................................................................................................................... 112 4 METHODOLOGIE DE DEVELOPPEMENT D’UN LOGICIEL........................................................................................................................................................................................... 113 5 COMPILATION SEPAREE DES FONCTIONS................................................................................................................................................................................................................ 119 CHAPITRE 7 LES DIFFERENTES CLASSES DE VARIABLE................................................................................................................................................................................ 121 7-1 VARIABLES D’ALLOCATION AUTOMATIQUE............................................................................................................................................................................................................. 121 7-2 VARIABLES D’ALLOCATION STATIQUE..................................................................................................................................................................................................................... 124 7.2.1 VARIABLES LOCALES D’ALLOCATION STATIQUE............................................................................................................................................................................................... 125 7.2.2 VARIABLES GLOBALES...................................................................................................................................................................................................................................... 126 7.2.3 VARIABLES APPARTENANT A LA CLASSE D’ALLOCATION REGISTRE.................................................................................................................................................................. 134 CHAPITRE 8 LES VARIABLES POINTEUR............................................................................................................................................................................................................. 135 1. INTRODUCTION...................................................................................................................................................................................................................................................... 135 2. INTERET DES VARIABLES POINTEUR....................................................................................................................................................................................................................... 136 3. AFFECTATION D’UNE VARIABLE POINTEUR............................................................................................................................................................................................................ 137 3.1. INTRODUCTION................................................................................................................................................................................................................................................. 137 3.2. AFFECTATION D’UN POINTEUR PAR ALLOCATION DYNAMIQUE DE MEMOIRE.................................................................................................................................................... 138 4. ARITHMETIQUE SUR LES POINTEURS...................................................................................................................................................................................................................... 140 5. PASSAGE DE PARAMETRES DE FONCTION PAR REFERENCE (PAR ADRESSE)............................................................................................................................................................. 143 6. LIBERATION DE LA MEMOIRE ALLOUEE DYNAMIQUEMENT.................................................................................................................................................................................... 147 CHAPITRE 9 LES TABLEAUX..................................................................................................................................................................................................................................... 148 -3- 1. INTRODUCTION...................................................................................................................................................................................................................................................... 148 2. TABLEAUX MONO-DIMENSIONNELS....................................................................................................................................................................................................................... 149 2.1 DECLARATION D’UN TABLEAU 1D......................................................................................................................................................................................................................... 149 2.2 EXEMPLE D’UTILISATION D’UN TABLEAU 1D......................................................................................................................................................................................................... 151 2.3 INITIALISATION D’UN TABLEAU 1D....................................................................................................................................................................................................................... 152 2.4 TABLEAU 1D ET POINTEUR.................................................................................................................................................................................................................................... 153 2.5 PASSAGE D’UN TABLEAU 1D EN ARGUMENT D’UNE FONCTION.............................................................................................................................................................................. 155 3. TABLEAUX MULTI-DIMENSIONNELS....................................................................................................................................................................................................................... 160 3-1 DECLARATION D’UN TABLEAU ND.................................................................................................................................................................................................................... 160 3-2 INITIALISATION ET AFFECTATION D’UN TABLEAU 2D........................................................................................................................................................................................ 161 CHAPITRE 10 LES CHAINES DE CARACTERES.................................................................................................................................................................................................... 162 1. INTRODUCTION...................................................................................................................................................................................................................................................... 162 2. DECLARATION ET INITIALISATION D’UNE CHAINE DE CARACTERES....................................................................................................................................................................... 163 3. AFFECTATION D’UNE CHAINE DE CARACTERES...................................................................................................................................................................................................... 165 4. SAISIE ET AFFICHAGE D’UNE CHAINE DE CARACTERES........................................................................................................................................................................................... 166 5. PASSAGE D’UNE CHAINE DE CARACTERES EN ARGUMENT D’UNE FONCTION.......................................................................................................................................................... 167 6. TABLEAU DE POINTEURS................................................................................................................................................................................................................................ 170 7. FONCTIONS DE GESTION DES CHAINES DE CARACTERES......................................................................................................................................................................................... 171 7.1 SAISIE AU CLAVIER DE CHAINES DE CARACTERES.................................................................................................................................................................................................. 171 7.1.1 SEPARATEURS POUR LA FONCTION SCANF......................................................................................................................................................................................................... 171 7.1.2 SAISIE DE CARACTERES ET DE CHAINES DE CARACTERES AVEC LA FONCTION SCANF....................................................................................................................................... 172 7.2 FONCTIONS STANDARDS DEDIES AUX CHAINES DE CARACTERES........................................................................................................................................................................... 174 CHAPITRE 11 STRUCTURES....................................................................................................................................................................................................................................... 175 INTRODUCTION................................................................................................................................................................................................................................................................ 175 1. EXEMPLE DE STRUCTURE....................................................................................................................................................................................................................................... 176 2. ACCES AUX DIFFERENTS CHAMP D’UNE STRUCTURE..............................................................................................................................................................................................177 3. ADRESSE ET VALEUR D’UNE DONNEE STRUCTUREE............................................................................................................................................................................................... 179 4. AFFECTATION D’UNE DONNEE STRUCTUREE.......................................................................................................................................................................................................... 180 5. PASSAGE D’UNE DONNEE STRUCTUREE EN ARGUMENT D’UNE FONCTION.............................................................................................................................................................. 181 5.1. PASSAGE PAR VALEUR D’UNE DONNEE STRUCTUREE A UNE FONCTION............................................................................................................................................................. 181 6.2 PASSAGE PAR ADRESSE D’UNE DONNEE STRUCTUREE A UNE FONCTION................................................................................................................................................................. 183 6.3 NOTATIONS ADRESSE ET VALEUR POUR LES POINTEURS SUR DES STRUCTURES...................................................................................................................................................... 185 6.4 LA DECLARATION TYPEDEF (PAS NECESSAIRE)....................................................................................................................................................................................................... 186 7 UTILISATION D’UNE STRUCTURE POUR CREER UNE LISTE CHAINEE........................................................................................................................................................................ 187 7.1 NOTION DE LISTE CHAINEE.................................................................................................................................................................................................................................... 187 7.2 STRUCTURE UTILISEE POUR DEFINIR UN ELEMENT D’UNE LISTE CHAINEE.............................................................................................................................................................. 191 7.3 CREATION D’UNE LISTE CHAINEE........................................................................................................................................................................................................................... 193 7.4 FONCTION D’AJOUT D’UN ELEMENT A LA LISTE CHAINEE...................................................................................................................................................................................... 195 7.5 LISTE DOUBLEMENT CHAINEE ET ARBRES BINAIRES............................................................................................................................................................................................... 197 -4- RESSOURCESDOCUMENTAIRES Support cours d’Eric PETIT(disponible surEPREL) Programmer en langage C- Claude DELANNOY https://www.lesdeveloppeurs.net/docsc/programmer%20en%20langage%20c%20%20cours%20et%20exercices%20corriges- %205e%20edition%20-claude%20delannoy-%20.pdf https://www.rocq.inria.fr/secret/Anne.Canteaut/COURS_C/ Voici un lien pour installer gratuitement le logiciel Code ::Blocks sur une machine personnelle. http://sourceforge.net/projects/codeblocks/files/Binaries/13.12/Windows/codeblocks-13.12mingw-setup.exe/download Si CodeBlocks ne trouve pas le compilateur, le problème peut être résolu en activant la commande Auto-detect dans Settings/Compiler/Toolchain executables ou en chargeant et en installant le compilateur Mingw https://fr.osdn.net/projects/mingw/releases/p15522 En dépannage, vous pouvez utiliser un compilateur Cen ligne. https://www.onlinegdb.com/online_c_compiler -5- Chapitre 1 INTRODUCTION A LA PROGRAMMATION Ordinateur et programme Qu’est-ce qu’un ordinateur ? Qu’est-ce qu’un programme ? Machine capable d’acquérir une suite Une suite d’instructions informatiques d’instructions exprimées dans un langage informatique et d’exécuter cette suite d’instructions. On parle de programmation impérative, lorsque l’on indique la suite d’instructions à réaliser pour effectuer une action. Il existe d’autres principes de programmation (programmation déclarative par exemple). Erreur ! Source du renvoi introuvable. Erreur ! Source du renvoi introuvable. -6- RECETTE PATE à GAUFRES Ingrédients pour une douzaine de gaufres // les données - 80 g de beurre - 75 g de sucre - 1 sachet de sucre vanillé - 3 oeufs - 200 g de farine - 1/2 sachet de levure chimique -1/4 de litre de lait Préparation : Faire fondre le beurre, et mélanger-le au sucre et au sucre vanillé. // les actions appliquées aux données Battre 2 œufs entiers et un jaune d'œuf à la fourchette. Réserver le troisième blanc à part, pour le battre en neige. Ajouter les oeufs battus au mélange précédent. Joigner la farine tamisée avec la levure en poudre. Verser un peu de lait, en délayant PROGRESSIVEMENT pour ne pas faire de grumeaux (cuillère en bois). Battre en neige le blanc d'oeuf, et incorporer DELICATEMENT à la pâte. Graisser le gaufrier, et les faire cuire pendant 2 à 3 min. Erreur ! Source du renvoi introuvable. Erreur ! Source du renvoi introuvable. -7- Fonctionnement d’un ordinateur Le cœur d’un ordinateur est : une Unité Centrale et une Mémoire Centrale. L’Unité Centrale est un automate capable de considérer séquentiellement une suite d’instructions placées en Mémoire Centrale et de réaliser l’exécution de ces instructions. D’après : http://pagesperso-orange.fr/daniel.robert9/Digit/Proc_ordi/Pratiques_Ordinateurs/Micro_ordinateurs.html Erreur ! Source du renvoi introuvable. Erreur ! Source du renvoi introuvable. -8- Les instructions que peut réaliser un ordinateur sont simples et peu nombreuses : Opérations Arithmétiques (+,-), Opérations Logiques (ET, NON, décalages), Lecture de la Mémoire et Ecriture de la Mémoire (en particulier de la Mémoire Centrale où sont stockées les programmes et les données). Exemples d’instructions que peut exécuter une Unité Centrale : Faire la somme de deux données (opération arithmétique). Multiplier par 2 la valeur située dans une case mémoire. Transférer le contenu d’une case mémoire vers l’Unité Centrale. Transférer une valeur de l’Unité Centrale vers une case mémoire. L’Unité Centrale de la plupart des ordinateurs est aujourd’hui un Microprocesseur (« Micro- Processing Unit »). L’unité Centrale et la mémoire centrale = système électronique numérique binaire instructions données exprimées sous forme binaire adresses commandes Erreur ! Source du renvoi introuvable. Erreur ! Source du renvoi introuvable. -9- Mémoire Centrale La mémoire centrale est constituée de bascules électroniques qui peuvent mémoriser un état Bas (0 logique) ou Haut (1 logique). Chaque élément mémoire est appelé BIT pour « Binary digIT ». Les bits sont regroupés par 8 pour constituer des unités mémoires élémentaires appelés octets. Chaque octet de la mémoire centrale est localisé au moyen d’une adresse. L’octet est la plus petite unité mémoire adressable. La dimension de la mémoire se mesure par unité de 1024 (210) octets (noté 1 Ko pour Kilo-octets). 1024 Ko = 1 Mega-octet (noté 1 Mo) 1024 Mo = 1 Giga-octet (noté 1 Go) 1024 Go = 1 Tera-octet (noté 1 To) Le système d’adressage permet de sélectionner une parmi toutes les adresses mémoire pour l’écrire ou la lire. Pour qu’un programme s’exécute, il doit être placé en mémoire centrale. La mémoire contient également les données utilisées ou créées par les programmes qui s’exécutent. Erreur ! Source du renvoi introuvable. Erreur ! Source du renvoi introuvable. -10- Codage des nombres Erreur ! Source du renvoi introuvable. Erreur ! Source du renvoi introuvable. -11- Langages de programmation Le langage machine Au début de l’informatique, il n’existait pas de langage informatique adapté à l’homme aussi utilisait-on un langage appelé langage machine: on fournissait à l’ordinateur les instructions et les données sous forme de mots binaires (codes machines). L’interface Homme-machine était rudimentaire : les mots binaires étaient fournis au moyen de rubans perforés (trou = 0, absence de trou = 1) LECTEUR de RUBAN PERFORÉ RUBAN PERFORÉ (les petits trous servent à l’entrainement du ruban) Erreur ! Source du renvoi introuvable. Erreur ! Source du renvoi introuvable. -12- Le calculateur électromécanique Zuse 3 ou Z3, conçu en 1941 par l'ingénieur allemand Konrad ZUSE, est souvent considéré comme le premier ordinateur (http://fr.wikipedia.org/wiki/Zuse_3) Caractéristiques techniques: machine constituée au total de 2200 relais électromécaniques Mémoire centrale : 64 unités mémoire de taille 22 bits Fréquence d’horloge de l’Unité Centrale : 5,33 Hz Erreur ! Source du renvoi introuvable. Erreur ! Source du renvoi introuvable. -13- Les opérations effectuées sur les données sont aussi codées en binaire. Exemple d’instruction en langage machine : Ajoute 2 et 3 Adresse (codée sur 16 bits) Code Machine et données (codées sur 8 bits _- 1 octet -) 1001 0001 1010 0000 1100 0111 (code opératoire correspondant àl’addition) 1001 0001 1010 0001 0000 0010 (2 codé en binaire) 1001 0001 1010 0010 0000 0011 (3 codé en binaire) EXECUTION de ce programme par l’UC: Initialisation : CP (Compteur Programme) reçoit adresse de début (1001 0001 1010 0000) 1. Contenu du PC placé sur bus d’adresse 2. Commande de lecture de la mémoire centrale (via bus de Contrôle) 3. Lecture du Bus de donnée 4. UC décode et exécute l’instruction Décode = identifie l’opération (addition) et configure l’UC pour la réaliser Exécute = recherche les données nécessaires à la réalisation de l’opération 5. CP est incrémenté 6. Retour à l’étape 1 (les étapes 1, 2, et 3 constituent un cycle de lecture de la MC) Les 2 cycles de lecture ultérieurs permettent d’obtenir les données de l’opération (valeurs 2 et 3). Une fois que l’exécution du programme est « lancée », la lecture séquentielle de la mémoire ne s’arrêtera que si une instruction d’arrêt est rencontrée. Erreur ! Source du renvoi introuvable. Erreur ! Source du renvoi introuvable. -14- Ecriture en hexadécimal avec code mnémonique Adresse Code Machine Code mnémonique 91A0 C7 (code addition) add 2,3 ; 91A1 02 (2 codé en hexadécimal) 91A2 03 (3 codé en hexadécimal) Erreur ! Source du renvoi introuvable. Erreur ! Source du renvoi introuvable. -15- Les langages mnémoniques ou langages assembleurs Ensuite l’interface Homme-machine s’est améliorée (Clavier et Ecran). Chaque code machine a été associé à un code mnémonique. Exemple d’instruction en langage mnémonique : Ajoute 2 et 3 Code mnémonique add 2,3 ; La démarche est maintenant complètement différente. L’utilisateur saisit ses programmes sous forme de textes tapés au clavier grâce à un "éditeur de texte". Il peut facilement visualiser ses programmes grâce à un écran. Ses programmes sont beaucoup plus lisibles. Par contre, le programme est un texte que la machine « ne comprend plus ». Il faut traduire le texte en langage machine. Le programme qui assure cette traduction s’appelle un « assembleur » et ce type de langage est appelé langage assembleur. Aujourd’hui, ce programme de traduction est appelée « compilateur ». Erreur ! Source du renvoi introuvable. Erreur ! Source du renvoi introuvable. -16- Les langages évolués Ces langages (Fortran, C, Java,...) sont maintenant plus proches de l’Homme que de la machine. Le programme est une suite d’instructions évoluées et s’écrit (et se lit) de manière encore plus naturelle pour l’utilisateur. Une instruction du langage évolué correspond le plus souvent à plusieurs instructions du langage machine, voire à un grand nombre d’instructions regroupées dans une « fonction ». Exemple : programme C int main() { int a,b ; a=2; b=3; a=a+b; printf(« a vaut : %d :», a) ; } Si on exécute ce programme on obtient le message suivant : a vaut : 5 Erreur ! Source du renvoi introuvable. Erreur ! Source du renvoi introuvable. -17- Exemple d’un programme C et de sa traduction en code machine (CPU Pentium) Erreur ! Source du renvoi introuvable. Erreur ! Source du renvoi introuvable. -18- Adresse sur 32 bits Code Machine Code mnémonique Adresse de base : 0040110B B802000000 (5 octets) mov eax,2 00401110 (Adr de base + 5) BA03000000 (5 octets) mov edx,3 00401115 (Adr précédente + 5) 03C2 (2 octets) add eax,edx 00401117 (Adr précédente + 2) 50..................(1 octet) push eax 00401118 (Adr précédente + 1) 68E8A04000 (5 octets) push 004011E8 0040111D (Adr précédente + 5) E85A310000 (5 octets) call printf eax et edx sont des registres (unités mémoire incluses dans l’unité centrale) Erreur ! Source du renvoi introuvable. Erreur ! Source du renvoi introuvable. -19- Démarche pour développer un programme L’analyse du problème détermine les actions élémentaires (appelées aussi tâches) à réaliser et la manière d'enchaîner ces tâches afin d'aboutir à la solution. L’algorithme exprime la solution sous forme d’un pseudo-langage. Le programme est une simple transcription de l’algorithme en langage évolué. Les langages évolués et structurés permettent facilement d’effectuer cette transcription car : les actions élémentaires résultant de l’analyse peuvent s’écrire sous forme de fonctions l’enchaînement des actions élémentaires peut s'exprimer au moyen d'instructions itératives ou d'instructions de choix. Chaque fonction écrite en langage évolué est traduite en langage machine (opération appelée « compilation »). Les fonctions compilées intervenant dans un même programme sont ensuite associées (opération appelée « édition de liens »). Erreur ! Source du renvoi introuvable. Erreur ! Source du renvoi introuvable. -20- Chapitre 2 INTRODUCTION A LA PROGRAMMATION EN LANGAGE C L’évolution de l’informatique depuis ses débuts va vers la « virtualité » de manière à ce que l’utilisateur soit de moins en moins en face d’une machine et de plus en plus en face d’un système qui lui offre des services et avec lequel il peut communiquer naturellement. Lorsque l’utilisateur tape sur une touche de son clavier, le caractère correspondant à cette touche est affiché à l’écran. Lorsque l’utilisateur stocke des données dans un ordinateur il ne sait pas exactement où elles sont stockées. L’ordinateur est donc de plus en plus une « machine virtuelle » qui apporte à l’utilisateur des fonctionnalités dont il a besoin sans que l’utilisateur ait besoin d’avoir une compréhension précise du fonctionnement de la machine. Ceci est permis par le système d’exploitation* de l’ordinateur Exemples : Windows, Mac OS, Linux, ….. (UNIX est écrit en langage C) Chapitre 2 INTRODUCTION A LA PROGRAMMATION EN LANGAGE C -21- Bref historique des langages Années 50 (approches expérimentales) : FORTRAN, LISP, COBOL, ALGOL... Années 60 (langages universels) : PL/1, Simula, Smalltalk, Basic... Années 70 (génie logiciel) : C, PASCAL, ADA, MODULA-2... Années 80 (programmation objet) : C++, LabView, Eiffel, Perl, VisualBasic... Années 90 (langages interprétés objet) : Java, tcl/Tk, Ruby, Python... Années 2000 (langages commerciaux propriétaires) : C#, VB.NET... d’après Bob CORDEAU Introduction à Python 3 Le langage C a été conçu en 1978 par Brian W Kernigham et Denis RITCHIE. Sa particularité par rapport à d’autres langages évolués de même génération, est de réunir dans un même langage la possibilité de programmer une machine virtuelle et une machine physique. On conserve ainsi les avantages d’un langage évolué sans se priver de la possibilité d’intervenir directement au niveau machine quand c’est utile (par exemple pour piloter un processus électronique relié à l’ordinateur). Chapitre 2 INTRODUCTION A LA PROGRAMMATION EN LANGAGE C -22- Programmation pour les Sciences ????? Programmation pour l’Ingénieur Chapitre 2 INTRODUCTION A LA PROGRAMMATION EN LANGAGE C -23- 1 Premier Programme 1. Notion de fonction En mathématique une fonction a : § un nom (par exemple sin) § une liste d’arguments (un seul argument pour la fonction sin par exemple /6) et « prend » une valeur ( sin( /6) prend la valeur 0.5) ; on dit aussi « retourne » une valeur. Exemple d’une fonction à 2 arguments : x à la puissance n. Nom : puissance Liste d’arguments : (2,3) Valeur retournée : 8 puissance (2,3) De la même manière en informatique une fonction a : un nom, une liste d’arguments et une valeur retournée Chapitre 2 INTRODUCTION A LA PROGRAMMATION EN LANGAGE C -24- 1.2 La fonction principale Le programme est au moins constitué d’une fonction appelée fonction principale qui a pour nom main. La fonction main : § ne possède pas d’argument (liste d’argument vide ( ) ) § retourne une valeur entière (habituellement 0 pour indiquer que la fonction s’est déroulée normalement (-1 sinon). 1.3 Premier exemple de fonction principale affichant un message à l’écran int main( ) { printf ("Salut Arthur"); return 0 ; } Commentaire : int main( ) est l’en-tête de la fonction Entre accolades on trouve ensuite les instructions à exécuter ( les instructions sont séparées les unes des autres par un ; ) Dans ce premier exemple la fonction main exécute l’instruction : printf ("Salut Arthur"); Cette instruction est un « appel » à la fonction printf qui affiche à l’écran la chaîne de caractère qu’elle a comme argument. L’instruction return 0 ; permet de renvoyer une valeur au système d’exploitation qui a enclenché l’exécution de la fonction main(). Par convention, la valeur 0 signifie que l’exécution s’est déroulée sans erreur. Chapitre 2 INTRODUCTION A LA PROGRAMMATION EN LANGAGE C -25- 1.4 Procédure à suivre pour exécuter un programme Edition du fichier source La première chose à faire est d’écrire le texte correspondant au programme dans un fichier source au moyen d’un éditeur de texte. On donnera un nom à ce fichier appelé « fichier source » (par exemple premier.C) int main( ) { printf ("Salut Arthur"); return 0 ; } Compilation du fichier source La compilation permet de traduire le programme en langage machine. Dans cet exemple la chaîne de caractère « Salut Arthur » et l’instruction return 0 ; vont être traduites en langage machine mais pas la fonction printf qui existe déjà dans la bibliothèque C sous forme de langage machine. La compilation produit un nouveau fichier appelé « fichier objet » dont le nom est premier.obj ou premier.O Edition des liens Au cours de cette étape les fonctions appelées par la fonction main (ici la fonction printf) sont liées à la fonction main pour produire la version exécutable du programme qui porte le nom premier.EXE Avec CodeBlocks on peut voir les FICHIERS CRÉÉS et leur contenu par la commande File/Open with hex editor Chapitre 2 INTRODUCTION A LA PROGRAMMATION EN LANGAGE C -26- 2 Environnement de programmation L’édition, la compilation et l’exécution d’un programme C peuvent se faire en utilisant une interface homme machine dédiée, appelée environnement de programmation (Borland C++, Microsoft Visual C++, DEVC++, CODE ::BLOCKS1). Les environnements de programmation C plus récemment développés permettent également d’écrire des programmes en C++. Ce langage correspond à une évolution du C vers une méthode de programmation orientée « objet ». Il existe une norme d’écriture du langage C (norme ANSI), néanmoins certains compilateurs présentent des petites variantes par rapport à cette norme. 3 Eléments de base de programmation C Il existe 2 grandes catégories de données dans la plupart des langages informatiques : les valeurs numériques : entiers, réels, complexes les valeurs caractères : 1 caractère est représenté par un code ASCII 1 texte est représenté par une suite de codes ASCII d adresse de téléchargement : http://www.codeblocks.org/downloads Dans le bandeau à gauche cliquez sur Binaries et choisir le téléchargement codeblocks-16.01-setup.exe à partir de Sourceforge.net. Après le téléchargement cliquez sur Exécuter et attendre que la fenêtre d’installation apparaisse (un peu long) Chapitre 2 INTRODUCTION A LA PROGRAMMATION EN LANGAGE C -27- Qu’affiche le programme suivant ? #include int main( ) { printf ("Salut Arthur"); printf ("comment vas-tu?"); return 0 ; } Salut Arthurcomment vas-tu ? Pour imposer à l’affichage un « passage à la ligne suivante », il faut placer \n à la fin de la chaîne de caractères. #include int main( ) { printf ("Salut Arthur\n"); Salut Arthur printf ("comment vas-tu?\n"); comment vas-tu ? return 0 ; } \n est une notation spéciale qui permet de représenter le caractère de contrôle CR (Carriage Return –Retour Chariot) qui correspond à la touche RETURN (ou ENTREE) du clavier (représentée par le symbole ). Chapitre 2 INTRODUCTION A LA PROGRAMMATION EN LANGAGE C -28- 3.1 Déclaration, affectation et affichage d’une variable #include int main( ) { int a ; a=6 ; return 0 ; } Avant d’utiliser une variable il faut la déclarer. int a ; déclare une variable de type entier (« integer ») nommée a Au cours de la compilation un espace mémoire (une suite d’adresse) permettant de représenter une valeur entière est réservé et l’adresse de base de cet espace mémoire est associé au symbole a. Pour un entier de type int cet espace mémoire correspond généralement à 4 adresses consécutives Le contenu de cet espace mémoire est indéterminé tant qu’une valeur n’est pas affectée à a. En particulier a n’a aucune raison de valoir 0. a=6 ; cette instruction permet d’affecter la valeur 6 à la variable a Chapitre 2 INTRODUCTION A LA PROGRAMMATION EN LANGAGE C -29- On peut aussi donner une valeur à une variable en la déclarant. #include int main( ) { int a=10 ; return 0 ; } Affichage de la valeur d’une variable. #include int main( ) { int a=10 ; printf("la valeur de a est : %d\n",a); return 0 ; } la valeur de a est : 10 printf("la valeur de a est : %d\n",a); _ %d est un code format la valeur de a est affichée à l’écran à la place du code format %d Chapitre 2 INTRODUCTION A LA PROGRAMMATION EN LANGAGE C -30- Prototype (simplifié) de la fonction printf int printf (format [,liste d’expressions]) ; Nom de la fonction printf Paramètres 1. format chaîne de caractère qui peut contenir des codes format 2. [,liste d’expressions] § liste d’expressions optionnelle (cas de l’affichage simple d’un message printf ("Salut Arthur\n");) § printf avec une expression : printf(“la valeur de a est : %d\n”,a); § printf avec plusieurs expressions : printf(“%d au carre vaut %d\n”,a ,a* a); 10 au carre vaut 100 _ Valeur retournée (de type int) nombre de caractères affichés (valeur négative en cas d’erreur) Chapitre 2 INTRODUCTION A LA PROGRAMMATION EN LANGAGE C -31- 3.2 Affectation d’une variable par saisie d’une valeur au clavier La fonction scanf permet de saisir une valeur au clavier et de l’affecter à une variable. Prototype (simplifié) de la fonction scanf : int scanf (format ,liste d’adresses) ; format : chaîne de caractère qui contient exclusivement des codes format scanf(“%d”,&a); les caractères saisis au clavier vont être convertis par la fonction scanf en entier les caractères saisis convertis en entier sont placés à l’adresse de a (notée &a) La fonction scanf attend que l’utilisateur saisisse des caractères au clavier et qu’il valide sa saisie en activant la touche Entrée 18 _ Les caractères saisis (‘1’ et ‘8’) sont convertis en valeur entière (18). Cette valeur est placée à l’adresse de a. Valeur de retour : nombre de variables saisies (constante EOF en cas d’erreur) Chapitre 2 INTRODUCTION A LA PROGRAMMATION EN LANGAGE C -32- Exemple #include int main( ) { int a ; printf(“entrez la valeur de a :”); scanf(“%d”,&a); printf(“la valeur de a est : %d\n”,a); return 0 ; } N.B. : Le fichier stdio.h contient l’en-tête de la fonction scanf. Chapitre 2 INTRODUCTION A LA PROGRAMMATION EN LANGAGE C -33- 3.3 Règles de création d’identificateurs Quand on déclare une variable ou qu’on crée une fonction, il faut leur donner un nom (un identificateur) en respectant quelques règles simples : § un identificateur ne doit pas être un « mot-réservé » du langage (par exemple int) § un identificateur commence par une lettre ou par le caractère souligné § les lettres MAJUSCULES et minuscules ne sont pas équivalentes § seuls les 32 premiers caractères de l’identificateur sont considérés Exemple d’identificateurs corrects : nb_de_valeurs _007 xX7 _oui Exemple d’identificateurs incorrects : nb de valeurs 007 +08 les caractères espaces sont des séparateurs Par convention (mais ce n’est pas un règle) les identificateurs représentant des constantes sont écrits en MAJUSCULE et tous les autres identificateurs sont écrits en minuscule. Pour la lisibilité des programmes, il est important de choisir des identificateurs qui évoquent la signification de la variable ou de la fonction. Par exemple il faut mieux appeler une fonction qui élève le nombre x à la puissance n, puiss plutôt que f ou cuiss. Chapitre 2 INTRODUCTION A LA PROGRAMMATION EN LANGAGE C -34- 3.4 Commentaires A n’importe qu’elle endroit au sein d’un programme source, peut être rajoutés des commentaires. Un commentaire c’est du texte encadré par ou // commentaire (s’arrête en fin de ligne) Les commentaires permettent de faciliter la compréhension d’un programme et sont très importants pour assurer la maintenance du programme. Pour être lisible un programme doit également être correctement mis en page. #include int main( ) { int a ; printf("entrez la valeur de a :" );scanf("%d",&a);printf("la valeur de a est : %d\n",a); return 0 ;} Exemple : Programme de résolution d’une équation de degré 2..\ALL_PGMS\PGM_REF\Equ_degré2.CPP Chapitre 2 INTRODUCTION A LA PROGRAMMATION EN LANGAGE C -35- 3.4.2 Déclaration de constantes En C standard on peut définir des constantes grâce à la directive de compilation #define Il est d’usage d’écrire les identificateurs des constantes en MAJUSCULE. Exemple #include #define TVA 0.08 int main() { printf("la constante TVA vaut: %.2lf\n",TVA ) ; return 0 ; } la constante TVA vaut : 0.08 _ Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -36- Chapitre 3 LES DIFFERENTS TYPES DE DONNEES 3.1 Introduction Il y a 3 types de données de base en C : Type Caractère (« character ») Type Entier (« integer ») Type Réel (« float » ou « double ») Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -37- CARACTERES char %c 1 octet -32 768 à +32 767 SIGNÉS short %d 2 octets ENTIERS COURTS Non SIGNÉS unsigned short %u 2 octets 0 à 65 535 -2 147 483 648 à 2 147 483 647 SIGNÉS long ou int %d 4 octets ENTIERS LONGS Non SIGNÉS unsigned long %u 4 octets ou unsigned int 0 à 4 294 967 295 de ~10-38 à 10+38 float %f 4 octets -308 +308 de ~10 à 10 REELS double %lf 8 octets long double %Lf 10 à 16 octets Les types int et long double ne sont pas « portables» Tous les compilateurs n’utilisent pas le même nombre d’octets pour représenter ces types de données Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -38- ENTIERS « TRES COURTS » (à développer après la présentation du type caractère) -128 à +127 SIGNÉS char %d 1 octet CARACTERES Non SIGNÉS unsigned char %u 1 octet 0 à 255 M les types char et unsigned char peuvent également être utilisés pour représenter des entiers très courts en ENTIERS particulier TRES COURTS quand on veut « économiser » de la mémoire. Exemple ENTIERS : SIGNÉS char %d 1 octet Si les valeurs des pixels d’une image numérique de taille 1024 x 1024 sont comprises entre 0 et 255, on peut «leur trèsdonner COURTS » unsigned char un type Non SIGNÉS (1octet unsigned non signé). L’espace mémoire nécessaire%u 1 octet pour représenter cette charunsigned long) image est alors de 1Mo (4 fois moins que si on utilise un type Dans ce cours nous utiliserons essentiellement les types char unsigned char int unsigned int (le type int n’étant pas « portable », il serait plus correct d’utiliser le type long mais l’usage courant est d’utiliser le type int) float double Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -39- Exemple d’utilisation de différents type de données #include #include int main() { float taill ; printf("\nEntrez votre taille en metres : ") ; scanf("%f", &taill) ; printf("Vous mesurez %.2f metres\n", taill) ; printf("quantite de memoire (en octet) pour representer la variable utilisee : %d\n", sizeof(taill)) ; return 0 ; } Exercice : Modifier le programme ci-dessus en : - déclarant une variable de type caractère qui correspond à une des 3 zones de vacances scolaires (‘A’, ‘B’ ou ‘C’) - saisissant une valeur au clavier et en affichant sa valeur et le nombre d’octets utilisé pour la coder. Même exercice avec une variable qui représente un numéro d’année (par exemple 2020 ou -240) Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -40- POINTS A RETENIR....... POINTS A RETENIR....... POINTS A RETENIR....... POINTS A RETENIR 1 Structure de base d’un programme Le programme commence généralement par l’inclusion de fichiers.h qui contiennent du texte qui sert à définir des constantes (la constante π notée M_PI par exemple), à déclarer l’en-tête de fonctions standards et des variables globales,..... #include // inclusion concernant les Entrées/Sorties standards (clavier, écran, disques,..) #include // inclusion concernant la gestion de la mémoire (entre autre) int main( ) // en-tête de la fonction main (pas d’argument d’entrée, un argument de sortie) { INSTRUCTIONS return 0 ; // la fonction retouren 0 (indique qu’elle s’est exécutée sans erreur) } // en cas d’erreur on retourne un code d’erreur que le système d’exploitation va gérer // -1 par exemple Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -41- POINTS A RETENIR....... POINTS A RETENIR....... POINTS A RETENIR....... POINTS A RETENIR.......2 3 types de données principaux associés à un code format Type Représente code format char un caractère ‘a’ ‘&’ ‘2’ ‘\n’.... %c int un entier signé %d float un réel codé sur 4 octets %f double un réel codé sur 8 octets %lf (amplitude et précision supérieures aux float) M l est la lettre l pas le chiffre 1 Programme récapitulatif #include #include int main() { double x ; x=10.3 ; printf("\nEntrez une nouvelle valeur pour x : ") ; // ‘ \n’ caractère « spécial » → saut de ligne scanf("%lf", &x) ; // saisie de x au clavier la donnée saisie est placée à l’adresse de x printf("la nouvelle valeur de x est %lf et la taille en octet de cette variable est : %d\n ", x, sizeof(x)) ; return 0 ; } Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -42- NOUVEAU....... NOUVEAU....... NOUVEAU....... NOUVEAU # include ??? Ajoute dans le fichier source, le texte contenu dans un fichier « à inclure » de type. h. Ce texte est donc compilé avec le programme source. Voir fichiers à inclure dans le répertoire C:\Program Files (x86)\CodeBlocks\MinGW\include Ce fichier contient la définition de: constantes (constante M_PI par exemple dans le fichier à inclure math.h) ; #define M_PI 3.14159265358979323846 en-tête de fonctions : sqrt du fichier à inclure math.h _CRTIMP double cdecl sqrt (double); printf, scanf du fichier à inclure stdio.h – STanDard Input-Output -) extern int mingw_stdio_redirect (printf)(const char*,...); …… Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -43- 3.2 Les Caractères 3.2.1 Mode de représentation des caractères en mémoire La représentation informatique d’un caractère se fait en utilisant une table de correspondance qui associe une valeur caractère à une valeur comprise entre 0 et 255. Cette table est un standard informatique « universel » créé en 1884 par Samuel F.B.Morse. Cette table est connue sous le nom de table ASCII (American Standard Code for Information Interchange -« Code Américain Standard pour l'Echange d'Informations »-). Il existe 256 caractères différents constitués en particulier § des caractères alphanumériques abc…., ABC…, 123… § des symboles mathématiques + - * / < > = () § des séparateurs [] {} § des signes de ponctuation.,;:‘ « § des caractères de contrôle comme : CR = Carriage Return (Retour Chariot) LF = LF (Line Feed)....... Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -44- Le code ASCII de base est constitué de 128 caractères (codés de 0 à 127) : codes 0 à 31 : caractères de contrôle (voir paragraphe suivant) ; codes 40 à 62 : opérateurs mathématiques et chiffres ; codes 65 à 90 : représentent les lettres majuscules ; codes 97 à 122 : lettres minuscules (il suffit de modifier le 6ème bit pour passer de majuscules à minuscules, c'est-à-dire ajouter 32 au code ASCII en base décimale.) TABLE des codes ASCII de base (0 à 127) voir table détaillée en Annexe 1 Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -45- Une chaîne de caractère est formée de caractères placés entre apostrophe : « Salut Arthur ». Tous les symboles alphanumériques existant sur le clavier peuvent être placés entre apostrophe au sein d’une chaîne de caractère. Exemple : «A 380 » 3.2.2 Tables étendues des codes ASCII Le code ASCII a été mis au point pour la langue anglaise, il ne contient donc pas les caractères spécifiques de certaines langues (accents par exemple).La table ASCII a donc été étendue en ajoutant 128 caractères codés de la valeur décimale 128 à la valeur décimale 255. Table ASCII étendue OEM (128 à 255) http://i69.servimg.com/u/f69/16/09/33/23/ascii210.gif Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -46- Le code ASCII étendu n'est pas unique et dépend du système informatique utilisé => Problèmes d’affichage des caractères accentués Les deux jeux de caractères ASCII étendus les plus couramment utilisés sont : le code ASCII étendu OEM, qui équipait les premières machines de type IBM PC le code ASCII étendu ANSI, utilisé par les systèmes d'exploitation récents code ASCII étendu OEM en hexadécimal code ASCII étendu ANSI en hexadécimal (de 80 à FF) (de 80 à FF) Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -47- En 1991 un système de codage de caractère sur 2 octets nommé Unicode a été créé pour permettre de représenter la quasi-totalité des alphabets existants (arabe, arménien, cyrillique, grec, hébreu, latin,...). L'ensemble des codes Unicode est disponible sur le site http://www.unicode.org. C’est le système d’exploitation d’une machine qui détermine le système de codage qu’elle utilise. Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -48- Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -49- 3.2.3 Caractères de contrôle et notation spéciale Les symboles correspondant à certaines touches du clavier ne peuvent être utilisées en tant que caractère. En particulier les caractères de contrôle qui permettent de faire des actions telles que: BS (Backspace – Retour arrière) HT (Tabulation) LF (Line Feed – Saut de Ligne) VT (Vertical Tabulation) FF (Saut de page) CR (Carriage Return – Retour Chariot) SP (Space – Espace) BEL (« beep » sonore) Par exemple il est impossible d'utiliser le caractère backspace (retour arrière) du clavier (touche ) qui déplace le curseur d'une position en arrière car au cours de l'édition de texte cela efface le dernier caractère écrit. Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -50- Pour ces caractères spéciaux, on utilise une notation spéciale BEL (« beep » sonore) \a BS (Backspace – Retour arrière) \b HT (Horizontal Tab – Tabulation Horizontale) \t VT (Vertical Tab – Tabulation Verticale) \v notations non supportée par tous les compilateurs LF (Line Feed – Saut de Ligne) \n FF (Form Feed -Saut de page) \f notations non supportée par tous les compilateurs 8 Lorsqu’on affiche un caractère LF (Saut de Ligne) le système rajoute automatiquement l’affichage d’un caractère CR (Retour Chariot) de manière à ce que le curseur d’affichage soit non seulement placé à la ligne suivante mais aussi placé en début de ligne. Exemple d’utilisation du caractère BackSpace noté ‘\b’ en C #include #include int main( ) { printf ("Bonjour"); Bonjour getch(); // attend la frappe d’une touche printf("\b\b\b\bsoir"); Bonsoir return 0; } D’autres notations spéciales \\ \‘ \" permettent de placer dans une chaîne de caractère, les caractères \ ‘ " Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -51- Cette notation spéciale provient des machines à écrire d’antan BEL (« beep » sonore) \a BS (Backspace – Retour arrière) \b HT (Horizontal Tab – Tabulation Horizontale) \t VT (Vertical Tab – Tabulation Verticale) \v LF (Line Feed – Saut de Ligne) \n FF (Form Feed -Saut de page) \f Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -52- 3.2.4 Déclaration, affectation et affichage d’une variable caractère Exemple #include int main( ) { char car ; car='f'; printf("la variable car a pour valeur : %c\n",car); la variable car a pour valeur : f return 0; } On aurait aussi pu initialiser la variable car en utilisant le codage ASCII de la lettre ‘f’ qui vaut 102 en base décimale. On aurait alors écrit : car=102; ce qui est équivalent mais pas très pratique. Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -53- Autre Exemple #include int main( ) { char car ; car='2'; printf("la valeur caractere de car est %c\n",car); printf("mais en memoire car est representee par le nombre %d (en binaire)\n",car); return 0; } la valeur caractere de car est 2 mais en mémoire car est représentée par le nombre 50 (en binaire) _ Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -54- PAS NECESSAIRE Ecriture des constantes caractères ‘à’ ‘\valeur ASCII en octal’ : ‘\205’ ‘\xvaleur ASCII en hexadécimal’ : ‘\x85’ 13310 = 128 + 4 + 1= 27+ 22 + 20= 1000 01012 =2058=85H = (8.161) + (5.160) =13310 La notation ‘\valeur ASCII’ est particulièrement utile pour les caractères ne figurant pas sur le clavier. Par exemple le caractère ‘+’ peut être introduit dans une chaîne de caractère grâce à cette notation ‘\valeur ASCII en octal’ : ‘\361’ ‘\xvaleur ASCII en hexadécimal’ ‘\xF1’ L’instruction : printf(”Incertitude absolue de \xF1%d mm \n”,2) ; ou printf("Incertitude absolue de \361%d mm \n",2) ; conduit à l’affichage suivant message : Incertitude absolue de + 2 mm _ Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -55- 3.3 Les entiers 3.2.1 Mode de représentation des entiers en mémoire Représentation des entier naturels Les entiers naturels sont des entiers positifs ou nuls. Ils sont représentés en binaire (exemple : 5 est représenté par 101). La valeur maximale qui peut être représentée dépend du nombre de bits de codage. n Si n est le nombre de bits de codage, la valeur maximale qui peut être représentée est : 2 -1. (exemple : avec n=8, la valeur maximale représentable est 255). Si on ajoute 1 à la valeur maximale représentable, on obtient la valeur minimale. Exemple dans le cas d’un codage sur 8 bits : 1111 1111 + 1 0000 0000 (avec une retenue de 1 qui est « perdue » puisque la représentation se fait sur 8 bits). Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -56- Représentation d'un entier relatif Les entiers relatifs peuvent prendre des valeurs entières négatives. Il faut donc non seulement coder la valeur mais aussi le signe. Le signe est représenté par le bit de poids fort du motif binaire (0 correspond à + et 1 correspond à -). Exemple : représentation de +5 sur 1 octet 0000 0101 bit de poids fort code le signe + La méthode de codage des entiers négatifs est appelée « complément à deux ». Principe du complément à deux Pour représenter un nombre négatif -5 par exemple - on part de l’écriture du nombre 5 en binaire 0000 0101 (exemple sur 1 octet) - on prend son complément binaire 1111 1010 - on ajoute 1 au complément binaire + 1 1111 1011 bit de poids fort code le signe - Vérification : 5 + (-(5)) " 0. 00000101 + 11111011 00000000 (avec une retenue de 1 « perdue »). Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -57- Si n est le nombre de bits de codage d’un entier relatif, la portée de représentation va de l’entier n-1 n-1 négatif -2 à l’entier positif +2 -1. (exemple : avec n=8, la portée de représentation va de -128 à +127). Codage de -1 0000 0001 (+1) 1111 1110 (Complément à 1) + 1 (Complément à 2) 1111 1111 (-1) Si on ajoute 1 à la valeur maximale représentable, on obtient la valeur minimale. 0111 1111 (+127) + 1 1000 0000 (-128) Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -58- CODAGEsur 8 bits d’un ENTIERSIGNÉ ou NONSIGNÉ http://siteisn.freevar.com/images/negatif.png Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -59- #include int main() { int a,n; printf("Entrez n un entier : ");scanf("%d",&n); printf("Affichage de l'entier %d (code sur %d octets) en binaire:\n\n",n,sizeof(int)); for (a=sizeof(n)*8-1; a>=0;a--) { if ((n>>a)%2)printf("1"); else printf("0"); if (a%4==0) printf(" "); // affiche un espace lorsque 4 chiffres binaires ont été affichés } printf("\n\n\n"); return 0; } Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -60- 3.2.2 Les différents types d’entiers Nombre d’octets 1 2 4 non signé signé non signé signé non signé signé Nom de déclaration unsigned char char unsigned short short unsigned long long ou unsigned int ou int Code format %u %d %u %d %u %d Valeur minimale 0 -128 0 -32 768 0 - 2 147 483 648 Valeur maximale 255 127 65 535 32 767 4 294 967 295 + 2 147 483 647 F Remarque : Le type caractère (codé sur un octet) peut être utilisé pour représenter: des informations alphanumériques (‘a’, ‘1’, ‘+’,…) exemple : char c = ‘z’ ; OU des valeurs entières « très courtes » - non signées comprises entre 0 et 255 (unsigned char) exemple : unsigned char y = 18 ; - signées comprises entre -128 et +127 (char) exemple : char x = -35 ; Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -61- 3.3.3 Ecriture des entiers en base octale et hexadécimale NE PAS FAIRE Les constantes entières peuvent être exprimées en utilisant 3 bases différentes Base décimale n=94 ; Représentation binaire : 0101 1110 Base octale (nombre précédé de 0) n=0136 ; 01|011|110 1 3 6 Base hexadécimale (nombre précédé de 0x) n=0x5E ; 0101|1110 5 E Attention : pour représenter un entier octal ou hexadécimal on convertit sa représentation binaire en octal ou hexadécimal. Si le nombre est signé, son signe est codé par le bit de poids fort, on n’a donc pas à préciser + ou -. Exemple Base décimale : -5 Base octale : 0373 Base hexadécimale : 0xFB Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -62- 3.3.4 Affichage et saisie de variables entières en format octal ou hexadécimal NE PAS FAIRE Pour afficher à l’écran (printf) ou saisir au clavier (scanf) des variables entières au format octal ou hexadécimal on peut respectivement utiliser les codes format %o ou %x (%X pour caractères alphanumériques en MAJUSCULES). Exemple #include #include int main( ) { char a ; printf(“entrez la valeur de a en octal :”); scanf(“%o”,&a); printf(“la valeur de a en decimal est : %d\n”,a); getch() ; } entrez la valeur de a en octal : 0375 la valeur de a en decimal est : -3 _ Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -63- 3.4 Les réels 3.4.1 Mode de représentation des réels en mémoire Rappel "notation scientifique" dite "à virgule flottante" : - 0,006234 s'écrit - 6.234 E - 3 ou - 6.234 e - 3 E ou e correspondent à la valeur 10 → - 6.234 10 - 3 Remarques : le nombre est précédé de son signe la partie entière (ici 6) en valeur absolue est un nombre d'un seul chiffre de 1 à 9 (pas zéro) la partie décimale (ici 234) est séparée de la partie entière par un point (US) ou une virgule (Europe) un exposant décimal entier relatif suit la lettre e ou E : e-3 ou E-3 signifient 10-3 La représentation informatique du réel -0,006234 en mémoire utilise 3 champs : la mantisse (6234) le Bit de signe de la mantisse (bit de poids fort à 1 pour – et 0 pour +) l’Exposant signé (-3). La valeur d’exposant 11111111 ne peut être obtenue qu’à la suite de calculs conduisant à un dépassement de capacité. Elle est alors utilisée pour provoquer un signal d’erreur. Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -64- 3.4.3 Les différents types de réels Nombre d’octets* 4 8 10** **type non supporté pa Nom de déclaration float double long double** tous les compilateurs Code format %f %e %g %lf %le %lg %Lf %Le %Lg Valeur absolue minimale ≈ 1E-38 ≈ 1E-308 ≈ 1E-4932 Valeur absolue maximale ≈ 1E+38 ≈ 1E+308 ≈ 1E+4932 Nombre de chiffres significatifs de la mantisse (±1) 6 15 19 *pas une norme (dépend de la machine et du compilateur) Troncature Exemple #include int main() { double x=0.12,y=21.12345678; printf("x vaut : %lf\ny vaut : %lf\n\n",x,y); printf("x vaut : %12.8lf\ny vaut : %12.8lf\n",x,y); return 0; } 12 :largeur (complétée par des espaces si la valeur affichée est formée de moins de 12 caractères) 8 : précision (nbre de chiffres après la virgule) par défaut la précision est 6 Le code format %e permet d’afficher le réel au format « scientifique » (%E idem affichage de e en MAJ). Le code format %g est dit « alterné » : si le nombre à afficher a un exposant faible le code format utilisé est %f, sinon le code format est %e (%G idem avec e affiché en MAJUSCULE). printf("valeur : %lg\n",0.12); valeur : 0.12 printf("valeur : %lg\n",0.0000012); valeur : 1.2e-006 Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -65- Les réels peuvent indifféremment être exprimés en notation courante ou scientifique. Notation courante Notation scientifique Remarques 3.1416 3.1416E0 3141.6E-3 (autre écriture) 1000. 1E3 1000. E3 E3 (il faut 1 mantisse) 1000..E3 E3 (il faut 1 mantisse) -.02 -2E-2 -200e-5 (autre écriture) 2. 2E0 2e0 (autre écriture).2 2E-1 2 2 2 n’est pas un réel mais un entier Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -66- 3.4.4 Déclaration de constantes En C standard on peut définir des constantes grâce à la directive de compilation #define Il est d’usage d’écrire les identificateurs des constantes en MAJUSCULE. Exemple #include #define TVA 0.02 int main() { printf("la constante TVA vaut : %.2lf\n",TVA ); return 0 ; } la constante TVA vaut : 0.02 _ Chapitre 3 LES DIFFERENTS TYPES DE DONNEES -67- Chapitre 4 LES EXPRESSIONS 1 Notion d’expression La notion d’expression en langage C correspond à la notion d’expression mathématique. Une expression est constituée d’opérandes (variables ou valeurs) éventuellement reliées par des opérateurs ( 2 est une expression sans opérateur simplement constituée d’une valeur constante) Exemples d’opérateurs arithmétiques + – / * ou relationnelles < >= = = != A l’exécution d’un programme, une expression est évaluée et « prend » alors 1 type et 1 valeur. Soient les déclarations double x= -5.; int i=5 ; 2+6 2 x*3 i -x + 3 int 8 int 2 double -15. double 13. ØLorsque l’expression est incohérente (contient des types différents), tous les opérandes de l’expression sont convertis dans le type « le plus fort » (celui qui a la capacité de représentation maximale) Un opérande peut être une constante, une variable scalaire ou la valeur retournée par une fonction. Exemples de valeur retournées par certaines fonctions : sqrt(4) retourne un type double de valeur 2. powf(2,4) retourne un type float de valeur 16 (ces paramètres d’entrée sont également de type float) printf(«comment va?») retourne le nombre de caractères affichés par le printf → int 11 scanf(« %d%f »,&n,&x) retourne le nombre de variables affectées par le scanf int 2 scanf(« %d»,&n) → si scanf ne peutrépond l’utilisateur formeren unactivant entier avec a, et laa,valeur retournée est 0 la touche car l’exécution de ce scanf n’a conduit à l’affectation d’aucune variable Chapitre 4 LES EXPRESSIONS -68- Les expressions sont évaluées de gauche à droite en prenant en compte une hiérarchie des opérateurs. Par exemple pour l’expression 15+5 / 5 - 2 Cette expression est donc de type int et vaut 14 15 + (5/5) -2 donc l’évaluation est faite comme suit : 15 + (5/5 -2 / a une priorité supérieure à - donc l’évaluation est faite comme suit : 15+5 / 5 + a une priorité inférieure à / Pour éviter d’éventuelles erreurs, le programmeur a intérêt à utiliser des parenthèses. (15+ (5/5) – 2) La majorité des opérateurs sont « binaires » (ils nécessitent 2 opérandes) mais certains sont « unaires » (ils ne portent que sur un seul opérande généralement placé à leur droite). Par exemple l’opérateur unaire – (opposé) inverse le signe de l’opérande placé à sa droite Exemple : –a /7 Chapitre 4 LES EXPRESSIONS -69- 2 L’opérateur d’affectation = L’opérateur d’affectation = est une exception car Ø il associe ses 2 opérandes non pas de gauche à droite mais de droite à gauche. (signifie que l’opérande à droit est évalué en 1er) Ø il est l’opérateur de plus faible priorité (« appliqué » en dernier pour évaluer une expression) Ø son opérande gauche est nécessairement une variable qui reçoit l’expression évaluée à droite. Exemple : Soit n un entier, comment est évaluée l’expression n = 5.4 / 2 1. l’expression à droite de l’opérateur = est évaluée 5.4 /2 double 2.7 2. la valeur de cette expression est convertie dans le type de l’opérande de gauche 2.7 est converti en entier → 2 le résultat 3 correspondrait à une arrondie de 2.7 à l’entier le plus proche, (ici on convertit un réel en entier –on ne conserve que sa partie entière, en supprimant sa partie fractionnaire-). 3. cette valeur convertie est affectée à la variable n. n ←2 4. l’expression n = 5.4 / 2 prend la valeur de l’opérande à gauche (ici 2) et son type Valeur 2 Type entier Chapitre 4 LES EXPRESSIONS -70- 3 Evaluation des expressions 1. Conversions systématiques Lors de la traduction du programme source, le compilateur représente : - les variables de type char en int - les variables de type float en double. Ainsi lors de l’exécution du programme, l’unité de calcul qui réalise les opérations arithmétiques et logiques aura une moins grande variété de types à gérer. 2. Expressions incohérentes Le langage C accepte les expressions incohérentes. On peut par exemple ajouter un char et un double. Cela n’a aucun sens mais le compilateur l’accepte et convertit le char en double de manière à ce que le calcul puisse être réalisé. Exemple : 22.4 + ‘A’ est une expression de type double ayant pour valeur 22.4 + 65. soit 87.4 ØLorsque l’expression est incohérente (contient des types différents), tous les opérandes de l’expression sont convertis dans le type « le plus fort » (celui qui a la capacité de représentation maximale) Chapitre 4 LES EXPRESSIONS -71- 3.3 Opérateur de conversion (opérateur de « cast ») Cet opérateur unaire permet de convertir une expression dans le type choisi. Il suffit de faire précéder cette expression par le nom du type choisi entre parenthèses. Exemple 1 : Affichage de √2 powf(2,0.5) Prototype : float powf (float,float) #include #include int main() { printf("affichage en flottant de powf(2,0.5):\t\t\t%.2f\n",powf(2,0.5)); printf("affichage en entier de powf(2,0.5):\t\t\t%d\n",powf(2,0.5)); printf("affichage en entier de (unsigned int )(powf(2,0.5):\t%u\n", (unsigned int )(powf(2,0.5))); return 0; } Chapitre 4 LES EXPRESSIONS -72- Exemple 2 : Calcul de la résolution moyenne d'un écran Soit un écran “22 pouces” (longueur en pouce de la diagonale de l’écran), de résolution (largeur x hauteur) 1920x1080 (format 16/9), calculer la résolution moyenne R de cet écran grâce à la formule: √𝑙𝑎𝑟𝑔𝑒𝑢𝑟2+ 𝑙𝑜𝑛𝑔𝑒𝑢𝑟2 𝑅= diagonale R s’exprime en PPI (nombre de Pixels Per Inch) #include #include int main() { unsigned int largeur=2000,hauteur=1080, diag=22; double resolution; resolution=sqrt(largeur * largeur + hauteur * hauteur)/diag ; printf("Resolution ecran : %u (en ppi)\t %lf (en pixels par cm)\n", resolution, resolution/2.54); printf("Resolution ecran : %.0lf (en ppi)\t\t %.0lf (en pixels par cm)\n", resolution, resolution/2.54); printf("Resolution ecran : %u (en ppi)\t\t %u (en pixels par cm)\n", (unsigned int)resolution, (unsigned int)(resolution/2.54)); return 0; } Arrondie Suppression partie fractionnaire Chapitre 4 LES EXPRESSIONS -73- / #include #include int main() { unsigned int x,p,b; int n; printf("Entrez un nombre entier compris entre 0 et 2^32-1: "); scanf("%u",&x); printf("Entrez la base de representation(entre 2 et 9): "); scanf("%u",&b); printf("Representation de %u en base %u: ",x,b); n=0 ; while ((powf(b,n)) à 2^32-1 n=n-1; if (n==-1) printf("0 ") ; // x est nul, afficher 0 for (n;n>=0;n--) { p=x/(unsigned int)powf(b,n); printf("%u",p); x=x-p*(unsigned int)powf(b ,n); } printf("\n"); return 0; } unsigned int x,p,b; int n; p = x / (unsigned int)powf(b,n); printf("%u",p); Chapitre 4 LES EXPRESSIONS -74- 3.4 Présentation générale des opérateurs On distingue plusieurs grandes catégories d’opérateurs présentés par ordre de hiérarchie décroissante dans le tableau ci-dessous : Catégorie Opérateur Associativité des opérandes Référence ( ) [ ]. -> Gauche --> Droite Unaire + – ++ – – ! ~ * & (cast) sizeof Gauche Droite Arithmétique + - Gauche --> Droite Décalage > Gauche --> Droite Relationnel < >= Gauche --> Droite Relationnel = = != Gauche --> Droite Manip. binaire & Gauche --> Droite Manip. binaire ^ Gauche --> Droite Manip. binaire | Gauche --> Droite Logique && Gauche --> Droite Logique || Gauche --> Droite Conditionnel ?: Gauche --> Droite Affectation = += -= * = /= %= Gauche Droite Chapitre 4 LES EXPRESSIONS -75- 3.5 Présentation des opérateurs les plus courants 3.5.1 Opérateurs arithmétiques Résultat Opérateur Dénomination Effet Exemple avec int x = 7 + addition Ajoute deux valeurs x+3 10 (int) - soustraction Soustrait deux valeurs x-3 4 (int) * multiplication Multiplie deux valeurs