小学四则运算程序

这个作业属于哪个课程 软件工程计科国际班
这个作业要求在哪里 作业要求的链接
这个作业的目标 制作生成小学四则运算题目的程序、学习合作编程

组员 学号
卢丹琪 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道题的生成

个人总结:

第一次合作编程还是非常不熟悉且不习惯的,可以共同讨论做法,但是比较难实现双人编程。

posted @ 2021-10-07 20:26  一颗卤蛋  阅读(126)  评论(0编辑  收藏  举报