Вставка элементов в одномерный массив Вставлять элемент можно до или после данного элемента, номер этого элемента можно вводить с клавиатуры или искать при определенных условиях.
Пример 11.17. Вставить число 100 после 5-го элемента массива. Элементы исходного массива теряться не должны.
Пусть k – это номер элемента, после которого надо вставить элемент x (k и x будем вводить с клавиатуры). Тогда вставка осуществляется следующим образом:
первые k элементов массива остаются без изменений;
все элементы, начиная с (k+1)–го надо сдвинуть на один элемент вправо;
на место (k+1)-го элемента записываем x, т.е. после k-го элемента массива.
Пусть дан одномерный массив из 6 элементов: 6, 3, 4, 11, 7, 2. Надо вставить элемент 100 после пятого элемента массива: 6, 3, 4, 11, 7, 100, 2. В массиве будет 7 элементов, т.е. массив надо определять на n+1 элемент.
Сдвиг элементов надо проводить с последнего.
Program insert1;
Const n=6; {количество элементов массива}
Var A:Array[1..n+1] Of Integer; i: Integer;
k: Integer; {номер элемента, после которого вставляем элемент х}
x: Integer; {Вставляемый элемент}
Begin
{Заполнение массива А с клавиатуры}
For i:=1 To n Do
Read (A[i]);
{Ввод номера элемента и значения вставляемого элемента}
WriteLn (‘Введите номер элемента, после которого вставлять’);
WriteLn (‘и вставляемое число’);
ReadLn (k, x);
{Сдвиг элементов массива, начиная с конца}
For i := n DownTo k+1 Do
A[i+1] := A[i];
{Вставка элемента на место (k+1)-го, т.е. после k-го}
A[k+1]:= x;
{Вывод нового массива А}
For i:=1 To n+1 Do
Write (A[i]:6);
End.
Пример 11.18. Вставить число 100 перед 5-м элементом массива.
Задача отличается от предыдущей тем, что в первой сдвигали все элементы, стоящие после k-го, т.е. с (k+1)-го, а на его место записывали новый элемент. В данной задаче сдвигаем все элементы с k-го, а затем на его место записываем новый.
Фрагмент программы:
...
{Сдвиг элементов массива, начиная с конца}
For i := n DownTo k Do
A[i+1] := A[i];
{Вставка элемента на место (k+1)-го, т.е. после k-го}
A[k]:= x;
...
Пример 11.19. Вставить по одному элементу после всех элементов с заданными свойствами. Например, вставить число после всех элементов массива, кратных 3.
Размерность массива в результате решения задачи может увеличиться в два раза, т.к. может оказаться, что вставлять заданное значение придется после каждого элемента массива.
Если будем просматривать элементы массива с начала и вставлять новый после элемента с заданными свойствами, то номер последнего элемента может каждый раз меняться, кроме того, будет просматриваться и новый (вставленный) элемент и его необходимо будет пропускать («перепрыгивать»), поэтому решение будет не эффективным.
Лучше всего просматривать массив, начиная с конца, тогда вставляемый элемент «мешать» не будет. Кроме того, номер последнего элемента можно будет знать (если знать, сколько элементов вставлено на данный момент), при этом просмотр будет последовательным от n-го до первого.
Программа:
Program insert2;
Const n=6;
Var A:Array[1..2*n] Of Integer; i, j: Integer;
k: Integer; {Количество вставляемых элементов}
x: Integer; {Вставляемое число}
Begin
{Заполнение массива А с клавиатуры}
For i:=1 To n Do Begin
Write(i, ‘-ый элемент: ’); ReadLn (A[i]);
End;
{Вывод заполненного массива А}
WriteLn( ‘Массив: ’);
For i:=1 To n Do
Write (A[i]:6);
{Ввод значения вставляемого элемента}
WriteLn (‘Введите вставляемое число’);
ReadLn (x);
k:=0;
{Просмотр элементов массива, начиная с конца}
For i := n DownTo 1 Do
If A[i] mod 3 = 0 Then
Begin
{Сдвиг элементов массива, начиная с конца}
For j := n+k DownTo i+1 Do
A[j+1] := A[j];
{Вставка элемента на место (i+1)-го, т.е. после i-го}
A[i+1]:= x;
Inc(k);
End;
{Вывод нового массива А}
For i:=1 To n+k Do
Write (A[i]:6);
End.
|