JAVA考试多选题判断得分


前言

躲得多初一,躲不过十五。大家好,我是程序员十五, 最近呢,在做一个考试系统。用于客户内部培训使用,可是甲方爸爸不满足于人工审核批改,提出一个自动批改的功能。
单选题和判断题相对比较简单,判断两个字符串相等即可,简答题人工进行批改。由于多选题相对单选题而言比较复杂,需要判断多选,漏选的情况以及根据不同答案计算出一个分值,所以成为了一个难啃的骨头。回顾学渣生涯对于多选题答案的顺手拈来(抓阄),以及了如指掌(经常与正确答案擦肩而过,答案千奇百怪)。在领导给予厚望的眼神中,这等重任当仁不让的落到的我头上。让我感动到痛哭流涕,多年来的付出重要有了回报,领导终于发现了我的价值,有感而发的心里默默私语:**,****


一、多选题评分规则

按照以往考试的多选题规则可分为以下几种情况:

  1. 答案为空,或者有一个错误选项, 即为错误, 标识为0;
  2. 少选(漏选)答案全部正确为半对,给一半分, 标识为 2;
  3. 全选且全部正确 为全对, 给满分, 标识为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);
    }

总结

以上就是对多选题进行自动批改计算得分的代码示例了,本文的难点在于多选题的情况复杂,要考虑少选,多选,重复选,空选以及全选正确等情况。只有把所有可能出现的问题都考虑到,代码才能愈加完善。请各位大佬们批评指正,你的每一个批评和点赞都会成为我前进的动力。
  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值