0

我这里有点麻烦。我正在制作一个数学程序,询问用户在数学问题中使用的位数。然后它会询问数学问题的类型,并询问用户 10 个问题。它会检查答案是否正确并显示适当的消息。如果错误,用户可以永远重试该问题。然后它会计算他们的得分是否超过 75% 并显示一条消息。

所有的弹出窗口都可以正常工作,但无论出于何种原因,它一直告诉我无论我输入什么答案都是错误的。我试图确保所有变量类型都匹配(双打),这样响应就不会有任何转换问题,但我是 Java 新手,所以我不知道我是否正确地做到了。

你们有没有机会发现我的代码的问题?任何帮助是极大的赞赏。感谢观看。

还要感谢那些已经在这个项目中帮助我解决其他问题的人,我仍在学习 Java!

import java.util.*;
import javax.swing.JOptionPane;
/**
 *
 */

/**
 * @author Tyler
 *
 */
public class Program {

        /**
         * @param args
         */
        public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
                int difficulty = 1;
                String[] operators = {"plus", "minus", "times", "divided by"};
                int selectedOperator = 1;
                int correctAnswers = 0;
                int answeredTyped = 0;

                int difficultyInput = Integer.parseInt(JOptionPane.showInputDialog("Please choose the difficulty. Enter the number of digits to use in each problem."));

if (difficultyInput > 0) {
        difficulty = difficultyInput;
}
int arithmeticMethod = Integer.parseInt(JOptionPane.showInputDialog("Choose an arithmetic problem to study: 1 = Addition Only, 2 = Subtraction Only, 3 = Multiplication Only, 4 = Division Only, 5 = Random Problems" ));

        selectedOperator = arithmeticMethod;

        new Program().askQuestion(difficulty, null, arithmeticMethod, arithmeticMethod, operators, arithmeticMethod); }





        public static boolean checkResponse (double primaryInt, double secondaryInt, String operatorText, double response){
              if (operatorText.equals("1")){
                  return (primaryInt + secondaryInt) == response;
              }
              else if (operatorText.equals("2")){
                  return (primaryInt - secondaryInt) == response;
              }
              else if (operatorText.equals("3")){
                  return (primaryInt * secondaryInt) == response;
              }
              else if (operatorText.equals("4")){
                  return (primaryInt / secondaryInt) == response;
              }
              return false;
        }




        public static String displayResponse (boolean isCorrect){
        int randomIndex = (int) (Math.floor(Math.random() * (4 - 1 + 1)) + 1);
        switch (randomIndex){
        case 1:
                return isCorrect ? "Very Good!" : "No. Please try again.";
        case 2:
                return isCorrect ? "Excellent!" : "Wrong. Try once more.";
        case 3:
                return isCorrect ? "Nice Work!" : "Don\'t give up!";
        case 4:
                return isCorrect ? "Keep up the good work!" : "No. Keep trying.";
        }
        return "Oops...";
}




        public static void askQuestion(int difficulty, String operatorText, int selectedOperator, int answeredTyped, String[] operators, int correctAnswers){
                boolean correctAnswer = false;
                double primaryInt = Math.floor(Math.pow(10,  difficulty-1) + Math.random() * 9 * Math.pow(10,  difficulty-1));
                double secondaryInt = Math.floor(Math.pow(10,  difficulty-1) + Math.random() * 9 * Math.pow(10, difficulty-1));
                operatorText = (selectedOperator == 5) ? operators[(int) Math.floor(Math.random() * operators.length)] : operators[selectedOperator - 1];

                while(!correctAnswer && answeredTyped < 10) {
                        double response = Double.parseDouble (JOptionPane.showInputDialog("How much is " + primaryInt + " " + operatorText + " " + secondaryInt + "?"));
                        correctAnswer = checkResponse (primaryInt, secondaryInt, operatorText, response);
                        JOptionPane.showMessageDialog(null, displayResponse(correctAnswer));

                        answeredTyped++;

                        if(correctAnswer)
                                correctAnswers++;
                }

        {

        while(answeredTyped < 10){
                askQuestion(0, null, 0, 0, null, 0);

        }

        if((correctAnswers / answeredTyped) >= 0.75) {
                JOptionPane.showMessageDialog(null, "Congratulations, you are ready to go on to the next level!");
        }
        else{
                        JOptionPane.showMessageDialog(null, "Please ask your teacher for extra help.");
        }
}
}
}
4

5 回答 5

3

你正在做integer除法,结果是一个integer,而不是一个floatdouble值。例如:

int a = 5;
int b = 2;
System.out.println(a / b); // will print 2
System.out.println((double)a / b); // will print 2.5
于 2013-09-28T23:01:52.897 回答
2

当 checkResponse 找不到运算符时,您是否尝试过抛出异常?我不明白为什么无效的操作员输入应该与错误的问题具有相同的结果。

如果你有这个,我希望你会看到该函数中的所有 if 语句都没有解析为 true……你为什么要与“1”、“2”、“3”和“4”进行比较,当这不是您定义操作员文本的方式时?

于 2013-09-28T23:36:19.840 回答
2

我通过 eclipse 调试器运行了你的程序,问题出在 checkResponse 方法中。operatorText 字符串是从您的数组 {"plus", "minus", "times", "divided by"} 中填充的,但是您正在检查 operatorText.equals("1") 等。这意味着您的检查响应方法都没有实际上一直在运行,并且该方法总是会返回 false ,这解释了您正在经历的行为。将其更改为 operatorText.equals("plus") ,你应该很高兴。

提示:使用像 Eclipse 这样的 IDE 并设置一些断点可以很容易地解决这类问题。

于 2013-09-28T23:42:51.877 回答
0
if(((float)correctAnswers / answeredTyped) >= 0.75)
于 2013-09-28T23:02:28.853 回答
0

我将此代码放入 Eclipse 中,它向我抛出了 8 个红旗和 5 个黄旗。大多数危险信号与“数学”未定义的“pow”和“随机”方法有关。你能试着调用一些你实际上没有写过的东西吗?

        double primaryInt = Math.floor(Math.pow(10, difficulty - 1)
            + Math.random() * 9 * Math.pow(10, difficulty - 1));
    double secondaryInt = Math.floor(Math.pow(10, difficulty - 1)
            + Math.random() * 9 * Math.pow(10, difficulty - 1));
    operatorText = (selectedOperator == 5) ? operators[(int) Math
            .floor(Math.random() * operators.length)]
            : operators[selectedOperator - 1];

如果您实际上是在尝试调用 java Math 方法,则可以通过将您的类名更改为标准“Math”以外的名称来解决此问题。

于 2013-09-28T23:08:00.027 回答