实现效果

简单计算器的实现

实验内容:

  1. 学习GUI图形界面的设计,Python Tinker或 Java Swing/Awt 或C++ QT框架,创建交互友好的应用程序;
  2. 能通过界面按钮控件输入并实现算术表达式,输入的表达式即时在控件中显示,按下“=”按钮能实现运算,并将运算结果输出在控件中显示;要求能保存和浏览历史表达式的运算记录。
  3. 算术表达式求解,是指算术表达式中包括加、减、乘、除、括号等运算符,能求解包含括号的四则混合运算;并且能够检验表达式的合法性。
  4. 选做:①实现三角函数的运算、对数运算、指数运算、进制转换等;②设计函数,分别求两个一元多项式的乘积与和。

实验要求:

1)能通过设计的按钮控件输入并实现算术表达式,表达式在文本框中显示,运算结果输出显示;保存和浏览历史运算记录;

2)能够检验算术表达式的合法性;

3)能够实现混合运算的求解,算术表达式中包括加、减、乘、除、括号等运算符;

4)要求交互界面友好,程序健壮。

步骤一:设置界面

bool  QCalculatorUI::construct()
{const char* butnText[21]={"<-","CE","lishi","7","8","9","+","(","4","5","6","-",")","1","2","3","*","=","0",    ".","/",};const int butnPos[21][4]=       //存放 x y w h;    xy是位置,wh是大小{{10,50,90,40}, {110,50,90,40},  {210,50,40,40},                                                  //<- CE{10,100,40,40},{60,100,40,40},{110,100,40,40},{160,100,40,40},{210,100,40,40},    //7 8 9 + ({10,150,40,40},{60,150,40,40},{110,150,40,40},{160,150,40,40},{210,150,40,40},    //4 5 6 - ){10,200,40,40},{60,200,40,40},{110,200,40,40},{160,200,40,40},{210,200,40,90},    //1 2 3 * ={10,250,90,40},               {110,250,40,40},{160,250,40,40},                    //0   . /};mline  =new QLineEdit(this);//创建一个QLineEdit//if(mline==NULL)//  return false;mline->resize(240,30);mline->move(10,10);//mline->setAlignment(Qt::AlignRight);mline->setReadOnly(1);//设置字体QFont font;font.setFamily("microsoft yahei");font.setWeight(51);font.setPixelSize(14);mline->setFont(font);        //设置字体this->setWindowTitle("计算器");for(int i=0;i<21;i++){mbuton[i]= new  QPushButton(butnText[i],this);if(mbuton[i]==NULL)return false;mbuton[i]->resize(butnPos[i][2],butnPos[i][3]);mbuton[i]->move(butnPos[i][0],butnPos[i][1]);QObject::connect(mbuton[i],SIGNAL(clicked()),this,SLOT(handler_clicked()));}return true;
}

步骤二:按键处理函数

void QCalculatorUI::handler_clicked()      //处理按键消息
{static int ClearLine=0;static int bracket_cnt=0;           //圆括号计数QPushButton *btn =dynamic_cast<QPushButton* >(sender()); //获取对象,那个被点击的按键QString line = mline->text();QString text = btn->text();     //获取消息if(ClearLine){mline->setText("");line.clear();ClearLine=0;}if(text>="0"&&text<="9")    //数字{QString tmp= line.right(1);if(tmp.length() && tmp[0]==')')   //数字前面不能为右括号;zk:括号里条件的意思是数字前面是右括号return;line+=text;}else if(text=="." )    //小数点{QString tmp= line.right(1);if(tmp.length()) //小数点前面只能是数字{if(MatchingBoth(tmp,"0123456789")== -1)  //没找到数字return;}else             //小数点前面为空{return ;}//zk:当前面有数字才能到这来int pos= LastMatchingBoth(line,"+-*/.()");   //反向查找;    zk:这里为什么呢,举个例子1.1+1.if(pos!= -1 &&line[pos]=='.' )        //一串数字只能有一个小数点{return ;}line+=text;}else if(text=="+"||text=="-")       //加减号{QString tmp= line.right(1);if(tmp.length()&& tmp[0]=='.')     //前面不能为:小数点return ;tmp= line.right(2);if(tmp.length()==2)          //前面不能连续有两次加减乘除{if(tmp[0]=='+'||tmp[0]=='-'||tmp[0]=='*'||tmp[0]=='/'||tmp[0]=='(')if(tmp[1]=='+'||tmp[1]=='-'||tmp[1]=='*'||tmp[1]=='/')return ;}line+=text;}else if(text=="*"||text=="/")       //乘除号{QString tmp= line.right(1);if(tmp.length())       //前面不能为:左括号,小数点,加减乘除,{if(MatchingBoth(tmp,"(.+-*/")!= -1) //查找左括号,小数点,加减乘除{return;}}else                   //乘除号前面不能为空return;line+=text;}else if(text=="(")       //左括号{QString tmp= line.right(1);if(tmp.length())             //前面不能为:右括号,数字,小数点{if(MatchingBoth(tmp,")0123456789.")!= -1) //查找右括号,数字,小数点{return;}}line+=text;bracket_cnt++;}else if(text==")")       //右括号{if(bracket_cnt==0)  //前面没有左括号return;QString tmp= line.right(1);if(tmp.length())             //前面不能为:加减乘除,小数点,左括号{if(MatchingBoth(tmp,"+-*/.(")!= -1) //查找加减乘除,小数点,左括号{return;}}else                    //右括号前面不能为空return;line+=text;bracket_cnt--;}else if(text=="<-")       //<-{if(line.length())line.chop(1);}else if(text=="CE")       //清空{line.clear();bracket_cnt=0;}else if(text=="="&& line.length()){QString ret=mDec.Result(line);if(ret==NULL)   //除数为0{line += " : ";line +="除数不能为0";}else if(ret=="Error"){line += ":";            line +="格式出错";}else{line += " = ";             line += ret;}ClearLine =1;a.push(line);}mline->setText(line);if(text=="lishi"){a.pop();mline->setText(a.top());a.pop();}
}

步骤3:中缀表达式->后缀表达式,后缀表达式的计算。

QQueue<QString> Split(const QString& exp);          //分离前缀
QQueue<QString> Transfer(QQueue<QString>& exp);     //将中缀队列转换为后缀队列
QString Calculate(QQueue<QString>& exp);            //将后缀队列计算出结果
QQueue<QString> QCalculatorDec::Split(const QString& exp)          //分离前缀
{QQueue<QString> ret;QString num="";for(int i=0;i<exp.length();i++){if( (exp[i]=='.') || ( (exp[i]>='0') && (exp[i]<='9') ))    //判断小数点和数字{num += exp[i];}else if(exp[i]== '(' || exp[i]== ')' || exp[i]== '*' || exp[i]== '/'  ){if(!num.isEmpty())              //1*1{ret.enqueue(num);        //将数字入队列num.clear();}ret.enqueue(exp[i]);}else if(exp[i]== '+' || exp[i]== '-')           // + - 需要特殊处理{if(i==0)       //表达式开头,说明是正负号{num+= exp[i];}//i>0else if(exp[i-1]=='(' || exp[i-1]=='+' || exp[i-1]=='-' || exp[i-1]=='*' || exp[i-1]=='/'){num+= exp[i];}else        //否则是加减运算符{if(!num.isEmpty()){ret.enqueue(num);        //将数字入队列num.clear();}ret.enqueue(exp[i]);}}}if(!num.isEmpty())         //遍历完成,判断是否还有数字{ret.enqueue(num);num.clear();}return ret;
}
QQueue<QString> QCalculatorDec::Transfer(QQueue<QString>& exp)     //将中缀队列转换为后缀队列
{QStack<QString> stack;QQueue<QString> ret;bool num_ok;QString symbol;while(!exp.isEmpty()){symbol = exp.dequeue();   //出队列symbol.toDouble(&num_ok);if(num_ok==true)          //数字{stack.push(symbol);}else if(symbol=="+"||symbol=="-"){while(!stack.isEmpty() &&(stack.top()!="(")){ret.enqueue(stack.pop());     //取出栈顶运算符并入队列}stack.push(symbol);}else if(symbol=="*"||symbol=="/"){while(!stack.isEmpty() && (stack.top()!="(") && (stack.top()!="+") && (stack.top()!="-")){ret.enqueue(stack.pop());     //取出栈顶运算符并入队列}stack.push(symbol);}else if(symbol == "("){stack.push(symbol);}else if(symbol ==")"){while(!stack.isEmpty() && (stack.top()!="(")){ret.enqueue(stack.pop());     //取出栈顶运算符并入队列}if(stack.top()=="(")stack.pop();}}while(!stack.isEmpty()&& (stack.top()!="("))         //遍历完成,判断栈里是否为空{ret.enqueue(stack.pop());     //取出栈顶运算符并入队列}return ret;
}
QString QCalculatorDec::Calculate(QString& l,QString& op,QString& r )
{double left,right,res;QString ret="";left = l.toDouble();right = r.toDouble();if(op == "+")res = left + right;else if(op == "-")   res = left - right;    else if(op == "*")res = left * right;    else if(op == "/"){if( (right>(-0.000000000000001)) && (right<(0.000000000000001)) )   //判断除数为0return NULL;elseres = left/right;}ret.sprintf("%f",res);return ret;
}

实验一 简单计算器的实现(QT实现)相关推荐

  1. 编译原理 实验二 简单计算器的设计与实现

    实验二 简单计算器的设计与实现  一.实验目的   综合运行词法分析器.语法分析器等原理实现一个具有加.乘功能的简单计算器,该计算器满足乘法优先级高于加法优先级,且仅处理非负整数. 二.实验内容    ...

  2. pta 输出三角形字符阵列_PTA实验6-8 简单计算器 (20分)

    模拟简单运算器的工作.假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算. 输入格式: 输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数. ...

  3. 计算器软件C语言课程设计实验报告,c简单计算器实验报告_相关文章专题_写写帮文库...

    时间:2019-05-15 12:55:15 作者:admin 计算器实验报告 班级: 07计本(1)班 姓名: 王林 学号: 20706031047 指导老师: 韩静 一. 需求分析 (1)制作一个 ...

  4. 实验4 用JavaBean实现简单计算器

    一.实验目的 1.掌握JavaBean创建和使用方法: 2.领会JavaBean简化页面设计的优势等. 二.实验内容 1.设计诸如以下页面的简单计算器 要求:完成加减乘除 加法.减法如下: 乘法如下: ...

  5. 使用Qt做一个简单计算器

    title: Calculator date: 2022-09-04 11:10:12 tags: [Qt, 应用, C++] typora-root-url: Calculator 使用Qt做一个简 ...

  6. QT实现一个简单计算器

    QT实现一个简单计算器 学生一枚,水平有限,如有问题,还望指正 第一步 通过QT设计师绘制出界面图形,界面大致如下: 第二步 将保存的.ui文件转换为头文件,以便于自己创建的对象对其继承和使用 uic ...

  7. 数据结构实验报告(二)简单计算器(中缀转后缀)

    报告汇总之c语言数据结构报告篇(二) 简单计算器 代码区 #include <stdio.h> #include <stdlib.h>char S[100]; char S2[ ...

  8. 计算机软件技术实习 项目一 简单计算器的实现(实验准备)1-(1)

    目录 一.需求分析 二.重难点 三.编程语言 四.开发工具/平台 一.需求分析 1. 能通过设计的按钮控件输入并实现算术表达式,表达式在文本框中显示,运算结果输出显示: 2.保存和浏览历史运算记录: ...

  9. 实验一(一)简单计算器项目准备

    目录 一. 简单计算器介绍 二. 开发工具 三. 实现原理 1.栈 2.List 三. 表达式 1.运算符优先级 2.中缀表达式 3.后缀表达式 算法作用: 4.中缀表达式转化为后缀表达式 5.后缀表 ...

最新文章

  1. jdbc封装与多并发的共鸣
  2. 运算放大器的好坏判别方法
  3. linux下安装新硬盘并挂载mount
  4. 【精选】uboot/linux/qt/busybox/opengl/yaffs/lzop/glibc源码下载地址
  5. shell 的here document 用法、输入/输出重定向
  6. 山东大学linux实验报告,山东大学操作系统实验四
  7. 多线程环境下,HashMap为什么会出现死循环?
  8. pandas DateTime
  9. 简单易用的ASP.NET UBB编辑器
  10. asp.net园林绿化服务交易网站(三层架构)案例
  11. python把中文转英文_python自动化测试——中文转拼音,转英文
  12. 《横向领导力》-简述
  13. 汇编 bne 1b和bne 1f浅析
  14. (Hopcroft-Carp二分图匹配)Rain on your Parade
  15. 【openlayers】ol3切换图层源
  16. 【单调队列】51nod 1275 连续子段的差异
  17. JAVA计算:用 100 元钱买 100 支笔,其中钢笔 3 元 / 支,圆珠笔 2 元 / 支,铅笔 0.5 元 / 支,问钢笔、圆珠笔和铅笔可以各买多少支 ?
  18. win 7 必备 2
  19. 怎么取消微信送票服务器,智行火车票如何关闭微信自动扣费服务 微信怎么关闭智行火车票自动扣费授权...
  20. Saas的概念及相关应用

热门文章

  1. 一种简单的2D Roguelike地图生成算法
  2. 机器人瓦力漫威_漫威归来的发明家
  3. Grid ++ MIME 类型配置 载入报表数据,检查此URL及其数据,错误提示 网络服务器响应不成功
  4. OpenBMC环境搭建及测试
  5. Vuetify——使用icon图标
  6. 王者荣耀android换ios,2021王者荣耀安卓账号可以转苹果吗 2021年安卓账号转移到ios方法...
  7. CAD特性窗口,快捷特性窗口等不显示图形类型问题
  8. JavaScrip 防止别人复制,剪切,查看源代码,页面另存为的操作
  9. windows在当前文件夹下快速使用控制台
  10. ElasticSearch7学习笔记之Mapping