如何将if语句的输入放回程序

时间:2018-10-03 00:40:15

标签: java

我对编码非常陌生,但是我想知道为什么当我在数学问题中得到错误的答案时,它要求我重试,但是却不允许我再次回答该问题。谢谢。

import java.util.Scanner;
import java.security.SecureRandom;
public class ComputerAssistedInstruction {
public static void main(String args[]) {
int exit = 1;   
System.out.println("LETS DO MATH!!!!!");
while(exit == 1) 
{
    int answer = 0;
    question(answer);
    Scanner sc = new Scanner(System.in);
    System.out.println("Would you like to exit? 1 to stay, 2 to exit.");
        exit = sc.nextInt();
}

if(exit != 1 || exit != 2)
{
    Scanner sc = new Scanner(System.in);
    System.out.println("That is not an acceptable input. Try again.");
    exit = sc.nextInt();
}
if(exit == 2) 
{
    System.out.println("Goodbye");  
}
}
public static void question(long question)
{
    Scanner sc = new Scanner(System.in);
    SecureRandom random = new SecureRandom();
    int number1;
    int number2;
    int input;
    int answertrue;
    number1 = random.nextInt(10);
    number2 = random.nextInt(10);
    answertrue = number1 * number2;
    System.out.printf("%d*%d=", number1,number2);
        input = sc.nextInt();
    if(input == answertrue)
    {
        System.out.println("Goodjob!");
    }
    if(input != answertrue)
    {
        System.out.println("Sorry try again");
        System.out.printf("%d*%d=", number1,number2);
        input = sc.nextInt();

    }
}
}

2 个答案:

答案 0 :(得分:1)

首先,必须将两个if(exit)条件放入while循环内。这样,您就可以对用户提供的输入进行正确的验证检查。

要回答您的问题,您的代码实际上接受用户输入,但仅对答案进行一次检查。错误答案后不会检查。这就是为什么您需要一个while循环的原因:

while(input!=answertrue)
{
    System.out.println("Sorry try again");
    System.out.printf("%d*%d=", number1,number2);
    input = sc.nextInt();
}

答案 1 :(得分:0)

有一些约定可以优化您的代码。我将向您展示一个简单的示例,该示例可以帮助解释while循环逻辑,这样,如果您所说的答案不正确,就可以使问题重复。有一些方法可以优化此代码:

Scanner scan = new Scanner(System.in);//Create the scanner object 
boolean running = true; //Create a boolean "flag" for the while loop. 
int answer = 0; //Initial answer set to 0

while(running) { //program "flag". Should run so long as running == true
        System.out.println("Welcome to the math questions game!");
        int num1 = (int)(Math.random() * 100) + 1; //Create a random number for first num
        int num2 = (int)(Math.random() * 100) + 1; //Create a random number for second num
        int correctAnswer = num1 * num2; //Get the correct answer
        System.out.println("What is " + num1 + " * " + num2); //Display question
        answer = scan.nextInt();  //Scanner will pick up users answer
        if(answer == correctAnswer) { //if the question matches the correct answer, print congrats and continue with the loop.
            System.out.println("Congrats! That is correct");
        }
        else if(answer != correctAnswer) { //If the answer does not match, while the answer is incorrect, continue to prompt the user for the correct answer. 
            while(answer != correctAnswer) {
                System.out.println("Incorrect! Try again.");
                System.out.println("What is " + num1 + " * " + num2);
                answer = scan.nextInt();
            }
        }
        System.out.println("Would you like to play again? Yes to play again, No to exit: ");
        String keepPlaying = scan.next();
        if(keepPlaying.equalsIgnoreCase("No")) {
            running = false;
        }
    }

第一个区别是布尔值“ running”。在编程中,我们称其为标志。如果我们使用此标志作为while循环的控制变量,则该变量为true或false并保持程序运行,只要该变量等于true。无需在while循环中使用1或2来查看用户是否要退出,而是创建一个设置为true的标志,然后如果用户希望稍后退出程序,则将其设置为false,这将带来更多的好处。日期。如您所见,如果用户输入“ No”(表示他们不想继续玩),则将run设置为false,这将使我们脱离循环。第二个问题是您创建了效率低下的多个扫描仪对象。当您打开多个扫描仪对象时,这会减少内存。从示例中可以看到,我们只需要一个Scanner对象即可执行此代码。从理论上讲,我们可以使用多个Scanners,并在使用每个Scanner后关闭close(),这在内存使用方面可能是有效的,但需要编写更多代码。在这样的小程序中,我们只能使用一个Scanner对象,如您在此处看到的。我们将其称为扫描。最后,我们将初始答案设置为0。

我们开始while循环。只要将running设置为true,while(running)将使循环保持运行状态。然后,我们将欢迎用户,然后我们将像您在代码中一样创建随机变量,以使第一个数字相乘,第二个数字相乘。然后,我们为correctAnswer创建一个变量。这是一个关键点...然后,我们提示用户输入答案,但是我们使用的是先前创建的相同扫描仪对象。我们无需再创建一个。如果答案和correctAnswer不相等,则创建一个while循环以提示用户输入正确的答案,然后使用已经创建的SAME SCANNER对象,而不是创建另一个对象。这是代码最大变化的症结所在。您的代码此时显示:

if(input != answertrue)
{
    System.out.println("Sorry try again");
    System.out.printf("%d*%d=", number1,number2);
    input = sc.nextInt();

}

但这只是测试答案是否正确。然后它将打印该抱歉的消息,再次打印该消息,然后将输入存储为该值。这在这种情况下不起作用,您需要在方法中利用while循环,例如我突出显示的循环。然后,要让用户退出,我们可以提示用户输入“是”或“否”,并使用我们一直在使用的同一扫描仪对象。如果用户输入“否”或“否”,我们将运行设置为false,程序将退出。