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

如何解决

问题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的理解和运用,出现的问题我也会在接下来的作业中加以改进。

posted @ 2019-03-21 13:05  Lebron_Irving  阅读(380)  评论(0编辑  收藏  举报