2016-07-06 1 views
-1

Je dois concevoir un module (en C++) pour l'évaluation de feuilles d'étudiant contenant des questions avec plus d'une option correcte (avec un marquage partiel);Techniques de programmation pour l'évaluation de questions à choix multiples

Mes entrées sont: -

  • Réponse correcte: vecteur d'options (par exemple 'A', 'C', 'D');
  • Réponse de l'élève: vecteur d'options (par exemple 'A', 'B', 'C');

Les règles d'évaluation des types de questions ci-dessus sont les suivantes: -

  • pleine Marques: (4) Si seules les options correspondant à corriger les options sont marquées
  • Mark partielle: (+1) pour marquer chaque option correcte à condition qu'il n'y a pas d'options incorrectes marquées
  • No Marks: (0) Si aucune option marquée
  • marques négatives: (-2) Dans tous les autres cas

Par exemple, si (A), (C) et (D) sont les options correctes pour une question, marquer ces trois résultats entraînera +4 points; marquer seulement (A) et (D) donnera +2 points; et le marquage (A) et (B) donnera -2 marques, car une mauvaise option est également marquée.

REMARQUE: Les règles ci-dessus peuvent changer plus tard et se compliquer également.

J'ai pensé approches suivantes: -

  1. coder en dur les règles. Ce n'est pas flexible car les règles peuvent changer, par ex. une nouvelle sous-clause pourrait être: une option incorrecte remplie donne une note négative partielle, etc .; Utilisation de regex pour obtenir une certaine flexibilité en ce qui concerne les règles.
  2. Une regex peut être construite pour chacune des sous-règles ci-dessus et l'appariement peut être effectué pour trouver laquelle des sous-règles la réponse de l'étudiant correspond à et attribuer des marques en conséquence. Ainsi, en changeant seulement la regex, nous pouvons changer la règle.
  3. Utilisation du modèle de stratégie.

Veuillez fournir vos suggestions si vous pensez qu'il y a des failles dans les approches ci-dessus ou qu'il existe de meilleures solutions.

+0

Vous dites que vos entrées sont des chaînes, mais vous parlez d'options. D'où viennent les options, et comment les déterminez-vous comme 'correctes'? – bzeaman

+0

Salut @bzeaman J'ai mis à jour l'énoncé du problème. Et, l'exactitude de la réponse sera décidée à partir des règles ci-dessus, comme expliqué dans l'exemple. –

Répondre

1

Utilisez std::set_symmetric_difference. Assurez-vous que les deux entrées std::vector sont triées. Il vous donnera les éléments qu'ils n'ont pas en commun. Donc, si le résultat est un ensemble vide, la réponse de l'étudiant est exactement la même que la bonne réponse. Sinon, vérifiez si les éléments résultants sont dans la réponse ou non.

je ferais quelque chose comme ce qui suit (TL; DR: codé en dur):

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 { 
    // ... 
} 

Avertissement: non testé. Regardez-le et utilisez-le comme un exemple pour vous aider à démarrer.