2016-05-26 10 views
-1

私は何をする必要がありますか:私は今すぐベクトルのベクトルを持っています。v[0]が最初の行であるなどです。私は挑戦として各行から最初の番号を読んで、裁判官として各行から2番目の番号を読んで、コードの条件を適用したいと思います。私はstringstreamを使って、行から数字を読み出すのを読んでいます。stringstreamとgetlineを使用して各行の最初の2つの数字を読み取る

私のコードは現在何をしていますか:各行から最初の数字だけを読み取っています。したがって、最初の行の最初の数がチャレンジであり、2行目の最初の数がジャッジであり、3行目の最初の数がチャレンジです。例えば

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; 
} 

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

どういうのですか? '裁判官!= 5 ||裁判官!= 7'は私によく見えません。 – LogicStuff

+0

私は例を掲載しました。 2番目の番号であるジャッジ番号は5または7のいずれかでなければなりません。それ以外の場合はbad_judgesです – user3328381

+0

現在どのような出力を得ていますか? –

答えて

0

はのは、その削除ループを歩いて行きましょう。

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 

とにかく、ここの基本パターンは明確です。 vectorから要素を削除すると、それ以降の要素はすべて上に移動します。解決策:要素を削除するときには、iを増分しないでください。 elseステートメントがこれを処理します。

2つの別々の文があるため、両方の条件が真であり、v[i]が2回削除される可能性があります。これを回避する方法がたくさんあります。 continueのManthan Tilvaのソリューションはシンプルで効果的ですが、これはelse ifでより明らかに扱うことができます。あるいは、両方のテストを同じifにローリングすることで対応できます。

第3に、ストリームから読み取られなかった値を使用することは未定義です。使用すべきではありません。それ以上の行を見ずに行を破棄します。 if (ss >> challenge >> judge)がお手伝いします。

+0

あなたのコードはManthan!さらに進めるためのもう一つのステップがあります。私はベクトルで裁判官の後のすべての数字を読む必要があります(それらの数字を比較して最高のものを得るために、5人の裁判官のそれぞれに5つの数字があり、7人の裁判官のたびに、 。 forループ(i = 0; i > vector [i]を実行することは可能ですか?私はどうすればそれを行うことができますか? – user3328381

関連する問題