题目要求:给小学生出的100以内四则运算,有两个运算符,保证每个步骤运算结果都能整除,并且在100以内。
第一次作业代码实现:
import random
oper = ['+','-','*','/']
i = 0
while i<300:
a = random.randint(1,99)
b = random.randint(1,99)
c = random.randint(1,99)
num = random.randint(0,3)
a = str(a)
b = str(b)
c = str(c)
res = a + oper[num] + b + oper[num] + c
m = eval(res)
res1 = a + oper[num] + b
n = eval(res1)
if (m<100) & (m>0) & isinstance(m,int) & (n>0) & isinstance(n,int):
print(res,'=',m)
i+=1
选择python就是因为字符转数字,并且算出结果很方便,但是以上的代码存在问题:16行只保证了运算结果和前两位运算在100以内,像5+1/4这样的式子也能出现。
第二次作业基本要求:在上一次作业的基础之上,开发一个图形界面的出题程序,给用户提供以下选项:运算符个数,每一页打印的行数和列数,题目总数。
首先要实现图形化界面,python图形化界面设计←在此链接学了一下怎么用tkinter模块做出一个python图形化界面。
其次题目总数由用户输入这一操作也很容易实现,代码如下。(暂未修改第一次代码的问题)
#1.0
import random
import string
from tkinter import *
def run(num):
print("输出算式个数为:"+ num)
num = int(num)
num_ = num + 0
oper = ['+','-','*','/']
i = 0
while i0) & isinstance(m,int) & (n>0) & isinstance(n,int):
print(res,'=',m)
i+=1
txt.insert(END, res + '=' + '\n') # 追加显示运算结果
inp1.delete(0, END) # 清空输入
root = Tk()
root.geometry('460x240')
root.title('简单四则运算')
lb1 = Label(root, text='请输入四则运算算式数量')
lb1.place(relx=0.1, rely=0.1, relwidth=0.8, relheight=0.1)
#relx 0.1 0.6
inp1 = Entry(root)
inp1.place(relx=0.3, rely=0.2, relwidth=0.3, relheight=0.1)
# 直接调用 run()
btn1 = Button(root, text='计算', command=lambda:run(inp1.get()))
btn1.place(relx=0.3, rely=0.4, relwidth=0.3, relheight=0.1)
# 在窗体垂直自上而下位置60%处起,布局相对窗体高度40%高的文本框
txt = Text(root)
txt.place(rely=0.6, relheight=0.4)
root.mainloop()
界面如下:
在jupyter notebook上输出带得数的式子,图形界面输出不带得数的。
接下来实现运算符的用户输入,我的第一个思路是设置复选框,选择可以有1个、2个、3个……有限个的运算符,然后调用if条件语句,分别实现。看起来很容易实现,但是很容易发现,像下面这种给运算数取随机值的操作,如果需要更多的运算符,不断地写条件只会增加重复代码。于是想要改用列表,把操作数和操作符都放在随机生成的列表中。
a = random.randint(1,99)
b = random.randint(1,99)
c = random.randint(1,99)
首先生成一个随机列表,要求范围在1-99间,将变量start,stop设置成1,99即可。
#生成随机数组
import random
def random_list(start,stop,length):
if length>=0:
length=int(length)
start, stop = (int(start), int(stop)) if start <= stop else (int(stop), int(start))
random_list = []
for i in range(length):
random_list.append(random.randint(start, stop))
return random_list
random_list(0,99,6)
接下来生成操作符列表。
#生成随机数组,数字范围为1-3,生成随机的运算符
import random
def random_operator(number):
operator = ['+','-','*','/']
if number>=0:
number=int(number)
random_operator = []
for i in range(number):
random_operator.append(operator[random.randint(0, 3)])
return random_operator
a=random_operator(2)
print(a)
在作业一的基础上调用这两个函数发现可以运行,然后就考虑每一部分运算结果都在100以内。
i = 0
while i<10:
operations=random_list(2)
operator=random_operator(1)
res1 = str(operations[0]) + operator[0] + str(operations[1])#一个运算符
m = eval(res1)
if (m<100) & (m>0) & isinstance(m,int):
print(res1,'=',m)
i+=1
像这样一个式子:1*5+6*7-9/3*2=?
我的思路是从第一个操作数开始,测试 [操作数1(操作符1)操作数2] 的运算结果是否在100内且为正整数,然后测试 [操作数2(操作符2)操作数3] 的运算结果是否在100内且为正整数,套入一个循环,不断地测试,这些测试可以写在一个函数里面,用flag的值表示真假。
#x个运算符
#判断是否符合各个位运算都不超过100且为整数
def flag(x,operations, operator):
flag = 0
for i in range(0,x):
m = str(operations[i]) + operator[i] + str(operations[i+1])
m = eval(m)
if (0
现在大体实现了四则运算控制题目数、操作符数量的要求了,运行效果如下。
考虑到(用户需求)需要把符号 *、/ 换成小学生认识的×、÷,在输出函数中加入如下代码。
#*/转变成×÷
res_left = str(operations[0])
for i in range(0,x):
if operator[i]=='*':
operator[i]='×'
if operator[i]=='/':
operator[i]='÷'
res_left = res_left + operator[i] + str(operations[i+1])
最后控制输出的行列数,由于算式的数量并不确定,用不能准确的输入需要的行数、列数,所有我只提供了一个输入列数的输入框。设循环次数为i,列数为col,i除col的余数不为0就不换行。
作业二全部的代码就这样了。(╹ڡ╹ )
#四则运算2.4
#改进:1.增加图形化界面 2.用户可以指定题目个数和运算符个数 3.用户可以指定算式打印的列数
######4.输出结果将*/符号转化为×÷ 5.控制台输出运算,图形界面不打印结果
import random
import string
from tkinter import *
#生成随机数组,数字范围为1-99。参数length:操作数数量(即操作符数量+1)
def random_list(length):
if length>=0:
length=int(length)
random_list = []
for i in range(length):
random_list.append(random.randint(1, 99))
return random_list
#生成随机的运算符,数字范围为0-3。参数length:操作符数量
def random_operator(length):
operator = ['+','-','*','/']
if length>=0:
length=int(length)
random_operator = []
for i in range(length):
random_operator.append(operator[random.randint(0, 3)])
return random_operator
#参数:x个运算符,操作数列表,操作符列表
#设置flag检测不超过100且为正整数的约束条件
def flag(x,operations, operator):
flag1= 0
flag2= 0
#判断是否符合各个位运算都不超过100且为正整数,循环检测
for i in range(0,x):
m = str(operations[i]) + operator[i] + str(operations[i+1])
m = eval(m)
if (0