提问人:KotaZachary 提问时间:11/17/2023 最后编辑:tbxfreewareKotaZachary 更新时间:11/20/2023 访问量:85
C++ 中的 12 小时和 24 小时制,当我运行程序并输入我的决定时,它只是重复菜单,有什么建议吗?[关闭]
12- and 24- hour clock in C++ and when i run my program and input my decision it just repeats the menu any suggestions? [closed]
问:
这是我的 12 小时制和 24 小时制代码。这些时钟不必是实时的,也不必滴答作响,我需要它们来打印随机时间,并能够与可能想要增加一小时、一分钟或一秒的用户进行交互。 选项 1 应显示 12 小时制 选项 2 应显示 24 小时格式 选项 3 应该允许用户添加一个小时 选项 4 应允许用户添加一分钟 选项 5 应该让使用添加第二个
#include <iostream>
#include <string>
using namespace std;
// Functions to convert a number to a two-digit string
string twoDigitString(unsigned int n) {
if (n < 10) {
return "0" + to_string(n);
}
else {
return to_string(n);
}
}
string nCharString(size_t n, char c) {
if (n >= 0) {
string result;
for (size_t i = 0; i < n; ++i) {
result += c;
}
return result;
}
else {
return "";
}
}
// Function to display time in a 12 hour format
string formatTime12(unsigned int h, unsigned int m, unsigned int s) {
string period = "AM"; // default period
if (h == 0) {
h = 12;
}
else if (h >= 12) {
period = "PM";
if (h > 12) {
h -= 12;
}
}
string formattedTime = twoDigitString(h) + ":" + twoDigitString(m) + ":" + twoDigitString(s) + " " + period;
return formattedTime;
}
// Function to display time in a 24 hour format
string formatTime24(unsigned int h, unsigned int m, unsigned int s){
string period = "AM";
if (h == 0) {
h = 24;
}
else if (h >= 12) {
period = "PM";
}
string formattedTime = twoDigitString(h) + ":" + twoDigitString(m) + ":" + twoDigitString(s) + " " + period;
return formattedTime;
}
int main() {
unsigned int hours = 12;
unsigned int minutes = 0;
unsigned int seconds = 0;
int choice;
do {
//display menu for time format
cout << "1. 12- hour format" << endl;
cout << "2. 24- hour format" << endl;
cout << "3. Add Hour" << endl;
cout << "4. Add Minute" << endl;
cout << "5. Add second" << endl;
cout << "6. Exit" << endl;
cin >> choice;
switch (choice) {
case 1:
cout << "12- hour format" << formatTime12(hours, minutes, seconds) << endl;
break;
case 2:
cout << "24- hour format" << formatTime24(hours, minutes, seconds) << endl;
break;
case 3:
hours = (hours + 1) % 24;
break;
case 4:
minutes = (minutes + 1) % 60;
break;
case 5:
seconds = (seconds + 1) % 60;
break;
case 6:
cout << "Exiting" << endl;
break;
default:
cout << "Invaild input, please try again." << endl;
}
} while (choice != 0);
return 0;
}
起初,我没有使用 while 循环,当我运行代码时,它会提示菜单,但当我做出选择时,它想退出。然后我添加了 while 循环,现在当我做出决定时,它只是重复菜单,如下所示。当我选择选项 6 退出时,菜单不会退出。
1. 12- hour format
2. 24- hour format
3. Add Hour
4. Add Minute
5. Add second
6. Exit
1
12- hour format12:00:00 PM
1. 12- hour format
2. 24- hour format
3. Add Hour
4. Add Minute
5. Add second
6. Exit
3
1. 12- hour format
2. 24- hour format
3. Add Hour
4. Add Minute
5. Add second
6. Exit
2
24- hour format13:00:00 PM
1. 12- hour format
2. 24- hour format
3. Add Hour
4. Add Minute
5. Add second
6. Exit
6
Exiting
1. 12- hour format
2. 24- hour format
3. Add Hour
4. Add Minute
5. Add second
6. Exit
答:
将语句中的表达式更改为:while
while ((choice >= 1) && (choice <= 5));
您可能需要在终止菜单后暂停执行:
std::cout << "Paused. Press ENTER to continue.\n";
std::cin.ignore(100000, '\n');
评论
问题是choice != 0
当用户选择“退出”选项(选项 6)时,菜单不会退出。
我添加了 while 循环,现在当我决定 [退出] 时,它只是重复菜单,如下所示。
这是你写的 while 循环。
do {
// ...
} while (choice != 0);
退出的唯一方法是 for to be ,但这并不好,因为你想在 is 时退出。choice
0
choice
6
因此,将测试更改为 !就这样。6
do {
// ...
} while (choice != 6);
现在,当您输入 6 时,程序会正确退出,但是当您进行无效选择(例如 choice )时,它会继续循环。0
1. 12- hour format
2. 24- hour format
3. Add Hour
4. Add Minute
5. Add second
6. Exit
0
Invaild input, please try again.
1. 12- hour format
2. 24- hour format
3. Add Hour
4. Add Minute
5. Add second
6. Exit
6
Exiting
接近,但没有雪茄
您也可以尝试
do {
// ...
} while ((choice >= 1) && (choice <= 5));
然而,这并不那么好。当用户选择 6 时,它会正确退出,但每当用户做出无效选择时,它也会退出。因此,、、等也被视为“退出”的意思。0
7
在这次运行中,我选择了 ,然后程序退出了。菜单未重新显示。0
1. 12- hour format
2. 24- hour format
3. Add Hour
4. Add Minute
5. Add second
6. Exit
0
Invaild input, please try again.
24 小时格式的几个错误
可以肯定的是,一个错误是以 24 小时格式添加“AM”或“PM”。所以,把它从功能中剥离出来。formatTime24
另一个更微妙,与使用“24:00:00”表示午夜有关。这可能是一个错误,但也许不是。
这是维基百科对 24 小时格式的部分描述。
一天中的时间以 24 小时制表示法以 hh:mm(例如 01:23)或 hh:mm:ss 的形式书写,其中 hh(00 到 23)是自午夜以来经过的整小时数,mm(00 到 59)是自上一整小时以来经过的整分钟数, ss(00 到 59)是自上一整分钟以来的秒数。
根据维基百科,24:00:00 可以用来表示午夜,但它与 00:00:00 的含义不同。
在 24 小时制时间表示法中,一天从午夜 00:00 或 0:00 开始,一天的最后一分钟从 23:59 开始。在方便的情况下,符号 24:00 也可用于指代给定日期结束时的午夜[3]——也就是说,一天的 24:00 与第二天的 00:00 相同。
总而言之,最好使用“00:00:00”表示午夜。如果你这样做了,那么简化到这一点。formatTime24
string formatTime24(unsigned int h, unsigned int m, unsigned int s) {
return twoDigitString(h) + ":" + twoDigitString(m) + ":" + twoDigitString(s);
}
捕获非数字输入
我通常使用函数get_int
之类的东西从键盘上获取整数。它捕获错误的条目,并循环,直到用户输入有效的整数。
您可以通过检查是否成功来在程序中完成类似的事情。在以下代码段中,表示“如果(cin >>选择)没有失败......”当您输入非数字条目(如“What?”或“x1”)时,会发生失败。cin >> choice
if (std::cin >> choice)...
替换为此。cin >> choice;
for(;;)
{
std::cout << "\nChoice? ";
if (std::cin >> choice)
break;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "Invaild input, please try again.\n";
}
现在,当您不小心按错键时,您的程序不会在无限循环中逃跑。
1. 12- hour format
2. 24- hour format
3. Add Hour
4. Add Minute
5. Add second
6. Exit
Choice? Whoops!
Invaild input, please try again.
Choice? 6
Exiting
评论
6
24- hour format12:00:00 PM
12- hour format12:00:00 PM
while (choice != 0);
->while (choice != 6);