Почти полный код для расчета среднего значения и отклонения - PullRequest
0 голосов
/ 28 января 2019

Я просто запутался в том, как хранить ввод пользователя для массива чисел.Пользователь может ввести, сколько чисел он хочет в массиве, но он не запрашивает сами числа.

import java.util.Scanner;

public class Exercise_0_2 {

public static void main(String[] args) {

Scanner input = new Scanner(System.in);

System.out.print("How many numbers: ");
int n = input.nextInt();

System.out.println("Enter  " + n + " numbers : ");
double[] numbers = new double[n];

//Call and print methods
System.out.println("Mean: " + mean(numbers, n));
System.out.println("Standard Deviation: " + deviation(numbers, n));

}
// Calculate Mean
public static double mean(double[] numbers, int n) {

    double sum = 0;

    for (int i = 0; i < n; i++) {
        sum += numbers[i];
    }
    double mean = sum / n;
    return mean;
    }
    //Calculate deviation from the mean
    public static double deviation(double[] numbers, int n) {

            double mean = mean(numbers, n);
            double sqSum = 0;
            for (int i = 0; i < n; i++) {
                sqSum += numbers[i] * numbers[i];
            }

                double variance = sqSum / n - mean * mean;
                double sd = Math.sqrt(variance);
                return sd;

    }
}

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Я могу рекомендовать сначала использовать ArrayList вместо array[], в этом случае вам не нужно указывать количество чисел (n) и вы можете свободно вводить столько цифр, сколько захотите.Во-вторых, используйте блок try-catch, чтобы прекратить ввод чисел и инициализацию вычислений.Например:

public class MeanAndDeviation {

public static void main(String[] args) {

    Scanner scn = new Scanner(System.in);

    System.out.println("Enter the numbers then press any letter to calculate Mean and Sd");
    /*Use an ArrayList to freely enter so much numbers as you need*/
    ArrayList <Double> arr = new ArrayList <>();
    /*Use try-catch block to start calculations by entering any letter*/
    try {
        while (scn.hasNext()) {
            double i = scn.nextDouble();
            arr.add(i);
        }
    }
    /*Use catch (Exception e) to catch any type of exceptions*/
    catch (Exception e) {}

    System.out.println(arr + "\nMean: " + mean(arr) + 
            "\nStandard Deviation: " + deviation(arr));
    }

private static double mean(ArrayList<Double> arr) {
    double sum = 0;
    for (int i = 0; i < arr.size(); i++) {
        sum += arr.get(i);}
    double mean = sum/arr.size();
    return mean;       
}

private static double deviation (ArrayList<Double> arr) {
    double sumOfDiff = 0;
    for (int i = 0; i < arr.size(); i++) {
        sumOfDiff += Math.pow(arr.get(i) - mean(arr), 2);
    }
    double deviation = Math.sqrt(sumOfDiff/arr.size());
    return deviation;
}
}
0 голосов
/ 28 января 2019

Давайте рассмотрим ошибки сверху.

    int arr[] = new int[(int) n];

На данный момент n еще не объявлено, поэтому вы не можете использовать его здесь.Просто переместите объявление arr в после объявления и чтения n со сканера.В качестве примера рассмотрим тип int для n.double на самом деле не имеет смысла.

    System.out.println("Mean: " + mean);

Если это должен был быть вызов метода mean, вам необходимо поставить квадратные скобки после имени метода и необходимые аргументы в скобках, как в mean(arr).mean(arr) по-прежнему не будет работать, потому что arr имеет тип int[], а метод требует тип double[].Я не могу сказать вам, какое здесь правильное решение, так как я не уверен, что вы хотели прочитать числа снаружи или внутри метода.Снаружи мне показалось бы более естественным.

    System.out.println("Enter" + n + " numbers: ");

Здесь нельзя использовать переменную n, поскольку она является локальной переменной в методе main.Опять же, я не уверен, что вам это нужно, если вы намеревались прочитать числа в другом месте и передать заполненный массив в метод.

        array[i] = input.nextDouble();

Здесь две ошибки: у вас нет переменной массива с именем array1.Возможно, вы имели в виду numbers, я не уверен.И здесь вы не можете использовать переменную input, поскольку она является локальной переменной в методе main (та же проблема, что и в n выше).Либо объявите вместо этого статическое поле, либо передайте его в качестве аргумента методу.

Ошибки в методе deviation аналогичны, поэтому я не буду повторяться.

Поскольку я понимаю, чтоэто должно быть упражнением для вас, я не собираюсь решать его для вас и лишать вас обучения.Я надеюсь, что у вас есть еще один или два шага.

Редактировать

В редактировании вашего вопроса есть несколько прекрасных улучшений.Вы все еще не решили, читать ли числа в main или в mean?

    System.out.println("Mean: " + mean(numbers, n));

В вашем методе main не объявлена ​​переменная numbers (та же проблема в следующей строке).В противном случае хорошо.

        sum += a[i];

Вы, вероятно, имели в виду meanSum и numbers?Или, может быть, вы хотели объявить sum вместо meanSum над циклом for?

Отсутствует правая фигурная скобка после строки выше, чтобы завершить первый цикл for.

    double dqDiff = 0;

Простая опечатка: вы ссылаетесь на эту переменную как sqDiff позже, поэтому необходимо использовать то же самое написание здесь в объявлении.

    return Math.sqrt(mean(number, n));

Отсутствует s для numbers.Я не уверен, что эта простая версия математики верна.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...