Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1616 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] Erreurs dans les fonctions

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Erreurs dans les fonctions

n°2337982
fusion20
Posté le 17-08-2019 à 14:42:19  profilanswer
 

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 :)

mood
Publicité
Posté le 17-08-2019 à 14:42:19  profilanswer
 

n°2337992
rat de com​bat
attention rongeur méchant!
Posté le 17-08-2019 à 18:25:45  profilanswer
 

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

n°2338002
gilou
Modérateur
Modzilla
Posté le 18-08-2019 à 20:17:32  profilanswer
 

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!    --    In umbra igitur pugnabimus. --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] Erreurs dans les fonctions

 

Sujets relatifs
Connecteur C / MariaDBHeader C dans prog cpp
[Résolu] [Wordpress][Config] Erreurs redirections vers sous-dossierC++ calcul d'un nombre prmier
[C#] Charger un combobox plus rapidementfonction pour gerer les erreurs d'exception
Récupération adresse IP de ma Passerelle en CDébutant en C rencontre quelques soucis...
Importation de fonctions depuis un fichiercodage en language C
Plus de sujets relatifs à : [C] Erreurs dans les fonctions


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR