c++ - 错误:“切换”之前的预期不合格 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;
}
解决方案
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) )
推荐阅读
- node.js - 如何在微服务中使用rabbitmq
- bash - 致命错误:pathspec '*?' 尝试从脚本运行 git add * 时不匹配任何文件
- sql - 在 SQL Server 中的操作中使用最后一个值
- android - 如何检测应用程序是否正在通过自动化测试工具运行?
- unit-testing - Visual Studio 2019 在测试资源管理器中显示重复测试
- javascript - 访问 JSON 数组中的对象以生成模式窗口的内容
- flutter - 如何使用 onPressed 从自定义 AppBar 调用页面?
- javascript - 是否有可能知道 Hotjar 现在已在 JavaScript 中加载?
- c# - 如何在事务中锁定表 - 实体框架核心 [找不到 DbContextTransaction]
- asp.net - 外键、预加载和 DTO(.NET Core 3.1 / Entity Framework Core)