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后持续递增。
修复步骤
- 自动计时逻辑中添加进位处理:在每秒递增秒数后调用
TwentyFourClock(),替换原代码中递归调用main()的危险逻辑(递归会导致栈溢出):
while (!kbhit() && f == 0) { Clear(); Display(); seconds++; TwentyFourClock(); // 处理秒、分、时的进位 Sleep(1000); // 移除原有的main()递归调用 }
- 手动操作后添加进位处理:在用户选择菜单选项后,调用
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(); // 处理手动操作后的时间进位
额外修复:原代码中的其他严重问题
- 移除
main()递归调用:原代码中在计时循环里调用main()会导致栈溢出,直接删除该语句。 - 删除错误的抵消逻辑:原代码中加1小时后会减1分钟和1秒,这是错误逻辑,直接移除这些代码。
内容的提问来源于stack exchange,提问作者rochelle watkins
相关产品推荐
相关产品推荐

