用函数指针填充结构数组

问题描述 投票:2回答:1

我已经设置了一个struct数组并将其传递给一个函数。我试图用输入填充结构数组。我最初将输入设置为:

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;
    }
}
c++ function pointers struct
1个回答
1
投票

首先,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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.