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

C++计算器程序while循环中home()函数调用异常求助

问题解决:C++计算器程序停止重复调用home()函数

问题分析

你当前的代码逻辑存在两处问题:

  1. while循环每次迭代开头都会无条件调用home(),导致即便第二次输入正确,进入循环时仍会先执行一次home();
  2. 之前在else分支中调用home()的做法,会造成输入错误时重复显示选项(循环开头一次,else分支一次)。

你的核心需求是:输入正确时立即停止调用home(),仅在输入错误时重新展示运算选项。

修正方案

调整home()的调用时机:仅在程序启动时显示一次初始选项,以及输入错误后重新显示选项,移除循环开头的无条件调用。同时可以优化输入判断逻辑,减少重复代码。

修改后的完整代码

#include <iostream>
#include <cctype> // 用于toupper()函数
using namespace std;

void home()
{
    cout << "\nChoose your operation:" << endl;
    cout << "\tType [A] for Addition" << endl;
    cout << "\tType [S] for Subtraction" << endl;
    cout << "\tType [M] for Multiplication" << endl;
    cout << "\tType [D] for Division" << endl;
}

int main()
{
    char operation;
    bool no_operator = true;
    int design = 73;

    for (int i = 0; i < design; i++){
        if (i == 25){
            cout << " WELCOME TO CALCULATOR ";
            i += 22;
        }
        else i == 72 ? cout << "*\n" : cout << "*";
    }

    // 初始显示一次运算选项
    home();
    while (no_operator){
        cout << "\nOperation: ";
        cin >> operation;

        // 统一转换为大写,简化大小写判断逻辑
        operation = toupper(operation);

        if (operation == 'A')
        {
            cout << "\nIt will going to add numbers";
            no_operator = false;
        }
        else if (operation == 'S')
        {
            no_operator = false;
            cout << "\nIt will going to subtract numbers";
        }
        else if (operation == 'M')
        {
            no_operator = false;
            cout << "\nIt will going to multiply numbers";
        }
        else if (operation == 'D')
        {
            no_operator = false;
            cout << "\nIt will going to divide numbers";
        }
        else
        {
            cout << "\tInvalid Input: You must enter A/S/M/D only\n";
            // 仅输入错误时重新显示选项
            home();
        }
    }

    return 0;
}

关键修改说明

  1. 将home()的初始调用移到while循环外,确保程序启动只显示一次选项;
  2. 移除while循环开头的home()调用,避免输入正确前的多余显示;
  3. 仅在else分支(输入错误场景)调用home(),重新展示选项;
  4. 使用toupper()统一转换输入字符为大写,消除重复的大小写判断逻辑(需引入<cctype>头文件)。

修改后,当输入正确时会直接设置no_operator = false退出循环,不会再调用home(),完全符合你的需求。

内容的提问来源于stack exchange,提问作者Joseph Tiglao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:40:25