四则运算项目

news/发布时间2024/5/15 16:47:09

四则运算器实现

这个作业属于哪个课程 软件工程
这个作业要求在哪里 四则运算
这个作业的目标 总结成败得失,分享经验,总结教训

你可以在GitHub上找到本项目并下载所有的算法和查看日志

Slave

使用手册

计划

第二次使用PSP方法进行软件实现,本次编程吸取上一次的经验,在实现一个模块,立即生成测试文件对模块进行测试,可以降低后期bug修改成本

开发

需求分析

功能需求:用户需要一个四则运算生成器

开发环境:Python3环境下进行开发

产品功能:可以使用-n来控制题目生成个数

​ -r可以控制数值范围

​ 可以对比题目与答案对错

开发须知:生成的题目中计算过程不能产生负数

​ 生成的题目中如果存在形如e1÷ e2的子表达式,那么其结果应是真分数

​ 每道题目中出现的运算符个数不超过3个

​ 程序一次运行生成的题目不能重复

特色说明

项目基本实现了所有要求
1.其中真分数和假分数的实现及其复杂,我能查到的方法也只是在每次计算把假分数转换为真分数的表示,在打印的时候又转换回去
2.实现了简单的UI界面,这部分花了不少时间学习如何使用tkinter库
3.实现了对比器和生成器的功能,只是简单调用了之前实现的逻辑
4.使用中文除号代替了英文除号,这使得每次运算都要转换回去
5.可以支持生成10000及以上的题目数量
6.还可以自定义范围(可以不指定默认为10)
7.在异常操作后都会有弹窗提醒用户

接口设计

考虑到需求主要有两个:生成随机四则运算和对比题目与答案

此处仅给出接口大致使用,具体代码和难点分析请查看另一个手册

生成器接口设计
1.用于传入范围随之生成随机数
generate_number(min_num, max_num):
2.通过接受题目数量和范围,调用随机数生成函数来进一步生成表达式
generate_exercises(num_exercises, min_num, max_num): 
3.对传入的表达式字符串进行转换计算得到答案,从而把表达式和答案都写入文件中
write_to_files(exercises):
对比器接口设计
1.将假分数的形式转换为普通分数的形式
convert_mixed_fraction(fraction):
2.将表达式中的每个操作数都转换为普通分数的形式
convert_mixed_fraction_in_expression(expression):
3.对比函数主实现,具体逻辑参考另一个手册
compare_answers(exercise_file, answer_file, output_file):
UI设计

尝试以图形化替代命令行

第一部分:生成器的设计
主体函数
open_generator():用于构建一个图形化界面,并且实现生成器的调用go_back():用户按下返回按钮可以实现返回主界面操作display_answers_and_notify():实现了将答案文件读取并打印在图形化界面的操作generate_and_display_exercises():实现了对表达式文件读取并打印的操作
第二部分:对比器的设计
主题函数
open_comparator():用于构建一个图形化界面,用于对比器的调用go_back():用户按下返回按钮可以实现返回主界面操作run_comparator():使得用户能通过OS的操作选择输入的文件,省去了对绝对或相对路径的转换判断open_file_dialog():会被run_comparator()函数调用来处理选择的文件路径,便于对比

测试运行

仅仅针对图形化之前进行测试,图形化测试没有意义,此处仅给出一个测试代码

其他测试可以在手册中找到

这个测试是针对compare函数中用于处理真分数与假分数的两个函数,其对compare函数有很大影响

import unittest
from compare import convert_mixed_fraction, convert_mixed_fraction_in_expressionclass TestConversionFunctions(unittest.TestCase):def test_convert_mixed_fraction(self):self.assertEqual(convert_mixed_fraction("1’1/2"), "(1 + 1/2)")self.assertEqual(convert_mixed_fraction("2"), "2")def test_convert_mixed_fraction_in_expression(self):self.assertEqual(convert_mixed_fraction_in_expression("1’1/2 + 2"), "(1 + 1/2) + 2")self.assertEqual(convert_mixed_fraction_in_expression("2 - 1’1/2"), "2 - (1 + 1/2)")if __name__ == '__main__':unittest.main()

结果如下:

效能分析

这个部分很难做,我一开始考虑如何将两个UI放在两个文件中,再在主文件中调用,我发现这样做使得主文件调用附文件,附文件再调用主文件,这样会产生巨大延长以及无法啊正常显示UI的bug,于是我将UI的实现都放入一个文件中

更改前

两个文件储存两个UI,之后在一个文件中调用使得UI出现问题即无法正常返回主界面

更改后

给出函数耗费时间

可见主函数使用时间最长

给出函数调用图

这次项目各处运行很快,便没有使用模块测试耗费时间和优化运行效率

PSP表

*PSP2.1* *Personal Software Process Stages* *预估耗时(分钟)* *实际耗时(分钟)*
Planning 计划 60 30
· Estimate · 估计这个任务需要多少时间 160 140
Development 开发 500 360
· Analysis · 需求分析 (包括学习新技术) 200 300
· Design Spec · 生成设计文档 60 60
· Design Review · 设计复审 20 30
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 5 5
· Design · 具体设计 60 80
· Coding · 具体编码 200 150
· Code Review · 代码复审 60 30
· Test · 测试(自我测试,修改代码,提交修改) 120 160
Reporting 报告 60 40
· Test Repor · 测试报告 20 15
· Size Measurement · 计算工作量 5 5
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 10
· 合计 1560 1415

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/50118450.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

04-python数据容器

列表 元组 定义 变量名称 = (x,y,z) #定义空元组 t1 = ()或tuple()ps: 定义单个元素的元组时,必须加上逗号,不然就是单个元素的类型,而不是元组类型 t1 = ("hello") print(type(t1)) #str t2 = ("hello",) print(type(t2)) #tuple元组的操作# 取元组…

计算机/网安 面试例题(十)

计算机/网安 面试例题(十)—— 渗透测试信息收集服务器的相关信息(真实ip,系统类型,版本,开放端口,WAF等) 网站指纹识别(包括,cms,cdn,证书等),dns记录 whois信息,姓名,备案,邮箱,电话反查(邮箱丢社工库,社工准备等) 子域名收集,旁站,C段等 google hack…

Docker 容器编排利器 Docker Compose

Docker 容器编排利器 Docker Compose 一、Docker Compose 简介 Docker Compose 项目是 Docker 官方的开源项目,Compose 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,来源于之前的 Fig 项目,使用 Python 语言编…

docker-运行mysql服务

环境说明 linux系统版本:lsb_release -adocker 版本: docker -v 不同的操作系统以及软件版本,可能会遇到不一样的问题,一定要注意版本问题。查看docker中 mysql的版本,可以去官网,需要kx上网才能打开。 https://hub.docker.com/最好是确认自己的服务器已经设置阿里云的镜像…

网工

网关路由:不同网段之间的联通 注:进去之前system-view常用命令:display ip interface brief #查看配置的IP IP配置情况:dis ip int b 静态路由:#查看到达目的的路由信息display ip routing-table 192.168.xx#配置静态路由信息 1.1是目的ip,2.1是下一跳ip route-static 1…

gitlab修改ip 导致 runner build 拉取失败

问题如下图:访问的地址是错误的,192.168.20.129是之前的 gitLab的配置访问地址已经改了 vim /etc/gitlab/gitlab.rb,这里还需要改gitlab.yml文件 unable to access http://gitlab-ci-token:[MASKED]@192.168.23.131/dev/....第一步,修改gitlab.yml文件 cd /opt/gitlab/embe…