《构建之法》作业:口算出题器
生活随笔
收集整理的這篇文章主要介紹了
《构建之法》作业:口算出题器
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
《構(gòu)建之法》作業(yè):python寫口算出題器
實現(xiàn)功能:
- 輸入一個正整數(shù)n,隨機生成n道運算符為2或3的整數(shù)四則運算(無括號)
- 題目和結(jié)果均為整數(shù)
- 生成兩個文件,equation0.txt用于存放題目,result0.txt用于存放答案
- 成功生成文件以后,程序不結(jié)束,可以繼續(xù)輸入正整數(shù)n,在當(dāng)前目錄下生成equation1.txt,result1.txt,以此類推
- 當(dāng)n為0時程序退出
- 若退出后重新執(zhí)行,生成的文件接著當(dāng)前目錄下已存在文件序號繼續(xù)生成
環(huán)境:
pip install numpy(不裝也可以,直接用random就行了)
代碼:
import numpy as np import osfilepath = "./" filename_list = os.listdir(filepath) seg_tmp = 0 for filename in filename_list:if "equation" in filename:seg_tmp1 = filename[filename.rfind('n')+1:]seg_tmp2 = seg_tmp1[0:seg_tmp1.rfind('.txt')]if seg_tmp < int(seg_tmp2):seg_tmp = int(seg_tmp2)k = seg_tmp + 1 # 計算執(zhí)行次數(shù)# k = 1while 1:name_equ = "equation" + str(k) + ".txt" # 存放題目name_res = "result" + str(k) + ".txt" # 存放答案ops = ['+', '-', '*', '/'] # 運算符cal_time = input("please enter the quantity (input 0000 to end):")cal_time = int(cal_time)i = 1 # 題數(shù)量while i <= cal_time:a = np.random.randint(0,2) # 隨機兩個數(shù)還是三個數(shù)進(jìn)行運算if a == 0:element = np.random.randint(0, 101, 3)op = np.random.randint(0, 4, 2) if 2 not in op and 3 not in op: # 僅有加減運算while 1:element = np.random.randint(0, 101, 3)if op[0] == 1: # 第一個運算為減法,被減數(shù)要大于減數(shù)if element[0] < element[1]:element[0], element[1] = element[1], element[0]tmp = eval(str(element[0]) + ops[op[0]] + str(element[1])) # 第一個運算的的結(jié)果作為中間量equation = str(element[0]) + ops[op[0]] + str(element[1]) + ops[op[1]] + str(element[2]) # 算式表示val = eval(str(tmp) + ops[op[1]] + str(element[2])) # 實際結(jié)果if val >= 0:breakelif 0 not in op and 1 not in op: # 僅有乘除運算element = np.random.randint(0, 101, 3)if op[0] == 3: # 第一個為除法element[1] = np.random.randint(1, 101)if element[0] < element[1]:element[0], element[1] = element[1], element[0]if element[1] == 0: # 如果除數(shù)為0,在1-100重新隨機除數(shù)element[1] = np.random.randint(1, 101)while element[0] % element[1] != 0:if element[0] == 0:breakelement[1] -= 1tmp = eval(str(element[0]) + ops[op[0]] + str(element[1]))if op[1] == 3: # 第二個為除法element[2] = np.random.randint(1, 101)if tmp < element[2]:if tmp == 0:element[2] = np.random.randint(1,101)else:element[2] = np.random.randint(1,tmp+1)while tmp % element[2] != 0:if tmp == 0:breakelement[2] -= 1equation = str(element[0]) + ops[op[0]] + str(element[1]) + ops[op[1]] + str(element[2]) # 算式表示val = eval(str(tmp) + ops[op[1]] + str(element[2])) # 實際結(jié)果else: # 加減乘除都有的混合運算element = np.random.randint(0, 101, 3)if op[0] > op[1]: # 乘除在前面if op[0] == 3: # 第一個為除法element[1] = np.random.randint(1, 101)if element[0] < element[1]:element[0], element[1] = element[1], element[0]if element[1] == 0:element[1] = np.random.randint(1, 101)while element[0] % element[1] != 0:if element[0] == 0:breakelement[1] -= 1tmp = eval(str(element[0]) + ops[op[0]] + str(element[1]))if op[1] == 1: # 第二個為減法時,重新隨機減數(shù),使其小于被減數(shù)if tmp < element[2]:if tmp == 0:element[2] = 0else:element[2] = np.random.randint(1,tmp+1)equation = str(element[0]) + ops[op[0]] + str(element[1]) + ops[op[1]] + str(element[2]) # 算式表示val = eval(str(tmp) + ops[op[1]] + str(element[2])) # 實際結(jié)果 else: # 乘除在后面while 1:element = np.random.randint(0, 101, 4)if op[1] == 3:element[2] = np.random.randint(1, 101)if element[1] < element[2]:if element[1] == 0:element[2] = np.random.randint(1, 101) #被除數(shù)為0,除數(shù)隨機else:element[2] = np.random.randint(1, element[1]+1)while element[1] % element[2] != 0:if element[1] == 0:breakelse:element[2] -= 1tmp = eval(str(element[1]) + ops[op[1]] + str(element[2]))equation = str(element[0]) + ops[op[0]] + str(element[1]) + ops[op[1]] + str(element[2]) # 算式表示val = eval(str(element[0]) + ops[op[0]] + str(tmp))if val >= 0:break# print(op)# print("%s = "%equation)# print(val)else:element = np.random.randint(0, 101, 4)op = np.random.randint(0, 4, 3)if 2 not in op and 3 not in op: # 只有加減while 1:element = np.random.randint(1, 101, 4)if op[0] == 1: # 第一個是減element[0] = np.random.randint(2, 101)if element[0] < element[1]:element[1] = np.random.randint(1,element[0])tmp1 = eval(str(element[0]) + ops[op[0]] + str(element[1])) # 第一個運算的的結(jié)果作為中間量if tmp1 > 0:breakwhile 1:element[2] = np.random.randint(1, 101)if op[1] == 1: if tmp1 < element[2]:element[2] = np.random.randint(1,tmp1+1)tmp2 = eval(str(tmp1) + ops[op[1]] + str(element[2]))if tmp2 >= 0:breakif op[2] == 1: if tmp2 < element[3]:element[3] = np.random.randint(0,tmp2+1)equation = str(element[0]) + ops[op[0]] + str(element[1]) + ops[op[1]] + str(element[2]) + ops[op[2]] + str(element[3]) # 算式表示val = eval(str(tmp2) + ops[op[2]] + str(element[3])) # 實際結(jié)果elif 0 not in op and 1 not in op: # 僅有乘除運算if op[0] == 3: # 第一個為除法element[1] = np.random.randint(1, 101)if element[0] < element[1]:element[0], element[1] = element[1], element[0]if element[1] == 0: # 如果除數(shù)為0,在1-100重新隨機除數(shù)element[1] = np.random.randint(1, 101)while element[0] % element[1] != 0:if element[0] == 0:breakelement[1] -= 1tmp1 = eval(str(element[0]) + ops[op[0]] + str(element[1]))if op[1] == 3: # 第二個為除法element[2] = np.random.randint(1, 101)if tmp1 < element[2]:if tmp1 == 0:element[2] = np.random.randint(1, 101)else:element[2] = np.random.randint(1, tmp1+1)while tmp1 % element[2] != 0:if tmp1 == 0:breakelse:element[2] -= 1tmp2 = eval(str(tmp1) + ops[op[1]] + str(element[2]))if op[2] == 3: # 第三個為除法element[3] = np.random.randint(1, 101)if tmp2 < element[3]:if tmp2 == 0:element[3] = np.random.randint(1, 101)else:element[3] = np.random.randint(1, tmp2+1)while tmp2 % element[3] != 0:if tmp2 == 0:breakelement[3] -= 1equation = str(element[0]) + ops[op[0]] + str(element[1]) + ops[op[1]] + str(element[2]) + ops[op[2]] + str(element[3]) # 算式表示val = eval(str(tmp2) + ops[op[2]] + str(element[3])) # 實際結(jié)果else: # 加減乘除都有的混合運算if element[2] > 100:element[2] = np.random.randint(0, 101)if op[0] > 1 and op[1] > 1 and op[2] <= 1: # 乘除,乘除,加減if op[0] == 3: # 第一個是除element[1] = np.random.randint(1, 101)if element[0] < element[1]:element[0], element[1] = element[1], element[0]if element[1] == 0:element[1] = np.random.randint(1, 101)while element[0] % element[1] != 0:if element[0] == 0:breakelement[1] -= 1tmp1 = eval(str(element[0]) + ops[op[0]] + str(element[1]))if op[1] == 3: # 第二個是除element[2] = np.random.randint(1, 101)if tmp1 == 0:element[2] = np.random.randint(1, 101)else:element[2] = np.random.randint(1, tmp1+1)while tmp1 % element[2] != 0:if tmp1 == 0:breakelement[2] -= 1 tmp2 = eval(str(tmp1) + ops[op[1]] + str(element[2]))if op[2] == 1: # 第三個是減if tmp2 < element[3]:if tmp2 == 0:element[3] = 0else:element[3] = np.random.randint(1,tmp2+1)equation = str(element[0]) + ops[op[0]] + str(element[1]) + ops[op[1]] + str(element[2]) + ops[op[2]] + str(element[3])val = eval(str(tmp2) + ops[op[2]] + str(element[3]))if op[0] > 1 and op[1] <= 1 and op[2] <= 1: # 乘除,加減,加減if op[0] == 3: # 第一個是除element[1] = np.random.randint(1, 101)if element[0] < element[1]:element[0], element[1] = element[1], element[0]if element[1] == 0:element[1] = np.random.randint(1, 101)while element[0] % element[1] != 0:if element[1] == 0:breakelement[1] -= 1tmp1 = eval(str(element[0]) + ops[op[0]] + str(element[1]))if op[1] == 1: # 第二個是減if tmp1 < element[2]:if tmp1 == 0:element[2] = 0else:element[2] = np.random.randint(1,tmp1+1) tmp2 = eval(str(tmp1) + ops[op[1]] + str(element[2]))if op[2] == 1: # 第三個是減if tmp2 < element[3]:if tmp2 == 0:element[3] = 0else:element[3] = np.random.randint(1,tmp2+1)equation = str(element[0]) + ops[op[0]] + str(element[1]) + ops[op[1]] + str(element[2]) + ops[op[2]] + str(element[3])val = eval(str(tmp2) + ops[op[2]] + str(element[3]))if op[0] > 1 and op[1] <= 1 and op[2] > 1: # 乘除,加減,乘除if op[1] == 1: # 第二個是減while 1:element = np.random.randint(0, 101, 4)if op[0] == 3: # 第一個是除element[1] = np.random.randint(1, 101)if element[0] < element[1]:element[0], element[1] = element[1], element[0]if element[1] == 0:element[1] = np.random.randint(1, 101)while element[0] % element[1] != 0:if element[0] == 0:breakelement[1] -= 1tmp1 = eval(str(element[0]) + ops[op[0]] + str(element[1])) if op[2] == 3: # 第三個是除element[3] = np.random.randint(1, 101)if element[2] < element[3]:element[2], element[3] = element[3], element[2]if element[3] == 0:element[3] = np.random.randint(1, 101)while element[2] % element[3] != 0:if element[2] == 0:breakelement[3] -= 1tmp2 = eval(str(element[2]) + ops[op[2]] + str(element[3])) if tmp1 >= tmp2: # 保證減法不出現(xiàn)負(fù)數(shù)breakelse:if op[0] == 3: # 第一個是除element[1] = np.random.randint(1, 101)if element[0] < element[1]:element[0], element[1] = element[1], element[0]if element[1] == 0:element[1] = np.random.randint(1, 101)while element[0] % element[1] != 0:if element[0] == 0:breakelement[1] -= 1tmp1 = eval(str(element[0]) + ops[op[0]] + str(element[1])) if op[2] == 3: # 第三個是除element[3] = np.random.randint(1, 101)if element[2] < element[3]:element[2], element[3] = element[3], element[2]if element[3] == 0:element[3] = np.random.randint(1, 101)while element[2] % element[3] != 0:if element[2] == 0:breakelement[3] -= 1tmp2 = eval(str(element[2]) + ops[op[2]] + str(element[3])) equation = str(element[0]) + ops[op[0]] + str(element[1]) + ops[op[1]] + str(element[2]) + ops[op[2]] + str(element[3])val = eval(str(tmp1) + ops[op[1]] + str(tmp2))if op[0] <= 1 and op[1] <= 1 and op[2] > 1: # 加減,加減,乘除while 1:element = np.random.randint(0, 101, 4)if op[2] == 3: # 第三個是除element[3] = np.random.randint(1, 101)if element[2] < element[3]:element[2], element[3] = element[3], element[2]if element[3] == 0:element[3] = np.random.randint(1, 101)while element[2] % element[3] != 0:if element[2] == 0:breakelement[3] -= 1tmp2 = eval(str(element[2]) + ops[op[2]] + str(element[3]))equation = str(element[0]) + ops[op[0]] + str(element[1]) + ops[op[1]] + str(element[2]) + ops[op[2]] + str(element[3])val = eval(str(element[0]) + ops[op[0]] + str(element[1]) + ops[op[1]] + str(tmp2))if val >= 0:breakif op[0] <= 1 and op[1] > 1 and op[2] > 1: # 加減,乘除,乘除while 1:element = np.random.randint(0, 101, 4)if op[1] == 3: # 第二個為除法element[2] = np.random.randint(1, 101)if element[1] < element[2]:element[1], element[2] = element[2], element[1]if element[2] == 0: # 如果除數(shù)為0,在1-100重新隨機除數(shù)element[2] = np.random.randint(1, 101)while element[1] % element[2] != 0:if element[1] == 0:breakelement[2] -= 1tmp1 = eval(str(element[1]) + ops[op[1]] + str(element[2]))if op[2] == 3: # 第三個為除法element[3] = np.random.randint(1, 101)if tmp1 < element[3]:if tmp1 == 0:element[3] = np.random.randint(1,101)else:element[3] = np.random.randint(1,tmp1+1)while tmp1 % element[3] != 0:if tmp1 == 0:breakelement[3] -= 1tmp2 = eval(str(tmp1) + ops[op[2]] + str(element[3]))equation = str(element[0]) + ops[op[0]] + str(element[1]) + ops[op[1]] + str(element[2]) + ops[op[2]] + str(element[3])val = eval(str(element[0]) + ops[op[0]] + str(tmp2))if val >= 0:breakif op[0] <= 1 and op[1] > 1 and op[2] <= 1: # 加減,乘除,加減while 1:element = np.random.randint(0,101,4)if op[1] == 3: # 第二個為除element[2] = np.random.randint(1, 101)if element[1] < element[2]:element[1], element[2] = element[2], element[1]if element[2] == 0:element[2] = np.random.randint(1, 101)while element[1] % element[2] != 0:if element[1] == 0:breakelement[2] -= 1tmp1 = eval(str(element[1]) + ops[op[1]] + str(element[2]))val = eval(str(element[0]) + ops[op[0]] + str(tmp1) + ops[op[2]] + str(element[3]))equation = str(element[0]) + ops[op[0]] + str(element[1]) + ops[op[1]] + str(element[2]) + ops[op[2]] + str(element[3])if val >= 0:break# print(op)# print("%s = "%equation)# print(val) i += 1val = int(val)with open(name_equ,"a") as e, open(name_res,"a") as r:e.write(equation + "=" + "\n")r.write(equation + " = " + str(val) + "\n")k += 1if cal_time == 0000:break結(jié)果:
總結(jié):
交作業(yè)前一個下午趕出來的,由于時間緊迫,整個程序?qū)懙暮軄y。
難點主要是:
- 遇到除法如何保證結(jié)果為整數(shù)?
一開始想用判斷做,首先生成的除數(shù)要在[1,被除數(shù)],被除數(shù)大于等于1,其次若結(jié)果不為整數(shù),則除數(shù)自減,直到減至1。
但次方法在多元運算時變得麻煩,被除數(shù)或除數(shù)是前面運算的結(jié)果,不好控制,所以最后還是使用了暴力隨機法,非常笨拙。
- 隨機到連乘,結(jié)果可能是非常大的數(shù),從使用的角度來說不合理,如何避免?
考慮直接在連續(xù)生成乘法時重新隨機,暫時未實現(xiàn)
總結(jié)
以上是生活随笔為你收集整理的《构建之法》作业:口算出题器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FTP报550异常-Create dir
- 下一篇: 树莓派挂载斐讯K3上SMB共享的移动硬盘