c++制作简单计算器

采用分离编程

先写头文件
#pragma once
#include<iostream>
#include<string>
#include<stack>
using namespace std;

class counter
{
public:
    string::size_type get_number_size(string& expr, string::size_type currentPos);
    bool is_number(char& c);
    void pop_caculate();
    int cal_priority(char& c);
    void calculate(string& expr);
    string expression;
    double result;
    int number_flag;
    stack<double> num_stk;
    stack<char> oper_stk;
};

函数库

#include<iostream>
#include<stack>
#include<string>
#include "counter.h"

string::size_type counter::get_number_size(string& expr, string::size_type currentPos)
{
    string numbers = "0123456789.";
    return expr.find_first_not_of(numbers, currentPos) - currentPos;
}

int counter::cal_priority(char& c) {
    if (c == '(') return 0;
    else if (c == '+') return 1;
    else if (c == '-') return 2;
    else if (c == '*') return 3;
    else if (c == '/') return 4;
    return 0;
}

void counter::pop_caculate() {

    double left = 0, right = 0, res = 0;
    char oper = oper_stk.top();
    right = num_stk.top();
    num_stk.pop();
    left = num_stk.top();
    num_stk.pop();
    oper_stk.pop();
    if (oper == '+') res = left + right;
    else if (oper == '-') res = left - right;
    else if (oper == '*') res = left * right;
    else if (oper == '/') res = left / right;
    num_stk.push(res);
}

bool counter::is_number(char& c) {
    string numbers = "0123456789-";
    if (numbers.find(c) == string::npos) {
        return false;
    }
    return true;
}
void counter::calculate(string& expr) {
    string::size_type size = 0;
    double num = 0;
    for (string::size_type i = 0; i < expr.size();) {
        if (number_flag == 0 && is_number(expr[i])) {
            num = stod(expr.substr(i));//stod将字符串转化为double
            if (expr[i] == '-') {
                ++i;
                num = -stod(expr.substr(i));
            }
            size = get_number_size(expr, i);
            num_stk.push(num);
            i += size;
            number_flag = 1;
        }
        else {
            number_flag = 0;
            if (oper_stk.empty()) {
                oper_stk.push(expr[i]);
            }
            else if (expr[i] == '(') {
                oper_stk.push(expr[i]);
            }
            else if (expr[i] == ')') {
                while (oper_stk.top() != '(') {
                    pop_caculate();
                }
                oper_stk.pop();
            }
            else if (cal_priority(expr[i]) <= cal_priority(oper_stk.top())) {
                pop_caculate();
                oper_stk.push(expr[i]);
            }
            else {
                oper_stk.push(expr[i]);
            }
            ++i;
        }
    }
    while (!oper_stk.empty()) {
        pop_caculate();
    }
    result = num_stk.top();
    cout << "计算结果为:" << result << endl << endl;
    cout << "请输入计算表达式:" << endl;
}

主函数

#include<iostream>
#include<string>
#include"counter.h"
using namespace std;


int main()
{
    string experssion;
    counter c;
    cout << "可以实现加减乘除及括号运算" << endl;
    cout << "请输入计算表达式:" << endl;
    while (cin >> experssion) 
    {
        c.number_flag = 0;
        c.calculate(experssion);
    }
    return 0;
}

分为三个文件然后就可以运行啦

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值