评估多项选择题的编程技巧

问题描述 投票:-1回答:1

我需要设计一个模块(用C ++编写)来评估包含多个选项正确的问题的学生表(带有部分标记);

我的意见是: -

  • 正确的答案:选项的向量(例如'A','C','D');
  • 学生回答:选项向量(例如'A','B','C');

上述问题类型的评估规则如下:

  • 满标记:(+ 4)如果仅标记了与正确选项对应的选项
  • 部分标记:(+ 1)用于标记每个正确的选项,但没有标记错误的选项
  • 无标记:(0)如果没有标记选项
  • 否定标记:( - 2)在所有其他情况下

例如,如果(A),(C)和(D)是问题的正确选项,则标记所有这三个将导致+4标记;仅标记(A)和(D)将产生+2标记;并且标记(A)和(B)将导致-2标记,因为标记了错误的选项。

注意:上述规则可能会在以后更改并变得复杂。

我想到了以下方法: -

  1. 硬编码规则。这不灵活,因为规则可能会改变,例如新的子条款可能是:填写错误的选项会导致部分负面标记等;
  2. 使用正则表达式来获得规则方面的一些灵活性。可以为上述每个子规则构建正则表达式,并且可以执行匹配以找到学生响应中的哪个子规则匹配并相应地分配标记。因此,通过仅更改正则表达式,我们可以更改规则。
  3. 使用策略模式。

如果您认为上述方法存在缺陷或有更好的解决方案,请提供您的建议。

c++ design-patterns pattern-matching interpreter
1个回答
1
投票

使用std::set_symmetric_difference。确保输入的std::vectors都已排序。它将为您提供他们没有共同点的元素。因此,如果结果为空集,则学生答案与正确答案完全相同。否则,检查结果元素是否在答案中。

我会做类似以下的事情(TL; DR:硬编码):

std::vector<char> answer_student, answer_correct, answer_diff;

int mark = -2;

if (answer_student.empty()) {
    mark = 0;
}

std::sort(answer_student.begin(), answer_student.end());
std::sort(answer_correct.begin(), answer_correct.end());

std::set_symmetric_difference(
    answer_student.begin(), answer_student.end(),
    answer_correct.begin(), answer_correct.end(),
    std::back_inserter(answer_diff)
);

if (answer_diff.empty()) {
    mark = 4;
} else {
    // ...
}

免责声明:未经测试。只需看一下它就可以作为一个例子来帮助您入门。

© www.soinside.com 2019 - 2024. All rights reserved.