Как найти минимум в одномерном массиве

 В этой статье рассмотрены два способа нахождения минимального (максимального) элемента массива, а также задачи с применением этих способов.

1 способ

Задача 1: Дан одномерный массив, состоящий из n целых чисел. Найти минимальный элемент массива. В первой строке вводится количество чисел в массиве n. Затем выводятся сами числа, заданные случайным образом. В третьей строке выводится результат: минимальный элемент массива.

Исходные данные:

Результат:

10
5  -2  14  7  -4  23  0  8  6  -1

-4

10
0  4  5  2  77  62  4  8  0  45

0

Считаем, что первый элемент массива – минимальный.  Затем, сравниваем, начиная со второго до последнего все элементы массива с минимальным. Используем для этого цикл. Если очередной элемент на каком-то шаге цикла оказывается меньше минимального, то значение минимального изменяем, присвоив ему значение этого очередного элемента. По окончании цикла выводим результат: минимальный элемент.

program min1;
var a:array[1..100] of integer;
i,min,n:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do begin
a[i]:=random(-100,100);
write(a[i],’ ‘);
end;
//нахождение минимального элемента массива
min:=a[1];
for i:=2 to n do
if min>=a[i] then min:=a[i];
//вывод результата
writeln;
write(min);
end.

Заметим, что для нахождения максимального элемента массива достаточно заменить имя переменной min на max и знак >= на знак <=.

Задача 2: Дан одномерный массив, состоящий из n целых чисел. Найти индекс минимального элемент массива. В первой строке вводится количество чисел в массиве n. Затем выводится массив, заданный случайным образом. В третьей строке выводится результат: индекс минимального элемент массива.

Исходные данные:

Результат:

10
5  -2  14  7  -4  23  0  8  6  -1

5

10
0  4  5  2  77  62  4  8  0  45

9

Если в задаче требуется найти индекс минимального (максимального), то вводим переменную imin, в которую будем запоминать индекс минимального (максимального), причем первоначально ее значение равно 1.

program min2;
var a:array[1..100] of integer;
i,min,n,imin:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do begin
a[i]:=random(-100,100);
write(a[i],’ ‘);
end;
//нахождение индекса минимального элемента массива
min:=a[1];
imin:=1;
for i:=2 to n do
if min>=a[i] then begin
imin:=i;
min:=a[i];
end;
//вывод результата
writeln;
write(imin);
end.

Если в массиве есть несколько равных между собой минимальных элементов, то данная программа найдет номер последнего (правого) элемента. Для того чтобы найти индекс первого (левого) элемента достаточно изменить знак  >= на строгий знак >.
Эту программу можно оптимизировать, так как, зная индекс минимального элемента, можно найти значение минимального элемента массива. Значит, переменная min не нужна:

var a:array[1..100] of integer;
i,n,imin:integer;

Фрагмент нахождения индекса минимального элемента массива выглядит так:

imin:=1;
for i:=2 to n do
if a[imin]>=a[i] then imin:=i;

Задача 3: Дан одномерный массив, состоящий из n целых чисел. Найти количество минимальных элементов массива. В первой строке вводится количество чисел в массиве n. Затем выводится массив, заданный случайным образом. В третьей строке выводится результат: количество минимальных элементов массива.

Исходные данные:

Результат:

10
5  -2  14  7  -4  23  0  8  -4  -1

2

10
0  4  5  2  77  0  4  8  0  45

3

program min3;
var a:array[1..100] of integer;
i,min,n,k:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do begin
a[i]:=random(-5,5);
write(a[i],’ ‘);
end;
//нахождение минимального элемента массива
min:=a[1];
for i:=2 to n do
if min>=a[i] then
min:=a[i];
//считаем количество равных элементов
k:=0;
for i:=1 to n do
if a[i]=min then k:=k+1;
//вывод результата
writeln;
write(k);
end.

Задача 4: Дан целочисленный массив из n элементов. Элементы массива могут принимать целые значения от 0 до 1000. Напишите программу, находящую минимальное значение среди элементов массива, которые имеют чётное значение и не делятся на четыре. Гарантируется, что в исходном массиве есть хотя бы один элемент, значение которого чётно и не кратно четырем. В первой строке вводится количество чисел в массиве n. Затем выводится массив, заданный случайным образом. В третьей строке выводится результат: минимальное значение среди элементов массива, которые имеют чётное значение и не делятся на четыре.

Исходные данные:

Результат:

10
5  -2  14  7  -4  22  0  -8  -6  -1

-6

10
0  4  5  -10  77  0  4  -12  0  45

-10

В этой задаче первый способ нахождения минимального не подойдет. Первый элемент массива может оказаться меньше, чем минимальный четный и не кратный четырем и программа выведет неверный результат. Каким должно быть начальное значение переменной min? Его нужно выбрать таким, чтобы для первого же «подходящего» элемента выполнилось условие a[i] < min, и это «временное» начальное значение было бы заменено на реальное. Такое «подходящее» обязательно будет, так как это гарантировано условием задачи. Оно должно быть большим и таким, какое не может быть по условию задачи, например, 1001.

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

Итак, находим минимальный элемент вторым способом.

2 способ

Записываем в переменную min значение 1001. Затем в цикле просматриваем все элементы массива, с первого до последнего. Если остаток от деления очередного элемента на 2 равен 0 и остаток от его деления на 4 не равен нулю и значение элемента меньше, чем значение переменной min, сохраняем в переменную min значение очередного элемента массива. После окончания работы цикла выводим значение переменной min.

program min4;
var a:array[1..100] of integer;
i,min,n:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do
readln(a[i]);
for i:=1 to n do
write(a[i],’ ‘);
//нахождение минимального элемента массива
min:=1001;
for i:=1 to N do
if (a[i] mod 2=0) and (a[i] mod 4 <> 0) and (a[i]<min) then
  min:=a[i];
//вывод результата
writeln;
write(min);
end.

Проверяем на тестах:

10
411 837 755 90 520 203 581 798 401 640

90

10
195 264 127 936 658 152 339 504 395 553

658

 Конечно, решить эту задачу можно и первым способом, но для нахождения первого значения min нужно написать дополнительные команды поиска. Вот таким может быть решение:

program min5;
var a:array[1..100] of integer;
i,min,n,j:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do
readln(a[i]);
for i:=1 to n do
write(a[i],’ ‘);
//нахождение первого четного и не кратного 4 числа
i:=1;
while (i<=n)and not((a[i] mod 2=0) and (a[i] mod 4 <> 0)) do i:=i+1;
//в переменной i запомнился номер первого элемента, удовлетворяющего условию
//нахождение минимального, начиная со следующего за найденным
min:=a[i];
for j:=i+1 to N do
if (a[j] mod 2=0) and (a[j] mod 4 <> 0) and (a[j]<min) then
  min:=a[j];
//вывод результата
writeln;
write(min);
end.

Задача 5: Дан целочисленный массив из n элементов. Элементы массива могут принимать произвольные целые значения. Напишите программу, которая находит и выводит второй максимум массива (элемент, который в отсортированном по невозрастанию массиве стоял бы вторым).

Исходные данные:

Результат:

10
5  -2  14  7  -4  22  0  -8  -6  -1

14

10
0  4  5  -10  77  0  4  -12  0  45

45

Мы знаем, как найти первый максимум, а в этой задаче нужно найти второй по величине максимум. Попробуем это сделать это за один проход по массиву. Нам нужны две переменные, max1 (максимальный элемент) и max2 (второй максимум). Сначала выбираем максимальный из первых двух элементов и записываем его значение в max1, а второй по величине записываем в max2.

Затем в цикле перебираем все элементы, начиная с 3-го до последнего. Если очередной элемент a[i] больше, чем max1, записываем значение max1 в max2 (предыдущий максимум становится вторым), а значение a[i] – в max1. Иначе, если a[i] больше, чем max2, записываем значение a[i] в max2. После завершения цикла выводим значение переменной max2.

program min6;
var a: array [1..100] of integer;
i, k,n, max1, max2: integer;
begin
  //заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do begin
a[i]:=random(0,100);
write(a[i],’ ‘);
end;
//начальные значения max1 и max2
if a[1] > a[2] then begin
max1:=a[1]; max2:=a[2]
end
else begin
max1:=a[2]; max2:=a[1]
end;
// поиск второго максимального
for i:=3 to N do
if a[i] > max1 then begin
max2:= max1;
max1:= a[i]
end
else
if a[i] > max2 then max2:=a[i];
//вывод результата
writeln;
writeln(max2);
end.

Задача 6: Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от 1 до 10000 включительно. Напишите программу, позволяющую найти и вывести минимальный элемент массива, шестнадцатеричная запись которого содержит ровно две цифры, причём первая (старшая) цифра больше второй (младшей).  Если таких чисел нет, нужно вывести ответ 0.

Исходные данные:

Результат:

20
5  -2  14  7  -4  22  0  -8  -6  -1

14

10
0  4  5  -10  77  0  4  -12  0  45

45

Эта задача усложнена только тем, что элементы массива должны быть в диапазоне от 16 до 255. В этом случае первая цифра находится как результат деления нацело на 16, а вторая цифра – как остаток от деления на 16.

Кроме этого здесь массив можно объявить через константу n, так как размер массива задан явно: 20 элементов.

program z6;
//объявление массива через константу
const n=20;
var a: array [1..n] of integer;
i,min: integer;
begin
  //заполнение массива и вывод массива в строчку
for i:=1 to n do begin
a[i]:=random(0,10000);
write(a[i],’ ‘);
end;
writeln;
min := 10001;
for i := 1 to n do begin
//для проверки правильности программы выведем две шестнадцатеричные цифры:
//write(a[i] div 16,a[i] mod 16,’ ‘);
if (16 <= a[i]) and (a[i] < 256) and (a[i] div 16 > a[i] mod 16) and (a[i] < min) then
    min := a[i];
end;
writeln;
//вывод результата
if min = 10001 then
  writeln(0)
else
  writeln(min);
end.

Задачи для самостоятельного решения:

  1. Дан целочисленный массив из n элементов. Элементы могут принимать значения от 150 до 210 ­– рост учащихся выпускного класса. В волейбольную команду берут тех, чей рост не менее 170 см. Напишите программу, которая определяет и выводит минимальный рост игрока баскетбольной команды. Гарантируется, что хотя бы один ученик играет в баскетбольной команде.
  2. Дан целочисленный массив из n элементов. Элементы массива могут принимать целые значения от 0 до 100 – баллы учащихся выпускного класса за экзамен по информатике. Для получения положительной оценки за экзамен требовалось набрать не менее 50 баллов. Напишите программу, которая находит и выводит минимальный балл среди учащихся, получивших за экзамен положительную оценку. Известно, что в классе хотя бы один учащийся получил за экзамен положительную оценку.
  3. Дан целочисленный массив – сведения о температуре за каждый день октября. Элементы массива могут принимать целочисленные значение значения от -15 до 20. Напишите программу, которая находит и выводит максимальную температуру среди дней, когда были заморозки (температура опускалась ниже нуля). Гарантируется, что хотя бы один день в октябре была отрицательная температура.
  4. Дан целочисленный массив из n элементов, все элементы которого – неотрицательные числа, не превосходящие 10000. Напишите программу, которая находит и выводит минимальное трехзначное число, записанное в этом массиве. Если таких чисел нет, нужно вывести сообщение «Таких чисел нет».
  5. Дан целочисленный массив из n элементов. Элементы массива могут принимать целые значения от 1 до 10000 включительно. Напишите программу, позволяющую найти и вывести наибольший из элементов массива, шестнадцатеричная запись которого оканчивается на букву F. Если таких чисел нет, нужно вывести ответ 0.
  6. Дан целочисленный массив из n элементов. Элементы массива могут принимать произвольные целые значения. Напишите программу, которая находит и выводит номера двух элементов массива, сумма которых минимальна.
  7. Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от 1 до 10000 включительно. Напишите программу, находящую минимальный элементов массива, шестнадцатеричная запись которого содержит ровно две цифры, причём вторая (младшая) цифра – это буква (от A до F). Если таких чисел нет, нужно вывести ответ 0.

Источники информации

  1. Угринович Н.Д. Информатика и информационные технологии. Учебник для 10-11 классов/ Н.Д. Угринович. – М.:Бином. Лаборатория знаний, 2005.
  2. Сайт К. Полякова http://kpolyakov.spb.ru/school/ege.htm

На занятии объясняется, как работать с одномерными массивами в Паскале, как использовать генератор случайных чисел — функцию random в Паскале. Рассматривается пример того, как вывести числа Фибоначчи

Материалы сайта labs-org.ru направлены на практическое освоение языка программирования Pascal. Краткие теоретические сведения не претендуют на полное освещение материала по теме; необходимую информацию можно найти в сети Интернет в большом количестве. В наши же задачи входит предоставление возможности получения практических навыков программирования на Паскале. Решенные наглядные примеры и задания изложены по мере увеличения их сложности, что позволит с легкостью изучить материал с нуля.

Содержание:

  • Одномерные массивы в Паскале
    • Объявление массива
    • Инициализация массива
    • Вывод элементов массива
    • Динамические массивы (pascalAbc.Net)
    • Функция Random в Pascal
    • Числа Фибоначчи в Паскале
    • Максимальный (минимальный) элемент массива
    • Поиск в массиве
    • Циклический сдвиг
    • Перестановка элементов в массиве
    • Выбор элементов и сохранение в другой массив
    • Сортировка элементов массива

Одномерные массивы в Паскале

Объявление массива

Массивы в Паскале используются двух типов: одномерные и двумерные.
Определение одномерного массива в Паскале звучит так: одномерный массив — это определенное количество элементов, относящихся к одному и тому же типу данных, которые имеют одно имя, и каждый элемент имеет свой индекс — порядковый номер.
Описание массива в Паскале (объявление) и обращение к его элементам происходит следующим образом:

Описание массива в Паскале

Объявление массива

var dlina: array [1..3] of integer;
begin
dlina[1]:=500; 
dlina[2]:=400; 
dlina[3]:=150;
...
  • dlina — идентификатор (имя) массива;
  • для объявления используется служебное слово Array (в переводе с англ. «массив» или «набор»);
  • [1..3] — в квадратных скобках ставится номер (индекс) первого элемента, затем две точки и индекс последнего элемента массива, т.е. по сути, указывается количество элементов; количество элементов массива называется размерностью массива
  • of integer (с англ. «из целых чисел») — указывает, к какому типу относится массив, of здесь — служебное слово.
  • Объявить размер можно через константу:

    размер массива через константу

    Инициализация массива

    Кроме того, массив может быть сам константным, т.е. все его элементы в программе заранее определены. Описание такого массива выглядит следующим образом:

    const a:array[1..4] of integer = (1, 3, 2, 5);

    Заполнение последовательными числами:
    заполнение массива

    Результат:
    A[1] = 8, A[2] = 9, A[3] = 10, ..., A[N] = A[N-1] + 1
    

    Ввод с клавиатуры:

    Пример: Рассмотрим, как происходит ввод массива в Паскале:

    writeln ('введите кол-во элементов: ');
    readln(n); {если кол-во заранее не известно, - запрашиваем его}
    for i := 1 to n do begin
       write('a[', i, ']=');
       read(a[i]);
       ...
    end;
    ...

    ввод массива с клавиатуры
    ✍ Пример результата:

    введите кол-во элементов: 
    3
    a[1]=5
    a[2]=7
    a[3]=4
    

    Вывод элементов массива

    Пример: Рассмотрим, как вывести массив в Паскале:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    var
      a: array[1..5] of integer; {массив из пяти элементов}
      i: integer;
    begin
    a[1]:=2;
    a[2]:=4;
    a[3]:=8;
    a[4]:=6;
    a[5]:=3;
    writeln('Массив A:');
    for i := 1 to 5 do
        write(a[i]:2); {вывод элементов массива}
    end.

    ✍ Пример результата:

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

    Задача Array 0. Необходимо задать вещественный массив размерностью 6 (т.е. из шести элементов); заполнить массив вводимыми значениями и вывести элементы на экран. Использовать два цикла: первый — для ввода элементов, второй — для вывода.

    Пример результата:

    введите элемент массива: 3.0
    введите элемент массива: 0.8
    введите элемент массива: 0.56
    введите элемент массива: 4.3
    введите элемент массива: 23.8
    введите элемент массива: 0.7
    Массив =  3, 0.8, 0.56, 4.3, 23.8, 0.7

    [Название файла: taskArray0.pas]

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

    Обработка массивов в Паскале, так же как и заполнение массива, происходит обычно с использованием цикла for.

    Динамические массивы (pascalAbc.Net)

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

  • Основной особенностью динамических массивов является возможность выделения для них памяти на любом этапе выполнения программы.
  • Имеется возможность корректировки размера динамического массива как в сторону его уменьшения, так и в сторону увеличения.
  • Объявление:

    var a: array of integer;
    var n:=readInteger;
    a:=new integer[n]; // инициализация, выделение памяти для элементов массива

    или:

    var a: array of integer;
    var n:=readInteger;
    SetLength(a,n); // устанавливаем размер

    Аналогичным образом массивы могут описываться в качестве параметров подпрограмм, например:

    procedure p(a: array of integer);

    Созданные элементы сразу получают начальное значение, равное нулевому значению соответствующего типа: для чисел это целый или вещественный нуль, для символов — символ с кодом 0, для строк и других ссылочных типов данных — нулевая ссылка nil

    Объявление и инициализация массива:

    Пример:

    begin
      var a: array of integer;
      a := new integer[3];
      a[0] := 5;
      a[1] := 2;
      a[2] := 3;
    end.

    или в одну строку:

    begin
      var a: array of integer;
      a := new integer[3](5,2,3);
      print(a)
    end.

    или короткая запись:

    var a:=Arr(1,2,3);// по правой части - integer

    Элементы динамического массива всегда индексируются от 0.

    Ввод элементов:

    Пример:

    var a:=ReadArrInteger(5); // ввод пяти целых
    var a:=ReadArrReal(5); // ввод пяти вещественных

    Функции генерации массивов:

    1. ArrFill :

    var a := ArrFill(10, 1); // массив из 10 целых чисел, равных 1

    2. ArrGen :

    var a := ArrGen(ReadInteger, 1, e -> e + 2); // массив, состоящий из n первых положительных нечетных чисел
    a.Print;

    Проход по элементам массива:

    Пример:

    for var i:=0 to a.Length-1 do
      a[i] += 1;

    или:

    for var i := 0 to a.High do
      a[i] += 1;

    Проход по элементам (только для чтения):
    Пример:

    foreach var x in a do
      Print(x)
  • Размер динамического массива (т. е. количество его элементов) можно определить с помощью его свойства Length
  • Для динамического массива определены еще два свойства: Low и High, определяющие соответственно нижнюю и верхнюю границу диапазона изменения индекса. Свойство a.Low всегда возвращает 0, а свойство a.High определяется как a.High = a.Length – 1
  • Простой вывод элементов:

    Writeln(a); // пример вывода: [1,5,3,13,20]

    или метод массива Print:

    a.Print; // пример вывода: 1 5 3 13 20
    a.PrintLines; // каждый элемент с новой строки

    Функция Random в Pascal

    Для того чтобы постоянно не запрашивать значения элементов массива используется генератор случайных чисел в Паскаль, который реализуется функцией Random. На самом деле генерируются псевдослучайные числа, но суть не в этом.

    Для генерации чисел от 0 до n (не включая само значение n, целые числа в интервале [0,N)) используется запись random (n).
    Перед использованием функции необходимо инициализировать датчик случайных чисел с помощью процедуры randomize.

    Диапазон в Паскале тех самых случайных чисел от a до b задается формулой:

    Пример: Заполнение массива случайными числами в Pascal:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    var f: array[1..10] of integer;
        i:integer;
    begin
    randomize;
    for i:=1 to 10 do
      begin
       f[i]:=random(10); { интервал [0,9] }   
       write(f[i],' ');
      end;
    end.

    ✍ Пример результата: 

    Для вещественных чисел в интервале [0,1):

    var x: real;
    ...
    x := random(0.0,1.0);;         { интервал [0,1), т.е. единица не включена }

    PascalABC.NET:

  • Сгенерированный случайным образом кортеж из двух (Random2), либо из трех (Random3) элементов:
  • var (a, b, c) := Random3(10.0, 20.0); // диапазон [10, 20)
    write(a:0:2,' ',b:0:2,' ', c:0:2) // 14.73 18.63 19.72
  • Массив из 10 сгенерированных случайным образом целых чисел в диапазоне [0;99]:
  • Пример:

    var a:=arrRandomInteger(10);

    или с дополнительными параметрами (диапазон [5;15]):

    var a:=arrRandomInteger(10,5,15);

    Задача Array 1. Необходимо задать массив размерностью 5, заполнить массив случайными числами в интервале [-1,1] и вывести элементы на экран: определить три позиции для вывода каждого элемента, с двумя знаками после запятой.

    Пример результата:

    Массив =  0.22 0.00 -0.69 -0.35 -0.11 

    [Название файла: taskArray1.pas]

    Числа Фибоначчи в Паскале

    Наиболее распространенным примером работы с массивом является вывод ряда чисел Фибоначчи в Паскаль. Рассмотрим его.

    Пример: Ряд чисел Фибоначчи: 1 1 2 3 5 8 13…

    f[0]:=1;   
    f[1]:=1; 
    f[2]:=2;

    или

    f[2]:=f[0]+f[1];
    f[3]:=f[1]+f[2];

    или

    Получили формулу элементов ряда.

    Пример: Вычислить и распечатать первые 20 чисел Фибоначчи.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    var i:integer;
    f:array[0..19]of integer;
    begin
    f[0]:=1;
    f[1]:=1;
    for i:=2 to 19 do
    begin
      f[i]:=f[i-1]+f[i-2];
      writeln(f[i])
    end;
    end.

    На данном примере, становится понятен принцип работы с числовыми рядами. Обычно, для вывода числового ряда находится формула определения каждого элемента данного ряда. Так, в случае с числами Фибоначчи, эта формула-правило выглядит как f[i]:=f[i-1]+f[i-2]. Поэтому ее необходимо использовать в цикле for при формировании элементов массива.

    Задача Array 2. Дан ряд из 10 произвольных чисел: a[1], a[2], ... , a[10] (использовать функцию random()). Подсчитать и напечатать суммы троек стоящих рядом чисел: a[1]+a[2]+a[3], a[2]+a[3]+a[4], a[3]+a[4]+a[5], …… , a[8]+a[9]+a[10]

    Пример результата:

    Массив =  2 0 4 29 3 11 26 11 9 4 
    mas[1] + mas[2] + mas[3] = 6
    mas[2] + mas[3] + mas[4] = 33
    mas[3] + mas[4] + mas[5] = 36
    mas[4] + mas[5] + mas[6] = 43
    mas[5] + mas[6] + mas[7] = 40
    mas[6] + mas[7] + mas[8] = 48
    mas[7] + mas[8] + mas[9] = 46
    mas[8] + mas[9] + mas[10] = 24

    [Название файла: taskArray2.pas]

    Задача Array 3. Написать программу решения задачи о печати ряда чисел 2 4 8 16 32 ... 512; для заполнения массива использовать цикл Repeat
    [Название файла: taskArray3.pas]

    Максимальный (минимальный) элемент массива

    Псевдокод:
    Максимальный (минимальный) элемент массива

    Поиск максимального элемента по его индексу:
    максимальный элемент по номеру


    PascalABC.NET:

    Минимальный элемент и его индекс:

    Решение 1:

      // …
      var (min, minind) := (a[0], 0);  
      for var i:=1 to a.Length-1 do
        if a[i]<min then
          (min, minind) := (a[i], i);  Result := (min, minind);

    Решение 2:

      // …
      var (min, minind) := (real.MaxValue, 0);  
      for var i:=0 to a.Length-1 do
        if a[i]<min then
          (min, minind) := (a[i], i);  Result := (min, minind);

    Решение 3:

    begin
      var a := new integer[5];
      a := arrRandomInteger(5); // [86,37,41,45,76] 
      print(a.Min,a.IndexMin); // 37  1
    end.

    Задача Array_min: Найдите минимальный элемент массива. Выведите элемент и его индекс.

    Пример результата:

    9 5 4 22 23 7 3 16 16 8 
    Минимальный элемент массива A[7]=3
    

    [Название файла: taskArray_min.pas]

    Задача Array 4. Дан массив из 10 целочисленных элементов. Найти количество отрицательных и вывести количество на экран.

    Пример результата:

    3 4 6 -1 6 -2 1 5 0 1 
    Количество отрицательных элементов: 2
    

    [Название файла: taskArray4.pas]

    Задача Array 5. Найти минимальное и максимальное из n введенных чисел (массива). Определить расстояние между этими элементами.

    3  2  6  1  3  4  7  2  >>>  min=1, max=7, distance=3
    

    [Название файла: taskArray5.pas]

    Задача Array 6. Дан целочисленный массив размера N. Вывести все содержащиеся в данном массиве четные числа в порядке убывания их индексов, а также их количество K.

    N=4
    mas: 8 9 2 5
    >>> 2 8 количество= 2
    

    [Название файла: taskArray6.pas]

    Задача Array 7. Ввести с клавиатуры массив из 5 элементов, найти в нем два максимальных элемента и их номера.

    Пример:

    Исходный массив:
    4   -5   10  -10  5
    максимальные A[3]=10, A[5]=5
    

    [Название файла: taskArray7.pas]

    Поиск в массиве

    Рассмотрим сложный пример работы с одномерными массивами:

    Пример: Дан массив из 10 чисел. Определить, есть ли в массиве число, введенное пользователем. Если есть – выводить «найдено», если нет – «не найдено».
    Сложность задания заключается в том, что выводить слова «найдено» или «не найдено» необходимо один раз.

    Для решения поставленной задачи понадобится оператор break — выход из цикла.
    Решение Вариант 1. Цикл for:


    PascalABC.NET:

    Cтандартные методы a.IndexOf(x) и a.LastIndexOf(x):

    begin
      var a := new integer[10];
      a := arrRandomInteger(5,0,5); //[1,3,5,4,5] 
      print(a.IndexOf(3)) // 1
    end.

    или метод a.Contains(x) наравне с x in a:

    begin
      var a := new integer[10];
      a := arrRandomInteger(5,0,5); //[1,3,5,4,5] 
      print(a.Contains(3)); // True
      print(3 in a)// True
    end.

    Рассмотрим эффективное решение:

    Задача: найти в массиве элемент, равный X, или установить, что его нет.

    Алгоритм:

    • начать с 1-го элемента (i:=1);
    • если очередной элемент (A[i]) равен X, то закончить поиск иначе перейти к следующему элементу.

    решение на Паскале Вариант 2. Цикл While:

    Поиск элемента в массиве

    Поиск элемента в массиве

    Предлагаем посмотреть подробный видео разбор поиска элемента в массиве (эффективный алгоритм):

    Задача Array 8. Заполнить массив из 10 элементов случайными числами в интервале [0..4] и вывести номера всех элементов, равных X.

    Пример:

    	 Исходный массив:
    	 4  0  1  2  0  1  3  4  1  0
    	 Что ищем? 0
    	 A[2], A[5], A[10]
    

    [Название файла: taskArray8.pas]

    Циклический сдвиг

    Пример: сдвинуть элементы массива влево на 1 позицию, первый элемент становится на место последнего.
    циклический сдвиг

    Решение:

    Алгоритм:
    A[1]:=A[2]; A[2]:=A[3];… A[N-1]:=A[N];

    Программа:
    сдвиг элементов массива


    PascalABC.NET:

    Циклический сдвиг влево:

      // …
      var v := a[0];
      for var i:=0 to a.Length-2 do
        a[i] := a[i+1];
      a[a.Length-1] := v;

    Циклический сдвиг вправо:

      // …
      var v := a[a.Length-1];
      for var i:=a.Length-1 downto 1 do
        a[i] := a[i-1];
      a[0] := v;

    Задача Array 9. Заполнить массив из 10 элементов случайными числами в интервале [-10..10] и выполнить циклический сдвиг влево без первого элемента.
    Пример:

    Исходный массив:
      4  -5   3  10  -4  -6   8 -10  1  0
    Результат:
      4   3  10  -4  -6   8 -10   1  0 -5
    

    [Название файла: taskArray9.pas]

    Перестановка элементов в массиве

    Рассмотрим, как происходит перестановка или реверс массива.

    Пример: переставить элементы массива в обратном порядке
    реверс массива

    Решение:

    Алгоритм:
    алгоритм перестановки элементов массива

    Псевдокод:
    2

    Программа:
    перестановка элементов массива


    PascalABC.NET:

    Перестановка (ревёрс):

    Решение 1:

    begin
    var a: array of integer := (1,3,5,7); 
    var n := a.Length;
    for var i:=0 to n div 2 - 1 do
        Swap(a[i],a[n-i-1]);
    End.

    Решение 2 (стандартная процедура Reverse()):

    begin
    var a:=new integer[10];
    a:=arrRandomInteger(10);
    print(a);// [41,81,84,63,12,26,88,25,36,72] 
    Reverse(a);
    print(a) //[72,36,25,88,26,12,63,84,81,41] 
    end.

    Задача Array 10. Заполнить массив из 10 элементов случайными числами в интервале [-10..10] и сделать реверс всех элементов, кроме последнего.
    Пример:

     Исходный массив:
    -5  3   10  -4  -6   8 -10  1   0  4
     Результат:
    0  1  -10   8  -6  -4  10  3  -5  4
    

    [Название файла: taskArray10.pas]

    Выбор элементов и сохранение в другой массив

    Пример: найти в массиве элементы, удовлетворяющие некоторому условию (например, отрицательные), и скопировать их в другой массив
    выбор элементов массива

    Решение:

    Решение: подсчитывать количество найденных элементов с помощью счетчика count, очередной элемент устанавливать на место B[count]. Переменой count необходимо присвоить 1.

    сохранение элементов массива в другой
    Вывод массива B:

    writeln('Выбранные элементы');
    for i:=1 to count-1 do
       write(B[i], ' ')

    PascalABC.NET:

    Процедура SetLength():

    // ...
    for var i := 0 to a.length - 1 do 
        if a[i] < 0 then
        begin
          b[j] := a[i];
          j += 1;
        end;
      SetLength(b, j);

    Задача Array 11. Заполнить массив случайными числами в интервале [20,100] и записать в другой массив все числа, которые оканчиваются на 0.
    Пример:

    	 Исходный массив:
    	 40   57   30  71  84
    	 Заканчиваются на 0:
    	 40 30
    

    [Название файла: taskArray11.pas]

    Сортировка элементов массива

    Сортировка методом «Пузырька»

    • В таком типе сортировок массив представляется в виде воды, маленькие элементы — пузырьки в воде, которые всплывают наверх (самые легкие).
    • При первой итерации цикла элементы массива попарно сравниваются между собой:предпоследний с последним, пред предпоследний с предпоследним и т.д. Если предшествующий элемент оказывается больше последующего, то производится их обмен.
    • При второй итерации цикла нет надобности сравнивать последний элемент с предпоследним. Последний элемент уже стоит на своем месте, он самый большой. Значит, число сравнений будет на одно меньше. То же самое касается каждой последующей итерации.

    сортировка методом пузырька

    Pascal PascalABC.NET
    1
    2
    3
    4
    5
    6
    7
    8
    
    for i:=1 to N-1 do begin
       for j:=N-1 downto i do
         if A[j] > A[j+1] then begin
           с := A[j];
           A[j] := A[j+1];
           A[j+1] := с;
         end;
     end;
    1
    2
    3
    4
    
    for var i := 0 to arr.High - 1 do
        for var j := arr.High - 1 downto i do
          if arr[j] > arr[j + 1] then 
            Swap(arr[j], arr[j + 1]);

    Задача Array 12. Заполнить массив из 10 элементов случайными числами в интервале [0..100] и отсортировать первую половину массива по возрастанию, а вторую – по убыванию (методом ‘Пузырька’).

    Пример:
    Исходный массив:
    14  25  13  30  76  58  32  11  41  97
    Результат:
    13  14  25  30  76  97  58  41  32  11

    [Название файла: taskArray12.pas]

    Сортировка методом выбора

    • в массиве ищется минимальный элемент и ставится на первое место (меняется местами с A[1]);
    • среди оставшихся элементов также производится поиск минимального, который ставится на второе место (меняется местами с A[2]) и т.д.

    сортировка методом вставки

    Pascal PascalABC.NET
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    for i := 1 to N-1 do begin
      min:= i ;
      for j:= i+1 to N do
        if A[j] < A[min] then min:=j; 
      if min <> i then begin
        c:=A[i]; 
        A[i]:=A[min]; 
        A[min]:=c;
      end;
    end;
    1
    2
    3
    4
    5
    6
    7
    8
    
    for var i := 0 to a.High-1 do
      begin
        var (min,imin) := (a[i],i);
        for var j := i + 1 to a.High do
          if a[j] < min then
            (min,imin) := (a[j],j);
        Swap(a[imin],a[i]);
      end;

    Задача Array 13: Заполнить массив из 10 элементов случайными числами в интервале [0..50] и отсортировать его по возрастанию суммы цифр

    Пример:
    Исходный массив:
    14  25  13  12  76  58  21  87  10  98
    Результат:
    10  21  12  13  14  25  76  58  87  98  
    

    [Название файла: taskArray13.pas]


    PascalABC.NET:

    Стандартная процедура sort():

    Sort(a);
    SortByDescending(a);

    Быстрая сортировка или quick sort

    Алгоритм:

    1. Выбирается и запоминается средний элемент массива (присвоим X):
    2. быстрая сортировка

    3. Инициализируем две переменные (будущие индексы массива): L:=1, R:=N (N — количество элементов).
    4. Увеличиваем L и ищем первый элемент A[L], который больше либо равен X (в итоге он должен находиться справа).
    5. Уменьшаем R и ищем элемент A[R], который меньше либо равен X (в итоге он должен находиться слева).
    6. Смотрим, если L<=R, то меняем местами A[L] и A[R], возвращаемся к пункту 3.

    быстрая сортировка паскаль

    Выполнение на Паскале:
    1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    procedure QSort ( first, last: integer);
    var L, R, c, X: integer;
    begin
      if first < last then begin
        X:= A[(first + last) div 2];
        L:= first; R:= last;
     while L <= R do begin
       while A[L] < X do L:= L + 1;
       while A[R] > X do R:= R - 1;
       if L <= R then begin
         c:= A[L]; A[L]:= A[R]; A[R]:= c;
         L:= L + 1; R:= R - 1;
       end;
     end;
      QSort(first, R);   QSort(L, last);
      end;
    end.

    Задача Array 14:
    Заполнить массив из 10 элементов случайными числами в интервале [-50..50] и отсортировать его с помощью алгоритма быстрой сортировки.

    [Название файла: taskArray14.pas]

    13.1. Поиск максимального (минимального) элемента в массиве

    Очень часто для решения задачи требуется находить не заданный элемент массива, а максимальный (наибольший) или минимальный (наименьший) элемент.

    Рассмотрим задачу нахождения максимального элемента. Если в массиве один-единственный элемент, то он и есть максимальный. Если элементов больше одного, то максимальным в массиве из i элементов является максимум из a[i] и максимального среди первых i — 1 элементов. Находить максимум будем последовательно, сравнивая текущий элемент с максимумом, найденным на предыдущем шаге. Если текущий элемент больше, то значение максимума, найденное на предыдущем шаге, нужно обновить (пример 13.1).

    Данный алгоритм находит значение максимального элемента, но не позволяет определить, на каком месте в массиве расположен этот максимальный элемент.

    Будем использовать переменную n_max для хранения индекса максимального элемента. Значение переменной n_max будет изменятся тогда, когда изменяется значение максимального элемента (пример 13.2).

    Если в массиве несколько элементов имеют максимальное значение, то значением переменной n_max будет индекс первого из них. Если использовать условие a[i] >= max, то переменная n_max будет хранить индекс последнего из максимальных элементов.

    Если известен индекс i элемента массива, то значение этого элемента можно получить, обратившись к элементу по индексу: a[i]. Поэтому при поиске максимального элемента достаточно хранить только его индекс n_max. Значение максимального элемента — a[n_max] (пример 13.3).

    Поиск минимального элемента осуществляется аналогично. В программе достаточно заменить знак > в условии оператора ветвления на знак < (пример 13.4). Имя переменной для хранения номера минимального элемента — n_min.

    Пример 13.1.

    V. Программа:

    #include <iostream>

    #include <vector>

    using namespace std;

    int main()

    {

      int n;

      cout << «n = «;

      cin >> n;

      vector <int> a(n);

      for (int i = 0; i < n; i++)

        cin >> a[i];

      //поиск максимального элемента

      int Max = a[0];

      for (int i = 1; i < n; i++)

        if (a[i] > Max)

          Max = a[i];

      cout << «max = « << Max;

      cout << endl;

      return 0;

    }

    VI. Тестирование.

    Пример 13.2.

    V. Программа:

    #include <iostream>

    #include <vector>

    using namespace std;

    int main()

    {

      int n;

      cout << «n = «;

      cin >> n;

      vector <int> a(n);

      for (int i = 0; i < n; i++)

        cin >> a[i];

      //поиск максимального элемента

      int Max = a[0], n_max = 0;

      for (int i = 1; i < n; i++)

        if (a[i] > Max){

          Max = a[i];

          n_max = i;

        }

      cout << «max = « << Max;

      cout << » ego mesto « << n_max;

      cout << endl;

      return 0;

    }

    VI. Тестирование.

    Пример 13.3. Фрагмент программы:

    int n_max = 0;

    for (int i = 1; i < n; i++)

      if (a[i] > a[n_max])

        n_max = i;

    cout << «max = « << a[n_max];

    cout << » ego mesto « << n_max;

    Пример 13.4. Фрагмент программы:

    int n_min = 0;

    for (int i = 1; i < n; i++)

      if (a[i] < a[n_min])

        n_min = i;

    13.2. Решение задач с использованием алгоритма поиска максимального (минимального) элементов

    Пример 13.5. В массиве хранится информация о результатах спортсменов, участвовавших в лыжной гонке. Определить результат победителя и его номер. Данные прочитать из текстового файла.

    Этапы выполнения задания

    I. Исходные данные: массив a — числа, являющиеся временем прохождения трассы, количество спортсменов — n.

    II. Результат: a[n_min] — минимальное время, n_min — номер победителя.

    III. Алгоритм решения задачи.

    1. Ввод исходных данных.
    2. 
    Для решения задачи воспользуемся алгоритмом поиска минимального элемента в массиве и его номера (пример 13.4).
    3. 
     Вывод результата. Номер лыжника на 1 больше номера элемента в массиве, поскольку элементы нумеруются с нуля.

    IV. Описание переменных: n, n_min – int, а – vector <double>.

    Пример 13.6. Определить, сколько раз в линейном массиве встречается элемент, равный минимальному.

    Этапы выполнения задания

    I. Исходные данные: массив а, количество чисел n.

    II. Результат: a[n_min] — минимальный элемент, k — количество минимальных.

    III. Алгоритм решения задачи.

    1. Ввод исходных данных. 
    2. Поиск минимального элемента. 
    3. Линейный поиск элементов, равных минимальному. 
    4. Вывод результата.

    IV. Описание переменных: n, n_min, k — int, а – vector <int>.

    Пример 13.7. Задан массив из слов. Найти в нем самое длинное и самое короткое слово.

    Этапы выполнения задания

    I. Исходные данные: массив а, количество cлов n.

    II. Результат: a[n_min] — короткое слово, a[n_max] — длинное слово.

    III. Алгоритм решения задачи.

    1. Ввод исходных данных. 
    2. Поиск самого короткого слова. Самое короткое слово — слово, в котором минимальное количество символов. Для его поиска можно воспользоваться алгоритмом поиска минимального элемента в массиве. Однако, если сравнивать сами элементы массива, то сравнение будет происходить не по длине [1]. Для сравнения строк по длине нужно использовать функцию для вычисления длины строки length
    3. Для поиска самого длинного слова можно использовать алгоритм поиска максимального элемента и сравнивать элементы с использованием функции,  вычисляющей длину строки length
    4. Вывод результата.

    IV. Описание переменных: n, n_min, n_max – int, а – vector <string>.


    [1] Сравнение строк осуществляется лексикографически: s1 < s2, если для первого несовпадающего символа с номером i верно, что s1[i] < s2[i], или все символы строк совпадают, но s1 короче s2.

    Пример 13.5.

    V. Программа:

    #include <iostream>

    #include <fstream>

    #include <vector>

    using namespace std;

    int main()

    {

      setlocale(0,«»);

      ifstream fin(«input.txt»);

      int n;

      fin >> n;

      vector <double> a(n);

      for (int i = 0; i < n; i++)

        fin >> a[i];

      //поиск минимального элемента

      int n_min = 0;

      for (int i = 1; i < n; i++)

        if (a[i] < a[n_min])

          n_min = i;

      cout << «победительлыжник №»;

      cout << n_min + 1 << endl;

      cout << «его время — «<< a[n_min];

      cout << endl;

      return 0;

    }

    IV. Тестирование.

    Пример 13.6.

    V. Программа:

    #include <iostream>

    #include <vector>

    using namespace std;

    int main()

    {

      int n;

      cout << «n = «;

      cin >> n;

      vector <int> a(n);

      for (int i = 0; i < n; i++)

        cin >> a[i];

      //поиск минимального элемента

      int n_min = 0;

      for (int i = 1; i < n; i++)

        if (a[i] < a[n_min])

          n_min = i;

      //подсчет количества

      int k = 0;

      for (int i = 0; i < n; i++)

        if (a[i] == a[n_min])

          k++;

      cout << «min = «<< a[n_min];

      cout << endl << «vstretilsja «;

      cout << k << » raz» << endl;

      return 0;

    }

    VI. Тестирование.

    Пример 13.7.

    V. Программа:

    #include <iostream>

    #include <vector>

    #include <string>

    using namespace std;

    using namespace std::__cxx11;

    int main()

    {

      int n;

      cout << «n = «;

      cin >> n;

      vector <string> a(n);

      for (int i = 0; i < n; i++)

        cin >> a[i];

      //поиск минимального слова

      int n_min = 0;

      for (int i = 1; i < n; i++)

        if (a[i].length() < a[n_min].length())

          n_min = i;

      //поиск максимального слова

      int n_max = 0;

      for (int i = 1; i < n; i++)

        if (a[i].length() > a[n_max].length())

          n_max = i;

      cout << «min — «<< a[n_min];

      cout << «, max — «<< a[n_max];

      cout << endl;

      return 0;

    }

    VI. Тестирование.

    Вопросы к параграфу

    1. Какой элемент массива является максимальным? Какой минимальным?

    2. Как найти максимальный элемент в массиве?

    3. Как найти минимальный элемент?

    4. Каким образом определить номер первого элемента, равного максимальному?

    5. Как определить номер последнего элемента, равного минимальному?

    Упражнения

        

    1. Измените программы из примеров 13.1 и 13.2 так, чтобы находился минимальный элемент в массиве.

    2. Для примера 13.5 выполните перечисленные задания.

    1. Найдите номер спортсмена, пришедшего на финиш последним. 
    2. Определите, был ли победитель единственным или есть еще лыжник, прошедший трассу с таким же результатом (см. пример 13.6). 
    3. Добавьте еще один массив и введите в него фамилии спортсменов. Реализуйте пункты 1 и 2 так, чтобы выводилась фамилия, а не номер (см. пример 12.9).

    3. Напишите программу, которая заменит в массиве нулями все элементы, равные минимальному.

    4. Напишите программу, которая заменит в массиве нулями все элементы, стоящие перед максимальным. Предполагается, что в массиве единственный максимальный элемент.

    5. Напишите программу, которая заменит нулями все элементы в массиве, стоящие после минимального. Если минимальных элементов несколько, то заменять нужно элементы, стоящие после последнего минимального.

    6. Напишите программу, которая определит, какой из элементов — минимальный или максимальный — встречается в массиве раньше (имеет меньший индекс).

    7. Напишите программу, которая определит, какой из элементов — минимальный или максимальный — встречается в массиве чаще.

    8. Напишите программу, которая запишет в новый массив те элементы из исходного, которые расположены между минимальным или максимальным (по индексам).

    9. В массиве хранится информация о стоимости автомобилей. Определите стоимость самого дорогого автомобиля и его номер в массиве. Если есть несколько таких автомобилей, то выведите все номера.

    10. В массиве хранится информация о среднесуточной температуре декабря. Определите, сколько в декабре было дней с самой низкой и с самой высокой температурой.

    11. Размеры n прямоугольников хранятся в двух массивах (длина и ширина). Найдите прямоугольник с минимальным периметром. (Вывести номер прямоугольника и значение периметра.)

    12. Известны данные о массе (в кг) и объеме (в см3) n предметов, изготовленных из различных материалов. Найдите предметы с минимальной и максимальной плотностями. Вывести номер предмета и значение плотности.

    13. Задан массив из слов. Найдите в нем самое длинное слово, заканчивающееся буквой «а».

    14. Задан массив из слов. Найдите в нем самое короткое слово, начинающееся с заглавной буквы.

    15. Задан массив из слов. Найдите в нем слово, в котором максимальное количество гласных букв. Если таких слов несколько, выведите все.

    16. Задан массив из слов. Найдите в нем слово, в котором минимальное количество согласных букв. Если таких слов несколько, то выведите самое длинное из них.

    Самый простой способ

    Разумеется, проще всего получить минимальный и максимальный элементы массива с помощью функций min() и max():

    $arr = [8, 4, 12, 9];
    $max = max($arr); // 12
    $min = min($arr); // 4

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

    Условия задачи

    1. Найти наибольший наименьший элементы в одномерном числовом массиве.
    2. Определить номер минимального и максимального элементов заданного одномерного массива.
    3. Найти минимальное и максимальное значение в ассоциативном массиве.

    Общий принцип поиска элементов

    Во всех решениях мы будем использовать одну и ту же логику.

    Согласно условию, нам необходимо объявить числовой массив произвольной длины. Также объявим 4 переменные, в которые будем помещать найденные значения и их ключи:

    <?php
    $arr = [12, 4, 182, 1, 2.587];
    $min = null;
    $min_key = null;
    $max = null;
    $max_key = null;

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

    И если больше — будем записывать в $max новое максимальное значение, а в $max_key его ключ. Абсолютно также поступим и с минимальными ключом и значением.

    Пример с циклом foreach:

    foreach($arr as $k => $v)
    {
    	if($v > $max)
    	{
    		$max = $v;
    		$max_key = $k;
    	}
    
    	if($v < $min)
    	{
    		$min = $v;
    		$min_key = $k;
    	}
    }

    На данном этапе наш код уже будет работать, но это ещё не всё. Попробуем изменить исходный массив и посмотрим на результат:

    <?php
    $arr = [0, -12];
    $max = null;
    
    foreach($arr as $v)
    {
    	if($v > $max)
    		$max = $v;
    }
    
    var_dump($max); // -12

    Максимальным должно быть число 0, но скрипт вывел -12. Дело в том, что PHP не считает истинным выражение 0 > null, поэтому ноль на первой итерации цикла не записался в переменную $max.

    Для решения этой проблемы просто добавим условие, что если $max === null, т.е. если это первая итерация, то в любом случае записываем текущее значение в $min и $max:

    <?php
    $arr = [0, -12];
    $max = null;
    
    foreach($arr as $v)
    {
        if($v > $max or $max === null)
            $max = $v;
    }
    
    var_dump($max); // -12

    Минимальный и максимальный элементы с циклом FOREACH

    Решение:

    <?php
    $arr = [12, 4, 182, 1, 2.587];
    $min = null;
    $min_key = null;
    $max = null;
    $max_key = null;
    
    foreach($arr as $k => $v)
    {
    	if($v > $max or $max === null)
    	{
    		$max = $v;
    		$max_key = $k;
    	}
    
    	if($v < $min or $min === null)
    	{
    		$min = $v;
    		$min_key = $k;
    	}
    }
    
    echo "Min value: $min <br> Min key: $min_key <br>";
    echo "Max value: $max <br> Max key: $max_key";

    Минимальный и максимальный элементы с циклом WHILE

    Решение 1: счётчик + count()

    Цикл будет выполняться до тех пор, пока значение счётчика $i не превысит количество элементов массива.

    <?php
    $arr = [12, 4, 182, 1, 2.587];
    $min = null;
    $min_key = null;
    $max = null;
    $max_key = null;
    $i = 0;
    
    while($i < count($arr))
    {
        if($arr[$i] > $max or $max === null)
        {
            $max = $arr[$i];
            $max_key = $i;
        }
    
        if($arr[$i] < $min or $min === null)
        {
            $min = $arr[$i];
            $min_key = $i;
        }
    
    	$i++;
    }
    
    echo "Min value: $min <br> Min key: $min_key <br>";
    echo "Max value: $max <br> Max key: $max_key";

    Решение 2: счётчик + isset()

    Запускаем вечный цикл while и в каждой итерации цикла проверяем существование следующего элемента с помощью isset(). Если его нет — выходим из цикла оператором break:

    <?php
    $arr = [12, 4, 182, 1, 2.587];
    $min = null;
    $min_key = null;
    $max = null;
    $max_key = null;
    $i = 0;
    
    while(true)
    {
    	if(isset($arr[$i]))
    	{
    		if($arr[$i] > $max or $max === null)
    		{
    			$max = $arr[$i];
    			$max_key = $i;
    		}
    
    		if($arr[$i] < $min or $min === null)
    		{
    			$min = $arr[$i];
    			$min_key = $i;
    		}
    	}
    	else
    		break;
    
    	$i++;
    }
    
    echo "Min value: $min <br> Min key: $min_key <br>";
    echo "Max value: $max <br> Max key: $max_key";

    Решение 3: list() + each()

    Функция each() возвращает ключ и значение текущего элемента массива и смещает его внутренний указатель на единицу. Функция list() используется просто для удобства — с её помощью мы превращаем массив, который возвращает функция each, в две разные переменные:

    <?php
    $arr = [12, 4, 182, 1, 2.587];
    $min = null;
    $min_key = null;
    $max = null;
    $max_key = null;
    $i = 0;
    
    while(list($k, $v) = each($arr))
    {
    	if($v > $max or $max === null)
    	{
    		$max = $v;
    		$max_key = $k;
    	}
    
    	if($v < $min or $min === null)
    	{
    		$min = $v;
    		$min_key = $k;
    	}
    }
    
    echo "Min value: $min <br> Min key: $min_key <br>";
    echo "Max value: $max <br> Max key: $max_key";

    Получился практически аналог foreach. Единственный минус в том, что начиная с PHP 7.2 функция each() объявлена устаревшей.

    Решение 4: current() + next()

    Это решение похоже на предыдущее с each(). Получаем текущий элемента массива функцией current() и смещаем внутренний указатель массива функцией next(). Получить текущий ключ массива можно с помощью функции key().

    <?php
    $arr = [12, 4, 182, 1, 2.587];
    $min = null;
    $min_key = null;
    $max = null;
    $max_key = null;
    $i = 0;
    
    while($v = current($arr))
    {
    	if($v > $max or $max === null)
    	{
    		$max = $v;
    		$max_key = key($arr);
    	}
    
    	if($v < $min or $min === null)
    	{
    		$min = $v;
    		$min_key = key($arr);
    	}
    
    	next($arr);
    }
    
    echo "Min value: $min <br> Min key: $min_key <br>";
    echo "Max value: $max <br> Max key: $max_key";

    Наибольший и наименьший элементы с циклом FOR

    Решение 1: счётчик + count()

    Вводим счётчик $i и увеличиваем его после каждой итерации. Цикл прекратится как только значение счётчика превысит количество элементов массива.

    <?php
    $arr = [12, 4, 182, 1, 2.587];
    $min = null;
    $min_key = null;
    $max = null;
    $max_key = null;
    
    for($i = 0; $i < count($arr); $i++)
    {
        if($arr[$i] > $max or $max === null)
        {
            $max = $arr[$i];
            $max_key = $i;
        }
    
        if($arr[$i] < $min or $min === null)
        {
            $min = $arr[$i];
            $min_key = $i;
        }
    }
    
    echo "Min value: $min <br> Min key: $min_key <br>";
    echo "Max value: $max <br> Max key: $max_key";

    Решение 2: счётчик + isset()

    В отличие от предыдущего варианта, мы не смотрим на количество элементов массива, а запускаем вечный цикл и в каждой итерации проверяем существование следующего элемента, и если его нет — прерываем цикл командой break:

    <?php
    $arr = [12, 4, 182, 1, 2.587];
    $min = null;
    $min_key = null;
    $max = null;
    $max_key = null;
    
    for($i = 0; true; $i++)
    {
    	if(!isset($arr[$i]))
    		break;
    
        if($arr[$i] > $max or $max === null)
        {
            $max = $arr[$i];
            $max_key = $i;
        }
    
        if($arr[$i] < $min or $min === null)
        {
            $min = $arr[$i];
            $min_key = $i;
        }
    }
    
    echo "Min value: $min <br> Min key: $min_key <br>";
    echo "Max value: $max <br> Max key: $max_key";

    Решение 3: each() + list()

    Функция each() возвращает массив с ключом и значением текущего элемента массива, а list() превращает этот массив в 2 разные переменные. После последнего элемента функция each() вернёт false и цикл прекратит работу.

    <?php
    $arr = [12, 4, 182, 1, 2.587];
    $min = null;
    $min_key = null;
    $max = null;
    $max_key = null;
    $i = 0;
    
    for(; list($k, $v) = each($arr);)
    {
        if($v > $max or $max === null)
        {
            $max = $v;
            $max_key = $k;
        }
    
        if($v < $min or $min === null)
        {
            $min = $v;
            $min_key = $k;
        }
    }
    
    echo "Min value: $min <br> Min key: $min_key <br>";
    echo "Max value: $max <br> Max key: $max_key";

    Решение 4: current() + next()

    С помощью функции next() смещаем внутренний указатель массива, а функции current() и key() возвращают текущие ключ и значение. Первое и последнее выражение цикла оставляем пустыми.

    <?php
    $arr = [12, 4, 182, 1, 2.587];
    $min = null;
    $min_key = null;
    $max = null;
    $max_key = null;
    $i = 0;
    
    for(; $v = current($arr);)
    {
    	if($v > $max or $max === null)
    	{
    		$max = $v;
    		$max_key = key($arr);
    	}
    
    	if($v < $min or $min === null)
    	{
    		$min = $v;
    		$min_key = key($arr);
    	}
    
    	next($arr);
    }
    
    echo "Min value: $min <br> Min key: $min_key <br>";
    echo "Max value: $max <br> Max key: $max_key";

    Максимальное значение в ассоциативном массиве

    В ассоциативных массивах отсутствует порядок или системность в названиях ключей, поэтому циклы со счётчиками здесь недоступны.

    Но мы всё ещё можем использовать цикл foreach и те решения для while и for, где используются функции each() и next(), поскольку они используют не ключи, а внутренний указатель массива.

    Пусть
    требуется найти минимальный элемент
    (min)
    и его индекс (n_min)
    во всем массиве (in=0
    и ik=n
    ) или
    какой-то его части (с in
    – го по ik –
    ый). В этом
    случаи алгоритм решения задачи можно
    записать так:

    1. в
      качестве начального значения переменной
      min
      выберем любой из рассматриваемых
      элементов (обычно выбирают первый).
      Тогда min=ain,
      n_min= in;

    2. затем
      в цикле по параметру i,
      начиная со следующего элемента (i=in+1,
      …, ik
      ), будем
      сравнивать элементы массива ai
      с текущим минимальным min.
      Если окажется, что текущий (i
      – ый
      ) элемент
      массива меньше минимального (ai
      < min
      ), то
      переменная min
      принимает значение ai,
      а n_min
      – на i,
      т.е. min=ai,
      n_min=
      i.

    Графическая схема
    алгоритма и фрагмент программы поиска
    минимального элемента в массиве приведены
    на рис. 6.12.

    min=a[in];

    n_min=in;

    for(i=in+1;
    i<ik; i++)

    if(a[i]<min)

    {

    min=a[i];

    n_min=i;

    }

    Рис.
    6.12
    Графический
    алгоритм и фрагмент программы поиска
    минимального элемента в массиве

    Заметим,
    что при наличии в массиве нескольких
    минимальных элементов, найден будет
    первый из них (самый левый минимальный
    элемент) при просмотре массива слева
    направо. Если в неравенстве ai<
    min
    знак >
    поменять на знак ≥, то будет найден
    последний из них (самый правый минимальный
    элемент).

    Для
    поиска максимального элемента max
    и его индекса n_max
    используется аналогичный алгоритм, в
    котором сначала надо принять max
    =a
    in,
    n_ max
    = in,
    вместо неравенства ai
    < min

    используется неравенство ai
    > max
    . В случае
    выполнения условия ai
    > max
    , записать
    в max
    =ai
    и в n_ max = i.

    Для
    поиска в массиве экстремума можно не
    использовать вспомогательную переменную
    min
    (max).
    В этом случаи минимальный элемент
    массива определяется только по его
    индексу n_min
    (n_max)
    (рисунок 6.13).

    /*поиск
    минимального элемента*/

    n_min=in;

    for(i=in+1;
    i<ik; i++)

    if(a[i]<a[n_min])

    n_min=i;

    /*поиск
    максимального элемента*/

    n_max=in;

    for(i=in+1;
    i<ik; i++)

    if(a[i]>a[n_max])

    n_max=i;

    Рис.
    6.13
    Графический
    алгоритм и фрагмент программы поиска
    минимального элемента в массиве по его
    индексу

    6.3.8 Поиск элементов, обладающих заданным свойством

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

    В
    таких случаях для просмотра массива
    обычно используется оператор цикла
    while
    со сложным условием. Графическая схема
    для рассматриваемого примера изображена
    на рис. 6.14. После цикла достаточно
    проверить, чему равно i.
    Если окажется, что i=n,
    т.е. были просмотрены все элементы, то
    в массиве нет нулевых элементов.

    i=0;

    while(i<n
    && a[i]!=0) i=i+1;

    if(i
    == n)

    puts(«В массиве
    нет нулевых элементов»);

    else

    puts(«В массиве
    есть нулевой элемент»);

    Рис.
    6.14
    Графическая
    схема и фрагмент программы поиска
    нулевого элемента в массиве

    Встречаются
    задачи, в которых требуется не только
    определить, есть ли элемент, обладающим
    заданным свойством в массиве, но и номер
    (индекс) такого элемента. Например, найти
    максимальный элемент в части массива,
    находящейся после последнего нуля.
    Решение задачи следует начать с вычисления
    индекса последнего нулевого элемента.
    Для определения индекса самого правого
    элемента, обладающего заданным свойством,
    массив следует просматривать с конца
    до тех пор, пока не закончатся элементы
    и текущий элемент не равен нулю (рис.
    6.15).

    i=n–1;

    while(i>=0
    && a[i]!=0) i=i–1;

    if(i<0)

    puts(«В
    массиве нет нулевых элементов»);

    else

    printf(«Индекс
    последнего нуля – %d n», i);

    Рис. 6.15 Графическая
    схема и фрагмент программы поиска номера
    последнего нулевого элемента в массиве

    Номер
    (индекс) первого встретившегося нулевого
    элемента можно узнать по значению
    параметра цикла i.
    Этот номер можно использовать в дальнейших
    вычислениях например как номер начального
    элемента для поиска максимума.

    Соседние файлы в папке ОАиП 2 Семестр

    • #
    • #
    • #
    • #
    • #
    • #
    • #
    • #

    Понравилась статья? Поделить с друзьями:
  • Как быстро найти болото в майнкрафте
  • Как найти фото в телефоне андроид если
  • Как найти свой ноутбук на официальный сайт
  • Как правильно составить акт передачи денег
  • Как найти координаты в субнатике