ÐÑпÑÑк 5 - РоÑÑийÑкий гоÑÑдаÑÑÑвеннÑй пÑоÑеÑÑионалÑно ...
ÐÑпÑÑк 5 - РоÑÑийÑкий гоÑÑдаÑÑÑвеннÑй пÑоÑеÑÑионалÑно ...
ÐÑпÑÑк 5 - РоÑÑийÑкий гоÑÑдаÑÑÑвеннÑй пÑоÑеÑÑионалÑно ...
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Вариант с использованием оператора goto:<br />
Выполняемое действие<br />
Строки программы<br />
Начало программы<br />
program mas_find;<br />
Объявление массива<br />
var mas: array[1..10] of integer;<br />
Объявление цикловой переменной i: integer;<br />
Объявление метки (для перехода по goto) label 1;<br />
begin<br />
ввод массива<br />
Цикл перебора элементов массива for i := 1 to 10 do<br />
begin<br />
Если очередной элемент массива равен<br />
if mas[i] = 0 then goto 1;<br />
нулю, то выполнить безусловный переход<br />
на метку 1<br />
Конец цикла end;<br />
Вывод номера (индекса) последнего обработанного<br />
в цикле элемента (на котором<br />
1: writeln('Номер первого нулевого<br />
элемента: ',i:2);<br />
цикл был прерван)<br />
Конец программы<br />
end.<br />
Вариант с использованием оператора break 2 :<br />
Выполняемое действие<br />
Строки программы<br />
Начало программы<br />
program mas_find;<br />
Объявление массива<br />
var mas: array[1..10] of integer;<br />
Объявление цикловой переменной i: integer;<br />
begin<br />
ввод массива<br />
Цикл перебора элементов массива for i := 1 to 10 do<br />
begin<br />
Если очередной элемент массива равен<br />
if mas[i] = 0 then break;<br />
нулю, то прервать цикл досрочно при помощи<br />
оператора break<br />
Конец цикла end;<br />
Вывод номера (индекса) последнего обработанного<br />
в цикле элемента (на котором<br />
writeln('Номер первого нулевого<br />
элемента: ', i:2);<br />
цикл был прерван)<br />
Конец программы<br />
end.<br />
Обе приведенные выше программы обладают существенным недостатком: в обоих случаях предполагается,<br />
что искомый элемент гарантированно имеется в массиве.<br />
Вопрос учащимся: почему это является недостатком? Что будет, если искомого элемента в массиве нет?<br />
В противном случае невозможно точно определить, действительно ли на экран выведен номер элемента<br />
массива, удовлетворяющего условию, или такой элемент не найден, а цикл перебора элементов полностью<br />
завершен и управление естественным образом передано на оператор вывода на экран (очевидно, в этом<br />
случае он напечатает номер последнего просмотренного элемента, так как по завершении цикла значения<br />
цикловых переменных сохраняются).<br />
Для устранения этого недостатка введем дополнительную переменную-флаг, значение которой<br />
фиксирует факт обнаружения искомого элемента массива. Такая переменная может иметь логический<br />
тип (boolean) и принимать значения true или false либо иметь целый тип (integer), и<br />
тогда значение false обозначается, например, нулем, а true — любым ненулевым числом. (Цело-<br />
2<br />
Некоторые программисты считают, что использование оператора безусловного перехода goto противоречит принципам<br />
структурного программирования. Однако при отсутствии в используемой версии языка Паскаль специального<br />
оператора прерывания цикла break (он был добавлен только начиная с версии Turbo Pascal 7.0) попытки использования<br />
цикла с постусловием (repeat … until) гораздо значительнее усложняют программу, чем применение goto, учитывая<br />
необходимость в таком цикле вручную осуществлять изменение индекса/индексов текущего элемента и контроль<br />
выхода за пределы массива. Поэтому здесь и далее ради универсальности получаемого алгоритма по отношению к версии<br />
языка Паскаль мы будем использовать оператор goto. Если в используемой вами версии языка определен оператор<br />
break, то в этом и последующих листингах достаточно заменить оператор goto 1 на break и удалить строку определения<br />
метки 1.<br />
35<br />
май 2012 / ИНФОРМАТИКА