Linq используется для генерации последовательности
using System.Linq;
Длина последовательности задаётся тут.
private static int Size => 7
Разберём главный код.
По умолчанию Rand имеет большой разброс. Поэтому мы хотим его ограничить, но так, чтобы мы точно не знали значения max и min. (чтобы искать по-честному). Этого можно не делать, но будут страшные значения генерироваться.
Для этого генерируем случайно крайние значения диапазона генерации.
int seedMin = new Random().Next(1, 40);
int seedMax = new Random().Next(seedMin + 5, seedMin + 40);
Далее генерируем саму последовательность.
var arr = Enumerable //Класс из Linq для работы с перечислениями
.Repeat(0, Size) // Задаём количество
.Select(_ => new Random().Next(seedMin, seedMax)) // Для каждого элемента генерируем случайное значение
.ToArray(); // Делаем массивом
Ну а теперь, можно заняться поиском и вычислением.
int max = arr[0], min = arr[0]; // Предполагаем max и min первым элементом
foreach (var el in arr) {
max = Math.Max(el, max); // Если очередной больше - заменяем max
min = Math.Min(el, min); // Если очередной меньше - заменяем min
}
Теперь мы нашли минимальным и максимальный элементы. Нам надо убрать их из последовательности ровно по одному разу. Для этого создаём переменные-флаги типа bool. Если наткнёмся на max или min при расчете, то пропустим их и отметим, что уже встречали.
Создадим переменную для произведения и приравняем к 1 (если 0, то произведение будет 0).
int product = 1;
bool maxIsCatched = false, minIsCatched = false;
Ищем произведение.
foreach (var el in arr)
{
if (!maxIsCatched && el == max) // Если не встречали до этого и встретили сейчас
{
maxIsCatched = true; //Запоминаем факт встречи
continue; // Пропускаем шаг
}
if (!minIsCatched && el == min) // По аналогии но с min
{
minIsCatched = true;
continue;
}
product *= el; // Это всё равно, что написать product = product * el
}
Далее просто выводим результаты.
Сначала выводим сгенерированную последовательность.
Answers & Comments
Linq используется для генерации последовательности
using System.Linq;
Длина последовательности задаётся тут.
private static int Size => 7
Разберём главный код.
По умолчанию Rand имеет большой разброс. Поэтому мы хотим его ограничить, но так, чтобы мы точно не знали значения max и min. (чтобы искать по-честному). Этого можно не делать, но будут страшные значения генерироваться.
Для этого генерируем случайно крайние значения диапазона генерации.
int seedMin = new Random().Next(1, 40);
int seedMax = new Random().Next(seedMin + 5, seedMin + 40);
Далее генерируем саму последовательность.
var arr = Enumerable //Класс из Linq для работы с перечислениями
.Repeat(0, Size) // Задаём количество
.Select(_ => new Random().Next(seedMin, seedMax)) // Для каждого элемента генерируем случайное значение
.ToArray(); // Делаем массивом
Ну а теперь, можно заняться поиском и вычислением.
int max = arr[0], min = arr[0]; // Предполагаем max и min первым элементом
foreach (var el in arr) {
max = Math.Max(el, max); // Если очередной больше - заменяем max
min = Math.Min(el, min); // Если очередной меньше - заменяем min
}
Теперь мы нашли минимальным и максимальный элементы. Нам надо убрать их из последовательности ровно по одному разу. Для этого создаём переменные-флаги типа bool. Если наткнёмся на max или min при расчете, то пропустим их и отметим, что уже встречали.
Создадим переменную для произведения и приравняем к 1 (если 0, то произведение будет 0).
int product = 1;
bool maxIsCatched = false, minIsCatched = false;
Ищем произведение.
foreach (var el in arr)
{
if (!maxIsCatched && el == max) // Если не встречали до этого и встретили сейчас
{
maxIsCatched = true; //Запоминаем факт встречи
continue; // Пропускаем шаг
}
if (!minIsCatched && el == min) // По аналогии но с min
{
minIsCatched = true;
continue;
}
product *= el; // Это всё равно, что написать product = product * el
}
Далее просто выводим результаты.
Сначала выводим сгенерированную последовательность.
Затем найденные max, min и product.
PrintArr(arr);
Console.WriteLine($"Max: {max}; Min: {min}; Product: {product}.");
Метод для печати последовательности написан самостоятельно и выглядит так.
private static void PrintArr<T>(IEnumerable<T> arr)
{
foreach (var el in arr) // Перебираем
{
Console.Write(el); // Печатаем
Console.Write(" ");
}
Console.WriteLine();
}
<T> используется для того, чтобы не зависеть от значений последовательности. Туда можно запихнуть любой массив или список.
IEnumerable<T> - обобщение для любой перечислимой коллекции.