二级c语言考试系统评分原理的探究
——Elite技术联盟原创
二级考试分三部分,填空、改错与编程,其中编程占40分。从考题的答案本身来看,填空和改错的答案是基本固定的,验证答案时考试系统可以通过与
标准答案比对来判断。而编程题却是不确定的,C语言是相当零活的,实现同样的算法可以有多种语言描述方法,这样就将导致同一个题目产生成千上万种答案,
这样考试系统如果通过直接与标准答案比对的方法验证是不可能实现的。
通过研究考试系统产生的代码,便可窥豹一斑。考试系统通过加入一段附加的代码,这段代码按照题意验证程序的正确性,然后生成一个文件
(out.dat),对于同一个题目,所生成的文件是唯一的,因此考试系统通过验证这个文件的是否与标准文件相同便可判断所编写代码是否正确。
根据这种原理,通过读题目中的附加代码,如果直接在相应的位置建一个文件out.dat,而且其输出内容与系统标准文件内容相同,这样,就可以不用做题
而直接得到编程题的40分。
例如:
有以下题目
3. 编程题
学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun(),它的功能是:函数返回指定成绩的学生数据,指定的
成绩在主函数中输入。若没找到指定的成绩,在结构体变量中给学号置空串,给成绩置-1,作为函数值返回。
注意:部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include<stdio.h>
#include<stdlib.h>
#define N 16
typedef struct
{ char num[10];
int s;
}STREC;
STREC fun(STREC *a, int b)
{
}
void main()
{
STREC s[N]={{ "GA005",76},{"GA003",89},{"GA002",64},{"GA004",75},
{"GA001",88},{"GA007",65},{"GA008",96},{"GA006",69},
{"GA015",85},{"GA013",78},{"GA012",62},{"GA014",60},
{"GA011",73},{"GA017",72},{"GA018",98},{"GA016",94}};
STREC h;
int m;
int i;
printf("The original data:\n");
for(i=0;i<N;i++)
{ if(i%4==0)
printf("\n"); /*每行输出4个学生记录*/
printf("%s %3d ",s[i].num,s[i].s);
}
printf("\n\nEnter the score: ");
scanf("%d",&m);
h=fun(s,m);
printf("The data: ");
printf("\n%s %4d\n",h.num,h.s);
printf("\n");
在题目中每段代码都正常,没有发现附加代码,但当你打开VC++6.0真正做的时候,你会发现它给你的代码会有些不同,比如本题,除了题目本身的代码,
在程序尾部还有以下附加代码:
h=fun(s,62);
/******************************/
wf=fopen("out.dat","w");
fprintf(wf, "%s %4d\n",h.num,h.s);
fclose(wf);
/*****************************/
很容易看出来,附加代码是通过验证成绩为62的数据,然后以"%s %4d\n"形式写入out.dat文件,如果你写的fun函数正确,这段代码就会
执行,在程序所在文件夹下就会生成一个正确的out.dat文件,评分程序通过读取这个文件来判断你的答案是否正确。
接下来该知道怎么做了吧。
参与讨论此技术,请登录Elite技术联盟论坛。
http://groups.google.com/group/auto-elite