Конспект лекций по программированию для начинающих. Гладков В.П. - 143 стр.

UptoLike

Составители: 

145
begin {если обработан элемент a[i],
то обработать a[j]; j:=j-2;
иначе обработать a[i]; i:=i+2 }
end.
Случаи 4-6 можно легко обобщить для перебора любых элементов, кратных k.
Рассмотрим схему перебора элементов массива, кратных k, двигаясь от начала
массива к его концу.
i:=k;
while i<=n do
begin {обработка a[i]}
i:=i+k
end.
Перебор элементов массива, кратных k, можно осуществить следующим
образом:
if n mod k = 0 then i:=n
else if n mod k = 1 then i:=n-1
else if n mod k = 2 then i:=n-2
else if n mod k = 3 then i:=n-3
else i:=n-4;
while i>0 do
begin {обработка a[i]}
i:=i-k
end.
Поскольку при формировании начального значения i, из n вычитается
величина
остатка от деления на k, то вложенные условные операторы можно заменить
оператором присваивания: i:=n-n mod k;
Рассмотрим схемы перебора нескольких элементов массива одновременно.
Случай 7. Перебрать соседние элементы массива, двигаясь от начала массива к
концу. Рассмотрим вначале случай двух соседей. Для массива из 5 элементов
нужно последовательно обработать пары: a[1] и a[2] , a[2] и a[3], a[3] и a[4], a[4] и
a[5].
Вариант 1. for i:=1 to n-1 do {обработать a[i] и a[i+1]}.
Вариант 2. for i:=2 to n do {обработать a[i-1] и a[i]}.
Обобщим эту схему на случай k соседей. Для массива из 5 элементов и k=3
нужно последовательно обработать тройки: a[1]-a[2]-a[3], a[2]-a[3]-a[4], a[3]-a[4]-
a[5]. Здесь возможны три варианта реализации в зависимости от того, какой
элемент из тройки выбрать текущим:
1) a[i] - a[i+1] - a[i+2], в этом случае перебор идет от 1 до n-2;
2) a[i-1] - a[i] - a[i+1], в этом случае перебор идет от 2 до n-1;
3) a[i-2] - a[i-1] - a[i], в
этом случае перебор идет от 3 до n.
Для k элементов возможны k вариантов схем перебора в зависимости от выбора
текущего элемента. Пример, когда текущим является первый элемент для каждых k
соседей , приведен ниже:
{n-(k-1) означает, что у последних k-1 элемента нет k соседей }
for i:=1 to n-k+1 do {обработка a[i], a[i+1],...,a[i+k-1}.
                                         145

   begin     {если обработан элемент a[i],
             то обработать a[j]; j:=j-2;
             иначе обработать a[i]; i:=i+2 }
   end.
   Случаи 4-6 можно легко обобщить для перебора любых элементов, кратных k.
Рассмотрим схему перебора элементов массива, кратных k, двигаясь от начала
массива к его концу.
   i:=k;
   while i<=n do
   begin     {обработка a[i]}
             i:=i+k
   end.
   Перебор элементов массива, кратных k, можно осуществить следующим
образом:

    if n mod k = 0 then i:=n
    else if n mod k = 1 then i:=n-1
    else if n mod k = 2 then i:=n-2
    else if n mod k = 3 then i:=n-3
    else i:=n-4;
    while i>0 do
    begin       {обработка a[i]}
                i:=i-k
    end.
Поскольку при формировании начального значения i, из n вычитается величина
остатка от деления на k, то вложенные условные операторы можно заменить
оператором присваивания: i:=n-n mod k;
    Рассмотрим схемы перебора нескольких элементов массива одновременно.
    Случай 7. Перебрать соседние элементы массива, двигаясь от начала массива к
концу. Рассмотрим вначале случай двух соседей. Для массива из 5 элементов
нужно последовательно обработать пары: a[1] и a[2] , a[2] и a[3], a[3] и a[4], a[4] и
a[5].
    Вариант 1. for i:=1 to n-1 do {обработать a[i] и a[i+1]}.
    Вариант 2. for i:=2 to n do {обработать a[i-1] и a[i]}.
    Обобщим эту схему на случай k соседей. Для массива из 5 элементов и k=3
нужно последовательно обработать тройки: a[1]-a[2]-a[3], a[2]-a[3]-a[4], a[3]-a[4]-
a[5]. Здесь возможны три варианта реализации в зависимости от того, какой
элемент из тройки выбрать текущим:
    1) a[i] - a[i+1] - a[i+2], в этом случае перебор идет от 1 до n-2;
    2) a[i-1] - a[i] - a[i+1], в этом случае перебор идет от 2 до n-1;
    3) a[i-2] - a[i-1] - a[i], в этом случае перебор идет от 3 до n.
    Для k элементов возможны k вариантов схем перебора в зависимости от выбора
текущего элемента. Пример, когда текущим является первый элемент для каждых k
соседей , приведен ниже:
    {n-(k-1) означает, что у последних k-1 элемента нет k соседей }
    for i:=1 to n-k+1 do {обработка a[i], a[i+1],...,a[i+k-1}.