1/30 Objectif de ce cours 2/30 Objectifs de ce cours Introduction au langage C - Cours 4 Girardot/Roelens Septembre 2013 Analyse de problème I décomposer un traitement complexe en traitements simples Concepts de programmation I notion de procédure Définition Procédures Procédures Définition 3/30 I construction du langage qui permet de regrouper une série d instructions I de la désigner par un symbole (nom) I de l exécuter «à volonté» (depuis n importe quel endroit du programme) Procédures Premier exemple 4/30 Exemple de procédure #include <stdio.h> #include <stdlib.h> void bonjour(void) printf("hello World\n"); bonjour(); bonjour(); return 0; Exécution [P]$ prog4 Hello World Hello World [P]$
Procédures Retour au PGCD 5/30 Retour sur le programme PGCD #include <stdio.h> #include <stdlib.h> int a, b, c; a = 834389; b = 944353; for (;;) if (a<b) c=a; a=b; b=c; if (a==b) printf("la valeur du PGCD est %d\n", a); return 0; a=a-b; return 0; Comment calculer le PGCD de trois nombres? Un peu de réflexion Procédures Retour au PGCD 6/30 Propriété PGCD(a, b, c) =PGCD(PGCD(a, b), c) Premier codage I a=x, b=y I code du programme PGCD I b=z I code du programme PGCD I a est le résultat voulu Inconvénients I copier-coller de code (source d erreurs) I gestion des variables difficiles (source d erreurs) I encore plus compliqué si plusieurs traitements sont imbriqués Procédures PGCD seconde version 7/30 Utilisation d une procédure Permet de ne pas dupliquer le code! #include <stdio.h> #include <stdlib.h> int a, b, c; void pgcd(void) for (;;) if (a<b) c=a; a=b; b=c; if (a==b) return; a=a-b; a = 834389; b = 944353; pgcd(); b = 743; pgcd(); printf("la valeur du PGCD est %d\n",a);return 0; Procédures PGCD seconde version 8/30 Quelques explications Variables a, b, c utilisées par deux procédures I variables globales I positionnées dans main I réutilisées dans pgcd I réutilisées dans main! gestion complexe lorsque le nombre de procédures devient important
Procédures Paramètres et résultat 9/30 Paramètres et résultat d une procédure Procédures Paramètres et résultat 10/30 Déclaration d une procédure Paramètres I informations fournies à la procédure nécessaires pour son fonctionnement Résultat I permet de récupérer le résultat du calcul effectué par la procédure Exemple : calcul du carré d un nombre int square(int x) return x*x; Paramètres I déclarés en nombre et en type entre les parenthèses suivant le nom de la procédure I le nom donné est local à la procédure (inconnu des autres procédures) Résultat I seul le type du résultat est déclaré, avant le nom de la procédure I utilisation de l instruction return I c est le code appelant qui doit récupérer ce résultat Procédures Paramètres et résultat 11/30 Utilisation d une procédure Passage de paramètres I respecter le nombre, l ordre, le type indiqué dans la déclaration I les paramètres sont copiés dans les variables locales de la procédure I le compilateur mémorise le point d appel (compteur ordinal de retour après l exécution de la procédure) Résultat I lors de l instruction return, le compilateur mémorise ce résultat dans un endroit particulier de la mémoire I il récupère la valeur du compteur ordinal avant l appel de procédure! le programme continue là où il en était avant l appel I la procédure appelante peut (doit) récuperer le résultat immédiatement (sinon, perdu) int a,b,c; c=square(a)+square(b+1)/2; Procédures Le nouveau programme PGCD 12/30 Le nouveau programme PGCD int pgcd (int x,int y) int z; for (;;) if (x < y) z=x;x=y;y=z; if (x==y y==0) return x; x-=y; int main (int argc,char *argv[]) int a,b,c; a=834389; b=944353; c=884913; printf("le PGCD est %d\n",pgcd(pgcd(a,b),c)); return 0;
Notion de prototype Prototypes Eléments de C Prototypes 13/30 I décrit les types des arguments et du résultat d une procédure I permet au compilateur de vérifier le bon usage de la procédure Exemple int pgcd(int a, int b); int pgcd(int, int); I les prototypes des procédures standard du langage sont décrits dans des fichiers tels que stdio.h Le type void I permet d indiquer qu une procédure ne rend pas de résultat I ou n admet pas de paramètres Prototypes (2) Eléments de C Prototypes 14/30 Déclaration I toutes les procédures doivent être déclarées avant leur premier usage I par défaut, une procédure est de type «int», sans paramètre I exemple toto() int toto(void) I déclaration correcte de la procédure principale int main(int argc, char * argv[]) Usage I les procédures doivent être utilisées avec le nombre correct de paramètres, et des paramètres du bon type I l instruction return doit fournir une valeur du type déclaré de la procédure I le compilateur peut procéder à des conversions de taille ou de représentation des paramètres Appel Eléments de C Appel de procédure 15/30 Mécanisme d appel de procédure 1. les expressions utilisées comme paramètres dans l appel de la procédure sont calculées (dans un ordre inconnu) 2. les valeurs obtenues sont affectées aux arguments de la procédure, qui se comportent comme des variables locales à celle-ci 3. le corps de la procédure est exécuté 4. la valeur (éventuelle) fournie par une instruction return est rendue comme résultat de la procédure Programme Eléments de C Exemple de procédure 16/30 Exemple de procédure #include <stdio.h> #include <stdlib.h> int fun(int x) x = x+2; return x*x; int x=3; printf("%d\n",fun(x)); printf("%d\n",x); return 0; Résultat 25 3
Eléments de C Structure d un programme C 17/30 Structure d un programme C Eléments de C Structure d un programme C 18/30 Structure d un programme C (2) Un programme C est une séquence de déclarations I variables I procédures I la commande #include permet d inclure dans le fichier compilé les déclarations d objets (variables et procédures) des bibliothèques du système I ces déclarations sont dites «globales» Contraintes I tout objet doit être déclaré avant sa première utilisation dans le texte I pour cette raison, on place souvent les déclarations de variables en premier (au début du fichier) I une procédure est «déclarée» soit par sa définition elle-même, soit par la déclaration de son prototype (les deux peuvent apparaître dans un même fichier si elles sont cohérentes) I le programme a une structure en râteau (pas d imbrication des procédures) L exécution d un programme consiste en l exécution de la procédure de nom main Eléments de C Variables 19/30 Nature des variables I variables globales I déclarées dans le fichier du programme hors de toute procédure I à limiter au plus strict nécessaire (source de bogue) I variables locales I les arguments d une procédure (recoivent une valeur à l appel de la procédure) I les variables déclarées à l intérieur d une procédure I déclarations locales I s effectuent après une accolade ouvrante I avant toute instruction I ne sont visibles que dans le bloc (défini par les accolades) où elles sont déclarées if (x<y) int c; c=x; x=y; y=c; Variables globales Eléments de C Variables 20/30 Initialisation des variables I elles reçoivent leur valeur initiale au lancement du programme I les valeurs initiales doivent être des constantes ou des expressions ne faisant intervenir que des constantes Variables locales I les arguments d une procédure reçoivent comme valeur initiale les valeurs des expressions utilisées dans l appel de la procédure I les variables déclarées dans un bloc avec initialisation reçoivent leur valeur à chaque entrée dans le bloc ; ces «valeurs initiales» peuvent être des expressions quelconques I les variables déclarées dans un bloc, mais non initialisées reçoivent une valeur indéterminée à chaque entrée dans le bloc (ce qui se trouve à cet endroit de la mémoire de l ordinateur)
Eléments de C Variables 21/30 Visibilité des variables I les variables «visibles» à un emplacement d un programme sont les variables déclarées dans le bloc «le plus proche» int toto=2, toutou=3;... void fun(int titi,int tutu) int toutou=5; toto+titi+toutou; /* E1 : 11 */ int toto = 10; toto+titi+toutou; /* E2 : 19 */... fun(4,6);... Eléments de C Construction des programmes 22/30 Chaîne de compilation La construction d un programme exécutable se fait en plusieurs phases I préprocesseur I gère les lignes débutant par # I commandes d inclusion d autres fichiers I autres commandes, par exemple des «macro-définitions» #define PI 3.1415926535 I remplacement des «macro-définitions» par leurs valeurs, suppression commentaires... I compilateur I analyse du programme source, transformation en «instructions élémentaires» Eléments de C Construction des programmes 23/30 Chaîne de compilation (2) I optimiseur I assembleur I transformation des «instructions élémentaires» en langage machine I éditeur de liens (ou «relieur») I rassembler tous les modules objets nécessaires et les bibliothèques pour constituer un programme exécutable I exécution du programme I utiliser l environnement d exécution (procédures systèmes) Préprocesseur Eléments de C Construction des programmes 24/30 Exemple [P]$ cat prog01.c #define PI 3.1415926535 float c; c = PI*2.5; [P]$ gcc -E prog01.c # 2 "prog01.c" float c; c = 3.1415926535*2.5;
Édition de liens Eléments de C Construction des programmes 25/30 I opération qui consiste à rassembler les modules objet et des librairies pour obtenir un programme exécutable I exemple : édition des liens après compilation séparée des modules sources I gcc -c square.c gcc -c prog07b.c gcc -o xyz prog07b.o square.o on peut mélanger sources et objets gcc -c square.c gcc -o xyz prog07b.c square.o Bibliothèques (libraries) Eléments de C Bibliothèques 26/30 Édition des liens : bibliothèques I de nombreuses bibliothèques sont disponibles libc la bibliothèque «standard» du langage libgcc modules spécialisés de gcc libm procédures mathématiques libdbg mise au point I les bibliothèques libc et libgcc sont liées par défaut, les autres doivent être indiquées explicitement gcc -o zzz prog07c.o -lm I le relieur n ajoute pas la totalité du contenu d une bibliothèque, mais seulement les modules objets nécessaires au programme I désormais, les bibliothèques sont chargées dynamiquement au moment de l exécution (DLL = Dynamically loaded libraries) Eléments de C Bibliothèques 27/30 Procédures utilitaires Eléments de C Bibliothèques 28/30 Procédures mathématiques Quelques procédures Prototype Description int abs(int p) Valeur absolue double atof(char* s) Conversion caractères vers flottant int atoi(char* s) Conversion caractères vers entier long atol(char* s) Conversion caractères vers entier void exit(int cr) Arrêt du programme long labs(long p) Valeur absolue int rand(void) Entier pseudo-aléatoire void srand(int seed) Init. du générateur pseudo-aléatoire Utilisation des procédures utilitaires I inclure stdlib.h dans le source Prototype double acos(double x) double asin(double x) double atan(double x) double atan2(double x, double y) double ceil(double x) double cos(double x) double cosh(double x) double exp(double x) double fabs(double x) double floor(double x) double fmod(double x, double y) double log(double x) double log10(double x) Description arc cosinus arc sinus arc tangente arc tangente partie entière cosinus cosinus hyperbolique exponentielle valeur absolue partie entière reste logarithme népérien logarithme décimal
Eléments de C Bibliothèques 29/30 Procédures mathématiques Prototype Description double pow(double x, double y) x y double sin(double x) sinus double sinh(double x) sinus hyperbolique double sqrt(double x) racine carrée double tan(double x) tangente double tanh(double x) tangente hyperbolique Utilisation des procédures mathématiques I inclure math.h dans le source I ajouter -lm à la compilation Eléments de C Notes 30/30 Notes Écriture des programmes I indenter correctement vos programmes sources I consulter les manuels man gcc man 3 printf man 3 pow Compilation I utiliser toutes les options permettant d obtenir les avertissements du compilateur gcc -Wall -ansi -pedantic toto.c -o toto Test I écrire de petits morceaux, que l on teste au fur et à mesure I ajouter des ordres d impression, à des fins de mise au point, que l on transforme ensuite en commentaires I ne pas hésiter à utiliser gdb