3 关键技术编码设计
系统在编码实现中,重点要解决好随机抽题、HTML试卷生成与评判、HTML页面自动填充、系统完整性校验等关键技术。
3.1 随机抽题实现
“专业技术理论考试系统”数据库内有数千道试题,而每次考试,试题数目一般在80——100道之间,组织试卷时,就需要从试题数据库内随机的抽取要求类型、要求数目的数据记录。为此,作者设计了如下的随机数产生函数,实现所要抽取记录编号的生成。
//在randRange范围内产生randNum个不重复的随机数
//randRange : 随机数生成范围
//randNum : 要生成的随机数个数
//randArray : 返回生成的随机数数列
void MakeRands(int randRange,int randNum,int* randArray)
{
if(randRange < randNum) return;
int* numArray = new int[randRange];
for(int i=0;i<randRange;i++)
numArray[i] = i;
int curRange = randRange;
for(int i=0;i<randNum;i++)
{
int anum = RandomRange(0,curRange);
int tem = numArray[anum];
numArray[anum] = numArray[curRange-1];
numArray[curRange-1] = tem;
curRange = curRange-1;
}
int index = 0;
for(int i = randRange-1;i > randRange-1-randNum;i--)
{
randArray[index] = numArray[i];
index++;
}
delete []numArray;
return;
}
在产生试卷的过程中,依次读取randArray[]数组中元素相对应的数据记录,从而快速实现试卷试题的读取。
3.2 HTML试卷生成
系统设计生成的HTML试卷如下所示。
专业技术理论考试(专业1)
单位:部门1 姓名:fsd 卷面总分:100 答题时长:45分钟
一、填空题(共 40 题,每题 1 分,共 40 分)
1、重点防火单位和防火场所,应当制定 ,明确消防应急分队,定期组织有针对性的 。
其HTML编码如下:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>temp</title>
<style type="text/css">
<!--
.STYLE1 {font-size: 24px;
font-family: "宋体";
font-weight: bold;}
.STYLE2 {font-size: 36px;
font-family: "宋体";
font-weight: bold;}
-->
</style>
<style type="text/css">
<!--
body {
background-color: #CCFFFF;
}
-->
</style>
</head>
<body>
<p align="center" class="STYLE2">专业技术理论考试(专业1)</p>
<p align="center"><strong>单位:</strong>部门1<strong> 姓名:</strong>fsd<strong> 卷面总分:</strong>100<strong> 答题时长</strong>:45分钟</p>
<p align="left" class="STYLE1">一、共同科目(共 40 题,每题 1 分,共 40 分)</p>
<span style='mso-tab-count:1'> <a name="Question_1_1"></span>
<strong>1、重点防火单位和防火场所,应当制定
<span style="mso-tab-count:1"><input type="text" size="8" ID="100101" /></span>
,明确消防应急分队,定期组织有针对性的
<span style="mso-tab-count:1"><input type="text" size="8" ID="100102" /></span>。<p></p>
将从数据库中抽出的试题按HTML编码格式输出到一TstringList对象,HTML试卷数据就准备好了。这里特别要注意的是每个HTML对象(试卷中要求用户输入的部分)要进行唯一标识,以便在评卷和表单填充时可以访问到每个对象。这里采用唯一的ID值进行区分。ID命名的规则为:ID值=(大题序号+1)*100000 + (小题序号+1)*100 + (对象序号+1)。
|