2017-12-05 9 views
0

この小さな問題を除いて、私はこのプログラムをほとんど完了しました。シナリオの出力が2番目のループで間違った答えを返します

問題は私が20.0 36.0 72.0 2.0 10.0 18.0 10.0のputで次のプログラムをループするときです。私の出力は232.59 secになります。これは正しいです。 Iループの周りに二度目の

、私は入力 25.0 72.0 200.0 1.5 8.0 30.0 20.0私の出力は、それは私が入力を逆ならば今 1141.63

なると私はのための第二のループに入力されたものを取るべき時に間違っているであることが出てきます最初のループ、最初は2番目のループです。最初のループでは1141.63の出力が得られますが、2番目のループでは、私の答えは1141.63です。私はこのことがどのように起こっているのか非常に困惑しています。私の初期の解決策の1つは、別の関数を使用して各ループの後にすべての変数を0に戻すことでしたが、それはうまくいかないように見えました。

EDIT:問題を把握しました。各ループの終わりに時間をリセットし、volFilledを0にしなければならなかった。

void Well::timeReq() 
{ 
    bool exit = false; 

    while (!exit) 
    { 

     std::cout << "Enter 7 digits to evaluate or type 0 now to exit." << std::endl; 

     std::cin >> UP; 

     if (UP == 0) 
     { 
      exit = true; 
      break; 
     } 

     std::cin >> D >> L >> B >> P >> DOWN >> V; 

     double WL = L; 

     double radius = (D/2); 

     while (volFilled < V) 
     { 

      time += UP; 


      time += sqrt(2 * (L)/(acceleration * 12.0)); 


      time += (L)/(P); 


      L += (B * cuIns)/(pi*pow(radius, 2)); 


      time += DOWN; 
      volFilled += B; 
     } 

     std::cout << std::endl; 
     std::cout << "Scenario " << scenario << ":" << std::endl; 

     std::cout << std::left << std::setw(25) << "\tUp Hill"   << std::left << std::setw(30) << std::fixed << std::setprecision(2) 
        << UP << " sec" << std::endl; 

     std::cout << std::left << std::setw(25) << "\tWell Diamter"  << std::left << std::setw(30) << std::fixed << std::setprecision(2) 
        << D << " in" << std::endl; 

     std::cout << std::left << std::setw(25) << "\tWater Level"  << std::left << std::setw(30) << std::fixed << std::setprecision(2) 
        << WL << " in" << std::endl; 

     std::cout << std::left << std::setw(25) << "\tBucket Volume"  << std::left << std::setw(30) << std::fixed << std::setprecision(2) 
        << B << " cu ft" << std::endl; 

     std::cout << std::left << std::setw(25) << "\tBucket Ascent Rate" << std::left << std::setw(30) << std::fixed << std::setprecision(2) 
        << P << " in/sec" << std::endl; 

     std::cout << std::left << std::setw(25) << "\tDownhill"   << std::left << std::setw(30) << std::fixed << std::setprecision(2) 
        << DOWN << " sec" << std::endl; 

     std::cout << std::left << std::setw(25) << "\tRequired Volume" << std::left << std::setw(30) << std::fixed << std::setprecision(2) 
        << V << " cu ft" << std::endl; 

     std::cout << std::left << std::setw(25) << "\tTIME REQUIRED"  << std::left << std::setw(30) << std::fixed << std::setprecision(2) 
        << time << " sec" << std::endl; 

     scenario++; 
    } 
} 
+0

すべてのメンバー変数を元に戻しますか?彼らの初期値に?私はちょうどこれをテストし、各繰り返しの後にすべての変数をループを介してリセットして、期待される結果を得ました。 – Kevin

+0

デバッガの使い方を学び、コードをステップ実行して、それが何をしているのかを確認する必要があります。 – SoronelHaetir

+0

@ケビン私はもう一度やり直します。 – 73memedream

答えて

1

これで問題が完全に解決されるわけではありませんが、シナリオ間で少なくともvolFilled値を0.0に再初期化する必要があります。それ以外の場合は、前のシナリオのvolFilledから続行しているので、シナリオを切り替えて2回目のテストで同じ出力が得られた理由を説明します。 volFilledが20.0に達した最初のシナリオの後では、2番目のシナリオではwhile (volFilled < V)のロジックを実行しません。この時点でvolFilled = 20、V = 10の間です。

+0

OH!イエス私は盲目です。これにより、2番目の出力がより円滑になりました。実際、私は予想される時間を数十秒も超えていますが、以前よりも優れています。ありがとうございました! :) – 73memedream

関連する問題