在如今这个数字化时代,越来越多的教育机构和个人开始使用app来进行教学和学习。其中比较常见的就是一些做题类app。许多人都很好奇,在背后这些app是如何实现随机出题的呢?本篇文章将介绍一种可自己做题库随机出题的app的原理和详细介绍。
1. 原理介绍
一、数据存储
做题库随机出题app的实现必须要首先有做题库的数据存储。有很多种数据存储方式,包括MySQL、mongodb、redis等等。在这里,我们使用MySQL作为数据库进行数据库操作。将我们所需的题目题干、题目选项、题目答案等信息存储到MySQL数据库中,随时可以调用使用。
二、随机抽取
做题库随机出题app的另一个重要部分就是“随机抽取”,即从数据库中随机抽取学生需要给出答案的题目。在随机抽取过程中,我们需要配置一些参数来确定抽取多少道题目、抽取题目的类型和难易程度等。
三、展示界面
做题库随机出题app的最后一步就是展示界面。需要将我们所随机抽取的题目展示出来,并且获取学生的答案进行判断。展示界面主要包含题目展示、选项展示、答案展示、答案正确性确认等方面。
2. 详细介绍
接下来,我们就可以详细地介绍一下,如何使用MySQL数据库实现做题库随机出题app。
一、数据存储
在数据库中,我们需要先创建一个表来存储题目的信息。表中应该包括题目ID、题干、选项A、选项B、选项C、选项D、答案等字段(可根据实际需要增加、减少字段)。
```sql
CREATE TABLE IF NOT EXISTS `questions` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`stem` varchar(100) COLLATE utf8_unicode_ci NOT NULL COMMENT '问题题干',
`choice_a` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '选项A',
`choice_b` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '选项B',
`choice_c` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '选项C',
`choice_d` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '选项D',
`answer` varchar(20) COLLATE utf8_unicode_ci NOT NULL COMMENT '问题答案',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='问题表';
```
二、存储数据
将存储好的题目信息放到一个外面的文件里,这里我们用json格式文件,这个文件的本地路径是question_bank.json。其中,每个问题由题目stem、选项choice与答案answer三个字段组成,要注意的是answer字段中是记录正确答案的。
```json
[
{
"stem": "我国对外开放的首倡者和开创者是:",
"choice_a": "邓小平",
"choice_b": "邓颖超",
"choice_c": "陈毅",
"choice_d": "周恩来",
"answer": "a"
},
{
"stem": "下列地理位置最偏远的城市是:",
"choice_a": "拉萨",
"choice_b": "哈尔滨",
"choice_c": "三亚",
"choice_d": "乌鲁木齐",
"answer": "d"
},
{
"stem": "中国通用的地理经度基准线是什么?",
"choice_a": "东经110°",
"choice_b": "东经108°",
"choice_c": "东经105°",
"choice_d": "东经120°",
"answer": "b"
}
]
```
下面的代码演示了如何将json格式的数据存入到MySQL数据库中。
```python
import json
import pymysql
def save_data2mysql(conn, data, tb_name):
if len(data)>0:
cur = conn.cursor()
sql_create_tb = '''
CREATE TABLE IF NOT EXISTS `''' + tb_name + '''` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`stem` varchar(200) NOT NULL COMMENT '问题题干',
`choice_a` varchar(100) DEFAULT NULL COMMENT '选项A',
`choice_b` varchar(100) DEFAULT NULL COMMENT '选项B',
`choice_c` varchar(100) DEFAULT NULL COMMENT '选项C',
`choice_d` varchar(100) DEFAULT NULL COMMENT '选项D',
`answer` varchar(10) NOT NULL COMMENT '问题答案',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=''' + tb_name + '''';
'''
cur.execute(sql_create_tb)
conn.commit()
sql_insert = '''INSERT INTO `''' + tb_name + '''`
(`stem`, `choice_a`, `choice_b`, `choice_c`, `choice_d`, `answer`)
VALUES (%s,%s,%s,%s,%s,%s)'''
for item in data:
cur.execute(sql_insert, (item['stem'], item['choice_a'], item['choice_b'], item['choice_c'], item['choice_d'], item['answer']))
conn.commit()
cur.close()
if __name__ == '__main__':
dbName = 'test' # 数据库名
tbName = 'questions' # 数据表名
# 配置数据库连接信息
conn = pymysql.connect(
host='127.0.0.1',
user='root',
passwd='root',
db=dbName,
port=3306,
charset='utf8mb4')
# 开始存储数据
with open('question_bank.json', 'r') as f:
data = json.load(f)
save_data2mysql(conn, data, tbName)
```
三、随机抽取和展示题目
操作MySQL数据库后,我们就可以根据学生所需抽取的题目的数量和类型等参数,从MySQL中随机抽取题目。接下来的代码演示了如何实现从MySQL数据库中随机抽取题目。并同时将这些题目封装成一个函数帮助我们在app中随时调用。
```python
import random
import pymysql
def get_questions(qtb_name, num_per_choice, choices):
'''
从数据库qtb_name中获取num_per_choice个题目,
每个题目的答案类型必须在choices所代表的答案类型中
'''
db = pymysql.connect("localhost", "user", "password", "dbname")
cursor = db.cursor()
questions = [] # 获取的题目
for choice in choices:
sql = '''
SELECT `stem`, `choice_a`, `choice_b`, `choice_c`, `choice_d`, `answer`
FROM `''' + qtb_name + '''` WHERE `answer`="%s" ORDER BY RAND() LIMIT %d;
''' % (choice, num_per_choice)
try:
cursor.execute(sql)
results = cursor.fetchall()
for row in results:
question = {}
question['stem'] = row[0]
question['choices'] = [row[1], row[2], row[3], row[4]]
question['answer'] = row[5]
questions.append(question)
except:
print("Error: select question list failed!")
db.close()
# 让每个题目随机排列
for question in questions:
question['choices'].append(question['answer']) # 选项中加入答案
random.shuffle(question['choices']) # 随机排列选项,使A、B、C、D的位置不固定
return questions
```
在获取到随机抽取的题目列表后,我们就可以在展示界面中展示出来,并根据学生所输入的答案判断正误。接下来的代码演示了如何封装一个函数用于展示随机抽题的题目并获取用户提交的答案。函数中以问题列表questions作为参数,其中每条问题的格式为{stem:'', choices:[choice_a, choice_b, choice_c, choice_d, correct], answer:''}。其中stem和choices都是字符串。
```python
import tkinter as tk
class QuizUI:
def __init__(self, master, stem, choices):
self.master = master
self.stem_canvas = tk.Canvas(self.master, width=480, height=50)
self.choice_canvas = tk.Canvas(self.master, width=480, height=240)
self.check_button = tk.Button(self.master, text="确认", command=self.check_answer)
self.show_results = tk.Label(self.master, text=" ", font=('Arial', 14))
# 设置题干
self.stem_canvas.create_text(240, 30, text=stem, font=('Arial', 16), width=460, justify='center')
self