2017-10-22 8 views
-2

Ich möchte weiterhin Ganzzahlen in den Vektor P1 eingeben, bis ein Unterbrechungspunkt in diesem Fall 'q' oder 'Q' eingegeben wird. Das Programm läuft, wenn die Breakbedingung erfüllt ist, in eine Endlosschleife. Irgendwelche Ideen auf einer Arbeit herum, alles, was ich sehen kann ist, dass, weil das 'q' oder 'Q' ein Zeichen ist der Integer-Vektor dies als eine Eingabe nimmt, wenn die While-Schleife läuft, an welchem ​​Punkt es Endlosschleifen?While-Schleife beendet nicht C++

#include "stdafx.h" 
#include <iostream> 
#include <vector> 

using namespace std; 

int main() 
{ 
    //Declaring Polynomial 1 and 2 
    vector<int> P1; 
    vector<int> P2; 

    int x = 0; 
    int y = 0; 

    while (x != 'q'||x != 'Q') { 
     cout << "Please enter in the first polynomial one value at a time (Press Q when done)..."; 
     cin >> x; 
     P1.push_back(x); 
    } 

    //Also tested with a do while same problem 
    /*do 
    { 
    cout << "Please enter in the first polynomial one value at a time (Press Q when done)..."; 
    cin >> x; 

    P1.push_back(x); 

    } while (x != 'q');*/ 



    //Ignore this is for next part of program 
    vector<int> Res((P1.size() + P2.size()) + 1); 

    cout << P1.size() << "," << P2.size() << "," << Res.size(); 

    return 0; 
} 
+7

Die Bedingung 'x! = 'Q' || x! = 'Q'' ist immer wahr. Siehst du warum? –

+0

Nun x beginnt als 0, was nicht q ist, also beginnt es als WAHR, also ist meine Logik das Falsch oder Falsch = Falsch, also läuft es weiter bis x zu 'q' oder 'Q' wird, wenn es FALSCH wird und aus dem ausbricht Schleife sicher? – Tom

+0

Warum ist es Ihrer Meinung nach sinnvoll, eine Integer-Variable mit einem Zeichenliteral zu vergleichen? Probieren Sie diesen Code: 'int x = 'Q'; cout << x; 'Was wird gedruckt? Ist das was du willst oder erwartest? –

Antwort

2

(x = 'q' || x = 'Q'!) < ---- hier ein Fehler, es ist offensichtlich immer wahr: wenn x == q -> true, weil (x! = 'Q') == wahr, und umgekehrt. ändern || zu & &.

+0

geändert || zu && Gibt mir immer noch eine Endlosschleife – Tom

+0

versuchen, clean & erneut kompilieren? –

+0

Es mag nicht (x! = 'Q' && x! = 'Q') sendet das Programm in eine Endlosschleife – Tom

2

Die Bedingung:

(x != 'q' || x != 'Q') 

ist immer true in einer Endlosschleife führt. Warum das genauer ist:

Die x Integer-Variable wird auf 0 initialisiert. Dann prüfen Sie, ob sich x von 'q' unterscheidet, was einen ganzzahligen Wert von 111 darstellt. Es ist nicht gleich diesem Wert, daher ist der Ausdruck x != 'q'true. Dann prüfen Sie, ob x ungleich 'Q' Zeichen ist, was einen ganzzahligen Wert von 85 darstellt. Es ist nicht gleich diesem Wert, so dass der Ausdruck x != 'Q' auch true ist. Wir enden mit einer Bedingung von (true || true), die immer true ist.

Integrale Werte sind implizit in boolesche Werte umwandelbar, wobei 0 für false steht und jede andere Zahl für true steht. Versuchen Sie so etwas wie dieses stattdessen:

char c = 'y'; 
while (std::cin && (c == 'y' || c == 'Y')) { 
    // do work 
    std::cout << "Do you want to repeat the input? y/n?"; 
    std::cin >> c; 
} 

Davon abgesehen Sie brauchen nicht die "stdafx.h"-Header.

+1

ah Ich verstehe, ich habe es, so dass es als wahr beginnt und wenn x für eine Anweisung falsch wird, ist die andere Aussage immer noch wahr und ODER macht es immer noch WAHR – Tom

+0

Ich verstehe jetzt nicht warum ... while (x! = ' q '&& x! =' Q ') funktioniert nicht? Endlosschleife – Tom

+0

Danke jetzt scheint es nicht zu beenden, wenn ich n drücken – Tom

0

Zuerst Ich glaube, Sie nicht int x
Zweitens wie Ron ||-&&
Wie dem auch sei, gab Ron ein Beispiel, und es funktioniert die Änderung verwendet werden soll.

+0

Während ich das Feedback zu schätzen, muss ich sagen, dass Sie Kommentare als Kommentare, nicht als Antworten posten sollten. Um dies zu tun, bauen Sie bitte ein paar Wiederholungen auf, um Kommentare zu schreiben. – Ron

+1

Danke für Ihren Rat. Du hast recht, ich mache es in der Zukunft –