2012-02-01 120 views
0

一旦问题得到解答,我会询问用户10个选择题。我想根据他们的答案显示结果。我想知道是否有更好的方法来确定他们的分数,然后做很多if语句?有没有更好的实现方法?

Int result = 100; 
if (answer1 == 10) { 
    result = result +10; 

    if (answer2 ==20) { 
    result = result -5; 

    if (answer3 == 50) { 
     result = result +20; 
    } 
    else if (answer3 == 10) 

    ... 

,它会继续...

+0

什么是逻辑?你什么时候增加多少结果? – amit 2012-02-01 01:02:19

+0

正确缩进代码并正确使用大括号 – 2012-02-01 01:02:59

+1

至少,您应该更好地设置您的代码的格式。 – 2012-02-01 01:03:11

回答

3

编辑:哦,等一下,我看到它的嵌套。你仍然可以去查找解决方案。代替Map<String, Integer>,您可以使用类似Map<Map<String,Boolean>, Integer>的地方,其中Integer是最终得分。


这是一个常见的方式做到这一点:

Map<String, Integer> choice_delta = // new Map 

// Define choice delta pairing 
choice_delta.put("answer5", -5); 
choice_delta.put("answer6", 20); 
// etc. etc. 

int calculate(String[] answers){ 
    int result = 0; 
    for (String answer : answers){ 
     int delta = choice_delta.get(answer); 
     result += delta; 
    } 
    return result; 
} 
+0

这是它应该完成的方式。这个表驱动的方法会比if语句给你更多的灵活性;例如,您可以将表初始化外部化,以使您的应用程序可配置。实现此目的的另一种方法是创建“问题”和“答案”等类。 – Alvin 2012-02-01 01:15:50

+0

谢谢你,我修改了你提交给我的方法。 – sw2020 2012-02-02 19:56:58

0

一般来说,如果一个超越也许4-5类,我会发明一些排序表驱动的方法。准确地说,取决于细节(和我的心情),但Enno's是一个很好的概念,也是典型的概念。

3

如果您正确建模,实施起来会更容易。我不确定你的问题背景,但在这里做出的一些假设是我想出的。

叙事

Quiz一个是一组Question的。每个问题都有一个或多个Answer,每个答案都携带一定的weight。您为某个特定场景(Java,c#)提供的Quiz并逐一呈现给用户。用户selects提供的问题的答案,然后您向他展示currentScore和下一个问题。在提出所有问题后,计算finalScore

抽象

  • 测验(准备,currentScore(),finalScore())
  • 问题(scoreFor)
  • 解答(weightedScore)

实施

public class Quiz 
{ 
    List<Question> questions  = new ArrayList<Question>(); 
    List<String> selectedAnswers = new ArrayList<String>(); 
    private int  currentScore; 

    public void prepare() 
    { 
     questions.add(new Question("What comes after A?", Arrays.asList(new Answer("B", 10), new Answer("Z", 5)))); 
     questions.add(new Question("What comes after B?", Arrays.asList(new Answer("A", -5), new Answer("C", 10)))); 
    } 

    public int finalScore() 
    { 
     int result = 0; 
     for (int i = 0; i < questions.size(); i++) 
     { 
      result = result + questions.get(i).scoreFor(selectedAnswers.get(i)); 
     } 
     return result; 
    } 

    public void setSelectedAnswerFor(int questionIndex, String selectedAnswer) 
    { 
     assert questionIndex < questions.size(); 
     selectedAnswers.add(questionIndex, selectedAnswer); 
     currentScore = currentScore + questions.get(questionIndex).scoreFor(selectedAnswer); 
    } 

    public int currentScore() 
    { 
     return currentScore; 
    } 

    public static void main(String args[]) 
    { 
     Quiz quiz = new Quiz(); 
     quiz.prepare(); 
     quiz.setSelectedAnswerFor(0, "B"); 
     System.out.println("Current Score " + quiz.currentScore()); 
    quiz.setSelectedAnswerFor(1, "A"); 
    System.out.println("Current Score " + quiz.currentScore()); 
    System.out.println("Final Score " + quiz.finalScore()); 
    } 
} 

public class Question 
{ 
    private final String    text; 
    private final Map<String, Integer> weightedAnswers; 

    public Question(String text, List<Answer> possibleAnswers) 
    { 
     this.text = text; 
     this.weightedAnswers = new HashMap<String, Integer>(possibleAnswers.size()); 
     for (Answer ans : possibleAnswers) 
     { 
      weightedAnswers.put(ans.text, ans.score); 
     } 
    } 

    public int scoreFor(String selectAnswer) 
    { 
     return weightedAnswers.get(selectAnswer); 
    } 

    public String getText() 
    { 
     return text; 
    } 
} 

public class Answer 
{ 
    final String text; 

    final int  score; 

    public Answer(String text, int score) 
    { 
     this.text = text; 
     this.score = score; 
    } 

} 

输出

Current Score 10 
Current Score 5 
Final Score 5 

即溶液可增强但问题是,以表示的业务概念(ubiquitous language),将溶液自然来方面的解决方案。 #

相关问题