简易计算器设计.docx
- 文档编号:10785728
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:49
- 大小:190.42KB
简易计算器设计.docx
《简易计算器设计.docx》由会员分享,可在线阅读,更多相关《简易计算器设计.docx(49页珍藏版)》请在冰豆网上搜索。
简易计算器设计
简易计算器设计实习报告
题目:
简易计算器设计
学号
姓名
专业班级
指导教师
实践日期
一、综合训练目的与要求
《面向对象程序设计》课程设计是实践性教学环节之一,是《面向对象程序设计》课程的辅助教学课程。
该课程设计要求学生综合运用在《面向对象程序设计》课程中学到的面向对象技术与实际编程相结合,独立完成一项较为完整、并具有一定实际功能的课程设计任务,同时加深学生对面向对象和C++编程技术的理解和掌握,培养实际的应用程序开发能力。
在课程设计过程中,使学生养成良好的程序设计风格,并掌握C++应用程序的设计开发过程和编程方法、测试方法。
二、综合训练任务
(1)综合任务
设计计算器类,实现带括号的复杂表达式的计算。
(2)个人任务
我的主要是在qt中学习和使用信号和槽的机制,此外,就是设计数字键。
三、总体设计
(1)功能模块图
图1功能模块图
(2)最终的UML图
图2stack类
图3CalculatorWindow类
(3)个人设计stack的示图
图4StackL类
四、详细设计说明
(1)工程文件视图
图5工程文件试图
(2)类的介绍
constintmax_len=20;//栈的最大容量
栈类stack()
constintmax_len=20:
栈的最大容量
函数:
stack():
构造函数,实现栈的初始化
~stack():
析构函数
intgetTop():
得到栈顶指针的值
voidclear():
清空栈
voidpush(charc):
符号入栈
voidpush(floatf):
数字入栈
charpop(charc):
返回符号栈栈顶的符号。
floatpop(intf):
返回数字栈栈顶的数字。
charremove(charc):
栈顶元素出栈。
floatremove(intf):
栈顶元素出栈。
boolempty():
判断栈是否为空。
boolfull():
判断栈是否满了
分析:
开始的时候只有chars[max_len],没有floatn[max_len]这个属性,后来由于字符和float型转换存在精度的问题,所以在stack类中加入了floatn[max_len]这个属性。
使用的时候如果建立符号栈,那么只使用chars[max_len],如果建立数字栈那么只使用floatn[max_len]。
栈顶指针inttop,和其他函数是chars[max_len]和floatn[max_len]公用。
其中有push()、pop()、remove(),函数的参数没有具体意义只是为了实现函数重载来实现不同栈的操作。
运算类classcalculator()
功能:
实现功能选择和实现进制转换与表达式计算
属性:
stacknumStack:
数字栈
stackoperatorStack:
符号栈
stringstr:
字符串(输入的表达式)
函数:
calculator():
构造函数
virtual~calculator():
析构函数
voidsetStr():
设置输入的数字或是表达式的字符串
stringgetStr():
得到输入的数字或表达式的字符串
booloperatorCompare(charstackOut,charstackIn):
运算符比较函数,
voidpartCalculate(charoper):
局部计算函数,
voidcalculate():
选择表达式运算
booloperatorCompare(charstackOut,charstackIn):
运算符比较函数
longintchangeHexadecimal(intnum):
进制转换函数实现进制的选择
floatn[max_len];//数字栈
chars[max_len];//符号栈
inttop;//栈顶指针
实现表达式的计算,计算中可以有加减乘除、括号。
利用栈的思想来实现,先取得表达式,然后按序入栈,符号栈和数字栈。
边入栈边进行运算最后的数字栈顶元素为结果。
这里面除了需要出入栈的操作,还需要进行符号优先级的设定和比较,用函数booloperatorCompare(charstackOut,charstackIn)实现。
实现局部计算(栈内符号优先级高于栈外符号优先级),用函数voidpartCalculate(charoper)实现。
五、调试与测试
1这是在调试运行后的截图
2这是我设计的栈代码
3这是calculatorwindow.h中的类
说明:
(1)可以进行常规四则运算,以及带括号的运算。
(2)在输入非法时会出现“####”,表示输入错误。
例1:
2*(3+1)-6/3的运算
按下等号后显示结果如下:
例2:
2+(3-(6+9/3)+5)
按下等号后显示结果如下:
3在非法输入时会自动报错(以除数是0为例)
按下等号后显示结果如下:
4我们的计算器刚开始时不能计算负数,只要有负数,计算结果就出错,这是改进后的
终于计算正确了
八、附录:
核心代码清单
头文件:
**********************************Calculatorwindow.h***********************
#ifndefJISUANQI_H
#defineJISUANQI_H
#endif//JISUANQI_H
#ifndefCALCULATOR_H
#defineCALCULATOR_H//对calculator.h头文件的声明
#include
#include
#include
#include
#include
#include"stack.h"
usingnamespacestd;
classcalculatorWindow:
publicQWidget//计算器继承自主窗体类
{
Q_OBJECT//必须加上这句,如果要调用信号,槽函数的操作的话
public:
calculatorWindow();//计算器类的构造函数
~calculatorWindow();//计算器类的析构函数
publicslots:
//定义各个按键按下后对应操作处理的槽函数
longintchangeHexadecimal(intnum,intpower);
voidnumButtonPress(charnum);//按数字响应事件
voidopreateButtonPress(charop);//二元运算符响应事件
voiddanButtonPress(charop);//一元运算符的响应函数
voidzeroButtonPress();//调用numButtonPress()函数
voidoneButtonPress();
voidtwoButtonPress();
voidthreeButtonPress();
voidfourButtonPress();
voidfiveButtonPress();
voidsixButtonPress();
voidsevenButtonPress();
voideightButtonPress();
voidnineButtonPress();
voiddecimalButtonPress();
voidaddButtonPress();
voidsubButtonPress();
voidmulButtonPress();
voiddivButtonPress();
voidsinButtonPress();
voidcosButtonPress();
voidtanButtonPress();
voidsqrtButtonPress();
voidpowButtonPress();
voidbinaryButtonPress();
voidoctButtonPress();
voidhexButtonPress();
voidrightPerButtonPress();
voidleftPerButtonPress();
voidclearButtonPress();
voidbackspaceButtonPress();
voidequButtonPress();
voidcalculate();//普通计算
voidhexChange(intnum);//进制转换函数
booloperatorCompare(charstackOut,charstackIn);
voidpartCalculate(charoper);
voidabortOperation();//异常处理函数
stringchangeToABC(intnum);
stringdecToHex(intnumber);
private:
QLineEdit*operateEdit;//声明显示框
QPushButton*zeroButton;//声明数字按键¹
QPushButton*oneButton;
QPushButton*twoButton;
QPushButton*threeButton;
QPushButton*fourButton;
QPushButton*fiveButton;
QPushButton*sixButton;
QPushButton*sevenButton;
QPushButton*eightButton;
QPushButton*nineButton;
QPushButton*decimalButton;//小数点按钮
QPushButton*clearButton;
QPushButton*backspaceButton;
//声明运算符按键
QPushButton*addButton;
QPushButton*subButton;
QPushButton*divButton;
QPushButton*mulButton;
QPushButton*sinButton;
QPushButton*cosButton;
QPushButton*tanButton;
QPushButton*sqrtButton;
QPushButton*powButton;
QPushButton*equButton;
QPushButton*binaryButton;
QPushButton*octButton;
QPushButton*hexButton;
QPushButton*rightPerButton;
QPushButton*leftPerButton;
//声明水平布局器,该布局器主要对24个按键进行布局
QHBoxLayout*firstLayout;
QHBoxLayout*secondLayout;
QHBoxLayout*thirdLayout;
QHBoxLayout*fourthLayout;
QVBoxLayout*mainLayout;//声明垂直布局器,该布局器主要对主窗体上面的空间进行排布
QStringinput;//计算器中要输入的代数表达式
stacknumStack;
stackoperatorStack;
boolopreate=0;//判断是否输入了等号
boolopreated=0;//如果输入了运算符,则置为1
};
#endif//CALCULATOR_H
**********************************Stack.h**********************************
#ifndefSTACK_H
#defineSTACK_H
constintmax_len=20;//栈的最大容量
classstack
{
private:
chars[max_len];//栈的内容保存在数组中
inttop;//栈顶指示器,栈空时为-1
floatn[max_len];
public:
stack();
~stack();
intgetTop();
voidclear();
voidpush(charc);
voidpush(floatf);
charpop(charc);
floatpop(intf);
boolempty();
boolfull();
charremove(charc);
floatremove(intf);
};
#endif//STACK_H
源文件
************************Buttonpress.cpp****************************
#include"calculatorWindow.h"
//数字键和最基本的运算符建的实现
voidcalculatorWindow:
:
numButtonPress(charnum)
{
if(opreate){
//判断是否开始第二次计算,如果opreate为真,单击数字键就表示开始新的计算
operateEdit->setText("");
opreate=0;//将文本置为零,将opreate置为0,一边下一次输入表达式
}
if(input=="")//如果当前显示框为0
{
input=num;//变0为num
}
else
{
input=operateEdit->text();
input.append(num);
}
operateEdit->setText(input);//更新显示框中的显示信息
opreated=0;
//输入数字后将opreate改为1,等待运算符输入
}
//一元运算符的响应函数
voidcalculatorWindow:
:
danButtonPress(charop)
{
if(input=="")//如果当前显示框为0
{
input=op;//变0为num
}
else
{
input=operateEdit->text();
input.append(op);
}
operateEdit->setText(input);//更新显示框中的显示信息
}
//二元运算符响应事件
voidcalculatorWindow:
:
opreateButtonPress(charop)
{
//实现不能连续输入运算符
//如果前面的字符为运算符,则opreated=1,不能再次输入运算符。
//只有opreated=0时才可以输入运算符
if(!
opreated)
{
opreate=0;//只有opreate为假时才可以输入运算符
if(!
opreate){
if(input=="")//如果当前显示框为0
{
input=op;//变0为num
}
else
{
input=operateEdit->text();
input.append(op);
}
operateEdit->setText(input);//更新显示框中的显示信息
}
opreated=1;
}
}
//数字键的实现
voidcalculatorWindow:
:
oneButtonPress()
{
numButtonPress('1');
}
voidcalculatorWindow:
:
twoButtonPress()
{
numButtonPress('2');
}
voidcalculatorWindow:
:
threeButtonPress()
{
numButtonPress('3');
}
voidcalculatorWindow:
:
fourButtonPress()
{
numButtonPress('4');
}
voidcalculatorWindow:
:
fiveButtonPress()
{
numButtonPress('5');
}
voidcalculatorWindow:
:
sixButtonPress()
{
numButtonPress('6');
}
voidcalculatorWindow:
:
sevenButtonPress()
{
numButtonPress('7');
}
voidcalculatorWindow:
:
eightButtonPress()
{
numButtonPress('8');
}
voidcalculatorWindow:
:
nineButtonPress()
{
numButtonPress('9');
}
voidcalculatorWindow:
:
zeroButtonPress()
{
numButtonPress('0');
}
//运算符的按键响应
voidcalculatorWindow:
:
addButtonPress()
{
opreateButtonPress('+');
}
voidcalculatorWindow:
:
subButtonPress()
{
opreateButtonPress('-');
}
voidcalculatorWindow:
:
mulButtonPress()
{
opreateButtonPress('*');
}
voidcalculatorWindow:
:
divButtonPress()
{
opreateButtonPress('/');
}
//小数点按键处理
voidcalculatorWindow:
:
decimalButtonPress()
{
numButtonPress('.');
}
//三角函数的实现,考虑到运算的一致性,便于封装函数,故运算规则只能是先输入数字,后输入运算符
//在这里三角函数只是计算了弧度制的
voidcalculatorWindow:
:
sinButtonPress()
{
danButtonPress('S');
}
voidcalculatorWindow:
:
cosButtonPress()
{
danButtonPress('C');
}
voidcalculatorWindow:
:
tanButtonPress()
{
danButtonPress('T');
}
//开方和平方的运算响应事件
voidcalculatorWindow:
:
sqrtButtonPress()
{
danButtonPress('Q');
}
voidcalculatorWindow:
:
powButtonPress()
{
danButtonPress('W');
}
//括号按键响应事件
voidcalculatorWindow:
:
rightPerButtonPress()
{
numButtonPress('(');
}
voidcalculatorWindow:
:
leftPerButtonPress()
{
numButtonPress(')');
}
//二进制的转换
voidcalculatorWindow:
:
binaryButtonPress()
{
hexChange
(2);
opreate=1;
}
//八进制的转换
voidcalculatorWindow:
:
octButtonPress()
{
hexChange(8);
opreate=1;
}
//十六进制的转换,由于牵扯到非数字字符,暂时并未实现
voidcalculatorWindow:
:
hexButtonPress()
{
if(opreate){//判断是否开始第二次计算,如果opreate为真,单击数字键就表示开始新的计算
operateEdit->setText(0);
opreate=0;//将文本置为零,将opreate置为0,一边下一次输入表达式
}
QStringa=operateEdit->text();
inttemp=a.toInt();
stringresult=decToHex(temp);
operateEdit->setText(QString:
:
fromStdString(result));
opreate=1;
}
//功能键
//等号按键的实现
voidcalculatorWindow:
:
equButtonPress()
{
opreateButtonPress('=');
calculate();
opreate=1;
}
//Clear键的实现
voidcalculatorWindow:
:
clearButtonPress()
{
input="";//把运算操作数2清零
operateEdit->setText(input);//更新显示框中的显示内容
}
//退格键的实现
voidcalculatorWindow:
:
backspaceButtonPress()
{
if(!
opreate)
{
input=operateEdit->text();
input.chop
(1);
if(input.isEmpty()){
input="";
}
operateEdit->setText(input);
}
}
**************************************Calculator.cpp***********************
#include
#include
#include
#include
#include
#include
#include"calculatorwindow.h"
#include
usingnamespacestd;
#d
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简易 计算器 设计