项目2:生成随机的测验试卷文件

发布时间 2023-07-13 16:46:32作者: 摩天居士-谢烟客

1. 项目简介

假如你是一位地理老师,班上有35名学生,你希望进行美国各州首府的一个小测验。不妙的是,班里有几个坏蛋,你无法确信学生会不会作弊,你希望随机调整问题的次序,这样每份试卷都是独一无二的,这让任何人都不能从其他人那里抄袭答案,当然手工完成这件事又费时又无聊。好在,你懂一些python。

  • 创建35份不同的测试试卷。
  • 为每份数据创建50个多重选择题,次序随机。
  • 为每个问题提供一个正确答案和三个随机的错误答案,次序随机。
  • 将测验试卷写到35个文本文件中。
  • 将答案写到35个文本文件中。

  这意味着代码需要做下面的事情:

  • 将州和他们的首府保存在一个字典中
  • 针对测验文本文件和答案文本文件,调用open()、wirite()和close()。
  • 利用random.shuffle()随机调整问题和多重选项的次序。

 代码示例1:

import random

#第1步:将测验数据保存在一个字典中

capitals = {'Alabama': 'Montgomery', 'Alaska': 'Juneau', 'Arizona': 'Phoenix','Arkansas': 'Little Rock', 'California': 'Sacramento', 'Colorado': 'Denver', 'Connecticut': 'Hartford', 'Delaware': 'Dover', 'Florida': 'Tallahassee', 'Georgia': 'Atlanta', 'Hawaii': 'Honolulu', 'Idaho': 'Boise', 'Illinois': 'Springfield', 'Indiana': 'Indianapolis', 'Iowa': 'Des Moines', 'Kansas': 'Topeka', 'Kentucky': 'Frankfort', 'Louisiana': 'Baton Rouge', 'Maine': 'Augusta', 'Maryland': 'Annapolis', 'Massachusetts': 'Boston', 'Michigan': 'Lansing', 'Minnesota': 'Saint Paul', 'Mississippi': 'Jackson', 'Missouri': 'Jefferson City', 'Montana': 'Helena', 'Nebraska': 'Lincoln', 'Nevada': 'Carson City', 'New Hampshire': 'Concord', 'New Jersey': 'Trenton', 'NewMexico': 'Santa Fe', 'New York': 'Albany', 'North Carolina': 'Raleigh',
'North Dakota': 'Bismarck', 'Ohio': 'Columbus', 'Oklahoma': 'Oklahoma City', 'Oregon': 'Salem', 'Pennsylvania': 'Harrisburg', 'Rhode Island': 'Providence', 'South Carolina': 'Columbia', 'South Dakota': 'Pierre', 'Tennessee': 'Nashville', 'Texas': 'Austin', 'Utah': 'Salt Lake City', 'Vermont': 'Montpelier', 'Virginia': 'Richmond', 'Washington': 'Olympia', 'West Virginia': 'Charleston', 'Wisconsin': 'Madison', 'Wyoming': 'Cheyenne'}

#第2步:创建测验文件,并打乱问题的次序


for quiznum in range(3):
    # 打乱各州的顺序
    states = list(capitals.keys())
    random.shuffle(states)
    #创建答案选项
    for questionnum in range(50):
        correctanswer = capitals[states[questionnum]]
        wronganswers = list(capitals.values())
        #将正确答案从列表中删除
        del wronganswers[wronganswers.index(correctanswer)]
        wronganswers = random.sample(wronganswers,3)
        answeroptions = wronganswers + [correctanswer]
        random.shuffle(answeroptions)

    # 创建名称为capitalsquiz*.txt的测试文件
        with open('capitalsquiz%s.txt' % (quiznum + 1), 'a+') as quizfile:
            # 创建测试文件标题,包括学生姓名、时间、等信息
            quizfile.write('Name:\n\nDate:\n\nPeriod:\n\n')
            quizfile.write((' ' * 20) + 'State Capitals Quiz (Form %s)' % (quiznum + 1))
            quizfile.write('\n\n')
            quizfile.write('%s. What is the capital of %s?\n' % (questionnum + 1,states[questionnum]))
            for i in range(4):
                quizfile.write(' %s. %s\n' % ('ABCD'[i], answeroptions[i]))
                quizfile.write('\n')

    # 创建名称为capitalsquiz_answers*.txt的测试答案文件
        with open('capitalsquiz_answers%s.txt' % (quiznum + 1), 'a+') as answerkeyfile:
            answerkeyfile.write('%s. %s\n' % (questionnum + 1, 'ABCD'[answeroptions.index(correctanswer)]))

#以上代码实现了功能但是层次结果不够清晰,接下来我们对代码进行重构。

import random

#第1步:将测验数据保存在一个字典中

capitals = {'Alabama': 'Montgomery', 'Alaska': 'Juneau', 'Arizona': 'Phoenix','Arkansas': 'Little Rock', 'California': 'Sacramento', 'Colorado': 'Denver', 'Connecticut': 'Hartford', 'Delaware': 'Dover', 'Florida': 'Tallahassee', 'Georgia': 'Atlanta', 'Hawaii': 'Honolulu', 'Idaho': 'Boise', 'Illinois': 'Springfield', 'Indiana': 'Indianapolis', 'Iowa': 'Des Moines', 'Kansas': 'Topeka', 'Kentucky': 'Frankfort', 'Louisiana': 'Baton Rouge', 'Maine': 'Augusta', 'Maryland': 'Annapolis', 'Massachusetts': 'Boston', 'Michigan': 'Lansing', 'Minnesota': 'Saint Paul', 'Mississippi': 'Jackson', 'Missouri': 'Jefferson City', 'Montana': 'Helena', 'Nebraska': 'Lincoln', 'Nevada': 'Carson City', 'New Hampshire': 'Concord', 'New Jersey': 'Trenton', 'NewMexico': 'Santa Fe', 'New York': 'Albany', 'North Carolina': 'Raleigh',
'North Dakota': 'Bismarck', 'Ohio': 'Columbus', 'Oklahoma': 'Oklahoma City', 'Oregon': 'Salem', 'Pennsylvania': 'Harrisburg', 'Rhode Island': 'Providence', 'South Carolina': 'Columbia', 'South Dakota': 'Pierre', 'Tennessee': 'Nashville', 'Texas': 'Austin', 'Utah': 'Salt Lake City', 'Vermont': 'Montpelier', 'Virginia': 'Richmond', 'Washington': 'Olympia', 'West Virginia': 'Charleston', 'Wisconsin': 'Madison', 'Wyoming': 'Cheyenne'}

# 定义了answer函数
def answer():
    for quiz in range(3):
        # 获取州的名字,并通过random方法将其打乱
        states = list(capitals.keys())
        random.shuffle(states)

        for quiznum in range(len(states)):
            correct_answer = capitals[states[quiznum]]
            wrong_answers = list(capitals.values())  #错误答案中包含正确答案需要将正确答案删除掉
            del wrong_answers[wrong_answers.index(correct_answer)] #找到正确答案的索引,并删除掉
            wrong_answers = random.sample(wrong_answers,3)  #从错误的答案中随机取出三个组成列表
            #接下来将正确答案与错误答案组成列表
            answeroptions = wrong_answers + [correct_answer]
            random.shuffle(answeroptions)

            #创建quizfile测试文件
            with open('quiz%s.txt' % (quiz + 1), 'a+') as quizfile:
                quizfile.write('Name:\n\nDate:\n\nPeriod:\n\n')
                quizfile.write((' ' * 20) + 'State Capitals Quiz (Form %s)' % (quiz + 1))
                quizfile.write('\n\n')
                quizfile.write('%s. What is the capital of %s?\n' % (quiznum + 1, states[quiznum]))
                for i in range(4):  # 设置4个选项
                    quizfile.write('%s. %s\n' % ('ABCD'[i], answeroptions[i]))
                    quizfile.write('\n')

            #创建正确答案文件
            with open('quiz_answer%s.txt' % (quiz + 1), 'a+') as quiz_answerfile:
                quiz_answerfile.write('%s. %s\n' % (quiznum + 1, 'ABCD'[answeroptions.index(correct_answer)]))


answer()