Получил школьное задание, чтобы найти сумму, среднее и наибольшее число в массиве. И вход, и анализ должны быть в цикле if. Это то, что я сделал, но сумма не работает, поэтому среднее значение также неверно. Что я могу улучшить?

    double average = 0;
    int biggest = 0;

    int [] arrayx = new int[5];
    Scanner stdIn =  new Scanner(System.in);

    for (int i = 0; i < arrayx.length; i++) {
        System.out.println("Write an integer: ");
        arrayx[i] = stdIn.nextInt();
        average += arrayx[i] /arrayx.length;

        if(biggest == 0 || arrayx[i] > biggest)
        {   
            biggest = arrayx[i];            
        }   
    }
    System.out.println("Sum is: " + (average*arrayx.length));
    System.out.println("Average is: " + average);
    System.out.println("Biggest number is: " + biggest);
    stdIn.close();
0
Znarvl 19 Окт 2017 в 22:41

3 ответа

Лучший ответ

Вопрос в целочисленном делении.

В Java, когда вы делите два целых числа, вы получаете целое число (теряя что-либо после десятичной точки).

То есть . 10 / 3 = 3

Если вы хотите 10 / 3 = 3.33333, вам нужно привести один из целых чисел к удвоению.

Так что вместо:

average += arrayx[i] /arrayx.length;

Вы хотите сделать

average += ((double) arrayx[i]) /arrayx.length;

< Сильный > Примечание :

Вы можете сделать свое решение более эффективным, избавившись от массива int (заботитесь ли вы о чем-нибудь, кроме самого большого, что вы когда-либо видели?) И выполнив деление в самом конце цикла.

2
ACVM 19 Окт 2017 в 19:51

Проблема в том, что и arrayx[i], и arrayx.length являются целыми числами, т.е. целыми числами.
Таким образом, при делении используется целочисленное деление, которое принимает всю часть результата деления. Например, 7 / 2 в целочисленном делении - 3.

Таким образом, вы каждый раз добавляете к avarage целое число, в то время как вам нужно деление с плавающей запятой.
Вы можете привести одно из чисел к double, чтобы вызвать деление FP:

average += (double)arrayx[i] /arrayx.length;

Как правило, лучше рассчитать сумму как целое число и затем выполнить деление:

sum += arrayx[i];
...
double average = (double)sum / arrayx.length; // Casting here too for FP division.

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

1
Neo 19 Окт 2017 в 19:54

Ваш чек на наибольшее значение также неверен.

Если вы вводите входные данные: {-3, -2, -1, 0, -100} для вашей программы.

В конце вашего цикла самый большой будет установлен равным -100.

Ваше заявление if должно быть изменено на: if(i == 0 || arrayx[i] > biggest)

Где i равно количеству int, которые уже были обработаны.

0
Rick Ridley 19 Окт 2017 в 20:00