2016-05-26 20 views
-1

Was ich tun muss: Ich habe einen Vektor von Linien im Augenblick, v[0] ist die erste Zeile und so weiter. Ich möchte die erste Nummer von jeder Zeile als die Herausforderung und die zweite Nummer von jeder Zeile als Richter lesen und dann die Bedingungen im Code anwenden. Ich möchte eine stringstream verwenden, um die Zahlen aus den Zeilen zu lesen.mit stringstream und getline zum Lesen der ersten beiden Zahlen jeder Zeile

Was mein Code gerade macht: Er liest nur die erste Nummer aus jeder Zeile. Also ist die erste Nummer der ersten Zeile die Challenge und die erste Nummer der zweiten Zeile ist der Judge und die erste Nummer der dritten Zeile ist die Challenge.

std::vector<string> v; 
    string line; 
    int i; 
    double challenge; 
    int judge; 

    while (getline(cin, line)) { 
     if (line.empty()) { 
      break; 
     } 

     v.push_back(line); 
    } 

    for (i = 0; i < v.size();i++) { 
     cin >> v[i]; 
     std::stringstream ss(v[i]); 
     ss << v[i]; 
     ss >> challenge >> judge; 

     if (challenge < 1 || challenge > 5) { 
      cout << "bad_difficulty" << endl; //must add the condition or empty 
      v.erase(v.begin() + i); 
     } 

     if (judge != 5 || judge != 7) { 
      cout << "bad_judges" << endl; //must add the condition or empty 
      v.erase(v.begin() + i); 
     } 

     cout << v[i] << endl; 

    } 

    return 0; 
} 

Zum Beispiel:

Input: 
5.1 7 5.4 3.0 9.6 2.9 2.8 2.0 5.4 
-3.8 7 2.9 1.1 5.7 7.2 4.8 8.5 3.9 
2.2 5 9.4 4.7 7.3 1.9 5.7 6.0 7.1 
2.4 6 9.2 5.2 1.0 2.9 4.9 7.4 7.9 
2.1 7 7.9 4.9 0.0 7.2 9.1 7.8 6.7 4.3 
3.8 5 
2.0 
4.0 7 2.4 1.9 3.2 8.3 14.8 0.1 9.7 
2.5 7 8.4 -8.0 5.0 6.0 8.0 1.3 3.3 
1.6 -1 9.5 2.5 5.8 7.9 5.5 1.6 7.9 

Output should be: 
bad_difficulty 
bad_difficulty 
2.2 5 9.4 4.7 7.3 1.9 5.7 6.0 7.1 
bad_judges 
2.1 7 7.9 4.9 0.0 7.2 9.1 7.8 6.7 4.3 
3.8 5 
bad_judges 
4.0 7 2.4 1.9 3.2 8.3 14.8 0.1 9.7 
2.5 7 8.4 -8.0 5.0 6.0 8.0 1.3 3.3 
bad_judges 

Current Output: 
bad_difficulty 
bad_judges 
2.2 5 9.4 4.7 7.3 1.9 5.7 6.0 7.1 
bad_judges 
2.1 7 7.9 4.9 0.0 7.2 9.1 7.8 6.7 4.3 
bad_judges 
2.0 
bad_judges 
2.5 7 8.4 -8.0 5.0 6.0 8.0 1.3 3.3 
bad_judges 
1.6 -1 9.5 2.5 5.8 7.9 5.5 1.6 7.9 
+1

Was ist die Frage? "Richter! = 5 || Richter! = 7' sieht mir nicht gut aus. – LogicStuff

+0

Ich habe ein Beispiel gepostet. Die Richter Nummer, die die zweite Nummer der Linie ist, sollte entweder 5 oder 7 sein, ansonsten ist es ein bad_judges – user3328381

+0

Welche Ausgabe erhalten Sie derzeit? –

Antwort

0

die durch diese Schleife löschen Fuß gehen lassen.

i = 0 
v[0] contains line 1. 
Line 1 is 5.1 7 
challenge > 5, remove 0. The vector shifts up by 1 v[0] now contains line 2 
Judge == 7 do not remove 0 
increment i 

i = 1 
v[1] contains line 3. Line 2 has been skipped 
Line 3 is 2.2 5 
challenge < 5, do not remove 1. 
Judge is not 5 or 7. remove 1. The vector shifts up by 1 v[1] now contains line 4 
increment i 

i = 2 
v[2] contains line 5. Line 4 has been skipped 
Line 5 is 2.1 7 
challenge < 5, do not remove 2. 
Judge is 7. do not remove 2. 
increment i 

i = 3 
v[3] contains line 6. 
Line 6 is 3.8 5 
challenge < 5, do not remove 3. 
Judge is 5. do not remove 3. 
increment i 

i = 3 
v[3] contains line 7. 
Line 7 is 2.0 
challenge < 5, do not remove 3. 
Judge is UNDEFINED! PANIC! PANIC! Crom only knows what happens. 
increment i 

Wie auch immer, das Grundmuster sollte hier klar sein. Wenn Sie ein Element aus einer vector entfernen, werden alle nachfolgenden Elemente nach oben verschoben. Lösung: Wenn Sie ein Element entfernen, erhöhen Sie nicht i. Eine Erklärung wird sich darum kümmern.

Als nächstes gibt es zwei separate if-Anweisungen gibt es die Möglichkeit, dass beide Bedingungen erfüllt sind und v[i] wird zweimal entfernt. Es gibt eine Reihe von Möglichkeiten. Manthan Tilvas Lösung mit continue ist einfach und effektiv, aber dies kann mit einer else if oder durch Rollen beider Tests in die gleiche if offensichtlicher behandelt werden.

Drittens sind Werte, die nicht aus dem Stream gelesen wurden, nicht definiert. und sollte nicht verwendet werden. Verwerfen Sie die Zeile, ohne weiter zu suchen. if (ss >> challenge >> judge) wird hier helfen.

+0

Dein Code funktioniert Manthan! Es gibt noch einen weiteren Schritt. Ich muss alle Zahlen nach dem Richter in einem Vektor lesen (um diese Zahlen zu vergleichen und die höchste zu bekommen und zu sehen, ob nach jeder 5 Richter genau fünf Zahlen und nach jedem 7 Richter genau 7 Richter in der Linie sind) . Ist es möglich, ss >> vector [i] in einer for-Schleife auszuführen (i = 0; i user3328381