结帐的Java练习

时间:2011-02-19 22:35:11

标签: java

我最近正在尝试一些Java并寻找一些我的风格评论。如果你想看一下放在图像中的这个练习,告诉我我的风格是否很好?或者它可能不是很好,所以你可以告诉我我应该在哪些方面工作,所以你可以帮助我改进它吗?

exercise for my question

/*
 * File: MathQuiz.java
 * 
 * This program produces Math Quiz. 
 */
import acm.program.*;
import acm.util.*;

public class MathQuiz extends ConsoleProgram {

    /* Class constants for Quiz settings. */
    private static final int CHANCES = 3;
    private static final int QUESTIONS = 5;
    private static final int MIN = 0;
    private static final int MAX = 20;

    /* Start program. Number of questions to ask is assigned here. */
    public void run() {
        println("Welcome to Math Quiz");
        while(answered != QUESTIONS) {
            produceNumbers();
            askForAnswer();
        }
        println("End of program.");
    }

    /* Ask for answer, and check them. Number of chances includes
     * first one, where user is asked for reply. */
    private void askForAnswer() {
        int answer = -1;
        if(type)
            answer = readInt("What is " + x + "+" + y + "?");
        else
            answer = readInt("What is " + x + "-" + y + "?");
        for(int i = 1; i < CHANCES+1; i++) {
            if(answer != solution) {
                if(i == CHANCES) {
                    println("No. The answer is " + solution + ".");
                    break;
                }
                answer = readInt("That's incorrect - try a different answer: ");
            } else {
                println("That's the answer!");
                break;
            }
        }
        answered++;
    }

    /* Produces type and two numbers until they qualify. */
    private void produceNumbers() {
        produceType();
        produceFirst();
        produceSecond();
        if(type)
            while(x+y >= MAX) {
                produceFirst();
                produceSecond();
            }
        else
            while(x-y <= MIN) {
                produceFirst();
                produceSecond();
            }
         calculateSolution();
    }

    /* Calculates equation solution. */
    private void calculateSolution() {
        if(type) solution = x + y;
        else solution = x - y;
    }

    /* Type of the equation. True is from plus, false is for minus. */
    private void produceType() {
        type = rgen.nextBoolean();
    }

    /* Produces first number. */
    private void produceFirst() {
        x = rgen.nextInt(0, 20);
    }

    /* Produces second number. */
    private void produceSecond() {
        y = rgen.nextInt(0, 20);
    }

    /* Class variables for numbers and type of the equation. */
    private static boolean type;
    private static int x;
    private static int y;

    /* Class variables for equation solution. */
    private static int solution;

    /* Class variable counting number of answered equations,
     * so if it reaches number of provided questions, it ends */
    private static int answered = 0;

    /* Random generator constructor. */
    RandomGenerator rgen = new RandomGenerator();

}

5 个答案:

答案 0 :(得分:2)

我注意到的一件事是你的所有方法都没有参数并返回void。

我认为如果您使用方法参数并返回值来显示程序中的数据流而不是使用对象的状态来存储所有内容,那就更清楚了。

答案 1 :(得分:1)

看起来非常干净的程序风格。我会将所有变量移到顶部而不是在底部有一些变量,但除此之外它是非常易读的。

答案 2 :(得分:1)

这是我要改进的东西:布尔type,用于表示我们是否有加法或减法:

private void produceType() {
    type = rgen.nextBoolean();
}

produceType告诉我,生成了一些东西,我希望能够返回一些东西。我会定义枚举来表示测验的类型。这是我的建议:

private QuizType produceType() {
   boolean type = rgen.nextBoolean();
   if (type == true)
      return QuizType.PLUS;
   else 
      return QuizType.MINUS;
}

枚举的定义如下:

public enum QuizType { PLUS, MINUS }

答案 3 :(得分:1)

你应该做一些不同的事情,而且你可以采取不同的方式。

你应该做的事情不同:

  1. 将所有字段保持在一起。
  2. 静态字段应始终位于THIS_FORM
  3. 你已经使用了静态修饰符,看起来像实例字段。 (类型,x,y,解决方案,已回答)。这意味着每个JVM一次只能运行一个MathsQuiz。在这种情况下没什么大不了的,但会给更复杂的程序带来问题。
  4. produceFirstproduceSecond使用硬编码参数nextInt而不是使用课程提供的MAXMIN
  5. answered显然不需要成为一个字段。它可以很容易地成为run中的局部变量。
  6. 你应该做的事情不同:

    • produceNumbers可能不会结束的可能性很小(不过很小)。而不是产生两个随机数,并希望它们工作。产生一个随机数,然后约束第二个,以便始终形成解。例如。说我们正在做和添加,x是6,最大值是20.我们知道y不能大于14.所以不要尝试nextInt(0,20),你可以做nextInt(0,14)并确信你会得到一个可行的问题。
    • for循环并不是askForAnswer的正确构造,因为所需的行为是要求答案CHANCES次数或直到收到正确的答案,以先到者为准。当您希望执行一定次数的操作时,通常会使用for循环。实际上,run循环中的while循环是for循环的一个很好的候选者。 while循环示例可能如下所示:

      int i = 1;
      boolean correct = (solution == readInt("What is " + x + "+" + y + "?"));
      while (i < CHANCES && !correct) {
          correct = (solution == readInt("Wrong, try again."));
          i++;
      }
      if (correct) {
          println("Well done!");
      } else {
          println("Nope, the answer is: "+solution);
      }
      

答案 4 :(得分:0)

几乎不错,我只有一些改进:

  1. 变量移至顶部

  2. 内部产品编号和你重复的时候。我建议重构这个

  3. 小建议:代码应该像书籍一样 - 易于阅读 - 在run()方法中首先调用produceNumber然后询问ForAnswer。因此,如果在您的代码中定义中的顺序相同,那么将更好,因此在produceNumber之前执行askForAnswer。但没有必要

  4. 注意小方法。一个方法应该没什么可做的 - 我认为askForAnswer你可以分成两种方法