小学四则运算程序
这个作业属于哪个课程 | 软件工程计科国际班 |
---|---|
这个作业要求在哪里 | 作业要求的链接 |
这个作业的目标 | 制作生成小学四则运算题目的程序、学习合作编程 |
组员 | 学号 |
---|---|
卢丹琪 | 3219009481 |
郑智文 | 3119009478 |
Github链接
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(h) | 实际耗时(h) |
---|---|---|---|
Planning | 计划 | 0.5 | 0.5 |
· Estimate | · 估计这个任务需要多少时间 | 0.5 | 0.5 |
Development | 开发 | 39 | 52 |
· Analysis | ·需求分析 (包括学习新技术) | 5 | 8 |
· Design Spec | · 生成设计文档 | 0.5 | 0.5 |
· Design Review | · 设计复审 | 0.5 | 0.5 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 1 | 1 |
· Design | · 具体设计 | 3 | 5 |
· Coding | · 具体编码 | 25 | 30 |
· Code Review | · 代码复审 | 3 | 5 |
· Test | · 测试(自我测试,修改代码,提交修改) | 1 | 2 |
Reporting | 报告 | 1.3 | 1.8 |
· Test Report | · 测试报告 | 0.5 | 0.5 |
· Size Measurement | · 计算工作量 | 0.3 | 0.3 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 0.5 | 1 |
· 合计 | 40.8 | 54.3 |
计算模块接口的设计与实现过程
核心思路
穷举:根据运算符的数量和括号的位置列明了所有可能情况
调用:算法都是类似的,先写基本操作代码,复杂的计算通过不同的调用来实现
流程图:
关键算法
1、生成随机数
人为操作了一下,使得生成整数和生成分数的概率不一致
2、生成随机运算符
3、两个基础运算
(1)两个数的四则运算
多个数的四则运算都基于两个数的四则运算,因此先写一个两位数的运算函数
ps:减法和除法均匀异常处理,在异常处理说明有详细解释
(2)三个数的四则运算
此次题目的要求是生成不多于三个运算符的四则运算题目,为了计算方便,写一个三个数的运算函数。此函数无括号,仅考虑运算符的优先级,遵循先加减后乘除的原则
定义信号量Sign,若运算符是“+”或“-”,Sign=0,若运算符是“*”或“/”,Sign=1
运算符同号时,即S1异或S2等于0;异号时异或结果为1
当Sign1^Sign2=0 或者 Sign1=1时,式子顺序执行
不然就后面两个数先运算得到中间结果,再和前面的数进行运算
4、单运算符的计算和题目的生成
(不需要加括号)
调用基础函数
题目写入数组,转为字符串后返回
5、双运算符的计算和题目的生成
是否生成无括号
若不生成,调用基础函数
若生成,定义括号的位置
若在前,就先将前面两个数进行基础运算,得到中间结果再和第三个数进行运算
若在后,就先将后面两个数进行基础运算,得到中间结果再和第一个数进行运算
题目写入数组,转为字符串后返回
6、三运算符的计算和题目的生成
是否生成无括号
若不生成,因为符号的组合太多了,就用符号信号量来分情况处理计算的先后,方法其实和两位数的运算一样,只是复杂了亿点点
判断优先级后调用三次基本运算
共八种情况,当然有一些情况可以合并,但是由于我懒,不想分类情况了,就全写出来了,也不难,就是很麻烦罢了
例如:三个符号分别为+ * + 信号量组合就为 010; 三个符号分别为/ * - 信号量组合就为 110
根据不同的信号量的组合,将式子进行运算(结合顺序不同)
若生成,共十种情况
单括号时只需要调用两次基本运算
双括号时需要调用三次基本运算
7、假分数处理
将假分数进行向下取整,得到真分数的整数部分
再将原假分数减整数,得到真分数的分数部分
性能分析
改进前:
改进后:
关系图:
计算模块部分单元测试展示
单元测试代码:
计算模块部分异常处理说明
除数不能为0
设置一个信号量,并使其初值为1。当进行除法运算时,判断被除数是否为0。若除数为不为0,信号量不变,继续运算;除数若为0,信号量变为0,此时结果为0,继续运算(保证程序的正常运行,所以让它有一个结果并继续运算),但是该题目不会输出,而是进行下一题的生成和输出。
信号量right的初值为1:
做除法时信号量可能发生变化:
输出题目的控制条件:信号量必须为1
生成的题目中计算过程不能产生负数
设置一个信号量,并使其初值为1。当进行减法法运算时,判断被减数是否大于减数。若被减数大于减数,信号量不变,继续运算;若被减数小于减数,信号量变为0,继续运算(保证程序的正常运行,所以让它有一个结果并继续运算),但是该题目不会输出,而是进行下一题的生成和输出。
信号量right的初值为1:
做减法时信号量可能发生变化:
输出题目的控制条件:信号量必须为1且再一次判断结果是否非负
分数的处理
约分处理:python的Fraction函数自带约分功能
控制输出的都是真分数:
自定义一个函数,将分数向下取整,得到带分数的整数部分;再将假分数减去得到的整数,得到带分数的真分数部分。
输出时,会输出整数或真分数
测试结果:
用户输入:
生成题目
批改题目:
结果:
生成一百道题的部分截图
可支持10000道题的生成
个人总结:
第一次合作编程还是非常不熟悉且不习惯的,可以共同讨论做法,但是比较难实现双人编程。