You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

12小时制时钟越界显示00、24小时制时钟不归零的修复咨询

修复C++双时钟程序的两个时间显示异常

针对你提到的双时钟程序的两个问题,以下是具体的修复方案及原因分析:


问题1:12小时制时钟超过12小时后显示00而非01

问题根源

原TwelveHourClock函数的转换逻辑错误:当小时数为12的整数倍(如12、24)时,hours % 12会得到0,直接返回0导致显示00,不符合12小时制的规则(12点应显示12,13点显示1,午夜0点显示12 AM)。

修复后的函数代码

int TwelveHourClock() { //Twelve hour clock function.
    int hrs = hours;
    if (hours == 0) {
        // 午夜0点,显示12 AM
        hrs = 12;
        timestr = "AM";
    } else if (hours < 12) {
        // 1-11点,直接显示小时数,AM
        hrs = hours;
        timestr = "AM";
    } else if (hours == 12) {
        // 中午12点,显示12 PM
        hrs = 12;
        timestr = "PM";
    } else {
        // 13-23点,取模12后显示,PM
        hrs = hours % 12;
        timestr = "PM";
    }
    return hrs;
}

问题2:24小时制时钟从23小时递增后不会归零

问题根源

负责处理时间溢出进位的TwentyFourClock函数从未被调用:无论是自动每秒递增秒数,还是用户手动加时、分、秒后,都没有执行该函数来修正溢出的时间值,导致小时数超过23后持续递增。

修复步骤

  1. 自动计时逻辑中添加进位处理:在每秒递增秒数后调用TwentyFourClock(),替换原代码中递归调用main()的危险逻辑(递归会导致栈溢出):
while (!kbhit() && f == 0) {
    Clear();
    Display();
    seconds++;
    TwentyFourClock(); // 处理秒、分、时的进位
    Sleep(1000);
    // 移除原有的main()递归调用
}
  1. 手动操作后添加进位处理:在用户选择菜单选项后,调用TwentyFourClock()修正时间,同时为switch分支添加break(原代码无break会导致多执行后续分支逻辑):
cin >> userInput;
switch (userInput) {
case 1:
    hours += 1;
    break; // 避免执行case2、case3的逻辑
case 2:
    minutes += 1;
    break;
case 3:
    seconds += 1;
    break;
case 4:
    break; // 退出循环
default:
    cout << "无效选项,请输入1-4之间的数字!" << endl;
    Sleep(1500);
    break;
}
TwentyFourClock(); // 处理手动操作后的时间进位

额外修复:原代码中的其他严重问题

  1. 移除main()递归调用:原代码中在计时循环里调用main()会导致栈溢出,直接删除该语句。
  2. 删除错误的抵消逻辑:原代码中加1小时后会减1分钟和1秒,这是错误逻辑,直接移除这些代码。

内容的提问来源于stack exchange,提问作者rochelle watkins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 08:15:44