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;
}