Заполнение массива структур указателем из функции - PullRequest
2 голосов
/ 06 апреля 2019

Я установил массив массива и передал его функции. Я пытаюсь заполнить этот структурный массив с вводом. Я изначально настроил входы как:

w->rainFall

, но не смог понять, как он будет заполнять других подписчиков.

Я изменил его на:

w[counter].rainFall

думая, что это будет правильно циклически проходить по всем массивам, но выходные данные не дают ожидаемых результатов.

Может ли кто-нибудь помочь мне понять, как правильно заполнить эту структуру из функции?

Полный код здесь

#include "pch.h"
#include <iostream>

using namespace std;

struct Weather
{
    int rainFall;
    int highTemp;
    int lowTemp;
    double averageTemp;
};

enum Months
{
    January, February, March, April, May, June, July, August, September, October, November, December
};

void showData(struct Weather* w, int);
void getData(struct Weather* w, int);
void displayMonthName(Months);

int main()
{
    const int SIZE = December+1;

    struct Weather w[SIZE];
    Months thisMonth;

    cout << "Enter The Following Information: " << endl;

    for (thisMonth = January; thisMonth <= December; thisMonth = static_cast<Months>(thisMonth +1))
    {
        int counter = 0;
        displayMonthName(thisMonth);
        cout << " | Month "<< thisMonth+1 << " " << endl;

        getData(w, counter);
        counter++;

    }

    showData(w, SIZE);

}

void showData(struct Weather* w, int SIZE)
{
    for (int i = 0; i <= SIZE; i++)
    {
        cout << w[i].rainFall << endl;
        cout << w[i].highTemp << endl;
        cout << w[i].lowTemp << endl << endl;
    }
}

void getData(struct Weather* w, int counter)
{

    cout << "          Total Rainfall: ";
    cin >> w[counter].rainFall;
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');

    while (!cin || w->rainFall < 0)
    {
        cout << "Rainfall cannot be less than 0 inches" << endl;
        cout << "          Total Rainfall: ";
        cin >> w[counter].rainFall;
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }

    cout << "          High Temperature: ";
    cin >> w[counter].highTemp;
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');

    while (!cin || w->highTemp <-100 || w->highTemp >140)
    {
        cout << "High Temperature must be between -100 & +140" << endl;
        cout << "          High Temperature: ";
        cin >> w[counter].highTemp;
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }

    cout << "          Low Temperature :";
    cin >> w[counter].lowTemp;
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');

    while (!cin || w->lowTemp > w->highTemp || w->lowTemp < -100 || w->lowTemp >140)
    {
        cout << "Low Temperature  must be between -100 & +140 while also being lower than the High Temperature" << endl;
        cout << endl << "          Low Temperature :";
        cin >> w[counter].lowTemp;
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
}

void displayMonthName(Months m)
{
    switch (m)
    {
    case January:
        cout << "January";
        break;

    case February:
        cout << "February";
        break;

    case March:
        cout << "March";
        break;

    case April:
        cout << "April";
        break;

    case May:
        cout << "May";
        break;

    case June:
        cout << "June";
        break;

    case July:
        cout << "July";
        break;

    case August:
        cout << "August";
        break;

    case September:
        cout << "September";
        break;

    case October:
        cout << "October";
        break;

    case November:
        cout << "November";
        break;

    case December:
        cout << "December";
        break;
    }
}

1 Ответ

1 голос
/ 06 апреля 2019

Перво-наперво, int counter должен находиться вне цикла for, иначе вы переинициализируете его в 0 и каждый раз передаете 0 в функцию getData.

int counter = 0; // Should be here.

for (thisMonth = January; thisMonth <= December; thisMonth = static_cast<Months>(thisMonth +1))
    {
        //Not here
        displayMonthName(thisMonth);
        cout << " | Month "<< thisMonth+1 << " " << endl;

        getData(w, counter);
        counter++;

    }

Далее, вы перебираете массив 1 слишком много раз. Измените <= на <.

void showData(struct Weather* w, int SIZE)
{
    for (int i = 0; i < SIZE; i++)
    {
        cout << w[i].rainFall << endl;
        cout << w[i].highTemp << endl;
        cout << w[i].lowTemp << endl << endl;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...