#java #loops #while-loop
#java #циклы #цикл while
Вопрос:
У меня есть эта программа, в которой пользователь вводит x количество оценок, затем программа делит сумму оценок на количество принятых входных данных. Он также должен находить введенные самые высокие и самые низкие оценки. Когда пользователь закончил, он / она вводит -1, чтобы завершить программу. Однако у меня возникли некоторые проблемы с этим.
- Программа добавляет -1 к среднему значению, что искажает все мои результаты.
- Я не могу понять, как вычислить минимальное значение в списке. Он всегда считает -1 как минимальное значение.
Вот код ниже:
import java.util.Scanner;
public class Lab4_EnteringGrades
{
public static void main (String a[])
{
Scanner kb = new Scanner(System.in);
double average = 0;
double gradesSum = 0;
int grade = 0;
int numTests = 0;
int maxValue = 0;
int minValue = 0;
while (grade != -1)
{
gradesSum = grade;
numTests = 1;
average = gradesSum / numTests;
System.out.print("Enter a grade: ");
grade = kb.nextInt();
while ((grade < -1) || (grade > 100))
{
System.out.println("Invalid grade.");
System.out.print("Enter a grade: ");
grade = kb.nextInt();
}
if (grade > maxValue)
maxValue = grade;
if (grade < maxValue)
minValue = grade;
}
System.out.printf("nTotal number of tests: %d", numTests);
System.out.printf("nThe average is %.1f", average);
System.out.printf("nThe max value is %d", maxValue);
System.out.printf("nThe min value is %d", minValue);
}
}
Комментарии:
1. сразу после
grade = kb.nextInt();
проверки этогоif (grade == -1) break
— вам не нужно выполнять, оставаясь частью цикла, если пользователь ввел-1
Ответ №1:
Я внес несколько изменений —
-
Инициализация
minValue
andmaxValue
в вашем исходном кодеminValue
была -1 иgrade
не могла быть меньше -1, следовательно, вы всегда виделиminValue
как -1. В общем, если вам нужны минимальные и максимальные значения, лучше инициализировать, как я сделал здесь. -
Перенесена логика вычисления
grade
average
ПОСЛЕ ввода пользователемgrade
, чтобы не испортитьaverage
. -
Ваш исходный код был:
if (grade < MaxValue)
Я изменил это на быть if (grade < minValue)
. Я считаю, что это была опечатка.
import java.util.Scanner;
public class Lab4_EnteringGrades {
public static void main (String a[])
{
Scanner kb = new Scanner(System.in);
double average = 0;
double gradesSum = 0;
int grade = 0;
int numTests = 0;
int maxValue = Integer.MIN_VALUE;
int minValue = Integer.MAX_VALUE;
while (true)
{
System.out.print("Enter a grade: ");
grade = kb.nextInt();
while ((grade < -1) || (grade > 100))
{
System.out.println("Invalid grade.");
System.out.print("Enter a grade: ");
grade = kb.nextInt();
}
if (grade == -1) {
break;
}
gradesSum = grade;
numTests = 1;
average = gradesSum / numTests;
if (grade > maxValue)
maxValue = grade;
if (grade < minValue)
minValue = grade;
}
System.out.printf("nTotal number of tests: %d", numTests);
System.out.printf("nThe average is %.1f", average);
System.out.printf("nThe max value is %d", maxValue);
System.out.printf("nThe min value is %d", minValue);
} }
Ответ №2:
Проблемы заключаются в том, что
- Вы делаете
gradesSum = grade;
это перед чтением первого класса, когдаgrade
все еще0
. - Вы делаете
if (grade < maxValue)
это после ввода пользователяgrade=-1;
, поэтому всегда обнаруживаете, что-1
это меньше. - Вы сравниваете оценку
maxValue
как для проверки max, так и для min - Поскольку вы инициализируете
minValue=0
, вы никогда не найдете меньшее значение (кроме -1), поэтому вы должны инициализировать его чем-то большим
Вы можете переместить весь код, который обрабатывает оценку, до тех пор, пока вы ее не прочитаете, а затем break
, если пользователь вводит -1
:
import java.util.Scanner;
public class Lab4_EnteringGrades
{
public static void main (String a[])
{
Scanner kb = new Scanner(System.in);
double average = 0;
double gradesSum = 0;
int grade = 0;
int numTests = 0;
int maxValue = 0;
int minValue = 101;
while (true)
{
System.out.print("Enter a grade: ");
grade = kb.nextInt();
while ((grade < -1) || (grade > 100))
{
System.out.println("Invalid grade.");
System.out.print("Enter a grade: ");
grade = kb.nextInt();
}
// Stop if the user entered -1
if (grade == -1) break;
gradesSum = grade;
numTests = 1;
average = gradesSum / numTests;
if (grade > maxValue)
maxValue = grade;
if (grade < minValue)
minValue = grade;
}
System.out.printf("nTotal number of tests: %d", numTests);
System.out.printf("nThe average is %.1f", average);
System.out.printf("nThe max value is %d", maxValue);
System.out.printf("nThe min value is %d", minValue);
}
}
Хотя while(true) { if(..) break; }
это немного неудобно. Вы можете улучшить код еще больше, создав отдельную функцию для чтения входных данных:
import java.util.Scanner;
public class Lab4_EnteringGrades
{
public static int readGrade(Scanner kb) {
System.out.print("Enter a grade: ");
int grade = kb.nextInt();
while ((grade < -1) || (grade > 100))
{
System.out.println("Invalid grade.");
System.out.print("Enter a grade: ");
grade = kb.nextInt();
}
return grade;
}
public static void main (String a[])
{
Scanner kb = new Scanner(System.in);
double average;
double gradesSum = 0;
int grade;
int numTests = 0;
int maxValue = Integer.MIN_VALUE;
int minValue = Integer.MAX_VALUE;
// Common idiom for reading a grade until it's -1
while ((grade = readGrade(kb)) != -1) {
gradesSum = grade;
numTests = 1;
if (grade > maxValue)
maxValue = grade;
if (grade < minValue)
minValue = grade;
}
// Consider handling the case of numTests == 0
average = gradesSum / numTests;
System.out.printf("nTotal number of tests: %d", numTests);
System.out.printf("nThe average is %.1f", average);
System.out.printf("nThe max value is %d", maxValue);
System.out.printf("nThe min value is %d", minValue);
}
}
Комментарии:
1. Отличный ответ, но вам не хватает, что он должен установить начальное значение MinValue на значение больше 100