[C] Erreurs dans les fonctions

Erreurs dans les fonctions [C] - C - Programmation

Marsh Posté le 17-08-2019 à 14:42:19    

Salut :), j'ai un exercice sur les fonctions à faire, je l'ai fait, mais je ne suis pas du tout sûr de moi. Est-ce que vous savez m'aiguiller svp ?
 
Dans la première partie, je dois corriger le code suivant :

Code :
  1. void entierLu (int entier){
  2. do{
  3.        printf("Nombre entier strictement positif: " );
  4.        scanf ("%d", &entier);
  5.     } while (entier <= 0);
  6.     return entier;
  7. }
  8. int someCarres (int entier, int somme) {
  9.     int nb;
  10.     for (nb = 1 ; nb <= entier ; nb++) {
  11.         somme += nb * nb;
  12.     }
  13. }
  14. void afficheSomme (void) {
  15.     printf("Somme des carres: %d\n", somme);
  16. }


Sachant que :
entierLu permet d’obtenir un nombre entier et de le fournir à la fonction appelante
sommeCarres permet de calculer la somme des carrés des nombres ∈ [1, entier] et de le fournir à la fonction appelante
afficheSomme affiche la somme transmise par la fonction appelante
 
Le bon code selon moi  

Code :
  1. int entierLu (int entier){
  2. do{
  3.        printf("Nombre entier strictement positif:" );
  4.        scanf ("%d", &entier);
  5.     } while (entier <= 0);
  6.     return entier;
  7. }
  8. int someCarres (int entier, int somme) {
  9.     for (int nb = 1 ; nb <= entier ; nb++) {
  10.         somme += nb * nb;
  11.     }
  12.     return entier;
  13. }
  14. void afficheSomme (int somme) {
  15.     printf("Somme des carres: %d\n", somme);
  16. }


Et ensuite, je dois faire appel à ces fonctions :
Le bon code selon moi

Code :
  1. void main (void) {
  2.     int entier;
  3.     int somme;
  4.         entierLu(entier);
  5.         sommeCarres(entier, somme);
  6.         afficheSomme(somme);
  7. }


Merci :)

Reply

Marsh Posté le 17-08-2019 à 14:42:19   

Reply

Marsh Posté le 17-08-2019 à 18:25:45    

Je suis le seul à trouver ça pédagogiquement douteux du "faux code à corriger"? Enfin bref.
 
De manière générale tu peux déjà compiler ton code avec -Wall -Werror -Wextra (pour GCC, à adapter selon ton compilateur) et ensuite le tester. Tu vera que ton code n'est pas bon. Il faut soit passer un pointeur à entierLu() soit prendre en compte la valeur retournée. C'est une première piste, j'essaye de pas faire ton exo à ta place. :o

Reply

Marsh Posté le 18-08-2019 à 20:17:32    

Code :
  1. int entierLu(int entier) {
  2. do{
  3.        printf("Nombre entier strictement positif : " );
  4.        scanf("%d", &entier);
  5.     } while (entier <= 0);
  6.     return entier;
  7. }


 
La chose la plus évidente c'est que la signature de la première fonction est fausse : en plus du type, le paramètre passé est inutile.
 

Code :
  1. int entierLu(void) {
  2. int entier;
  3. do {
  4.        printf("Nombre entier strictement positif : " );
  5.        scanf("%d", &entier);
  6.      } while (entier <= 0);
  7.     return entier;
  8. }


 
Ensuite, rien ne te dit que scanf a fonctionné correctement.
 

Code :
  1. int entierLu(void){
  2. int entier;
  3. int read;
  4. do {
  5.        printf("Nombre entier strictement positif : " );
  6.        read = scanf ("%d", &entier);
  7.      } while ((read != 1) && (entier <= 0));
  8.     return entier;
  9. }


 
C'est pas encore parfait, mais ça devrait satisfaire celui qui a posé l'exercice.
Pour être parfait, un printf d'une chaine sans \n final risque de ne pas être flushée, donc un coup de fflush c'est pas plus mal, et comme tu as une boucle, en cas d'erreur, nettoyer stdin avant le nouveau tour de scanf peut être une bonne idée. Bref, on en arrive a ceci, qui est correctement blindé à priori.
 

Code :
  1. int entierLu(void) {
  2. int entier;
  3. int read;
  4. do {
  5.        printf("Nombre entier strictement positif : " );
  6.        fflush(stdout);
  7.        read = scanf("%d", &entier);
  8.        int c;
  9.        while ((c = getchar()) != '\n' && c != EOF) { }
  10.      } while ((read != 1) && (entier <= 0));
  11.     return entier;
  12. }


 
Et à cette étape, il manque quoi? la doc!
 

Code :
  1. /* entierLu renvoie un entier saisi à la console.
  2.     cet entier doit être strictement positif, et la fonction boucle tant que
  3.     ce qui est saisi à la console est incorrect. */
  4. int entierLu(void) {
  5.   int entier;
  6.   int read;
  7.   do {
  8.     printf("Nombre entier strictement positif : " );
  9.     fflush(stdout);
  10.     read = scanf("%d", &entier);
  11.     int c;
  12.     while ((c = getchar()) != '\n' && c != EOF) { }
  13.   } while ((read != 1) && (entier <= 0));
  14.   return entier;
  15. }


 
Je corrige pas le reste, mais le bon code final pourrait ressembler à ceci :  
 

Code :
  1. int main(void) {
  2.   afficheSomme(sommeCarres(entierLu()));
  3.   return 0;
  4. }


 
A+,


Message édité par gilou le 18-08-2019 à 21:30:11

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed