Теоретический материал (Паскаль)

Удаление элементов из одномерного массива

Задача. Удалить из массива максимальный элемент, если все элементы разные.

Для того, чтобы решить задачу нужно:

  • найти номер максимального элемента k;
  • сдвинуть все элементы, начиная с k-го, на один элемент влево;
  • последнему элементу присвоить значение 0;
  • уменьшить количество элементов массива на единицу.

Рассмотрим задачу на конкретном примере. Пусть дан одномерный массив из целых чисел, состоящий из 10 элементов:

6, 3, 4, 7, 11, 2, 13, 8, 1, 5.

Номер максимального элемента равен 7 (k=7), то есть, начиная с 7-го элемента, будем сдвигать элементы на один влево: 7-му присвоим значение 8-го, 8-му присвоим значение 9-го, 9-му присвоим значение 10-го, на этом сдвиг заканчивается. Таким образом, сдвиг начинается с k-го элемента и идет по (n-1)-й (где n - количество элементов в массиве). После этого последнему элементу присвоим значение, равное 0, и тогда массив будет следующим:

6, 3, 4, 7, 11, 2, 8, 1, 5, 0.

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

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

Program DeleteK;
Const
  n=30;
Type
  MyArray = Array [1..n] of Integer;
Var
  A : MyArray;
  k : Integer;

Procedure InsertMas1(Var m : MyArray; n : integer);
  . . .

Procedure InsertMas2(Var m : MyArray; n : integer);
  . . .

Procedure PrintMas(m : MyArray; n : integer);
  . . .

Function Maximum (m : MyArray; n:integer) : Integer;
Var
  i, max, maxi : integer;
Begin
  max:=-maxint; {начальным значением переменной будет наименьшее значение данного типа}
  for i := 1 to n do {просматриваем все элементы массива}
    if m[i] > max {если найден элемент больше, чем тот, что мы считаем максимальным}
      then
        begin
          max:=A[i]; {то запомним найденное значение}
          maxi:=i; {а также место, на котором он стоит в массиве}
        end;
  Maximum := maxi; {имени функции присвоим найденный результат}
End;

Procedure Delete(Var m : MyArray; Var n:integer; k1 : integer);
Var
  i : integer;
Begin
  for i := k1 to n-1 do
    m[i] := m[i+1];
  m[n]:=0;
  Dec(n);
End;

Begin
  . . .
  k:=Maximum(A,n);
  Delete(A,n,k);
  . . .
End.

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

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

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

Просмотр элементов массива с конца можно реализовать при помощи цикла с параметром (downto). Кроме того, номер максимального элемента запоминать не будем. При прохождении массива с конца, если элемент имеет максимальное значение, то удалим его, при этом значение счетчика k будем увеличивать на 1.

Задание. С учетом изложенного выше составьте программу, решающую поставленную задачу или дополните предыдущую.

Внимание! Любая Ваша программа должна сопровождаться комментариями.