我对编码非常陌生,但是我想知道为什么当我在数学问题中得到错误的答案时,它要求我重试,但是却不允许我再次回答该问题。谢谢。
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();
}
}
}
答案 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,程序将退出。