小學數學運算題出題程序
文章目錄
需求
朋友擔心小孩暑假玩瘋了,讓我弄點小學一年級數學題給小孩做,要求:
就是簡單的口算式子可以打印成 A4 紙有答案
根據要求,我覺得最簡單的辦法,就是生成一個內容用 tab 分隔開的 txt 文件,然后手工復制到排版好的 文件里面直接打印即可。
原始代碼
#coding: utf-8
"""本代碼來自第一感覺,使用函數實現。添加問題類型時,直接修改 main() 的 question_list 語句即可
"""
import random
def question_1():
"""生成 100 以內退位減法"""
minuend = random.randint(11,98)
units = minuend % 10
while units==9 :
minuend = random.randint(11,98)
units = minuend % 10
subtrahend = random.randint(units+1,9)
answer = minuend - subtrahend
return ("%d - %d = " % (minuend, subtrahend), str(answer))
def question_2():
"""生成兩位數加法"""
num1 = random.randint(10, 99)
num2 = random.randint(10, 99)
answer = num1 + num2
return ('%d + %d =' % (num1, num2), str(answer))
def question_3():
"""生成兩位數減兩位數"""
minuend = random.randint(11,99)
subtrahend = random.randint(10, minuend)
answer = minuend - subtrahend
return ("%d - %d = " % (minuend, subtrahend), str(answer))
def write_it(questions, answers, output_file):
format_items(questions)
format_items(answers)
f = open(output_file, 'w')
f.write("".join(questions))
f.write("\n\n\n")
f.write("".join(answers))
f.close()
def format_items(items, number_per_line = 4):
"""用換行、tab 美化化輸出結果,方便之后導入 excel"""
for i,a in enumerate(items):
if i % number_per_line == number_per_line - 1:
items[i] = a + "\n"
else:
items[i] = a + "\t"
def main(output_file, question_type = 1):
"""question_type取值:1 到 3 """
questions = []
answers = []
question_generator = [question_1, question_2, question_3]
for x in range(80):
question, answer = question_list[question_type - 1]()
print( question)
questions.append(question)
answers.append(answer)
print("now write it")
write_it(questions, answers, output_file)
if __name__ == '__main__':
output_file = "out.txt"
main(output_file)
引入 with 語句處理文件
以便在發生異常的時候自動關閉資源。將
f = open(output_file, 'w')
f.write("".join(questions))
f.write("\n\n\n")
f.write("".join(answers))
f.close()
改為
with open(output_file, 'w') as f:
f.write("".join(questions))
f.write("\n\n\n")
f.write("".join(answers))
改成混合出題
單一類型題目指定生成,不如直接改成混合生成各類題型,并可以指定各種題型出現的概率。這可以直接利用 的 .() 函數實現,請注意該函數的返回值是個 list ,main() 函數修改如下:
def main(output_file, number = 80):
...
question_generator = [question_1, question_2, question_3]
for x in range(number):
which = random.choices([1,2,3], [0.2, 0.4, 0.4])[0] # 各類型題目概率
question, answer = question_generator[which-1]()
...
最終成果
最后,給每個題目添加序號,以便打印出來的題目可以快速找到答案。完整最終代碼如下:
#coding: utf-8
"""本代碼實現小學一年級數學題目(主要是100以內加減法)的自動出題
"""
# 下一步計劃:
# - 添加網絡框架(比如 flask),實現在線測試網站
# - 允許選擇難度、題型
# - 自動匯總錯題
# - 需要登錄,以便記錄每個人自己的練習情況
import random
def question_1():
"""生成 100 以內退位減法"""
minuend = random.randint(11,98)
units = minuend % 10
while units==9 :
minuend = random.randint(11,98)
units = minuend % 10
subtrahend = random.randint(units+1,9)
answer = minuend - subtrahend
return ("%d - %d = " % (minuend, subtrahend), str(answer))
def question_2():
"""生成兩位數加法"""
num1 = random.randint(10, 99)
num2 = random.randint(10, 99)
answer = num1 + num2
return ('%d + %d =' % (num1, num2), str(answer))
def question_3():
"""生成兩位數減兩位數"""
minuend = random.randint(11,99)
subtrahend = random.randint(10, minuend)
answer = minuend - subtrahend
return ("%d - %d = " % (minuend, subtrahend), str(answer))
def write_it(questions, answers, output_file):
format_items(questions)
format_items(answers)
with open(output_file, 'w') as f:
f.write("".join(questions))
f.write("\n\n\n")
f.write("".join(answers))
def format_items(items, number_per_line = 4):
"""用換行、tab 美化化輸出結果,并添加序號,方便之后導入 excel"""
for i,a in enumerate(items, start=1):
if i % number_per_line == 0:
items[i-1] = str(i) + ".\t" + a + "\n"
else:
items[i-1] = str(i) + ".\t" + a + "\t"
def main(output_file, number = 80):
"""主函數"""
questions = []
answers = []
question_generator = [question_1, question_2, question_3]
for x in range(number):
which = random.choices([1,2,3], [0.2, 0.4, 0.4])[0] # 各類型題目概率
question, answer = question_generator[which-1]()
print( question)
questions.append(question)
answers.append(answer)
print("now write it")
write_it(questions, answers, output_file)
if __name__ == '__main__':
output_file = "out.txt"
main(output_file, number=800)
聲明:本站所有文章資源內容,如無特殊說明或標注,均為采集網絡資源。如若本站內容侵犯了原著者的合法權益,可聯系本站刪除。