qt科学计算机,qt_计算器的简单实现

0d6fcc5a35505b74eb8e02d5bf4e62cf.png

fc08dc019ce2b2ebf03781396aede74b.png

//转换为后缀表达式,实现最主要功能

void MainWindow::toPostfix ()

{

QString exp = ui->lineEdit->text ();

//QString exp = "0.3/(5*2+1)", postfix;

QString tmp = exp;

int j;

//如果只有单个数字时

for (j = ; j < tmp.size () && (tmp[j].isDigit () || tmp[j] == '.'); j++) {

postFix.push_back (tmp[j]);

}

if (j == tmp.size ()) {

postFix.push_back (' ');

return;

}

postFix.clear ();

for (int i = ; i < exp.size (); i++)

{

qDebug() << i << exp[i];

if (exp[i].isDigit () || exp[i] == '.') {//为数字或者小数点

postFix.push_back (exp[i]); //直接添加到后缀表达式后面

}

else if (exp[i] == '(') { //入操作符栈

opStack.push (exp[i]);

}

else if (exp[i] == ')') { //遇到右括号,就转换成空格添加到后缀表达式中

postFix.push_back (' ');

while (opStack.top () != '(')

{

//只要遇到右括号,则在操作符栈中将栈顶下一次出现'('前的操作符全部依次添加到后缀表达式后面

//因为进栈的时候,是栈顶操作符优先级低;所以出栈的时候,优先级高->低依次添加到后缀表达式后

postFix.push_back (opStack.pop ());

qDebug() << postFix;

}

opStack.pop (); //遇到右括号一次,左括号也相应少一次

}

//运算符比栈顶的优先级高时,入栈顶

else if (getLevel (exp[i]) > getLevel (opStack.top ()))

{

//将操作符和操作数用空格分开

postFix.push_back (' ');

opStack.push (exp[i]);

}

else {

postFix.push_back (' '); qDebug() << postFix;

//当操作符比栈顶的操作符优先级低时,从栈顶(弹出)pop()运算符,添加到后缀表达式中

while (getLevel (exp[i]) <= getLevel (opStack.top ()))

postFix.push_back (opStack.pop ());

opStack.push (exp[i]); //栈顶优先级低则,入栈

}

}

while (opStack.top () != '#') { //结束标志

QChar c = opStack.pop ();

postFix.push_back (' '); //操作符之间用空格分开

postFix.push_back (c); //将栈中剩余的操作符添加到后缀表达式后面

}

qDebug() << postFix;

}

//计算后缀表达式

void MainWindow::evaluation ()

{

QString tmp;

QStack ans;

for (int i = ; i < postFix.size (); i++)

{

qDebug() << postFix[i] << i;

if (postFix[i].isDigit () || postFix[i] == '.')

tmp.push_back (postFix[i]);

else if (postFix[i] == ' ') { //相当于遇到一个操作符或者是括号

if (!tmp.isEmpty ())

{

ans.push (tmp.toDouble ());

tmp.clear ();

}

qDebug() << ans.top () << tmp.isEmpty ();

}

else { //遇到操作符,从栈中弹出两个数,进行计算,并将结果入栈

double a = , b = ;

switch (postFix[i].cell ()) {

case '!': a = ans.pop ();ans.push (Fac(a)); break;

case '+': a = ans.pop (); b = ans.pop ();

ans.push (b + a); break;

case '-': a = ans.pop (); b = ans.pop ();

ans.push (b - a); break; //应该是后弹出栈的-先弹出栈的

case '*': a = ans.pop (); b = ans.pop ();

ans.push (b * a); break;

case '/':a = ans.pop (); b = ans.pop ();

ans.push (b / a); break;

case '%': a = ans.pop (); b = ans.pop ();

ans.push ((int)b % (int)a); break;

case '^': a = ans.pop (); b = ans.pop ();

ans.push (Pow(b, a)); break;

default:

break;

}

qDebug() << ans.top () << "top";

}

}

ui->lineEdit->setText (QString::number (ans.top ()));

}

//全部代码见,百度云

链接: https://pan.baidu.com/s/1qXQKPTM 密码: qwfn

JS中 计算器的简单制作

今天学习的是JS中的if语句,除此之外老师还教给我们switch语句的用法, 我们用来写了简单计算器的算法,如下:

Java语言编写计算器(简单的计算器)

Java编写的一个简单计算器,本人还比较菜,只能这样了,有点代码冗余,不能连续计算. import javax.swing.*; import java.awt.*; import java.awt. ...

Android(java)学习笔记218:开发一个多界面的应用程序之人品计算器的简单实现

1.开启新的Activity的方法: (1)Intent 意图 (2)intent.setAction("自定义")  记得在清单文件中声明 (3)intent.setData(前 ...

Android(java)学习笔记161:开发一个多界面的应用程序之人品计算器的简单实现

1.开启新的Activity的方法: (1)Intent 意图 (2)intent.setAction("自定义")  记得在清单文件中声明 (3)intent.setData(前 ...

计蒜客:百度的科学计算器(简单)【python神解】

题目链接:https://nanti.jisuanke.com/t/15504 题解:python大法好啊,三行代码无人能敌啊! 下面给出AC代码: b=input() a=input() print ...

使用C&num;面向对象实现简易计算器(简单工厂模式)

操作流程: 1. 新建Operation类 2. 新建OperationAdd类,并继承Operation类 3. 新建OperationSub类,并继承Operation类 4. 新建Operati ...

【IOS开发笔记03-视图相关】简单计算器的实现

UIView 经过前几天的快速学习,我们初步了解的IOS开发的一些知识,中间因为拉的太急,忽略了很多基础知识点,这些知识点单独拿出来学习太过枯燥,我们在今后的项目中再逐步补齐,今天我们来学习APP视图 ...

JavaScript&plus;HTML&comma;简单的计算器实现

成功进化到程序猿快一年多了, 还没写过计算器, 正好今天比较闲,随手写了个计算器,最简单的实现,核心是eval()方法,把字符串作为JS代码处理,把输入的信息拼接成字符串,点等号执行代码得到结果,出异 ...

Vue学习之路第十篇:简单计算器的实现

前面九篇讲解了vue的一些基础知识,正所谓:学以致用,今天我们将用前九篇的基础知识,来模拟实现计算器的简单功能,项目价值不高,纯粹是为了加深掌握所学知识. 学前准备: 需要掌握JavaScript的e ...

随机推荐

STL源码分析----神奇的 list 的 sort 算法实现

STL中有一个std::sort算法,但它是不支持std::list的,因为list不提供RandomIterator的支持,但list自己提供了sort算法,把list的元素按从小到大的方式来排序, ...

编程算法基础-数字数码管-隐藏password

作业 数字数码管 个数码管) @@@@         0     @          @       1   2     @          @         3        @@@@    ...

Android Topeka介绍

概述 当你已经做Android开发一段时间,并苦于进入瓶颈,这个时候阅读一些优秀App的源码是最好的学习进阶方式,前几天,邀请去参加一个Android大会,我作为其中一个演讲者,专门讲解了Androi ...

Exchange-重建见证服务器和目录

问题描述: 在升级Exchange 2013 CU22检查群集节点状态的过程中发现群集组处于失败状态,具体报错信息如下:警告:数据库可用性组"***"见证处于失败状态.数据库可用性 ...

java 注意事项---避免踩坑

1.......对象参数接收不能大写

log4j 配置日志输出(log4j&period;properties)

轉: https://blog.csdn.net/qq_29166327/article/details/80467593 一.入门log4j实例 1.1 下载解压log4j.jar(地址:http: ...

iOS - User Agent 的应用和设置

UA在项目中的应用 给项目的webview或项目中的接口请求加一个区分,用来区别是iOS端访问.android访问还是在浏览器访问的,这时需要添加User Agent (http请求 header中的 ...

高斯—若尔当(约当)消元法解异或方程组&plus;bitset优化模板

高斯消元法是将矩阵化为上三角矩阵 高斯—若尔当消元法是 选定主元后,将主元化为1,枚举除主元之外的所有行进行消元 即将矩阵化为对角矩阵,这样不用回代 bitseta[N]; int ...

【Python】【问题集锦】

1. 用pycharm安装第三方包失败,报类似于“sort"的错误,就转战终端 2. Mac终端安装第三包失败,报类似于“ PermissionError: [Errno 13] Permi ...

微信小程序横版日历,tab栏

代码地址如下:http://www.demodashi.com/demo/14243.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.co ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值