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

  FORUM HardWare.fr
  Programmation
  C++

  Probleme amélioration programme

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme amélioration programme

n°2255392
djanou76
Posté le 10-04-2015 à 09:29:42  profilanswer
 

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
mood
Publicité
Posté le 10-04-2015 à 09:29:42  profilanswer
 

n°2255394
rufo
Pas me confondre avec Lycos!
Posté le 10-04-2015 à 09:42:30  profilanswer
 

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
n°2255421
Arl Guhr
Posté le 10-04-2015 à 14:25:23  profilanswer
 

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


---------------
il s'appel le ronge me doute
n°2255437
djanou76
Posté le 10-04-2015 à 15:51:49  profilanswer
 

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

n°2255439
djanou76
Posté le 10-04-2015 à 16:00:26  profilanswer
 

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
n°2255441
rufo
Pas me confondre avec Lycos!
Posté le 10-04-2015 à 16:25:54  profilanswer
 

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
n°2255444
djanou76
Posté le 10-04-2015 à 16:37:38  profilanswer
 

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
n°2255446
rufo
Pas me confondre avec Lycos!
Posté le 10-04-2015 à 16:50:47  profilanswer
 

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
n°2255475
gilou
Modérateur
Modzilla
Posté le 11-04-2015 à 15:27:54  profilanswer
 

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

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

  Probleme amélioration programme

 

Sujets relatifs
Problème avec le Voice Codec Board Eblocksproblème de syntaxe
Preuve de programmeProblème slider
Tkinter-Problème pour récupérer les valeurs[résolu][sqlserver-managementstudio]plus de touches de contrôle
[EXCEL] problème avec SendKeys pour envoyer un pipe "|" vers PuttyProblème pour enlever le GRAS du texte
Le bouton apparait 2 fois ! Problème dans le code !Probleme de macro
Plus de sujets relatifs à : Probleme amélioration programme


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR