Fiche Atelier programmation impérative en C Corrigé Fiche
Transcription
Fiche Atelier programmation impérative en C Corrigé Fiche
LUTES : Fiche Atelier programmation impérative en C E. Delozanne, B. de La Passardière Corrigé Fiche N°11 Entées sorties standard du C, pointeurs (suite) Appliquer Tableaux et Passage des paramètres d’une fonction par valeur/par adresse Exercice 11 : écrire le code de chacune des questions suivantes et tester les au fur et à mesure a) Affiche un tableau de n float (avec deux chiffres après la virgule) séparés par une tabulation. Exécution : Tableau de 7 floats : 10.00 12.00 8.00 14.00 6.00 16.00 4.00 Corrigé : Un grand classique. La fonction ne retourne rien et admet en paramètres un tableau de floats (comme tous les tableaux en C il est passé par référence) et un entier n (passé par valeur) qui représente le nombre d’éléments à afficher #include <stdio.h> #define TAILLE 30 // pour printf et scanf // affiche un tableau de n floats // ne retourne rien // prend en entrée un tableau d'entiers et le nombre d'éléments du tableau void afficheTab(float tab[], int n) { int i ; for (i= 0; i < n; i++) { printf("%.2f \t", tab[i]); } printf("\n"); } int main() { float tablo[] = {10, 12, 8, 14, 6, 16, 4}; int nb=7; if (nb < TAILLE) { printf("Tableau de %d floats : \n",7); afficheTab (tablo, 7); } return 0; } b) Saisie un tableau de n float. Exécution pour n = 5 Entrez 5 notes : 10 12 8 14 6 Tableau de 5 floats : 10.00 12.00 8.00 14.00 6.00 Corrigé : Un grand classique. La fonction ne retourne rien et admet en paramètres un tableau de float (comme tous les tableaux en C il est passé par référence) et un entier n (passé par valeur) qui représente le nombre d’éléments à saisir #include <stdio.h> #define TAILLE 30 // pour printf et scanf void afficheTab(float tab[], int n) { // affiche un tableau de n floats, Voir question précédente } // saisie un tableau de n floats // ne retourne rien // prend en entrée //un tableau d'entiers (passé par référence comme tous les tableaux en C) //et le nombre d'éléments saisis dans le tableau void saisieTab(float tab[], int n) { int i ; printf ("Entrez %d notes :\n", n); for (i= 0; i < n; i++) { scanf("%f", &tab[i]); } } int main() { float tablo[TAILLE]; int nb = 5; saisieTab (tablo,nb); printf("Tableau de %d float : \n",nb); afficheTab (tablo, nb); return 0; } c) Saisie un tableau de notes jusqu’à ce que l’utilisateur rentre -1 ou bien que le tableau soit plein (taille 30) ; la fonction calcule le nombre de notes saisies. Exécution : Entrez au plus 30 notes (terminez par -1): 10 12 8 14 6 -1 Tableau de 5 floats : 10.00 12.00 8.00 14.00 6.00 Corrigé : Contrairement à la fonction précédente, le nombre de notes saisies est un résultat passé à la fonction qui appelle la saisie du tableau : deux solutions Solution 1 : le résultat est retourné par la fonction ; le prototype est o int saisieTab2 (int tab[]) ; Solution 2 : le résultat est un paramètre passé par adresse ; le prototype est o void saisieTab3 (float tab[], int *n) #include <stdio.h> #define TAILLE 30 // pour printf et scanf // affiche un tableau de n floats void afficheTab(float tab[], int n) { …. } // saisie un tableau de n floats void saisieTab(float tab[], int n) { … } /* saisie des notes dans le tableau tab jusqu'a ce que l'utilisateur entre -1 ou que le tableau est rempli n est le nombre de notes saisies */ // version 2 : la fonction retourne le nombre de notes saisies int saisieTab2 (float tab[]) { int n = 0; printf ("Entrez au plus %d notes (terminez par -1):\n", TAILLE); float a ; do { scanf("%f", &a); if (a != -1) { tab[n]= a; n++ ; } } while ( n < TAILLE && return n; a >= 0 ); } /* saisie des notes dans le tableau tab jusqu'a ce que l'utilisateur entre -1 ou que le tableau est rempli n est le nombre de notes saisies */ // version 3 : //la fonction ne retourne rien mais le nombre de notes saisies est passé par adresse void saisieTab3 (float tab[], int *n) { printf ("Entrez au plus %d notes (terminez par -1):\n", TAILLE); float a ; *n = 0; do { scanf("%f", &a); if (a != -1) { tab[*n]= a; (*n)++ ; } } while ( *n < TAILLE && a >= 0 ); } int main() { float tablo[TAILLE]; int nb = 5 ; saisieTab (tablo,nb); printf("Tableau de %d floats : \n",nb); afficheTab (tablo, nb); nb = saisieTab2 (tablo); printf("Tableau de %d floats : \n",nb); afficheTab (tablo, nb); saisieTab3 (tablo,&nb); printf("Tableau de %d floats : \n",nb); afficheTab (tablo, nb); return 0; } d) Calcule la moyenne et l’écart-type des valeurs d’un tableau de n float (variance : somme des carrés/n diminué du carré de la moyenne)(écart type : racine carrée de la variance) Corrigé : La fonction prend en paramètre le tableau et le nombre d’élements mais aussi les deux résultats qui sont passés par adresse Exemple d’exécution : Entrez 5 notes : 10 12 8 14 6 Tableau de 5 floats : 10.00 12.00 8.00 14.00 6.00 Moyenne : 10.00 Ecart type : 2.83 #include <stdio.h> #include <math.h> // pour printf et scanf // pour sqrt #define TAILLE 30 void afficheTab(float tab[], int n) { // affiche un tableau de n float … } void saisieTab(float tab[], int n) { … } /* la fonction prend en entrée le tableau d’entiers et son nombre d’éléments en sortie : elle calcule la moyenne et l’écart type qui sont deux floats passés par adresse */ void calcul(float tab[], int n, float * moy, float *e) { int i ; *moy = 0.0 ; *e = 0.0 ; for (i = 0; i < n ; i++) { *moy = *moy + tab[i] ; *e = *e + tab[i]*tab[i]; } if (n >0 ) { *moy = *moy/n ; *e = sqrt(*e/n- *moy**moy); } } int main() { float tablo[TAILLE]; int nb = 5 ; float moyenne, ecart ; saisieTab (tablo,nb); printf("Tableau de %d float : \n",nb); afficheTab (tablo, nb); calcul(tablo,nb, &moyenne, &ecart); printf("Moyenne : %.2f \t Ecart type return 0; : %.2f \n",moyenne, ecart); } e) Déterminer l’indice du plus grand élément et celui du plus petit élément d’un tableau de n floats #include <stdio.h> // pour printf et scanf #define TAILLE 30 void afficheTab(float tab[], int n) { // affiche un tableau de n float } void saisieTab(float tab[], int n) { } /* la fonction prend en entrée le tableau d’entiers et son nombre d’éléments en sortie : elle calcule l'indice du plus petit élément et celui du plus grand qui sont deux entiers passés par adresse */ void indMin_indMax(float tab[], int n, int * indmin, int *indmax) { int i ; if (n <= 0) { printf("\ntableau vide\n"); *indmin=*indmax= -1 ; } else { *indmin = 0 ; *indmax = 0 ; for (i = 0; i < n ; i++) { if ( tab[i] < tab[*indmin]) { *indmin = i ; } if ( tab[i] > tab[*indmax]) { *indmax = i ; } } // fin du for } // fin du else } // fin indMin_indMax int main() { float tablo[TAILLE]; int nb = 5 ; int imin, imax ; saisieTab (tablo,nb); printf("Tableau de %d float : \n",nb); afficheTab (tablo, nb); indMin_indMax(tablo,nb, &imin, &imax); printf("plus petit : %.2f \t à l'indice imin); printf("plus grand : %.2f \t à l'indice imax); return 0; } : %d \n",tablo[imin], : %d \n",tablo[imax], f) Calculer le nombre des éléments d’un tableau supérieurs à une valeur donnée et calculer leur somme Trois versions : regardez bien les différences #include <stdio.h> // pour printf et scanf #define TAILLE 30 void afficheTab(float tab[], int n) { ;;; } void saisieTab(float tab[], int n) { } /* la fonction prend en entrée le tableau d’entiers, son nombre d’éléments, et la valeur considérée * en sortie : elle calcule le nombre d'éléments supérieure à la valeur considérée et calcule leur somme * choix1 : ces deux paramètres passés par adresse * choix 2, choix 3 : l'un est passé par adresse et l'autre est retourné comme résultat de la fonction*/ void valeursSup1(float tab[], int n, float val, int * nbval, float *somval) { int i ; *nbval=0; *somval=0; if (n <= 0) { printf("\ntableau vide\n"); } else { for (i = 0; i < n ; i++) { if ( tab[i] > val) { *nbval = *nbval +1 ; *somval = *somval+ tab[i] ; } } // fin du for } // fin du else } // fin valSup1 int valeursSup2(float tab[], int n, float val, float *somval) { int i ; int nbval =0; *somval=0; if (n <= 0) { printf("\ntableau vide\n"); } else { for (i = 0; i < n ; i++) { if ( tab[i] > val) { nbval = nbval +1 ; *somval = *somval+ tab[i] ; } } // fin du for } // fin du else return nbval; } // fin valSup2 float valeursSup3(float tab[], int n, float val, int * nbval) { int i ; float somval=0; *nbval=0; if (n <= 0) { printf("\ntableau vide\n"); } else { for (i = 0; i < n ; i++) { if ( tab[i] > val) { *nbval = *nbval +1 ; somval = somval+ tab[i] ; } } // fin du for } // fin du else return somval; } // fin valSup3 int main() { float tablo[TAILLE]; int nb = 5 ; int n ; float x = 10, s; saisieTab (tablo,nb); printf("Tableau de %d float : \n",nb); afficheTab (tablo, nb); valeursSup1(tablo, nb, x, &n, &s); printf("Le nombre d'éléments supérieurs à %.2f \t est : %d \t est :%.2f\n",x, n,s); s= 0; n=0 ; n = valeursSup2(tablo, nb, x, &s); printf("Le nombre d'éléments supérieurs à %.2f \t est : %d \t est :%.2f\n",x, n,s); s= 0; n=0 ; s = valeursSup3(tablo, nb, x, &n); printf("Le nombre d'éléments supérieurs à %.2f \t est : %d \t est :%.2f\n",x, n,s); return 0; }