C++代码合并后无法进入菜单流程问题排查与修复请求
修复后的完整代码
#include <iostream> #include <limits> using namespace std; class Time { private: int hours; int minutes; int seconds; void normalizeTime() { // 处理秒进位 minutes += seconds / 60; seconds %= 60; if (seconds < 0) { seconds += 60; minutes--; } // 处理分进位 hours += minutes / 60; minutes %= 60; if (minutes < 0) { minutes += 60; hours--; } // 处理小时的24进制 hours %= 24; if (hours < 0) hours += 24; } public: Time(int h = 0, int m = 0, int s = 0) : hours(h), minutes(m), seconds(s) { normalizeTime(); } // 重载1:显示当前时间 void displayTime() { printf("%02d:%02d:%02d\n", hours, minutes, seconds); } // 重载2:显示添加指定时间后的结果 void displayTime(int addH, int addM, int addS) { Time temp(hours + addH, minutes + addM, seconds + addS); temp.displayTime(); } void addHours(int h) { hours += h; normalizeTime(); } void addMinutes(int m) { minutes += m; normalizeTime(); } void addSeconds(int s) { seconds += s; normalizeTime(); } void getInitialTime() { cout << "请输入初始时间(时 分 秒):"; while (!(cin >> hours >> minutes >> seconds)) { cout << "输入无效,请重新输入整数格式的时 分 秒:"; cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); } normalizeTime(); cout << "初始时间设置完成:"; displayTime(); } }; int main() { Time t; int choice; int value; t.getInitialTime(); do { // 显示操作菜单 cout << "\n===== 时间操作菜单 =====" << endl; cout << "1. 添加小时" << endl; cout << "2. 添加分钟" << endl; cout << "3. 添加秒数" << endl; cout << "4. 查看当前时间" << endl; cout << "5. 退出程序" << endl; cout << "请输入选择(1-5):"; // 处理菜单输入错误 while (!(cin >> choice) || choice < 1 || choice > 5) { cout << "输入无效,请输入1-5之间的整数:"; cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); } // 执行对应操作 switch (choice) { case 1: cout << "输入要添加的小时数:"; while (!(cin >> value)) { cout << "输入无效,请输入整数:"; cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); } t.addHours(value); cout << "更新后时间:"; t.displayTime(); break; case 2: cout << "输入要添加的分钟数:"; while (!(cin >> value)) { cout << "输入无效,请输入整数:"; cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); } t.addMinutes(value); cout << "更新后时间:"; t.displayTime(); break; case 3: cout << "输入要添加的秒数:"; while (!(cin >> value)) { cout << "输入无效,请输入整数:"; cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); } t.addSeconds(value); cout << "更新后时间:"; t.displayTime(); break; case 4: cout << "当前时间:"; t.displayTime(); break; case 5: cout << "程序已退出。" << endl; break; } } while (choice != 5); return 0; }
关键修复点
- 输入缓冲区清理:每次处理无效输入时,用
cin.clear()重置输入状态,cin.ignore()清空缓冲区残留的换行符或无效字符,避免后续输入被直接跳过。 - 重载函数职责明确:两个
displayTime重载分工清晰,无参版本显示当前时间,带参版本计算并显示添加指定时间后的结果,消除调用混淆。 - 时间自动规范化:新增
normalizeTime方法处理时/分/秒的进位和负数情况,确保时间格式始终合法。 - 菜单循环逻辑修正:用
do-while循环保证菜单至少显示一次,直到用户选择退出,完全匹配流程图的循环要求。
内容的提问来源于stack exchange,提问作者jimmyCX
相关产品推荐
相关产品推荐

