Download Présentation - Cours de Langage C
Transcript
École Centrale de Marseille ² ± Programmation Structurée en Langage C - 1re année ¯ ° Stéphane Derrode, Bureau 206 (Institut Fresnel), [email protected] Pôle Mathématique et Informatique Programmation Structurée en Langage C, 1re année Sommaire ë ë ë ë ë ë ë ë ë ë ë ë ë Introduction, Tr. 3 Types et variables, Tr. 5 Lire et écrire, Tr. 11 Opérateurs et expressions, Tr. 16 Types dérivés (tableaux), Tr. 21 Instructions de contrôle, Tr. 25 Fonctions, Tr. 37 Pointeurs et adresses, Tr. 43 Compilation séparée et Makefile, Tr. 54 Préprocesseur, Tr. 61 Structures, unions et énumérations, Tr. 66 Manipulation des fichiers, Tr. 79 Autres petites choses. Tr. 96 ECM, Mathématique et Informatique, S. Derrode 2 Programmation Structurée en Langage C, 1re année Le langage C ë B.W. Kernighan et D.M. Ritchie : Le Langage C ANSI, 1977 ; ë Langage ¿ universel À : disponible sur toutes les plate-formes (Unix, Linux, Windows, ...) ; ë Langage de ¿ 2e génération À, comme Pascal / Delphi ; ë Langage structuré (modulaire) et impératif : – – – – Types de variables : Nombres entiers, nombres réels, caractères Structures de contrôle : Si ... alors, boucles, séquences Construction de types : Tableaux, structures, enregistrements Sous-programmes : Fonctions ë Langage compilé (6= interprété) ; ë Successeur : langage orienté objet C++ (OG de 2e A). ECM, Mathématique et Informatique, S. Derrode 3 Programmation Structurée en Langage C, 1re année Premiers programmes 1 – Ne fait rien /∗ 2– ¿ Hello World ! À #i n c l u d e <s t d i o . h> Programme minimum ne f a i s a n t rien i n t main ( ) ∗/ { // A f f i c h e i n t main ( ) l e message p r i n t f ( ” \ n H e l l o World ! ” ) ; { return 0 ; return 0 ; } } démo 1 Ligne de compilation : cf. Tr. 105 ECM, Mathématique et Informatique, S. Derrode 4 Programmation Structurée en Langage C, 1re année Principales bases Bases Notations Symboles 2 binaire 0, 1 8 octale 0, 1, ..., 7 10 décimale 0, 1, ..., 9 16 hexadécimal 0, 1, ..., 9, a, b, c, d, e, f décimale binaire octale hexadécimal 70 1000110 106 46 511 111111111 777 1FF 70 = 0 ∗ 20 + 1 ∗ 21 + 1 ∗ 22 + ... + 1 ∗ 26 , 70 = 6 ∗ 160 + 4 ∗ 161 ECM, Mathématique et Informatique, S. Derrode 5 Programmation Structurée en Langage C, 1re année Élément mémoire : bit et octet ë Un octet (ou ¿ byte À) est composé de 8 ¿ bits À, ë Un bit est un élément mémoire de base : valeurs 0 ou 1. ë Un octet : 28 = 256 possibilités, valeurs de -128 à +127. Octet : 8 bits 0 1 0 0 0 1 1 0 Bit de signe ë Mémoire (RAM) : suite d’octets adressés. Memoire (RAM) Octet Adresse Octet 0x2ab09c ECM, Mathématique et Informatique, S. Derrode Octet 0x2ab09d 0x2ab09e 6 Programmation Structurée en Langage C, 1re année Les différents types de variables ý En informatique, on fait la distinction entre les variables contenant des entiers, des nombres réels, des tableaux (vecteurs) de nombres, ... ý On peut distinguer 5 types de variables : ë Types entiers : nombres entiers et caractères - Tr. 8. ë Types flottants : nombre réels - Tr. 10. ë Types dérivés : tableaux (chaı̂nes de caractères) - Tr. 21. ë Types pointeurs : adresse mémoire - Tr. 43. ë Types complexes : structures (unions et énumérations) - Tr. 66. ECM, Mathématique et Informatique, S. Derrode 7 Programmation Structurée en Langage C, 1re année Types entiers ý 3 types entiers ë char : ’a’ (1 octet), de -128 à +127. ë Tr. 9 ë short int : -10814 (2 octets), de -32768 à +32767. ë int, long int : 158141234 (4 octets), de ... à ... Qualificatifs : signed (défaut) ou unsigned. ý Déclaration, initialisation de variables Déclaration Initialisation Les deux int i ; i=-5 ; unsigned int k=5, j=2 ; unsigned char c ; c=’s’ ; (c=115 ;) char v = 168 ; ý Constantes : const unsigned char c=’S’ ; const int dix=10 ; ECM, Mathématique et Informatique, S. Derrode 8 Programmation Structurée en Langage C, 1re année Type char ë Entre côtes : ’a’, ’z’, ’B’ ý Table des codes ASCII (annexe du poly. de langage C). ë Valeur de type entier ’A’ à ’Z’ : caractères majuscule ý code ASCII : 65 à 90 ’a’ à ’z’ : caractères minuscule ý code ASCII : 97 à 122 ’0’ à ’9’ : caractères chiffres ý code ASCII : 48 à 57 ë Caractères spéciaux : ’\’’ : apostrophe ý code ASCII : 39 ’\\’ : antislash ý code ASCII : 92 ’\t’ : tabulation ý code ASCII : 9 ’\n’ : saut de ligne ý code ASCII : 10 ’\0’ : terminaison de chaı̂ne ý code ASCII : 0 ECM, Mathématique et Informatique, S. Derrode 9 Programmation Structurée en Langage C, 1re année Types flottants ý 3 types flottants ë float : 125.46 (4 octets), de −1038 à +1038 . ë double,long double : 1.55e-6, (8 octets), de −10308 à +10308 . Qualificatifs signed ou unsigned interdits ! ! ! ý Déclaration, initialisation de variables Déclaration Initialisation Les deux ensemble float v ; v=-5.8975 ; float w=4.25, z=-5E-5 ; double x ; x=+5.23e-12 ; double y = -168E2 ; ý Variable à valeur constante : const double PI=3.14 ; ECM, Mathématique et Informatique, S. Derrode 10 Programmation Structurée en Langage C, 1re année Lire / Écrire (Input/Output) Librairie standard : #include<stdio.h> printf() : Le programme affiche des résultats sur la console. ë int i=5 ; printf("La valeur de i est %d", i) ; ë char c=’A’ ; printf("Caractere : %c, code ASCII : %d", c, c) ; ë char ch[9]="hello" ; printf("message : %s", ch) ; scanf() : L’utilisateur donne des informations au programme. ë float reel ; scanf("%f", &reel) ; ë float r1,r2,r3 ; printf("Entrez trois nombres réels :") ; scanf("%f%f%f", &r1, &r2, &r3) ; Exemples : cf. poly Langage C, Chapitre 3. démo 2 ECM, Mathématique et Informatique, S. Derrode 11 Programmation Structurée en Langage C, 1re année Déclaration Lecture Écriture Format externe int i ; scanf("%d",&i) ; printf("%d",i) ; décimal int i ; scanf("%o",&i) ; printf("%o",i) ; octal int i ; scanf("%x",&i) ; printf("%x",i) ; hexadécimal float m ; scanf("%f",&m) ; printf("%f",m) ; point décimal double m ; scanf("%lf",&m) ; printf("%lf",m) ; point décimal double m ; scanf("%le",&m) ; printf("%le",m) ; exponentielle double m ; scanf("%lg",&m) ; printf("%lg",m) ; la + courte char o ; scanf("%c",&o) ; printf("%c",o) ; caractère char p[10] ; scanf("%s",p) ; printf("%s",p) ; chaı̂ne de caractères ECM, Mathématique et Informatique, S. Derrode 12 Programmation Structurée en Langage C, 1re année Exemples de printf() et scanf() #i n c l u d e <s t d i o . h> i n t main ( ) { i nt a = 5 ; i nt b = a ; a = 8; p r i n t f ( ” a = %d , b = %d” , a , b ) ; return 0 ; } ECM, Mathématique et Informatique, S. Derrode 13 Programmation Structurée en Langage C, 1re année démo 3 #i n c l u d e <s t d i o . h> i n t main ( ) { char t t [ 8 0 ] ; // Tableau de 80 c a r a c t è r e s p r i n t f ( ” Donnez une c h a i n e de c a r a c t e r e s : ” ) ; s c a n f ( ”%s ” , t t ) ; p r i n t f ( ” \nLa c h a i n e e n t r e e e s t : %s \n” , t t ) ; return 0 ; } ECM, Mathématique et Informatique, S. Derrode 14 Programmation Structurée en Langage C, 1re année #i n c l u d e <s t d i o . h> in t main ( ) { i n t i =10; float l =3.14159; char p [ 5 0 ] = ” Bonjour ” ; p r i n t f ( ”Avant l e c t u r e au c l a v i e r : %d %f %s \n” , i , l , p ) ; s c a n f ( ”%d%f%s ” ,& i ,& l , p ) ; p r i n t f ( ” Apres l e c t u r e au c l a v i e r : %d %f %s \n” , i , l , p ) ; return 0 ; } ECM, Mathématique et Informatique, S. Derrode 15 Programmation Structurée en Langage C, 1re année Opérateurs arithmétiques Par ë ë ë ë ordre -, + +, *, / % de priorité croissante : unaire (inverse/confirme le signe). Ex : -a, +5.6 : addition et soustraction. Ex : 6+5, a-5.6 : multiplication et division. Ex : 6*5, a/5.6 : reste de la division entière. Ex 7%2 donne 1 (7 = 3 ∗ 2 + 1) démo 4 #i n c l u d e <s t d i o . h> i n t main ( ) { i n t i =10 , j =−3; i n t k = i −j ; p r i n t f ( ” \nk=%d , c a l c u l=%d\n” , k , ( i ∗ i )%(− j ) ) ; return 0 ; } ECM, Mathématique et Informatique, S. Derrode 16 Programmation Structurée en Langage C, 1re année Librairie mathématique : #include<math.h> : cos, sin, tan, ... démo 5 #i n c l u d e <s t d i o . h> #i n c l u d e <math . h> i n t main ( ) { double a ; p r i n t f ( ” \ n E n t r e z un a n g l e s c a n f ( ”% l f ” , &a ) ; : ”) ; p r i n t f ( ” Le c o s de l ’ a n g l e vaut : % l f \n” , c o s ( a ) ) ; p r i n t f ( ” Son l o g a r i t h m e vaut : % l f \n” , l o g 1 0 ( a ) ) ; return 0 ; } Attention ë float ë float ë int i ë float : Conversion implicite et explicite (¿ cast À) f = 2 / 4; ýf = f = 2.0 / 4 ; ýf = = 2.0 / 4 ; ýi = j = (float) 3/2 ; ýj = 0.0 0.5 0 1.5 ECM, Mathématique et Informatique, S. Derrode 17 Programmation Structurée en Langage C, 1re année Incrémentation et décrémentation Incrémentation ë i++ ; ou ++i ; signifie i = i + 1 ; ë i += n ; signifie i = i + n ; ë Même chose avec i--, --i et i -= n Pré-incrémentation ë int i = 5 ; int a = ++i ; donne i=6 ë int i = 5 ; int a = --i ; donne i=4 Post-incrémentation ë int i = 5 ; int a = i++ ; donne i=6 ë int i = 5 ; int a = i-- ; donne i=4 ECM, Mathématique et Informatique, S. Derrode et a=6 et a=4 et a=5 et a=5 18 Programmation Structurée en Langage C, 1re année Opérateurs relationnels et logiques ý Opérateurs relationnels (true ou false) ë ==, != : identité, différent . Ex : A == 5 ë >, <, >=, <= : supérieur, inférieur Exemples int A = 10, B = -5 ; ë A == B ý 0 : false ë A >= B ý 1 : true Attention Les deux opérandes doivent avoir le même type arithmétique, sinon une conversion de types est effectuée. ý Opérateurs logiques : ë ! : négation unaire d’une valeur logique. Ex : !true == false ë && : ¿ ET À de deux valeurs logiques. Ex : true && false == false ë || : ¿ OU À de deux valeurs logiques. Ex : true || false == true Exemple de combinaison d’opérateurs : (K>5) && (L<10). ECM, Mathématique et Informatique, S. Derrode 19 Programmation Structurée en Langage C, 1re année Priorité des opérateurs (ordre décroissant) Classe d’opérateur Opérateur(s) Associativité Parenthèsage () de gauche à droite Suffixes [] -> . ++ –– de gauche à droite Unaires & * + - ! sizeof ∼ de droite à gauche Changement de type (type) de droite à gauche Multiplicatifs * / % de gauche à droite Additifs + - de gauche à droite Décalage << >> de gauche à droite Comparaisons < <= > >= de gauche à droite Égalités == != de gauche à droite ET bit à bit & de gauche à droite OU exclusif bit à bit ∧ de gauche à droite OU bit à bit de gauche à droite ET logique && de gauche à droite OU logique de gauche à droite Condition ? : de droite à gauche Affectations = += -= *= /= &= = ∧= <<= >>= de gauche à droite Succession , de gauche à droite ECM, Mathématique et Informatique, S. Derrode 20 Programmation Structurée en Langage C, 1re année Types dérivés (1) : tableaux ë Déclaration : int tab[5] ; ë Initialisation : – double tf[10]={3.5, 4.8, -2, 1.2} ; – float tab[2][3]={{1.2, -1}, {5.8}} ; tab[0][1] tf[0] 3.5 4.8 tf[5] -2 1.2 0 0 0 0 0 1.2 -1 0 5.8 0 0 0 tab[1][2] ë Affectation : – tf[5] = 3.8 ; – tab[0][2] = -5.0 ; ECM, Mathématique et Informatique, S. Derrode 21 Programmation Structurée en Langage C, 1re année #i n c l u d e <s t d i o . h> i n t main ( ) { double t f [ 5 ] = { 1 . 2 , −4.7 , 3 . 4 } ; p r i n t f ( ”\ n t f [0]= %l f ” , t f [ 0 ] ) ; double t = t f [ 2 ] ; p r i n t f ( ” \ nt = %l f ” , t ) ; démo 6 t f [ 3 ] = −8.789; p r i n t f ( ”\ n t f [3]= %l f ” , t f [ 3 ] ) ; p r i n t f ( ”\ n t f [5]= %l f ” , t f [ 5 ] ) ; tf [5] = 1.21; p r i n t f ( ” t f [5]= %l f ” , t f [ 5 ] ) ; return 0 ; } ECM, Mathématique et Informatique, S. Derrode 22 Programmation Structurée en Langage C, 1re année Types dérivés (2) : chaı̂nes de caractères ë Déclaration : char chaine[20] ; ë Initialisation : – char hello1[13] = {’b’,’o’,’n’,’j’,’o’,’u’,’r’} ; – char hello2[13] = "bonjour" ; b o n j o u r s a \0 – char ch[] = "message" ; m e s g e \0 ë ch[4] = ’b’ : remplace la lettre a par la lettre de b. ë Pensez à ajouter un espace mémoire pour le caractère de terminaison de chaı̂ne \0. ë La fonction strlen() (bibliothèque #include <string.h>) ne s’applique qu’aux chaı̂nes de caractère (et non aux tableaux de nombres !). ECM, Mathématique et Informatique, S. Derrode 23 Programmation Structurée en Langage C, 1re année démo 7 #i n c l u d e <s t d i o . h> #i n c l u d e < s t r i n g . h> i n t main ( ) { char ch1 [ 5 0 ] = ” Bonjour ! ” ; p r i n t f ( ” \ nch1=%s ; ch1 [3]=% c ; ch1 [20]=% c ” , ch1 , ch1 [ 3 ] , ch1 [ 2 0 ] ) ; char ch2 [ 1 2 0 ] ; p r i n t f ( ” \ n E n t r e z une c h a i n e : ” ) ; s c a n f ( ”%s ” , ch2 ) ; ch2 [ 3 ] = ’ Z ’ ; p r i n t f ( ” \ nch2=%s ; ch2 [3]=% c ; ch2 [20]=% c ” , ch2 , ch2 [ 3 ] , ch2 [ 2 0 ] ) ; i n t t a i l l e = s t r l e n ( ch2 ) ; p r i n t f ( ” \ n T a i l l e de ch2 = %d” , taille ) ; return 0 ; } ECM, Mathématique et Informatique, S. Derrode 24 Programmation Structurée en Langage C, 1re année Instructions de contrôle ë Instructions conditionnelles : if : test. Tr. 26 switch : table de branchement. Tr. 28 ë Instructions répétitives : while. Tr. 30 for. Tr. 32 do ... while. Tr. 31 ë Rupture de séquence : continue. Tr. 35 break, return. Tr. 36 ECM, Mathématique et Informatique, S. Derrode 25 Programmation Structurée en Langage C, 1re année Inst. cond. : if 1- if ( expression ) if p r i n t f ( ”Au r e v o i r instruction 2- if ( expression ) if instruction2 ECM, Mathématique et Informatique, S. Derrode ! ”) ; ( ( n==1) && (m>=10) ) { p r i n t f ( ” Bonjour ” ) ; instruction1 else ( f i n == 1 ) fin = 1; } else p r i n t f ( ”Au r e v o i r ” ) ; 26 Programmation Structurée en Langage C, 1re année i n t main ( ) { p r i n t f ( ” V o u l e z vous i m p r i m e r l e mode d ’ e m p l o i ?\ n” ) ; char c ; s c a n f ( ”%c ” , &c ) ; if ( c== ’ o ’ ) p r i n t f ( ” \ nJe l a n c e l e p r o c e s s u s d ’ i m p r e s s i o n ” ) ; else { i f ( c== ’ n ’ ) p r i n t f ( ” \ nJe ne f a i s r i e n ” ) ; else p r i n t f ( ” Tapez o ou n” ) ; } return 0 ; } ECM, Mathématique et Informatique, S. Derrode 27 Programmation Structurée en Langage C, 1re année Inst. cond. : switch switch (expression) { case value1 : bloc inst 1 break ; case value2 : bloc inst 2 break ; case valueN : bloc inst N break ; default : bloc inst d break ; } ECM, Mathématique et Informatique, S. Derrode 28 Programmation Structurée en Langage C, 1re année Inst. cond. : switch char c ; démo 8 s c a n f ( ”%c ” , &c ) ; switch ( c ) int { case ’a ’ : p r i n t f ( ” Choix switch ( i ) ’a ’”) ; { break ; case ’A ’ i ; s c a n f ( ”%d ” , & i ) ; : p r i n t f ( ” Choix ’A ’ ” ) ; case 1 : case 2 : p r i n t f ( ” Choix 1 ou 2 ” ) ; break ; case ’b ’ break ; : p r i n t f ( ” Choix ’b ’”) ; break ; case ’B ’ : case 4 : p r i n t f ( ” Choix 3 ou 4 ” ) ; : p r i n t f ( ” Choix break ; ’B ’ ” ) ; default break ; default case 3 : p r i n t f ( ” Mauvais : p r i n t f ( ” Mauvais choix choix ! ”) ; break ; ! ”) ; } break ; } ECM, Mathématique et Informatique, S. Derrode 29 Programmation Structurée en Langage C, 1re année Inst. répétitive : while while ( expression de fin ) instruction i n t nb ; p r i n t f ( ” \ n E n t r e z un nombre : ” ) ; s c a n f ( ”%d” , &nb ) ; Instruction Condition int i = 0 ; while ( i <nb ) Vrai Faux { printf (” Iteration : %d” , i ) ; i ++; } ECM, Mathématique et Informatique, S. Derrode 30 Programmation Structurée en Langage C, 1re année Inst. répétitive : do ... while do instruction while ( expression de fin ) ; démo 9 Instruction in t s [ 1 0 ] , i =0 , n =5634; do { s [ i ] = n % 10; Condition i ++; Vrai Faux n /= 1 0 ; } while ( n > 0 ) ; ECM, Mathématique et Informatique, S. Derrode 31 Programmation Structurée en Langage C, 1re année Inst. répétitive : for for ( exp1 ; exp2 ; exp3 ) instruction Initialisation Exp 1 Rebouclage Exp 3 Test Exp 2 Instruction ECM, Mathématique et Informatique, S. Derrode Vrai Faux 32 Programmation Structurée en Langage C, 1re année double ta b [ 4 ] = { 3 . 2 , 5 . 1 , 9 , −1.8}; démo 10 int i ; f o r ( i =0; i <=3; i ++) p r i n t f ( ” \ n V a l e u r : % l f ” , t ab [ i ] ) ; i n t nb ; p r i n t f ( ” E n t r e z un nombre : ” ) ; s c a n f ( ”%d” , &nb ) ; f o r ( i n t i=nb ; i >0; i −−) char ch1 [ ] = ” Coucou ! ” ; char ch2 [ 5 0 ] ; int i ; f o r ( i =0; i <=s t r l e n ( ch1 ) ; i ++) ch2 [ i ] = ch1 [ i ] ; p r i n t f ( ” Copie=%s ” , ch2 ) ; p r i n t f ( ” I t e r numero : %d” , i ) ; ECM, Mathématique et Informatique, S. Derrode 33 Programmation Structurée en Langage C, 1re année ECM, Mathématique et Informatique, S. Derrode 34 Programmation Structurée en Langage C, 1re année Rupture : continue int i , j = 0 ; char c =0; f o r ( i = 0 ; c != ’ \n ’ ; i ++){ s c a n f ( ”%c ” , &c ) ; i f ( ( c == ’ ’ | | ( c == ’ \ t ’ ) | | ( c == ’ \n ’ ) ) continue ; j ++; } démo 11 Le programme compte le nombre de caractères non blancs entrés au clavier et le nombre total de caractères (jusqu’à un Retour-chariot). ë i contient le nombre total de caractères qui ont été tapés au clavier ; ë j contient le nombre de caractères non blancs ; ECM, Mathématique et Informatique, S. Derrode 35 Programmation Structurée en Langage C, 1re année Rupture : break i n t i , j =0; char c =0; f o r ( i =0; ; i++ ) { s c a n f ( ”%c ” ,& c ) ; i f ( c == ’ \n ’ ) break ; i f ( ( c == ’ ’ ) | | ( c == ’ \ t ’ ) ) continue ; j++ ; } ë La boucle se termine lorsque l’utilisateur tape un retour-chariot. ECM, Mathématique et Informatique, S. Derrode 36 Programmation Structurée en Langage C, 1re année Fonctions : rôles et intérêts ý Objectifs : Découper un programme en petites entités : ë Indépendantes ; ë Réutilisables ; ë Plus lisibles. ý Où : Les fonctions peuvent être définies : ë Dans le fichier principal ; ë Dans d’autres fichiers source (compilation séparée - Tr. 54) ; ý Syntaxe d’une fonction type de retour nom fonction ( arguments ) { declarations des variables locales ; instructions ; } ECM, Mathématique et Informatique, S. Derrode 37 Programmation Structurée en Langage C, 1re année Fonction sans argument // En−t ê t e de l a // D é c l a r a t i o n de l a fonction void A f f i c h e ( ) { p r i n t f ( ” Message ” ) ; } fonction void A f f i c h e ( ) ; // f o n c t i o n principale i n t main ( ) { // 1 p p e l de l a // f o n c t i o n principale i n t main ( ) { // Appel de l a fct Affiche () ; return 0 ; } fct Affiche () ; return 0 ; } // D é c l a r a t i o n de l a fonction void A f f i c h e ( ) { p r i n t f ( ” Message ” ) ; } ECM, Mathématique et Informatique, S. Derrode 38 Programmation Structurée en Langage C, 1re année Fonction : valeur de retour #include<s t d i o . h> #include<math . h> // D é c l a r a t i o n de l a f o n c t i o n double S i n u s ( ) { double a n g l e ; s c a n f ( ”% l f ” , &a n g l e ) ; return s i n ( a n g l e ) ; } i n t main ( ) { double r e s ; // Appel de l a f o n c t i o n res = Sinus () ; p r i n t f ( ”\ nRe sult at = %l f ” , r e s ) ; return 0 ; } ECM, Mathématique et Informatique, S. Derrode 39 Programmation Structurée en Langage C, 1re année Fonction : passage d’argument par valeur démo 13 #i n c l u d e<s t d i o . h> // D é c l a r a t i o n de l a f o n c t i o n i n t Add ( i n t v a l 1 , i n t v a l 2 ) { int r e s u l t ; // d e c v a r r e s u l t = val1 + val2 ; // c a l c u l return r e s u l t ; // r e t o u r } int main ( ) { int res , a = 5 , b = 8; // A p p e l s de l a f o n c t i o n r e s = Add ( a , b ) ; r e s = Add( −8 , 1 5 ) ; r e s = Add( −8∗2 −5 , 6∗ a ) ; return locale p r i n t f ( ” \ n R e s u l t a t = %d ” , p r i n t f ( ” \ n R e s u l t a t = %d ” , p r i n t f ( ” \ n R e s u l t a t = %d ” , res ) ; res ) ; res ) ; 0; } ë Les arguments transmis sont recopiés dans les variables locales de la fonction. ECM, Mathématique et Informatique, S. Derrode 40 Programmation Structurée en Langage C, 1re année Fonctions récursives ë La fonction s’appelle elle-même ! ë Exemple : 4! = 4 ∗ 3!. démo 16 #i n c l u d e <s t d i o . h> // int D é c l a r a t i o n de la fonction f a c t ( int n) { if fact(4) 4*fact(3) 4*6 = 24 fact(3) 3*fact(2) 3*2 = 6 fact(2) 2*fact(1) 2*1 = 2 fact(1) 1 ( n<=1) return 1; else return n∗ f a c t ( n−1) ; } int main ( ) // { Appel de la fonction p r i n t f ( ”\ n F a c t o r i e l return 4 = %d ” , fact (4) ) ; 0; } Attention au test de fin de récursivité ! ECM, Mathématique et Informatique, S. Derrode 41 Programmation Structurée en Langage C, 1re année Pointeurs et adresses ë ë ë ë Type pointeur, Tr. 43 Pointeurs et tableaux, Tr. 46 Allocation dynamique de mémoire, Tr. 48 Passage d’arg. par adresse dans les fonctions, Tr. 51 ECM, Mathématique et Informatique, S. Derrode 42 Programmation Structurée en Langage C, 1re année Type pointeur ë Variables : float x=-12.98587E-5 ; char c=’F’ ; Octet Octet c=’F’ x=-12.98567E-5 0x2ab091 0x2ab097 ë Pointeurs : Déclaration : float* px ; et char* pc ; Initialisation : px = &x ; et pc = &c ; Octet Octet px=0x2ab091 0x2fc0b3 pc=0x2ab097 0x2fc0b8 ë Remarque : La taille d’un pointeur, c’est à dire la quantité de mémoire réservée au stockage d’une adresse, est de 4 octets (quel que soit le type sur lequel il pointe). sizeof(char*)==sizeof(double*)==4 sizeof(char)==1 ; sizeof(double)==8 ECM, Mathématique et Informatique, S. Derrode 43 Programmation Structurée en Langage C, 1re année Schéma global : px c pc x Autre exemple : i n t x=1 , y =2; i n t ∗ px ; // p i p o i n t e s u r un i n t px = &x ; // p i p o i n t e s u r x y = ∗px ; // y r e ç o i t ∗px = 0 ; la valeur 1 (x) // x vaut 0 Remarques : ë &*p est identique à p (pour p un pointeur) ë Opérateurs sur les pointeurs : +, -, ++, --, +=, -=, ==, != ... ë p=NULL : identique à l’initialisation à 0 d’une variable entière ou flottante. ECM, Mathématique et Informatique, S. Derrode 44 Programmation Structurée en Langage C, 1re année #i n c l u d e <s t d i o . h> void main ( ) { int i = 0 ; i n t ∗p ; float x = 3.14; float ∗ f ; p = &i ; ∗ f = 666; f = &x ; ∗ f = ∗p ; ∗p = 3 4 ; p = f; ∗p = ∗p + 1 ; p r i n t f ( ” \ n i=%d ; ∗ f=%f ” , i , ∗ f ) ; } Supprimer les lignes invalides - Que s’affiche-t’il ? ECM, Mathématique et Informatique, S. Derrode 45 Programmation Structurée en Langage C, 1re année Pointeurs et Tableaux ë Tableau 1D (Vecteur) : int vect[5] = {2, 3, 4, 5, 6} ; vect[0] vect[1] 2 vect[2] 3 vect[3] 4 vect[4] 5 6 0x2fcb03 0x2fcb05 0x2fcb07 0x2fcb09 0x2fcb0b vect vect+1 vect+2 vect+3 vect+4 ë &vect[0] == vect ë &vect[i] == vect+i ë vect[i] == *(vect+i) : Adresse du 1er élément de vect. : Adresse du ième élément de vect. : Valeur du ième élément de vect. ý C’est la fin du mystère scanf("%s", chaine) ; ! ECM, Mathématique et Informatique, S. Derrode 46 Programmation Structurée en Langage C, 1re année ý À vous de deviner ... : f l o a t ∗p , ∗q ; f l o a t tab [ 5 ] = { 1 , 2 , 3 , 4 , 5 } ; p = &tab [ 2 ] ; p = tab +2; ∗p= 0 . 0 ; q = p++; ∗ ( q+2) = −10; \\ Post−i n c ré m e n t a t i o n ! Supprimer les lignes invalides - État du vecteur ? ECM, Mathématique et Informatique, S. Derrode 47 Programmation Structurée en Langage C, 1re année Allocation dynamique de mémoire ý Types d’allocation : ý Allocation statique : ë Pour créer et supprimer des ¿ objets À lors de la compilation. ë Utilise la pile (limitée en taille). ë La taille de la mémoire à allouer doit être connue à la compilation. ý Allocation dynamique : ë Pour créer et supprimer des ¿ objets À lors de l’execution. ë Utilise le tas (limitée par la mémoire de votre PC). ë La taille de la mémoire à allouer peut être connue lors de l’éxecution. ý Allocation dynamique : librairie #include<stdlib.h> ë malloc() alloue de la mémoire ë free() libère de la mémoire ECM, Mathématique et Informatique, S. Derrode 48 Programmation Structurée en Langage C, 1re année démo 12 #i n c l u d e <s t d i o . h> #i n c l u d e <s t d l i b . h> i n t main ( ) { int t a i l l e , i ; p r i n t f ( ” E n t r e z l a t a i l l e du v e c t e u r s c a n f ( ”%d” , & t a i l l e ) ; : ”) ; double ∗ ta b ; ta b = ( double ∗ ) m a l l o c ( t a i l l e ∗ s i z e o f ( double ) ) ; f o r ( i =0; i < t a i l l e ; i ++) t a b [ i ] = 8 . 0 ∗ i ; f r e e ( ta b ) ; return 0 ; } ECM, Mathématique et Informatique, S. Derrode 49 Programmation Structurée en Langage C, 1re année Allocation dynamique de mémoire : Exo ë Tableau 2D (Matrice) : Écrire un programme qui alloue dynamiquement la mémoire d’un tableau à deux dimensions, selon le schéma suivant (exemple : 4 lignes, 2 colonnes) : 1 2 3 4 5 6 7 8 démo 12bis ECM, Mathématique et Informatique, S. Derrode 50 Programmation Structurée en Langage C, 1re année Passage d’arguments par adresse dans les fonctions démo 14 #i n c l u d e<s t d i o . h> void Swap ( i n t ∗ pt1 , i n t aux = ∗ p t 1 ; ∗ pt1 = ∗ pt2 ; ∗ p t 2 = aux ; } int int ∗ pt2 ) { main ( ) { int a = 5 , b = 8; p r i n t f ( ” \ na= %d , Swap(&a , &b ) ; p r i n t f ( ” \ na= %d , return b = %d ” , a, b) ; b = %d ” , a, b) ; 0; } ë Les arguments transmis sont les adresses des variables. Les valeurs des variables de la fonction appellante sont modifiées. ECM, Mathématique et Informatique, S. Derrode 51 Programmation Structurée en Langage C, 1re année Calcul de la longueur d’une chaı̂ne démo 15 i n t s t r l e n 1 ( char ∗ s ) { int n ; f o r ( n =0;∗ s != ’ \0 ’ ; n++) s ++; return n ; } i n t s t r l e n 2 ( char ∗ s ) { char ∗ p=s ; while ( ∗p != ’ \0 ’ ) p++; return p−s ; // Conv . hé x a −> dé c . } i n t main ( ) { int t a i l l e 1 , t a i l l e 2 ; char c h a i n e [ ] = ” La p i e c h a n t e . ” ; t a i l l e 1 = s t r l e n 1 ( chaine ) ; t a i l l e 2 = s t r l e n 2 ( chaine ) ; p r i n t f ( ” \ n t a i l l e 1=%d , t a i l l e 2=%d” , return 0 ; } ECM, Mathématique et Informatique, S. Derrode taille1 , taille2 ) ; 52 Programmation Structurée en Langage C, 1re année Concaténation de deux tableaux #i n c l u d e <s t d i o . h> #i n c l u d e <s t d l i b . h> co n s t i n t TAILLE=3; i n t ∗ C o n c a t V e c t ( i n t ∗ Vect1 , i n t ∗ V e c t 2 ) { i n t ∗ NewVect ; NewVect = ( i n t ∗ ) m a l l o c ( 2 ∗ TAILLE∗ s i z e o f ( i n t ) ) ; f o r ( i n t k =0; k<TAILLE ; k++) { NewVect [ k ] = Vect1 [ k ] ; NewVect [ k+TAILLE ] = V e c t 2 [ k ] ; } return NewVect ; } i n t main ( ) { i n t t a b 1 [ TAILLE ] = { 1 , 2 , 3 } ; i n t t a b 2 [ TAILLE ] = { 4 , 5 , 6 } ; int ∗ tab12 ; tab12 = ConcatVect ( tab1 , tab2 ) ; ... f r e e ( t a b 1 2 ) ; // l i b é r a t i o n mémoire return 0 ; } ECM, Mathématique et Informatique, S. Derrode 53 Programmation Structurée en Langage C, 1re année Compilation séparée ý Compilation d’un programme dans un seul fichier ë 1 : gcc main.c -o prg ë fichiers main.o et prg Equivalent à ë 1 : Compilation gcc -c main.c ë fichier main.o ë 2 : Ed. de liens gcc main.o -o prg ë éxecutable prg ý Compilation d’un programme dans plusieurs fichiers ë Les fonctions sont réparties dans plusieurs fichiers. ë Les fonctions non déclarées dans le fichier principal (celui contenant la fonction int main() ...) sont appelées fonctions externes. ECM, Mathématique et Informatique, S. Derrode 54 Programmation Structurée en Langage C, 1re année main.c fichier.c Precompilation main.i fichier.i Compilation main.o fichier.o Edition de liens prg ë 1 : Compilation gcc -c main.c ë fichier main.o ë 2 : Compilation gcc -c fichier.c ë fichier fichier.o ë 3 : Ed. de liens gcc main.o fichier.o -o prg ë éxecutable prg ECM, Mathématique et Informatique, S. Derrode 55 Programmation Structurée en Langage C, 1re année // main . c // f i c h i e r . c // P r o t o t y p e d e s f o n c t i o n s int plus ( int a , int b) { extern i n t p l u s ( i n t a , i n t b ) ; int c ; extern i n t mult ( i n t a , i n t b ) ; c = a + b; return c ; // Programme p r i n c i p a l } i n t main ( ) { int a = 5 , b = 8 ; i n t mult ( i n t a , i n t b ) { int r e s u l t 1 = plus ( a , b) ; int c ; i n t r e s u l t 2 = mult ( a , b ) ; c = a ∗ b; return 0 ; } return c ; } On délocalise les en-têtes des fonctions dans un fichier ¿ header file À, que l’on appelle généralement fichier.h (extension .h). Dans ce fichier, on y ajoute la définition des constantes, des structures, les macro-fonctions ... ECM, Mathématique et Informatique, S. Derrode 56 Programmation Structurée en Langage C, 1re année // f i c h i e r . h extern i n t p l u s ( i n t a , i n t b ) ; extern i n t mult ( i n t a , i n t b ) ; // f i c h i e r . c // main . c int plus ( int a , int b) { #i n c l u d e ” f i c h i e r . h” int c = a + b ; return c ; i n t main ( ) { } int a = 5 , b = 8 ; int r e s u l t 1 = plus ( a , b) ; i n t r e s u l t 2 = mult ( a , b ) ; i n t mult ( i n t a , i n t b ) { int c = a ∗ b ; return 0 ; return c ; } } démo 17 à modifier ECM, Mathématique et Informatique, S. Derrode 57 Programmation Structurée en Langage C, 1re année Makefile : pour simplifier la compilation ë Principe du Makefile ë Au lieu de taper toutes les commandes de compilation et d’édition de liens, on peut les regrouper dans un fichier (généralement appelé Makefile ou makefile). ë Les Makefile doivent respecter une syntaxe très particulière. ë On lance la compilation grâce à l’utilitaire make, qu’il suffit d’exécuter avec make (ou make -f Makefile). ë La compilation par make est intelligente, au sens où n’est recompilé que ce qui a été modifié. ECM, Mathématique et Informatique, S. Derrode 58 Programmation Structurée en Langage C, 1re année ë Règle d’écriture d’un Makefile Le principe pour ¿ rédiger À un Makefile est de décrire les dépendances entre les fichiers selon le principe suivant : fichier cible : liste fichiers requis <tabulation> commande associee ý fichier cible : Nom du fichier qui doit être mis à jour. ý liste fichiers requis : Liste des fichiers (séparés par des espaces) dont dépend fichier cible. Ces fichiers sont nécessaires à la création de fichier cible. ý commande associée : Ligne de commande permettant la mise à jour de fichier cible. ECM, Mathématique et Informatique, S. Derrode 59 Programmation Structurée en Langage C, 1re année ë Exemple de Makefile # C ré a t i o n de l ’ e x é c u t a b l e par é d i t i o n de l i e n s . prg : main . o f i c h i e r . o g c c −o prg main . o f i c h i e r . o # C ré a t i o n de main . o par c o m p i l a t i o n . main . o : main . c f i c h i e r . h g c c −c main . c # C ré a t i o n de f i c h i e r . o par c o m p i l a t i o n . fichier .o: fichier . c fichier .h g c c −c f i c h i e r . c ECM, Mathématique et Informatique, S. Derrode 60 Programmation Structurée en Langage C, 1re année Préprocesseur ý Le préprocesseur intervient juste avant la phase de compilation. Il prend en compte : ë Les commentaires (suppression), ë Les commandes commençant par #. ý 4 types de directives commençant par # ë Inclusion des fichiers d’en-tête (#include) ë Définition de variables du pré-processeur (#define et #undef) ë Les macro-fonctions (#define) ë La sélection de codes en fonction des variables du pré-processeur (#if, #else, #elif et #end) ECM, Mathématique et Informatique, S. Derrode 61 Programmation Structurée en Langage C, 1re année Variables du pré-processeur ý Constante de pré-compilation Sans constante de pré-compilation Avec constante de pré-compilation #define LG 20 int tab[20] ; int tab[LG] for( i=0 ; i<20 ; i++ ) for( i=0 ; i<LG ; i++ ) ... ... ý Si on souhaite changer la taille du tableau, il suffit de changer la variable (lisibilité, gain de temps, ...). ý Pour supprimer une variable : #undef. ECM, Mathématique et Informatique, S. Derrode 62 Programmation Structurée en Langage C, 1re année Macro-expression ou macro-fonction ý Directive : #define. ý Exemple : #define add(x1,x2) ((x1) += (x2)) . ý add(a,b) est remplacé par ((a) += (b)) ý Attention au parenthésage : Il faut toujours encadrer les pseudo-variables par des parenthèses. ECM, Mathématique et Informatique, S. Derrode 63 Programmation Structurée en Langage C, 1re année Évaluation de macro-expressions démo 18 Avant pré-compilation Après pré-compilation Bon/Faux #define m(x) 128*x+342*x*x #define y(x) 128*(x)+342*(x)*(x) int a,b,d,e,f,g ; int a,b,d,e,f,g ; a = b = 1; a = b = 1; d = m(a) ; d = 128*a+342*a*a ; bon e = y(a) ; e = 128*(a)+342*(a)*(a) ; bon f = m(a+b) ; d = 128*a+b+342*a+b*a+b ; faux g = y(a+b) ; d = 128*(a+b)+342*(a+b) bon *(a+b) ; ECM, Mathématique et Informatique, S. Derrode 64 Programmation Structurée en Langage C, 1re année Protection contre l’inclusion multiple \\ test.h \\ Prog1.c #include "test.h" \\ Prog2.c #include "test.h" // T e s t . h #i f n d e f TEST H #d e f i n e TEST H extern i n t add ( i n t C, i n t D) ; int VarGlobale ; #e n d i f ECM, Mathématique et Informatique, S. Derrode 65 Programmation Structurée en Langage C, 1re année Structures, unions et énumérations ý Types de base : char, short, int, float, double + pointeurs. ý Types dérivés : Tableaux de nombres ou de caractères. ý Types complexes (objets) : ë Énumération : Sert à offrir la possibilité de gérer des constantes numériques, Tr. 103. ë Structure : Objets composé de plusieurs champs. Exemple : Voiture = (marque, num. d’immatriculation, année, ...) – – – – – – Définition et exemples, Tr. 67 Structure et pointeurs, Tr. 70 Structure et fonctions, Tr. 71 Tableau statique de structures, Tr. 74 Structure et alloc. dyn. de mémoire, Tr. 75 Structures auto-référentielles, Tr. 77 ECM, Mathématique et Informatique, S. Derrode 66 Programmation Structurée en Langage C, 1re année Structures : définition et utilisation ý Structures : Agrégat de plusieurs objets de types quelconques (appelés champs de la structure). ý Syntaxe : struct nom structure { type1 variable1 ; type2 variable2 ; ... }; ý Exemple : Point du plan struct Point2D { float x ; float y ; }; ECM, Mathématique et Informatique, S. Derrode 67 Programmation Structurée en Langage C, 1re année ý Une structure est un type et non une variable. ý Pour déclarer une variable du type Point2D : ë struct Point2D coord ; ë struct Point2D TabCoord[3] ; ý On peut déclarer et initialiser les champs d’une structure : ë struct Point2D coord = {2.8, 9.8} ; ë struct Point2D TabCoord[3] = {{2.8, -0.8}, {4.2, -9.8}, {-1.0, 1.0}} ; ý Pour accéder à un champ de la structure : ë printf("%f",coord.x) ; ë coord.x = 5.0 ; ë double root = coord.x*coord.x+coord.y*coord.y ; ë printf("%f", TabCoord[1].y) ; ECM, Mathématique et Informatique, S. Derrode 68 Programmation Structurée en Langage C, 1re année ý L’affectation entre deux structures de même type est permise : struct Point2D coord1 = {3.0, 8.5}, coord2 ; coord2 = coord1 ; ý Par contre, il n’est pas possible de tester l’égalité, la supériorité, ... de deux structures. Il faut comparer individuellement chaque champs : if ((coord1.x==coord2.x) && (coord1.y==coord2.y) )... ; ý Structure incorporant des structures. Exemple : struct Rect { struct Point2D pt1 ; struct Point2D pt2 ; }; Déclaration et init. : struct Rect carre = {{1.0,2.0}, {3.0,4.0}} ; Affectation : carre.pt1.x=3.2 ; carre.pt1.y=5.8 ; ECM, Mathématique et Informatique, S. Derrode 69 Programmation Structurée en Langage C, 1re année Structures et pointeurs ý Déclaration d’un pointeur sur une structure : struct Point2D* p ; ý Initialisation d’un pointeur sur une structure : struct Point2D coord1 ; p = &coord1 ; ý Comment accéder au contenu de la valeur pointée ? (*p).x == coord1.x Remarque : Plutôt que (*p).x, on préfèrera écrire p->x. Exemple : printf("%f, %f, %f", (*p).x, p->x, coord1.x) ; affiche 3 fois la même valeur. ECM, Mathématique et Informatique, S. Derrode 70 Programmation Structurée en Langage C, 1re année Structures et fonctions démo 19 #i n c l u d e<s t d i o . h> s t r u c t Point2D { double x ; double y ; }; s t r u c t Point2D I n i t P o i n t ( double s t r u c t Point2D temp ; temp . x = v a l 1 ; temp . y = v a l 2 ; return temp ; } i n t main ( ) { s t r u c t Point2D double a , b ; val1 , double val2 ) { point ; p r i n t f ( ” E n t r e z deux v a l e u r s : ” ) ; s c a n f ( ”% l f % l f ” , &a , &b ) ; point = InitPoint (a , b) ; p r i n t f ( ” x=%l f , y=%l f ” , p o i n t . x , p o i n t . y ) ; return 0; } ECM, Mathématique et Informatique, S. Derrode 71 Programmation Structurée en Langage C, 1re année démo 20 #i n c l u d e<s t d i o . h> s t r u c t Point2D { double x ; double y ; }; i n t ComparePoint ( s t r u c t Point2D pt1 , s t r u c t Point2D return ( p t 1 . x == p t 2 . x ) && ( p t 1 . y == p t 2 . y ) ; } int main ( ) struct struct pt2 ) { { Point2D Point2D point1 = {2.0 , −9.5}; p o i n t 2 = { −1.0 , 2 . 0 } ; i n t ok = ComparePoint ( p o i n t 1 , p o i n t 2 ) ; i f ( ok == 1 ) p r i n t f ( ” L e s deux p o i n t s s o n t i d e n t i q u e s ” ) ; else p r i n t f ( ” L e s deux p o i n t s s o n t d i f f e r e n t s ” ) ; return 0; } ECM, Mathématique et Informatique, S. Derrode 72 Programmation Structurée en Langage C, 1re année démo 21 #i n c l u d e<s t d i o . h> s t r u c t Point2D { double x ; double y ; }; void A j o u t e P o i n t ( s t r u c t pt1−>x += p t 2 . x ; pt1−>y += p t 2 . y ; } int main ( ) struct struct Point2D ∗ pt1 , struct Point2D pt2 ) { { Point2D Point2D point1 = {2.0 , −9.5}; p o i n t 2 = { −1.0 , 2 . 0 } ; p r i n t f ( ” \ nAvant : p o i n t 1 (% f ,% f ) , p o i n t 2 (% f ,% f ) ” , p o i n t 1 . x , point1 . y , point2 . x , point2 . y) ; A j o u t e P o i n t (& p o i n t 1 , p o i n t 2 ) ; p r i n t f ( ” \ n A p r e s : p o i n t 1 (% f ,% f ) , p o i n t 2 (% f ,% f ) \n” , p o i n t 1 . x , point1 . y , point2 . x , point2 . y) ; return 0; } ECM, Mathématique et Informatique, S. Derrode 73 Programmation Structurée en Langage C, 1re année Tableau statique de structures #i n c l u d e < s t r i n g . h> struct a t h l e t e { int Age ; char Nom [ 1 5 ] ; double BestJump ; }; void main ( ) { struct a t h l e t e CompetitionSaut [ 1 0 ] ; C o m p e t i t i o n S a u t [ 0 ] . BestJump = C o m p e t i t i o n S a u t [ 0 ] . Age 7.4; = 26; s t r c p y ( C o m p e t i t i o n S a u t [ 0 ] . Nom, ” Durant ” ) ; } 26 Durant 7.4 22 Dupont 7.8 8 Perlin 2.5 77 Pinpin 6.5 CompetitionSaut ECM, Mathématique et Informatique, S. Derrode 74 Programmation Structurée en Langage C, 1re année Structure et allocation dynamique de mémoire Exemple 1 : une structure s t r u c t Point2D ∗ pPt ; pPt = ( s t r u c t Point2D ∗ ) m a l l o c ( s i z e o f ( s t r u c t Point2D ) ) ; ... f r e e ( pPt ) ; pPt = NULL ; Octet pPt x 0x2ab097 y ECM, Mathématique et Informatique, S. Derrode 75 Programmation Structurée en Langage C, 1re année Exemple 2 : un tableau de structures démo 22 int cpt ; p r i n t f ( ” Dimension du t a b l e a u : ”) ; s c a n f ( ”%d” , &c p t ) ; s t r u c t Point2D ∗ pTabPt ; pTabPt = ( s t r u c t Point2D ∗ ) m a l l o c ( c p t ∗ s i z e o f ( s t r u c t Point2D ) ) ; ... f r e e ( pTabPt ) ; pTabPt = NULL ; Octet pTabPt 0x2ab097 ECM, Mathématique et Informatique, S. Derrode x y x y x y 76 Programmation Structurée en Langage C, 1re année Structures auto-référentielles : Listes ý Liste : Ensemble d’objets chainés et de même type. Les objets sont appelés maillons. Tete T A T B T C NULL struct maillon { char symb ; struct m a i l l o n ∗ s u i v ; }; typedef s t r u c t m a i l l o n M; démo 23 ë Queue ou file d’attente : Liste FIFO ¿ First In, First Out À (Ex : File d’attente à un guichet) ë Pile : Liste LIFO ¿ Last In, First Out À ë Listes circulaires ë Listes symétriques ECM, Mathématique et Informatique, S. Derrode 77 Programmation Structurée en Langage C, 1re année ý Opérations classiques sur les listes : ë Ajouter un objet (allocation mémoire), ë Supprimer un objet (libération mémoire), ë Tester si la liste est vide (NULL), ë Supprimer toute la liste (libération mémoire), ë Parcourir la liste : pour retrouver ou afficher un objet, ë Trier une liste, ë ... ECM, Mathématique et Informatique, S. Derrode 78 Programmation Structurée en Langage C, 1re année Les fichiers ý Rangement des fichiers : Le système de répertoires est un outil de classement organisé sous forme arborescente : ë Il existe un répertoire racine (root) à partir duquel s’organise l’arborescence. ë Chaque répertoire (à l’exception du répertoire racine) possède un répertoire père. ë Un répertoire peut contenir à la fois des fichiers et d’autres répertoires (qui sont ses répertoires fils). ë L’organisation sous forme de répertoires permet de positionner les différents fichiers du disque. La position d’un fichier au sein de l’arborescence est donnée par un chemin (path) qui part de la racine jusqu’au répertoire contenant le fichier. ECM, Mathématique et Informatique, S. Derrode 79 Programmation Structurée en Langage C, 1re année ý Un fichier est doté : ë d’un nom, ë d’une position (son chemin dans le système de répertoires) ë d’un certain nombre de droits (son ou ses propriétaires) ë d’une taille (correspondant à un certain nombre d’emplacements réservés sur l’espace de stockage) ë d’une date de création, de modification ... ý Descripteur de fichiers : Un descripteur de fichiers sert à désigner une connexion avec un fichier (ou un périphérique d’E/S comme l’écran, l’imprimante, le clavier, ...). Un fichier est représenté par une structure prédéfinie FILE (en majuscule !). FILE* f ; Le pointeur f désigne le flux (canal de communication) établi avec le fichier. ECM, Mathématique et Informatique, S. Derrode 80 Programmation Structurée en Langage C, 1re année ý Descripteurs pré-définis : ë stdin : flux d’entrée standard ë stdout : flux de sortie standard ë stderr : flux de sortie des messages d’erreur do { fprintf ( s t d o u t , ” V o u l e z vous c o n t i n u e r ( o /n ) ?\ n” ) ; f s c a n f ( s t d i n , ” %c ” , &r e p ) ; } while ( r e p== ’ o ’ ) ; Est équivalent à : do { p r i n t f ( ” V o u l e z vous c o n t i n u e r ( o /n ) ?\ n” ) ; s c a n f ( ” %c ” , &r e p ) ; } while ( r e p== ’ o ’ ) ; ECM, Mathématique et Informatique, S. Derrode 81 Programmation Structurée en Langage C, 1re année Modes et fonctions d’ouverture ý l’appel à la fonction fopen s’écrit : g = fopen (nom, mode) ; ý l’opération d’ouverture correspond : ë à associer à g un fichier décrit par son nom. On dit pour simplifier que g ¿ pointe sur le fichier À. ë au positionnement de la tête de lecture sur la première ligne de ce fichier. ý Fermeture du flux associé au pointeur sur fichier. ë En cas de mode d’utilisation en écriture, les données écrites sont transférées sur le disque dur. ë Exemple : fclose(g) ; ECM, Mathématique et Informatique, S. Derrode 82 Programmation Structurée en Langage C, 1re année ý Modes d’ouverture (FILE *f ;) ë En lecture : g = fopen ("entree.txt", "r") ; ë En écriture (avec écrasement !) g = fopen ("resultat.txt", "w") ; ë En écriture/ajout (sans écrasement) g = fopen ("resultat.txt", "a") ; ë Lecture/Ecriture (sans écrasement, position fin) : g = fopen ("resultat.txt", "r+") ; ë Lecture/Ecriture (avec écrasement) : g = fopen ("resultat.txt", "w+") ; ë Lecture/Ecriture (sans écrasement, position début) : g = fopen ("resultat.txt", "a+") ; À la seconde chaı̂ne, on peut ajouter le caractère "b", pour signifier que l’enregistrement sera codé en binaire. Par défaut, le codage est "t" pour texte. ECM, Mathématique et Informatique, S. Derrode 83 Programmation Structurée en Langage C, 1re année ë Test à l’ouverture Selon les droits disponibles, il arrive souvent que l’ouverture d’un fichier se passe ¿ mal À. Il faut traiter les erreurs d’ouverture pour éviter des erreurs ultérieures. f = fopen ( ” monfichier . txt ” , ” r ” ) ; i f ( f==NULL) { p r i n t f ( ” I m p o s s i b l e d ’ o u v r i r ! \ n” ) ; exit (0) ; } ë La valeur NULL pour le pointeur f indique une erreur d’ouverture ë La fonction exit termine l’exécution du programme. ECM, Mathématique et Informatique, S. Derrode 84 Programmation Structurée en Langage C, 1re année Les fichiers texte ý Organisation d’un fichier texte : Une séquence de chaı̂nes de caractères séparées par sauts à la ligne. ECM, Mathématique et Informatique, S. Derrode 85 Programmation Structurée en Langage C, 1re année ý Organisation d’un fichier de données texte : Dans un fichier de données texte, les données sont structurées sous forme de tableau, où les champs sont en général séparés par des tabulations. ECM, Mathématique et Informatique, S. Derrode 86 Programmation Structurée en Langage C, 1re année ý Parcours (lecture) d’un fichier texte : Fonction fscanf ë Chaque appel à cette fonction permet de poursuivre la lecture, c’est à dire de lire l’élément qui suit l’élément précédemment lu. ë À chaque nouvel appel à fscanf, la tête de lecture est déplacée sur l’élément suivant. ë fscanf retourne le nombre d’éléments lus ë Exemple : FILE ∗ f = f o p e n ( ” data . t x t ” , ” r ” ) ; char mot [ 5 0 ] ; f s c a n f ( f , ”%s ” , mot ) ; p r i n t f ( ” v o i c i l e mot : %s ” , mot ) ; ECM, Mathématique et Informatique, S. Derrode 87 Programmation Structurée en Langage C, 1re année ý Test de fin de fichier : Fonction feof ë A chaque lecture, la tête de lecture se déplace ë La fonction feof indique si la fin de fichier est atteinte (valeur 1) ë Exemple : char p ; while ( f e o f ( f )==0) { f s c a n f ( f , ”%c ” , &p ) ; p r i n t f ( ”%c ” , p ) ; } ECM, Mathématique et Informatique, S. Derrode 88 Programmation Structurée en Langage C, 1re année ý Exemple récapitulatif : #include<s t d i o . h> i n t main ( ) { FILE ∗ f ; char p ; f = fopen ( ” texte . txt ” , ” r ” ) ; if ( f==NULL) { printf (” Impossible d ’ ouvrir ! \n” ) ; exit (0) ; } while ( f e o f ( f ) ==0){ f s c a n f ( f , ”%c ” , &p ) ; p r i n t f ( ”%c ” , p ) ; } fclose ( f ) ; } ECM, Mathématique et Informatique, S. Derrode 89 Programmation Structurée en Langage C, 1re année ý Écriture dans un fichier texte : ë Mode d’ouverture de fopen : w - Exemple : FILE ∗h ; h = f o p e n ( ” r e s u l t a t . t x t ” , ”w” ) ; ë Utilisation de la fonction fprintf : comme printf. Exemple : char mot [ 2 0 ] = ” Bonjour ” ; f p r i n t f ( h , ”%s ” , mot ) ; ë Les données sont écrites physiquement au moment de la fermeture : fclose(h) ; ECM, Mathématique et Informatique, S. Derrode 90 Programmation Structurée en Langage C, 1re année ý Accès séquentiel par caractère et par ligne par caractère : ë int fgetc(FILE* f) : Lecture d’un caractère à partir du fichier pointé par f. Ex : char c = fgetc(ficIn) ;. ë int fputc(char c, FILE* f) : Écrit le caractère c dans le fichier pointé par f. Ex : char c = ’o’ ; fputc(c, ficIn) ;. par ligne : ë char* fgets(char* ch, int n, FILE* f) : Lecture de n-1 caractères sur le fichier pointé par f. Les caractères lus sont rangés dans ch. ë int fputs(char* ch, FILE* f) : Écrit la chaı̂ne de caractères ch dans le fichier pointé par f. ECM, Mathématique et Informatique, S. Derrode 91 Programmation Structurée en Langage C, 1re année Exemple : Recopie d’un fichier démo 24 #i n c l u d e < s t d i o . h> #i n c l u d e < s t d l i b . h> void main ( ) { char c; FILE∗ f i c I n = f o p e n ( ” . . \ o r i g i n a l . t x t ” , ” r ” ) ; i f ( f i c I n == NULL) e x i t ( 0 ) ; FILE∗ f i c O u t = f o p e n ( ” . \ temp\ c o p i e . t x t ” , ”w” ) ; i f ( f i c O u t == NULL) e x i t ( 0 ) ; while ( f e o f ( f i c I n ) == 0 c = fgetc ( ficIn ) ; fputc (c , ficOut ) ; } ) { fclose ( ficIn ) ; f c l o s e ( ficOut ) ; } ECM, Mathématique et Informatique, S. Derrode 92 Programmation Structurée en Langage C, 1re année Les fichiers binaires ë Ouverture : Exemple g = fopen("fichier.bin", "wb") ; ë Fermeture : fclose(g) ; ë Lecture : int fread(void* p, int s, int nb, FILE* f) ;. Cette fonction transfert, depuis le fichier associé à f, nb éléments de taille s octets et dont le type est celui de *p. La fonction retourne le nombre d’octets lus. Exemple : char mot [ 2 0 ] ; f r e a d ( mot , 1 , 1 0 , g ) ; ECM, Mathématique et Informatique, S. Derrode 93 Programmation Structurée en Langage C, 1re année ë Écriture : int fwrite(void* p, int s, int nb, FILE* f) ;. Cette fonction transfert, vers le fichier associé à f, nb éléments de taille s octets et dont le type est celui de *p. La fonction retourne le nombre d’octets écrits. Exemple : char mot [ 2 0 ] = ” Bonjour ” ; f w r i t e ( mot , 1 , s t r l e n ( mot ) , g ) ; ECM, Mathématique et Informatique, S. Derrode 94 Programmation Structurée en Langage C, 1re année #i n c l u d e < s t d i o . h> #i n c l u d e < s t d l i b . h> struct i n d i v i d u { char nom [ 1 5 ] ; int age ; }; void main ( ) { struct i n d i v i d u e l e v e ; int t a i l l e = si z e o f ( struct individu ) ; FILE∗ f i c I n = f o p e n ( ” c : \ \ temp \\ o r i g i n a l . b i n ” , ” r b ” ) ; i f ( f i c I n == NULL) e x i t ( 0 ) ; FILE∗ f i c O u t = f o p e n ( ” c : \ \ temp \\ c o p i e . b i n ” , ”wb” ) ; i f ( f i c O u t == NULL) e x i t ( 0 ) ; // B o u c l e de r e c o p i e while ( f e o f ( f i c I n ) == 0 ) { f r e a d (& e l e v e , t a i l l e , 1 , f w r i t e (& e l e v e , t a i l l e , 1 , } ficIn ) ; ficOut ) ; fclose ( ficIn ) ; f c l o s e ( ficOut ) ; } ECM, Mathématique et Informatique, S. Derrode 95 Programmation Structurée en Langage C, 1re année Autres petites choses ... – – – – – Les arguments de la fonction principale, Tr. 97 Les pointeurs de fonctions, Tr. 100 Les énumérations, Tr. 103 Les champs de bits, Tr. 104 UNIX/Linux, commandes élémentaires, Tr. 105 ECM, Mathématique et Informatique, S. Derrode 96 Programmation Structurée en Langage C, 1re année Les arguments de int main(...) int main (int argc, char **argv) { ... } ý Explication des arguments (variables pré-définies) – int argc : nombre d’argument transmis au prg principal – char **argv : tableau de chaı̂nes de caractères contenant les arguments transmis ý Fonction avec un nombre d’arguments variable – argv[0] : chaı̂ne contenant le nom du programme – argv[argc] : contient \0 – Le premier argument est donc argv[1] et le dernier argv[argc-1] ECM, Mathématique et Informatique, S. Derrode 97 Programmation Structurée en Langage C, 1re année ý Exemple #include ” s t d i o . h” void main ( in t argc , char ∗∗ argv ) { in t i ; double d ; p r i n t f ( ” \nNombre d ’ arguments : %d : \ n” , a r g c ) ; f o r ( i =0; i <a r g c ; i ++) printf (” Arg #%d : %s \n” , i , argv [ i ] ) ; } démo 25 ECM, Mathématique et Informatique, S. Derrode 98 Programmation Structurée en Langage C, 1re année ý Si un argument attendu est un nombre entier ou réel, on peut utiliser les fonctions int atoi(char *s), long atoi(char *s) et double atoi(char *s) de stdlib.h. Exercice : écrire un programme Add qui fait la somme de tous les nombres entiers qui lui sont transmis. Ainsi l’appel ./Add 1 2 3 doit afficher 6. #include ” s t d i o . h” void main ( in t argc , char ∗∗ argv ) { in t i , r e s = 0 ; f o r ( i =1; i <a r g c ; i ++) r e s += a t o i ( argv [ i ] ) ; p r i n t f ( ” \ n R e s u l t a t = %d” , r e s ) ; } ECM, Mathématique et Informatique, S. Derrode 99 Programmation Structurée en Langage C, 1re année Pointeur de fonction ý Pointeur pointant vers une fonction (et non plus sur un nombre) ! Il s’agit donc d’une variable qui peut contenir l’adresse d’une fonction. void AjouteUn ( i n t ∗x ) { ∗x += 1 ; } void ( ∗ i n c ) ( i n t ∗ z ) ; // d é c l a r a t i o n i n c = AjouteUn ; // i n i t i a l i s a t i o n int a = 1 0 ; i n c (&a ) ; // i n c ré m e n t e a de 1 ý Exemple ECM, Mathématique et Informatique, S. Derrode 100 Programmation Structurée en Langage C, 1re année ý Sans pointeur de fonction #i n c l u d e ” s t d i o . h” double f c t 1 ( double x ) { return 3 . 0 ∗ x ; } double f c t 2 ( double x ) { return x / 3 . 0 ; } i n t main ( ) { int f; p r i n t f ( ” \ n F o n c t i o n 1 ou 2 : ” ) ; if s c a n f ( ”%d” , &f ) ; ( f ==1) p r i n t f ( ” \n f c t (% l f ) = % l f ” , 9 . 0 , fct 1 (9.0) ) ; p r i n t f ( ” \n f c t (% l f ) = % l f ” , 9 . 0 , fct 2 (9.0) ) ; else if ( f ==1) p r i n t f ( ” \n f c t (% l f ) = % l f ” , 1 2 . 0 , fct 1 (12.0) ) ; p r i n t f ( ” \n f c t (% l f ) = % l f ” , 1 2 . 0 , fct 2 (12.0) ) ; else return 0 ; } ECM, Mathématique et Informatique, S. Derrode 101 Programmation Structurée en Langage C, 1re année ý Avec pointeur de fonction : démo 26 #i n c l u d e ” s t d i o . h” double f c t 1 ( double x ) { return 3 . 0 ∗ x ; } double f c t 2 ( double x ) { return x / 3 . 0 ; } i n t main ( ) { int f; p r i n t f ( ” \ n Q u e l l e f o n c t i o n ( 1 ou 2 ) : ” ) ; s c a n f ( ”%d” , &f ) ; double ( ∗ p f c t ) ( double z ) ; if ( f ==1) pfct = fct 1 ; else pfct = fct 2 ; p r i n t f ( ” \n f c t (% l f ) = % l f ” , 9 . 0 , pfct (9.0) ) ; p r i n t f ( ” \n f c t (% l f ) = % l f ” , 1 2 . 0 , p f c t ( 1 2 . 0 ) ) ; return 0 ; } ECM, Mathématique et Informatique, S. Derrode 102 Programmation Structurée en Langage C, 1re année Les énumérations ý Sert à définir des variables entières qui ne peuvent prendre que certaines valeurs précises : ý Exemple enum c o l o r { n o i r , bl eu , v e r t , cyan , rouge , magenta , b l a n c } ; typedef enum c o l o r c o u l e u r ; c o u l e u r c1 = magenta ; p r i n t f ( ” \ nCouleur = %d” , c1 ) ; // a f f i c h e 5 ý Remarque : Identifié comme des entiers enum b a s c u l e {ON, OFF, équivaut à NON = 0 , OUI } ; enum b a s c u l e {ON=0 , OFF=0 , NON=0 , OUI=1} ý Remarque : Alternative à #define ECM, Mathématique et Informatique, S. Derrode 103 Programmation Structurée en Langage C, 1re année Les champs de bits struct chps { unsigned i n t b 0 2 : 3 ; ý Exemple : signed i n t b 3 7 : 5; unsigned i n t : 7; unsigned i n t b15 : 1; } b15 inutilise 15 14 13 12 11 10 b3_7 9 8 7 6 5 b0_2 4 3 2 1 0 ý Remarques : ë Les type sont soit int (équiv. signed int), soit unsigned int. ë Ils peuvent entraı̂ner des problèmes de portabilité entre machines (¿ Low Indian À et ¿ Big Indian À) ECM, Mathématique et Informatique, S. Derrode 104 Programmation Structurée en Langage C, 1re année UNIX/Linux, commandes élémentaires Description Commande Affichage du répertoire courant pwd Création d’un nouveau rép. monRep mkdir monRep make directory Changement de répertoire cd monRep change directory Retour au répertoire précédent cd .. Liste des fichiers du rép. courant ls Création d’un fichier vide appelé monFic.c touch monFic.c Déplacement d’un fichier vers un répertoire monRep mv monFic.c monRep move Copie de fichier1 dans fichier2 cp fichier1 fichier2 copy Renommage de fichier1 en fichier3 mv fichier1 fichier3 move Suppression d’un fichier rm monFic remove Suppression d’un répertoire complet rm -r monRep Edition d’un fichier nedit monFic & nedit : editeur Compilation de monFic.c gcc monFic.c exécutable a.out gcc monFic.c -o monFic exécutable monFic Exécution du programme monFic Anglais list ./monFic ECM, Mathématique et Informatique, S. Derrode 105 Programmation Structurée en Langage C, 1re année FIN ECM, Mathématique et Informatique, S. Derrode 106