const n=20;
var a:array [1..n] of integer;
i,max,maxi,min,mini:integer;
begin
write('Массив: ');
for i:= 1 to n do
begin
a[i]:=random(101)+50;
write (a[i],' ')
end;
max:=a[1];
maxi:=1;
min:=a[1];
mini:=1;
for i:= 1 to n do
begin
if a[i]>max then
begin
max:=a[i];
maxi:=i
end;
if a[i]<min then
begin
min:=a[i];
mini:=i
end
end;
writeln;
writeln('Максимальный элемент ',max,' и его номер ',maxi);
writeln('Минимальный элемент ',min,' и его номер ',mini)
end.
Или (если max или min элемент будет не один)
const n=20;
var a:array [1..n] of integer;
i,max,min:integer;
begin
write('Массив: ');
for i:= 1 to n do
begin
a[i]:=random(101)+50;
write (a[i],' ')
end;
max:=a[1];
min:=a[1];
for i:= 1 to n do
begin
if a[i]>max then max:=a[i];
if a[i]<min then min:=a[i]
end;
writeln;
for i:= 1 to n do
begin
if a[i]=max then writeln('Максимальный элемент ',max,' и его номер ',i);
if a[i]=min then writeln('Минимальный элемент ',min,' и его номер ',i)
end
end.
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> - обобщение для любой перечислимой коллекции.