2017-09-26 5 views
-2

Hey Jungs irgendwie neu in der Programmierwelt und ich weiß, dass Sie alle Eingabe als String einlesen sollten, aber das ist nur ein einfaches Programm, und ich habe ein Gehirn Furz denke ich aber hier meine Frage ist ...... warum, wenn ich q drücken zu beenden bin ich eine Endlosschleife immer und wie würde ich das während kondensieren Schleifen, weil das Brutto sieht hier ist das, was ich bisherWarum habe ich diese Endlosschleife

#include "stdafx.h" 

#include <iostream> 
using namespace std; 
int main() 
{ 

    int grade; 
    char quit = 'a'; 

    cout << "Input your grade (0-100): "; 
    cout << endl; 
    cin >> grade; 
    while (grade < 0) { 
     cout << "If you have a negetive grade....drop out! otherwise enter another grade" << endl; 
     cin >> grade; 
    } 
    while (quit != 'q') { 
     while (grade < 0) { 
      cout << "If you have a negetive grade....drop out! otherwise enter another grade" << endl; 
      cin >> grade; 
     } 

     if (grade == 100) { 
      cout << "You got a perfect grade!" << endl; 
      cout << "Letter grade: A" << endl; 
     } 
     else if (grade >= 90 && grade <= 100) { 
      cout << "Letter grade: A" << endl << endl; 
     } 
     else if (grade >= 80 && grade <= 89) { 
      cout << "Letter grade: B" << endl << endl; 
     } 
     else if (grade >= 70 && grade <= 79) { 
      cout << "Letter grade: C" << endl << endl; 
     } 
     else if (grade >= 60 && grade <= 69) { 
      cout << "Letter grade: D" << endl << endl; 
     } 
     else if (grade < 60) { 
      cout << "Letter grade: F" << endl << endl; 
     } 
     else { 
      cout << "Invalid grade!" << endl; 
     } 
     cout << " would you like to enter another grade? or press q to quit" << endl; 
     cin >> grade; 
    } 
    system("pause"); 
    return 0;`enter code here` 
} 
+2

Sie scheinen nie wirklich die Variable 'quit' zu ändern. –

+2

Sie testen, ob 'quit' ungleich dem Buchstaben 'q' ist, jedoch setzen Sie die Variable explizit oben auf 'a' und aktualisieren sie nie. Ich schlage vor, Sie ändern Ihre zweite 'while' Bedingung zu' while (quit! = Grade) 'und initialisieren' quit' zu 'q'. Es ist bei weitem nicht der schönste Ansatz, aber es sollte funktionieren! –

Antwort

1

Minimal , überprüfbares Beispiel:

#include "stdafx.h" 

#include <iostream> 
using namespace std; 
int main() 
{ 

    int grade; 
    char quit = 'a'; 

    cout << "Input your grade (0-100): "; 
    cout << endl; 
    cin >> grade; 
    while (quit != 'q') { 
     cout << " would you like to enter another grade? or press q to quit" << endl; 
     cin >> grade; 
    } 
    system("pause"); 
    return 0;`enter code here` 
} 

Siehe das Problem mit quit ?

bearbeiten
Was ich getan haben, ist zu entfernen (die meisten) die Zeilen, die nichts mit quit oder die Schleife zu tun haben.

An dieser Stelle sollten Sie beachten, dass die Schleife nie ändert beenden.

Wenn Sie Probleme mit einem Programm haben, ist eine der besten Möglichkeiten, um herauszufinden, was falsch ist, alles loszuwerden, was nichts mit dem Fehler zu tun hat. Mit der Zeit werden Sie in der Lage sein, dies nur mit Ihrem Verstand zu tun. Duuude!

, während ich schon mal dabei bin
der richtige Weg, um Benutzereingaben zu verarbeiten ist es alsString zu erhalten, dann wandle ihn zu dem, was Sie wollen.

Zum Beispiel:

#include <iostream> 
#include <sstream> 
#include <stdexcept> 
#include <string> 

template <typename T> 
T string_to(const std::string& s) 
{ 
    T value; 
    std::istringstream ss(s); 
    ss >> value >> std::ws; 
    if (!ss.eof()) throw std::invalid_argument("T string_to()"); 
    return value; 
} 

int main() 
{ 
    std::cout << "Enter a number or 'q': "; 
    std::string s; 
    getline(std::cin, s); 

    if (s == 'q') 
    { 
    std::cout << "Good job! You entered 'q'.\n"; 
    } 
    else 
    { 
    try 
    { 
     double x = string_to <double> (s); 
     std::cout << "Good job! You entered '" << x << "'.\n"; 
    } 
    catch (const std::exception& e) 
    { 
     std::cout << "Foo, you didn't obey instructions and made me " << e.what() << ".\n"; 
    } 
    } 
} 
+0

Obwohl die gekürzte Version hilft, sollten Sie wahrscheinlich nur erklären, was das Problem ist. Auf den ersten Blick sieht das nicht nach einer Antwort aus, aber wenn Sie dem OP gezeigt haben, wie Sie sein Problem in ein kleineres Problem zerlegen, um zu helfen, zu lösen, dann zeigen Sie, was das Problem ist, es würde einen langen Weg gehen. – Tas

+0

Gut gemacht.Fest. –

1

Wegen grade var. Sie haben grade als int deklariert. Wenn Sie richtig int geben, es funktioniert gut, aber wenn Sie ein anderes char ex geben :) q oder f, Funktion cin kann q oder f als int Typ nicht erkennen.

Wenn char Eingang, cin übergeben eigenen Prozess.

Sie haben grade Typ in char ändern beide char und int Eingänge zu erkennen.

Wenn Sie nur einen Eingabefluss verwenden möchten, hilft Ihnen dieser Implementierungscode.

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    char c_input[32] = {0}; 
    cin>>c_input; 

    while(atoi(c_input) < 0) 
    { 
     cout<<"If you have a negative grade....drop out! otherwise enter another grade" << endl; 
     cin>>c_input; 
    } 
    while(c_input[0] != 'q') 
    { 
     while(atoi(c_input) < 0) 
     { 
      cout<<"If you have a negative grade....drop out! otherwise enter another grade" << endl; 
      cin>>c_input; 
     } 
     cout<<c_input; 
     cout<<"Would you like to enter another grade? or press q to quit" << endl; 
     cin>>c_input; 
    } 
    return 0; 
} 
Verwandte Themen