评分测验的正确方法

时间:2015-06-05 19:56:55

标签: c# asp.net oop

我有一个应用程序,在3周的时间内一次一个地呈现3个不同的测验。它被用作内部员工竞赛,旨在提供有关客户产品之一的知识。我使用.NET aspx页面对前端进行了编码,并显示了测验。然后我有一个类文件,用于评估测验。我坚持的是在课堂上存储答案的正确方法。显然答案是静态的而不是变化的。每个测验有5个问题。

我想到的一种方法是在类中声明一些对测验进行评分的变量,每个测验每个答案一个,然后传入已经采用的测验,并使用这些变量的内容对测验进行评分。这不是非常面向对象的。那么,如果没有过于复杂的事情,为每个有答案的测验创建一个类会更好吗然后我可以创建该类的实例并只读入Class.Answer1等?一个粗略的例子是:

public class QuizOne {
   public property answer1 = "A";
   public property answer2 = "B";
   public property answer3 = "B";
   public property answer4 = "C";
   public property answer5 = "E";
}

每个测验我可以有一个这样的课程。然后我可以在评分类中找到一些代码来查找要实例化的类,然后一旦实例化我可以做:

if(quiz.answer1 == answered1){
// do something for the correct answer 
} else {
// do something for the incorrect answer
}

想法或建议?

3 个答案:

答案 0 :(得分:2)

这是一个广泛的问题,所以这个答案有点宽泛,但听起来你可以在这里找到一些正确的对象设计。

首先,我会将Quiz一般(在C#中)声明为一个类。以下内容:

public class Quiz
{
    public Guid Id { get; set; }
    public List<Question> Questions { get; set; }
}

然后,我会声明一个Question类:

public class Question
{
    public string Title { get; set; }
    public List<Answer> Answers { get; set; }
}

最后,声明一个Answer类:

public class Answer
{
    public string Text { get; set; }
    public int Points { get; set; }
}

应该很清楚从哪里开始。 Points > 0会显示正确答案,错误答案会显示Points = 0

然后,您可以在将来扩展它以用于其他事情。

您可以通过多种方式将其保存到数据库中。最简单的是一个两列Quiz表,一列用于Id (uniqueidentifier),另一列用于Questions (nvarchar(max))。您可以使用内置的System.Web.Script.Serialization.JavaScriptSerializer(或System.Xml.Serialization.XmlSerializer)将其发送到数据库。

然后根据正确性奖励Points。 (我偶尔会将它用于项目,因为我的QuizesTests部分有多个正确的答案,其中一些比其他答案更正确。这意味着如果答案B和C都是技术上正确,答案D是B and C,然后答案D会获得更多积分,依此类推。)你也不必担心A/B/C/D/E此处,技术,这是显示问题

另外,请注意:这是一个非常基本的表示我通常如何解决问题,但它绝对应该让你开始。

此外,这更适合StackExchange网站programmers

Why?

  

如果您对...有疑问

     
      
  • 软件要求
  •   
  • 软件架构和设计
  •   
  • 算法和数据结构概念
  •   
     

...

     

...然后你就到了正确的地方提出你的问题!

答案 1 :(得分:1)

EBrown有一个高质量的答案,当然更正确,并将支持加权问题值。如果您在一家大公司,并提供公司范围的培训,这是一个更好的解决方案。这听起来不像是发生在我身上的事情(而且我可能会弄错)所以我想我会抛弃另一个快速而又脏的选项:

class Question{
    public string QuestionText {get; set;}
    public ICollection<string> AnswerChoices {get; set;}
    public string CorrectAnswer {get; set;}
    public string AnswerProvided {get;set;}
}

public decimal GradeQuiz(ICollection<Question> questions){

    if(questions.Count == 0){
        throw new InvalidOperationException("Cannot grade a quiz with no questions");
    }

    var correct = questions.Count(x => x.AnswerProvided == x.CorrectAnswer);
    var total = questions.Count;
    return (decimal)correct * 100 / total;
}

答案 2 :(得分:0)

我会在QuestionAndAnswers课程中封装问题,可能的答案和正确的答案。类似的东西:

public class QuestionAndAnswers
{
   private readonly Dictionary<int, string> _answers;

   public string Question { get; set; }

   public Dictionary<int, string> Answers { get { return _answers; } }

   public int CorrectAnswer { get; set; }

   // Perhaps add a grade/points enumeration and a property to use it here,
   // if some questions are worth more than others

   public QuestionAndAnswers()
   {
      // You would probably want to provide arguments to the constructor
      // and make the class immutable
      _answers = new Dictionary<int, string> ();
   }
}

...其中Answers是一个字典,其中包含可能的答案&#39;字符串和每个的标识号(id)。您可以更进一步,列出Answer个对象,但我不确定是否有必要,因为每个答案都不超过一个字符串。

然后我会有一个Quiz类,它会公开Dictionary<int, QuestionAndAnswers>(或IDictionaryint是问题编号。我更喜欢在QuestionAndAnswers课程中使用数字属性,因为该数字实际上是测验的一个特征,而不是问题。