2017-10-01 2 views
0

Ich habe viele Dinge ausprobiert und ändere diesen Code, aber ich kann nicht erreichen, dass zwei Eingaben erforderlich sind, bevor ein Wert für 'score' akzeptiert wird. Außerdem hatte ich Probleme, einen Weg zu finden, die cin von 'score' zu stoppen und ' ' zu antworten, damit der Benutzer Enter drücken kann, ohne einen Wert einzugeben. Der einzige Weg, den ich gesehen habe, ist, sie beide als Saiten zu akzeptieren, aber ich hatte gehofft, das zu vermeiden.C++ cin erfordert 2 oder mehr Eingaben, bevor es einen Wert akzeptiert

#include<iostream> 
 
#include<iomanip> 
 
#include<limits>**strong text** 
 

 
using namespace std; 
 

 
//void enterdata(string*, int*); 
 

 
int main(){ 
 
// \t string names[]; 
 
// \t int testscores[]; 
 
\t string name; 
 
\t int score; 
 
\t char answer; 
 

 
\t cout<<"This program asks the user to enter a list of names and test scores,"<<endl; 
 
\t cout<<"then sorts the list into ascending order according to the scores"<<endl; 
 
\t cout<<"and calculates the average test score."<<endl; 
 

 
// \t enterdata(names, testscores); 
 

 
\t do{ 
 
\t \t \t cout<<"Please enter a name: "; 
 
\t \t \t getline(cin, name); 
 
\t \t \t while(name.empty()){ 
 
\t \t \t \t cout<<"No entry detected. Please enter a name: "; 
 
\t \t \t \t getline(cin, name); 
 
\t \t \t } 
 
\t \t \t cout<<name<<endl; 
 
\t \t \t cout<<"Please enter a test score: "; 
 
\t \t \t cin>>score; 
 
\t \t \t while(!(cin>>score) || score<0){ 
 
\t \t \t \t cin.clear(); 
 
\t \t \t  cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
 
\t \t \t  cout<<"Input not valid. Only positive integers will be accpeted."<<endl; 
 
\t \t \t  cout<<"Please enter a test score: "; 
 
\t \t \t } 
 
\t \t \t cout<<score<<endl; 
 
\t \t \t cin.sync(); 
 
\t \t \t cout<<"Would you like to enter another student name and test score? [y/n] "; 
 
\t \t \t cin>>answer; 
 
\t \t \t while(answer!='y' && answer!='n'){ 
 
\t \t \t  cout<<"Input not valid. Only y or n will be accepted."<<endl; 
 
\t \t \t  cout<<"Would you like to enter another student name and test score? [y/n] "; 
 
\t \t \t  cin>>answer; 
 
\t \t \t } 
 
\t \t \t cout<<answer<<endl; 
 
\t \t \t cin.sync(); 
 
\t \t } while(answer == 'y'); 
 

 
\t return 0; 
 
}

+0

Mögliches Duplikat von [Warum überspringt std :: getline() die Eingabe nach einer formatierten Extraktion?] (Https://stackoverflow.com/questions/21567291/why-does-stdgetline-skip-input-after-a-formatted -Extraktion) – user0042

+0

Ich weiß es nicht. Es scheint sich anders zu verhalten als diese Frage. Es überspringt die Eingabe nicht. Das Programm wird nicht zum nächsten Schritt übergehen, ohne einen Wert zu akzeptieren. Solange ich eine positive Zahl eingegeben habe und die Eingabetaste gedrückt habe, das zweite Mal, dass ich eine Zahl eintrage und die Eingabetaste drücke, akzeptiert cin einen Wert und geht weiter zum nächsten Schritt im Programm. – BigB63

+0

Sie lesen die ganze Zahl zweimal in diesen zwei Zeilen - cin >> score; while (! (Cin >> score) || score <0) { Seien Sie auch vorsichtig, wenn Sie zwischen cin und readline wechseln - wenn Sie integer mit cin lesen, liest es nicht den Zeilenumbruch, also wird es von der nächste readline(). – Harmeet

Antwort

1

Der Fehler ist hier:

while(!(cin>>score) || score<0){ //------ Here! 
    cin.clear(); 
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
    cout<<"Input not valid. Only positive integers will be accpeted."<<endl; 
    cout<<"Please enter a test score: "; 
} 

Sie verwenden wieder den Eingangsstrom, wenn Sie cin>>score sagen, und deshalb fordert das Programm für mehr Input! Denken Sie daran wie ein Funktionsaufruf (Hinweis: Überladung des Operators!). Ich nehme an, Sie haben dies geschrieben (!(cin>>score), weil Sie den Stream für Fehler testen möchten. In einem kleinen Programm wie diesem würde ich es nicht schwitzen (Schulübung?)

Was den zweiten Teil von dir betrifft, über das hinderliche Eintreten von einem Effekt (der lästige Zeilenumbruch) bin ich mir ziemlich sicher kann das nicht leicht machen. Ich würde höflich fragen, ob Sie wirklich Zeit auf dieser obwohl verbringen möchten (und wenn es eine Schule Übung ist, alle anderen wird das gleiche Problem haben)

Hier wird die gereinigt und korrigiert Code:

#include <iostream> 
#include <iomanip> 
#include <limits> 
#include <string> 

using std::cout; 
using std::cin; 
using std::string; 
using std::endl; 

//void enterdata(string*, int*); 

int main() { 
    //string names[]; 
    //int testscores[]; 
    string name; 
    int score; 
    char answer = 'y'; 

    cout << "This program asks the user to enter a list of names and test scores," << endl; 
    cout << "then sorts the list into ascending order according to the scores" << endl; 
    cout << "and calculates the average test score." << endl; 

    //enterdata(names, testscores); 

    while(answer == 'y') { 
    cout << "Please enter a name: "; 
    std::cin >> name; 
    while (name.empty()) { 
     cout << "No entry detected. Please enter a name: "; 
     std::cin >> name; 
    } 
    cout << name << endl; 
    cout << "Please enter a test score: "; 
    cin >> score; 
    while (score<0) { 
     cin >> score; 
     cin.clear(); 
     cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
     cout << "Input not valid. Only positive integers will be accpeted." << endl; 
     cout << "Please enter a test score: "; 
    } 
    cout << score << endl; 
    cin.sync(); 
    cout << "Would you like to enter another student name and test score? [y/n] "; 
    cin >> answer; 
    while (answer != 'y' && answer != 'n') { 
     cout << "Input not valid. Only y or n will be accepted." << endl; 
     cout << "Would you like to enter another student name and test score? [y/n] "; 
     cin >> answer; 
    } 
    cout << answer << endl; 
    cin.sync(); 
} 
return 0; 
} 
+0

Ja, das ist für ein Schulprojekt. Ich habe versucht, die Haupt-Do-While-Schleife zu bekommen, bevor ich den Rest mache. Ich werde wahrscheinlich einige der Erklärungen ändern müssen, sobald ich es in den Rest des Programms eingefügt habe. Das Projekt befindet sich auf Zeigern und erfordert, dass ich ein Array/Arrays mit Namen und Testergebnissen dynamisch zuteile, dann sortiere das Array/die Arrays mit Hilfe von Zeigern in aufsteigender Reihenfolge nach dem Testergebnis, während die Namen ihren jeweiligen Testergebnissen zugeordnet bleiben. dann muss ich die sortierte Liste der Namen und der Kerben cout und den durchschnittlichen Testkerben cout. – BigB63

+0

Wie auch immer, als Teil des Projekts müssen wir Fail-Checks für die Eingaben durchführen und den Wiedereintritt gültiger Daten anfordern, anstatt es dem Programm zu erlauben, auf cin-Fehlern zu enden. – BigB63

+0

Auch ich schätze den Aufwand zu helfen, aber der Code, den Sie mir gaben, funktioniert auch nicht.Bei Eclipse fragt es mich nur nach einem Integer-Wert, anstatt eines meiner Couts zu drucken, und in C++ Shell wird der erste Wert des Namens und ein Test-Ergebnis von 0 endlos neu gedruckt, wenn ich beim Eingeben eines Testergebnisses eine ungültige Antwort gebe . – BigB63

Verwandte Themen