程序介绍
假如你是一位老师,班上有 50名学生,你希望进行一个小测验,测试的内容为国内各省的简称,不妙的是,班里有几个调皮捣蛋的,你无法确信学生会不会作弊。你希望随机调整问题的次序,这样每份试卷都是独一无二的,这让任何人都不能从其他人那里抄袭答案。下面我们就用Python解决这个问题。
编写步骤
根据上面的需求,我们拆分出程序要做的事:
Ø创建50份不同的测验试卷。
Ø为每份试卷创建34个选择题,次序随机。
Ø为每个问题提供一个正确答案和3个随机的错误答案,次序随机。
Ø将测验试卷写到50个文本文件中。
Ø将答案写到50个文本文件中。
下面我们一步一步用代码实现
1、生成测试数据并保存在一个字典里面
2、生成试卷和答案文件
我们这边首先定义一个保存文件的文件夹“results”,然后判断该文件夹是否存在,如果不存在就创建该文件夹。
然后创建一个50次的循环,在循环体内生成试卷文件,给每个文件名加一个序号,让每个文件名不一样,之后创建答案文件,同样给每个文件名加一个序号。并将各省的名字放入一个列表province中。
在循环体内再创建一个34次的循环生成34个试题,先找出正确的答案,然后在34个各省简称中将正确答案去掉,放入一个列表中,再从中选择三个错误答案,之后将一个正确答案和三个错误答案放入一个列表中,然后利用random.shuffle函数生成随机的列表。
再在34次循环体内新建一个4次的循环,生成每个问题的4个选项,之后生成答案文件里面写入问题的正确答案。
程序代码
import random
from os import makedirs
from os.path import exists
RESULTS_DIR = 'results'
exists(RESULTS_DIR) or makedirs(RESULTS_DIR)
provinces = {'北京':'京','天津':'津','黑龙江省':'黑','吉林省':'吉','辽宁省':'辽',
'内蒙古自治区':'内蒙古','河北省':'冀','山东省':'鲁','山西省':'晋','河南省':'豫',
'江苏省':'苏','安徽省':'皖','湖北省':'鄂','湖南省':'湘','江西省':'赣',
'浙江省':'浙','上海':'沪','福建省':'闽','台湾省':'台','广东省':'粤','广西壮族自治区':'桂',
'海南省':'琼','香港':'港','澳门':'澳','贵州省':'黔','云南省':'滇','四川省':'川','重庆':'渝',
'西藏':'藏','新疆':'新','青海省':'青','甘肃省':'甘','宁夏':'宁','陕西省':'陕'}
for quizNum in range(50):
quizFile = open(f'{RESULTS_DIR}/capitalsquiz%s.txt' % (quizNum + 1), 'w',encoding='utf-8')
answerKeyFile = open(f'{RESULTS_DIR}/capitalsquiz_answers%s.txt' % (quizNum + 1), 'w',
encoding='utf-8')
quizFile.write('姓名:\n\n日期:\n\n班级:\n\n')
quizFile.write((' ' * 20) + '34个省会简称测试 (卷 %s)\n' % (quizNum + 1))
province = list(provinces.keys())
random.shuffle(province)
for questionNum in range(34):
correctAnswer = provinces[province[questionNum]]
wrongAnswers = list(provinces.values())
wrongAnswers.remove(correctAnswer)
wrongAnswers = random.sample(wrongAnswers, 3)
answerOptions = wrongAnswers + [correctAnswer]
random.shuffle(answerOptions)
quizFile.write('%s. %s 的简称是什么?\n' % (questionNum + 1, province[questionNum]))
for i in range(4):
quizFile.write(' %s. %s\n' % ('ABCD'[i], answerOptions[i]))
quizFile.write('\n')
answerKeyFile.write('%s. %s\n' % (questionNum + 1,
'ABCD'[answerOptions.index(correctAnswer)]))
quizFile.close()
answerKeyFile.close()