嗨,我在完成家庭作业时遇到了麻烦。该程序使用两种不同的方法来平均和显示用户定义的数字集。我想出了所有这些,但我在错误检查方面遇到了困难。我不希望用户能够说他们想要在开头平均负数或零数量,所以我尝试使用if / else语句和do while循环向用户显示错误消息并给他们选择再试一次。
当用户输入1以在输入无效号码后再次尝试该程序时,该程序允许用户再次尝试。然而,一旦他们正确地输入所有内容并完成程序,程序就会重新开始。我希望程序在程序正确完成后结束。
任何帮助将不胜感激。谢谢!
public static void main(String[] args)
{
//Defining the variables in main method
int inputNumber;
int repeat = 0;
//Creating the array and checking for negative or no numbers using do..while and if..else
do
{
String aStr = JOptionPane.showInputDialog(null, "How many numbers would you like to be averaged?");
inputNumber = Integer.parseInt(aStr);
if(inputNumber <= 0)
{
String errorStr = JOptionPane.showInputDialog(null, "Cannot be a negative number or a zero. Press 1 to try again.");
repeat = Integer.parseInt(errorStr);
}
else
{
double[] array = new double[inputNumber];
displayAverage(average(array));
}
} while (repeat == 1);
} // end main
// Creating a method called "average" that calculates and returns the average to main
public static double average(double [] methodArray)
{
// Defining variables in average method
int index;
double total = 0;
double average;
// Taking user inputed numbers and adding them up
for(index = 0; index < methodArray.length; index++)
{
String bStr = JOptionPane.showInputDialog(null, "Enter number " + (index + 1));
methodArray[index] = Double.parseDouble(bStr);
total = total + methodArray[index];
}
// Calculating the average
average = total/index;
return average;
} //end average method
// Creating a method called "displayAverage" that displays the average in a dialog box
public static void displayAverage(double returnedAverage)
{
JOptionPane.showMessageDialog(null, "The average of all your numbers is " + returnedAverage);
}
} //结束课
答案 0 :(得分:1)
似乎在用户再次尝试并输入有效输入后,您永远不会更改repeat
的值,因此循环将永远不会退出。如果else
在循环中if-else
,则需要将repeat
重新分配给1以外的其他内容,以便循环退出!
答案 1 :(得分:0)
要循环直到获得有效输入,请尝试以下操作:仅当输入有效时才将validInput
布尔值设置为true。
boolean validInput = false;
while (!validInput) {
//get input from user
if (userInputIsValid) { //however this is done
validInput = true;
}
}
答案 2 :(得分:0)
你必须做这样的事情:
boolean repeat = false;
do
{
String aStr = JOptionPane.showInputDialog(null,
"How many numbers would you like to be averaged?");
try
{
inputNumber = Integer.parseInt(aStr);
if (inputNumber <= 0)
{
JOptionPane.showMessageDialog(null,
"Input must be a number greater than zero. Try again.",
"ERROR: Invalid input", JOptionPane.ERROR_MESSAGE);
repeat = true;
}
else
{
double[] array = new double[inputNumber];
displayAverage(average(array));
}
}
catch (NumberFormatException e)
{
JOptionPane.showMessageDialog(null,
"Input must be a numeric string. Try again",
"ERROR: Invalid input", JOptionPane.ERROR_MESSAGE);
repeat = true;
}
} while (repeat);
需要try / catch来处理无效的数字字符串,如空白文本字段或其他非数字字符。
您可能还想要包含其他逻辑来处理取消按钮。
答案 3 :(得分:0)
虽然在给出正确(我相信是)答案的情况下还有另一个答案,但我想详细说明一下。
这是伪代码:
do {
inputNumber = getInput();
if(inputNumber <= 0) {
displayErrorMessage();
repeat = 1; // your logic makes no sense when people input non-1
} else {
calculateAverage(inputNumber);
}
} while (repeat == 1)
问题非常明显:一旦您收到无效inputNumber
,就会设置repeat = 1
,导致do-while
循环再次继续。然而,之后,即使用户输入有效的inputNumber
,repeat
仍然保持为1,并且每次点击while(repeat ==1)
时,它仍将评估为真。
我强烈建议您学习以基本方式使用调试器,以便您可以跟踪代码,即使输入有效数字,也可以通过查看问题来轻松识别问题,因为repeat
总是1。
另一个建议是重写一下你的代码,以便更容易理解。你可以把这些东西写成:
,而不是命名那些没有任何意义的重复boolean inputIsValid= false;
do {
inputNumber = getInput();
inputIsValid= verifyInput(inputNumber);
if ( inputIsValid) {
calculateAverage(inputNumber);
} else {
displayErrorMessage();
}
} while ( ! inputIsValid)
流程,imho,更直观。
这只是第一步。您甚至可以更好地将get输入逻辑包装在一个单独的方法中,以便主逻辑看起来像:
inputNumber = getInput();
calculateAverage(inputNumber);
然后将循环放在getInput()
中。看起来更清楚不是吗?