参考文献:Qt 5.9 C++开发指南 (王维波等 著)及众多网上资料

1.问题定义及需求分析

课题目的:

由输入的四则算术表达式字符串,动态生成算术表达式所对应的后缀式,通过后缀式求值并输出;

输出的形式:界面上:以QT中的Text Browser进行输出结果。后台:通过suffix文件输出表达式的后缀表达式。

程序的功能:在布局和功能上,我们以小米内置计算器为标准。在运算上:我们实现了三角函数,反三角函数,次方,根号,ln,log,1/x,阶乘的在允许括号和简写的复合运算。在输出上:我们实现了退格,多次运算换行输出,一次ac一次运算的功能。

测试数据:通过图形界面输入多个表达式,多次操作检验每个按钮的功能。

2.概要设计

抽象数据类型的定义:起初我们通过数组实现了一个char-stack,实现pop,push,top操作。

主程序的流程:创造图形界面,打开文件suffix,通过pushbutoon进行交互,输出结果。

各程序模块之间的调用关系:main函数里调用qt内置的图形界面创建程序,接着在图形界面的模块上(我们采用了dialog为基础窗口)调用我们自己写bds_qz.h模块。

3.详细设计

3.1.图形界面的设计:我们通过QT的designer设计模式设计了像小米内置计算器的界面。

3.2. 运算算法:我们参考了网上的四则运算的算法,但同时又进行了一些自己的创新。

首先,我们处理的是一个中缀运算表达式,我们从左向右开始遍历,分为运算符和数字的判断。

数字的判断及存储:

存储:我们没有采取栈的结构,我们用了一个double数组加一个int numpos代表最前面的数字位置,实现存储和增减操作。
代码:double num[50] ;int numpos = 0;

判断:整数部分:碰到一个数字则往后遍历找直到不为数字,期间遍历的字符通过ASCII码值减去0的ASCII码值映射,再通过10为基的乘法映射求出整数。

小数部分:在遍历完整数部分后,立即判断后面有没有小数点,如果有以整数的方法不过以0.1为基求出小数部分。

符号部分:当我们遍历时碰到第一个数字立即往前找前面是不是(——,如果是则在最终转化完后乘以负一。

数字特殊情况分为π和e,π和e则采用了判断等效替代的方法(如如果按了π按钮,则用3.1415926代替)。

代码:if (bds[i] <= '9'&&bds[i] >= '0')//为数字的情况,转换为1个数,如234

{

num[++numpos] = 0;

while (bds[i] <= '9'&&bds[i] >= '0')

{

num[numpos] *= 10;

num[numpos] += (bds[i] - '0');

++i;

}

if (bds[i] == '.')

{

double f_car=0.1;//定义基数

++i;

while (bds[i] <= '9'&&bds[i] >= '0')

{

num[numpos] += ((bds[i] - '0')*f_car);

f_car *= 0.1;

++i;

}

}//计算小数点

else if(bds[i]=='('&&bds[i+1]=='-')

{

i+=2;

num[++numpos] = 0;

while (bds[i] <= '9'&&bds[i] >= '0')

{

num[numpos] *= 10;

num[numpos] += (bds[i] - '0');

++i;

}

if (bds[i] == '.')

{

double f_car=0.1;//定义基数

++i;

while (bds[i] <= '9'&&bds[i] >= '0')

{

num[numpos] += ((bds[i] - '0')*f_car);

f_car *= 0.1;

++i;

}

}//计算小数点

num[numpos]*=-1;

suffix<<num[numpos]<<' ';

i+=1;

}//

else if(bds[i]=='p')

{

num[++numpos]=3.14159265358;

suffix<<"Π"<<' ';

++i;

}

else if(bds[i]=='e')

{

num[++numpos]=2.71828182845;

suffix<<'e'<<' ';

++i;

}

运算符的判断,映射,存储,操作,:

判断:不为数字且不为括号且不为π和e及负号。

映射:因为有的操作运算符比如ln,log等,它不如+-等占一个字节,但我们遍历时一个个字节遍历字符串的,所以我们采用了映射技术。

代码:std::string char_change(char s)

{

if(s=='*')

return "x";

else if(s=='/')

return  "÷";

else if(s=='n')

return  "ln";

else if(s=='g')

return  "lg";

else if(s=='p')

return "Π";

else if(s=='s')

return  "sin";

else if(s=='c')

return  "cos";

else if(s=='t')

return  "tan";

else if(s=='a')

return  "arcsin";

else if(s=='b')

return  "arccos";

else if(s=='d')

return  "arctan";

else if(s=='\n')

return "\r\n";

else if(s=='u')

return  "°";

else

{

std::string ss(1,s);

return ss;

}

}

存储:采取栈的结构。

       代码:char pop(stack *p)

{

if (p->size == 0)

{

printf("空栈");

return '\0';//抛出/0字符代表空

}

else

{

--(p->size);

return p->a[p->size];

}

}

char top(stack *p)

{

if (p->size == 0)

return '\0';//抛出/0字符代表空

else

{

return p->a[p->size - 1];

}

}

int empty(stack *p)

{

return p->size==0;

}

void push(stack *p, char b)

{

p->a[p->size] = b;

++p->size;

}

操作:对于一个运算符,我们先判断栈是否为空,为空直接入栈,如果栈不为空,我们则通过一个优先级函数分别求出栈顶运算符的优先级,和当前运算符的优先级,并将他们进行比较。如果栈顶的元素优先级大于等于当前运算符,执行出栈操作,直到栈为空或者栈顶元素优先级小于当前运算符,后将当前运算符入栈。注意的是()会改变运算顺序,我们只将(入栈,如果碰到)就将左括号到栈顶的元素全部弹出。

出栈操作代码:else

{

if (empty(ysf))//栈为空的情况

push(ysf, bds[i]);

else

{

if (bds[i] == '(')

push(ysf, bds[i]);

else if (bds[i] == ')')//右括号的情况

{

while (top(ysf) != '(')

{

operat(num,numpos,top(ysf));//调用对数据运算的函数

suffix<<char_change(top(ysf))<<' ';

pop(ysf);

}

pop(ysf);//弹出右括号

}

else

{

while (compare(bds[i])<=compare(top(ysf)))//优先级映射函数

{

operat(num,numpos,top(ysf));

suffix<<char_change(top(ysf))<<' ';

pop(ysf);

}

push(ysf, bds[i]);

}

}

++i;

}

}

while (!empty(ysf))//最后的出栈

{

operat(num,numpos,top(ysf));

suffix<<char_change(top(ysf))<<' ';

pop(ysf);

}

优先级函数代码:int compare(char a)//用于比较优先级

{

int i;

switch (a)

{

case '+':

i = 1;

break;

case '-':

i = 1;

break;

case '*':

i = 2;

break;

case '/':

i = 2;

break;

case '^':

i = 3;

break;

case 'v':

i =4;

break;

case 's':

i =4;

break;

case 'c':

i =4;

break;

case 't':

i =4;

break;

case 'g':

i =4;

break;

case 'n':

i =4;

break;

case 'a':

i =4;

break;

case 'b':

i =4;

break;

case 'd':

i =4;

break;

case '!':

i =5;

break;

case '%':

i = 5;

break;

case 'u':

i = 9;

break;

default:

i = 0;

break;

}

return i;

}

数字运算代码:void merge(double *a, double b, char c)//用于将两数字合并,注意前面的数字传地址

{

if (c == '-')

{

(*a) -= b;

}

else if (c == '+')

{

(*a) += b;

}

else if (c == '*')

{

(*a) *= b;

}

else if(c=='/')

(*a) /= b;

else if(c=='^')

{*a=pow(*a,b);}

}

void operat(double *num,int &numpos,char c)

{

if (c == '%')

{

num[numpos] /= 100;

}

else if(c=='v')

{

num[numpos] = sqrt(num[numpos]);

}

else if(c=='g')

{

num[numpos] = log10(num[numpos]);

}

else if(c=='n')

{

num[numpos] = log1p(num[numpos]-1);

}

else if(c=='s')

{

num[numpos] = sin(num[numpos]);

}

else if(c=='a')

{

num[numpos] = asin(num[numpos]);

}

else if(c=='c')

{

num[numpos] = cos(num[numpos]);

}

else if(c=='b')

{

num[numpos] = acos(num[numpos]);

}

else if(c=='t')

{

num[numpos] = tan(num[numpos]);

}

else if(c=='d')

{

num[numpos] = atan(num[numpos]);

}

else if(c=='u')

{

num[numpos] = num[numpos]*3.14159265358/180;

}

else if (c == '!')

{

long sum=1;

int nums=num[numpos];

for(int i=2;i<=nums;++i)

{

sum*=i;

}

num[numpos] =sum;

}

else

{

merge(&num[numpos - 1], num[numpos], c);

--numpos;

}

}

4.调试分析:

4.1对所遇问题的解决方法及分析:

碰到的问题和改进较多。

首先输出框上:

例如√运算符,我希望在在输出框显示根号,但QString确实写入了√,但在insetrhtml时,却加载不进去,迫不得已如图 我们显示了用v代替了√。

还有就是换行ac,因为实际在使用小米计算器时,它的ac时,一次ac一条运算。还有退格运算,你要让它可以退格当前运算,而不影响前一次运算。这其中就涉及了一些字符串的处理,还有QString和string还有char*(因为我们最初写的四则运算是纯C的)转换,花了一些时间。

运算功能上:

第一张图为小米的,第二张为我们,仔细对比会发现,小米上是有deg和rad这个按钮的,即它可以通过一个按钮,来调整运算是采用弧度制还是角度制。而且它的文本框,还要随del和ac时改变。考虑到开发难度,我们的创新就是添加一个新的运算符°(它拥有最高的优先级,将一个数➗π*180),实现了相同的功能。

其次就是小米的计算器是实时运算的,既不用按=也会计算结果,但我们这个不是,我们放弃了这个功能,因为如果这样,就必须实时调用函数,而不是按一次=调用(占用了更多的资源),而且我们没有非法检测,如果中途表达式错了(如sin(90°+1)!)我们无法检验出错,故放弃了。

额外:还有一个问题就是发布程序的问题,希望自己写的东西在别人的电脑也能运行。起初单纯的一位按照release编译就行,然后 ,经过上网查阅,我们知道是程序的依赖关系的问题,它缺乏相应的dll,而且吧因为QT装的是VS的编译器,还需要msvc的dll。在经历了诸多查阅和实践后,我们解决了这个问题,也让我们意识到程序的发布其实也是一个复杂的问题。

4.2算法的时空分析及改进思想

由于算法分为了很多部分,对于一次=运算核心部分是遍历一遍表达式字符数组复杂度为O(n)。但在循环里面,涉及一层while循环的出栈操作,不过仔细分析,每个运算符入栈和出栈操作是唯一的,即它们的复杂度一定小于O(2n),故一次=运算总复杂度为O(n)。

整个程序的复杂度将是你执行运算的次数*O(n)。

QT版:

控制台四则运算版:

7.附录

Main.c

#include "dialog.h"

#include <QApplication>

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

Dialog w;

w.show();

return a.exec();

}

bds_qz.h

#ifndef BDS_QZ_H

#define BDS_QZ_H

#include<string>

#include<sstream>

#include <stdio.h>

#include <stdlib.h>

#include<cmath>

#include<fstream>

#define n 50

typedef struct

{

char a[n];

int size;//表示栈中含有的元素数量

} stack;

char pop(stack *p);

char top(stack *p);

int empty(stack *p);

void push(stack *p, char b);

int compare(char a);//用于比较优先级

void merge(double *a, double b, char c);//用于将两数字合并,注意前面的数字传地址

std::string qiuzhi(const char *bds);

std::string char_change(char s);

#endif // BDS_QZ_H

bds_qz.cpp

#include"bds_qz.h"

char pop(stack *p)

{

if (p->size == 0)

{

printf("空栈");

return '\0';//抛出/0字符代表空

}

else

{

--(p->size);

return p->a[p->size];

}

}

char top(stack *p)

{

if (p->size == 0)

return '\0';//抛出/0字符代表空

else

{

return p->a[p->size - 1];

}

}

int empty(stack *p)

{

return p->size==0;

}

void push(stack *p, char b)

{

p->a[p->size] = b;

++p->size;

}

int compare(char a)//用于比较优先级

{

int i;

switch (a)

{

case '+':

i = 1;

break;

case '-':

i = 1;

break;

case '*':

i = 2;

break;

case '/':

i = 2;

break;

case '^':

i = 3;

break;

case 'v':

i =4;

break;

case 's':

i =4;

break;

case 'c':

i =4;

break;

case 't':

i =4;

break;

case 'g':

i =4;

break;

case 'n':

i =4;

break;

case 'a':

i =4;

break;

case 'b':

i =4;

break;

case 'd':

i =4;

break;

case '!':

i =5;

break;

case '%':

i = 5;

break;

case 'u':

i = 9;

break;

default:

i = 0;

break;

}

return i;

}

std::string char_change(char s)

{

if(s=='*')

return "x";

else if(s=='/')

return  "÷";

else if(s=='n')

return  "ln";

else if(s=='g')

return  "lg";

else if(s=='p')

return "Π";

else if(s=='s')

return  "sin";

else if(s=='c')

return  "cos";

else if(s=='t')

return  "tan";

else if(s=='a')

return  "arcsin";

else if(s=='b')

return  "arccos";

else if(s=='d')

return  "arctan";

else if(s=='\n')

return "\r\n";

else if(s=='u')

return  "°";

else

{

std::string ss(1,s);

return ss;

}

}

void merge(double *a, double b, char c)//用于将两数字合并,注意前面的数字传地址

{

if (c == '-')

{

(*a) -= b;

}

else if (c == '+')

{

(*a) += b;

}

else if (c == '*')

{

(*a) *= b;

}

else if(c=='/')

(*a) /= b;

else if(c=='^')

{*a=pow(*a,b);}

}

void operat(double *num,int &numpos,char c)

{

if (c == '%')

{

num[numpos] /= 100;

}

else if(c=='v')

{

num[numpos] = sqrt(num[numpos]);

}

else if(c=='g')

{

num[numpos] = log10(num[numpos]);

}

else if(c=='n')

{

num[numpos] = log1p(num[numpos]-1);

}

else if(c=='s')

{

num[numpos] = sin(num[numpos]);

}

else if(c=='a')

{

num[numpos] = asin(num[numpos]);

}

else if(c=='c')

{

num[numpos] = cos(num[numpos]);

}

else if(c=='b')

{

num[numpos] = acos(num[numpos]);

}

else if(c=='t')

{

num[numpos] = tan(num[numpos]);

}

else if(c=='d')

{

num[numpos] = atan(num[numpos]);

}

else if(c=='u')

{

num[numpos] = num[numpos]*3.14159265358/180;

}

else if (c == '!')

{

long sum=1;

int nums=num[numpos];

for(int i=2;i<=nums;++i)

{

sum*=i;

}

num[numpos] =sum;

}

else

{

merge(&num[numpos - 1], num[numpos], c);

--numpos;

}

}

std::string qiuzhi(const char *bds)

{

std::ofstream suffix;

suffix.open("suffix.txt",std::ios::out|std::ios::binary|std::ios::app);

int i = 0;

stack *ysf = (stack*)malloc(sizeof(stack));//为表达式开辟一个stack

ysf->size = 0;

double num[50] ;//用于求值的数组

int numpos = 0;//用于求值的数组位置//ps因为num这个栈用的操作非常的少,而stack没有泛化,所以没有采用栈

while (bds[i] != '=')

{

if (bds[i] <= '9'&&bds[i] >= '0')//为数字的情况,转换为1个数,如234

{

num[++numpos] = 0;

while (bds[i] <= '9'&&bds[i] >= '0')

{

num[numpos] *= 10;

num[numpos] += (bds[i] - '0');

++i;

}

if (bds[i] == '.')

{

double f_car=0.1;//定义基数

++i;

while (bds[i] <= '9'&&bds[i] >= '0')

{

num[numpos] += ((bds[i] - '0')*f_car);

f_car *= 0.1;

++i;

}

}//计算小数点

suffix<<num[numpos]<<' ';

}

else if(bds[i]=='('&&bds[i+1]=='-')

{

i+=2;

num[++numpos] = 0;

while (bds[i] <= '9'&&bds[i] >= '0')

{

num[numpos] *= 10;

num[numpos] += (bds[i] - '0');

++i;

}

if (bds[i] == '.')

{

double f_car=0.1;//定义基数

++i;

while (bds[i] <= '9'&&bds[i] >= '0')

{

num[numpos] += ((bds[i] - '0')*f_car);

f_car *= 0.1;

++i;

}

}//计算小数点

num[numpos]*=-1;

suffix<<num[numpos]<<' ';

i+=1;

}//

else if(bds[i]=='p')

{

num[++numpos]=3.14159265358;

suffix<<"Π"<<' ';

++i;

}

else if(bds[i]=='e')

{

num[++numpos]=2.71828182845;

suffix<<'e'<<' ';

++i;

}

else

{

if (empty(ysf))//栈为空的情况

push(ysf, bds[i]);

else

{

if (bds[i] == '(')

push(ysf, bds[i]);

else if (bds[i] == ')')//右括号的情况

{

while (top(ysf) != '(')

{

operat(num,numpos,top(ysf));//调用对数据运算的函数

suffix<<char_change(top(ysf))<<' ';

pop(ysf);

}

pop(ysf);//弹出右括号

}

else

{

while (compare(bds[i])<=compare(top(ysf)))//优先级映射函数

{

operat(num,numpos,top(ysf));

suffix<<char_change(top(ysf))<<' ';

pop(ysf);

}

push(ysf, bds[i]);

}

}

++i;

}

}

while (!empty(ysf))//最后的出栈

{

operat(num,numpos,top(ysf));

suffix<<char_change(top(ysf))<<' ';

pop(ysf);

}

suffix<<'\n';

suffix.close();

std::stringstream ss;

ss<<num[1];

free (ysf);

return ss.str();

}

dialog.h

  #ifndef DIALOG_H

#define DIALOG_H

#include <QDialog>

#include<string>

namespace Ui {

class Dialog;

}

class Dialog : public QDialog

{

Q_OBJECT

std::string bds;//用于运算的bds

QString out_bds;//用于输出的bds

public:

void init_();//对图形界面预处理

explicit Dialog(QWidget *parent = nullptr);

QString string_change(std::string s);//把表达式转化为输出的表达式

~Dialog();

private slots:

void on_pushButton_sin_clicked();

void on_pushButton_2nd_clicked();

void on_pushButton_rad_clicked();

void on_pushButton_cos_clicked();

void on_pushButton_tan_clicked();

void on_pushButton_pow_clicked();

void on_pushButton_lg_clicked();

void on_pushButton_left_clicked();

void on_pushButton_ln_clicked();

void on_pushButton_right_clicked();

void on_pushButton_sqrt_clicked();

void on_pushButton_ac_clicked();

void on_pushButton_del_clicked();

void on_pushButton_div_clicked();

void on_pushButton_mul_clicked();

void on_pushButton_fac_clicked();

void on_pushButton_num7_clicked();

void on_pushButton_num8_clicked();

void on_pushButton_num9_clicked();

void on_pushButton_sub_clicked();

void on_pushButton_rec_clicked();

void on_pushButton_num4_clicked();

void on_pushButton_num5_clicked();

void on_pushButton_num6_clicked();

void on_pushButton_add_clicked();

void on_pushButton_pi_clicked();

void on_pushButton_num1_clicked();

void on_pushButton_num2_clicked();

void on_pushButton_num3_clicked();

void on_pushButton_equal_clicked();

void on_pushButton_e_clicked();

void on_pushButton_per_clicked();

void on_pushButton_num0_clicked();

void on_pushButton_point_clicked();

void on_textBrowser_textChanged();

private:

Ui::Dialog *ui;

};

#endif // DIALOG_H

dialog.cpp

#include "dialog.h"

#include "ui_dialog.h"

#include<bds_qz.h>

Dialog::Dialog(QWidget *parent) :

QDialog(parent),

ui(new Ui::Dialog)

{

ui->setupUi(this);

init_();

}

Dialog::~Dialog()

{

delete ui;

}

void Dialog::init_()

{//ui->textBrowser->setStyleSheet("QTextBrowser{border-width:0;border-style:outset}");

ui->textBrowser->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

ui->textBrowser->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//关闭滚动条

// ui->pushButton_2nd->setFlat(true);

}

QString Dialog:: string_change(std::string s)

{

int i=0;

std:: string new_bds;

while(s[i]!='\0')

{

new_bds+=char_change(s[i]);

++i;

}

QString qn_bds=QString(QString::fromLocal8Bit(new_bds.c_str()));

return qn_bds;

}

void Dialog::on_pushButton_sin_clicked()

{

if(ui->pushButton_sin->text()=="sin")

{ bds+='s';

ui->textBrowser->insertHtml("sin");}

else

{

bds+='a';

ui->textBrowser->insertHtml("arcsin");}

}

void Dialog::on_pushButton_2nd_clicked()

{

if(ui->pushButton_sin->text()=="sin")

{ui->pushButton_sin->setText("arcsin");

ui->pushButton_cos->setText("arccos");

ui->pushButton_tan->setText("arctan");

}

else

{

ui->pushButton_sin->setText("sin");

ui->pushButton_cos->setText("cos");

ui->pushButton_tan->setText("tan");

}

}

void Dialog::on_pushButton_rad_clicked()

{

bds+='u';

QString str = QString::fromLocal8Bit("°");//为了显示中文的°

ui->textBrowser->insertHtml(str);

}

void Dialog::on_pushButton_cos_clicked()

{

if(ui->pushButton_sin->text()=="sin")

{ bds+='c';

ui->textBrowser->insertHtml("cos");}

else

{

bds+='b';

ui->textBrowser->insertHtml("arccos");}

}

void Dialog::on_pushButton_tan_clicked()

{

if(ui->pushButton_sin->text()=="sin")

{ bds+='t';

ui->textBrowser->insertHtml("tan");}

else

{

bds+='d';

ui->textBrowser->insertHtml("arctan");}

}

void Dialog::on_pushButton_pow_clicked()

{

bds+='^';

ui->textBrowser->insertHtml("^");

}

void Dialog::on_pushButton_lg_clicked()

{

bds+='g';

ui->textBrowser->insertHtml("lg");

}

void Dialog::on_pushButton_left_clicked()

{

bds+='(';

ui->textBrowser->insertHtml("(");

}

void Dialog::on_pushButton_ln_clicked()

{

bds+='n';

ui->textBrowser->insertHtml("ln");

}

void Dialog::on_pushButton_right_clicked()

{

bds+='c';

ui->textBrowser->insertHtml("cos");

}

void Dialog::on_pushButton_sqrt_clicked()

{

bds+='v';

QString str = QString::fromLocal8Bit("√");

ui->textBrowser->insertHtml(str);

}

void Dialog::on_pushButton_ac_clicked()

{

if(!bds.empty())

{ int  star=0;

if(bds[bds.length()-1]!='\n')//如果不是下一行的话

{for(int i=0;bds[i]!='\0';++i)

{if(bds[i]=='\n')

star=i+1;}}

else

{  for(int i=0;bds[i]!='\r';++i)

if(bds[i]=='\n')

star=i+1;   }

bds.erase(star);

QString s=string_change(bds);

ui->textBrowser->setPlainText(s);}

}

void Dialog::on_pushButton_del_clicked()

{

if(!bds.empty())

{ int bds_end=bds.length()-1;

if(bds[bds_end]!='\n')

bds.erase(bds.length()-1);//如果不是上一行的话就删除一个字符

//QString s= QString::fromStdString(bds);

QString s=string_change(bds);

ui->textBrowser->setPlainText(s);}

}

void Dialog::on_pushButton_div_clicked()

{

bds+='/';

QString str = QString::fromLocal8Bit("÷");

ui->textBrowser->insertHtml(str);

}

void Dialog::on_pushButton_mul_clicked()

{

bds+='*';

QString str = QString::fromLocal8Bit("x");

ui->textBrowser->insertHtml(str);

}

void Dialog::on_pushButton_fac_clicked()

{

bds+='!';

ui->textBrowser->insertHtml("!");

}

void Dialog::on_pushButton_num7_clicked()

{

bds+='7';

ui->textBrowser->insertHtml("7");

}

void Dialog::on_pushButton_num8_clicked()

{

bds+='8';

ui->textBrowser->insertHtml("8");

}

void Dialog::on_pushButton_num9_clicked()

{

bds+='9';

ui->textBrowser->insertHtml("9");

}

void Dialog::on_pushButton_sub_clicked()

{

bds+='-';

ui->textBrowser->insertHtml("-");

}

void Dialog::on_pushButton_rec_clicked()

{

bds+="^(-1)";

ui->textBrowser->insertHtml("^(-1)");

}

void Dialog::on_pushButton_num4_clicked()

{

bds+='4';

ui->textBrowser->insertHtml("4");

}

void Dialog::on_pushButton_num5_clicked()

{

bds+='5';

ui->textBrowser->insertHtml("5");

}

void Dialog::on_pushButton_num6_clicked()

{

bds+='6';

ui->textBrowser->insertHtml("6");

}

void Dialog::on_pushButton_add_clicked()

{

bds+='+';

ui->textBrowser->insertHtml("+");

}

void Dialog::on_pushButton_pi_clicked()

{

bds+='p';

ui->textBrowser->insertHtml("Π");

}

void Dialog::on_pushButton_num1_clicked()

{

bds+='1';

ui->textBrowser->insertHtml("1");

}

void Dialog::on_pushButton_num2_clicked()

{

bds+='2';

ui->textBrowser->insertHtml("2");

}

void Dialog::on_pushButton_num3_clicked()

{

bds+='3';

ui->textBrowser->insertHtml("3");

}

void Dialog::on_pushButton_equal_clicked()

{

bds+='=';

const char *c_bds=bds.data();

std::string result=qiuzhi(c_bds);

bds+=result;

bds+="\r\n";

bds+=result;

QString qresult=QString::fromStdString(result);

ui->textBrowser->insertHtml("=");

ui->textBrowser->insertHtml(qresult);

ui->textBrowser->insertHtml("<br>");

ui->textBrowser->insertHtml(qresult);

}

void Dialog::on_pushButton_e_clicked()

{

bds+='e';

ui->textBrowser->insertHtml("e");

}

void Dialog::on_pushButton_per_clicked()

{

bds+='%';

ui->textBrowser->insertHtml("%");

}

void Dialog::on_pushButton_num0_clicked()

{

bds+='0';

ui->textBrowser->insertHtml("0");

}

void Dialog::on_pushButton_point_clicked()

{

bds+='.';

ui->textBrowser->insertHtml(".");

}

void Dialog::on_textBrowser_textChanged()

{

ui->textBrowser->moveCursor(QTextCursor::End);

}

基于QT实现的计算器(只需要简单的栈知识,不仅仅是四则运算,接近手机内置计算器功能)相关推荐

  1. win10计算器rsh_Win10 内置计算器评测:PowerShell 很靠谱

    计算器几乎是每个操作系统都具备的工具,不管是手机还是电脑,很多人都离不开它.然而这些系统内置计算器标准模式往往功能比较简单,基本上只用于单步运算,就像传统计算器那样,现在的Win10计算器也是如此.不 ...

  2. 十进制转化为二进制_使用Windows 10内置计算器,将十进制数快速转换为二进制数,试试...

    首先简单介绍Windows 10操作系统及其内置计算器,Windows 10是由美国微软公司开发的应用于计算机和平板电脑的操作系统,于2015年7月29日发布正式版.Windows 10操作系统在易用 ...

  3. 别傻了!不能只会给别人开热点,要尝试华为手机的WiFi分享功能

    别傻了!不能只会给别人开热点,要尝试华为手机的WiFi分享功能 当大家跟小伙伴一起出去玩的时候,在这个到处都有wifi信号的地方,你的小伙伴却因为没有流量而连接不了无线网,我们作为朋友第一时间想到的就 ...

  4. 华为手机热点无法连接_别傻了!不能只会给别人开热点,要尝试华为手机的WiFi分享功能...

    原标题:别傻了!不能只会给别人开热点,要尝试华为手机的WiFi分享功能 当大家跟小伙伴一起出去玩的时候,在这个到处都有wifi信号的地方,你的小伙伴却因为没有流量而连接不了无线网,我们作为朋友第一时间 ...

  5. 华为手机热点无法连接_华为手机热点无法连接_别傻了!不能只会给别人开热点,要尝试华为手机的WiFi分享功能......

    原标题:别傻了!不能只会给别人开热点,要尝试华为手机的WiFi分享功能 当大家跟小伙伴一起出去玩的时候,在这个到处都有wifi信号的地方,你的小伙伴却因为没有流量而连接不了无线网,我们作为朋友第一时间 ...

  6. 计算器加减乘除优先级算法_计算器也算错数学?华为、苹果、小米内置计算器都算错了...

    现在科技越来越发达,很多加减乘除都是用计算器,帮助我们得出结果. 近日,一则"手机计算器全线阵亡"的消息登上各大热搜榜.不少网友发现自己手机的计算器出现了一个错误:在手机计算器中输 ...

  7. 基于同步压缩小波变换(Synchrosqueezed wavelet transforms)的时频分析的MATLAB实现(不使用内置函数wsst)

    引言 同步压缩小波变换(Synchrosqueezed wavelet transforms, SST)采用了经验模态分解的设计思路,结合小波变换和reallocation theory构建而成,有明 ...

  8. liunx内置计算器bc工具

    bc命令简要使用 useage: bc [options] [file -] -h --help 打印用法并退出 -i --interactive 交互模式 示例: obase: 设置输出格式(二进制 ...

  9. 华为 java sd卡_无需使用Micro SD卡!只需简单三招,轻松给华为手机扩展容量

    原标题:无需使用Micro SD卡!只需简单三招,轻松给华为手机扩展容量 这些年,智能手机不仅在摄像头像素上屡创新高,而且高端机型也普遍标配128GB存储,甚至出现512GB版本这样的巨无霸.总有一天 ...

最新文章

  1. CHM:植物利用细菌获得真菌抗性!中山大学李剑峰课题组揭示植物免疫预警新机制...
  2. golang mysql多表查询_MySQL多表查询
  3. Atitit.js图表控件总结
  4. Waiting 180 more seconds for 1 worker threads to finish
  5. 使用c#接入华为云-内容审核
  6. SiameseRPN详解
  7. 计算机网络设备配置遇到的问题,网络设备使用与维护
  8. mongodb固定集合(Capped Collection)和大文件管理(GridFS)
  9. 大小写金额转换html,小写金额转为大写金额JS代码怎么写呢?
  10. python word文档合并_[Python 学习笔记]用Python进行docx文档合并
  11. Velero备份实战 - 基于Ceph的CSI快照
  12. 7-12 特立独行的幸福 (25 分)(如何判断特立独行)
  13. Dynamic Web Module 3.1 requires Java 1.7 or newer. 错误解决方案
  14. 2 MyBatis Sql映射文件
  15. 机械电气自动化常用知识手册
  16. 音乐歌单Android,[CloudReader]Android - 仿网易云音乐歌单详情页
  17. WIN10 3个手指拖动_用好笔记本的触摸板(win10小技巧)
  18. 这个城市最安静的声音 - Suzy
  19. 【Java】云E办项目后端技术栈整合及代码阅读
  20. YouTube-8M视频数据集概览

热门文章

  1. 【大底大顶接近预警】副图指标 分清大顶大底 轻松做波段 通达信 源码
  2. 幼儿园计算机基础知识培训总结,幼儿园园本培训工作总结
  3. 壁纸|苹果Live壁纸以及静态壁纸,给大家分享点
  4. SAP ABAP ZBA_R001 查询用户下的角色,事务代码
  5. 用微信h5棋牌源码来测量相机到目标的距离
  6. 使用GIMP for Mac
  7. 【C语言】简单的飞机游戏
  8. 你关心的问题都在这!爱奇艺用户留存预测挑战赛Baseline上线
  9. 对比极米Z6X Pro和RS Pro 2,极米H5值得入手吗?极米H5评测来了
  10. npmnjs学习笔记-moddle description编写规则