简单计算器实训报告.docx
- 文档编号:25039921
- 上传时间:2023-06-04
- 格式:DOCX
- 页数:21
- 大小:46.39KB
简单计算器实训报告.docx
《简单计算器实训报告.docx》由会员分享,可在线阅读,更多相关《简单计算器实训报告.docx(21页珍藏版)》请在冰豆网上搜索。
简单计算器实训报告
Linux应用与编程
实习报告
学院名称
专业班级
学生姓名
学号
指导教师
山东科技大学
一、实习题目:
B2-简单计算器
二、实习时间:
19周~20周实习地点:
J13-128 三、实习任务:
实现一个简单计算器,计算器包括加、减、乘、除四种运算。
用户通过鼠标进行数据输入,输入的数据以及计算结果显示在文本框中
四、小组分工说明:
独立完成
五、实习成绩
六、指导教师对实习的评语:
指导教师(签章):
2015年月日
1.概述
1.1实训项目简介
本次实训项目是应用Linux系统中的QT编译器编写一个界面简洁,操作简单的简易计算器。
该简易计算器运用的技术主要是Linux系统中QT编译器的一些函数以及指针等。
1.2基本功能
(1)通过鼠标点击接收数字键入以及运算符。
(2)能够进行简单的加减乘除四则运算。
(3)一键清空功能。
1.3附加功能
(1)键入数字超过6位,输出窗口输出“error”提示。
(2)能够进行连续加法和减法混合运算,能够进行连续乘法和除法混合运算。
(3)键入的被除数为0时,输出窗口输出“被除数不能为0哦”提示。
(4)连续键入两个运算符时,输出窗口输出“只能输入一个运算符哦”提示。
(5)进行加减法与乘除法混合运算时,输出窗口输出“error”提示。
2.相关技术
2.1QT中信号和槽
信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁。
当对象改变其状态时,信号就由该对象发射(emit)出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号。
这样就做到了真正的信息封装,能确保对象被当作一个真正的软件组件来使用。
槽用于接收信号,而且槽只是普通的对象成员函数。
一个槽并不知道是否有任何信号与自己相连接。
而且对象并不了解具体的通信机制。
2.2字符串输出数据组
为实现计算整式的显示,并且避免键入下一个数之前frist和second清除不净,在calculor.h中定义字符串,把显示窗口中的数据捕捉到字符串中,并随第二个数一起显示,从而实现计算整式的显示。
str=ui->textEdit->toPlainText()+QString:
:
number(int(key));
ui->textEdit->setText(str);
3.需求分析(用面向对象方法给出系统的主要需求模型,略写)
●3.1功能需求分析
基本功能:
鼠标键入数字及运算符,进行简单的加减乘除四则运算。
拓展功能:
进行连续加减或乘除运算,当出现输入被除数为0,输入位数过多,连续输入多个运算符等错误时,输出窗口提示相应错误。
●3.2数据需求分析
连续输入时的总式实时显示,结果的显示,错误类型的显示。
●3.3行为需求分析
鼠标键入数字及运算符。
●3.4其他需求
界面简单,操作简单。
4.总体设计与详细设计
4.1系统模块划分
简易计算器系统模块
模块名称
功能简介
数字按键模块
将键入的数字传到数据转换模块中
运算符按键模块
进行判断是否连续运算,从数据计算模块中读取结果并显示
数据转换模块
键入多位数字的转化
数据计算模块
判断运算符并进行计算
输入位数限制模块
限制输入位数并进行错误提示
4.2主要功能模块
4.1.1系统主要类图
4.1.2简易计算器程序执行流程图
是
否
是否
否
是
否
5.编码实现
calculor.cpp
#include"calculor.h"
#include"ui_calculor.h"
calculor:
:
calculor(QWidget*parent):
QWidget(parent),
ui(newUi:
:
calculor)
{
ui->setupUi(this);
ui->textEdit->setAlignment(Qt:
:
AlignRight);
ui->textEdit->setReadOnly(true);
my_state=FRIST;
my_sign=NO;
frist=0;
second=0;
result=0;
error=0;
changdu=0;
}
calculor:
:
~calculor()
{
deleteui;
}
//按键处理函数
voidcalculor:
:
on_pushButton_1_clicked()
{
trans
(1);
error=0;
changdu++;
if(changdu>6)
ui->textEdit->setText("error");
}
voidcalculor:
:
on_pushButton_2_clicked()
{
trans
(2);
error=0;
changdu++;
if(changdu>6)
ui->textEdit->setText("error");
}
voidcalculor:
:
on_pushButton_3_clicked()
{
trans(3);
error=0;
changdu++;
if(changdu>6)
ui->textEdit->setText("error");
}
voidcalculor:
:
on_pushButton_4_clicked()
{
trans(4);
error=0;
changdu++;
if(changdu>6)
ui->textEdit->setText("error");
}
voidcalculor:
:
on_pushButton_5_clicked()
{
trans(5);
error=0;
changdu++;
if(changdu>6)
ui->textEdit->setText("error");
}
voidcalculor:
:
on_pushButton_6_clicked()
{
trans(6);
error=0;
changdu++;
if(changdu>6)
ui->textEdit->setText("error");
}
voidcalculor:
:
on_pushButton_7_clicked()
{
trans(7);
error=0;
changdu++;
if(changdu>6)
ui->textEdit->setText("error");
}
voidcalculor:
:
on_pushButton_8_clicked()
{
trans(8);
error=0;
changdu++;
if(changdu>6)
ui->textEdit->setText("error");
}
voidcalculor:
:
on_pushButton_9_clicked()
{
trans(9);
error=0;
changdu++;
if(changdu>6)
ui->textEdit->setText("error");
}
voidcalculor:
:
on_pushButton_10_clicked()
{
trans(0);
error=0;
changdu++;
if(changdu>6)
ui->textEdit->setText("error");
}
//加法按键运算函数
voidcalculor:
:
on_pushButton_jia_clicked()
{
if(changdu>7)
ui->textEdit->setText("error");
else{
if(error!
=0)
{
ui->textEdit->setText("荳€谺。蜿ェ閭ス霎灘・ヤ竴荳ェ隶。邂礼ャヲ蜩ヲ・・シ・シ・);
}
else
{
if(my_state==SECOND)
{
if(my_sign==CHU||my_sign==CHENG)
ui->textEdit->setText("error");
else
cal();
//ui->textEdit->setText(QString:
:
number(result));
str=ui->textEdit->toPlainText()+'+';
ui->textEdit->setText(str);
frist=result;
second=0;
my_sign=JIA;
}
else
{
my_sign=JIA;
my_state=SECOND;
str=ui->textEdit->toPlainText()+'+';
ui->textEdit->setText(str);
}
error++;
}
}
}
//减法运算函数
voidcalculor:
:
on_pushButton_jian_clicked()
{
if(changdu>6)//键入数据位数限制条件
ui->textEdit->setText("error");
else{
if(error!
=0)//连续键入两个运算符报错
{
ui->textEdit->setText(“不能连续输入两个运算符哦”);
}
else
{
error++;
if(my_state==SECOND)//连续减法运算
{
if(my_sign==CHU||my_sign==CHENG)
ui->textEdit->setText("error");//混合运算报错
else
cal();
//ui->textEdit->setText(QString:
:
number(result));
str=ui->textEdit->toPlainText()+'-';
ui->textEdit->setText(str);
frist=result;
second=0;
my_sign=JIAN;
}
else
{
my_sign=JIAN;
my_state=SECOND;
str=ui->textEdit->toPlainText()+'-';
ui->textEdit->setText(str);
}
}
}
}
//乘法运算运算符函数
voidcalculor:
:
on_pushButton_cheng_clicked()
{
if(changdu>6)
ui->textEdit->setText("error");
else{
if(error!
=0)
{
ui->textEdit->setText(“不能连续键入两个运算符哦”);
}
else
{
error++;
if(my_state==SECOND)
{
if(my_sign==JIA||my_sign==JIAN)
ui->textEdit->setText("error");
else
cal();
//ui->textEdit->setText(QString:
:
number(result));
str=ui->textEdit->toPlainText()+'*';
ui->textEdit->setText(str);
frist=result;
second=0;
my_sign=CHENG;
}
else
{
my_sign=CHENG;
my_state=SECOND;
str=ui->textEdit->toPlainText()+'*';
ui->textEdit->setText(str);
}
}
}
}
//除法运算符函数
voidcalculor:
:
on_pushButton_chu_clicked()
{
if(changdu>6)
ui->textEdit->setText("error");
else{
if(error!
=0)
{
ui->textEdit->setText(“不能连续输入两个运算符哦!
”);
}
else
{
error++;
if(my_state==SECOND)
{
if(my_sign==JIA||my_sign==JIAN)
ui->textEdit->setText("error");
else
cal();
//ui->textEdit->setText(QString:
:
number(result));
str=ui->textEdit->toPlainText()+'/';
ui->textEdit->setText(str);
frist=result;
second=0;
my_sign=CHU;
}
else
{
my_sign=CHU;
my_state=SECOND;
str=ui->textEdit->toPlainText()+'/';
ui->textEdit->setText(str);
}
}
}
}
//等于号运算函数
voidcalculor:
:
on_pushButton_enter_clicked()
{
if((my_sign==CHU)&&(second==0))
{
ui->textEdit->setText("”);
}
else
{
cal();
ui->textEdit->setText(QString:
:
number(result));
}
//shujuhuifu
frist=0;
second=0;
my_state=FRIST;
my_sign=NO;
}
//清楚键位函数
voidcalculor:
:
on_pushButton_clean_clicked()
{
ui->textEdit->clear();
my_state=FRIST;
my_sign=NO;
frist=0;
second=0;
result=0;
error=0;
changdu=0;
}
//数据转换函数
voidcalculor:
:
trans(charkey)
{
if(my_state==FRIST)
{
frist=frist*10+(int)key;
ui->textEdit->setText(QString:
:
number(frist));
}
else
{
second=second*10+(int)key;
//ui->textEdit->setText(QString:
:
number(second));
str=ui->textEdit->toPlainText()+QString:
:
number(int(key));
ui->textEdit->setText(str);
}
}
//数据运算函数
voidcalculor:
:
cal()
{
changdu=0;
error=0;
if(my_sign==JIA)
{
result=frist+second;
}
elseif(my_sign==JIAN)
{
result=frist-second;
}
elseif(my_sign==CHENG)
{
result=frist*second;
}
elseif(my_sign==CHU)
{
result=frist/second;
}
}
6.测试情况说明。
●6.1主要模块测试情况(白盒)
模块1、按键模块测试
用例
预期结果
实际结果
问题描述
修改方案
鼠标点击0—9十个键位
显示窗口显示0—9十个数
显示窗口显示0—9十个数
鼠标点击AC键
窗口中原来的数字消失归零
窗口中原来的数字消失归零
鼠标点击运算符
窗口显示运算符
窗口显示运算符
●6.2主要功能测试情况(黑盒)
功能1、键入数据位数限制测试
用例
预期结果
实际结果
问题描述
修改方案
键入6位以上的数字
键入第七位是窗口显示error
键入第七位是窗口显示error
功能2、被除数为零报错测试
用例
预期结果
实际结果
问题描述
修改方案
键入随意数除以0
窗口显示“被除数不能为零哦!
”
窗口显示“被除数不能为零哦!
”
功能3、连续键入两运算符报错测试
用例
预期结果
实际结果
问题描述
修改方案
连续键入两个运算符
窗口显示“不能连续输入两个运算符哦!
”
窗口显示“不能连续输入两个运算符哦!
”
7.实训中遇到的主要问题及解决方法
在数据转换函数中,键入second的时,输入数据出现上次数据无法清理的情况。
解决方法:
利用colculor.h中定义的key字符型数据,将key强制转换成int类型,然后加到前一个second中。
voidcalculor:
:
trans(charkey)
{
if(my_state==FRIST)
{
frist=frist*10+(int)key;
ui->textEdit->setText(QString:
:
number(frist));
}
else
{
second=second*10+(int)key;
str=ui->textEdit->toPlainText()+QString:
:
number(int(key));
ui->textEdit->setText(str);
}
}
8.实训收获与体会
在本次Linux实训中,熟悉了QT的基本界面,熟悉了QT基本编程过程,QT的简洁性易操作性是我对编程产生了浓厚的兴趣。
在这个过程中克服了许多困难,试验了许多种不同的防止数据溢出的方法,加入许多个判断控制输出error的开关,这个过程带给了我更优化的编程思想。
但是对QT的细节操作还是不熟悉,QT中的许多控件不熟悉,计算器界面不是很漂亮。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简单 计算器 报告