Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Гладков_Кулютникова.doc
Скачиваний:
8
Добавлен:
03.11.2018
Размер:
1.36 Mб
Скачать

Задачи второго класса

Особенностью задач этого класса является изменение порядка следования элементов массива. Для этого часто приходится менять местами элементы массива. Поэтому необходимо ввести дополнительную переменную, для того, чтобы не потерять старое значение элемента массива. Это выполняется с помощью приведенных ниже операторов.

Задача 1. Поменяйте местами значения переменных a[i] и a[j].

Решение.

r := a[i]; {запомнили a[i] во вспомогательной переменной}

a[i] := a[j]; { записали значение a[j] на место a[i], старое значение

последнего потерялось, но сохранилась его копия в

переменной r}

a[j]:=r; { записали запомненное значение a[i] на место a[j]}

Задача 2. Переверните массив, т.е. запишите элементы массива в обратном порядке.

Решение. Для решения этой задачи необходимо поменять местами первый и последний, второй и предпоследний и т.д. элементы. Этот процесс нужно продолжать до тех пор, пока не дойдем до середины массива, иначе массив будет перевернут дважды и получим исходное расположение элементов. Для решения этой задачи хорошо подходит схема перебора элементов массива по два при движении с обеих сторон.

i := 1; j := n;

while i <= j do

begin

r := a[i];

a[i] := a[j];

a[j] := r;

i := i + 1; j := j +1

end;

Упражнение. Внесите изменения в приведенный выше фрагмент программы для того, чтобы переворачивалась часть массива от элемента с номером p до элемента с номером q, не используя при этом дополнительный массив.

Задача 3. Поменяйте местами пары соседних элементов, т.е. первый и второй, третий и четвертый и т.д. (n-1)-ый и n-ый.

Решение. В этой задаче используется схема обмена элементов при схеме перебора с шагом два.

i := 2;

while i < n do

begin

r := a[i];

a[i] := a[i+1];

a[i+1] := r;

i := i + 2

end;

Задача 4. Циклически сдвиньте элементы массива на один элемент влево.

Решение. Циклический сдвиг означает, что происходит следующая замена: первый элемент заменяется вторым, второй - третьим и т.д., последний - старым значением первого. При этом можно потерять только значение первого элемента, которое и необходимо сохранить перед циклом.

r := a[1];

for i := 1 to n-1 do

a[i] := a[i + 1];

a[n] := r;

Задача 5. Сдвиньте циклически элементы массива на k позиций влево.

Решение. Можно воспользоваться предыдущим решением, повторив k раз сдвиг на один элемент.

for j := 1 to k do

begin

r := a[1];

for i := 1 to n - 1 do

a[i] := a[i + 1];

a[n] := r

end.

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

for i := 1 to k do

b[i] := a[i];

for i := 1 to n - k do

a[i] := a[i + k];

for i := n- k + 1 to n do

a[i] := b[i - k + 1];

Упражнение. Напишите программу циклического сдвига одномерного массива вправо на k элементов.

Задачи третьего класса

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

Задача 1. Дан массив целых чисел. Необходимо сформировать второй массив, содержащий четные элементы первого массива, при этом расположить элементы во втором массиве а) на тех же позициях, что и в первом; б) сдвинуть к началу массива.

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

Вариант 1.

const nn = 30;

var a, b: array [1..nn] of integer;

i, n: integer;

begin

write (‘задайте количество элементов массива’);

readln (n);

for i := 1 to n do

begin

read (a[i]);

if a[i] mod 2 = 0 then b[i] := a[i];

end;

for i := 1 to n do

write (b[i], ‘ ‘);

end.

Вариант 2.

const nn = 30;

var a, b: array [1..nn] of integer;

i, k, n: integer;

begin

write (‘задайте количество элементов массива’);

readln (n);

for i := 1 to n do

read (a[i]);

k := 0; {в массиве b нет еще элементов}

for i := 1 to n do

if a[i] mod 2 = 0 then begin

k := k + 1;

b[k] := a[i];

end;

for i := 1 to k do

write (b[i], ‘ ‘);

end.

Задача 2. Даны два массива целых чисел a и b. Необходимо получить третий массив c, для n = 5 следующего вида: a1 b5 a2 b4 a3 b3 a4 b2 a5 b1.

Решение. Элементы массивов обрабатываются асинхронно. Заметим, что на нечетных позициях массива c располагаются элементы массива a в прямом порядке, а на четных позициях - элементы массива b в обратном порядке.

const nn = 30;

var a, b: array [1..nn] of integer;

с: array [1.. 2*nn] of integer;

i, k, n: integer;

begin

write (‘задайте количество элементов массива’);

readln (n);

writeln (‘задайте элементы массива а’);

for i := 1 to n do

read (a[i]);

writeln (‘задайте элементы массива b’);

for i := 1 to n do

read (b[i]);

for i := 1 to n do

begin

c[2*i - 1] := a[i];

c[2*i] := b[n- i + 1]

end;

for i := 1 to 2*n do

write (c[i], ‘ ‘);

end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]