2
votes

Deuxième pendant que la boucle n'est pas en cours d'exécution, définition de la valeur sur "nan"

Comme indiqué ci-dessous, j'essaie de créer un programme simple qui trouvera 3 moyennes de 3 groupes de nombres différents. 1er semestre, 2ème semestre et la moyenne de ces deux. Lorsqu'il est exécuté, le programme imprime la première moyenne correcte mais ne passe jamais par la deuxième boucle while se terminant par "nan" comme valeur de la deuxième moyenne.

#include <iostream>
#include <ios>
#include <iomanip>

using namespace std;

int main() {
    // First semester
    cout << "Enter your first semester grades (Press enter for each new grade and write \"End\" to stop): ";

    streamsize prec = cout.precision();
    double grades1;
    double sum1 = 0;
    int count1 = 0;

    while (cin >> grades1) {
        count1++;
        sum1 += grades1;
    }

    cout << "Your first semester average is: " << setprecision(3) << sum1 / count1 << setprecision(prec) << endl << endl;

    // Second semester
    cout << "Enter your second semester grades (Press enter for each new grade and write \"End\" to stop): ";

    double grades2;
    double sum2 = 0;
    int count2 = 0;

    while (cin >> grades2) {
        count2++;
        sum2 += grades2;
    }

    cout << "Your second semester average is: " << setprecision(3) << sum2 / count2 << setprecision(prec) << endl;
    cout << "Your two semester average is: " << setprecision(3) << (sum1 / count1 + sum2 / count2) / 2 << setprecision(prec) << endl;

    return 0;
}


0 commentaires

3 Réponses :


1
votes

La première boucle ne se terminera que s'il y a une erreur de lecture de std :: cin , ou si vous appuyez sur la séquence de fin de fichier. Ces deux événements définiront un état dans l'objet de flux qui rend échouer toute autre lecture du flux.

Vous devez utiliser la clear pour effacer cet état.


0 commentaires

2
votes

Je pense que c'est un problème avec std :: cin. J'ai ajouté une nouvelle vérification dans votre code après la première boucle while:

if (cin.fail()) {
    cout << "Cin in failed state" << endl;
}

La condition if ci-dessus fonctionne, ce qui signifie que cin est en état d'échec et empêche votre deuxième boucle while de démarrer. J'ai essayé d'utiliser cin.clear () mais cela n'a pas fonctionné, je ne suis pas tout à fait sûr de savoir comment effacer le bit échoué sur cin.

Une autre solution consiste à écrire un fonction qui obtient une double valeur de l'utilisateur.


0 commentaires

0
votes
cin.clear();
std::cin.ignore();
Along with the clear() function there has to be an ignore() to ignore the previous 'end-of-file' input. 

0 commentaires