首页 > 解决方案 > 错误:“切换”之前的预期不合格 ID

问题描述

我正在编写一个代码,用户可以在其中输入日期、月份、年份,并且程序可以识别它是否是闰年,但我遇到了错误说“在'切换'之前预期不合格的 ID”。我的代码发生了什么?我无法弄清楚这个问题。这是我遇到“开关(月)”问题的行。有人能帮助我吗。

#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
// declaring
int Day = 0;
int Month = 0;
int Year = 0;
bool leapYear (int);
int main(int argc, char *argv[])
{
    // outputting messages to the user
    cout << "Lets check your dates shall we?" << endl;
    cout << "Please enter in a two(2) digit number for the month." << endl;
    cin >> Month;
    cout << "Please enter in a two(2) digit number for the day." << endl;
    cin >> Day;
    cout << "Please enter in a four(4) digit number for the year." << endl;
    cin >> Year;

    system("PAUSE");
    return EXIT_SUCCESS;
}
switch(Month)
{
       case 1:
            if (Day == 1 ... 31)
               cout << "January" << Day << "th," << Year << "," << endl;
            break;
       case 2:
            if (Day == 1 ... 28)
               cout << "February" << Day << "th," << Year << "," << endl;
            else if (Day == 29)
               leapYear(Day);  
            break;
       case 3:
            if (Day == 1 ... 31)
               cout << "March" << Day << "th," << Year << "," << endl;
            break;
       case 4:
            if (Day == 1 ... 30)
               cout << "April" << Day << "th," << Year << "," << endl;
            break;
       case 5:
            if (Day == 1 ... 31)
               cout << "May" << Day << "th," << Year << "," << endl;
            break;
       case 6:
            if (Day == 1 ... 30)
               cout << "June" << Day << "th," << Year << "," << endl;
            break;
       case 7:
            if (Day == 1 ... 31)
               cout << "July" << Day << "th," << Year << "," << endl;
            break;
       case 8:
            if (Day == 1 ... 31)
               cout << "August" << Day << "th," << Year << "," << endl;
            break;
       case 9:
            if (Day == 1 ... 30)
               cout << "September" << Day << "th," << Year << "," << endl;
            break;
       case 10:
            if (Day == 1 ... 31)
               cout << "October" << Day << "th," << Year << "," << endl;
            break;
       case 11:
            if (Day == 1 ... 30)
               cout << "November" << Day << "th," << Year << "," << endl;
            break;
       case 12:
            if (Day == 1 ... 31)
               cout << "December" << Day << "th," << Year << "," << endl;
            break;
}

标签: c++switch-statement

解决方案


switch语句不能在全局范围内。你需要把它放在一个函数中,比如main()函数。之后cin >> Year;似乎是它的正确位置。

此外,您所做的范围比较不是有效的 C++:

       case 1:
            if (Day == 1 ... 31)   // ERROR
               cout << "January" << Day << "th," << Year << "," << endl;
            break;

<algorithm>您可以通过包含然后使用来做类似的事情std::clamp

       case 1:
            if ( &Day == &std::clamp(Day, 1, 31) )
               cout << "January" << Day << "th," << Year << "," << endl;
            break;

std::clamp将在这里返回一个引用,说明Day它是否在范围内,通过将返回的地址与Day您的地址进行比较,可以检查它是否在范围内。

演示- 请注意,您还错过了bool leapYear (int);. 我制作了一个只返回的函数,false因此您需要为其添加自己的实现。

实现该leapYear(int);功能后,请考虑更改case二月份的:

        case 2:
                if ( &Day == &std::clamp(Day, 1, 28 + leapYear(Year)) )
                cout << "February" << Day << "th," << Year << "," << endl;
                break;

如果std::clamp由于某种原因不可用,您可以轻松创建范围检查功能:

bool in_range(int value, int low, int high) {
    return low <= value && value <= high;
}

这将稍微改变用法:

       case 1:
            if ( in_range(Day, 1, 31) )

推荐阅读