ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

如何建立自己的题库,实现往题库中输入问题、答案,且让题库随机出题

2022-04-10 18:03:01  阅读:258  来源: 互联网

标签:xml segment question 出题 随机 print 题库 type


原理:

本人把题库用xml文件的方式存储,实际上就是xml的读取和写入的实现

示例题库:

<?xml version="1.0" encoding="utf-8"?>
<root>
    <chapter id="1" name="网球">
        <segment id="1">
            <question>网球拍</question>
            <answer>tennis racket</answer>
        </segment>
        <segment id="2">
            <question>共享单车</question>
            <answer>shared bike</answer>
        </segment>
    </chapter>
    <chapter id="2" name="历史文化">
        <segment id="1">
            <question>讲究/强调</question>
            <answer>attach great significance to</answer>
        </segment>
        <segment id="2">
            <question>以……为基础</question>
            <answer>be set in</answer>
        </segment>
    </chapter>
</root>

首先导库:

from xml.dom.minidom import parse
import numpy

由于可能存在多个题库,比如数学、英语题库,故让用户输入题库名选择题库(即xml文件):

print('choose xml file:')
xmlName = input('type in:')

解析xml文件并获取根元素:

DomTree = parse(f'{xmlName}.xml')
root = DomTree.documentElement

接下来让用户选择做题还是往题库中写题:

print('for examination, type in 0\nfor creation, type in 1')
judge = input('type in:')

一个题库中可能有多个章节,接下来展示章节名,让用户选择章节(本人把章节名放在<chapter>标签的name属性中,见文章开头):

print('chapter:')
chapterList = root.getElementsByTagName('chapter')
for i in range(chapterList.length):
    print(chapterList[i].getAttribute('id') + '、' + chapterList[i].getAttribute('name'))
chapterNumStr = input('choose chapter:')
chapterNum = int(chapterNumStr)

获取对应章节的问题和答案(均放在<segment>标签下):

chapter = root.getElementsByTagName('chapter')[chapterNum - 1]
segment = chapter.getElementsByTagName('segment')

如若用户选择做题,询问用户按照顺序做题还是打乱顺序(numpy.random.permutation()方法)做题,并展示题目,用户输入答案后按下回车会展示参考答案并展示下一个题目,本人没有判断用户输入的答案是否正确,各位可以试着添加:

if judge == '0':
    print('out of order, type in 0\nin order, type in 1')
    ifRandom = input('type in:')
    if ifRandom == '0':
        for i in numpy.random.permutation(range(segment.length)):
            print('question:\n' + segment[i].getElementsByTagName('question')[0].childNodes[0].data)
            print("answer:")
            pause = input('yours:')
            print("reference:" + segment[i].getElementsByTagName('answer')[0].childNodes[0].data + '\n')
    elif ifRandom == '1':
        for i in range(segment.length):
            print('question:\n' + segment[i].getElementsByTagName('question')[0].childNodes[0].data)
            print("answer:")
            pause = input('yours:')
            print("reference:" + segment[i].getElementsByTagName('answer')[0].childNodes[0].data + '\n')

如若用户选择往题库中写题,我们定义一个函数,让用户依次输入问题、答案,并循环往复,用户可以在输入问题时输入"break"来跳出循环,最后把问题节点(<question>)和答案节点(<answer>)悬挂到新生成的<segment>节点下,写入xml就可以了:

segLength = segment.length
elif judge == '1':
    print('type in "break" in question to jump out of the loop')

    def write_question():
        global segLength
        segLength += 1
        q = input('type in question:')
        if q == 'break':
            print('*******************')
            print('Program terminated.')
            print('*******************')
        else:
            a = input('type in answer:')
            creationS = DomTree.createElement('segment')
            creationS.setAttribute('id', str(segLength))
            creationQ = DomTree.createElement('question')
            textQ = DomTree.createTextNode(q)
            creationQ.appendChild(textQ)
            creationA = DomTree.createElement('answer')
            textA = DomTree.createTextNode(a)
            creationA.appendChild(textA)
            creationS.appendChild(creationQ)
            creationS.appendChild(creationA)
            chapter.appendChild(creationS)
            with open(f'{xmlName}.xml', 'w', encoding='utf-8') as f:
                DomTree.writexml(f, addindent='', encoding='utf-8')
            write_question()


    write_question()

标签:xml,segment,question,出题,随机,print,题库,type
来源: https://www.cnblogs.com/daxiangcai/p/16126844.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有