C++时间程序无法持续执行:主函数未调用功能的解决方法
C++时间管理程序执行异常:仅完成初始输入,无法进入菜单功能
我开发的C时间管理程序存在执行异常:仅能完成用户初始时间输入步骤,无法继续显示操作菜单及执行加减时、分、秒的功能。单独测试各功能函数时可正常运行,但主函数外的代码完全未执行,推测是未在main函数中调用相关功能导致。作为C新手,我对此十分困惑,希望了解是否需要在main中调用所有函数,以及具体的解决方法。
程序流程图
- 程序启动
- 获取用户输入的初始时间
- 循环
- 显示菜单(处理步骤)
- 是否添加小时?(判断)
- 添加小时(处理步骤)
- 显示时间(处理步骤)
- 是否添加分钟?(判断)
- 添加分钟(处理步骤)
- 显示时间(处理步骤)
- 是否添加秒?(判断)
- 添加秒(处理步骤)
- 显示时间(处理步骤)
- 是否退出?(判断)
- 退出(处理步骤)
- 结束循环
第一段代码
#include <iostream> #include <string> #include <iomanip> using namespace std; int main() { cout << "**************************\n" << "*\t\t\t\t*\n" << "*\t1-Add One Hour\t\t*\n" << "*\t2-Add One Minute\t*\n" << "*\t3-Add One Second\t*\n" << "*\t4-Exit Program\t\t*\n" << "**************************\n"; } void displayTime(int &hour12, int &min12, int &sec12, string &m, int &hour24, int &min24, int &sec24) { cout << "**************************\n" << "*\t\t\t\t*\n" << "*\t12-Hour Clock\t\t*\n" << "*\t" << setw(2) << setfill('0') << hour12 << ":" << setw(2) << setfill('0') << min12 << ":" << setw(2) << setfill('0') << sec12 << " " << ampm << "\t*\n" << "*\t24-Hour Clock\t\t*\n" << "*\t" << setw(2) << setfill('0') << hour24 << ":" << setw(2) << setfill('0') << min24 << ":" << setw(2) << setfill('0') << sec24 << "\t*\n" << "**************************\n"; } void addOneHour (int &hour ) { hour++; } void addOneMin(int &min) { min++; } void addOneSec (int &sec) { sec++; } int displayMenu() { int hour12, min12, sec12; string ampm; cout << "Please enter the initial time in 12-hour format (HH:MM:SS AM/PM): "; cin >> hour12 >> min12 >> sec12 >> ampm; cout << "The initial time is: " << setw(2) << setfill('0') << hour12 << ":" << setw(2) << setfill('0') << min12 << ":" << setw(2) << setfill('0') << sec12 << " " << ampm << endl; int hour24 = hour12; if (ampm == "PM") { hour24 += 12; } int min24 = min12; int sec24 = sec12; displayTime(hour12, min12, sec12, ampm, hour24, min24, sec24); displayMenu(); int choice; cin >> choice; while (choice != 4) { switch (choice) { case 1: addOneHour(hour12); hour24++; break; case 2: addOneMin(min12); min24++; break; case 3: addOneSec(sec12); sec24++; break; default: cout << "Invalid choice. Please try again." << endl; break; } if (hour12 > 12) { hour12 -= 12; ampm = "PM"; } else if (hour12 == 12) { ampm = "PM"; } else { ampm = "AM"; } if (hour24 >= 24) { hour24 -= 24; } if (min24 >= 60) { min24 -= 60; hour24++; } if (sec24 >= 60) { sec24 -= 60; min24++; } displayTime(hour12, min12, sec12, ampm, hour24, min24, sec24); displayMenu(); cin >> choice; } cout << "Exiting program. Goodbye!" << endl; return 0; }
第二段代码
#include <iostream> #include <string> #include <iomanip> using namespace std; int main() { int hour12, min12, sec12; string ampm; cout << "Please enter the initial time in 12-hour format (HH:MM:SS AM/PM): "; cin >> hour12 >> min12 >> sec12 >> ampm; cout << "The initial time is: " << setw(2) << setfill('0') << hour12 << ":" << setw(2) << setfill('0') << min12 << ":" << setw(2) << setfill('0') << sec12 << " " << ampm << endl; } void displayMenu( ) { cout << "**************************\n" << "*\t\t\t\t*\n" << "*\t1-Add One Hour\t\t*\n" << "*\t2-Add One Minute\t*\n" << "*\t3-Add One Second\t*\n" << "*\t4-Exit Program\t\t*\n" << "**************************\n"; } void displayTime(int &hour12, int &min12, int &sec12, string &m, int &hour24, int &min24, int &sec24) { cout << "**************************\n" << "*\t\t\t\t*\n" << "*\t12-Hour Clock\t\t*\n" << "*\t" << setw(2) << setfill('0') << hour12 << ":" << setw(2) << setfill('0') << min12 << ":" << setw(2) << setfill('0') << sec12 << " " << ampm << "\t*\n" << "*\t24-Hour Clock\t\t*\n" << "*\t" << setw(2) << setfill('0') << hour24 << ":" << setw(2) << setfill('0') << min24 << ":" << setw(2) << setfill('0') << sec24 << "\t*\n" << "**************************\n"; } void addOneHour (int &hour ) { hour++; } void addOneMin(int &min) { min++; } void addOneSec (int &sec) { sec++; } void displayTime() { int hour12 = 12, min12 = 0, sec12 = 0, hour24 = 0, min24 = 0, sec24 = 0; string ampm = "AM"; displayTime(hour12, min12, sec12, ampm, hour24, min24, sec24); displayMenu(); int choice; cin >> choice; while (choice != 4) { switch (choice) { case 1: addOneHour(hour12); hour24++; break; case 2: addOneMin(min12); min24++; break; case 3: addOneSec(sec12); sec24++; break; default: cout << "Invalid choice. Please try again.\n"; } if (hour12 == 12 && min12 == 0 && sec12 == 0 && ampm == "AM") { ampm = "PM"; } else if (hour12 == 12 && min12 == 0 && sec12 == 0 && ampm == "PM") { ampm = "AM"; } else if (hour12 > 12) { hour12 -= 12; ampm = "PM"; } if (min24 == 60) { min24 = 0; hour24++; } if (sec24 == 60) { sec24 = 0; min24++; } if (hour24 == 24) { hour24 = 0; } displayTime(hour12, min12, sec12, ampm, hour24, min24, sec24); displayMenu(); cin >> choice; } cout << "Goodbye!\n"; }
问题分析与解决方法
核心问题:主函数未调用功能逻辑
C++程序的入口是main()函数,所有需要执行的代码逻辑必须直接或间接被main()调用才会执行。你的两段代码都存在这个问题:
- 第一段代码:
main()只输出了菜单,没有调用包含输入和循环逻辑的displayMenu(),且displayMenu()里有递归调用自己的错误,会导致无限递归无法执行后续逻辑。 - 第二段代码:
main()只完成初始时间输入,没有调用包含菜单循环的无参displayTime(),且该函数初始化固定时间,未使用用户输入值。
解决步骤
1. 修正函数调用关系
确保main()调用核心功能逻辑,并传递用户输入的初始时间,同时移除不必要的递归调用。
2. 修复时间处理逻辑错误
比如分钟、秒进位判断改用>=,完善12小时制转换逻辑(如12AM转0点、12PM保持12点等)。
3. 重构后的完整代码
#include <iostream> #include <string> #include <iomanip> using namespace std; // 声明函数原型,避免编译错误 void displayMenu(); void displayTime(int hour12, int min12, int sec12, const string& ampm, int hour24, int min24, int sec24); void addOneHour(int& hour12, int& hour24, string& ampm); void addOneMin(int& min12, int& min24, int& hour12, int& hour24, string& ampm); void addOneSec(int& sec12, int& sec24, int& min12, int& min24, int& hour12, int& hour24, string& ampm); int main() { int hour12, min12, sec12; string ampm; // 获取用户初始时间输入 cout << "Please enter the initial time in 12-hour format (HH:MM:SS AM/PM): "; cin >> hour12 >> min12 >> sec12 >> ampm; // 转换为24小时制 int hour24 = hour12; if (ampm == "PM" && hour12 != 12) { hour24 += 12; } else if (ampm == "AM" && hour12 == 12) { hour24 = 0; } int min24 = min12; int sec24 = sec12; // 显示初始时间 cout << "The initial time is: " << setw(2) << setfill('0') << hour12 << ":" << setw(2) << setfill('0') << min12 << ":" << setw(2) << setfill('0') << sec12 << " " << ampm << endl; displayTime(hour12, min12, sec12, ampm, hour24, min24, sec24); int choice; do { displayMenu(); cin >> choice; switch (choice) { case 1: addOneHour(hour12, hour24, ampm); break; case 2: addOneMin(min12, min24, hour12, hour24, ampm); break; case 3: addOneSec(sec12, sec24, min12, min24, hour12, hour24, ampm); break; case 4: cout << "Exiting program. Goodbye!" << endl; break; default: cout << "Invalid choice. Please try again." << endl; continue; // 跳过后续时间显示,重新选菜单 } if (choice != 4) { displayTime(hour12, min12, sec12, ampm, hour24, min24, sec24); } } while (choice != 4); return 0; } void displayMenu() { cout << "\n**************************\n" << "*\t\t\t\t*\n" << "*\t1-Add One Hour\t\t*\n" << "*\t2-Add One Minute\t*\n" << "*\t3-Add One Second\t*\n" << "*\t4-Exit Program\t\t*\n" << "**************************\n"; } void displayTime(int hour12, int min12, int sec12, const string& ampm, int hour24, int min24, int sec24) { cout << "\n**************************\n" << "*\t\t\t\t*\n" << "*\t12-Hour Clock\t\t*\n" << "*\t" << setw(2) << setfill('0') << hour12 << ":" << setw(2) << setfill('0') << min12 << ":" << setw(2) << setfill('0') << sec12 << " " << ampm << "\t*\n" << "*\t24-Hour Clock\t\t*\n" << "*\t" << setw(2) << setfill('0') << hour24 << ":" << setw(2) << setfill('0') << min24 << ":" << setw(2) << setfill('0') << sec24 << "\t*\n" << "**************************\n"; } void addOneHour(int& hour12, int& hour24, string& ampm) { hour24++; if (hour24 >= 24) { hour24 = 0; } // 更新12小时制 if (hour24 == 0) { hour12 = 12; ampm = "AM"; } else if (hour24 < 12) { hour12 = hour24; ampm = "AM"; } else if (hour24 == 12) { hour12 = 12; ampm = "PM"; } else { hour12 = hour24 - 12; ampm = "PM"; } } void addOneMin(int& min12, int& min24, int& hour12, int& hour24, string& ampm) { min24++; min12++; if (min24 >= 60) { min24 = 0; min12 = 0; addOneHour(hour12, hour24, ampm); // 分钟进位后加一小时 } } void addOneSec(int& sec12, int& sec24, int& min12, int& min24, int& hour12, int& hour24, string& ampm) { sec24++; sec12++; if (sec24 >= 60) { sec24 = 0;
相关产品推荐
相关产品推荐

