计算机考试机试评分方法(2) |
|
我讲一下考试评分系统的工作原理:
考试评分系统是不看源程序。而是对你的源程序编译时所产生的.obj文件和.exe文件进行测试。测试分为两部份组成:
一、运行:完成输入、输出。 二、评分:与预期的结果对比。
运行:
1、运行.exe文件(由你的源程序生成的),运行时,它会调用一个读函数,把in.dat文件里的测试数据读入主函数;一般二级有20组数据,三级、四是一大组数据(一篇英文、400个四位数、100个记录等)
2、调用你所编写的函数,把这些数代入。
3、调用写函数,把运行结果写入out.dat文件里。一般二级有20行结果(就是每组数据的运行结果),三级、四级有一大组结果(如一组字符流)或二到三个结果(如求平均值、公差、符合条件的数的个数等)
以上这三个过程二级里是调用NONO函数完成,三级、四级是分别调用ReadDat()和WriteDat()函数来完成。
评分:
运行test.exe文件,把out.dat文件里的内容与评分系统内的内容(预期结果)比较,在二级里,每对一行(就是这组数据的测试结果),给5分。
三级、四级的就要看具体情况给分了,如:字符流处理的,那只要错一个小部分就0分,因为字符流是连续的。如果是数值处理的(有2-3个结果),那就是每对一个结果结20-30分,但错了一个答案就很难及格了,因为数值处理很多数是互相关联的,如:求平均值,如果符合条件的数的个数错了,那平均值也一定是错的。还有那个100个记录的,那它是以那一行上的内容是不是与预期的一样,每对一行给1分。(因为这个测试数据刚好一百行),这就是三级或四级里有:0<成绩<100 分的原故。(很多人都说三级四级上机成绩不是0分就是一百分,这个观点是错的)
以上文件名、函数名应以源程序调用时的名为准。
由上述可知:一个题如果通过编译、能运行就一定有分,那是错的,因为一个题,如果你一点都不做(放空),那是一定能通过编译和运行的。但这时,out.dat文件为空,如果你编写了程序,而运行的结果都是错的,那和空是一样的。这样是不能得分的。
还有是有人说我做了题,通过了编译,也出了“正确”结果,那为什么会不及格呢?是不是考试系统有问题,这个可能很小,一般是因为你的程序有问题,如以前考网上有一个题:
求一子字符串在主字符串出现的次数; 例如:子串:go 主串:good yjgocel liugo ygoygong 结果为: 5
以下是两个人的回复:
一、int fun(char *str,char *s) { int m=0; char *p=s; while(*str!='\0') { if(*str==*p) { str++; p++; } /*两字符相同就同时移动指针。*/ else {p=s; str++ ; /*不同只移动一个指针,并把另一指针指向初始位置 */ } if(*p=='\0') /*如果是连续的同时移动到了后一个字符串尾,就计一次数 */ { m++; p=s ; } } return m; }
二、int fun(char *str,char *s) { int i,j,m=0; for(i=0;i<strlen(str);) { for(j=0;j<strlen(s);) if(str[i]==s[j]) { i++; j++; } else { i++; break; } if(j==strlen(s)) m++; } return m; }
其实这两个答案,对于上面的那个主串和子串也许是可以的,但,如果主串是aaa aa,子串是aa,那上面这两个程序就不行了,因为,aa在aaa aa里出现了3次,而不是2次,字符串是可以嵌套出现的,而测试数据里的数据一般什么情况都有,而象这种嵌套的多,这就是他认为自已程序是对的,而结果是不及格的原故。
以上两位如果是考生的话,他们肯定会说他们的程序是绝对对的,是评分系统问题。
正确的应这样写:
fun(char *str,char *s) {char str1[10]=""; int i,k=0; for(;*str;str++) {for(i=0;i<strlen(s);i++) str1[i]=*(str+i); if(!strcmp(str1,s)) k++; } return k; }
下面我再讲一个测试上述程序的实例: 主串为:ababcabcacbab。子串为abc或ab。有兴趣的考生可以上机试一下看对不对。 |
|
|
|
|
|