Использование массива для нахождения минимума, максимума и среднего в Java - PullRequest
0 голосов
/ 04 марта 2020

Мы только начинаем кодировать Java в нашем вступлении к классу программирования, и я зациклен на том, где я ошибся с этим конкретным заданием. Цель состоит в том, чтобы создать программу, которая вводит 15 результатов тестов (значения от 1 до 100), которые хранятся в массиве. Затем использует этот массив для вычисления выходных данных для минимального, максимального и среднего балла (среднее значение должно быть аккумулятором).

Не допускаются бесконечные циклы с операторами break. Ниже приведен код, который я начал вместе с примечаниями профессора.

Мы запускаем этот код в Codiva, и когда я запускаю его, ничего не заполняется. Не уверен, что все, что мне не хватает.

import java.util.Scanner;

class TestScoresCalulcated {
    public static void main(String[] args) {
        /**Declarations**/
        int index = 0;
        int index2 = 0;
        int min;
        int max;
        int testScore;
        int NUM_SCORES = 15;
        int[] listOfScores = new int[NUM_SCORES];

        Scanner in = new Scanner(System.in);

        for (index = 1; index <= NUM_SCORES; index++) {
            /**TODO:create a loop and make the variable index the loop control variable**/
            System.out.println("Enter in an integer:");
            testScore = in .nextInt();
        }

        min = 1;
        max = 100;

        for (index2 = 1; index2 <= NUM_SCORES; index2++) {
            if (max < listOfScores[index2]) {
                max = listOfScores[index2];
            }
            System.out.println("Doing Max Calculation: " + max);
        }

        for (index2 = 1; index2 <= NUM_SCORES; index2++) {
            if (min > listOfScores[index2]) {
                min = listOfScores[index2];
            }
            System.out.println("Doing Min Calculation: " + min);
        }

        //use the index2 as a loop variable as a index for the array. 
        /*TODO:create another loop
        //TODO:check if the element in the array less than max
          System.out.println("Doing max calulcation");
          //TODO: assign max variable
        //TODO:check if the element in the array less than min
          System.out.println("Doing min calculation");

        //consider doing accumulator calculation here to get the average.

    **/ //end of loop2

        //output the results here

    }
}

Ответы [ 4 ]

0 голосов
/ 04 марта 2020

На самом деле вам не нужен массив для выполнения sh этого назначения.

Я подготовил список дел, чтобы решить ваше задание.

  1. В первом l oop вы должны заполнить свой массив (если вам действительно нужен массив) , но ваш код просто присваивает введенное значение переменной testScore.

  2. Это хорошая практика программирования, которая проверяет записи пользователя. Что делать, если пользователь вводит строковое значение.

  3. Вы можете найти минимальное и максимальное значения в первом l oop. Подсказка: инициализируйте min = 100; max = 1;

  4. Чтобы найти среднее, накапливайте введенные значения в такой переменной, как сумма.

  5. За пределами l oop найдите среднее значение, делящее общее число на NUM_SCORES.

В случае необходимости, я отправляю свое решение:

import java.util.InputMismatchException;
import java.util.Scanner;

class TestScoresCalulcated {
    public static void main(String[] args) {
        /** Declarations **/
        int min = 100;
        int max = 1;
        int total = 0;
        int testScore;
        int NUM_SCORES = 15;


        Scanner in = new Scanner(System.in);

        for (int i = 0; i < NUM_SCORES;) {
            try {
                System.out.println("Enter " + (i + 1) + ". value: ");
                testScore = in.nextInt();

                if (testScore < 1 || testScore > 100) {
                    throw new IllegalArgumentException();
                }

                if (testScore < min) {
                    min = testScore;
                }

                if (testScore > max) {
                    max = testScore;
                }

                total += testScore;
                ++i;

            } catch (InputMismatchException | IllegalArgumentException e) {
                System.out.println("Please enter numbers between 1 and 100\n");
                in.nextLine();
            }

        }

        System.out.println("\nOutput:");
        System.out.println("Min: " + min);
        System.out.println("Max: " + max);
        System.out.println("Average: " + total / NUM_SCORES);

        in.close();
    }
}
0 голосов
/ 04 марта 2020

Вы должны изменить следующее:

  1. установить для max и min значение listOfScores[0];
  2. Использовать только один l oop.
  3. используйте <, а не <= с NUM_SCORES
  4. И убедитесь, что массив содержит значения.

    int min = listOfScores[0];
    int max = min;
    double average = min; // first value
    for (int index2 = 1; index2 < NUM_SCORES; index2++) {
         int val = listOfScores[index2];
         if (max < val) {
              max = val;
         } else if (min > val) {
              min = val;
         }
         average += val;
    }
    System.out.println(min + " " + max + " " + (average/NUM_SCORES));


0 голосов
/ 04 марта 2020

Обратите внимание, что первый элемент массива хранится с индексом 0 и, следовательно, последний элемент хранится с индексом, array.length - 1, т.е. ваш l oop должен завершиться до того, как index = array.length.

Сделайте это следующим образом:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int NUM_SCORES = 15;
        int[] listOfScores = new int[NUM_SCORES];
        int min, max;
        double average;

        Scanner in = new Scanner(System.in);

        // Get the first integer and assign it to min, max and average
        listOfScores[0] = getInt(in);
        min = listOfScores[0];
        max = listOfScores[0];
        average = listOfScores[0];

        // Get the remaining integers and process min, max and average
        for (int i = 1; i < listOfScores.length; i++) {
            listOfScores[i] = getInt(in);

            if (listOfScores[i] > max) {
                max = listOfScores[i];
            }
            if (listOfScores[i] < min) {
                min = listOfScores[i];
            }
            average = (average * i + listOfScores[i]) / (i + 1);
        }

        // Display the numbers
        System.out.print("Numbers are: ");
        for (int i = 0; i < listOfScores.length; i++) {
            System.out.print(listOfScores[i] + " ");
        }
        System.out.println();

        // Display the result
        System.out.println("Minimum: " + min);
        System.out.println("Maximum: " + max);
        System.out.println("Average: " + average);
    }

    private static int getInt(Scanner in) {
        int input;
        // Check if the integer is in the range of 1 to 100
        do {
            System.out.print("Enter in an integer (from 1 to 100): ");
            input = in.nextInt();
            if (input < 1 || input > 100) {
                System.out.println("Error: Invalid integer.");
            }
        } while (input < 1 || input > 100); // Loop back if the integer is not in the range of 1 to 100

        // If yes, return the number
        return input;
    }
}

Пробный прогон для NUM_SCORES = 3:

Enter in an integer (from 1 to 100): 200
Error: Invalid integer.
Enter in an integer (from 1 to 100): -1
Error: Invalid integer.
Enter in an integer (from 1 to 100): 5
Enter in an integer (from 1 to 100): 300
Error: Invalid integer.
Enter in an integer (from 1 to 100): 10
Enter in an integer (from 1 to 100): -1
Error: Invalid integer.
Enter in an integer (from 1 to 100): 15
Numbers are: 5 10 15 
Minimum: 5
Maximum: 15
Average: 10.0

Примечание: Для простоты и избежания избыточного кода я реорганизовал пользовательский ввод в отдельный метод getInt. Вы можете обойтись без создания отдельного метода для него, но, как я уже упоминал, это привнесет избыточность в ваш код.

0 голосов
/ 04 марта 2020

Вы инициализируете индекс значением 0, затем перезаписываете его значением 1, поэтому вы получаете доступ к массиву, начиная со второго значения. Также ваш l oop завершает использование длины массива в качестве индекса (15), который на самом деле является 16-м элементом в вашем массиве, который не существует, вы определенно получаете там ошибку.
Вам нужно использовать < вместо <= </p>

Также то, что @Nils сказал, что не сохранять значения в массиве в первую очередь.

...