`

简易试卷生成系统

阅读更多
期中考试,如何机考是个难题,就用了半天时间写了这么一个试卷生成系统。基本思路很简单,就是读取题目,然后生成一个html网页,这个网页分发给学生,进行测试。考虑到机房那破电脑,就不搞b/s结构了,所有逻辑都在html中实现。
当然,有几个问题必须考虑。
一是如何自动评分
二是如何尽可能的防止zuobi
第一个问题很简单,但第二个有点头疼。这里,对答案采取base64编码。当然,如果学生懂js的,一行alert即可勘破天机。所以说,这个小系统只能用于随堂检测。


代码如下 SimpleTestGenerator.py:
import base64
class Generator:
    def __init__(self):
        self.template = '''<html>
<head>
	<title>${testName}</title>
</head>
<body>
        ${questions}
	<input type="button" onclick="submit()" value="交卷" />


<script type="text/javascript">
submitTimes=0;
duration = ${duration};
ifTimeup = false;
selNum = ${selNum}


setTimeout("timeup()",1000*60*duration);

function getRadioValue(radioName)
{
    var radios = document.getElementsByName(radioName);
    if(!radios) 
        return '';
    for (var i = 0; i < radios.length; i++) 
    {
        if (radios[i].checked) 
            return radios[i].value;
    }
   return '';
}

function submit(){
    if(ifTimeup){
        submitTimes += 1;
        a = decodeBase64("${answer}");
        score = 0;
        weight = 100/selNum;
	for(i = 0 ; i < selNum ; i++){
	     if(getRadioValue("sel"+(i+1))==a.charAt(i)){    
	         score+=weight;
	     }
	}
	alert("成绩:"+score+"分"+"  提交次数:"+submitTimes+"次");
    }else{
        alert("时间未满"+duration+"分钟"+"不能提交!")
    }
}

function timeup(){
    ifTimeup = true;
}

var END_OF_INPUT = -1;
    var base64Chars = new Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", 

"M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", 

"e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", 

"w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/");
    var reverseBase64Chars = new Array();
    for (var i = 0; i < base64Chars.length; i++) {
        reverseBase64Chars[base64Chars[i]] = i
    }
    var base64Str;
    var base64Count;
    function setBase64Str(a) {
        base64Str = a;
        base64Count = 0
    }
    function readReverseBase64() {
        if (!base64Str) {
            return END_OF_INPUT
        }
        while (true) {
            if (base64Count >= base64Str.length) {
                return END_OF_INPUT
            }
            var a = base64Str.charAt(base64Count);
            base64Count++;
            if (reverseBase64Chars[a]) {
                return reverseBase64Chars[a]
            }
            if (a == "A") {
                return 0
            }
        }
        return END_OF_INPUT
    }
    function ntos(a) {
        a = a.toString(16);
        if (a.length == 1) {
            a = "0" + a
        }
        a = "%" + a;
        return unescape(a)
    }
    function decodeBase64(d) {
        setBase64Str(d);
        var a = "";
        var c = new Array(4);
        var b = false;
        while (!b && (c[0] = readReverseBase64()) != END_OF_INPUT && (c[1] = 

readReverseBase64()) != END_OF_INPUT) {
            c[2] = readReverseBase64();
            c[3] = readReverseBase64();
            a += ntos((((c[0] << 2) & 255) | c[1] >> 4));
            if (c[2] != END_OF_INPUT) {
                a += ntos((((c[1] << 4) & 255) | c[2] >> 2));
                if (c[3] != END_OF_INPUT) {
                    a += ntos((((c[2] << 6) & 255) | c[3]))
                } else {
                    b = true
                }
            } else {
                b = true
            }
        }
        return a
    }

</script>
	
</body>
</html>'''
        
    def setTestName(self,testName):
        self.testName = testName
        self.doReplace("testName",testName)

    def setDuration(self,duration):
        self.doReplace("duration",duration)

    def setQuestions(self,questions):
        self.doReplace("selNum",str(len(questions)))
        qStr = ''
        aStr = ''
        for (i,q) in enumerate(questions,start=1):
            qStr+=str(i)+") "+q.query+"<br>\n"
            for (j,o) in enumerate(q.options,start=1):
                qStr+='''<input type="radio" name="sel'''+str(i)+'''" value="'''+str(j)+'''">'''+o+'''<br>\n'''
            aStr+=str(q.answer)
        self.doReplace("questions",qStr)
        self.doReplace("answer",base64.encodestring(aStr.encode(encoding="ascii")).decode(encoding="ascii").replace('\n','\\n'))
    def doReplace(self,key,value):
        key="${"+key+"}"
        self.template = self.template.replace(key,value)
        
    def generate(self):
        f=open(self.testName+".html","w")
        f.write(self.template)
        f.close()

class Question:
    def __init__(self):
        self.query = None
        self.options = []
        self.answer = None

class Parser:
    def __init__(self,fName):
        self.fName = fName
        self.answerConvertDic = {'A':1,'B':2,'C':3,'D':4}
    def parse(self):
        fin = open(self.fName)
        self.questions = []
        q = None
        for (lno,line) in enumerate(fin.readlines()):
            line = line.strip()
            if lno==0:
                self.testName = line
            elif lno==1:
                self.duration = line
            elif (lno-2)%6==0:
                q = Question()
                q.query = line
            elif (lno-2)%6==5:
                q.answer=self.answerConvertDic[line]
                self.questions.append(q)
            else:
                q.options.append(line)



def main():
    parser = Parser("题目.txt")
    parser.parse()
    ge = Generator()
    ge.setTestName(parser.testName)
    ge.setDuration(parser.duration)
    ge.setQuestions(parser.questions)
    ge.generate()    


main()










例如若是生成题库为 题目.txt:
计算机应用基础期中检测
15
下列关于因特网上收/发电子邮件优点的描述中,错误的是________。
   A)不受时间和地域的限制,只要能接入因特网,就能收发电子邮件
   B)方便、快速
   C)费用低廉
   D)收件人必须在原电子邮箱申请地接收电子邮件
D
下列关于电子邮件的说法,正确的是________。
   A)收件人必须有E-mail地址,发件人可以没有E-mail地址
   B)发件人必须有E-mail地址,收件人可以没有E-mail地址
   C)发件人和收件人都必须有E-mail地址
   D)发件人必须知道收件人住址的邮政编码
C
假设ISP提供的邮件服务器为bj163.com,用户名为XUEJY的正确电子邮件地址是________。
   A)XUEJY @ bj163.com  
   B)XUEJYbj163.com
   C)XUEJY#bj163.com    
   D)XUEJY@bj163.com
D
用高级程序设计语言编写的程序________。
   A)计算机能直接执行             
   B)可读性和可移植性好
   C)可读性差但执行效率高         
   D)依赖于具体机器,不可移植
B

第一行为测试名称,第二行为考试时长(分钟),在这个时间之前不能交卷,也是防止学生通过反复交卷猜答案,之后的几行,是题干、选项、答案的loop;此处选择项必须是4个。


执行SimpleTestGenerator后,读取上述题库,生成的网页如下:
<html>
<head>
	<title>计算机应用基础期中检测</title>
</head>
<body>
        1) 下列关于因特网上收/发电子邮件优点的描述中,错误的是________。<br>
<input type="radio" name="sel1" value="1">A)不受时间和地域的限制,只要能接入因特网,就能收发电子邮件<br>
<input type="radio" name="sel1" value="2">B)方便、快速<br>
<input type="radio" name="sel1" value="3">C)费用低廉<br>
<input type="radio" name="sel1" value="4">D)收件人必须在原电子邮箱申请地接收电子邮件<br>
2) 下列关于电子邮件的说法,正确的是________。<br>
<input type="radio" name="sel2" value="1">A)收件人必须有E-mail地址,发件人可以没有E-mail地址<br>
<input type="radio" name="sel2" value="2">B)发件人必须有E-mail地址,收件人可以没有E-mail地址<br>
<input type="radio" name="sel2" value="3">C)发件人和收件人都必须有E-mail地址<br>
<input type="radio" name="sel2" value="4">D)发件人必须知道收件人住址的邮政编码<br>
3) 假设ISP提供的邮件服务器为bj163.com,用户名为XUEJY的正确电子邮件地址是________。<br>
<input type="radio" name="sel3" value="1">A)XUEJY @ bj163.com<br>
<input type="radio" name="sel3" value="2">B)XUEJYbj163.com<br>
<input type="radio" name="sel3" value="3">C)XUEJY#bj163.com<br>
<input type="radio" name="sel3" value="4">D)XUEJY@bj163.com<br>
4) 用高级程序设计语言编写的程序________。<br>
<input type="radio" name="sel4" value="1">A)计算机能直接执行<br>
<input type="radio" name="sel4" value="2">B)可读性和可移植性好<br>
<input type="radio" name="sel4" value="3">C)可读性差但执行效率高<br>
<input type="radio" name="sel4" value="4">D)依赖于具体机器,不可移植<br>

	<input type="button" onclick="submit()" value="交卷" />


<script type="text/javascript">
submitTimes=0;
duration = 15;
ifTimeup = false;
selNum = 4


setTimeout("timeup()",1000*60*duration);

function getRadioValue(radioName)
{
    var radios = document.getElementsByName(radioName);
    if(!radios) 
        return '';
    for (var i = 0; i < radios.length; i++) 
    {
        if (radios[i].checked) 
            return radios[i].value;
    }
   return '';
}

function submit(){
    if(ifTimeup){
        submitTimes += 1;
        a = decodeBase64("NDM0Mg==\n");
        score = 0;
        weight = 100/selNum;
	for(i = 0 ; i < selNum ; i++){
	     if(getRadioValue("sel"+(i+1))==a.charAt(i)){
	         score+=weight;
	     }
	}
	alert("成绩:"+score+"分"+"  提交次数:"+submitTimes+"次");
    }else{
        alert("时间未满"+duration+"分钟"+"不能提交!")
    }
}

function timeup(){
    ifTimeup = true;
}

var END_OF_INPUT = -1;
    var base64Chars = new Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", 

"M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", 

"e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", 

"w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/");
    var reverseBase64Chars = new Array();
    for (var i = 0; i < base64Chars.length; i++) {
        reverseBase64Chars[base64Chars[i]] = i
    }
    var base64Str;
    var base64Count;
    function setBase64Str(a) {
        base64Str = a;
        base64Count = 0
    }
    function readReverseBase64() {
        if (!base64Str) {
            return END_OF_INPUT
        }
        while (true) {
            if (base64Count >= base64Str.length) {
                return END_OF_INPUT
            }
            var a = base64Str.charAt(base64Count);
            base64Count++;
            if (reverseBase64Chars[a]) {
                return reverseBase64Chars[a]
            }
            if (a == "A") {
                return 0
            }
        }
        return END_OF_INPUT
    }
    function ntos(a) {
        a = a.toString(16);
        if (a.length == 1) {
            a = "0" + a
        }
        a = "%" + a;
        return unescape(a)
    }
    function decodeBase64(d) {
        setBase64Str(d);
        var a = "";
        var c = new Array(4);
        var b = false;
        while (!b && (c[0] = readReverseBase64()) != END_OF_INPUT && (c[1] = 

readReverseBase64()) != END_OF_INPUT) {
            c[2] = readReverseBase64();
            c[3] = readReverseBase64();
            a += ntos((((c[0] << 2) & 255) | c[1] >> 4));
            if (c[2] != END_OF_INPUT) {
                a += ntos((((c[1] << 4) & 255) | c[2] >> 2));
                if (c[3] != END_OF_INPUT) {
                    a += ntos((((c[2] << 6) & 255) | c[3]))
                } else {
                    b = true
                }
            } else {
                b = true
            }
        }
        return a
    }

</script>
	
</body>
</html>
分享到:
评论

相关推荐

    考试试卷生成系统

    考试试卷生成系统简易考试试卷生成系统简易考试试卷生成系统简易

    简易计算机考试系统asp.net ssql

    3. **考试管理**:设置考试时间、试题数量、题目类型等参数,生成随机试卷。 4. **在线答题**:考生在指定时间内完成选择题、填空题、判断题等各类题型。 5. **自动评分**:答题结束后,系统自动对比答案,计算得分...

    简易考试系统

    可以采用加权随机算法,根据题型难度和知识点分布来生成试卷。 3. 在线答题:用户通过Web浏览器进行答题,前端技术如HTML、CSS、JavaScript负责展示题目和接收用户输入,后端处理答题提交并保存答案。 4. 自动评分...

    c语言在线考试系统—试题生成模块.doc

    4. 试卷的自动生成:使用PHP语言编写的脚本,实现试卷的自动生成功能,以提高试卷生成效率。 三、系统实现技术 该系统的实现基于B/S模式,使用MySQL数据库,PHP语言作为开发平台,Dreamweaver作为开发工具,Apache...

    中小学简易成绩管理系统(excel)

    简易成绩分析系统使用说明 四川省泸州市纳溪区大渡中学教务室制作使用 ※※※※一、特色 EXCEL平台 本作品采用EXCEL 公式+VBA制作,既可根据你平时使用EXCEL的习惯和方式操作充分发挥EXCEL的功能,又能利用本作品...

    简易在线考试系统jsp--ssh

    3. **试卷生成**:管理员可以根据需求随机或手动选择试题生成试卷,设置考试时间、分数规则等参数。 4. **在线考试**:考生可以在指定时间内登录系统,进行在线答题,系统实时记录答题进度和答案。 5. **自动评分**...

    c语言在线考试系统试题生成模块设计大学本科毕业论文.doc

    它分为试题生成模块、在线考试模块、自动评分模块,整个系统层次结构简单,操作简易,并具备了一定的安全性,在有利于提高网络教学的质量的同时,大大的拓展了考试的灵活性,阅卷效率,还保证了考试的公平性,答案的...

    中小学简易成绩分析系统

    简易成绩分析系统使用说明 四川省泸州市纳溪区大渡中学教务室制作使用 ※※※※一、特色 1、 EXCEL平台 本作品采用EXCEL 公式+VBA制作,既可根据你平时使用EXCEL的习惯和方式操作充分发挥EXCEL的功能,又能利用本...

    C语言在线考试系统——试题生成模块毕业设计.doc

    整个系统层次结构简单,操作简易,并具备了一定的安全性。 试题生成模块是C语言在线考试系统的核心组件之一。该模块主要实现了批量上传试题、单条上传试题、试题的查询与删除、试卷的自动生成等功能。该模块的设计...

    自己写的简易struts 并且用它完成简单在线考试系统

    在这个项目中,你创建了一个简易的Struts实现,并用它构建了一个简单的在线考试系统。这对于初学者来说是一个很好的实践,因为它涉及到Web开发中的多个关键概念和技术。 首先,理解Struts框架的基础是必要的。...

    中小学简易成绩管理系统(EXCEL VBA)

    简易成绩分析系统使用说明 四川省泸州市纳溪区大渡中学教务室制作使用 一、特色 1、限制条件少 只需把原始成绩录入或粘贴入总表即可,对总表要求极为宽松:不必整理试卷、非顺序登分;各列(包括科目)名称、位置任意...

    Java线考试系统,支持自动阅卷、手动阅卷、随机组卷、手动组卷等功能.zip

    随机组卷功能允许系统根据预设的题目库随机选择题目生成试卷,这涉及Java的集合框架和算法设计。开发者可能会使用ArrayList、LinkedList或其他数据结构存储题目,并通过随机数生成器进行选择。手动组卷则为教师提供...

    基于ASP.NET在线考试系统设计

    在线考试系统的主要特点是一方面可以动态地管理各种考试系统信息,只要准备好足够大的题库,就可以按照要求自动生成各种试卷;另一方面,考试时间灵活,用户可以在规定时间段内的任意时间参加考试;另外计算机化的考试的...

    网络考试系统质量属性

    系统的功能模块分别为:试题编制、试题管理、试卷生成、身份确认、考试与提交、试卷批阅、统计分析、成绩归档、成绩发布等。 还考虑了以下几个方面: (1)系统提供准考证号与 IP 地址绑定,动态生成试卷及屏蔽...

    jsp SMART系统-考试监控及阅卷模块的设计与开发(源代码+论文)

    4. 成绩统计:系统自动计算总分,生成成绩报告,并进行排名。 四、SMART系统配置 系统配置文档提供了详细的安装和配置步骤,包括服务器环境设置、数据库连接、JSP开发环境搭建等,以确保系统的正常运行。 五、源...

    魔众题库系统v3.3.0_题库_

    《魔众题库系统v3.3.0:构建与扩展简易在线教育平台》 “魔众题库系统v3.3.0”是一个专为教育领域设计的轻量级题库软件,它具备基本的题库管理和组卷功能,为教育工作者提供了便捷的在线教学资源管理工具。这款系统...

    基于C/S模式下二级C语言模拟考试系统开发.pdf

    系统的题库管理系统下设题库管理模块和试卷管理模块,分别负责考试试题的分类整理、试卷的生成和输出。题库管理模块中的分类整理尤为重要,因为上机考试题型包括程序填空、程序修改和程序设计,每种题型都要求考生...

    java窗体考试系统

    Java窗体考试系统是一款基于Java编程语言开发的简易考试应用,它主要利用Java的图形用户界面(GUI)技术,如Swing或JavaFX,来构建交互式的考试平台。这款系统通常具备试题显示、答题、计时、自动评分等功能,旨在为...

    基于c++的学生考试系统

    【基于C++的学生考试系统】是一个使用VC++作为开发环境的毕业设计项目,旨在实现一套简易的考试管理系统。这个系统不仅提供了基本的考试功能,还包含了一份详细的设计报告,为理解系统架构和实现过程提供了清晰的...

    JSP简单在线考试卷理系统+SQL2000

    【标题】"JSP简单在线考试卷理系统+SQL2000" 是一个基于Java Server Pages(JSP)技术构建的简易版在线考试管理系统,它结合了SQL Server 2000作为后端数据库来存储和管理考试数据。这个系统可能包含创建、发布、...

Global site tag (gtag.js) - Google Analytics