Как я могу усреднить строки и столбцы моего массива? - PullRequest
0 голосов
/ 10 апреля 2020

Моя программа принимает оценки группы студентов, строки представляют каждого студента, в то время как каждый столбец представляет каждый из экзаменов. Мне нужно среднее значение для каждой строки (то есть среднее значение оценок для каждого учащегося), так же как мне нужно общее среднее значение для каждого экзамена, я не знаю, как продолжить.

import java.util.Scanner;
public class students
{ private Scanner keyboard;
    private double [][]mat;
    public void classroom(){
        keyboard = new Scanner (System.in);
        System.out.println("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();
        int columns = 3;
        mat= new double [rows][columns];
        for (int i=0; i<mat.length;i++){
            for (int c=0;c<mat[i].length;c++){
                System.out.println ("enter grades");
                mat [i][c] = keyboard.nextDouble();
            }
        }
    }

    public void print () {
        for(int i=0;i<mat.length;i++) {
            for(int c=0;c<mat[i].length;c++) {
                System.out.print(mat[i][c]+" ");
            }
            System.out.println();
        }
    }


    public static void main (String [] args){
        students e = new students();
        e.classroom();
        e.print();

    }
}

Ответы [ 3 ]

1 голос
/ 10 апреля 2020

Эта функция возвращает список усредненных значений учащихся по заданной матрице и row_count в качестве аргументов. Индекс каждого студента будет сохранен в возвращенном списке.

public List<Double> average(double[][] mat, int row_count){
   List<Double> averageList = new ArrayList<>();
   for(int i = 0; i < row_count; i++){
       double averageOfStudent = (mat[i][0] + mat[i][1] + mat[i][2])/3;
       averageList.add(averageOfStudent);
   }
   return averageList;
}
0 голосов
/ 10 апреля 2020

Ответ от 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  
0 голосов
/ 10 апреля 2020

При работе с двумерным массивом попробуйте исправить одно из измерений и поработать с другим, например, вы хотите средние оценки для ОДНОГО ученика! Давайте представим его оценки, где сохранены в 1 массив, оценки! вы бы сделали что-то вроде следующего:

int sum=0;
int average=0;
for(int i=0;i<grades.length;i++){
    sum+=grades[i];
}
average = sum/grades.length

Итак, теперь вернемся к нашему 2-мерному массиву, все что вам нужно сделать, это исправить одно из измерений, чтобы получить нечто похожее на то, что мы сделали выше! *

int sum=0;
int average=0;
for(int i=0;i<grades.length;i++){ //grades[0][0] will indicate the first grade for 
                                    //the first student, so grades[0]x will represent
                                   // all of their grades basically
    sum+=grades[0][i];
}
average = sum/grades.length

Теперь, наконец, скажем, что вы хотите применить вышеизложенное ко всем студентам! вместо 0 мы можем использовать переменную и l oop!

int[] sum// make an array of sum so you get a sum per student
int[] average// make an array of average so you get a average per student
for(int i=0;i<grades.length;i++){
    for(int j=0;j<grades[0].length;j++){
        sum[i]=grades[i][j];
    }
}
average[i] = sum[i]/grades.length

Для среднего за экзамен, а не за одного учащегося, то же самое, но l oop по горизонтали, а не по вертикали.

Примечание. Очевидно, что вы можете сохранить необходимую информацию для обоих средних значений (для экзаменов и для каждого учащегося), но я советую вам решить ее, дважды выполнив цикл, чтобы прояснить ее!

Редактировать: Еще одно примечание: советую Вы можете прочитать больше о 2-мерных массивах, поскольку все может стать очень запутанным / запутанным, если вы не понимаете, с чем имеете дело!

...