2

貯水池の充填をシミュレートするプログラムを作成しています。貯水池を満たすのにかかる最大年数、最小年数、および平均年数を取得するという、私が最後にやりたいことを除いて、プロセスはこれまでのところ順調に進んでいます。配列を使わずにそうしたいのです。私は近いと思いますが、単純なものが欠けているに違いありません。すみません、私はちょうど 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;
}
4

2 に答える 2

1

C++ について話しているので、(非常に) 役立つ標準 C++ ライブラリ操作について言及する義務があると感じています。

  • std::minmax_elementコレクションの最小値と最大値を含むペアを返します ( と もstd::min_elementありstd::max_elementます)。
  • std::accumulateは、0 で初期化された場合、コレクションの要素の合計を返します。平均は遠くありません。

もちろん、これはコレクションを 1 つではなく 2 つのパスで処理することを意味するため、同時に 3 つを取得したい場合は最適ではありません。ただし、それでも O(N) 時間と O(1) スペースであり、記述しなければならないコードが大幅に削減されます。

于 2012-10-06T12:19:30.070 に答える
0

に追加する必要がありますyears_total:

years_total += years;

minimumとの設定maximumをループのに移動する必要があります。最小値と最大値の異なる設定を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;
}
于 2012-10-06T05:12:57.070 に答える