实验一 简单计算器的实现(QT实现)
实现效果
简单计算器的实现
实验内容:
- 学习GUI图形界面的设计,Python Tinker或 Java Swing/Awt 或C++ QT框架,创建交互友好的应用程序;
- 能通过界面按钮控件输入并实现算术表达式,输入的表达式即时在控件中显示,按下“=”按钮能实现运算,并将运算结果输出在控件中显示;要求能保存和浏览历史表达式的运算记录。
- 算术表达式求解,是指算术表达式中包括加、减、乘、除、括号等运算符,能求解包含括号的四则混合运算;并且能够检验表达式的合法性。
- 选做:①实现三角函数的运算、对数运算、指数运算、进制转换等;②设计函数,分别求两个一元多项式的乘积与和。
实验要求:
2)能够检验算术表达式的合法性;
3)能够实现混合运算的求解,算术表达式中包括加、减、乘、除、括号等运算符;
步骤一:设置界面
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实现)相关推荐
- 编译原理 实验二 简单计算器的设计与实现
实验二 简单计算器的设计与实现 一.实验目的 综合运行词法分析器.语法分析器等原理实现一个具有加.乘功能的简单计算器,该计算器满足乘法优先级高于加法优先级,且仅处理非负整数. 二.实验内容 ...
- pta 输出三角形字符阵列_PTA实验6-8 简单计算器 (20分)
模拟简单运算器的工作.假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算. 输入格式: 输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数. ...
- 计算器软件C语言课程设计实验报告,c简单计算器实验报告_相关文章专题_写写帮文库...
时间:2019-05-15 12:55:15 作者:admin 计算器实验报告 班级: 07计本(1)班 姓名: 王林 学号: 20706031047 指导老师: 韩静 一. 需求分析 (1)制作一个 ...
- 实验4 用JavaBean实现简单计算器
一.实验目的 1.掌握JavaBean创建和使用方法: 2.领会JavaBean简化页面设计的优势等. 二.实验内容 1.设计诸如以下页面的简单计算器 要求:完成加减乘除 加法.减法如下: 乘法如下: ...
- 使用Qt做一个简单计算器
title: Calculator date: 2022-09-04 11:10:12 tags: [Qt, 应用, C++] typora-root-url: Calculator 使用Qt做一个简 ...
- QT实现一个简单计算器
QT实现一个简单计算器 学生一枚,水平有限,如有问题,还望指正 第一步 通过QT设计师绘制出界面图形,界面大致如下: 第二步 将保存的.ui文件转换为头文件,以便于自己创建的对象对其继承和使用 uic ...
- 数据结构实验报告(二)简单计算器(中缀转后缀)
报告汇总之c语言数据结构报告篇(二) 简单计算器 代码区 #include <stdio.h> #include <stdlib.h>char S[100]; char S2[ ...
- 计算机软件技术实习 项目一 简单计算器的实现(实验准备)1-(1)
目录 一.需求分析 二.重难点 三.编程语言 四.开发工具/平台 一.需求分析 1. 能通过设计的按钮控件输入并实现算术表达式,表达式在文本框中显示,运算结果输出显示: 2.保存和浏览历史运算记录: ...
- 实验一(一)简单计算器项目准备
目录 一. 简单计算器介绍 二. 开发工具 三. 实现原理 1.栈 2.List 三. 表达式 1.运算符优先级 2.中缀表达式 3.后缀表达式 算法作用: 4.中缀表达式转化为后缀表达式 5.后缀表 ...
最新文章
- jdbc封装与多并发的共鸣
- 运算放大器的好坏判别方法
- linux下安装新硬盘并挂载mount
- 【精选】uboot/linux/qt/busybox/opengl/yaffs/lzop/glibc源码下载地址
- shell 的here document 用法、输入/输出重定向
- 山东大学linux实验报告,山东大学操作系统实验四
- 多线程环境下,HashMap为什么会出现死循环?
- pandas DateTime
- 简单易用的ASP.NET UBB编辑器
- asp.net园林绿化服务交易网站(三层架构)案例
- python把中文转英文_python自动化测试——中文转拼音,转英文
- 《横向领导力》-简述
- 汇编 bne 1b和bne 1f浅析
- (Hopcroft-Carp二分图匹配)Rain on your Parade
- 【openlayers】ol3切换图层源
- 【单调队列】51nod 1275 连续子段的差异
- JAVA计算:用 100 元钱买 100 支笔,其中钢笔 3 元 / 支,圆珠笔 2 元 / 支,铅笔 0.5 元 / 支,问钢笔、圆珠笔和铅笔可以各买多少支 ?
- win 7 必备 2
- 怎么取消微信送票服务器,智行火车票如何关闭微信自动扣费服务 微信怎么关闭智行火车票自动扣费授权...
- Saas的概念及相关应用
热门文章
- 一种简单的2D Roguelike地图生成算法
- 机器人瓦力漫威_漫威归来的发明家
- Grid ++ MIME 类型配置 载入报表数据,检查此URL及其数据,错误提示 网络服务器响应不成功
- OpenBMC环境搭建及测试
- Vuetify——使用icon图标
- 王者荣耀android换ios,2021王者荣耀安卓账号可以转苹果吗 2021年安卓账号转移到ios方法...
- CAD特性窗口,快捷特性窗口等不显示图形类型问题
- JavaScrip 防止别人复制,剪切,查看源代码,页面另存为的操作
- windows在当前文件夹下快速使用控制台
- ElasticSearch7学习笔记之Mapping