使用枚举和结构?

时间:2018-02-12 04:50:44

标签: c++ struct enums typedef

我有一个关于在我的作业中使用enumstruct的问题,我在理解时遇到了一些麻烦。

首先,这是我们老师给我们的代码示例。

enum MonthType {JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC};
struct WeatherType
{    
    int avgHiTemp;
    int avgLoTemp;
    float actualRain;
    float recordRain;
};

然后,家庭作业要声明WeatherListType组件的一维数组类型WeatherType,以便通过类型MonthType的值进行索引。当我尝试通过编码来做到这一点时:

typedef WeatherType WeatherListType[MonthType];

我收到了这些错误:

problem5.cpp:19:47: error: expected primary-expression before ']' token 
typedef WeatherType WeatherListType[MonthType];
                                           ^
problem5.cpp:21:2: error: 'WeatherListType' was not declared in this scope
WeatherListType yearlyWeather;

我对这个问题的含义感到困惑,如果我走在正确的轨道上,我究竟做错了什么?

2 个答案:

答案 0 :(得分:2)

问题在于

typedef WeatherType WeatherListType[MonthType];

括号[]之间的东西必须是数字(它是元素的数量),但MonthType不是数字,它是一种类型。

这里有两个主要选项:

  1. 只需使用12。

  2. 添加另一个枚举项:enum MonthType {..., NOV, DEC, NUM_MONTHS};

    然后使用NUM_MONTHS。

    这是枚举的一个常见技巧 - 因为它们从0开始向上计数,NUM_MONTHS将是第13个值,因此它获得值12。

    您执行此操作的原因是,如果您添加其他值,编译器将自动为您调整NUM_MONTHS。我不认为我们很快就会有新的月份,所以在这种情况下并不重要。

  3. (旁注:数组总是用C中的整数索引。你不能用枚举索引一个。但枚举可以转换为整数然后回来,所以这不是问题)

答案 1 :(得分:0)

在这里,我已经给出了完成程序以供您澄清,因为我没有提到我在输出中给出的输入值,因为每月12个月,4个数据总共需要给出48个数据。假设给出了值。但是当你运行时你必须给出所有48个值。你在哪里使用它它是conatant 0,在FEB它是常数1,依此类推DEC它是常数11.hope你明白这个对你有用

#include<iostream>
using namespace std;
enum MonthType {JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC};
struct WeatherType
 {    
    int avgHiTemp;
    int avgLoTemp;
    float actualRain;
    float recordRain;
 };
int main()
 {
     WeatherType WeatherListType[12];
     for (int i=JAN;i<=DEC;i++)
       { 
          cout<<"\n High temperature :";
          cin>>WeatherListType[i].avgHiTemp;
          cout<<"\n Low temperature :";
          cin>>WeatherListType[i].avgLoTemp;
          cout<<"\n Actual Rain :";
          cin>>WeatherListType[i].actualRain;
          cout<<"\n Record Rain :";
          cin>>WeatherListType[i].recordRain;
      }
     cout<<"\n Month \t HiTemp\t LoTemp\t ActualRain\t RecordRain\n";

    for (int i=JAN;i<=DEC;i++)
      {
        cout<<i<<"\t"<<WeatherListType[i].avgHiTemp;
        cout<<"\t"<<WeatherListType[i].avgLoTemp;
        cout<<"\t"<<WeatherListType[i].actualRain;
        cout<<"\t"<<WeatherListType[i].recordRain<<"\n";
   }
}

  OUTPUT

  High temperature :40 

  Low temperature :28                                                                                                          

  Actual Rain :34                                                                                                              

  Record Rain :56 
  .
  .
  .
 Month HiTemp  LoTemp  ActualRain  RecordRain                                                                                   
 0       40      28      34          56                                                                                            
 1       45      32      45          67             
 2       34      23      56          76                                                                                            
 3       34      32      45          43                                                                                            
 4       67      12      45          43                                                                                            
 5       78      65      45          32                                                                                            
 6       56      54      34          23                                                                                            
 7       45      34      23          23                                                                                            
 8       3       1       45          43                                                                                            
 9       34      45      23          23                                                                                            
 10      12      3       34          43                                                                                            
  11      56      54      43         34