目录
一 实验准备
1.编程语言及开发环境的选择
本实验采用c++语言qt软件开发。学习路径 最新QT从入门到实战完整版|传智教育_哔哩哔哩_bilibili
2.实现方法
中缀转后缀,后缀表达式求解
1.中缀表达式
中缀表达式是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法。在中缀表达式中,运算符具有不同的优先级,并且还可以使用括号改变运算的次序,因此运算规律比较复杂,不适于计算机求解表达式。
2.后缀表达式
后缀表达式,即逆波兰式。
我们平时写的a+b是中缀表达式,写成后缀表达式就是:ab+
特点:
1)后缀表达式的操作数与中缀表达式的操作数先后次序相同,而运算符的先后次序不同;
2)后缀表达式中没有括号,而且运算符没有优先级;
3)后缀表达式计算过程严格按照从左到右的顺序进行。
3.算法思路
I 中缀表达式转后缀表达式
设置一个运算符栈,用来存放运算符。
定义一个字典,保存优先级。
从左向右依次读取算术表达式的元素X,分以下情况进行不同的处理:
(1)如果X是操作数,直接入队
(2)如果X是运算符,再分以下情况: a)如果栈为空,直接入栈。 b)如果X==”(“,直接入栈。 c)如果X==”)“,则将栈里的元素逐个出栈,并入队到后缀表达式队列中,直到第一个配对的”(”出栈。(注:“(”和“)”都不 入队) d)如果是其他操作符(+ - * /),则和栈顶元素进行比较优先级。 如果栈顶元素的优先级大于等于X,则出栈并把栈中弹出的元素入队,直到栈顶元素的优先级小于X或者栈为空。弹出完这些元素后,才将遇到的操作符压入到栈中。
(3)最后将栈中剩余的操作符全部入队。
II 后缀表达式求解
首先准备一个栈Res_Stack.
1、从左开始向右遍历后缀表达式的元素。
2、如果取到的元素是操作数,直接入栈Res_Stack,如果是运算符,从栈中弹出2个数进行运算,然后把运算结果入栈
3、当遍历完后缀表达式时,计算结果就保存在栈里了。
二 实验设计过程
1.界面设计
font: bold 14px;
padding: 6px;
background-color: rgb(30, 155, 144)
21个PushButton,1个Label 和设置相应的格式
历史记录面板
//展开历史对话框
void Widget::on_Button_history_clicked()
{
if(isOpen==false){
history_dia.show();
isOpen=true;
}
else if(isOpen==true){
history_dia.close();
isOpen=false;
}
}
//将结果添加到“历史”对话框的最后并换行
history_dia.ui->textBrowser->setText
(history_dia.ui->textBrowser->document()->toPlainText()+expression+"="+QString::number(Ans)+"\n");
2. 信号与槽的连接
1.信号
private slots:
void on_Button_1_clicked();
void on_Button_2_clicked();
void on_Button_3_clicked();
void on_Button_4_clicked();
void on_Button_5_clicked();
void on_Button_6_clicked();
void on_Button_8_clicked();
void on_Button_7_clicked();
void on_Button_9_clicked();
void on_Button_add_clicked();
void on_Button_0_clicked();
void on_Button_point_clicked();
void on_Button_subtract_clicked();
void on_Button_multiply_clicked();
void on_Button_divide_clicked();
void on_Button_clear_clicked();
void on_Button_back_clicked();
void on_Button_equal_clicked();
void on_Button_left_clicked();
void on_Button_right_clicked();
void on_Button_history_clicked();
2.通过对槽函数的限制实现算数表达式的正确性检验
(1)当钱输入是0到9时,如果上个符号是右括号则不输入数字
void Widget::on_Button_1_clicked()
{ int i=expression.length()-1;
if(expression .length()==0){
Expression += "1";
expression += "1";
ui->Screen->setText(expression);
}
else if(expression.at(i) == ")")
{
ui->Screen->setText(expression);
}
else{
Expression += "1";
expression += "1";
ui->Screen->setText(expression);}
}
void Widget::on_Button_2_clicked()
{
int i=expression.length()-1;
if(expression .length()==0){
Expression += "2";
expression += "2";
ui->Screen->setText(expression);
}
else if(expression.at(i) == ")")
{
ui->Screen->setText(expression);
}
else{
Expression += "2";
expression += "2";
ui->Screen->setText(expression);}
}
void Widget::on_Button_3_clicked(){
int i=expression.length()-1;
if(expression .length()==0){
Expression += "3";
expression += "3";
ui->Screen->setText(expression);
}
else if(expression.at(i) == ")")
{
ui->Screen->setText(expression);
}
els