第五次作业
Github项目地址
https://github.com/gu1915736583/Pendragon
PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 10 | 23 |
Estimate | 估计这个任务需要多少时间 | 15 | / |
Development | 开发 | 120 | 120 |
Analysis | 需求分析(包括学习新技术) | 100 |
190 |
Design Spec | 生成设计文档 | / | / |
Design Review | 设计复审(和同事审核设计文档) | 20 | 5 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 10 | 10 |
Design | 具体设计 | 30 | 30 |
Coding | 具体编码 | 100 | 120 |
Code Review | 代码复审 | 30 | 20 |
Test | 测试(自我测试,修改代码,提交修改) | 20 | 20 |
Reporting | 报告 | 60 | 100 |
Test Report | 测试报告 | 10 | 10 |
Size Measurement | 计算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 30 | 30 |
合计 | 505 | 688 |
项目要求
- √ 参与运算的操作数(operands)除了100以内的整数以外,还要支持真分数的四则运算。操作数必须随机生成。
- √ 运算符(operators)为 +, −, ×, ÷ 运算符的种类和顺序必须随机生成。
- √ 要求能处理用户的输入,并判断对错,打分统计正确率。
- √ 使用 -n 参数控制生成题目的个数。
附加要求
- √ 支持带括号的多元复合运算
- √ 运算符个数随机生成(考虑小学生运算复杂度,范围在2~10)
解题思路
这个题目最开始是在课堂上何老师提出引起大家的思考,一开始我并没有意识到这个题目的复杂性。这个题目可以被划分为以下三个问题:
- 列出随机的四则运算表达式。
- 计算所列出四则运算的结果。
- 接受用户输入并比较结果是否正确,并在命令行中表现出来。
问题1
- 随机操作数、随机运算符、随机括号、随机长度等随机变量可以利用python自带随机函数取得。
- 需要考虑除数及分母为0时的情况,此时表达式不成立。
-
需要考虑随机生成括号的位置是否有意义的情况。
问题2
该种方法一般思路为:
- 将中缀表达式转化成后缀表达式。
- 通过栈计算后缀表达式的值。
其中需要考虑运算符优先级问题以及栈的结构。
问题3
判断用户输入情况只需接受用户输入比较统计得分即可。由于要求采用命令行界面完成,该部分主要需要控制及美化命令行界面。
代码说明
展示出项目关键代码
import random opr = ['+','-','×','÷'] #四则运算符 jg='0' print('输入"q"可以退出') num=1 while True: fh=random.randint(0,3) x=random.randint(1,100) y=random.randint(1,10) rjg=0 if fh==0: #加法答案 rjg=x+y elif fh==1: #减法答案,只要求运算正数 x,y=max(x,y),min(x,y) rjg=x-y elif fh==2: #乘法答案 rjg=x*y elif fh==3: #除法答案,只要求整除运算 x,y=max(x,y),min(x,y) while x%y!=0: x=random.randint(1,100) y=random.randint(1,10) x,y=max(x,y),min(x,y) rjg=int(x/y) print ('第',num,'题:',x,opr[fh],y,'=',end='') #输出题目 num+=1 jg=input() if jg=='q': break sr=int(jg) while int(sr)!=rjg: #确认答案是否错误 print('答错了,输入"a"获得正确答案') #回答错误,可输入'a'得到answer print('再算一遍,第',num,'题:',x,opr[fh],y,'=',end='') #给予一次机会回答 jg=input() if jg=='a': print('正确答案为:',rjg) break; sr=int(jg) if int(sr)==rjg: break; continue; if int(sr)==rjg: print('正确')
测试部分
测试截图