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

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 &ampm, 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 &ampm, 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;
相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 10:35:12