ВУЗ:
Составители:
Рубрика:
161
a[i]:=a[j]; { записали значение a[j] на место a[i], старое значение
последнего потерялось, но сохранилась его копия в
переменной r }
a[j]:=r { записали запомненное значение a[i] на место a[j] }
Частой ошибкой при решении задач этого класса является потеря нужного
значения вследствие записи на его место другого значения. Ниже приводятся
характерные задачи этого класса и методы их решений.
Пример 11.19. Разделить каждый элемент одномерного массива на его пятый
элемент.
Решение. Например, для массива a={1, 2, 3, 4, 5, 6, 7, 8, 9} должен получиться
результат a={1/5, 2/5, 3/5, 4/5, 1, 6/5, 7/5, 8/5, 9/5}. Ясно, что пятый элемент
результата всегда будет равен 1, поэтому исходное значение этого элемента нужно
сохранить, иначе последующие элементы будут вычислены неправильно. Для
хранения исходного значения пятого элемента используем переменную r.
Поскольку требуется разделить КАЖДЫЙ элемент массива, то выберем схему
перебора по одному. Вообще, если
в условии задачи встречаются слова КАЖДЫЙ,
ВСЯКИЙ, ДЛЯ ВСЕХ элементов массива, то это означает, что в решении появится
цикл перебора элементов. Таким образом, формулировка задачи может подсказать
решение.
r:=a[5];
for i:=1 to n do a[i]:=a[i]/r;
Пример 11.20. Задан одномерный массив. Нужно переставить его элементы в
обратном порядке. Другой массив использовать не разрешается. Например, для
массива a={1,2,3,4,5,6,7,8,9} получится результат a={9,8,7,6,5,4,3,2,1}.
Решение. Заметим, что при преобразовании меняются местами два элемента:
первый и последний, второй и предпоследний и так далее. В случае нечетного
количества элементов в массиве имеется центральный элемент, который должен
меняться сам с собой, т.е. остаться на месте. Меняются элементы, расположенные
симметрично относительно центра массива. Индексы каждой пары таких
элементов
можно определить по следующим формулам: i и n+1-i. Всего в массиве
должно произойти n div 2 обменов. Последняя фраза легко переводится на
Паскаль: нужно организовать арифметический цикл со счетчиком до n div 2, в теле
которого меняются местами элементы a[i] и a[n+1-i].
for i:=1 to n div 2 do
begin r:=a[i];
a[i]:=a[n+1-i];
a[n+1-i]:=r
end;
Другое решение этой задачи можно получить, если ввести обозначения для
пары меняемых элементов: i - элемент, входящий в пару и
расположенный в начале
массива, а j - соответствующий элемент пары, расположенный в конце массива.
При таком соглашении i должно быть меньше j. Если i=j, то они указывают на один
и тот же элемент, который можно не менять. Если i>j, то пар больше нет. Таким
образом, имеем итерационный цикл, который выполняется до тех пор, пока есть
пары элементов
. В теле цикла a[i] и a[j] меняются местами.
i:=1; j:=n;
161 a[i]:=a[j]; { записали значение a[j] на место a[i], старое значение последнего потерялось, но сохранилась его копия в переменной r } a[j]:=r { записали запомненное значение a[i] на место a[j] } Частой ошибкой при решении задач этого класса является потеря нужного значения вследствие записи на его место другого значения. Ниже приводятся характерные задачи этого класса и методы их решений. Пример 11.19. Разделить каждый элемент одномерного массива на его пятый элемент. Решение. Например, для массива a={1, 2, 3, 4, 5, 6, 7, 8, 9} должен получиться результат a={1/5, 2/5, 3/5, 4/5, 1, 6/5, 7/5, 8/5, 9/5}. Ясно, что пятый элемент результата всегда будет равен 1, поэтому исходное значение этого элемента нужно сохранить, иначе последующие элементы будут вычислены неправильно. Для хранения исходного значения пятого элемента используем переменную r. Поскольку требуется разделить КАЖДЫЙ элемент массива, то выберем схему перебора по одному. Вообще, если в условии задачи встречаются слова КАЖДЫЙ, ВСЯКИЙ, ДЛЯ ВСЕХ элементов массива, то это означает, что в решении появится цикл перебора элементов. Таким образом, формулировка задачи может подсказать решение. r:=a[5]; for i:=1 to n do a[i]:=a[i]/r; Пример 11.20. Задан одномерный массив. Нужно переставить его элементы в обратном порядке. Другой массив использовать не разрешается. Например, для массива a={1,2,3,4,5,6,7,8,9} получится результат a={9,8,7,6,5,4,3,2,1}. Решение. Заметим, что при преобразовании меняются местами два элемента: первый и последний, второй и предпоследний и так далее. В случае нечетного количества элементов в массиве имеется центральный элемент, который должен меняться сам с собой, т.е. остаться на месте. Меняются элементы, расположенные симметрично относительно центра массива. Индексы каждой пары таких элементов можно определить по следующим формулам: i и n+1-i. Всего в массиве должно произойти n div 2 обменов. Последняя фраза легко переводится на Паскаль: нужно организовать арифметический цикл со счетчиком до n div 2, в теле которого меняются местами элементы a[i] и a[n+1-i]. for i:=1 to n div 2 do begin r:=a[i]; a[i]:=a[n+1-i]; a[n+1-i]:=r end; Другое решение этой задачи можно получить, если ввести обозначения для пары меняемых элементов: i - элемент, входящий в пару и расположенный в начале массива, а j - соответствующий элемент пары, расположенный в конце массива. При таком соглашении i должно быть меньше j. Если i=j, то они указывают на один и тот же элемент, который можно не менять. Если i>j, то пар больше нет. Таким образом, имеем итерационный цикл, который выполняется до тех пор, пока есть пары элементов. В теле цикла a[i] и a[j] меняются местами. i:=1; j:=n;
Страницы
- « первая
- ‹ предыдущая
- …
- 157
- 158
- 159
- 160
- 161
- …
- следующая ›
- последняя »