Git地址 | 我(sNpky)的代码 |
---|---|
GIT用户名 | sNpky |
学号后五位 | 61217 |
博客地址 | -我的博客地址- |
作业链接 | 作业要求 |
代码设计思路
题目要求:
阿超家里的孩子上小学一年级了,这个暑假老师给家长们布置了一个作业:家长每天要给孩子 出一些合理的,但要有些难度的四则运算题目,并且家长要对孩子的作业打分记录。
作为程序员的阿超心想,既然每天都需要出题,那何不做一个可以自动生成小学四则运算题目与解决题目的命令行 “软件”呢。他把老师的话翻译一下,就形成了这个软件的需求:
程序接收一个命令行参数 n,然后随机产生 n 道加减乘除(分别使用符号+-*/来表示)练习题,每个数字在 0 和 100 之间,运算符在 2 个 到 3 个之间。
由于阿超的孩子才上一年级,并不知道分数。所以软件所出的练习题在运算过程中不得出现非整数,比如不能出现 3÷5+2=2.6 这样的算式。
练习题生成好后,将生成的 n 道练习题及其对应的正确答案输出到一个文件 subject.txt 中。
当程序接收的参数为4时,以下为一个输出文件示例。
13+17-1=29
11*15-5=160
3+10+4-16=1
15÷5+3-2=4
我的设计思路
读完题目,我对于题目的理解就是把生成的随机数和运算符号打印出来并且做一个文档保存操作,代码我选择了使用python来实现,新学的语言没有怎么写过代码刚好实践一下,另外我觉得Python来写应该会简单一点。下面我一步一步把我我的代码解剖出来
一.导入随机数模块:
要生成不同的随机数需要导入一个python模块random
#导入随机数模块可以生成随机数
import random
二.生成符合要求的随机数
(1)题目要求生成100以内的加减乘除运算,于是生成的范围range(1,100)可以定下来。
#生成三个一百以内的随机数
num1 = random.randint(1, 100)
num2 = random.randint(1, 100)
num3 = random.randint(1, 100)
(2)用随机数生成符号,先把需要的加减乘除符号放在list列表里面存着,加上编号就可以访问到需要的符号了,于是我写了两个字符数组,分别来存放+,-和×,÷
#在这里面写好符号
operater1 = ['+', '-']
operater2 = ['×', '÷']
再来生成两个随机数,来给这两个列表使用,就可以像访问数组一样的方法来访问符号了。这两个随机数range控制在0到1,因为list operater里面就存了两个符号。
#设置i来控制加减,j来控制乘除
i = random.randint(0, 1)
j = random.randint(0, 1)
#最基本的打印就应是这样的
print("{0}{1}{2}{3}{4}={5}".format(num1, operater1[i], num2, operater2[j], num3, answer))
也就是 num1+num2÷num3=answer
一年级的小朋友还不会做小数运算,所以我们得控制不能出现小数,由于我前面定义了j来控制乘除,也就是说规定了num2和num3 在随机数j==1的时候需要使用 num2来控制num3的数值,需要出现一个能被num2整除的num3.
第一次尝试:
n = random.randint(1,100)
while j == 1:#做除法的时候
if num2 % n == 0:
num3 = n
break
else:
n = random.randint(1,100)
我打开了文档看到了算术题出了问题,除法有问题,我觉得我的思路是没有问题的,找一个可以被num3整除的数,但是在函数里面利用循环不断利用random来给变量赋值这样的做法是不对的,于是乎我想了一个办法,就是给num2写一个生成可以被num3整除的数的函数 CreatNew()
这个是在前面声明的函数
def CreatNew():
Number=random.randint(1,100)
return Number
#下面来控制 除数为整数的条件
while j == 1:
#做除法的时候
if num2 % num3 == 0:
break
else:
num3=CreatNew()
#当num2不能被num3整除调用CreatNew()
我们这个时候查看一下打印的情况
还好一切正常,我觉得这里也稍微体现了封装的思想,把哪些重复的代码写入函数多次调用。我们接着往下走。打开一个文件我们可以保存print的算式
f = open("计算题.txt", 'a')
分情况计算出不同计算次序的答案:
#先+后÷的情况下
if i == 0 and j == 1:
answer = num1 + num2 / num3
print("{0}{1}{2}{3}{4}={5}".format(num1, operater1[i], num2, operater2[j], num3, answer), file=f)
# 关闭文件防止文件数据丢失
f.close()
写4个这样的if语句就可以搞定了。
下面是完整代码
#导入随机数模块可以生成随机数
import random
def CreatNew():
Number=int(random.randint(1,100))
return Number
def GetAnswer():
#生成三个一百以内的随机数
num1 = int(random.randint(1, 100))
num2 = int(random.randint(1, 100))
num3 = int(random.randint(1, 100))
#在这里面写好符号
operater1 = ['+', '-']
operater2 = ['×', '÷']
#设置i来控制加减,j来控制乘除
i = random.randint(0, 1)
j = random.randint(0, 1)
#下面来控制 除数为整数的条件
while j == 1:#做除法的时候
if num2 % num3 == 0:
break
else:
num3=CreatNew()
# 打开所希望写入的文件
f = open("计算题.txt", 'a')
#先+后÷的情况下
if i == 0 and j == 1:
answer = num1 + num2 / num3
print("{0}{1}{2}{3}{4}={5}".format(num1, operater1[i], num2, operater2[j], num3, answer), file=f)
# 关闭文件防止文件数据丢失
f.close()
#先+后×的情况下
elif i == 0 and j == 0:
answer = num1 + num2 *num3
print("{0}{1}{2}{3}{4}={5}".format(num1, operater1[i], num2, operater2[j], num3, answer), file=f)
# 关闭文件防止文件数据丢失
f.close()
#先-后×
elif i == 1 and j == 0:
answer = num1 - num2 * num3
print("{0}{1}{2}{3}{4}={5}".format(num1, operater1[i], num2, operater2[j], num3, answer), file=f)
# 关闭文件防止文件数据丢失
f.close()
#先-后÷
else:
answer = num1 - num2 / num3
print("{0}{1}{2}{3}{4}={5}".format(num1, operater1[i], num2, operater2[j], num3, answer), file=f)
# 关闭文件防止文件数据丢失
f.close()
n = int(input("请输入你想生成的题目"))
for i in range(0, n):
GetAnswer()
环境配置
本来我写python使用 python自带的编译器的,但是为了方便测试我下载了pycharm编译器,英语不太好熟悉这个环境搞得我有点头痛。pycharm官网官方链接
download-->
Community->DOWNLOAD这个不是专业版不要钱的嘿嘿
对python感兴趣的朋友也可以下载自带编译器,20多M方便好用
python官网:https://www.python.org/
浏览器下载即可(浏览器翻译一下就可以)
选择路径就可以开始写第一个python程序了。
代码测试
在python中有一个模块unittest 单元测试,unittest 是 Python 自带的单元测试框架,用于编写和运行可重复的测试。由于我的程序主体函数只有一个,其他函数都是围绕这个函数工作的。那么我们只测试一个函数就可以了。
选择我需要测试的函数GetAnswer() 按住ctrl+shift+t
会自动生成一个test_getAnswer.py的测试文件,方便的很。点击上方按钮run
跑一下测试函数
打开了文档确实测试打印50道题目:
测试成功
回归测试*
在做过测试以后我修复了一些问题,但是又有新的问题我打印出大量计算式有发现这个
于是乎我在测试后再返回来,对于数据进行处理调整一些赋值找到了问题就是在于我不能既保证数据可以被整除又保证为正数,回去读题目发现要求可以出现负数于是我修改了函数,就是上面代码原来的错误代码就不展示了。回归测试就是在修改过后再来发现有没有因为修改bug而造成新的bug出现的过程我个人是这样理解的。
上传代码
代码提交太恼火了,我先是自己手动提交了一遍,我觉得有点不对劲就把手动提交的东西删掉了。寻找一条使用命令行指令提交的方式。我觉得是我自己已经提交过的原因我再次使用命令行指令提交的时候总是碰壁老师遇到这个返回错误403
读了一篇关于个报错的博客我按照上面的做法做了,效果不是太好。没有搞定,我想应该是我第一次手动提交导致有些缓存在里面不能正常工作。下面我来写一下我的提交方法:
选择你的代码文件,然后上传
点击提交你的文件,完成上传任务。
本次作业感想与小结
和大家一样完成本次作业花了不少功夫,当然也有自己的收获。首先是锻炼了一下自己python编码的能力,毕竟python是自己在学,不像C呀这些做过很多题目和练习,这次作业算是一次自己把书上的理论的基础语法知识和实践结合的机会,中途也会有一些不习惯,不适应的情况,通过不断改进使代码。在这次实践中让我也熟悉了python的文件操作,学会了如何把print的算式不打印直接存到文件里。我觉得两种语言其实差距并不大只不过python的代码量会明显少很多,我这个思路用C++实现也许就不会用50行就可以实现得了。
其次软件测试,这个东西是我第一次使用以前还不了解python自带一个unittest单元测试模块,我觉得这样的实践作业虽然很难完成但是在其中我们会提升不少知识达到了learning by doing的效果。
在编译器使用上我也学了pycharm的基本操作,这是相对于python 自带编译器的更加高级的编译器,学会了以后肯定也会用的上。
另外也学会了向git托管代码,虽然是鼠标点击而非命令行指令的方式来实现,我觉得一个好的软件好的系统总会有良好用户交互的模块,用指令直接提交和手动应该是殊途同归的效果。以后也可以用github来管理自己的代码了。完成作业的心情当然还不错,能用自己喜欢的语言写作业还是有一点小享受的体验在里面。