#java #while-loop #sentinel
#java #цикл while #sentinel
Вопрос:
В одном из вопросов из моего учебника по Java меня просят «Создать новую версию обычной программы (листинг 3.6), которая предотвращает ошибку во время выполнения, когда пользователь немедленно вводит контрольное значение (без ввода каких-либо допустимых значений)».
Листинг 3.6 приведен ниже:
import java.text.DecimalFormat;
import java.util.Scanner;
public class Average
{
public static void main (String[] args)
{
Scanner scan = new Scanner (System.in);
int sum = 0, value, count = 0;
double average;
System.out.println ("Enter an integer (0 to quit): ");
value = scan.nextInt();
while (value != 0) // sentinel value of 0 to terminate the loop
{
count ;
sum = value;
System.out.println ("The sum far is " sum);
System.out.print ("Enter an integer (0 to quit): ");
value = scan.nextInt();
}
System.out.println ();
System.out.println ("Number of values entered: " count);
average = (double)sum / count;
DecimalFormat fmt = new DecimalFormat ("0.###");
System.out.println ("The average is " fmt.format(average));
}
}
Я думаю, что вопрос заключается в том, чтобы сделать подсчитываемым значение sentinel, равное 0. Вот результат из листинга 3.6 при вводе контрольного значения.
Вывод:
Enter an integer (0 to quit):
0
Number of values entered: 0
The average is �
Кроме того, я думаю, что вместо того, чтобы это говорить Number of values entered: 0
, я думаю, что предполагается сказать Number of values entered: 1
. Если вы думаете, что знаете, о чем задается вопрос, пожалуйста, дайте мне знать. Заранее большое вам спасибо.
Комментарии:
1. Ваша задача противоречит самой себе, поскольку код не выдает никаких исключений, если первый ввод равен 0. Но это привело бы к сбою, если бы строка «average = (double)sum / count;» была «average = sum / count;» . Итак, я предполагаю, что задача неверна или она уже содержит решение. Однако всегда лучше спросить человека, который дал вам эту задачу
Ответ №1:
Вы получаете ошибку, потому что количество не увеличивается до тех пор, пока вы не проверите ввод пользователя. Когда самое первое число равно 0, цикл while никогда не вводится, и в итоге вы делите на 0. Вопрос заключается в том, чтобы вы исправили код, чтобы избежать деления на 0 и не генерировалось исключение.
Ответ №2:
Вам нужна защита, чтобы убедиться, что count
значение не равно нулю.
average = (double)sum / (count == 0 ? 1 : count);