2017-12-05 6 views
0

이 작은 문제를 제외하고는이 프로그램을 통해 거의 완료되었습니다.시나리오 출력이 두 번째 루프에서 잘못된 대답을 나타냅니다.

문제는 처음에 다음을 입력하여 프로그램을 반복 할 때 20.0 36.0 72.0 2.0 10.0 18.0 10.0 출력이 232.59 sec 인 것으로 나타납니다. I 루프 주위에 두 번째

, 내가 입력 25.0 72.0 200.0 1.5 8.0 30.0 20.0 내 출력은 내가 입력을 반대로하면 지금 1141.63

하고 난에 대한 두 번째 루프 입력 한해야 할 때 잘못 800.41을 나옵니다 첫 번째 루프와 첫 번째 루프에 대한 첫 번째 루프. 첫 번째 루프에 대한 내 출력은 1141.63이지만 두 번째 루프는 내 대답은 1141.63입니다. 나는이 일이 어떻게 일어나고 있는지에 대해 매우 당혹 스럽다. 내 초기 솔루션 중 하나는 각 루프가 다른 함수를 사용하여 모든 변수를 다시 0으로 재설정하는 것이었지만 작동하지 않는 것 같았고 지금은 여기 있습니다.

편집 : 문제는 알아 냈습니다. 각 루프의 끝에서 시간을 재설정하고 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에서 계속 진행하고 있으며 시나리오를 전환하면서 수행 한 두 번째 테스트에서 왜 동일한 출력을 얻었는지 설명합니다. volFilled가 20.0에 도달 한 첫 번째 시나리오가 끝나면 두 번째 시나리오에서 논리가 실행되지 않습니다.이 시점에서 volFilled = 20이므로 V = 10입니다.

+0

OH! 예수님 저는 장님입니다. 이로써 두 번째 산출물이 더 잘 둥글게되었습니다. 사실 예상 시간이 끝나고 수십 초 가량 걸리지 만 이전보다 훨씬 좋습니다. 고맙습니다! :) – 73memedream