Удалить из массива четные элементы

Задача

В одномерном массиве удалить все четные элементы и оставить только нечетные.

Решение

Данную задачу можно решить несколькими способами.

Способ 1. Скопировать в другой массив только нечетные элементы.

const
    N = 20;
var
    a, b: array[1..N] of integer;
    i, m: byte;
begin 
    randomize;
    for i:=1 to N do begin 
        a[i] := random(40)+10;
        write(a[i]:3);
    end;
    writeln;
 
    m := 0;
    for i:=1 to N do
        if a[i] mod 2 <> 0 then begin
            m := m + 1;
            b[m] := a[i];
        end;
 
    for i:=1 to m do begin 
        write(b[i]:3);
    end;
    writeln;
end.

Это самый простой способ удаления элементов массива (в данном случае четных чисел), так как не требуется сжимать исходный массив. В представленном выше решении задачи переменная m хранит количество найденных нечетных элементов и в то же время, при заполнении второго массива является меняющимся индексом элементов.

Способ 2. Удалять четные элементы в текущем массиве, перезаписывая их расположенными правее нечетными.

const N = 10;
var
    a: array[1..N] of integer;
    i, k, m: byte;
begin
    randomize;
    for i:=1 to N do begin
        a[i] := random(40) + 10;
        write(a[i]:3)
    end;
    writeln;
 
    i := 1;
    m := N;
    while i<=m do
        if a[i] mod 2 = 0 then begin
            m := m-1;
            for k:=i to m do
                a[k] := a[k+1];
        end
        else
            i := i+1;
 
    for i:=1 to m do
        write(a[i]:3);
    writeln;
end.

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

Способ 3. Использовать открытый массив.

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

Открытый массив позволяет изменять свою длину. В решении задачи ниже после того как нечетные элементы сдвинуты и "затерли" нечетные, изменяется длина массива (процедурой setlength). Она устанавливает новую длину массива. Особенностью открытых массивов в Pascal является то, что их индексация начинается с нуля.

const N = 10;
var
    a: array of integer;
    i, j, m: byte;
begin
    randomize;
    SetLength(a,N);
    for i := 0 to N-1 do begin 
        a[i] := random(40)+10;
        write(a[i]:3);
    end;
    writeln;
 
    i := 0; // индекс первого элемента
    m := n-1; // индекс последнего
    while i <= m do
        if a[i] mod 2 = 0 then begin
            for j := i to m-1 do
                a[j] := a[j+1];
            m := m - 1
        end
        else
            i := i + 1;
 
    SetLength(a,m+1); // последний элемент имеет индекс m, но элементов m+1
    for i:= 0 to m do
        write(a[i]:3);
    writeln;
end.

Пример выполнения кода программы:

 32 22 45 47 37 40 17 20 12 38
 45 47 37 17

Тема

Одномерные массивы

Уровень

Комбинированные задачи

Последняя редакция