建立本地题库

news2024/10/7 7:31:44

建立试题库文件json

第一步:
按标准格式保存试题到本地,文件名为.json.

import json
import os

image_path = os.path.join('C:\\', 'Users', '123', 'PycharmProjects', 'pythonProject1', 'test01', 'imges', 'jxn_0900.png')

# 准备要保存的数据
data = [
  {
        "id": 1,
        "question": "荡秋千的简化模型如图所示,摆球从A点由静止释放,到达D点后返回,B、C两点等高,下列说法正确的是:(    )",
        "image":os.path.join('C:\\', 'Users', '123', 'PycharmProjects', 'pythonProject1', 'test01', 'imges', 'jxn_0100.png'),
        "options": ["球在B、C两点的动能相等", "球在A、D两点的机械能相等", "球从B点到O点的过程中机械能减少", "球从O点到C点的过程中重力势能减少"],
        "answer": "C"
    },
{
    "id": 2,
    "question": "在水平地面上铺一张白纸,将皮球表面涂黑,使其分别从不同高度处自由下落,在纸上留下黑色圆斑A、B,如图所示。下列说法中正确的是:(    )",
    "image":os.path.join('C:\\', 'Users', '123', 'PycharmProjects', 'pythonProject1', 'test01', 'imges', 'jxn_0200.png'),
    "options": ["皮球下落过程中动能转化为重力势能", "皮球落地发生形变的过程中动能转化为弹性势能", "形成圆斑B时皮球是从更高处下落的", "形成圆斑A时皮球接触地面后形变程度更小"],
    "answer":"B"
},
{
    "id": 3,
    "question": "太空之家再迎“新成员”,2023年5月30日,搭载神舟十六号载人飞船的长征二号F运载 火箭,在酒泉卫星发射中心点火升空,中国空间站全面建成后首次载人飞行任务开启。神州十六号飞船升空过程中,下列有关说法中正确的是:(    )",
    "image":os.path.join('C:\\', 'Users', '123', 'PycharmProjects', 'pythonProject1', 'test01', 'imges', 'jxn_0300.png'),
    "options": ["航天员相对于地球是静止的", "航天员的重力势能保持不变", "航天员的惯性没有发生变化", "航天员的重力势能转化为动能"],
    "answer": "C"
},

{
    "id": 4,
    "question": "小明和同学一起荡秋千。下列说法正确的是:(    )",
    "options": ["通过最低点时的动能为零", "下降过程中的动能不变", "到达最高点的重力势能最大", "上升过程中的重力势能减小"],
    "image": os.path.join('C:\\', 'Users', '123', 'PycharmProjects', 'pythonProject1', 'test01', 'imges', 'jxn_0400.png'),
    "answer": "C"
},

{
    "id": 5,
    "question": "如图所示,先用绳子把一个铁锁悬挂起来,然后把铁锁靠近到自己的鼻子,松手后,铁锁向前摆动又摆回来。若不考虑空气阻力与摩擦,有关铁锁在摆动过程中的能量转化,下列说法错误的是:(    )",
    "options": ["铁锁回摆不能碰到鼻子,因为铁锁的机械能始终不变", "铁锁下降过程中,重力势能转化为动能", "铁锁下降到最低点,动能最大", "铁锁上升到最高点,重力势能最小"],
    "image": os.path.join('C:\\', 'Users', '123', 'PycharmProjects', 'pythonProject1', 'test01', 'imges', 'jxn_0500.png'),
    "answer":"D"
},

{
    "id": 6,
    "question": "《清明上河图》中一个人正在荡秋千的场景,下列判断中正确的是?(  )",
  "options": ["运动到最高点时,她的动能为零,重力势能最大", "运动到最低点时,她的动能最大,没有重力势能", "从最高点到最低点的过程中,她的动能转化为重力势能", "在荡秋千的整个过程中,她的机械能的总和不变"],
  "image": os.path.join('C:\\', 'Users', '123', 'PycharmProjects', 'pythonProject1', 'test01', 'imges', 'jxn_0600.png'),
  "answer": "A"
  },

{ "id": 7,
  "question": "将石块从高处斜向上抛出,其运动过程如图所示,不计空气阻力,下列说法正确的是?",
  "options": ["在最高点石块动能为零", "上升过程中的机械能大于下降过程中的机械能", "在上升过程中,重力势能转化为动能", "在空中运动的过程中,机械能守恒"],
  "image": os.path.join('C:\\', 'Users', '123', 'PycharmProjects', 'pythonProject1', 'test01', 'imges', 'jxn_0700.png'),
  "answer": "D"
  },

{
    "id": 8,
  "question": "如图所示是一位勇敢的“蹦极”爱好者纵身跳下时的情景,a点是弹性绳自然下垂时绳下端的位置,b点是蹦极者速度最大的位置,c点是蹦极者下降的最低点,下列说法正确的是(  )",
  "options": ["蹦极者在a点的动能最大", "从a点到b点,蹦极者的重力势能转化为绳的弹性势能和蹦极者的动能", "在c点时,蹦极者的动能和重力势能为零,绳的弹性势能最大", "从a点到c点的过程中,整个系统的机械能增大"],
  "image": os.path.join('C:\\', 'Users', '123', 'PycharmProjects', 'pythonProject1', 'test01', 'imges', 'jxn_0800.png'),
  "answer": "B"
},


{ "id": 9,
  "question": "游乐园里小朋友们在蹦床上欢欣跳跃,关于此过程中的有关现象,下列说法正确的是(  )",
  "options": ["小朋友与蹦床刚接触时,受到蹦床的弹力最大", "小朋友下落到最低点时受力平衡", "小朋友被蹦床反弹上升的过程中,既有动能又有重力势能", "小朋友从接触蹦床到最低点的过程中速度一直在减小"],
  "image":os.path.join('C:\\', 'Users', '123', 'PycharmProjects', 'pythonProject1', 'test01', 'imges', 'jxn_0900.png'),
  "answer": "C" 
  }
]


# 将数据写入 JSON 文件
with open('data.json', 'w') as f:
    json.dump(data, f)

# 从 JSON 文件中读取数据
with open('data.json', 'r') as f:
    read_data = json.load(f)

# 打印读取的数据
print(read_data)

第二步:建立试题对应图片文件

在这里插入图片描述
第三步、建立本地调用试题文件py

import json
import random
from PIL import Image
import os
import matplotlib.pyplot as plt


# 存储试题的文件名
QUESTIONS_FILE = 'data.json'


def load_wrong_questions(user_name):
    # 检查用户的错题本文件是否存在,如果存在,则读取其中的试题
    wrong_questions_file = f"{user_name}_wrong_questions.json"
    if os.path.exists(wrong_questions_file):
        with open(wrong_questions_file) as f:
            wrong_questions = [json.loads(line) for line in f]
        return wrong_questions
    else:
        return []


def load_questions(user_name):
    # 读取题库
    with open(QUESTIONS_FILE) as f:
        questions = json.load(f)

    # 获取错题本中的试题,并将其加入到试题中
    wrong_questions = load_wrong_questions(user_name)
    questions = wrong_questions + questions

    # 统计每道试题的错误次数
    wrong_counts = {}
    for question in wrong_questions:
        question_id = question['id']
        if question_id not in wrong_counts:
            wrong_counts[question_id] = 1
        else:
            wrong_counts[question_id] += 1

    # 按照错误次数从多到少排序
    sorted_questions = sorted(questions, key=lambda x: wrong_counts.get(x['id'], 0), reverse=True)

    return sorted_questions


def ask_question(user_name, from_wrong=False, from_bank=False):
    # 存储得分的文件名
    scores_file = f"{user_name}_scores.json"
    # 存储用户答错的试题的文件名
    wrong_questions_file = f"{user_name}_wrong_questions.json"

    # 获取试题
    random_question = None  # 初始化随机试题
    if from_wrong:
        # 从错题本中获取试题
        wrong_questions = load_wrong_questions(user_name)
        if wrong_questions:
            random_question = random.choice(wrong_questions)
    elif from_bank:
        # 从题库中获取试题
        questions = load_questions(user_name)
        if questions:
            random_question = random.choice(questions)
    else:
        # 根据上一次的加载方式选择加载试题
        if os.path.exists(f"{user_name}_last_question_source.txt"):
            with open(f"{user_name}_last_question_source.txt", 'r') as f:
                last_question_source = f.read().strip()

            if last_question_source == 'bank':
                # 上一次加载的试题来自题库,本次加载的试题必须来源于错题本
                if os.path.exists(f"{user_name}_wrong_questions.json"):
                    wrong_questions = load_wrong_questions(user_name)
                    if wrong_questions and len(wrong_questions) > 5:
                        random_question = random.choice(wrong_questions)
                else:
                    pass
            else:
                # 上一次加载的试题来自错题本,询问用户想要继续加载题库还是练习错题
                print("Which kind of questions do you want to practice?")
                print("1. From wrong questions(从错题本载入).")
                print("2. From questions bank(从试题库载入).")
                choice = input("Please select: ").strip()
                while choice not in ['1', '2']:
                    print("Invalid choice, please try again.")
                    choice = input("Please select: ").strip()

                if choice == '1':
                    # 练习错题
                    if os.path.exists(f"{user_name}_wrong_questions.json"):
                        wrong_questions = load_wrong_questions(user_name)
                        if wrong_questions and len(wrong_questions) > 5:
                            random_question = random.choice(wrong_questions)
                    else:
                        pass
                else:
                    # 练习题库中的试题
                    questions = load_questions(user_name)
                    if questions:
                        random_question = random.choice(questions)

        else:
            # 第一次加载试题,从题库中获取试题
            questions = load_questions(user_name)
            if questions:
                random_question = random.choice(questions)

    if random_question:
        # 保存本次加载试题的来源到文件,以备下一次加载试题时使用
        with open(f"{user_name}_last_question_source.txt", 'w') as f:
            f.write("bank" if from_bank else "wrong")

        # 提示用户回答问题
        print(random_question['question'])
        for i, option in enumerate(random_question['options']):
            letter = chr(i + ord('A'))  # 将数字转换为字母
            print(f"{letter}. {option}")

        # 加载图片并显示
        if 'image' in random_question:
            image_path = os.path.join(os.path.dirname(QUESTIONS_FILE), random_question['image'])
            image = Image.open(image_path)
            plt.imshow(image, interpolation='nearest')  # 设置interpolation参数为'nearest'
            plt.axis('off')  # 关闭坐标轴
            plt.show()

        # 获取用户回答
        selected_option = input("Your answer: ").strip().lower()  # 转换为小写字母,删除开头和结尾的空白字符

        # 验证用户回答是否正确
        correct_option = random_question['answer'].lower()  # 将正确答案也转换为小写字母
        if selected_option == correct_option:
            print("Correct!")
        else:
            print("Wrong.")

            # 保存用户答错的试题到错题本文件
            with open(wrong_questions_file, 'a') as f:
                f.write(json.dumps(random_question) + '\n')

        # 保存得分
        score = 100 if selected_option == correct_option else 0
        with open(scores_file, 'a') as f:
            f.write(f"{score}\n")

        # 在错题本中删除答对的试题
        if from_wrong and selected_option == correct_option:
            wrong_questions = load_wrong_questions(user_name)
            if wrong_questions:
                wrong_questions = [q for q in wrong_questions if q['id'] != random_question['id']]
                with open(wrong_questions_file, 'w') as f:
                    for question in wrong_questions:
                        f.write(json.dumps(question) + '\n')
    else:
        print("Failed to get random question.")


def start_practice(user_name):
    # 循环调用试题
    count = 3  # 初始化计数器
    while True:
        ask_question(user_name)

        count -= 1
        if count == 0:
            # 每做3道题后询问用户是否继续做题
            if len(load_wrong_questions(user_name)) > 5:
                ask_again = input("Do you want to continue? (y/n)").strip().lower()
                if ask_again != 'y':
                    break
                else:
                    count = 3  # 重置计数器
            else:
                print("Wrong questions less than 5,continue to choose from bank.")
                count = 3  # 重置计数器


if __name__ == '__main__':
    # 获取用户名称
    user_name = input("Please input your name: ").strip()
    while not user_name:
        # 如果用户名称为空,则提示用户重新输入
        print("User name cannot be empty, please try again.")
        user_name = input("Please input your name: ").strip()

    # 开始练习
    start_practice(user_name)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/704256.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于深度学习的高精度动物园动物检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度动物园动物(水牛、斑马、大象、水豚、海龟、猫、奶牛、鹿、狗、火烈鸟、长颈鹿、捷豹、袋鼠、狮子、鹦鹉、企鹅、犀牛、羊、老虎)检测识别系统可用于日常生活中或野外来检测与定位动物园动物,利用深度学…

【Java可执行命令】(五)打包部署工具 jar:深入解析应用程序打包、分发和部署工具jar ~

Java可执行命令详解之jar 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式:创建jar文件3.1.1 参数:-cf3.1.2 参数:-tf3.1.3 参数:-i3.1.4 参数:-v3.1.5 参数:-e 3.2 运行jar文件 4️⃣ 应用场景5️⃣ 注…

Qt实现电子商城系统

用Qt实现的电子商城系统: 1.功能包括: 1)管理员账户 2)用户管理 3)用户登录 4)商品管理 5)商品出售 6)软件打包 2.商品包括:程序源码、开发教程和程序讲解;也可以根据需求进行功能更改 3.试用链接 链接:https://pan.…

华硕无畏14pro设置指纹登录

正常的流程如下 打开一个文件夹,在左侧找到此电脑,点击右键,找到属性 在搜索框中搜索:设置指纹登录 找到指纹识别,左键点击即可展开,点击:添加手指 点击:开始 输入PIN(开…

Oracle Linux 迷途知返

Oracle Linux 6.9 发布了。Oracle 已经宣布发布 Oracle Linux 6 发行版的更新了。 新版本 Oracle Linux 6 Update 9,包括多个已更新的内核,以及两个新的 "Unbreakable Enterprise Kernel" 包和一个 "Red Hat Compatible Kernel" 包…

SAP 后台配置之FM基金管理篇

SAP FM基金管理后台配置及应用 1 二话不说先上后台配置,能跑通为先1.1 基础设置1.1.1 维护财务管理区1.1.2 分配财务管理区1.1.3 激活全局基金管理功能1.1.4 定义全局参数1.1.5 定义编号区间编号并分配1.1.6 创建更改层次变式1.1.3 激活科目分配元素1.1.4 设置允许空…

3 款适合您手机或平板电脑的最佳 Android 和 iOS 修复工具

让我们面对现实:技术不可能总是完美的,您的智能手机也是如此,尽管更容易爱上它。毕竟,它只是一台机器! 无论您使用的是 Android 还是 iOS 系统的智能手机或平板电脑,当您第一次带回家时,它都能…

搭建帮助中心需要用到哪些工具

随着企业的发展和客户需求的增加,为了提供更好的客户支持和服务,许多企业决定搭建帮助中心。一个完善的帮助中心可以为客户提供详细的产品信息、常见问题解答和使用指南等,帮助他们快速解决问题并提高客户满意度。在本文中,我们将…

优秀的测试工程师养成记,庸碌四年的点工,“我“要进阶了...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 怎么才能成为优秀…

运动耳机哪种戴着舒服、值得推荐的五款运动耳机

在运动中享受最佳声音和舒适感受。这些耳机不仅具备防汗、抗水、稳定舒适的特点,而且还拥有出色的音质和智能功能,帮助你充分释放潜能,突破自我。无论你是专业运动员还是热爱户外活动的人,这些运动耳机将成为你的最佳伙伴&#xf…

Spring AOP 源码探索 之 链式调用中的 ExposeInvocationInterceptor拦截器作用

文章目录 ExposeInvocationInterceptor 示例代码源码分析 extendAdvisorsmakeAdvisorChainAspectJCapableIfNecessary添加扩展拦截器的调用链作用示例总结相关学习路线 JAVA资深架构师成长路线->开源框架解读->Spring框架源码解读 ExposeInvocationInterceptor 从英文名字…

【Linux系列P5】gccg++与【动静态库】的美妙邂逅

前言 大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎!本章主要内容面向接触过Linux的老铁,主要内容含 欢迎订阅 YY 滴Linux专栏!更多干货持续更新!以下是传送门! 订阅专栏阅读:YY的《…

exe的python文件打包

【步骤01】 【在命令行中用pip工具安装Pyinstaller模块】 pip install Pyinstaller 步骤02】 【切换命令行的路径到你要打包的Python源文件的文件夹路径下】 【下面是我要打包的Python源文件(散点坐标图.py)及其文件夹路径】 【步骤03】 【执行Pyi…

js使用replace保留两位小数,正则保留小数位,输入负数和小数正则自动校验

下面是方法,支持保留自定义小数位,这里使用的是截取,没有四舍五入,我的功能需求是只有两位小数的地方可以输入负数,所以只加在了num2的代码块里,如果你们需要所有数字都进行负号校验,可以吧if (isF)判断放在…

百度智驾,与车路协同说「再见」

作者 | 魏启扬 来源 | 洞见新研社 在经历了裁员,全员停发年终奖之后,百度对智能交通事业部(ACE)的治理还在继续。 不久前,有媒体爆料称,百度已经将智能交通事业部(ACE)从原来的智能…

smart Java——Netty实战(下):开发一个仿WeChat聊天工具SmartChat

文章目录 〇、代码逻辑一、搭建Server1.引入依赖2.搭建一个简单的Server 二、搭建WebSocket建立连接1.修改Server,增加一些支持2.自定义一个WebSocketHandler 三、功能实现——用户注册上线1.先定义一个工具类Result,用于封装服务端返回消息2.封装客户端…

easyX库图像处理相关函数(注释版)

0.图像处理相关函数与类型概览 您好,这里是limou3434,本次我将给您带来的是easyX的图像处理相关接口。 如果您感兴趣也可以看看我的其他内容。 函数或数据类型描述IMAGE保存图像的对象。loadimage读取图片文件。putimage在当前绘图设备上绘制指定图像…

高压线路距离保护程序逻辑原理(三)

阻抗元件的主要程序功能是阻抗计算,即第二章的解微分方程算法。配合低通数字滤波器计算出故障点至保护安装处的感受电抗X和电阻R值,再同整定值比较以确定是否在区内。阻抗元件也可以采用其他算法计算阻抗,但应指出上述哪种计算感受电抗和电阻…

如何去伪存真高效挖掘用户真实需求?2大模型

用户需求描述模糊,不清晰,往往对项目造成不可估量的风险:需求理解错误、新增需求、变更需求等问题,从而影响项目按时交付。 那么如何更准确地描述用户需求,就显得尤为重要。而可行性较强的模型主要有两种:5…

Django纪录操作之增删改查

一、单表 1、 添加记录 准备表 from django.db import modelsclass Book(models.Model):title models.CharField(max_length20)price models.DecimalField(max_digits65,decimal_places5)publish models.CharField(max_length30)pub_date models.DateTimeField(auto_now…