Примерами переформирование массива с изменением его размеров могут служить вычеркивание и вставка элементов, отвечающих определенным условиям или обладающих заданными признаками и т. д. При этом, для удаления или добавления элемента может производиться как поэлементная, так и выборочная обработка элементов массива. Особенностью этого класса задач является изменение размеров исходного массива. Кроме того, вычеркивание или вставка элементов требуют сдвига всех элементов той части массива, которая расположена после удаляемого или вставляемого элемента. Реализация алгоритмов этого типа задач потребует вложенных циклов. При этом, внутренний цикл для сдвига можно выполнить, используя счетный цикл. Внешний цикл обработки содержит переменную верхнюю границу, так как после удаления элемента количество анализируемых переменных уменьшается на единицу. Для реализации возможности изменения границ массива в процессе выполнения программы, рекомендуется использовать циклы while или do-while.
Пример 1
Дан одномерный массив. Вычеркнуть из него все отрицательные элементы.
Для решения этой задачи есть два варианта алгоритма.
Первый алгоритм представлен на рис. 1. В этом случае найденный отрицательный элемент исключается, при этом происходит сдвиг всех последующих элементов массива. Затем определяется следующий отрицательный элемент, осуществляется сдвиг и т.д. При выходе из внешнего цикла n будет определять размерность массива, из которого исключены все отрицательные элементы.
Рис. 1.  
На рис. 2 приведен второй вариант алгоритма, в котором используются две переменные для индекса. Переменная i определяет номер анализируемого элемента исходного массива, а j — номер полученного элемента нового массива. При выходе из внешнего цикла j будет определять размерность массива, из которого исключены все отрицательные элементы. Этот алгоритм является более эффективным, чем первый.
Рис. 2.  
int sorty(int b[],int n) /* n - размерность исходного массива */
/* функция возвращает размерность обработанного массива */
{
int i,j;
j=-1;
for(i=0;i<n;i++) /* перезапись неотрицательных элементов */
if (b[i]>=0)
{j=j+1;
b[j]=b[i];
}
return j;
}