一、结对作业:随机生成四则运算式
1、题目的选择
题目1:
我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:
能够自动生成四则运算练习题
可以定制题目数量
用户可以选择运算符
用户设置最大数(如十以内、百以内等)
用户选择是否有括号、是否有小数
用户选择输出方式(如输出到文件、打印机等)
最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
2、角色的分配
驾驶员:张天齐
能够完成全部代码工作,程序基本实现全部要求功能,并将代码上传至coding.net或者GitHub代码托管系统中,能够对导航员在本次编程工作中起到的作用给出客观评价,并完成500字以上的总结。
领航员:冯玉正
能够辅助驾驶员完成全部代码工作,并且为关键函数选用合适的覆盖标准设计测试用例,并编写代码进行单元自动测试,能够根据上次作业的代码检查表对驾驶员的本次工作进行评价,能够对本次工作完成500字以上的总结。
功能实现
目前选择运算符,设置最大数,括号选择,小数选择等各个功能都已实现,但是在用户界面参数传递到内部类对象的过程有些许差错,还只能从函数内修改默认值来选择各种功能。
代码块
人生苦短,我用python
在自己写的模块Operat内定义一个类Operation
# -*- coding: utf-8 -*-
import random
class Operation:
def __init__(self):
pass
def OperatorSelect(self,subb = 1, mult = 1, divide = 1,summ = 1):
self.Optr = []
if summ == 1:
self. Optr.append(\'+\')
if subb == 1:
self. Optr.append(\'-\')
if mult == 1:
self.Optr.append(\'*\')
if divide == 1:
self.Optr.append(\'/\')
# for i in range(len(self.Optr)):
# print(i,self.Optr[i])
def Total():
pass
def Algorithms(self,Max, Oprend_Num,Allow_Decimals ):
Oprend_Num -= 1
self.Algo = []
if Allow_Decimals == 0:
for i in range(0,Oprend_Num): #分别将运算符和运算数传入一个新的列表
self.Algo.append(random.choice(range(1,Max)))
self.Algo.append(random.choice(self.Optr))
else:
for i in range(0,Oprend_Num):
decimal = random.uniform(1,Max)#分别将运算符和运算数传入一个新的列表
decimal = round(decimal,2)
self.Algo.append(decimal)
self.Algo.append(random.choice(self.Optr))
self.Algo.append(random.choice(range(1,Max)))
# for i in range(len(self.Algo)):
# print(self.Algo[i],end=\'\')
# for i in range(len(self.Optr)):
# print(i,self.Optr[i])
def ContainBracket(self,ContainBracket ): # 是否含有括号
self.temp = []
acc = 0
for i in range(0,len(self.Algo)):
print(self.Algo[i],end=\'\')
if ContainBracket == 0:
self.temp= self.Algo.copy()
elif ContainBracket == 1:
length_1 = len(self.Algo)
length_2 = len(self.Algo) + 2#插入一对括号后的列表长度
position_1 = random.choice(range(0,length_1 -2,2)) #随机设置左括号位置,已知括号所在位置索引为偶数
position_2 = random.choice(range(position_1 + 4, length_2,2)) #随机设置右括号位置
print(position_1,position_2)
# if position_1 != 0:
for i in range(0,position_1):#从开始插入原始运算式直至左括号位置
self.temp.append(self.Algo[acc])
acc += 1
self.temp.append( \'(\')
for i in range(position_1+1,position_2):#从左括号插入原始运算式直至右括号位置
self.temp.append(self.Algo[acc])
acc += 1
self.temp.append(\')\')
for i in range(position_2 + 1,length_2):#从右括号位置起始插入剩下运算式
self.temp.append(self.Algo[acc])
acc+=1
self.temp.append("=")
def File(self,Count ,Max ,ContainB,OprtNum , IsDecimal ):
with open (\'TeamHomeWork.txt\',\'a+\') as f:
for i in range(0,Count):
self.Algorithms(Max,OprtNum,IsDecimal)
self.ContainBracket(ContainB)
(f.write(str(self.temp).replace(\'[\',\'\').replace(\']\',\'\').replace
("\'",\'\').replace(\',\',\'\')+\'\\n\'))
# def main():
# Count = 2 #t题目数量
# Max = 100 #最大允许运算值
# ContainB = 0 #是否允许括号
# OprtNum = 4 #操作数个数
# IsDecimal = 0 #是否允许有小数
# sum = 1 # +
# sub = 1 # -
# mult = 1 # *
# div = 1 # /
# test = Operation()
# test.OperatorSelect(sum,sub,mult,div)
# test.File(Count,Max,ContainB,OprtNum, IsDecimal)
# if __name__ == \'__main__\':
# main()
Count = 0 #t题目数量
Max = 100 #最大允许运算值
ContainB = 1 #是否允许括号
OprtNum = 0 #操作数个数
IsDecimal = 0 #是否允许有小数
sum = 1 # +
sub = 1 # -
mult = 1 # *
div = 1 # /
Opt = Operation()
Opt.OperatorSelect(sum,sub,mult,div)
Opt.File(Count,Max,ContainB,OprtNum, IsDecimal)
\'\'\'
调用Opration模块
from Operat import Opt
from tkinter import *
Count = 2 #t题目数量
Max = 10 #最大允许运算值
ContainB = 1 #是否允许括号
OprtNum = 4 #操作数个数
IsDecimal = 1 #是否允许有小数
sum = 1 # +
sub = 1 # -
mult = 1 # *
div = 1
root = Tk()
root.title(\'小学生开心习题\')
root.geometry(\'400x400\')
def Evalua():
Opt.File(Count,Max,ContainB,OprtNum, IsDecimal)
button = Button(root,text=\'运行\',fg=\'red\',command=Evalua,activebackground = \'yellow\')
button.pack()
root.mainloop()
用户界面有一部分问题尚未解决,时间有限,待对Tkinter模块熟悉后再做后续更新
[代码链接请点这里][1]
[1]:https://coding.net/u/fashow/p/software_engineering/git/commit/9b4f9ff41c778cd8894a99e891616ffd3a320b67?public=true
运算题输出结果如下:
由于用户界面参数传递问题尚未解决只能做到这个程度
总结
经过一次结对编程的经验,第二次默契提升了不少。在结对编程的过程中两人能够互相学到很多,胖胖同学由于没怎么接触过python,但是由于天资聪颖,思维敏捷,各个方面一点就通(也印证了python适合做入门语言的一点)总体来说进展还是挺顺利的。在同伴的提醒与监督下,平时容易犯的小错误自己也会警惕很多,比一个人默默写代码效率提高了不少。经过几天的忙活,算是对以前自学的python来了次实战,学一门语言的最好方法就是拿来写,遇到问题就找方法解决,比起啃书,自己写过的代码和在脑子里过一遍的思维会增强对编程语言的理解,会发现内部设计的巧妙之处。
各个语言有各自最适合做的事,通过结对编程又深入学习了java和python两大法宝,算是增长了自己的本领。对于编程语言的学习,动手去敲代码是最好的方法,能够找到自己的不足,拓展对编程的理解,增加自己调试bug的经验,顺便磨练了自己的耐心和毅力。当然十八般武艺样样精通难度是很大的,但是至少能够知道有这一方面东西能够有一个查找的方向,计算机编程语言最大的特点就是一通百通不是吗。每一次结对编程都是对自己的以此提升,个人能力的一次不小的进步。<font color= green size=4