采用c++qt实现带括号的四则优先级运算的算法计算器源码软件(支持浮点正负数)

手把手教你学懂四则优先级运算的算法实现

欢迎各位来到我的博客,如果觉得小弟写得还行就收藏吧!

各位可能是刚开始学单片机,或许是51单片机、stm32单片机,也可能是刚开始学各种编程语言,想完成一个小小的功能齐全的计算器程序。如果只是为了完成简单的单步加减乘除运算,我相信对大家来说都没有什么难度,但是实现带括号的四则运算功能,编程就会发现还是比较有难度,所以这里我分享一下我以前写过的这个算法。

这里的实现算法已经被模块化为两个函数,无论什么单片机,什么平台,只需要调用相应函数即可实现此功能。

操作系统win10

使用的软件qt

基本实现了一个科学计算器。800行代码左右,但是涉及到了c++(qt)各种基本操作方面,和基本数据结构的使用,是一个很好的qt初学者练习项目。

使用c++语言实现(其实基本使用c语言编写的):

str = "(1.3+2)*3.1+9*2-50"
double result = comp(str);    //即可计算出结果

做的一个计算器如下:

代码:

double Comp::backExpressionCalculate(char exp[])
{
    int i;
    double a,b,c;
    double tmp = 0;

    double stack[MAXSIZE];
    char strNum[MAXSIZE];

    int cnt=0;
    int top = -1;
    char operate;

    double res = 0;
    for(i = 0;exp[i]!='\0';++i)
    {
        if((exp[i]>='0'&&exp[i]<='9')||exp[i]=='.')
        {
            strNum[cnt++] = exp[i];
        }
        else if(exp[i] == ' ' ||exp[i]=='+'||exp[i]=='-'||exp[i]=='*'||exp[i]=='/')
        {
            if(cnt>0)
            {
                strNum[cnt++] = '\0';
                cnt = 0;
                tmp = str2double(strNum);
                stack[++top] = tmp;
            }
        }
        if(exp[i] == '+' ||exp[i] == '-' ||exp[i] == '*' ||exp[i] == '/')
        {
            operate = exp[i];
            b = stack[top--];
            a = stack[top--];
            c = calculate(a,operate,b);
            stack[++top] = c;
        }
    }
    res = stack[top];
    return res;

}

我的完整工程代码:百度搜索:cc科学计算器c++(qt)实现,csdn中即可下载

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,我可以提供一个简单的实现,具体步骤如下: 1. 定义一个字符串变量,用于存储用户输入的算式。 2. 通过cin将用户输入的算式存入字符串变量中。 3. 定义一个函数,用于将字符串中的数字和运算符提取出来,并存储到两个栈中。 4. 定义一个函数,用于计算两个数的结果。 5. 定义一个函数,用于根据运算符的优先级进行计算。 6. 定义一个函数,用于计算整个算式的结果。 以下是示例代码: ```c++ #include <iostream> #include <stack> #include <cstring> using namespace std; // 判断字符是否为数字 bool isDigit(char c) { return c >= '0' && c <= '9'; } // 判断字符是否为运算符 bool isOperator(char c) { return c == '+' || c == '-' || c == '*' || c == '/'; } // 将字符串中的数字和运算符提取出来,并存储到两个栈中 void parseExpression(string expr, stack<int>& nums, stack<char>& ops) { int num = 0; bool hasNum = false; for (int i = 0; i < expr.length(); i++) { char c = expr[i]; if (isDigit(c)) { num = num * 10 + (c - '0'); hasNum = true; } else { if (hasNum) { nums.push(num); num = 0; hasNum = false; } if (isOperator(c)) { while (!ops.empty() && (ops.top() == '*' || ops.top() == '/') && (c == '+' || c == '-')) { int num2 = nums.top(); nums.pop(); int num1 = nums.top(); nums.pop(); char op = ops.top(); ops.pop(); nums.push(op == '+' ? num1 + num2 : num1 - num2); } ops.push(c); } else if (c == '(') { ops.push(c); } else if (c == ')') { while (ops.top() != '(') { int num2 = nums.top(); nums.pop(); int num1 = nums.top(); nums.pop(); char op = ops.top(); ops.pop(); nums.push(op == '+' ? num1 + num2 : num1 - num2); } ops.pop(); } } } if (hasNum) { nums.push(num); } while (!ops.empty()) { int num2 = nums.top(); nums.pop(); int num1 = nums.top(); nums.pop(); char op = ops.top(); ops.pop(); nums.push(op == '+' ? num1 + num2 : num1 - num2); } } // 计算两个数的结果 int calc(int num1, int num2, char op) { if (op == '+') { return num1 + num2; } else if (op == '-') { return num1 - num2; } else if (op == '*') { return num1 * num2; } else if (op == '/') { return num1 / num2; } return 0; } // 根据运算符的优先级进行计算 void calculate(stack<int>& nums, stack<char>& ops) { int num2 = nums.top(); nums.pop(); int num1 = nums.top(); nums.pop(); char op = ops.top(); ops.pop(); int result = calc(num1, num2, op); nums.push(result); } // 计算整个算式的结果 int evaluate(string expr) { stack<int> nums; stack<char> ops; parseExpression(expr, nums, ops); return nums.top(); } int main() { string expr; cout << "请输入算式:" << endl; cin >> expr; int result = evaluate(expr); cout << "结果为:" << result << endl; return 0; } ``` 这个实现还有一些不足之处,比如没有对输入的算式进行校验,如果用户输入的算式不符合规范,程序可能会崩溃。但是这个实现可以帮助你了解计算器程序的基本原理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值