前言
躲得多初一,躲不过十五。大家好,我是程序员十五, 最近呢,在做一个考试系统。用于客户内部培训使用,可是甲方爸爸不满足于人工审核批改,提出一个自动批改的功能。
单选题和判断题相对比较简单,判断两个字符串相等即可,简答题人工进行批改。由于多选题相对单选题而言比较复杂,需要判断多选,漏选的情况以及根据不同答案计算出一个分值,所以成为了一个难啃的骨头。回顾学渣生涯对于多选题答案的顺手拈来(抓阄),以及了如指掌(经常与正确答案擦肩而过,答案千奇百怪)。在领导给予厚望的眼神中,这等重任当仁不让的落到的我头上。让我感动到痛哭流涕,多年来的付出重要有了回报,领导终于发现了我的价值,有感而发的心里默默私语:**,****
;
一、多选题评分规则
按照以往考试的多选题规则可分为以下几种情况:
- 答案为空,或者有一个错误选项, 即为错误, 标识为0;
- 少选(漏选)答案全部正确为半对,给一半分, 标识为 2;
- 全选且全部正确 为全对, 给满分, 标识为1;
计算规则制定好之后,我们在代码中实现它,注: 学生的选项要用Set去重,防止出现重复选项单却判断全对的情况。
代码如下(示例):
/**
* 判断多选题
* 0:错误; 1: 全对; 2: 半对
*
* @param answerSet 正确答案
* @param stuSet 学生选择的选项集合
* @return
*/
private static int containsOnly(Set<String> answerSet, Set<String> stuSet) {
// 初始化答对的选项数量
int count = 0;
// 如果选项为空, 则返回0
if (0 == stuSet.size()) {
return 0;
}
//遍历选项
for (String str: stuSet) {
// 判断答案中是否包含该选项,如果不包含表示选项错误, 返回0
if (!answerSet.contains(str)) {
return 0;
}
// 包含则累计答对的选项数量
count++;
}
// 判断答对的选项数量是否和正确答案的数量一致, 如果一致表示全对, 返回1
if (answerSet.size() == count) {
return 1;
}
// 数量与正确答案不一致且没有错误选项, 返回2
return 2;
}
二、根据对错情况计算分值
对错情况分为: 全对,半对, 错误三种情况, 所以我们可以用switch来实现。
代码如下(示例):
/**
* 根据对错返回分值
*
* @param subjectScore subjectScore 题目分值
* @param doRight 对错
* @return
*/
private static double countScore(double subjectScore, int doRight) {
// 分值
double score = 0.0;
// 根据doRight 计算分值
// case 0可以省略,为了演示所以加上了
switch (doRight) {
case 0:
break;
case 1:
score = subjectScore;
break;
case 2:
score = subjectScore / 2;
default:
break;
}
return score;
}
三、测试代码
代码如下(示例):
public static void main(String[] args) {
// 正确答案
Set<String> answerSet = new HashSet<>(Arrays.asList("A", "B", "C"));
// 题目分值
double subjectScore = 5.0;
// 定义学生测试选项数据, 使用Set集合对学生的答案去重
Set<String> stuSet1 = new HashSet(Arrays.asList("A", "B", "D"));
Set<String> stuSet2 = new HashSet(Arrays.asList("A", "B"));
Set<String> stuSet3 = new HashSet(Arrays.asList("A", "B", "C"));
Set<String> stuSet4 = new HashSet(Arrays.asList("A", "B", "C", "D"));
Set<String> stuSet5 = new HashSet(Arrays.asList("A", "A", "B"));
Set<String> stuSet6 = new HashSet();
// 学生1
int stuDoRight1 = containsOnly(answerSet, stuSet1);
double stuScore1 = countScore(subjectScore, stuDoRight1);
// 学生2
int stuDoRight2 = containsOnly(answerSet, stuSet2);
double stuScore2 = countScore(subjectScore, stuDoRight2);
// 学生3
int stuDoRight3 = containsOnly(answerSet, stuSet3);
double stuScore3 = countScore(subjectScore, stuDoRight3);
// 学生4
int stuDoRight4 = containsOnly(answerSet, stuSet4);
double stuScore4 = countScore(subjectScore, stuDoRight4);
// 学生5
int stuDoRight5 = containsOnly(answerSet, stuSet5);
double stuScore5 = countScore(subjectScore, stuDoRight5);
// 学生6
int stuDoRight6 = containsOnly(answerSet, stuSet6);
double stuScore6 = countScore(subjectScore, stuDoRight6);
// 打印得分
System.out.println(stuScore1);
System.out.println(stuScore2);
System.out.println(stuScore3);
System.out.println(stuScore4);
System.out.println(stuScore5);
System.out.println(stuScore6);
}