实验一:简单计算器的开发

本文介绍了使用C++和QT框架开发一个简单计算器的过程,包括实验准备、界面设计、信号与槽的连接以及算法实现。重点讲解了中缀表达式转后缀表达式的算法,以及如何通过后缀表达式求解算术表达式。在界面设计中,实现了对输入的正确性检查,确保算术表达式的合法性。最后,进行了测试和打包发布。
摘要由CSDN通过智能技术生成

目录

一  实验准备

1.编程语言及开发环境的选择

2.实现方法

中缀转后缀,后缀表达式求解

二 实验设计过程

1.界面设计 

 2. 信号与槽的连接

1.信号

2.通过对槽函数的限制实现算数表达式的正确性检验

3. 算法实现

 中缀表达式转后缀表达式

后缀表达式的计算

项目文件结构

 类的定义

 四 测试

 五 打包发布


一  实验准备

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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值