Пример 2. Удалить из массива максимальный элемент, если все элементы разные. Элементы массива задаются случайно из диапазона –25 до 25.
Решение.
Для того, чтобы решить данную задачу, необходимо:
- найти номер максимального элемента — k;
- сдвинуть все элементы, начиная с k-го, на один элемент влево;
- последнему элементу присвоить значение 0.
Программа:
Program Example_2;
Uses crt;
Const n=30; dd=51;
Type myarray = Array [1..n] Of Integer;
Var A: myarray;
k, i: Integer; {k – номер максимального элемента}
{---процедура заполнения (инициализации) массива случайными числами-----}
Procedure Input( Var m:myarray);
Begin
For i:=1 To n Do m[i]:=–25+Random(dd);
{Random выбирает случайное число из отрезка от 0 до dd–1, тогда i-му
элементу массива будет присвоена сумма выбранного случайного числа и –25,
таким образом, массив будет заполняться случайными числами от –25 до –25+(dd–1), то есть до –26+dd=25}
End;
{-----процедура вывода (распечатки) массива -------}
Procedure Print(n1: Integer; m: myarray);
Begin
For i:=1 To n1 Do Write(m[i]:5);
Writeln;
End;
{------Функция возвращающая номер максимального элемента массива -------}
Function Maximum(m: myarray): Integer;
Var max, maxi: Integer;
Begin
max:=–maxint; { –maxint – это целая константа, имеющая минимальное
значение среди целых чисел, равное – 32 768 }
For i:=1 To n Do {просмотр всех элементов массива}
If m[i]>max Then {если данный элемент больше максимального элемента,
найденного среди первых i–1 элементов, то}
Begin
max:=A[i]; {новое значение максимального элемента }
maxi:=i; {номер максимального элемента в массиве}
End;
Maximum:=maxi;
End;
{------Процедура удаления элемента массива c номером k1-------}
Procedure Delete(k1: Integer; Var m: myarray);
Var i: Integer;
Begin {сдвиг элементов на один влево}
For i:=k1 To n–1 Do
m[i]:=m[i+1]; {i–му элементу присваиваем значение (i+1)–го}
m[n]:=0; {последний элемент равен 0}
End;
Begin
Clrscr; {очистка экрана}
Randomize; {включение генератора случайных чисел}
Input(A); {заполнения массива A}
Print(n,A); {вывод заполненного массива A}
k:=Maximum(A); {поиск номера максимального элемента}
Delete(k, A); {удаление элемента с номером k}
Print(n–1,A); {вывод нового массива A}
Readkey;
End.
Таким образом, на экране появятся следующие строки:
6 3 4 7 11 2 13 8 1 5 — это начальный массив,
6 3 4 7 11 2 8 1 5 — это массив после удаления максимального элемента.
Пример 3. Предположим, что максимальный элемент встречается несколько раз.
Решение. Когда необходимо удалять несколько элементов, то это лучше всего делать с конца массива, так как иначе надо будет снова возвращаться к элементу с номером, который только что удаляли (это возникает тогда, когда подряд идут два максимальных элемента, если первый удалим, то на его месте будет стоять снова максимальный элемент). Это можно сделать при помощи цикла с параметром, который имеет следующий вид:
For i:=B Downto A Do <тело цикла>,
где значение переменной i будут уменьшаться на единицу, начиная от B до A (значение B должно быть меньше значения A).
Кроме того, номер максимального элемента запоминать не будем, а просмотрим массив с конца и если элемент имеет максимальное значение, то удалим его, при этом значение счетчика k будем увеличивать на 1. Для решения этой задачи надо изменить функцию Maximum, сейчас нам нужен не номер, а значение максимального элемента.
Программа:
Program Example_3;
Uses crt;
Const n=30; dd=51;
Type myarray = Array [1..n] Of Integer;
Var A: myarray;
m, k, i:Integer; {m – значение максимального элемента
k – число удаленных элементов}
Procedure Input( Var m:myarray);
{процедура заполнения (инициализации) массива случайными числами}
...
Procedure Print(n1: Integer; m: myarray);
{процедура вывода (распечатки) массива}
...
Function Maximum(m: myarray): Integer;
Var max : Integer;
Begin
max:=–maxint;
For i:=1 To n Do {просмотр всех элементов массива}
If m[i]>max Then max:=A[i];
{новое значение максимального элемента }
Maximum:=max;
End;
Procedure Delete(k1: Integer; Var m: myarray);
{процедура удаления элемента с данным номером}
...
Begin
Clrscr;
Randomize; {включение генератора случайных чисел}
Input(A); {заполнение массива A}
Print(n,A); {вывод заполненного массива A}
{поиск значения максимального элемента}
m:=Maximum(A); k:=0;
{просмотр всех элементов, начиная с последнего}
For i:=n Downto 1 Do
If A[i]=m Then {если данный элемент имеет максимальное значение, то }
Begin {удаляем элемент с номером i}
Delete(i,A);
Inc(k);
End;
Print1(n–k,A); {вывод нового массива A}
Readkey;
End.