




已阅读5页,还剩32页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
附件二 学生用 简易计算器设计实习报告简易计算器设计实习报告 题 目 简易计算器设计简易计算器设计 学学 号号 姓姓 名名 专业班级专业班级 指导教师指导教师 实践日期实践日期 目目 录录 一 综合训练目的与要求 1 二 综合训练任务 1 三 总体设计 1 四 详细设计说明 1 五 调试与测试 1 六 实习日志 1 七 实习总结 1 八 附录 核心代码清单 1 1 一 综合训练目的与要求一 综合训练目的与要求 面向对象程序设计 课程设计是实践性教学环节之一 是 面向对象程序设计 课 程的辅助教学课程 该课程设计要求学生综合运用在 面向对象程序设计 课程中学到的面向对象技 术与实际编程相结合 独立完成一项较为完整 并具有一定实际功能的课程设计任务 同时加深学生对面向对象和C 编程技术的理解和掌握 培养实际的应用程序开发能力 在课程设计过程中 使学生养成良好的程序设计风格 并掌握C 应用程序的设计开发 过程和编程方法 测试方法 二 综合训练任务二 综合训练任务 1 综合任务综合任务 设计计算器类 实现带括号的复杂表达式的计算 2 个人任务个人任务 我的主要是在 qt 中学习和使用信号和槽的机制 此外 就是设计数字键 3 总体设计总体设计 1 功能模块图功能模块图 图 1 功能模块图 2 2 最终的最终的 UML 图图 图 2 stack 类 图 3 CalculatorWindow 类 3 3 个人设计个人设计 stack 的示图的示图 图 4 StackL 类 四 详细设计说明四 详细设计说明 1 工程文件视图工程文件视图 图 5 工程文件试图 2 2 类的介绍类的介绍 const int max len 20 栈的最大容量 栈类栈类 stack stack const int max len 20 栈的最大容量 4 函数 stack 构造函数 实现栈的初始化 stack 析构函数 int getTop 得到栈顶指针的值 void clear 清空栈 void push char c 符号入栈 void push float f 数字入栈 char pop char c 返回符号栈栈顶的符号 float pop int f 返回数字栈栈顶的数字 char remove char c 栈顶元素出栈 float remove int f 栈顶元素出栈 bool empty 判断栈是否为空 bool full 判断栈是否满了 分析 开始的时候只有 char s max len 没有 float n max len 这个属性 后来由于字符 和 float 型转换存在精度的问题 所以在 stack 类中加入了 float n max len 这个属性 使用的时候如果建立符号栈 那么只使用 char s max len 如果建立数字栈那么只使 用 float n max len 栈顶指针 int top 和其他函数是 char s max len 和 float n max len 公用 其中有 push pop remove 函数的参数没有具体意义只是为 了实现函数重载来实现不同栈的操作 运算类运算类 classclass calculator calculator 功能功能 实现功能选择和实现进制转换与表达式计算 属性属性 stack numStack 数字栈 stack operatorStack 符号栈 string str 字符串 输入的表达式 函数 函数 calculator 构造函数 virtual calculator 析构函数 void setStr 设置输入的数字或是表达式的字符串 string getStr 得到输入的数字或表达式的字符串 bool operatorCompare char stackOut char stackIn 运算符比较函数 void partCalculate char oper 局部计算函数 5 void calculate 选择表达式运算 bool operatorCompare char stackOut char stackIn 运算符比较函数 long int changeHexadecimal int num 进制转换函数实现进制的选择 float n max len 数字栈 char s max len 符号栈 int top 栈顶指针 实现表达式的计算 计算中可以有加减乘除 括号 利用栈的思想来实现 先取 得表达式 然后按序入栈 符号栈和数字栈 边入栈边进行运算最后的数字栈顶元素 为结果 这里面除了需要出入栈的操作 还需要进行符号优先级的设定和比较 用函 数 bool operatorCompare char stackOut char stackIn 实现 实现局部计算 栈内符号优先 级高于栈外符号优先级 用函数 void partCalculate char oper 实现 五 调试与测试五 调试与测试 1 这是在调试运行后的截图 2 这是我设计的栈代码 3 这是 calculatorwindow h 中的类 6 说明 1 可以进行常规四则运算 以及带括号的运算 2 在输入非法时会出现 表示输入错误 例 1 2 3 1 6 3 的运算 按下等号后显示结果如下 例 2 2 3 6 9 3 5 7 按下等号后显示结果如下 3 在非法输入时会自动报错 以除数是 0 为例 按下等号后显示结果如下 8 4 我们的计算器刚开始时不能计算负数 只要有负数 计算结果就出错 这是改进后的 终于计算正确了 八 附录 核心代码清单八 附录 核心代码清单 头文件 Calculatorwindow h ifndef JISUANQI H 9 define JISUANQI H endif JISUANQI H ifndef CALCULATOR H define CALCULATOR H 对 calculator h 头文件的声明 include 包含主窗体类 include 包含按键类 include 包含垂直布局器类 include 包含水平布局器类 include 包含显示框类 include stack h using namespace std class calculatorWindow public QWidget 计算器继承自主窗体类 Q OBJECT 必须加上这句 如果要调用信号 槽函数的操作的话 public calculatorWindow 计算器类的构造函数 calculatorWindow 计算器类的析构函数 public slots 定义各个按键按下后对应操作处理的槽函数 long int changeHexadecimal int num int power void numButtonPress char num 按数字响应事件 void opreateButtonPress char op 二元运算符响应事件 void danButtonPress char op 一元运算符的响应函数 void zeroButtonPress 调用 numButtonPress 函数 void oneButtonPress void twoButtonPress void threeButtonPress void fourButtonPress void fiveButtonPress void sixButtonPress void sevenButtonPress void eightButtonPress void nineButtonPress void decimalButtonPress void addButtonPress 10 void subButtonPress void mulButtonPress void divButtonPress void sinButtonPress void cosButtonPress void tanButtonPress void sqrtButtonPress void powButtonPress void binaryButtonPress void octButtonPress void hexButtonPress void rightPerButtonPress void leftPerButtonPress void clearButtonPress void backspaceButtonPress void equButtonPress void calculate 普通计算 void hexChange int num 进制转换函数 bool operatorCompare char stackOut char stackIn void partCalculate char oper void abortOperation 异常处理函数 string changeToABC int num string decToHex int number private QLineEdit operateEdit 声明显示框 QPushButton zeroButton 声明数字按键 QPushButton oneButton QPushButton twoButton QPushButton threeButton QPushButton fourButton QPushButton fiveButton QPushButton sixButton QPushButton sevenButton QPushButton eightButton 11 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 声明垂直布局器 该布局器主要对主窗体上面的空 间进行排布 QString input 计算器中要输入的代数表达式 stack numStack stack operatorStack bool opreate 0 判断是否输入了等号 bool opreated 0 如果输入了运算符 则置为 1 12 endif CALCULATOR H Stack h ifndef STACK H define STACK H const int max len 20 栈的最大容量 class stack private char s max len 栈的内容保存在数组中 int top 栈顶指示器 栈空时为 1 float n max len public stack stack int getTop void clear void push char c void push float f char pop char c float pop int f bool empty bool full char remove char c float remove int f endif STACK H 源文件 Buttonpress cpp include calculatorWindow h 数字键和最基本的运算符建的实现 void calculatorWindow numButtonPress char num 13 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 等待运算符输入 一元运算符的响应函数 void calculatorWindow danButtonPress char op if input 如果当前显示框为 0 input op 变 0 为 num else input operateEdit text input append op operateEdit setText input 更新显示框中的显示信息 二元运算符响应事件 void calculatorWindow opreateButtonPress char op 实现不能连续输入运算符 如果前面的字符为运算符 则 opreated 1 不能再次输入运算符 14 只有 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 数字键的实现 void calculatorWindow oneButtonPress numButtonPress 1 void calculatorWindow twoButtonPress numButtonPress 2 void calculatorWindow threeButtonPress numButtonPress 3 void calculatorWindow fourButtonPress numButtonPress 4 void calculatorWindow fiveButtonPress numButtonPress 5 void calculatorWindow sixButtonPress numButtonPress 6 15 void calculatorWindow sevenButtonPress numButtonPress 7 void calculatorWindow eightButtonPress numButtonPress 8 void calculatorWindow nineButtonPress numButtonPress 9 void calculatorWindow zeroButtonPress numButtonPress 0 运算符的按键响应 void calculatorWindow addButtonPress opreateButtonPress void calculatorWindow subButtonPress opreateButtonPress void calculatorWindow mulButtonPress opreateButtonPress void calculatorWindow divButtonPress opreateButtonPress 小数点按键处理 void calculatorWindow decimalButtonPress numButtonPress 16 三角函数的实现 考虑到运算的一致性 便于封装函数 故运算规则只能是先输入 数字 后输入运算符 在这里三角函数只是计算了弧度制的 void calculatorWindow sinButtonPress danButtonPress S void calculatorWindow cosButtonPress danButtonPress C void calculatorWindow tanButtonPress danButtonPress T 开方和平方的运算响应事件 void calculatorWindow sqrtButtonPress danButtonPress Q void calculatorWindow powButtonPress danButtonPress W 括号按键响应事件 void calculatorWindow rightPerButtonPress numButtonPress void calculatorWindow leftPerButtonPress numButtonPress 二进制的转换 void calculatorWindow binaryButtonPress hexChange 2 opreate 1 17 八进制的转换 void calculatorWindow octButtonPress hexChange 8 opreate 1 十六进制的转换 由于牵扯到非数字字符 暂时并未实现 void calculatorWindow hexButtonPress if opreate 判断是否开始第二次计算 如果 opreate 为真 单击数字键就表 示开始新的计算 operateEdit setText 0 opreate 0 将文本置为零 将 opreate 置为 0 一边下一次输入表达式 QString a operateEdit text int temp a toInt string result decToHex temp operateEdit setText QString fromStdString result opreate 1 功能键 等号按键的实现 void calculatorWindow equButtonPress opreateButtonPress calculate opreate 1 Clear 键的实现 void calculatorWindow clearButtonPress input 把运算操作数 2 清零 operateEdit setText input 更新显示框中的显示内容 退格键的实现 void calculatorWindow backspaceButtonPress 18 if opreate input operateEdit text input chop 1 if input isEmpty input operateEdit setText input Calculator cpp include include include include include 用 atof 时需要用到该头文件 include include calculatorwindow h include using namespace std define MAX 30 计算器输入的数字最大的字符个数为 30 异常处理函数 void calculatorWindow abortOperation input operateEdit setText tr 表达式计算 void calculatorWindow calculate operatorStack push QString input operateEdit text string s input toStdString cout s endl int i 0 int j w 1 char temp MAX float c while s i 0 19 if isdigit s i i 0 while i 0 operatorStack clear return cout 输入的数字的位数超出计算器的规定长度 请重新输入算式 endl abortOperation catch exception e numStack clear operatorStack clear return cout 输入的数字的位数超出计算器的规定长度 请重新输 入算式 endl abortOperation temp j 0 c atof temp 类型转换 将字符字符数组转换为数字 20 try if numStack full numStack push c catch exception e cout 输入的数字的位数超出计算器的规定长度 请重新输入 endl abortOperation 如果 s i 是数字或者是小数点那么就存入数组 temp 中 直到符号出现 然后将数字压入数字栈 else char stackin operatorStack pop a 取符号栈的栈顶元素 此处加一个对负数的判断 因为只有开头时负数才直接可以写符号 if i 0 cout numStack pop 1 setText QString number numStack pop 1 goto loop2 重启计算器 if s i 这里可以用等于来判断 if stackin operatorStack remove a 如果下一个符号是 并且栈内符号是 那么符号 出 栈 goto loop1 else 21 partCalculate stackin 栈内符号优先级较栈外符号优先级 高 局部计算 operatorStack remove a 使用完的符号从符号栈中移除 stackin operatorStack pop a 再与符号栈中的下一个 符号进行比较 栈内符号比栈外符号优先级高 计算 符号出栈 数字压栈 operatorStack push s i loop1 i 这里是为了去掉两个相邻的 进行下一步计算 如果去到的是符号 那么与栈内符号比较 loop2 return calculate cout numStack pop 1 setText QString number numStack pop 1 表达式计算 bool calculatorWindow operatorCompare char stackOut char stackIn operatorA 为栈内符号 operationB 为栈外符号 int tempOut tempIn switch stackOut case case tempOut 1 break case case tempOut 3 break case tempOut 7 break case tempOut 0 break 22 case S case C case T case O case X case Q case W tempOut 5 break 修改处 case tempOut 1 case tempOut 2 break 修改处 default abortOperation 这里要对异常进行处理 如何处理后面考虑 break switch stackIn case case tempIn 2 break case case tempIn 4 break case tempIn 0 break case tempIn 7 break case S case C case T case X case Q case W 23 tempIn 5 break case tempIn 1 break default abortOperation 这里要对异常进行处理 如何处理后面考虑 break 这里可以尝试用 goto 语句 或者是用重新调用一个函数 if tempOut tempIn return true else return false 该函数实现的是对栈外符号和栈内符号的比较 void calculatorWindow partCalculate char oper float temp1 float temp2 switch oper case S temp1 numStack remove 1 temp1 sin temp1 numStack push temp1 break case C temp1 numStack remove 1 temp1 cos temp1 numStack push temp1 break case T temp1 numStack remove 1 temp1 tan temp1 numStack push temp1 break case X temp1 numStack remove 1 24 if temp1 0 abortOperation else temp1 1 temp1 numStack push temp1 break case Q temp1 numStack remove 1 temp1 sqrt temp1 numStack push temp1 break case W temp1 numStack remove 1 temp1 pow temp1 2 numStack push temp1 break case temp1 numStack remove 1 temp2 numStack remove 1 temp1 temp1 temp2 numStack push temp1 break case temp1 numStack remove 1 temp2 numStack remove 1 temp1 temp2 temp1 numStack push temp1 break case temp1 numStack remove 1 temp2 numStack remove 1 temp1 temp1 temp2 numStack push temp1 break case temp1 numStack remove 1 temp2 numStack remove 1 25 temp1 temp2 temp1 numStack push temp1 break 栈内符号比栈外符号优先级高 取数字栈中的一个或两个操作数进行计算 实现十进制到二进制和十六进制的转换 long int calculatorWindow changeHexadecimal int num int power int b i t long int sum 0 s for i 0 num power i b num power num num power s 1 for t 0 t i t s s 10 sum sum b s s num for t 1 tsetText 0 opreate 0 将文本置为零 将 opreate 置为 0 一边下一次输入表达式 QString a operateEdit text int temp a toInt long int result changeHexadecimal temp num operateEdit setText QString number result 十进制转换成十六进制的函数 string calculatorWindow changeToABC int num 26 char c string s string str stringstream stream stream c str stream str switch num case 10 c A stream c s stream str break case 11 c B stream c s stream str break case 12 c C stream c s stream str break case 13 c D stream c s stream str break case 14 c E stream c s stream str break case 15 c F stream 16 tempN number 16 number number 16 if tempN 10 cout s endl s s changeToABC tempN else tempC tempN cout tempC str endl if number 10 cout s endl s s changeToABC number else tempC number cout tempC str 0 i sswap sswap s i 28 return sswap Calculatorwindow cpp include calculatorWindow h include calculator h using namespace std calculatorWindow calculatorWindow this setWindowTitle tr Calculator 设置窗体标题为 Calculator calc new calculators 按钮 operateEdit new QLineEdit this 初始化显示框 operateEdit setReadOnly true 设置显示框为只读 operateEdit setText tr 通过 setText 设置属性值 并通 text 过来 获得属性值 operateEdit setAlignment Qt AlignRight operateEdit setMaxLength 50 为文本框设置字体 QFont font operateEdit font font setPointSize font pointSize 8 operateEdit setFont font oneButton new QPushButton oneButton setText tr 1 oneButton setFixedHeight 60 oneButton setFixedWidth 60 twoButton new QPushButton twoButton setFixedHeight 60 twoButton setFixedWidth 60 twoButton setText tr 2 threeButton new QPushButton threeButton setText tr 3 threeButton setFixedHeight 60 threeButton setFixedWidth 60 fourButton new QPushButton fourButton setText tr 4 29 fourButton setFixedHeight 60 fourButton setFixedWidth 60 fiveButton new QPushButton fiveButton setText tr 5 fiveButton setFixedHeight 60 fiveButton setFixedWidth 60 sixButton new QPushButton sixButton setText tr 6 sixButton setFixedHeight 60 sixButton setFixedWidth 60 sevenButton new QPushButton sevenButton setText tr 7 sevenButton setFixedHeight 60 sevenButton setFixedWidth 60 eightButton new QPushButton eightButton setText tr 8 eightButton setFixedHeight 60 eightButton setFixedWidth 60 nineButton new QPushButton nineButton setText tr 9 nineButton setFixedHeight 60 nineButton setFixedWidth 60 zeroButton new QPushButton zeroButton setText tr 0 zeroButton setFixedHeight 60 zeroButton setFixedWidth 60 decimalButton new QPushButton decimalButton setText tr decimalButton setFixedHeight 60 decimalButton setFixedWidth 60 addButton new QPushButton addButton setText tr addButton setFixedHeight 60 addButton setFixedWidth 60 subButton new QPushButton 30 subButton setText tr subButton setFixedHeight 60 subButton setFixedWidth 60 mulButton new QPushButton mulButton setText tr mulButton setFixedHeight 60 mulButton setFixedWidth 60 divButton new QPushButton divButton setText tr divButton setFixedHeight 60 divButton setFixedWidth 60 rightPerButton new QPushButton rightPerButton setText tr rightPerButton setFixedHeight 60 rightPerButton setFixedWidth 60 leftPerButton new QPushButton leftPerButton setText tr leftPerButton setFixedHeight 60 leftPerButton setFixedWidth 60 equButton new QPushButton equButton setText tr equButton setFixedHeight 60 equButton setFixedWidth 60 clearButton new QPushButton clearButton setText tr clear clearButton setFixedHeight 60 clearButton setFixedWidth 60 backspaceButton new QPushButton backspaceButton setText tr backspace backspaceButton setFixedHeight 60 backspaceButton setFixedWidth 60 面板 firstLayout new QHBoxLayout 初始化水平布局到 Layout firstLayout addWidget oneButton firstLayout addWidget twoButton 31 firstLayout addWidget threeButton firstLayout addWidget addButton firstLayout addWidget clearButton secondLayout new QHBoxLayout secondLayout addWidget fourButton secondLayout addWidget fiveButton secondLayout addWidget sixButton secondLayout addWidget subButton secondLayout addWidget backspaceButton thirdLayout new QHBoxLayout thirdLayout addWidget sevenButton thirdLayout addWidget eightButton thirdLayout addWidget nineButton thirdLayout addWidget mulButton thirdLayout addWidget rightPerButton fourthLayout new QHBoxLayout fourthLayout addWidget zeroButton fourthLayout addWidget decimalButton fourthLayout addWidget divButton fourthLayout addWidget equButton fourthLayout addWidget leftPerButton 主窗口 mainLayout new QVBoxLayout this mainLayout addWidget operateEdit mainLayout addLayout firstLayout mainLayout addLayout secondLayout mainLayout addLayout thirdLayout mainLayout addLayout fourthLayout 信号和槽 connect addButton 发出信号的对象 SIGNAL clicked 捕抓的信号 this SLOT addContact 监测到信号后触发的 slot 函数 connect zeroButton SIGNAL clicked this SLOT zeroButtonPress 32 connect oneButton SIGNAL clicked this SLOT oneButtonPress connect twoButton SIGNAL clicked this SLOT twoButtonPress connect threeButton SIGNAL clicked this SLOT threeButtonPress connect fourButton SIGNAL clicked this SLOT fourButtonPress connect fiveButton SIGNAL clicked this SLOT fiveButtonPress connect sixButton SIGNAL clicked this SLOT sixButtonPress connect sevenButton SIGNAL clicked this SLOT sevenButtonPress connect eightButton SIGNAL clicked this SLOT eightButtonPress connect nineButton
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年潮汐能发电技术创新与商业化瓶颈突破策略报告
- 2025年乐山数学中考试题及答案
- 南充母婴店营销方案设计
- 亚马逊关联营销方案设计
- 2025年电机与拖动试题及答案
- 2025年护士篮球考试试题及答案
- 汽车专业对口试题及答案
- 对应急预案培训(3篇)
- 堵门事件应急预案(3篇)
- 俄语专业八级试题及答案
- 职业素养 课件 专题七 主动 给自己创造机会
- 住宅小区保洁服务合同范本
- 《护士输血流程》课件
- 小学英语“have”和“has”的用法(附练习题)
- 《股骨干骨折骨折》课件
- 生产车间5S样板蓝图规划
- 一年级行为好习惯养成教育课件
- 环境工程微生物学课后答案
- 干式气柜检修施工方案
- 佳能-EOSM-相机说明书
- 2024年食品生产企业食品安全管理人员监督抽查考试题库(含答案)
评论
0/150
提交评论