2017-12-05 2 views
0

Ich bin ziemlich mit diesem Programm außer diesem kleinen Problem fertig.Szenario-Ausgabe gibt falsche Antwort auf zweite Schleife

Das Problem ist, wenn das erste Mal, dass ich das Programm mit dem folgenden in Durchlauf von 20.0 36.0 72.0 2.0 10.0 18.0 10.0 durchlaufen meine Ausgabe kommt heraus, 232.59 sec zu sein, die korrekt ist.

Zum zweiten Mal, wenn ich Schleife um, I-Eingang 25.0 72.0 200.0 1.5 8.0 30.0 20.0 meine Ausgabe kommt zu sein, die falsch ist, wenn es 1141.63

jetzt sein sollte, wenn ich die Eingänge umkehren und nehmen, was ich für die zweite Schleife eingegeben für die erste Schleife und zuerst für die zweite Schleife. Ich bekomme meine Ausgabe von 1141.63 für die erste Schleife, aber die zweite Schleife, meine Antwort ist 1141.63. Ich bin sehr verwirrt darüber, wie dies geschieht. Eine meiner frühen Lösungen war, alle Variablen nach jeder Schleife mit einer anderen Funktion auf 0 zurückzusetzen, aber das schien nicht zu funktionieren und jetzt bin ich hier.

EDIT: Problem erkannt. Musste die Zeit zurücksetzen und volFilled am Ende jeder Schleife auf 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

Sind Sie sicher, dass Ihre Funktion alle Mitgliedsvariablen zurücksetzt zu ihren anfänglichen Werten? Ich habe das gerade getestet, indem ich alle Variablen nach jeder Iteration durch die Schleife zurückgesetzt habe und die erwarteten Ergebnisse erhalten habe. – Kevin

+0

Sie müssen lernen, Ihren Debugger zu verwenden, Schritt durch den Code und sehen, was es tut. – SoronelHaetir

+0

@Kevin Ich werde es noch einmal versuchen. – 73memedream

Antwort

1

Während dies nicht vollständig das Problem beheben kann, müssen Sie zumindest Ihren volFilled Wert wieder auf 0,0 zwischen den Szenarien neu zu initialisieren. Sonst geht es nur weiter vom vorherigen Szenario volFilled, und das erklärt, warum der zweite Test, den Sie mit dem Wechsel der Szenarien durchgeführt haben, die gleiche Ausgabe lieferte. Nach dem ersten Szenario, in dem volFilled 20.0 erreicht, führt es im zweiten Szenario nicht die Logik in der Abfrage while (volFilled < V) aus, weil zu diesem Zeitpunkt volFilled = 20 und V = 10 ist.

+0

OH! Jesus, ich bin blind. Das machte die zweite Ausgabe besser abgerundet. In der Tat bin ich über die erwartete Zeit nur um ein paar Dutzend Sekunden, aber es ist besser als vorher. Vielen Dank! :) – 73memedream

Verwandte Themen