Найти среднее

Создадим консольное приложение

Пользователь вводит набор чисел. Требуется найти среднее  

Сперва пользователь вводит N, сколько всего чисел в массиве, далее в каждой новой строке вводится новое число

Console.WriteLine("Введите N: ");
int N = int.Parse(Console.ReadLine());
// считываем N чисел
for (int i = 0; i < N; i++)  {
   int v = int.Parse(Console.ReadLine());
}

Давайте расчитывать среднее на лету. Будем аккумулировать числа в переменную sum, чтобы расчитать сумму всех чисел.

Console.WriteLine("Введите N: ");
int N = int.Parse(Console.ReadLine());

int sum = 0; // переменная в которую будет накапливаться сумма

// считываем N чисел
for (int i = 0; i < N; i++)  {
   int v = int.Parse(Console.ReadLine());
   sum += v;
}

После того как будет считаны все числа, в переменной sum будет находится сумма всех введеных чисел. Осталось разделить ее на количество чисел N и мы получим среднее.

Console.WriteLine("Введите N: ");
int N = int.Parse(Console.ReadLine());

int sum = 0; // переменная в которую будет накапливаться сумма

// считываем N чисел
for (int i = 0; i < N; i++)  {
   int v = int.Parse(Console.ReadLine());
   sum += v;
}

int result = sum / N;
Console.WriteLine($"Среднее = {result}");

Давайте попробуем запустить и ввести разные наборы данных:

Введем N=3, и числа 1,2,3. Среднее должно быть 2, т.к. (1+2+3) / 2 = 6 / 2 = 3

Программа выполнила расчет корректно. Закроем программу, нажав любую клавишу и запустим ее снова, введя другой набор данных.

Теперь введем числа N=2, и числа 1,2. Среднее должны быть 1.5, т.к. (1+2) / 2 = 3 / 2 = 1.5

Результат не правильный. Почему так произошло?

Все дело в этой строчке:

int result = sum / N;

Здесь мы используем целочисленный тип данных int для переменной result, а в правой части производим целочисленное деление двух int переменных (sum и N). Целочисленное деление не учитывает дробную часть, т.к. оперирует только целыми числами. Давайте явно приведем тип к такому который поддерживает операции с дробными числами, например к типу double (можно к float, в этом конкретном примере разницы не будет)

double result = sum / (double)N;

Теперь введем предыдущий набор данных еще раз

Теперь расчет осуществляется правильно.

 

Агрегирование + фильтрация

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

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

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

using System.Text;
Console.OutputEncoding = Encoding.UTF8;

Console.WriteLine("Введите N: ");
int N = int.Parse(Console.ReadLine());

int[] data = new int[N]; // создаем массив чисел длиной N, где будем запоминать введенные пользователм числа

// считываем N чисел
for (int i = 0; i < N; i++)
{
    data[i]= int.Parse(Console.ReadLine());     // записываем очередное число в массив
}

Далее разобьем задачу на две части:

1. Агрегрирование данных - поиск среднего

2. Фильтрация данных - отсеиваем только те, которые соотвествуют критерию - больше или равны среднему

Сперва найдем среднее и выведем его на экран

// расчитаем среднее пройдясь по массиву и накопив sum 
int sum = 0; // аккумулятор суммы
for (int i = 0; i < N; i++)
{
   sum += data[i];
}

// вычислим среднее
double avg = sum / (double)N; 
Console.WriteLine($"Среднее = {avg}");

Теперь зная среднее давайте выведем все числа которы больше или равны среднему

//пройдемся еще раз по массиву и будем выводить числа, которые больше или равны среднему
Console.WriteLine("Числа больше среднего: ");
for (int i = 0; i < N; i++)
{
   if (data[i] >= avg)
      Console.WriteLine(data[i])
}

 

Проверим результат работы программы:

N=2, числа 1,2. Среднее 1.5. Из числе 1 и 2 , больше 1.5 является только 2

Теперь введем другой пример

N=3, числа 1,2,3. Среднее 2. Числа больше или равные среднему это 2,3. Все правильно.