2012-10-06 128 views
2

我正在創建一個模擬水庫填充的程序。除了我想要做的最後一件事情之外,這個過程一切正常,這個過程是獲取填滿水庫所需的最大,最小和平均年數。我想這樣做,而不使用數組。我認爲我很接近,但我必須錯過簡單的東西。原諒我,我只是在學習C++。在C++中查找序列的最小值/最大值/平均值

#include <iostream> 
#include <cstdlib> 
#include <cmath> 
#include <string> 
#include <ctime> 

using namespace std; 




int main() 
{ 

    string operation; 
    do{ 
    cout << "Using the letters 's', or 'q', please indicate if you would like to run a simulation, or quit the program: " << endl; 
    cin >> operation; 
    } while (operation != "s" && operation != "q"); 
    string reservoir_name; // Creating variables for reservoir 
    double reservoir_capacity; 
    double outflow; 
    double inflow_min; 
    double inflow_max; 

    if (operation == "q") 
    { 
     cout << endl; 
     cout << "This was a triumph . . ." << endl; 
     cout << "I'm making a note here: huge success!" << endl; 
     system ("pause"); 
     return 0; 
    } 

    while (operation == "s") 
     { 

       string reservoir_name; // Creating variables 
       double reservoir_capacity; 

       double inflow_min = 0; 
       double inflow_max = 0; 
       double inflow_average = inflow_min + inflow_max; 
       double inflow_difference = inflow_max - inflow_min; 
       double inflow_threshold = .9 * inflow_average/2; // Math for acceptable flow threshold. 



       cout << "What is the name of the reservoir?" << endl; 
       cin.ignore(); 
       getline (cin,reservoir_name); // Grab whole string for reservoir name. 
       cout << "What is the capacity of the reservoir in MAF (Millions of Acre Feet)?" << endl; 
       cin >> reservoir_capacity; 
       cout << "What is the minimum inflow?" << endl; 
       cin >> inflow_min; 
       cout << "What is the maximum inflow?" << endl; 
       cin >> inflow_max; 
       cout << "What is the required outflow?" << endl; 
       cin >> outflow; 
       cout << endl; 
       inflow_average = inflow_min + inflow_max; 
       inflow_threshold = .9 * inflow_average/2; // Calculate threshold for too much outflow. 
       cin.ignore(); 

       if (outflow > inflow_threshold) // Check for unacceptable outflow levels. 
       { 
        cout << "Warning! The outflow is over 90% of the average inflow. Simulation aborted. Returning to main menu." << endl << endl; 
       } 
       else 
       { 
        const int number_simulations = 10; 
        cout << endl; 
        cout << "Reservoir name: " << reservoir_name << endl; 
        cout << "Capacity of reservoir in MAF: " << reservoir_capacity << endl; 
        cout << "Maximum inflow in MAF: " << inflow_max << endl; 
        cout << "Minimum inflow in MAF: " << inflow_min << endl; 
        cout << "Required outflow in MAF: " << outflow << endl << endl; 

        cout << "Running simulation . . ." << endl << endl; 
        srand (time(0)); 
        const int sentinel = -1; 
        int minimum = sentinel; 
        int maximum = sentinel; 
        int years_total; 
        for (int i = 1; i <= number_simulations; i++) // Loop should run the filling simulation 10 times. 
        { 

         int years = 0; 
         double fill_level = 0; 
         for (years; fill_level < reservoir_capacity; years++) // Loop should simulate filling reservoir using random inflow values between inflow_min and inflow_max. 
         { 

          double r = rand() * 1.0/RAND_MAX; 
          double x = inflow_min + (inflow_max - inflow_min) * r;// SHOULD be between minimum inflow and maximum inflow. 
          // cout << "Random Number x :" << x << endl; WAS USED TO CHECK IF RANDOM NUMBER WAS CHANGING 
          fill_level = fill_level + x - outflow; 
          if (fill_level < 0) 
          { 
          fill_level = 0; // Prevent fill level from going negative. 
          } 
          //cout << "Fill level is " << fill_level << endl; TO CHECK THE CHANGE IN FILL LEVEL PER ITERATION 
          if (minimum == sentinel || years < minimum) // Trying to set up the method for retrieving minimum value here. Currently returning as 0. 
          { 
           minimum = years; 
          } 
          if (maximum == sentinel || years > maximum) // Trying to set up the method for retrieving maximum value here. Currently returning as 1 less than the actual maximum. 
          { 
           maximum = years; 
          } 
         } // Simulate the change of water level. 

         cout << "Simulation " << i << ": The reservoir took " << years << " years to fill." << endl; 

        } 

         cout << "The minimum number of years needed to fill: " << minimum << endl; 
         cout << "The maximum number of years needed to fill: " << maximum << endl; 
         cout << "The average number of years needed to fill: " << years_total/10 << endl; // Take the running total of years over 10 simulations and divide by 10. Currently returning as 0. 
       } 
        cout << endl; 
        cout << "What would you like to do now?" << endl << endl; // Saving for later. The menu re-prompt message and code. 
        cout << "Using the letters 's', or 'q', please indicate if you would like to run a simulation or quit the program: " << endl; 
        cin >> operation; 
        if (operation == "q") 
        { 
         cout << endl; 
         cout << "This was a triumph . . ." << endl; 
         cout << "I'm making a note here: huge success!" << endl; 
         system ("pause"); 
         return 0; 
        } 
    } 


    system ("pause"); 
    return 0; 
} 
+0

您目前的成果是?你期待什麼?要進行測試,您應該在知道結果而非隨機值的地方使用靜態值。 –

+2

你的問題是什麼?設計算法需要幫助嗎?你想調試幫助嗎?什麼是錯誤?如果逐行執行代碼會發生什麼?你有沒有試過把程序減少到最小的程序,但仍然顯示出問題? –

回答

0

您需要添加到years_total

years_total += years; 

您需要的minimummaximum設置移動到for循環。您可以用sentinel來取消最小和最大的不同設置。請看下圖:

#include <iostream> 
#include <cstdlib> 
#include <cmath> 
#include <string> 
#include <ctime> 

using namespace std; 

int main() 
{ 

    string operation; 
    do{ 
    cout << "Using the letters 's', or 'q', please indicate if you would like to run a simulation, or quit the program: " << endl; 
    cin >> operation; 
    } while (operation != "s" && operation != "q"); 
    string reservoir_name; // Creating variables for reservoir 
    double reservoir_capacity; 
    double outflow; 
    double inflow_min; 
    double inflow_max; 

    if (operation == "q") 
    { 
     cout << endl; 
     cout << "This was a triumph . . ." << endl; 
     cout << "I'm making a note here: huge success!" << endl; 
     system ("pause"); 
     return 0; 
    } 

    while (operation == "s") 
     { 

       string reservoir_name; // Creating variables 
       double reservoir_capacity; 

       double inflow_min = 0; 
       double inflow_max = 0; 
       double inflow_average = inflow_min + inflow_max; 
       double inflow_difference = inflow_max - inflow_min; 
       double inflow_threshold = .9 * inflow_average/2; // Math for acceptable flow threshold. 



       cout << "What is the name of the reservoir?" << endl; 
       cin.ignore(); 
       getline (cin,reservoir_name); // Grab whole string for reservoir name. 
       cout << "What is the capacity of the reservoir in MAF (Millions of Acre Feet)?" << endl; 
       cin >> reservoir_capacity; 
       cout << "What is the minimum inflow?" << endl; 
       cin >> inflow_min; 
       cout << "What is the maximum inflow?" << endl; 
       cin >> inflow_max; 
       cout << "What is the required outflow?" << endl; 
       cin >> outflow; 
       cout << endl; 
       inflow_average = inflow_min + inflow_max; 
       inflow_threshold = .9 * inflow_average/2; // Calculate threshold for too much outflow. 
       cin.ignore(); 

       if (outflow > inflow_threshold) // Check for unacceptable outflow levels. 
       { 
        cout << "Warning! The outflow is over 90% of the average inflow. Simulation aborted. Returning to main menu." << endl << endl; 
       } 
       else 
       { 
        const int number_simulations = 10; 
        cout << endl; 
        cout << "Reservoir name: " << reservoir_name << endl; 
        cout << "Capacity of reservoir in MAF: " << reservoir_capacity << endl; 
        cout << "Maximum inflow in MAF: " << inflow_max << endl; 
        cout << "Minimum inflow in MAF: " << inflow_min << endl; 
        cout << "Required outflow in MAF: " << outflow << endl << endl; 

        cout << "Running simulation . . ." << endl << endl; 
        srand (time(0)); 
        int minimum = reservoir_capacity + 10; 
        int maximum = -1; 
        int years_total; 
        for (int i = 1; i <= number_simulations; i++) // Loop should run the filling simulation 10 times. 
        { 

         int years = 0; 
         double fill_level = 0; 
         for (years; fill_level < reservoir_capacity; years++) // Loop should simulate filling reservoir using random inflow values between inflow_min and inflow_max. 
         { 

          double r = rand() * 1.0/RAND_MAX; 
          double x = inflow_min + (inflow_max - inflow_min) * r;// SHOULD be between minimum inflow and maximum inflow. 
          // cout << "Random Number x :" << x << endl; WAS USED TO CHECK IF RANDOM NUMBER WAS CHANGING 
          fill_level = fill_level + x - outflow; 
          if (fill_level < 0) 
          { 
           fill_level = 0; // Prevent fill level from going negative. 
          } 
          //cout << "Fill level is " << fill_level << endl; TO CHECK THE CHANGE IN FILL LEVEL PER ITERATION 
         } // Simulate the change of water level. 

         if (years < minimum) // Trying to set up the method for retrieving minimum value here. Currently returning as 0. 
         { 
          minimum = years; 
         } 
         if (years > maximum) // Trying to set up the method for retrieving maximum value here. Currently returning as 1 less than the actual maximum. 
         { 
          maximum = years; 
         } 
         years_total += years; 
         cout << "Simulation " << i << ": The reservoir took " << years << " years to fill." << endl; 

        } 

         cout << "The minimum number of years needed to fill: " << minimum << endl; 
         cout << "The maximum number of years needed to fill: " << maximum << endl; 
         cout << "The average number of years needed to fill: " << years_total/10 << endl; // Take the running total of years over 10 simulations and divide by 10. Currently returning as 0. 
       } 
        cout << endl; 
        cout << "What would you like to do now?" << endl << endl; // Saving for later. The menu re-prompt message and code. 
        cout << "Using the letters 's', or 'q', please indicate if you would like to run a simulation or quit the program: " << endl; 
        cin >> operation; 
        if (operation == "q") 
        { 
         cout << endl; 
         cout << "This was a triumph . . ." << endl; 
         cout << "I'm making a note here: huge success!" << endl; 
         system ("pause"); 
         return 0; 
        } 
    } 


    system ("pause"); 
    return 0; 
} 
1

既然我們都在談論C++,我覺得有必要提標準C++庫操作,可以(大大)幫助:

  • std::minmax_element返回包含的最小和最大的一對一個集合(也有std::min_elementstd::max_element可用)。
  • std::accumulate,當用0初始化時,返回集合元素的總和;平均不遠。

當然,如果你想擁有3個在同一時間,因爲它意味着在集合,而不是一個兩遍,這是稍微欠佳。但是它仍然是O(N)時間和O(1)空間,並且會帶來代碼必須明顯寫入。

相關問題