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

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

Вставка одного элемента

Вставлять элемент можно до или после данного элемента, номер этого элемента можно вводить с клавиатуры или искать по определенному условию.

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

  • первые k элементов массива остаются без изменения,
  • все элементы, начиная с (k+1)-го, необходимо сдвинуть на один назад,
  • на место (k+1)-го элемента записываем значение х;
  • увеличиваем количество элементов в массиве на единицу.

Задача. Вставить число 100 после пятого элемента массива.

Рассмотрим конкретный пример. Пусть задан следующий одномерный массив из N (N=10) элементов:

3, -12, 5, 14, 27, -6, 1, -34, 10, -15.

Надо вставить 100 после пятого элемента массива, т. е. должен получиться следующий массив:

3, -12, 5, 14, 27, 100, -6, 1, -34, 10, -15.

Таким образом, в массиве стало 11 элементов, то есть массив надо определять на N+1 элемент:

Type
  MyArray = array[1..n+1] of integer

Кроме того, в программе необходимо выводить массив два раза, сначала первые N элементов массива, а затем полный массив из N+1 элемента.

Рассмотрите процедуру вставки Insert1(m, n, Mesto, Element), которой передаются:

m - массив, в котором делаем преобразования;
n - количество элементов в массиве,
Mesto - номер элемента, после которого надо вставить данный,
Element - число, которое вставляем.

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

Program Vstavka1;
Const
  n=10;
Type
  MyArray = array [1..n+1] of integer;
Var
  A : MyArray;
  k, x : Integer;

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

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

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

Procedure Insert1(Var m : MyArray; Var n : integer; Mesto, Element : integer);
Var
  i : integer;
Begin
  for i := n downto Mesto+1 do
    m[i+1] := m[i];
  m[Mesto+1]:= Element;
  Inc(n);
End;

Begin
  . . .
  Writeln('Номер элемента, после которого вставлять > ');
  Readln(k);
  Writeln('Вставляемое число > ');
  Readln(x);
  Insert1(A, n, k, x);
  . . .
End.

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

Вставка нескольких элементов

Задача. Вставить число после всех элементов массива, кратных трем.

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

Type
  MyArray[1..2*n] of Integer;

Второе. Если мы будем просматривать массив с начала и вставлять новый после элемента с заданным свойством, то номер последнего элемента каждый раз может меняться, кроме того, будет просматриваться и новый (вставленный) элемент и его необходимо будет пропускать, поэтому решение будет не очень эффективным. Лучше всего просматривать массив, начиная с конца, тогда вставляемый элемент мешать не будет. Кроме того, номер последнего элемента можно будет знать (если знать, сколько элементов вставлено на данный момент), при этом просмотр будет последовательным от N-го до 1-го.

Program VstavkaN;
Const
  n=10;
Type
  MyArray = Array [1..2*n] of Integer;
Var
  A : MyArray;
  k, x, i : Integer;

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

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

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

Procedure InsertN(Var m : MyArray; Var n : integer; Mesto, Element : Integer;);
Var
  i : Integer;
Begin
  for i := n downto Mesto+1 do
    m[i+1] := m[i];
  m[Mesto+1]:= Element;
  Inc[n];
End;

Begin
  . . .
  Writeln('Вставляемое число > ');
  Readln(x);
  k:=0;
  for i:=n downto 1 do
    if A[i] mod 3=0
      then
        InsertN(A, n, i, x);
  . . .
End.

Задание. Дополните программу необходимыми операторами и комментариями и добейтесь работоспособности программы.