Informatique 2A Langage C 2 è séance
Objectifs de la séance 2 Début de la modularité avec les fonctions Création d’une première bibliothèque de fonctions ‘‘fichier.h’’ et modularité inter-fichiers Génération de nombres aléatoires
Création d’un fichier source Creation of a source file (.c): 1) Creation of the solution and of a project : fichier/nouveau -> projet Projet Win 32 (application console win 32) Nom : enter the name of the project (td2 for this lesson) Create a file for the solution : You will use it (almost) all the year : Name it with the two family names in your group Projet vide 2) Creation of a source file: right-clic on fichiers source, ajoutez un nouvel élément, force the extension.c For the various exercices of the lesson, name it mainfile.c
But d’une fonction : exécute des actions et renvoie un résultat 3 étapes : –Entrée : informations introduites dans la fonction –Calculs : travail de la fonction à partir des entrées –Sortie : résultat du calcul. Les fonctions
argument formel Type nom_fonction (type1 arg1, type2 arg2,…) ; Déclaration : prototype ou en-tête type retourné par la fonction argument formel Minimum nécessaire pour compiler 1 er appel 2 e appel argument effectif main() {… nom_fonction( arg_eff1, arg_eff2,…) ; nom_fonction( arg_effa, arg_effb,…) ; … } Définition : Type nom_fonction(type1 arg1, type2 arg2,…) { … return … ; }
Un exemple main( ) { double A ; int i, j ; A = 5.5 ; i = j = 3 ; printf(‘‘%lf %lf’’, poly(A,i,j),poly(1,4,7 )) ; } 2 appels de la fonction Déclaration : prototype ou en-tête double poly (double u, int m, int n) ; Définition : double poly (double u, int m, int n) { double val ; val = u*u + m*u + n ; return val ; }
La fonction main C’est par elle que commence l’exécution void main(void) { … } main( ) { … } int main( ) { … return 0 ; }
Portée et durée de vie des variables Variable locale 1)Variable déclarée à l’intérieur d’un bloc {…} Ne peut être utilisée qu’à l’intérieur du bloc Durée de vie = temps du bloc 2)En-tête d’une fonction (argument formel) Variable globale Variable déclarée en dehors de toute fonction (voir plus loin et poly) Soyez le plus « local » possible
Un exemple int fonction (int a) ; main( ) { int i, A =1; for (i = 0; i<10;i++) { int x = i*A ; A = A + x ; printf(‘‘%d\n’’, fonction(A)); } printf(‘‘%d\n’’, fonction(A)); } int fonction (int a) { int val, i ; for (i = 0; i<20;i++) { …} return val ; }
Les tableaux comme argument de fonction double moyenne(double T[ ], int n); Déclaration : Appel de la fonction : double x ; double tab[N] ; … x = moyenne(tab, N); N est une constante symbolique (#define N 100) Définition : double moyenne(double T[ ], int n) { …}
Structure générale d’un programme #include … #define … Déclarations des fonctions (prototypes) main() { appels aux fonctions …} Définition des fonctions
Modèle obligatoire d’écriture des fonctions /* dicho : recherche de la racine d'une équation par dichotomie ENTREES : - a,b : intervalle de recherche - On suppose que f(a)*f(b)<0 - eps : précision de la solution trouvée - f : fonction dont on veut trouver la racine SORTIES : - racine de l'équation **** F. Goudail - 27/06/07 */ double dicho(double a, double b, double eps, double (*f) (double)) { … }
Modularité et fichiers Intérêts : hiérarchisation des problèmes, lisibilité, réutilisation, compilation séparée 1) Regrouper dans un même fichier source.c les fonctions ayant un même thème 2) Créer le fichier en-tête.h correspondant et l’inclure là où il est utilisé Solution binome Project td2 Principal.cTableaux.cTableaux.h #include #include’’tableaux.h’’ main ( ) { Fait appel à des fonctions définies dans Tableaux.c } Contient toutes les définitions des fonctions ayant pour thème les tableaux et ce qu’il faut pour les compiler Contient tous les prototypes des fonctions de Tableaux.c
Structure d’un programme Workspace binome Project td2 Principal.cThème1.c Thème2.c Thème3.c … #include #include’’Thème1.h’’ #include’’Thème2.h’’ #include’’Thème3.h’’ #define CS 100 main ( ) { Fait appel à des fonctions définies dans Thème1.c, Thème2.c, Thème3.c, stdio.c } Thème1.h Thème2.h Thème3.h …
Génération de nombres aléatoires La fonction rand( ) génère des nombres aléatoires entre 0 et RAND_MAX ( ) Lancez-la plusieurs fois … Initialisation avec srand(time(0)) ( ) Générateur de nombres aléatoires entiers compris entre deux bornes (version approximative) : int i_alea(int min, int max) { return rand( )%(max-min+1)+min; } A mettre dans un fichier random.c
Histogramme Valeurs possibles probabilité min max On tire Ntirs valeurs comprises entre min et max probabilité de tirer la valeur i = nb d’occurrences / Ntirs Principe On remplit un tableau de Ntirs nb aléatoires entiers compris entre min et max Fonction histogramme : remplit le tableau des probabilités (quelle est sa taille?) Ex : En pratique
Modularité et variables globales Variable globale extern : visible par tous les fichiers où elle est déclarée Variable globale static : visible par un seul fichier Principal.cTableaux.cAlea.c #include extern int A =5 ; main ( ) { } int A ; static double B = 2.5 ; fonction1( ) { } int A ; fonction2( ) { } A est visible par les fonctions des trois fichiers B n’est visible que par les fonctions de Tableaux.c