第五次作业

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. 列出随机的四则运算表达式。
  2. 计算所列出四则运算的结果。
  3. 接受用户输入并比较结果是否正确,并在命令行中表现出来。

问题1

  • 随机操作数、随机运算符、随机括号、随机长度等随机变量可以利用python自带随机函数取得。
  • 需要考虑除数及分母为0时的情况,此时表达式不成立。
  • 需要考虑随机生成括号的位置是否有意义的情况。

问题2

该种方法一般思路为:

    1. 将中缀表达式转化成后缀表达式。
    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('正确')

 

测试部分

测试截图

 


 

posted @ 2018-04-19 18:20  维城  阅读(196)  评论(0编辑  收藏  举报