这个作业属于哪个课程 | 计科2班 |
---|---|
这个作业要求在哪里 | 作业要求 |
这个作业的目标 | < 要求实现一个自动生成小学四则运算题目的命令行程序 > |
[作业地址] (https://github.com/cr1017/3122004813)
一、时间预估及实际花费时间PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 40 | 40 |
Estimate | 估计这个任务需要多少时间 | 10 | 10 |
Development | 开发 | 240 | 360 |
Analysis | 需求分析 (包括学习新技术) | 120 | 150 |
Design Spec | 生成设计文档 | 20 | 25 |
Design Review | 设计复审 | 10 | 10 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
Design | 具体设计 | 20 | 25 |
Coding | 具体编码 | 30 | 35 |
Code Review | 代码复审 | 20 | 40 |
Test | 测试(自我测试,修改代码,提交修改) | 360 | 400 |
Reporting | 报告 | 60 | 50 |
Test Repor | 测试报告 | 30 | 25 |
Size Measurement | 计算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 20 | 15 |
合计 | 1000 | 1205 |
二、项目分析与设计
设计思路
参数解析:使用argparse库解析命令行参数。
题目生成:随机生成四则运算题目。
题目存储:将题目和答案存储到文本文件中。
题目校验:检查生成的题目是否符合要求。
2. 实现步骤
生成自然数和真分数:随机生成自然数和真分数。
生成表达式:根据四则运算规则生成表达式。
确保表达式合法:确保生成的表达式不会产生负数或非法的真分数。
避免重复:确保生成的题目不重复。
存储题目和答案:将题目和答案存储到文本文件中。
示例代码
以下是一个简单的Python脚本,实现了上述功能:
三、代码说明
四、测试运行
五、功能
- 参数解析 (parse_arguments)
使用argparse库来解析命令行参数:
-n, --number: 指定生成题目的数量,默认为10。
-r, --range: 指定数值范围,默认为10,表示生成的自然数和真分数的分母最大为10。 - 生成自然数和真分数
generate_number(range_limit): 随机生成一个0到range_limit - 1之间的自然数。
generate_fraction(range_limit): 随机生成一个真分数,分子和分母都在1到range_limit - 1之间,确保分子小于分母。 - 生成算术表达式 (generate_expression)
递归生成算术表达式,深度由max_depth参数控制(默认为3):
基础情况:如果深度达到最大深度,则生成一个自然数或真分数。
递归情况:随机选择加、减、乘、除运算符,递归生成左右操作数。 - 表达式求值 (evaluate_expression)
尝试计算给定表达式的值:
使用Python的eval函数进行求值,将除法运算符从/替换为//以处理整数除法。
如果求值过程中出现错误,则打印错误信息并返回None。 - 生成题目 (generate_question)
生成一个算术题目,确保表达式的计算结果有效:
循环调用generate_expression生成表达式,并使用evaluate_expression计算结果。
如果结果有效,则生成题目字符串。
六、项目小结
技术细节
使用了argparse库来处理命令行参,使用了random库来生成随机数和选择随机运算符,使用了fractions.Fraction来处理真分数的生成和运算。
创新点
通过递归函数和最大深度参数来控制表达式的复杂性,在生成减法和除法表达式时,特别处理了操作数的顺序,以确保结果的合法性。
性能和优化
代码效率:递归生成表达式的方法在深度较大时可能导致性能下降。可以通过非递归的方法或者增加更多的随机性来优化。
内存使用:随着生成题目数量的增加,存储题目和答案的列表可能会占用大量内存。可以考虑使用生成器或者分批处理的方法来减少内存占用。
未来改进方向
更复杂的表达式:增加括号来支持更复杂的表达式生成,使程序更易于使用,扩展程序以支持更复杂的数学运算,如幂运算、开方等。
项目小结:这次的项目,开始看题目以为很简单,但是到了实际做的时候,因为需求比较多,做起来非常困难,而且其中又很多自己原来没有学会的做法。而且这个程序做的不太好,虽然勉强能实现基本功能,但是括号、题目中有真分数等功能没有能实现,而且其中也有很多bug没有得到有效解决。在编写程序的时候,最主要的问题就是对随机出现的运算符进行讨论,因为出现了很多种情况,在编写过程中容易出现遗漏,或者算法不正确等情况,导致最后得到的答案不同,基本上处理方法都是调试,观察程序运行到哪步出现错误,然后对算法出错的那段代码进行修改。在随机函数的调用当中,srand((unsigned)time(0));这句话的使用如果出现在循环当中,就会导致输出的结果全部都是相同的,这句话要放在循环之外就能解决问题。