python_第一次作业 四则运算
四则运算:
码云链接 https://gitee.com/kyrie_dong/lkdFFR/tree/master
小学生的四则运算】--PSP表格
psp | 任务计划 | 计划完成需要的时间(min) | 实际完成需要的时间 |
Planning | 计划 | 120 | 80 |
Estimate |
估计这个任务需要多少时间,并 规划大致工作时间 |
60 | 40 |
Development | 开发 | 300 | 300 |
Analysis | 需要分析(包括学习新技术) | 120 | 60 |
Design Spec | 生成设计文档 | 10 | 5 |
Design Review | 设计复审 | 20 | 30 |
Coding Standard | 代码规范 | 20 | 20 |
Design | 具体设计 | 60 | 30 |
Coding | 具体编码 | 300 | 400 |
Code Review | 代码复审 | 100 | 30 |
Test | 测试(自我测试,修改代码,提交代码) | 10 | 20 |
Reporting | 报告 | 60 | 40 |
Test Report | 测试报告 | 60 | 120 |
Size Measurement | 计算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan |
事后总结,并提出改进计划 | 60 | 30 |
合计 | 1310 | 1215 |
项目要求
1、能自动生成小学四则运算题目
2、题目中不能出现负数或者结果为负数
3、除了整数的运算还包括真分数的运算
附加要求
1、自动产生括号
2、随机生成多个表达式
思路描述
这个题目可以被划分为以下三个问题:
- 列出随机的四则运算表达式。
- 计算所列出四则运算的结果。
- 接受用户输入并比较结果是否正确,并在命令行中表现出来。
如何解决
问题1
- 随机操作数、随机运算符、随机括号、随机长度等随机变量可以利用python自带随机函数取得。
- 需要考虑除数及分母为0时的情况,此时表达式不成立。
问题2
- python中有一个函数eval能计算表达式的结果,但结果可能会为分数,要利用库fractons中的一个函数Fraction,把输出的结果全转成分数,所以整数的不变,小数的变分数
- 再使用一个result的列表存储每一个表达式结果,再用for提取其中的每个结果
问题三
- 利用input()函数输入答案,再用eval和Fraction转成数字。
- 使用一个answer 的列表存储每一个输入的答案,再用for 提取其中的每个答案并与result中的结果一一对应,判断其对错
代码:
import random
from fractions import Fraction
operation = ['+', '-', '*', '/'] #四则运算的符号
global f
question = []
result = []
answer = []
def result_integer(f, m):
try:
n = eval(f)
n = Fraction('{}'.format(n)).limit_denominator() # 把表达式的结果转成分数
if n > 0: # 判断结果是否大于0,否则重新产生表达式
#print('题目:')
question.append(f)
result.append(n)
#print('请输出答案:')
#x = Fraction('{}'.format(eval(input()))).limit_denominator()
else:
integer()
except:
integer(m)
def func_integer(number):
f = ''
ch = []
rand = random.randint(0, 1) #选择内嵌或外嵌括号
if number != 1: #避免一个表达式也产生括号
if rand == 0:
ch.append('(')
op = operation[random.randint(0, 1)]
ch.append(random.randint(1, 10))
ch.append(op)
ch.append(random.randint(1, 10))
ch.append(')')
else:
op = operation[random.randint(0, 3)]
if op == '/':
a = random.randint(1, 10)
ch.append(a)
ch.append(op)
ch.append(random.randint(a, 10))
else:
ch.append(random.randint(1, 10))
ch.append(op)
ch.append(random.randint(1, 10))
else:
op = operation[random.randint(0, 3)]
if op == '/':
a = random.randint(1, 10)
ch.append(a)
ch.append(op)
ch.append(random.randint(a, 10))
else:
ch.append(random.randint(1, 10))
ch.append(op)
ch.append(random.randint(1, 10))
for i in ch: #把产生表达式当成一个整体
f += str(i)
return f
def integer(n):
ch = [] #存储表达式
number = random.randint(1, 4) #随机产生表达式的数量
for i in range(number):
rand = random.randint(0, 1) #随机产生0和1 判断是否使用括号
a = func_integer(number) #调用表达式产生函数,产生表达式
if rand == 0:
op = operation[random.randint(2,3)] #产生*,/来连接有括号的表达式,避免产生+,—
rand = random.randint(0, 1) #随机产生0和1 判断是否使用内嵌括号或外嵌括号
if i != number - 1: #避免开始和结尾用无意义的括号
if rand == 0:
ch.append('(')
ch.append(a)
ch.append(op)
ch.append(random.randint(1,10))
ch.append(')')
ch.append(operation[random.randint(0, 3)])
else:
ch.append(a)
ch.append(operation[random.randint(0, 3)])
else:
ch.append(a)
ch.append(operation[random.randint(0, 3)])
else:
ch.append(a)
ch.append(operation[random.randint(0, 3)])
f = ''
for k,i in enumerate(ch): #把列表中的所有值用f一个个连起来
if k != len(ch)-1:
f += str(i)
result_integer(f, n) #调用输出函数
if __name__ == '__main__':
print('输入你想做几道题目')
n = int(input())
for i in range(n):
integer(n)
print('题目:')
for k, i in enumerate(question):
print(k + 1,':',i,'=')
print('请输入你的答案:')
for i in range(n):
print('第{}题:'.format(i + 1))
x = Fraction('{}'.format(eval(input()))).limit_denominator()
if x == result[i]:
print('{}:√'.format(i + 1))
else:
print('{}:×'.format(i + 1))
print('正确的答案为:',result[i])
运行结果:
效能分析
总结及收获
本次作业核心代码相对简单,在运行、测试的过程中花了不少时间,虽然能满足一般的四则运算要求,但是还是有不合理的地方,比如连续的乘、除号(类似:"4*9/7+8=",不符合一般的出题规则)和无效的括号(括号中是乘、除法),总体还是收获不少,加深了对python的理解和运用,出现的问题我也会在接下来的作业中加以改进。