Изменение положения элементов на некотором отрезке
End if
Else
For j=i To n-1 'Цикл для удаление из массива элемента кратного 3
a(j)=a(j+1) 'На место элемента aj переписывается элемент aj+1
Next j
n=n-1 'Уменьшение на единицу количества элементов массива
Loop'Конец цикла While
Вставка элемента в массив
Вставка элемента в массив – задача обратная предыдущей. Прием используется тот же – смещение группы элементов на одну позицию. Только при уплотнении сдвиг производится влево, при вставке – вправо. При вставке возникает проблема, что делать с последними элементами? Если в дальнейшей работе с массивом участвуют только заявленные элементы, то «хвост» придется вытеснить, последние значения при этом будут утрачены. Иначе, придется создавать дополнительный массив, размерность которого будет больше исходного или объявить размер массива с учетом количества вставленных элементов. Выбор типа цикла для работы с массивом зависит от конкретного случая. Например, можно использовать цикл с параметром, если хвост подлежит вытеснению, и число элементов в массиве остается неизменным.
Пример 1. В заданный упорядоченный по возрастанию массив вставить число k, не нарушая его упорядоченности. Последний элемент вытеснить.
Фрагмент программного кода:
For i=1 To n 'Цикл для перебора элементов массива
If k < a(i) Then'Поиск места для вставки нового значения k
'Если место найдено, то организуется цикл для смещения элементов на единицу вправо
For j=N-1 Downto i+1
a(j)=a(j-1) ' На место элемента aj переписывается элемент aj-1
Nexti
a(i)=k 'Вставка нового значения на освобожденное место
Exit For 'Выход из внешнего цикла i
Endif
Nexti
Пример 2. В одномерный массив вставить число x после всех элементов, кратных трем. Все элементы массива сохранить.
При описании данного массива необходимо учесть, что его размер может увеличиться максимум вдвое.
Фрагмент программного кода:
kol=0; 'Счетчик количества вставок
For i=n To 1 'Цикл для перебора элементов массива c конца
If a(i) mod 3=0 Then'Поиск места для вставки нового значения k.
'Если место найдено, то организуется цикл для смещения элементов на единицу вправо
'с учетом вставленных элементов
For j=n+kol To i+1
a(j+1)=a(j) 'На место j+1-го элемента переписывается j-ый элемент
Nextj
a(i+1)=x 'Вставка нового значения на освобожденное место
kol=kol+1 'Счетчик количества вставок увеличивается на 1
End if
Nexti
При решении задач такого типа очень важен контроль за границами диапазона изменения индексов: они должны быть целыми, не выходить за пределы диапазона, кроме того, нижняя граница диапазона должна быть меньше верхней.
Пример.В одномерном массиве a1, a2, a3, …, an , состоящем из n элементов, изменить порядок следования значений элементов на обратный от позиции n1 до позиции n2 (n1<n2<n).
Алгоритм изменения порядка следования элементов в массиве на обратный состоит в следующем:
n1-ый элемент меняется местами с n2-ым,
(n1+1)-ый элемент меняется местами с (n2-1)-ым,
…………………………………………………….
(n1+i)-ый элемент меняется местами с (n2-i)-ым,
Цикл выполняется лишь до половины диапазона от n1 до (n1+n2) div 2, иначе в массиве ничего не изменится.
Фрагмент программного кода:
For i=n1 To (n1 + n2) div 2 'Цикл по количеству перестановок
tmp=a[i] 'Обмен местами элементов ai и an1+n2-i
a(i)=a(n1+n2-i)
a(n1+n2-i)=tmp
Next i
Кольцевой сдвиг элементов массива
Кольцевой сдвиг – это смещение элементов массива вправо либо влево, причем вытесненные элементы занимают освободившиеся в результате смещения позиции в противоположном конце массива – так, словно массив представляет собой кольцо (первый и последний элементы смыкаются). Порядок следования элементов при этом сохраняется.
Пример. В одномерном массиве, состоящем из n элементов произвести кольцевой сдвиг элементов на k позиций. Значение k задается, оно может быть как положительным, так и отрицательным, но должно быть целым.
Фрагмент программного кода:
'Анализ числа k, сдвиг будет происходить только если k отлично от 0
If k <> 0 Then
'Формирование переменной sdvig
If k >0 Then sdvig=k Else sdvig=n+k
'Кольцевое смещение осуществляется на 1 позицию sdvig раз
For i=1 To sdvig
'Смещение начинается с последнего элемента, который помещают во вспомогательную
'переменную tmp, чтобы его значение не потерялось, откуда его затем извлекают и 'отправляют в первую позицию после выхода из внутреннего цикла.
tmp=a(n);
For j=n-1 To 1 Do a(j+1)=a(j)
a(1)=tmp