标准化机试系统的开发与拓展 标准化考试的弊大于利

发布时间:2020-02-16 来源: 幽默笑话 点击:

  摘要:本文结合自己多年开发标准化机试系统的经验,详细阐述常用机试系统的原理、缺陷,提出改进方法及新的解决方案,并在已有基础上,设计出更加科学实用的系统,发展并拓宽现有考试系统的应用范围。最后给出无相邻重复的随机抽题算法,以确保随机抽题的公正性。
  关键词:机试系统;连通图着色;随机抽题
  中图分类号:TP27 文献标识码:A
  
  在我国高等教育体制中,计算机教育一直被摆在重点位置。几乎所有高等院校的所有专业都至少开设有一门计算机课程。“计算机文化基础”(以下简称“计文”)或相关课程是必不可少的。工科专业一般开设有C/C++、Java程序设计,文科会学习VB、VFP等。
  有教学过程就必然要有科学规范的评价机制。计算机课程的教学评价一般通过笔试和机试两种方式进行。作为非常注重培养实践能力的学科,机试加笔试显然比单纯笔试更加适合计算机课程教学。笔试可以胜任像C/C++、Java代码编程和计算机原理概念的考查。但像计算机操作水平或VC、VB可视化编程等,就只能通过机试才可得到真正科学的评判。
  本文所探讨的机试,专指编程或计算机操作类机考,不涉及用机考代替笔试的无纸化考试。以下将针对机试系统开发与技术创新等问题进行讨论。
  
  1 常用标准化机试系统的原理、缺陷及改进
  
  标准化机试系统常采用以下两种原理实现:
  
  1.1 截屏法
  截屏法的原理较为简单。考生面对的不是真正的软件界面,而是静态的截图界面。在每个静态截图的相应位置设置热点区,比如活动的菜单、按钮、工具栏等。每一屏的输出结果是唯一的。如果考生根据考题要求,点击了当前正确的热点区,则认为操作正确,屏幕将立刻显示下一截屏。否则,系统停在此屏,等待考生正确点击。如果考生放弃此题或中途交卷,系统会根据考生最终到达了该题的哪一步来给出相应得分。
  例如,在Visual Basic窗体中设计一个“退出”按钮,功能是点击按钮后窗体退出:
  
  上图中每一个方块代表一个屏。截屏法用屏幕的变化来模拟真实的软件环境,但同时产生了路径唯一性问题。考生只有点击了正确的区域,或者输入正确的命令后才可进入下一屏。这与真实的软件环境差距甚远。考生在不了解考题意图的情况下,会感觉无所适从。加上软件中能够实现同一功能的操作有多种,而每个人的操作习惯又不可能完全一样,这都影响了截屏式系统的通用性。比如上述图例中第三步“查看代码”,还可用菜单操作和右键操作实现,但考生只有点击了“查看代码”按钮后才能进行下一步。
  要想提高题目的通用性,必须通过在实现同一功能的所有区域设置热点来改进。但考题设置的工作量也随之加大,同时很难顾及到点击或输入错误时的软件变化。
  截屏法的技术含量不高,对系统的要求较低,并且没有软件环境的限制。其最大优势在于能架设在B/S(浏览器/服务器)模式上。因为浏览器中很难包含真正的软件环境,而截屏法规避了这一难点。
  
  1.2 文件比较法
  文件比较法以真实的软件作考试环境,并且要事先做好标准答案文件,因而一般架构在C/S(客户端/服务器)模式上。考生通过操作相应软件生成或修改考题所要求的文件。考试完毕后。系统将考生做的文件与标答文件详细对照。如果对照一致,则给出相应得分。
  对于C/C++、Java一类代码编程的考试,只需要对考生源程序和标答源程序做逐行扫描,根据对比源程序字符来判分。同一功能可能还有多种写法,都应设置在标准答案中。如果是纯粹的函数编写,应设置输出结果文件。通过比较输出的结论评分。
  这种忽略操作过程、分析结论评分的方法比截屏法更加客观公正,能够检验考生真实的计算机操作和编程水平。考试系统完善之后,考题就十分容易设置和变化。
  国内高校中开设VFP数据库课程的专业较多。下面以VFP机试系统为例,说明文件比较法机试系统的开发与关键技术的实现:
  
  系统用VFP9编写,因为在VFP环境下启动考试环境和处理VFP体系的文件都具有一定优势。并且VFP9也能够胜任C/S模式软件的高效开发。服务器端用SQL Server数据库储存考试信息、考试时间、考题和标准答案。考试机(客户端)必须获得了这些信息后才可参与考试。因此,服务器端能够完全掌控考试的类型和具体要求。
  1.2.1 抽题
  传统的机试系统往往简略甚至忽略这一环节,只是保证每一台考试机上的考题是随机抽取。但如果相邻的考试机抽到一样的考题,那么考试的公正性就有可能会打折扣。所以必须使任意相邻的考试机抽到不同的考题。
  可以利用同一局域网各联网机器IP地址的不同,在每场考试之前由服务器端生成一个抽题方案表,储存在数据库中。开考时,每台考试机都访问这个抽题表,获得各自题号,再下载相应数据进行考试。
  无相邻重复的随机抽题算法在本文的第四节给出。
  1.2.2 评分
  传统的评分方案仅仅只是评判某些题目要求的文件是否生成,或者比较字符类文件和表文件。这对于C/C++、Java等代码类的考试是适用的。
  但如果为可视化编程,如VC、PB、VFP等,或计文中的Word、Excel办公软件,涉及文件繁多,有窗口、菜单、程序、文档、数据。这些文件的类型、格式都不相同。这一类的评分只有采用扫描二进制文件内容的方法才可进行。所以必须先分析出这些文件的内部构造,才能设置相应的评分程序。
  比如要在数据库中两表间建一个永久关联。分析DBC文件后发现,永久关联会在DBC文件中增加256个字节的内容,格式为:
  Relation Relation 1……Field(字段名)…Field(字段名)…
  对应16进制为:
  52 65 6C 61 74 69 6F 6E 20 20 52 65 6C 61 74 69 6F 6E 20 31……46 69 65 6C 64…46 69 65 6C 64…
  通过读取DBC文件的二进制内容,并查找此16进制代码,就可以判断考生是否回答正确。只要得到一次这样的代码,就能相应作出其它类似题目的判分程序。利用这一方法,几乎可以设置出任何一种软件科目的判分机制。
  需要注意的是,如果将评分都交给服务器端完成,会给服务器造成很大的工作量。应该为每一套题设置对应的评分程序,并随考题数据一起下载到考试机上。最后由考试机完成判分,将判分结果传回服务器。为了不让考生修改或删除评分程序,或者在非考试环境里答题,考试系统应在运行时屏蔽对考试系统以外的所有操作,以保安全。
  考试的最终目的是为了指导和改进教学。因此,评分程序应当细化到题,甚至于知识点。这样做能让服务器获得详细的评分结果,以便统计具体的教学得失。
  
  2 一种更好的机试系统设计思路
  
  文件比较法也同样有一定的缺陷。此法只是评判结果,完全忽略了过程。考生就算掌握了知识点,但在操作中有一点小失误,导致结果未能生成或不完整,都会极大影响对该考生的公正评价。如果在对结果文件评判的同时,又能判断操作的正误,就能弥补评分的缺失。
  可以另外用VC++或BCB设计一个外壳程序,随答题环境一起运行,环境退出时关闭。外壳程序的任务是将考生的鼠标操作记录到一个文本文档中。
  用API函数SetWindowsHookEx建立Hook,将程序添加到Hook链中,目的是监视Windows消息??[1]?:
  tsHook =(HWND)SetWindowsHookEx(WH_MOUSE, MntProc, tsInstance, 0);
  MntProc函数得到每一次考生点击的按钮或菜单的标号,并依次追加到鼠标操作记录userdo.txt文件中:
  LRESULT CALLBACK MntProc(int nCode, WPARAM wParam, LPARAM lParam)
  {
  WPARAM bmid;
  FILE *fp;
  bmid = wParam; // bmid得到按钮或菜单的标号
  ……
  fp = fopen(“d:\\cpexam\\pinf\\userdo.txt”,“a”);
  fprintf(fp, “%4d”, bmid);
  fclose(fp);
  ……
  return CallNextHookEx(tshook, nCode, wParam, lParam);
  }
  函数返回CallNextHookEx(),继续启动下一个Hook传递消息。
  当考生点击交卷或系统自动交卷后,用UnhookWindowsHookEx()函数卸载Hook,并退出外壳程序。最后的userdo.txt中保存的文本为考生操作的按钮和菜单的序列。
  此类系统的评分标准应包含两方面。一方面是生成文件的得分,另一方面通过分析鼠标操作记录文件中按钮和菜单标号的前后关系给出操作得分。
  
  3 无相邻重复的随机抽题算法
  
  相邻考试机抽到不同的考题,是保证考试公正性的重要环节。抽题前先要保证参与考试的机器IP地址或计算机名是顺序的,比如计算机名为:cs1、cs2、cs3、…… cs[n],并且顺序摆放成如下矩阵:
  
  为保证每一台机器抽到与四周8台都不同的题,可以将此矩阵看成一个平面连通图。故问题可归结为连通图的“五色”着色问题:用5种颜色可以给任一平面简单连通图G=<V, E>正常着色?[2]?。在实际算法中,只需考虑连通图相邻5个顶点中的某一点与其余各点均不同,并遍历所有点。
  具体规则如下:
  (1)第一排每点不与左点相同
  (2)其余各排为:
   a最左点不与上点和右上点相同
   b最右点不与左点、左上点和上点相同
   c其余各点不与左点、左上点、上点和右上点相同
  以下用VFP表述算法,其中pctt为考试机总数,tmt为总题量,a为当前考试机编号:
  dimension t(pctt)
  t=0 && 初始化数组t
  t(1)=int(1+tmt*rand()) && 随机初始化cs??[1]?
  do case
  case tmt>=5 && 考虑“五色”情况
   for n=2 to a && 第一排每台抽题与左边不同
   do while .t.
   t(n)=int(1+tmt*rand())
   if t(n)<>t(n-1)
   exit
   endif
   enddo
   endfor
   for n=a+1 to pctt && 除第一排外
   do case
   case (n-1)%a=0 && 每排最左边需与上、右上都不同
   do while .t.
   t(n)=int(1+tmt*rand())
   if t(n)<>t(n-a) and t(n)<>t(n-a+1)
   exit
   endif
   enddo
   case (n)%a=0 && 每排最右边需与上、左上、左都不同
   do while .t.
   t(n)=int(1+tmt*rand())
   if t(n)<>t(n-a) and t(n)<>t(n-a-1) and t(n)<>t(n-1)
   exit
   endif
   enddo
   otherwise
   do while .t.
   t(n)=int(1+tmt*rand()) && 处于中间则需与上、左上、左、右上都不同
   if t(n)<>t(n-a) and t(n)<>t(n-a+1) and t(n)<>t(n-a-1) and t(n)<>t(n-1)
   exit
   endif
   enddo
   endcase
   endfor
  endcase
  考虑极端情况:题库中只有4套题,即经典的“地图四色问题”,只能另设算法,让抽题矩阵形成如下状况:(数字代表题的编号)
  1 2 1 2 1 2 1 ……
  3 4 3 4 3 4 3 ……
  1 2 1 2 1 2 1 ……
  3 4 3 4 3 4 3 ……
  ……
  如果题量再少,将无法使每一台机器抽到与四周8台都不同的题。如果题量较多,数量大于机器数,可考虑直接用考题数组覆盖机器阵列。
  每场考试前运行抽题程序,在服务器端生成抽题表。为使抽到的考题下载到考试机,客户端程序用以下语句创建一个Winsock接口引用testpc,以便得到客户端的计算机名(testpc.LocalHostName):
  testpc=createobject(“MSwinsock.Winsock”)
  或者用testpc.LocalIP获得客户端IP。然后访问服务器的抽题表,用计算机名或IP地址对应查询本场考试的考题编号,并下载考题到本机。
  
  4 结语
  
  文中涉及的原理与方法已在机试系统的实际开发中得以应用,并获得了良好收效。但不同学科有不同的教学特点和特定的评价机制,本文只是重点论述比较通行的技术和方法。此类系统还可进一步优化。最好能将软件环境内嵌到考试系统中,由系统直接控制软件操作,并根据操作直接评分。当然,这需要软件厂商的技术支持才能实现。
  
  参考文献
  
  [1]姜山. HOOK专题[DB/OL]. http://www.省略/china/community/program/originalarticles/techdoc/hook.mspx.
  [2]方世昌.离散数学[M]. 陕西:西安电子科技大学出版社,1996.

相关热词搜索:标准化 拓展 开发 标准化机试系统的开发与拓展 素质拓展系统定制开发 山东大学素质拓展系统

版权所有 蒲公英文摘 www.zhaoqt.net