0

私は本当に混乱しています。クラス用にこのラボを作成する必要がありますが、検索結果が 1 つしか表示されず、1 年のすべての月が表示されないようです。また、月に 0 を入力したときに TotalRainfall が表示されない理由もわかりません。ありがとうございました。

#include <iostream>
#include <fstream>

const int MaxSize = 12; //How many weather lines will be available.

using namespace std;

struct WeatherInformation
{
    int Month;                            //Months of the year
    float TotalMonthsRainfall;            //Total amount of rainfall
    float HighTemp;                       //The Highest temperature of the month.
    float LowTemp;                        //The Lowest temperature of the month.
    float AverageTemp;                    //The Average temperature of the month.
};

WeatherInformation WeatherArray[MaxSize]; //Declaring a month array of MaxSize

void ReadFile(ifstream& MyinFile, WeatherInformation WeatherArray[]);
void WeatherMonthSearch (WeatherInformation WeatherArray[]);


int main()
{
    float TotalRainfall = 0;
    int count = 1;          //Counts how many times the for loop goes.
    int MonthOfWeather;     //User input of the month.
    char ProgramRedo;       //User input if they want to reuse the program.
    char exit_char;         //User input to exit the program.
    ifstream MyinFile;      //Variable that uses file.

    ReadFile (MyinFile, WeatherArray);       //Call ReadFile Function
    WeatherMonthSearch (WeatherArray);       //Call WeatherMonthSearch Function

    MyinFile.close(); //Closes file.
}
//Brett Holmes
//4/30/2013
//PreCondition:You need a file labeled weather.dat
//PostCondition: It puts the file variables into an array.
void ReadFile(ifstream& MyinFile, WeatherInformation WeatherArray[])
{
    float TotalRainfall = 0;
    char exit_char;
    int count = 0;
    int Month = 0;

    cout << "Your Weather Machine" << endl << endl;
    MyinFile.open("weather.dat");
    if (!MyinFile)
    {    //no
        cout << "Can't open input file." << endl; //Tests the right file.
        char exit_char;                         //End Program
        cout << "Press any key to exit" << endl;
        cin >> exit_char;
    }
    for(count = 1; count < MaxSize; count++) //Puts the file variables in the array.
    {
        WeatherArray[count].Month = WeatherArray[count].Month + 1;
        MyinFile >> WeatherArray[count].TotalMonthsRainfall;
        MyinFile >> WeatherArray[count].HighTemp;
        MyinFile >> WeatherArray[count].LowTemp;
        (WeatherArray[count].AverageTemp = ((WeatherArray[count].HighTemp + WeatherArray[count].LowTemp)/2));
        (TotalRainfall = TotalRainfall + WeatherArray[count].TotalMonthsRainfall);
    }
}

//Brett Holmes
//4/30/13
//PreCondition:You need to have the months already put into an array in a struct.
//PostCondition:Outputs the rainfall stats the user puts in then asks to run again.
//Outputs a error message if they type in the month wrong.
void WeatherMonthSearch (WeatherInformation WeatherArray[])
{
    float TotalRainfall;
    int months;
    int MonthOfWeather;
    char ProgramRedo;
    do
    {
        bool MonthFound = false;

        cout << "Please input the number of the Month. Ex. 1=Jan. 2=Feb. etc \n\n";
        cin >> MonthOfWeather;

        for(int i = 1; i <= MaxSize; i++)
        {
            months = WeatherArray[i].Month;
            if(months == MonthOfWeather ) //Finds the artist and outputs the results
            {
                cout << "\nTotal Months Rainfall: " << WeatherArray[i].TotalMonthsRainfall << "   \n";
                cout << "Highest Temperature: " << WeatherArray[i].HighTemp << "   \n";
                cout << "Lowest Temperature: " << WeatherArray[i].LowTemp << "   \n";
                cout << "Average Temperature: " << WeatherArray[i].AverageTemp << "   \n";
                MonthOfWeather = true;
            }
        }
        if(MonthOfWeather == 0)
        {
            cout << "The total rainfall for the year is: " << TotalRainfall << ".";
        }
        if(MonthFound == false)
        {
            cout << "\nMonth Number error. Month not found. Try again.\n\n";
            MonthOfWeather = false;
        }
        cout << "Would you like to look up another month of weather?\n";
        cout << "Enter a 'Y' if yes and 'N' if no.\n";
        cin >> ProgramRedo;
    }while(ProgramRedo == 'Y');
}
4

2 に答える 2

1

いくつかの明らかな問題:

  1. C++ の配列は 0 ベースであるため、for ループは 1 ずつずれています。検索機能では、 でfor(int i = 1; i <= MaxSize; i++)ある必要がありますfor(int i = 0; i < MaxSize; i++)。同様に、読み取り関数では、次のようにfor(count = 1; count < MaxSize; count++)する必要がありますfor(count = 0; count < MaxSize; count++)(インデックス 0 をシグナル値として使用しているためにスキップする場合は、MaxSize13 に設定し、ループを 1 から開始する必要があります)。

  2. にブール値を割り当てるのはなぜMonthOfWeatherですか? ということMonthFoundですか?

  3. 関数が月を正しく設定していないことをお読みください。1 ベースのループを使用している場合、またはWeatherArray[count].Month = WeatherArray[count].Month + 1;ループが 0 ベースの場合は、次のようになります。WeatherArray[count].Month = count;WeatherArray[count].Month = count + 1;

  4. 読み取り関数で総降水量を計算しましたが、結果はローカル変数に格納されるため、読み取りが完了すると失われます。TotalRainfall をグローバル変数にするか、検索関数で計算を行います。

  5. 冗長な変数定義がたくさんあります。たとえば、天気データ配列はグローバルなので、実際に渡す必要はありません。exit_charread 関数で 2 回宣言されています。main()使用したことのない宣言済み変数の最初の 5 行。

また、読み取り関数は、実際には失敗時にプログラムを終了しません。ストリームから読み取りを試みてから、検索関数を呼び出そうとします! エラーチェックが必要な場合は、検索関数を呼び出す前に読み取り関数にブール値を返させ、読み取り関数が成功したことを確認するか、std::exitその後に単に を呼び出す必要がありcin >> exit_char;ます。

于 2013-09-10T00:20:27.303 に答える
0

したがって、問題の 1 つは、複数の場所に表示されるローカル変数があるにもかかわらず、実際には同じ情報が含まれていると思われることです。

たとえば、3 つの異なるTotalRainFall. の 1 つmainはただそこにあり、何にも使用されず、1ReadFileは計算され、もう 1 つはWeatherMonthSearchにあり、何も設定されていません。

これら3つすべてに実際に何かをさせたいと思っていると思います。ReadFileこれを実現する 1 つの方法は、とのローカルのものを削除しWeatherMonthSearch、代わりに からのものをmain(への参照としてReadFile) 渡すことです。

変数を初期化せずに使用する場所もいくつかあります。EVERYTHING EVERYWHERE を初期化する習慣をつけてください!

コンパイラで警告を有効にします。何らかの形式または合理的に新しいコンパイラ (最近のヴィンテージの gcc または MS Visual Studio) を使用している場合は、これらのことの少なくともいくつかを通知する必要があります。

于 2013-09-10T00:08:47.247 に答える