场景编程集锦 - 考试打假

时间:2023-01-18 11:05:32

场景描述

考试历来都是人才选拔高效而重要的手段,也是彰显社会公平的重要方面。无论是中国古代的科举考试,还是当今的全国高考,或者是出国留学的雅思托福考试,古今中外概莫能外。

你是否还记得中学时代的考试情景,三天一小考,十天一大考,考试简直就是家常便饭。然而每一次考试,总会有人铤而走险考场作弊。在这些林林总总的作弊方式中,有些低级弱爆、有些啼笑皆非、有些则是脑洞大开。接下来我们首先要盘点考试作弊的常见方式(取材于互联网),然后再针对性地提出预防考试作弊的解决方案。

纸条传递和传话

把答案写在纸条上,传递给其他同学;或者同学之间的悄悄话,交流和交换试题答案,这些或许是同学之间的“相互帮助”。这样的方式易于被老师抓现行,人脏俱获。

打手势和表情包

有些同学采用了打手势和挤眉弄眼的表情包传递信息,这些举止怪异的形体语言,令人啼笑皆非,也会引起监控老师的关注。

窥视和听声辩答案

窥视这种作弊方式隐蔽,不易引人关注。据悉有的同学视力5.1,他竟然可以看到了斜前方同学的填空题答案;还有一种作弊方式就是听音辩答案,网传有同学做选择题时是这样做的,听座位后面的同学写答案的声音。因为A是3画,C是1画,而B和D都是2画,而D比B写的更快一些。想得出听音辩答案的方法,让人不得不服。

针对以上考试作弊的主要形式,如何防止和杜绝考试的作弊行为,维护考试公平公正呢,让我们进入下一环节的学习内容:制作预防考场作弊的试卷。​


编程思路

如何制作预防考场作弊的试卷呢?编程思路特别简单,那就是为每一位考生定制一份个性化试卷。这种个性化试卷由两部分组成:一个是供考生使用的考卷,另一个则是供教师阅卷时使用的参考答案。需要强调的是所有考生的试卷题目一样,但是试卷题目的顺序不同,以及试卷题目对应的ABCD选项内容和顺序也不尽相同。

场景编程集锦 - 考试打假

下面我们以英语词汇课堂测试场景为例,介绍设计思路和编程方法,为每一位学生定制个性化试卷及对应的试题标准答案。

英语词汇存放

我们选取了新概念英语第二册第1课和第2课的部分词汇作为单词测验的内容。这里使用了文本文件vocabulary.txt存放英语词汇,文件格式如下所示:

private     私人的

conversation 会谈,谈话

week        周末

theater    剧院

play          戏剧

interesting       有趣的

sit              坐下

talk           说话,交谈

loudly      大声地

angry       气愤的

turn around     转身

look at     看着

bear          忍受

pay any attention   注意

none of your business    不管你事

rudely      粗鲁地

seat         座位

until         直到...

ring          响铃

repeat      重复

需要强调的是:每一行英文单词/短语与中文含义之间采用制表符‘\t’进行分隔。

描述一道试题

为了表示现实世界中的一道试题,我们可以定义试题类Question,它包含以下属性和方法:

属性:试题编号、试题题目、答案选项、正确答案等内容。

方法:我们试题类Question定义两个方法,它们是:

获取试题:通过组合相关属性,如试题编号、试题题目、答案选项等内容,生成一道试题。

获取答案:获取试题的正确答案。​

描述一份试卷

为了抽象和描述现实世界中的试卷,我们定义试卷类QuizPaper,它由以下属性和方法构成。

属性:

试卷编号、试卷标题、学生班级、学生姓名、考试词汇字典、试题列表。

方法:

创建试卷:生成试卷,需要强调的是试卷由试题构成。

生成试卷文件:将生成的考试试卷写入文本文件中。

生成参考答案文件:生成包含试卷的参考答案的文本文件。​

代码实现

程序由两个模块组成。quizpaper.py模块主要定义了试题类Question和试卷类QuizPaper,而模块quiz.py则是主程序,循环创建QuizPaper实例,生成多份试卷。

模块quizpaper.py是放在包common中的一个模块,内容如下:​

"""
quizpaper.py : 预防考场作弊的试卷公共模块
"""
from random import shuffle, sample

class QuizPaper:
""" 定义试卷类 """
quizpaper_number = 0
stud_class = '班级 :'+ '_' * 5
stud_name = '姓名 :'+ '_' * 5

def __init__(self, vocabulary, title='英语词汇课堂测验'):
self.title = title
self.vocabulary = vocabulary
self.words =list(vocabulary.keys())
shuffle(self.words)
self.quizpaper = []
QuizPaper.quizpaper_number += 1

def make_quizpaper(self):
""" 制作一份试卷 """
for i, word in enumerate(self.words):
answer = self.vocabulary[word]
options = list(self.vocabulary.values())
del options[options.index(answer)]
options = sample(options,3)
options = options + [answer] # ①
shuffle(options) # ②
one_question = Question(i+1, word, options, answer) # ③
self.quizpaper += [one_question] # ④
return self.quizpaper

def print_paper(self, fname):
""" 将试卷写入文本文件中 """
outfile = open(fname, 'w')
print('试卷编号:' + '{0:0>3}'.format(self.quizpaper_number), file=outfile) # ⑤
print(self.title.center(70)+'\n', file=outfile)
print((self.stud_class + ' ' + self.stud_name).rjust(70), file=outfile)

for question in self.quizpaper:
print(question.get_question(), file=outfile) # ⑥
outfile.close()

def print_answer(self, fname):
""" 将试卷标准答案写入文本文件中 """
outfile = open(fname, 'w')
print('试卷编号:' + '{0:0>3}'.format(self.quizpaper_number), file=outfile)
print((self.title + ' ( 参考答案 ) ').center(70), file=outfile)
# 打印试题答案
for question in self.quizpaper:
print(question.get_answer(), file=outfile)
outfile.close()

class Question:
""" 定义试题类 """
def __init__(self, number, question, options, answer):
self.number = number
self.question = question
self.options = options
self.answer = answer

def get_question(self):
""" 获取试题 """
question = '{0}. {1} ( )\n'.format(self.number, self.question) # ⑦
for i in range(4):
question += ('ABCD'[i] + '. ' + self.options[i]).ljust(12)+'\t' # ⑧
question += '\n'
return question

def get_answer(self):
""" 获取答案 """
return str(self.number) + '. --- ' + 'ABCD'[self.options.index(self.answer)] # ⑨

def load_words(fname):
""" 加载词汇表 """
vocabulary = {}
with open(fname, 'r', encoding='utf8') as infile:
for line in infile:
word, meaning = line.split('\t')
vocabulary[word.strip()] = meaning.strip() # ⑩

return vocabulary

以上代码中的重要语句说明如下:

语句①拼装错误选项与正确选项。

语句②打乱答案选项的列表顺序。

语句③创建一道试题。

语句④把一道试题添加到试卷列表中。因为一份试卷是由众多试题组成,属性quizpaper就是存放试题的列表。

语句⑤打印试卷抬头。

语句⑥循环打印试卷的内容。

语句⑦生成含有试题编号和试题内容的字符串。

语句⑧生成包含ABCD四个选择项的字符串。

语句⑨生成包含试题编号和标准答案的字符串。

语句⑩从文本文件中读入英文词汇及中文含义,创建英汉对照的字典。

​模块quiz.py​代码如下:

"""
quiz.py : 制作预防考场作弊的试卷
"""

import sys
from common.quizpaper import * # ①

def main():
if len(sys.argv) !=2 :
print('python quiz.py number')
sys.exit(1)
try:
number = int(sys.argv[1])
except ValueError:
print('数据格式错误:', sys.argv[1])
sys.exit(1)

vocabulary = load_words("vocabulary.txt") # ②

for i in range(number):
# 每次循环生成 1份试卷和 1份参考答案
exam = QuizPaper(vocabulary, title='NCE 英语词汇学习小测验') # ③
exam.make_quizpaper() # ④
fname = "quiz{0:0>3}.txt".format(i+1) # ⑤
exam.print_paper(fname) # ⑥
fname = "answer{0:0>3}.txt".format(i+1) # ⑦
exam.print_answer(fname) # ⑧

if __name__ == '__main__':
main()

有关的重要语句说明如下:

语句①从包common中导入模块中所有内容。

语句②加载读入词汇表,生成英汉对照的字典vocabulary。

语句③创建试卷QuizPaper的一个实例。

语句④调用实例方法make_quizpaper()生成一份试卷。

语句⑤生成以quiz打头,后面是3位数字的文件名,扩展名是txt代表文本文件名。

语句⑥将一份试卷写入到文本文件之中,在当前目录下生成试卷文件。

语句⑦生成以answer打头,后面是3位数字的文件名,扩展名是txt,代表文本文件名。

语句⑧将试卷的参考答案写入文本文件之中,在当前目录下生成参考答案文件。


运行效果

首先查看当前目录中的文件

D:\cases\考场打假>dir

2022/12/01  09:35    <DIR>          .

2022/12/01  09:35    <DIR>          ..

2022/11/30  22:34    <DIR>          common

2022/11/30  23:08               831 quiz.py

2022/04/02  07:56               371 vocabulary.txt

D:\cases\考场打假>

生成试卷文件和参考答案文件

D:\cases\考场打假>python quiz.py 5

D:\cases\考场打假>

生成5份试卷和5份参考答案文件。

查看生成试卷文件和参考答案文件

D:\cases\考场打假>dir

2022/12/01  09:46    <DIR>          .

2022/12/01  09:46    <DIR>          ..

2022/12/01  09:46               311 answer001.txt

2022/12/01  09:46               311 answer002.txt

2022/12/01  09:46               311 answer003.txt

2022/12/01  09:46               311 answer004.txt

2022/12/01  09:46               311 answer005.txt

2022/11/30  22:34    <DIR>          common

2022/11/30  23:08               831 quiz.py

2022/12/01  09:46             1,944 quiz001.txt

2022/12/01  09:46             1,927 quiz002.txt

2022/12/01  09:46             1,927 quiz003.txt

2022/12/01  09:46             1,929 quiz004.txt

2022/12/01  09:46             1,922 quiz005.txt

2022/04/02  07:56               371 vocabulary.txt

D:\cases\考场打假>

以上显示表明:程序生成了5份试卷文件:quiz001~quiz005.txt ,同时还产生了5份试卷参考答案文件:answer001~answer005.txt。

查看试卷内容和参考答案内容

我们使用Windows Notepad记事本打开文件验证,每一份试卷文件题目内容一样,但是题目顺序、ABCD选项不完全相同,其中必有正确选项。同时我们可以验证,answer001.txt 是试卷quiz001.txt的参考答案,answer002.txt 是试卷quiz002.txt的参考答案,以此类推。现在你就可以在Window Notepad中打印出纸质的试卷和参考答案。试卷部分供学生考试使用,标准答案部分供教师阅卷时参考使用。

下面是quiz005.txt文件内容:

------------------------------------------------ 装订线--------------------------------------------

试卷编号:005

                            NCE 英语词汇学习小测验                            


                                                 班级 :_____   姓名 :_____

1. bear  (    )

A. 忍受       B. 座位       C. 重复       D. 直到...      


2. theater  (    )

A. 粗鲁地             B. 剧院        C. 会谈,谈话        D. 注意      


3. until  (    )

A. 周末       B. 响铃       C. 直到...       D. 说话,交谈      


4. ring  (    )

A. 粗鲁地             B. 直到...        C. 戏剧       D. 响铃      


5. repeat  (    )

A. 重复       B. 私人的             C. 大声地             D. 直到...      


6. private  (    )

A. 私人的             B. 看着       C. 粗鲁地             D. 注意      


7. seat  (    )

A. 座位       B. 说话,交谈        C. 戏剧       D. 剧院      


8. talk  (    )

A. 说话,交谈       B. 忍受       C. 直到...       D. 不管你事         


9. turn around  (    )

A. 转身       B. 注意       C. 忍受       D. 重复      


10. play  (    )

A. 有趣的             B. 响铃       C. 重复       D. 戏剧      


11. look at  (    )

A. 看着       B. 有趣的             C. 直到...       D. 会谈,谈话      


12. pay any attention  (    )

A. 注意       B. 直到...        C. 转身       D. 粗鲁地            


13. loudly  (    )

A. 座位       B. 看着       C. 大声地             D. 有趣的            


14. rudely  (    )

A. 周末       B. 粗鲁地             C. 响铃       D. 重复      


15. angry  (    )

A. 周末       B. 气愤的             C. 会谈,谈话        D. 重复      


16. week  (    )

A. 注意        B. 重复       C. 周末       D. 忍受      


17. sit  (    )

A. 不管你事          B. 注意       C. 转身       D. 坐下      


18. interesting  (    )

A. 有趣的             B. 直到...        C. 忍受       D. 转身      


19. conversation  (    )

A. 座位       B. 注意       C. 会谈,谈话        D. 周末      


20. none of your business  (    )

A. 看着       B. 有趣的             C. 不管你事          D. 气愤的            

---------------------------------------------------------------------------------------------------

下面是answer005.txt文件内容:

------------------------------------------------ 装订线--------------------------------------------

试卷编号:005

                       NCE 英语词汇学习小测验 ( 参考答案  )                       

1. --- A

2. --- B

3. --- C

4. --- D

5. --- A

6. --- A

7. --- A

8. --- A

9. --- A

10. --- D

11. --- A

12. --- A

13. --- C

14. --- B

15. --- B

16. --- C

17. --- D

18. --- A

19. --- C

20. --- C

---------------------------------------------------------------------------------------------------

根据程序执行效果来看,完全达到我们的需求目标。程序实现非常完美,非常漂亮!

功能扩展

目前,本案例中的程序仅仅支持生成文本文件格式的试卷文件和参考答案文件。我们鼓励读者自行修改本案例中的程序代码,以便扩展程序功能,支持多种文件格式的试卷文件和参考答案文件。例如:生成Word格式和PDF格式的试卷文件及其参考答案文件等。