博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第六次作业
阅读量:5321 次
发布时间:2019-06-14

本文共 2636 字,大约阅读时间需要 8 分钟。

第六次作业

假期有事,实在没时间,这两天熬夜补出来

toget函数,用来将两个整书数组和符号数组汇集

void equation::toget() {    strcpy_s(eq, n);    int y = 0;    while (m[y] != 0) y++;    len = strlen(eq) + y;    for (int i = 0;i
= 0;j--) { eq[j + 1] = eq[j]; } eq[i] = '|'; len++; } if ((eq[i] == '(' || eq[i] == '+') || eq[i] == '-' || eq[i] == '*' || eq[i] == '/') { if (eq[i + 1] != '(') { for (int j = len - 1;j>i;j--) { eq[j + 1] = eq[j]; } eq[i + 1] = '|'; len++; } } }}

用栈计算:

主要代码:double equation::result()//读取并计算表达式直到结束为止{    do    {        readdata();    } while (readop());    calremain(); //处理栈中剩余的运算符    return v;}void equation::readdata() //在该出现数据的时候可能出现'(' {    // 如1+((2*3)) 左括号可能是多个     while (1)  //读取数据失败,此时读取应该是'(',而v为double类型     {        op = eq[cnt1];        if ( op == '|')        {            cnt1++;            v = m[cnt2++];            break;        }           ops.push(op); //左括号入栈         cnt1++;    }    ds.push(v);}bool equation::readop() //读取运算符,可能出现右括号或者换行符(表达式结束) {    //如(2*(3+4/(4-5))),右括号可能是多个     while (1)    {        op = eq[cnt1++];        if (op != ')') break;        while (ops.top() != '(')        {            rh = ds.top(); //取左操作数             ds.pop();            lh = ds.top();//取右操作数             ds.pop();            ds.push(cal(lh, ops.top(), rh)); //计算并入栈            ops.pop(); //取走运算符         }        ops.pop(); //丢弃'('     }    if (op == '=')    {        return false;    }    if (strchr("+-*/", op) == NULL) //无效运算符     {        throw string("无效运算符") + op;    }    while (!ops.empty() && ops.top() != '(' && !prior(op, ops.top()))    {        rh = ds.top(); ds.pop();        lh = ds.top(); ds.pop();        ds.push(cal(lh, ops.top(), rh)); //计算并入栈        ops.pop(); //取走运算符      }    ops.push(op);    return true;}void equation::calremain(){    while (!ops.empty())    {        rh = ds.top(); ds.pop();        lh = ds.top(); ds.pop();        ds.push(cal(lh, ops.top(), rh)); //计算并入栈        ops.pop(); //取走运算符     }    if (ds.size() != 1)    {        throw string("无效的表达式");    }    v = ds.top();    ds.pop();    return;}double equation::cal(double lh, char op, double rh){    return op == '+' ? lh + rh : op == '-' ? lh - rh : op == '*' ? lh*rh : lh / rh;}bool equation::prior(char o1, char o2)//若o1比o2优先级高返回true,否则返回false {    return o1 != '+' && o1 != '-' && o2 != '*' && o2 != '/';}

运行截图

1093463-20170602024756368-1203324063.jpg

1093463-20170602024808024-1962624300.jpg

感想

赶出来的,有点累,理解起来有点难,不过我还是尽努力理解,并将计算方法和算输出联系起来。

QT问题解决过程

转载于:https://www.cnblogs.com/hi-reader/p/6926107.html

你可能感兴趣的文章
记Angular与Django REST框架的一次合作(2):前端组件化——Angular
查看>>
08.存储Cinder→5.场景学习→08.Backup Volume→1.概述与配置
查看>>
进阶之路(基础篇) - 012 Arduino IDE 添加DHT11传感器第三方库的方法
查看>>
详谈js面向对象 javascript oop,持续更新
查看>>
Javaweb Tomcat 项目部署方式
查看>>
文字半透明显示在图片上
查看>>
express简单原理
查看>>
ubuntu安装spark on yarn
查看>>
linux网络 (一):网络配置
查看>>
基础练习 十进制转十六进制
查看>>
关于这次软件以及pda终端的培训
查看>>
react 生命周期
查看>>
jQuery上传插件Uploadify 3.2在.NET下的详细例子
查看>>
spring11----基于Schema的AOP
查看>>
解决input框自动填充为黄色的问题
查看>>
音视频基础知识(一)
查看>>
JAVA⑤
查看>>
CyclicBarrier的使用
查看>>
thinkphp的select和find的区别
查看>>
小程序开发笔记
查看>>