Ответ от bleh10 объясняет логику c, поэтому я не буду повторять это здесь. Тем не менее, есть некоторые мелкие детали, которые либо отсутствуют, либо могут вводить в заблуждение, что может привести к тому, что ваша программа не будет работать должным образом, что заставит вас почесать голову, почему.
Во-первых, bleh10 В ответе используются массивы int
, когда в вашем вопросе четко указано, что оценки double
.
Во-вторых, при использовании Scanner
необходимо учитывать некоторые особенности. Обратитесь к этому вопросу: Сканер пропускает nextLine () после использования next () или nextFoo ()?
Наконец, я попытался сделать приведенный ниже код более «удобным», печатая соответствующие подсказки при запросе пользователя ввести значения. Также я изменил ваш метод print()
, чтобы он отображал таблицу результатов. Я предполагаю, что вы, возможно, еще не узнали о методе printf()
, поэтому для объяснения используемых строк форматирования обратитесь к javado c для класса java.util.Formatter
Вот мое полное решение, которое началось с вашего исходного кода, который я модифицировал. Обратите внимание, что я изменил имя вашего класса в соответствии с Java соглашениями об именах .
import java.util.Scanner;
public class Students {
private static final int NUMBER_OF_EXAMS = 3;
private Scanner keyboard;
private double[][] mat;
private double[] examAverages = new double[NUMBER_OF_EXAMS];
private double[] studentAverages;
public void classroom() {
keyboard = new Scanner(System.in);
System.out.print("How many students does your classroom have? ");
// We know that 3 exams were done, but not how many students are in the classroom.
int rows = keyboard.nextInt();
studentAverages = new double[rows];
mat = new double[rows][NUMBER_OF_EXAMS];
double[] examTotals = new double[NUMBER_OF_EXAMS]; // each array element implicitly initialized to zero
double studentTotal = 0.0d;
for (int i = 0; i < rows; i++) {
System.out.println("Enter grades for student " + (i + 1));
studentTotal = 0.0d;
for (int c = 0; c < mat[i].length; c++) {
mat[i][c] = getGrade(c);
studentTotal += mat[i][c];
examTotals[c] += mat[i][c];
}
studentAverages[i] = studentTotal / NUMBER_OF_EXAMS;
}
for (int i = 0; i < NUMBER_OF_EXAMS; i++) {
examAverages[i] = examTotals[i] / rows;
}
}
/**
* Accepts, from user, a single grade for a single exam for a single student.
*
* @param index - exam index
*
* @return Grade entered by user.
*/
private double getGrade(int index) {
if (keyboard.hasNextLine()) {
keyboard.nextLine();
}
System.out.printf("Enter grade %d: ", (index + 1));
double grade = keyboard.nextDouble();
return grade;
}
/**
* Displays table of exam results for all students including each student's average grade
* plus the average result for each exam.
*/
public void print () {
// Print column headers for results table.
System.out.println(" Exam 1 Exam 2 Exam 3 Average");
for (int i = 0; i < mat.length; i++) {
System.out.printf("Student %2d: ", (i + 1));
for(int c = 0; c < mat[i].length; c++) {
System.out.printf("%6.2f ", mat[i][c]);
}
System.out.printf("%.2f%n", studentAverages[i]);
}
System.out.print("Averages: ");
for (int i = 0; i < NUMBER_OF_EXAMS; i++) {
System.out.printf("%6.2f ", examAverages[i]);
}
System.out.println();
}
public static void main(String[] args) {
Students e = new Students();
e.classroom();
e.print();
}
}
Вот вывод для примера выполнения приведенного выше кода:
How many students does your classroom have? 2
Enter grades for student 1
Enter grade 1: 70
Enter grade 2: 70
Enter grade 3: 70
Enter grades for student 2
Enter grade 1: 30
Enter grade 2: 30
Enter grade 3: 30
Exam 1 Exam 2 Exam 3 Average
Student 1: 70.00 70.00 70.00 70.00
Student 2: 30.00 30.00 30.00 30.00
Averages: 50.00 50.00 50.00