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

UptoLike

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

165
Пример 11.26. Переписать из массива а в массив b положительные элементы,
прижав их в массиве b к его началу.
Решение. Здесь исходным массивом является массива а, выходным - b.
Просматриваем поэлементно исходный массив и, обнаружив положительный
элемент, переписываем его в массив b. Здесь нельзя заранее установить формулу,
по которой на основе индекса элемента массива а вычисляется соответствующий
индекс в массиве b. Задача относится к «асинхронным». Введем разные индексы
для массива а (i) и массива b (j). Тогда
задача может быть решена так:
j:=0; {в массиве b нет пока ни одного элемента}
for i:=1 to n do
if a[i]>0 then begin
j:=j+1; {готовим место для следующего элемента}
b[j]:=a[i]
end.
Заметим, что в конце работы предложенного алгоритма значение j будет равно
количеству элементов в массиве b.
Упражнение. Выполните трассировку программы, расположенной ниже.
Какую работу она выполняет? Сравните данное решение с предложенным выше,
укажите преимущества и недостатки каждого решения.
j:=1;
for i:=1 to n do
if a[i]>0 then begin b[j]:=a[i]; j:=j+1 end.
Пример 11.27. Из массива а получить массив b, в котором элементы массива а
расположены в таком порядке: a
n
a
1
a
n-1
a
2
a
n-2
a
3
... .
Решение. Легко заметить, что элементы в массиве b чередуются следующим
образом. На первом месте стоит последний элемент из массива а, на втором -
первый, на третьем - предпоследний. Таким образом, на нечетных местах
располагаются элементы с конца массива а в порядке убывания индексов. На
четных местах в массиве b располагаются элементы с начала массива а
в порядке
возрастания индексов. Для этого решения выбираем схему перебора по элементам
массива b (цикл по выходному массиву). Элементы массива а перебираем по схеме
« обоих концов к середине» Запишем это решение на Паскале:
i:=1; {индексы массива а}
j:=n;
for k:=1 to n do
if odd(k)
then begin b[k]:=a[j]; j:=j-1 end
else begin b[k]:=a[i]; i:=i+1 end.
Упражнение. Установите какую работу выполняет приведенная ниже
программа. Сравните это решение с приведенным выше. Почему в данном
решении по окончании цикла необходим условный оператор?
i:=1;
j:=n;
for k:=1 to n div 2 do
begin b[2*k-1]:=a[j];
b[2*k]:=a[i];
                                     165

    Пример 11.26. Переписать из массива а в массив b положительные элементы,
прижав их в массиве b к его началу.
    Решение. Здесь исходным массивом является массива а, выходным - b.
Просматриваем поэлементно исходный массив и, обнаружив положительный
элемент, переписываем его в массив b. Здесь нельзя заранее установить формулу,
по которой на основе индекса элемента массива а вычисляется соответствующий
индекс в массиве b. Задача относится к «асинхронным». Введем разные индексы
для массива а (i) и массива b (j). Тогда задача может быть решена так:
    j:=0; {в массиве b нет пока ни одного элемента}
    for i:=1 to n do
       if a[i]>0 then begin
                             j:=j+1; {готовим место для следующего элемента}
                             b[j]:=a[i]
                      end.
    Заметим, что в конце работы предложенного алгоритма значение j будет равно
количеству элементов в массиве b.
    Упражнение. Выполните трассировку программы, расположенной ниже.
Какую работу она выполняет? Сравните данное решение с предложенным выше,
укажите преимущества и недостатки каждого решения.
    j:=1;
    for i:=1 to n do
       if a[i]>0 then begin b[j]:=a[i]; j:=j+1 end.
    Пример 11.27. Из массива а получить массив b, в котором элементы массива а
расположены в таком порядке: ana1an-1a2an-2a3... .
    Решение. Легко заметить, что элементы в массиве b чередуются следующим
образом. На первом месте стоит последний элемент из массива а, на втором -
первый, на третьем - предпоследний. Таким образом, на нечетных местах
располагаются элементы с конца массива а в порядке убывания индексов. На
четных местах в массиве b располагаются элементы с начала массива а в порядке
возрастания индексов. Для этого решения выбираем схему перебора по элементам
массива b (цикл по выходному массиву). Элементы массива а перебираем по схеме
« обоих концов к середине» Запишем это решение на Паскале:
    i:=1; {индексы массива а}
    j:=n;
    for k:=1 to n do
       if odd(k)
       then begin b[k]:=a[j]; j:=j-1 end
       else begin b[k]:=a[i]; i:=i+1 end.
    Упражнение. Установите какую работу выполняет приведенная ниже
программа. Сравните это решение с приведенным выше. Почему в данном
решении по окончании цикла необходим условный оператор?
    i:=1;
    j:=n;
    for k:=1 to n div 2 do
    begin      b[2*k-1]:=a[j];
               b[2*k]:=a[i];