如何用c++做一个较为复杂的计算器

结合之前几个版本的计算器,现在我将计算器进行了又一次升级,当数字输入的为其它字符的时候我们会要求重新输入,具体代码如下:

 

#include <iostream>
#include <limits> // 包含用于处理输入流的 std::numeric_limits
#include <cstdlib> // 包含用于清屏的 std::system
#include <cmath> // 包含用于平方根的 std::sqrt
using namespace std;
// 函数声明
void sssm();
void show_results();
// 全局变量
float result_arr[2] = { 0 }; // 存放两次结果的数组
int arr_index = 0;          // 当前存放结果的数组索引
int main() {
    float num1 = 0, num2 = 0, final;
    char fh = 0;
    char select = 0;
    cout << "欢迎使用简易计算器" << endl;
    cout << "-----------------" << endl;
    cout << "|    1、进入    |" << endl;
    cout << "-----------------" << endl;
    cout << "|    2、说明    |" << endl;
    cout << "-----------------" << endl;
    cin >> select;
    if (select == '1') {
        system("cls");
        cout << "请输入" << endl;
        sssm();
        goto Z;
    }
    else
        sssm();
Z:cin >> num1;
    while (true) {
        if (cin.fail()) {
            cin.clear(); // 清除错误标志
            cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略输入缓冲区中的内容
            cout << "输入无效,请重新输入一个数字:" << endl;
            cin >> num1;
        }
        else {
            break;
        }
    }
    cin >> fh;
    int a = 0;
    double result;
    int final2;
    while (fh != 'n')
    {
        switch (fh)
        {
        case'+':cin >> num2; 
            while (true) {
            if (cin.fail()) {
                cin.clear(); // 清除错误标志
                cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略输入缓冲区中的内容
                cout << "输入无效,请重新输入一个数字:" << endl;
                cin >> num2;
            }
            else {
                break;
            }
        }final = num1 + num2; 
            break;
        case'-':cin >> num2;
            while (true) {
                if (cin.fail()) {
                    cin.clear(); // 清除错误标志
                    cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略输入缓冲区中的内容
                    cout << "输入无效,请重新输入一个数字:" << endl;
                    cin >> num2;
                }
                else {
                    break;
                }
            }final = num1 - num2; break;
        case'*':cin >> num2; 
            while (true) {
                if (cin.fail()) {
                    cin.clear(); // 清除错误标志
                    cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略输入缓冲区中的内容
                    cout << "输入无效,请重新输入一个数字:" << endl;
                    cin >> num2;
                }
                else {
                    break;
                }
            }
            final = num1 * num2; 
            break;
        case'/':cin >> num2; 
            while (true) {
                if (cin.fail()) {
                    cin.clear(); // 清除错误标志
                    cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略输入缓冲区中的内容
                    cout << "输入无效,请重新输入一个数字:" << endl;
                    cin >> num2;
                }
                else {
                    break;
                }
            }
            final = num1 / num2; 
            a = num1 - (num2 * static_cast<int>(num1 / num2)); 
            break;
        case'^':final = num1 * num1; break;
        case'~':cin >> num2;  
            while (true) {
                if (cin.fail()) {
                    cin.clear(); // 清除错误标志
                    cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略输入缓冲区中的内容
                    cout << "输入无效,请重新输入一个数字:" << endl;
                    cin >> num2;
                }
                else {
                    break;
                }
            }
            final = num1; 
            for (int i = num2; i > 1; i--) 
            { 
                final = num1 * final;
            }
            break;
        case'c': show_results(); cout << "请输入是否要调用上一次结果(y/n):" << endl; cin >> select; if (select == 'y')final = result_arr[1]; break; // 查看之前的结果
        case'h':if (num1 < 0)cout << "负数没有平方根!" << endl; else  final = sqrt(num1); break;
        case'z':final2 = final; final = final2; break;
        default:cout << "请重新输入" << endl; fh = 0; break;
        }
        system("cls");
        if (a != 0)
        {
            int final1 = final;
            printf("--------------------\n");
            printf("结果是%d····%d\n", final1, a);
            printf("--------------------\n");
            sssm();
            final = final1;
            a = 0;
            result_arr[arr_index % 2] = final; // 存放结果到数组中
            arr_index++;
        }
        else
        {
            printf("---------------------\n");
            printf("结果是%.2f\n", final);
            printf("---------------------\n");
            sssm();
            result_arr[arr_index % 2] = final; // 存放结果到数组中
            arr_index++;
        }
    a:        cin >> fh;
        if (fh == 'q')
        {
            printf("已清空\n");
            goto Z;
        }
        else
        {
            num1 = final;
            continue;
        }
    }
    return 0;
}
void sssm() {
    cout << "-----------------------------------" << endl;
    cout << "|    1、+加法    |    2、-减法    |" << endl;
    cout << "-----------------------------------" << endl;
    cout << "|    3、*乘法    |    4、/除法    |" << endl;
    cout << "-----------------------------------" << endl;
    cout << "|    5、^平方    |    6、h开方    |" << endl;
    cout << "-----------------------------------" << endl;
    cout << "|    7、c是查看上一次结果         |" << endl;
    cout << "-----------------------------------" << endl;
    cout << "|    8、z是去掉小数点后面的数字   |" << endl;
    cout << "-----------------------------------" << endl;
}
void show_results() {
    cout << "上一次计算结果是: " << result_arr[1] << endl;
    system("pause");
}

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值