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]

提问人:KotaZachary 提问时间:11/17/2023 最后编辑:tbxfreewareKotaZachary 更新时间:11/20/2023 访问量:85

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答这个问题。

5天前关闭。

这是我的 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
C++语言

评论

1赞 Thomas Matthews 11/17/2023
使用调试器时,哪个语句导致了问题?请说明是哪种说法,预期值或行为和实际值或行为。提醒一下,使用纯文本形式的调试信息更新您的帖子。
0赞 Retired Ninja 11/17/2023
你能解释一下如何退出循环吗?它不等于 0,因此循环条件仍然为 true。6
0赞 Thomas Matthews 11/17/2023
我得到了选项 1 和 2 的相同时间输出: 和 .您应该在“提示”和时间之间留出一些间距。24- hour format12:00:00 PM12- hour format12:00:00 PM
0赞 user4581301 11/17/2023
快速浏览建议while (choice != 0); -> while (choice != 6);

答:

0赞 Thomas Matthews 11/17/2023 #1

将语句中的表达式更改为:while
while ((choice >= 1) && (choice <= 5));

您可能需要在终止菜单后暂停执行:

std::cout << "Paused. Press ENTER to continue.\n";
std::cin.ignore(100000, '\n');

评论

0赞 user4581301 11/17/2023
注意:我不能 100% 确定,但“请再试一次”让我认为提问者希望程序循环并重新询问用户是否输入无效。
0赞 tbxfreeware 11/17/2023 #2

问题是choice != 0

当用户选择“退出”选项(选项 6)时,菜单不会退出。

我添加了 while 循环,现在当我决定 [退出] 时,它只是重复菜单,如下所示。

这是你写的 while 循环。

    do {
        // ...
    } while (choice != 0);

退出的唯一方法是 for to be ,但这并不好,因为你想在 is 时退出。choice0choice6

因此,将测试更改为 !就这样。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 时,它会正确退出,但每当用户做出无效选择时,它也会退出。因此,、、等也被视为“退出”的意思。07

在这次运行中,我选择了 ,然后程序退出了。菜单未重新显示。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 >> choiceif (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