SergProfit
@SergProfit
Изучаю C#

Как найти среднее число массива с помощью кода C#?

Я только начал изучать C#. Не хватает понимания как реализовать логику решения с помощью кода. Задача: найти среднее число массива чисел. Например, есть числа 3, 10, 16, 2, 8. Ответ: Среднее число будет 10 или 8.
Логика нахождения:
1. "Макс. число" минус "мин. число", т.е. 16 - 2 = 14.
2. Затем 14 / 2 = 7.
3. Затем "мин. число" + 7, т.е. 2 + 7 = 9 Это и будет среднее число массива.
4. Но в массиве нет девятки. Значит ближайшие числа 10 или 8.
Так вот, я не смог додуматься как найти среднее число с помощью кода. Неправильные варианты не привожу, т. к. не вижу в этом смысла.
Просьба - если кто-то напишет код, то напишите его именно с учётом, что я новичок. Т.е. при помощи циклов и условных операторов, чтобы было понятно как это работает, чтобы не было скрытых действий таких, как myArray.Max. или myArray.Min. И конечно же с учётом того, что массив может иметь отрицательные числа. Спасибо!
  • Вопрос задан
  • 712 просмотров
Решения вопроса 1
vabka
@vabka Куратор тега C#
Токсичный шарпист
Вообще, это очень похоже на "медианное среднее"
Т.е. при помощи циклов и условных операторов, чтобы было понятно как это работает, чтобы не было скрытых действий таких, как myArray.Max. или myArray.Min.

Я не хочу переизобретать простые операции, так что развернёшь их сам.
using System;
using System.Collections.Generic;
using System.Linq;

var array = new[] {3, 10, 16, 2, 8};
var result = FindMediumPoint(array);
Console.WriteLine(string.Join(" ", result));

static IEnumerable<int> FindMediumPoint(int[] sequence)
{
	var min = sequence.Min(); // Минимум
	var max = sequence.Max(); // Максимум
	var diff = max - min; // Разброс между минимумом и максимумом
	var avg = diff / 2; // Середина "Разброса"
	var center = min + avg;
	var actualCenterDiffs = sequence
		.Select(number => number - center) // Находим отклонение числа
		.GroupBy(Math.Abs) // Группируем те числа, у которых одинаковое абсолютное отклонение
		.OrderBy(x => x.Key) // Сортируем в порядке увеличения отклонения
		.First(); // Берём первое по порядку (минимальное)
	return actualCenterDiffs
		.Select(diff => diff + center); // Применяем отклонение к найденному центру;
}

В коде алгоритм в принципе выглядит так, как я бы решал самостоятельно.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы