Probleme amélioration programme

Probleme amélioration programme - C++ - Programmation

Marsh Posté le 10-04-2015 à 09:29:42    

Bonjour j'ai un systeme de moyenne de note en C++ mais je n'arrive pas a faire une condition pour dire que si la note est plus petite que 0 et plus grande que 20 alors sa lui demande de réécrire la note (Je pense que j'ai mal placé le if mais je suis pas sur  :) )
 
Voici mon code :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <iostream>
  5. #include <string>
  6. using namespace std;
  7. int main ()
  8. {
  9.     string nomEleve("Error" );
  10.     int nombreNote, i(1);
  11.     float somme(0), moyenne, note;
  12.     cout << "--------------------------" << endl;
  13.     cout << " ENTRER LE NOM DE L'ELEVE" << endl;
  14.     cout << "--------------------------" << endl;
  15.     getline(cin, nomEleve);
  16.     cout << "\n\---------------------------" << endl;
  17.     cout << " ENTRER LE NOMBRE DE NOTES" <<endl;
  18.     cout << "---------------------------" << endl;
  19.     cin >> nombreNote;
  20.     for (i=1; i<=nombreNote; i++)
  21.     {
  22.         cout << "\n\----------------------" << endl;
  23.         cout << " ENTRER LA NOTE N : " << i << endl;
  24.         cout << "----------------------" << endl;
  25.        
  26.         if (note < 0 && note > 20)
  27.         {
  28.             cout << "LA NOTE DOIT ETRE COMPRISE ENTRE 0 ET 20 !"
  29.         }
  30.         else
  31.         {       
  32.         cin >> note;
  33.         somme += note;
  34.         }
  35.     }
  36.     moyenne = somme / nombreNote;
  37.     cout << "\n\-=-=-=-=-=-=-=-=-=-=-=-=-" << endl;
  38.     cout << " - ELEVE : " << nomEleve << endl;
  39.     cout << " - MOYENNE : " << moyenne << endl;
  40.     cout << "-=-=-=-=-=-=-=-=-=-=-=-=-" << endl;
  41.     return 0;
  42. }


 
J'ai commencé le C++ depuis quelque jour c'est pour sa ^^


Message édité par gilou le 10-04-2015 à 16:13:59
Reply

Marsh Posté le 10-04-2015 à 09:29:42   

Reply

Marsh Posté le 10-04-2015 à 09:42:30    

A l'intérieur du for, faut faire un do{...} while ((note < 0) && (note > 20)), le do...while étant la partie "saisie de la note". En effet, là, si tu te trompes dans la note, tu sera éventuellement amené à la ressaisir si i <= nombreNote. Mais du coup, si tu te trompes une seule fois, t'auras jamais 20 notes mais nombreNote-nberreursSaisie ;)
 
Au passage, j'avais pas vu que tu testes la valeur de note avant de l'avoir saisie  :pt1cable:  
 
Et la déclaration de i : tu fais i(1) :??: idem pour somme(0).
Je t'invite vivement à initialiser tes variables avec une valeur au moment de leur déclaration, ça t'éviteras des comportements indéfinis.
 
Je note aussi que tu vérifies pas que nombreNote est > 0. Idem pour nomEleve. Et si on saisit un caractère au lieu d'un nb, il se passe quoi ?


Message édité par rufo le 10-04-2015 à 09:46:15

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 10-04-2015 à 14:25:23    

(et dans ton if, au lieu d'un && ce serait plutôt un || il me semble :))


---------------
il s'appel le ronge me doute
Reply

Marsh Posté le 10-04-2015 à 15:51:49    

Merci de vos réponses je corrige tout sa et j'essaye :)

Reply

Marsh Posté le 10-04-2015 à 16:00:26    

Mais enfaite le int nombreNote, i(1); et déclarer tout en haut, j'enleve ducoup le (1) car il est déclarer dans la boucle : for (i=1; i<=nombreNote; i++) ??


Message édité par djanou76 le 10-04-2015 à 16:18:09
Reply

Marsh Posté le 10-04-2015 à 16:25:54    

Oui, faut enlever (1) pour i et (0) pour somme. Pour info, dans le for, tu utilises i mais en aucun cas il s'agit d'une déclaration ! :o
 
+1 pour le || à la place du && dans le if (ou alors, faut faire le teste à l'envers avec les < et > pour garder le && ).
 
D'une manière générale, il ne s'agit pas d'améliorer ton programme : il ne fonctionne pas et ne compile même probablement pas. Améliorer, c'est reprendre un programme qui fonctionne, soit pour optimiser ses perfs soit pour optimiser le nb de lignes de code ou la lisibilité du programme. ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 10-04-2015 à 16:37:38    

Euh quand tu me parler du do, while a l'interieur du for c'est comme sa que je m'y prend :
 
    for (i=1; i<=nombreNote; i++)
    {
        do
        {
            cout << "\n\----------------------" << endl;
            cout << " ENTRER LA NOTE N : " << i << endl;
            cout << "----------------------" << endl;
 
            cin >> note;
            somme += note;
        }while((note < 0) || (note > 20));
 
            moyenne = somme / nombreNote;
    }
 
    cout << "\n\-=-=-=-=-=-=-=-=-=-=-=-=-" << endl;
    cout << " - ELEVE : " << nomEleve << endl;
    cout << " - MOYENNE : " << moyenne << endl;
    cout << "-=-=-=-=-=-=-=-=-=-=-=-=-" << endl;
 
La condition de la note marche mais par contre la moyenne ne saffiche pas a la fin ^^


Message édité par djanou76 le 10-04-2015 à 16:41:45
Reply

Marsh Posté le 10-04-2015 à 16:50:47    

cin >> note;
somme += note;  
 
doivent être en dehors du do...while, of course !
 
Et moyenne = somme / nombreNote; doit être en-dehors du for. Tu comprends ce que tu fais ? J'ai l'impression que l'algo est pas clair dans ta tête.
 
Un conseil : avant de coder en C, tu écris ce que tu dois programmer en pseudo-code. Une fois que ça a l'air bon, tu codes en C ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 11-04-2015 à 15:27:54    

Et plus tard, tu pourras t'amuser à utiliser les choses déjà incluses dans la librairie standard du C++11 comme par exemple ceci:

Code :
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <numeric>
  4. #include <string>
  5. #include <vector>
  6. #include <cctype>
  7. double moyenne(std::vector<double>& notes)
  8. {
  9.     return std::accumulate(std::begin(notes), std::end(notes), 0)/static_cast<double>(notes.size());
  10. }
  11. int tailleCadre(const std::string& phrase, int margin)
  12. {
  13.     return (phrase.size() + (2 * margin));
  14. }
  15. int tailleCadre(const std::vector<std::string>& phrases, int margin)
  16. {
  17.     return (std::max_element(std::begin(phrases), std::end(phrases),
  18.                    [](const std::string& s, const std::string& t ) {return (s.size() < t.size());})
  19.                    ->size() + (2 * margin));
  20. }
  21. void affiche(const std::string& phrase, const char deco)
  22. {
  23.     std::string cadre(tailleCadre(phrase, 1), deco);
  24.     std::cout << cadre << '\n';
  25.     std::cout << ' ' << phrase << ' ' << '\n';
  26.     std::cout << cadre << std::endl;
  27. }
  28. void affiche(const std::vector<std::string>& phrases, const char deco)
  29. {
  30.     std::string cadre(tailleCadre(phrases, 1), deco);
  31.     std::cout << cadre << '\n';
  32.     for (const std::string& phrase : phrases) {
  33.         std::cout << ' ' << phrase << ' ' << '\n';
  34.     }
  35.     std::cout << cadre << std::endl;
  36. }
  37. int main ()
  38. {
  39.     // Recuperation du nom
  40.     affiche("ENTRER LE NOM DE L'ELEVE", '-');
  41.     std::string nomEleve;
  42.     std::getline(std::cin, nomEleve);
  43.     if (!nomEleve.size()) {
  44.         std::cerr << "Erreur: Aucun nom entre!" << std::endl;
  45.         return 0;
  46.     }
  47.     // mise en majuscule de la première lettre
  48.     nomEleve.front() = std::toupper(nomEleve.front());
  49.     // Recuperation des notes dans un vecteur
  50.     std::vector<double> notes;
  51.     double note;
  52.     affiche(std::vector<std::string> {"Entrer les notes",
  53.                                       "Separer par des blancs ou des lignes vides",
  54.                                       "Pour terminer, entrez une lettre suivie de retour chariot"}, '-');
  55.     while (std::cin >> note) {
  56.         notes.push_back(note);
  57.     }
  58.     if (!notes.size()) {
  59.         std::cerr << "Erreur: Notes entrees invalides!" << std::endl;
  60.         return 0;
  61.     }
  62.     // calcul de la moyenne et mise sous forme de chaine, pour tronquer à deux chiffres après la virgule
  63.     std::string moy(std::to_string(moyenne(notes)));
  64.     moy.erase(moy.find_last_of('.') + 3, std::string::npos);
  65.     // affichage du résultat
  66.     affiche(std::vector<std::string> {"- ELEVE : " + nomEleve, "- MOYENNE : " + moy}, '*');
  67.     return 0;
  68. }


Deux petits trucs à retenir de mon exemple un poil extrémiste :)
- Il faut essayer d'utiliser les conteneurs de base du C++ chaque fois que c'est possible, en particulier les vector, pour stocker un nombre variables de données numériques. Vector est le premier conteneur de base que tu dois apprendre à utiliser (et c'est facile)
- Quand on a des choses précises et bien identifiées, il faut les mettre dans des fonctions plutôt que dans le main. Typiquement, le calcul de la moyenne d'une liste de nombre rentre dans ce cas.
 
A+,


Message édité par gilou le 11-04-2015 à 15:40:31

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