qt_计算器的简单实现

//阶乘不知道怎么实现不了/(ㄒoㄒ)/~~,以后慢慢调试吧.........

 1  2 //转换为后缀表达式,实现最主要功能
 3 void MainWindow::toPostfix ()
 4 {
 5     QString exp = ui->lineEdit->text ();
 6     //QString exp = "0.3/(5*2+1)", postfix;
 7
 8     QString tmp = exp;
 9
10     int j;
11     //如果只有单个数字时
12     for (j = 0; j < tmp.size () && (tmp[j].isDigit () || tmp[j] == ‘.‘); j++) {
13         postFix.push_back (tmp[j]);
14     }
15     if (j == tmp.size ()) {
16         postFix.push_back (‘ ‘);
17         return;
18     }
19     postFix.clear ();
20
21     for (int i = 0; i < exp.size (); i++)
22     {
23         qDebug() << i << exp[i];
24         if (exp[i].isDigit () || exp[i] == ‘.‘) {//为数字或者小数点
25             postFix.push_back (exp[i]);          //直接添加到后缀表达式后面
26         }
27         else if (exp[i] == ‘(‘) {                //入操作符栈
28             opStack.push (exp[i]);
29         }
30         else if (exp[i] == ‘)‘) {                //遇到右括号,就转换成空格添加到后缀表达式中
31             postFix.push_back (‘ ‘);
32             while (opStack.top () != ‘(‘)
33             {
34                 //只要遇到右括号,则在操作符栈中将栈顶下一次出现‘(‘前的操作符全部依次添加到后缀表达式后面
35                 //因为进栈的时候,是栈顶操作符优先级低;所以出栈的时候,优先级高->低依次添加到后缀表达式后
36                 postFix.push_back (opStack.pop ());
37                 qDebug() << postFix;
38             }
39             opStack.pop ();                     //遇到右括号一次,左括号也相应少一次
40         }
41         //运算符比栈顶的优先级高时,入栈顶
42         else if (getLevel (exp[i]) > getLevel (opStack.top ()))
43         {
44             //将操作符和操作数用空格分开
45             postFix.push_back (‘ ‘);
46             opStack.push (exp[i]);
47         }
48         else {
49             postFix.push_back (‘ ‘); qDebug() << postFix;
50             //当操作符比栈顶的操作符优先级低时,从栈顶(弹出)pop()运算符,添加到后缀表达式中
51             while (getLevel (exp[i]) <= getLevel (opStack.top ()))
52                 postFix.push_back (opStack.pop ());
53             opStack.push (exp[i]);      //栈顶优先级低则,入栈
54         }
55     }
56     while (opStack.top () != ‘#‘) {    //结束标志
57         QChar c = opStack.pop ();
58         postFix.push_back (‘ ‘);       //操作符之间用空格分开
59         postFix.push_back (c);         //将栈中剩余的操作符添加到后缀表达式后面
60     }
61     qDebug() << postFix;
62 }
 1 //计算后缀表达式
 2
 3 void MainWindow::evaluation ()
 4 {
 5     QString tmp;
 6     QStack<double> ans;
 7
 8     for (int i = 0; i < postFix.size (); i++)
 9     {
10         qDebug() << postFix[i] << i;
11         if (postFix[i].isDigit () || postFix[i] == ‘.‘)
12             tmp.push_back (postFix[i]);
13         else if (postFix[i] == ‘ ‘) {      //相当于遇到一个操作符或者是括号
14             if (!tmp.isEmpty ())
15             {
16                 ans.push (tmp.toDouble ());
17                 tmp.clear ();
18             }
19             qDebug() << ans.top () << tmp.isEmpty ();
20         }
21         else {       //遇到操作符,从栈中弹出两个数,进行计算,并将结果入栈
22             double a = 0, b = 0;
23             switch (postFix[i].cell ()) {
24             case ‘!‘: a = ans.pop ();ans.push (Fac(a)); break;
25
26             case ‘+‘: a = ans.pop (); b = ans.pop ();
27                       ans.push (b + a); break;
28
29             case ‘-‘: a = ans.pop (); b = ans.pop ();
30                       ans.push (b - a); break; //应该是后弹出栈的-先弹出栈的
31
32             case ‘*‘: a = ans.pop (); b = ans.pop ();
33                       ans.push (b * a); break;
34             case ‘/‘:a = ans.pop (); b = ans.pop ();
35                      ans.push (b / a); break;
36
37             case ‘%‘: a = ans.pop (); b = ans.pop ();
38                       ans.push ((int)b % (int)a); break;
39
40             case ‘^‘: a = ans.pop (); b = ans.pop ();
41                       ans.push (Pow(b, a)); break;
42             default:
43                 break;
44             }
45             qDebug() << ans.top () << "top";
46         }
47     }
48     ui->lineEdit->setText (QString::number (ans.top ()));
49 }

//全部代码见,百度云

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

时间: 2024-11-13 03:54:58

qt_计算器的简单实现的相关文章

24点游戏计算器 (简单四则运算)(c++)

24点游戏计算器 (简单四则运算)(c++):https://github.com/liuxinig/cpp_1001/blob/master/24dian_siZeIN.txt 1 //24点统计 2 3 #include <iostream> 4 #include <cmath> 5 using namespace std; 6 #define N 14 7 //a数组存四个数字 8 int cixu[3],fuHao[3],p[N],sum = 0; 9 float a0[4

2017计蒜之道 初赛 第二场 百度的科学计算器(简单)

/** 题目:2017计蒜之道 初赛 第二场 百度的科学计算器(简单) 链接:https://nanti.jisuanke.com/t/15504 题意:给一个合法的表达式,包含加号+.减号-.括号().数字常量,表达式中没有空格. 输入数据保证数字常量以及计算过程中数值绝对值均不超过 10^12??,对于浮点型数值常量,保证小数点后不超过 666 位. 思路:暴力模拟:python有函数可以直接调用. 坑点:如果表达式中出现过浮点数,那么输出结果保留6位小数, 否则输出整数,不出现小数. */

百度的科学计算器(简单)

今年,百度的科学计算器进行了重大更新,可以计算更为复杂的表达式了. 定义表达式中存在加减运算.括号.函数调用.强制类型转换这几种运算.其中数值的类型有整型与浮点型两种.并且, 整型与整型加减运算的结果为整型: 整型与浮点型加减运算结果为浮点型: 浮点型与浮点型加减运算结果为浮点型. 强制类型转换符 包括int(x)与float(x),其中float(x)运算符可以将数值x的类型强制转为浮点型,int(x)运算符可以将数值x的类型强制转为整型.对于浮点型转整型,采用截尾法,例如:int(1.6)=

JS中 计算器的简单制作

今天学习的是JS中的if语句,除此之外老师还教给我们switch语句的用法, 我们用来写了简单计算器的算法,如下: <script> var a=prompt("请输入一个数字") var a=parseInt(a) if(!isNaN(a)) { var b=prompt("请输入一个数字") var b=parseInt(b) if(!isNaN(b)) { var c=prompt("请输入加减乘除运算中的一种") switch

计算器的简单编写,熟悉访问器,重载

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace 计算器 { public partial class

计算器的简单实现

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>计算器</title> <style id="jsbin-css"> div,span{ margin:0;padding:0; font-weight:bold; font: bold 16px Arial, sans-seri

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

UIView 经过前几天的快速学习,我们初步了解的IOS开发的一些知识,中间因为拉的太急,忽略了很多基础知识点,这些知识点单独拿出来学习太过枯燥,我们在今后的项目中再逐步补齐,今天我们来学习APP视图相关知识. 视图即UIView对象,我们上次用的按钮UIButton.UILabel或者UITableView皆是其子类:视图知道如何绘制自己与前端一致有一个层次的概念. 任何一个应用都会有一个UIWindow对象,与浏览器对象一致,他作为容器角色而存在,负责装载所有的视图控件,每个加入的视图便是一

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

前面九篇讲解了vue的一些基础知识,正所谓:学以致用,今天我们将用前九篇的基础知识,来模拟实现计算器的简单功能,项目价值不高,纯粹是为了加深掌握所学知识. 学前准备: 需要掌握JavaScript的eval()函数,其主要是用来计算某个字符串,并执行其中的 JavaScript 代码. 直接上代码(vue.min.js 第一篇有下载链接): <!DOCTYPE html> <html lang="en"> <head> <meta charse

python3.5 + PyQt5 +Eric6 实现的一个计算器

目前可以实现简单的计算.计算前请重置,设计的时候默认数字是0,学了半天就做出来个这么个结果,bug不少. python3.5 + PyQt5 +Eric6 在windows7 32位系统可以完美运行 计算器,简单学了半天就画个图实现的存在bug,部分按钮还未实现,后续优化. 代码结构如图: 1 jisuan.py 2 import re 3 #匹配整数或小数的乘除法,包括了开头存在减号的情况 4 mul_div=re.compile("(-?\d+)(\.\d+)?(\*|/)(-?\d+)(\