Suite de notes c++

Résolu/Fermé
amirarb Messages postés 1 Date d'inscription jeudi 17 novembre 2022 Statut Membre Dernière intervention 17 novembre 2022 - Modifié le 18 nov. 2022 à 12:54
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 21 nov. 2022 à 12:57

Bonjour,

Je débute en c++ et je dois saisir et afficher une suite de 3 notes séparées par un espace. Sauf que quand je mets les trois notes dans la console, ça me met 3 fois la même note.

Voici mon programme. Soyez indulgents, je débute.

#include <iostream>
#include <string.h>

int main() {
    std::string nom, prenom, filiere;
    float informatique, physique, anglais,;
    int choixMenu;
    do {
        std::cout << "\n 1- Saisir les donnees des etudiants(es)";
        std::cout << "\n 2- Afficher les donnees des etudiants(es)" ;
        std::cout << "\n 3- Modifier les donnees d un(e) etudiant(e)";
        std::cout << "\n 4- Supprimer toutes les donnees relatives aa un(e) etudiant(e)";
        std::cout << "\n 5- Afficher la moyenne de chaque matiere et la moyenne generale d’un(e) etudiant(e)";
        std::cout << "\n 6- Sortir du programme"  << std::endl;
        std::cin >> choixMenu;
        std::cout << "\n";

        switch(choixMenu) {
            case 1 :
                std::cout << "Entrer le prenom de l etudiant : ";
                std::cin >> prenom;

                std::cout << "Entrer le nom de l etudiant : ";
                std::cin >> nom;

                std::cout << "Entrer la filiere de l etudiant : ";
                std::cin >> filiere;

                std::cout << "Entrer les notes d informatiques de l etudiant : ";
                std::cin >> informatique >> informatique >> informatique;

                std::cout << "Entrer les notes de physiques de l etudiant : ";
                std::cin >> physique >> physique >> physique;

                std::cout << "Entrer les notes d anglais de l etudiant : ";
                std::cin >> anglais, anglais, anglais;
                std::cout << "\n";
                break;
            case 2 :
                std::cout << "\n Prenom de l etudiant : ";
                std::cout << prenom;
                std::cout << "\n nom de l etudiant : ";
                std::cout << nom;
                std::cout << "\n filiere de l etudiant : ";
                std::cout << filiere;
                std::cout << "\n note d informatique de l etudiant : ";
                std::cout <<  informatique;
                std::cout << informatique;
                std::cout <<  informatique;
                std::cout << "\n note de physique de l etudiant : ";
                std::cout << physique << physique << physique;
                std::cout << "\n note d anglais de l etudiant : ";
                std::cout << anglais << anglais << anglais;
                std::cout << "\n";
                break;
            case 3 :
                std::cout << "Modifier le prenom de l etudiant : ";
                std::cout << prenom;
                std::cout << " : ";
                std::cin >> prenom;
                std::cout << "Modifier le nom de l etudiant : ";
                std::cout << nom;
                std::cout << " : ";
                std::cin >> nom;
                std::cout << "Modifier la filiere de l etudiant : ";
                std::cout << filiere;
                std::cout << " : ";
                std::cin >> filiere;
                std::cout << "Modifier le prenom de l etudiant : ";
                std::cout << physique;
                std::cout << " : ";
                std::cin >> physique;
                std::cout << "Modifier le prenom de l etudiant : ";
                std::cout << anglais;
                std::cout << " : ";
                std::cin >> anglais;
                break;
        }
    } while (choixMenu < 5 || choixMenu > 1 && choixMenu != 6);
}


Windows / Chrome 107.0.0.0

A voir également:

3 réponses

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
18 nov. 2022 à 12:52

Bonjour,

Merci de soigner l'orthographe.

Je te recommande quand tu postes sur un forum de mettre un exemple minimum qui reproduit ton problème. D'ailleurs bien souvent cela te permettra de mieux comprendre ce qui ne va pas.

Ensuite en terme d'indentation, je t'invite à te référer à ton message #1 que j'ai remis en forme. En particulier, reviens à la ligne après chaque ";".

Avant de rentrer dans le vif du sujet, plusieurs recommandations :

  • Au début de la fonction main, tu peux rajouter using namespace std;. Il ne faut jamais utiliser cette instruction ailleurs que dans un ".cpp". En l'utilisant, cela te permet d'écrire cout, cerr, cin, endl au lieu de std::cout, std::cerr, std::cin, std::endl.
#include <iostream>

int main() {
    using namespace std;
    cout << "hello!" << endl;
    return 0;
}
  • Tu n'es pas obligé de faire plusieurs instructions std::cout << pour enchaîner des affichages, tu peux directement tout afficher en une instruction.
#include <iostream>

int main() {
    using namespace std;
    int x = 7, y = 8;
    cout << "x = " << x << endl
         << "y = " << y << endl;
    return 0;
}
  • tu devrais mettre des parenthèses dans ton test do ... while.
  • en C++, il ne faut pas inclure <string.h> (ça, c'est en C) mais <cstring>
  • en C++, on préfère remplacer les retour à la ligne par std::endl (cela permet de s'affranchir du système d'exploitation, car sous Linux c'est \n, sous windows, c'est \r\n)
  • tu n'utilises pas cin correctement. Voici la syntaxe :
#include <iostream>

int main() {
    using namespace std;
    int x, y, z;
    cout << "x, y, z ? ";
    cin >> x >> y >> z;
    cout << "x = " << x << endl
         << "y = " << y << endl
         << "z = " << z << endl;
    return 0;
}

Exécution :

x, y, z ? 11 15 8
x = 11
y = 15
z = 8

Bonne chance

1
PierrotLeFou
18 nov. 2022 à 01:57

Je vois entre autres:
                  std::cin>>informatique>>informatique>>informatique;
La variable informatique contiendra forcément la dernièere des trois valeurs.
Expliques mieux ce que tu veux faire.

0
PierrotLeFou
18 nov. 2022 à 14:27

Le "using namespace std" n'est plus recommandé dans l'écriture du C++ moderne.

0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
18 nov. 2022 à 16:08
  • Pas exactement, voir cette discussion.
    • Si tu utilises using namespace std dans un fichier hpp c'est problématique, car quiconque inclue ton header est impacté et donc tu impactes tous les projets qui dépendent du tien. C'est dans ce cas que ça n'est pas encouragé.
    • Si tu utilises using namespace std dans un fichier cpp (ou mieux dans une fonction de ce fichier cpp, comme j'ai fait), la portée est localisée et limitée au code de ton projet. Si d'aventure, il y avait une collision de nom, seul ton projet ne compilerait pas, et tu t'en rendrais compte immédiatement.
    • Dans le cas très particulier qui nous concerne, il faudrait être assez aventureux pour nommer des objets cout, cin, cerr ou endl...
  • Note que j'ai clairement précisé dans mon message #1 qu'il fallait veiller à utiliser cette directive uniquement dans un fichier cpp.
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101 > mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024
20 nov. 2022 à 14:27

Loin de moi l'idée de contredire Herb Sutter qui est un véritable expert. Mais je pense qu'utiliser using namespace risque d'avoir plus d'inconvénients que d'avantages, du moins pour un débutant.

Si on prend l'exemple suivant :

#include <iostream>  // for cout
#include <algorithm> // for transform()
#include <string>    // for string
#include <cctype>    // for toupper()
#include <locale>    // for locale
//using namespace std;

std::string  uppercase( std::string const& s ) {
	std::string  r;
	std::transform( begin(s), end(s), std::back_inserter(r), toupper );
	return  r;
}
void  test1() {    // test si les accents, leur conversion et les nombres sont gérés dans la locale
	std::cout << uppercase( "trouvé (nombre français) 1000.1 = " ) << 1000.1;
	std::cout.clear();  // juste pour contourner le cas où le séparateur milliers est mal géré 
	endl(std::cout);
}

char  next( volatile const char x[] ) {
	return  *(x+1);
}
void  test2() {
	endl( std::cout << "Le second caractère de \"abcd\" est " << next( "abcd" ) );
}

int  main() {
#if defined _MSC_VER
	std::system( "chcp 1252>NUL" );
#elif defined _WIN32
	std::system( "chcp 65001>NUL" );
#endif
	std::cout.imbue( std::locale( "" ) );

	test1();
	test2();
}

Le test1().
En utilisant using namespace std; le code ne compile pas. Il y a un problème ligne 10 et l'erreur risque d'être opaque à un débutant. Pour la comprendre et la corriger, il faut savoir qu'il existe 2 fonctions toupper(), une dans le namespace global (int ::toupper(int)) et une dans le namespace std (template<class C>C std::toupper(C,const locale&)). Il faut donc préciser quelle fonction appeler si on a fait using namespace std;.

On voit que l'injection de tout le namespace std dans le l'espace global "oblige" à connaître les dizaines de milliers de noms dans std!

Le test2().
Et dans le cas du test2(), l'incident est plus grave car aucune erreur de compilation ne se produit, mais l'exécution du code ne fait pas ce à quoi on s'attend. Ça n'est pas la fonction locale char next(volatile const char[]) qui est appelée si using namespace std; est utilisée, mais c'est la fonction template<class I> I next(I, typename std::iterator_traits<I>::difference_type=1) qui est silencieusement préférée.

Mais:
Ne pas utiliser using namespace std; risque de donner l'habitude de systématiquement ajouter std:: devant tout ce qui vient de la bibliothèque standard. Et parfois c'est cela qui va provoquer le bug. Par exemple devant certaines fonctions:
- fonction swap()
- class hash<>
- fonctions begin(),end(),clear(),size()
- ...
car ces entités peuvent et doivent être redéfinies dans certains cas, et donc mettre un std:: peut empêcher l'accès à la redéfinition provoquant le bug!

Mais du mais:
Dans tous les on aura le problème précédent pour des template ou du code dans les entêtes, et le piège du std:: de trop est donc à connaître.
Pour ma part, je préfère ne pas utiliser using namespace std; (mais j'utilise using namespace std::literals; dans les fichiers sources.)

0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749 > Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023
21 nov. 2022 à 12:57

C'est pour ça que selon moi, tu peux utiliser using namespace std dans une fonction sans trop de problème et sans que ça ait trop de conséquence. Pas besoin de connaître tous les noms dans ce namespace, en cas de collision ça ne compilera pas et tu le verras rapidement. En fait j'ai longtemps refuser de l'utiliser mais ça allège significativement le code donc tant que tu sais ce que tu fais pourquoi pas :-) Après, chacun sa manière de coder ;-)

0