Процедуры BREAK и CONTINUE




Циклы

 

Иногда некоторую группу операторов согласно алгоритму нужно выполнить многократно. Для этого в программе используются операторы цикла. В языке Pascal программисту предоставлены три вида операторов цикла: for, while и repeat.

Циклы for

Цикл for называется детерминированным. Это означает, что он может быть использован, только если количество итераций цикла можно определить до начала его выполнения. Синтаксис инкрементного цикла for имеет вид

for счетчик: = начало to конец do begin

[ операторы; ]

end;

Переменная счетчик называется счетчиком цикла. Она должна быть локальной переменной любого порядкового типа. Выражения начало и конец определяют первое и последнее значение переменной счетчик. Тип выражений начало и конец должен быть совместимым по присвоению с типом переменной счетчик. Значение выражения начало должно быть меньше, или равно значению выражения конец, в противном случае операторы внутри цикла (в теле цикла) не будут выполнены ни разу. После выполнения цикла (после очередной итерации) инкрементный цикл for автоматически увеличивает значение переменной счетчик на единицу (или на одну порядковую позицию). Затем управление передается в заголовок цикла и счетчик сравнивается с выражением конец. Если счетчик меньше или равен выражению конец, то тело цикла выполняется повторно, в противном случае управление передается на оператор, следующий за оператором for, т.е. происходит выход из цикла.

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

Для целых числовых выражений начало и конец количество итераций оператора for равно

 

(конец - начало) + 1, если начало £ конец;

0, если начало > конец.

 

В следующем фрагменте кода инкрементный цикл for используется для вычисления суммы целых чисел от 1 до 100:

var

counter: Integer;

sum: Integer;

begin

sum:= 0;

for counter:= 1 to 100 do begin

sum:= sum + counter;

end;

end;

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

for счетчик: = начало downto конец do begin

[ операторы;]

end;

Как и раньше, переменная счетчик является счетчиком цикла, а выражения начало и конец определяют первое и последнее значения переменной счетчик. Однако есть и существенное отличие: в декрементном цикле значение начало должно быть больше или равно значению конец, иначе тело цикла не выполнится ни разу. После выполнения тела цикла счетчик автоматически уменьшается на единицу (или до предыдущей порядковой позиции). Если при этом счетчик больше или равен значению выражения конец, то выполняется тело цикла, в противном случае происходит выход из цикла.

Для целых числовых выражений начало и конец количество итераций декрементного

цикла for равно

{начало - конец) + 1, если начало ³ конец;

0, если начало < конец;

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

Цикл for, не содержащий в своем теле ни одного оператора, называется пустым циклом. В прошлом пустые циклы часто использовались для искусственной задержки выполнения программы, однако сейчас так делать нельзя. Современные компиляторы (в частности, компилятор Delphi) оптимизируют выполнимый код. В режиме оптимизации компилятор увидит, что в цикле ничего не выполняется, и может пропустить цикл вообще. Как и операторы if, циклы for могут быть вложенными. Счетчик каждого вложенного цикла должен иметь уникальное имя.

Циклы while и repeat

Циклы while и repeat являются недетерминированными. Это означает, что количество итераций не обязательно должно быть известно до начала выполнения цикла. Циклы while и repeat можно также использовать вместо for в качестве детерминированных. Таким образом, каждый цикл for можно заменить эквивалентным ему циклом while или repeat, но не наборот. Используемые в Pascal циклы while и repeat имеют аналоги почти во всех языках высокого уровня.

Синтаксис цикла while имеет вид

while условие do begin

[ операторы;]

end;

Синтаксис цикла repeat имеет вид

repeat

[ операторы; ]

until условие;

Выражение условие должно быть булева типа. Тело цикла while выполняется, если значение условия равно True. В то же время тело цикла repeat выполняется, если значение условия равно False. В этих циклах (в отличие от for) в теле цикла могут явно изменяться переменные, входящие в выражение условие, которое в этом случае называется управляющим выражением. Если условие в теле цикла не изменяется, то while или repeat превращается в бесконечный цикл.

Обратите внимание: в приведенном выше синтаксисе ключевые слова begin и end oгpaничивают тело цикла while, но не цикла repeat. Тело цикла repeat составляют все операторы, расположенные между ключевыми словами repeat и until.

Существует еще одно важное отличие между циклами while и repeat: тело цикла repeat всегда выполняется, как минимум, один раз, в то время как тело цикла while может не выполняться ни разу.

Поэтому цикл repeat легко преобразовать в цикл while, однако обратное преобразование – более сложная задача. Тот фактор, что тело цикла whilе может оказаться не выполненным ни разу, придется учитывать с помощью дополнительного условия if, проверяющего условие в начале цикла. Естественно, такая проверка избыточна: программист вынужден дважды вводить один и тот же код условия. Поэтому данный фактор является основным условием выбора между циклами while и repeat: если тело цикла всегда должно быть выполнено хотя бы один раз, то предпочтителен цикл repeat, в противном случае более удобен цикл whilе.

В качестве примера использования циклов while и repeat запишем с их помощью код вычисления суммы целых чисел от 1 до 100:

{Использование цикла while}

sum:= 0;

count:= 1;

while (count <= 100) do begin

sum:= sum + count;

count:= count + 1;

end;

{Использование цикла repeat}

sum:= 0;

count: = 1;

repeat

sum:= sum + count;

count:= count +1;

until (count > 100);

В этих примерах переменная sum является накопителем. В ней суммируются (накапливаются) значения, образующие окончательный ответ. Обратите внимание: эти два кода очень похожи. Фактически они отличаются только условиями прерывания циклов. Для решения данной задачи одинаково пригоден любой цикл – for, while или repeat. В общем случае выбор вида цикла определяется потребностями оптимизации кода и стиля программирования.

Как вы помните, счетчик цикла for должен быть переменной любого порядкового типа. Допустим, нужно преобразовать цикл for с нецелочисленным счетчиком в эквивалентный ему цикл while или repeat. Тогда в коде необходимо предусмотреть увеличение или уменьшение значения счетчика до следующего или предыдущего порядкового значения. Эта задача решается с помощью встроенных порядковых подпрограмм, перечисленных в табл. 1.

Таблица 1

Встроенные порядковые подпрограммы Object Pascal

Функция Назначение
Succ() Возвращает True, если аргумент является нечетным числом
Ord() Возвращает порядковое значение выражения порядкового типа
Pred() Возвращает предыдущее порядковое значение аргумента
Odd() Возвращает следующее порядковое значение аргумента
Процедура Назначение
Inc() Увеличивает порядковую переменную на 1 или на n
Dec() Уменьшает порядковую переменную на 1 или на n

 

Как показано в табл. 1, процедура Inc() увеличивает порядковое значение на заданную целую величину. По умолчанию, если эта величина не указана, то порядковая переменная увеличивается на 1. Таким образом, вызов Inc(x) эквивалентен оператору х:= х +1, а Inc (х, n) – оператору х: = х + n. Аналогично этому работает и процедура Dec(). Она уменьшает порядковое значение на указанную целую величину. Характерной особенностью процедур Inc() и Dec() является то, что они генерируют оптимизированный код, поэтому они особенно полезны в циклах.

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

var

letter: Char;

alphabet: String;

begin

alphabet:= ' ';

letter:= 'a';

while (letter <= 'z') do begin

alphabet:= alphabet + letter;

letter:= Inc(letter);

end;

end;

 

Процедуры BREAK и CONTINUE

 

В Object Pascalе в циклах можно использовать стандартные процедуры BREAK и CONTINUE. Процедура BREAK позволяет выйти из цикла, не дожидаясь выполнения условия выхода. Процедура CONTINUE позволяет начать новую итерацию цикла, даже если предыдущая еще не завершена.

 

Задачи:

1. Посчитать сумму четных чисел от 1 до n.

2. Посчитать количество нечетных чисел от 1 до n.

3. Найти произведение всех чисел, кратных трем в промежутке от 1 до 100.

4. Написать программу, которая выводит таблицу значений функции y= -2,4x2+5x-3 в диапазоне от –5 до 5 с шагом 1.

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

Таблица квадратов

Число Квадрат
   
   
   
   
   
   
   
   
   
   

6. Написать программу, которая вычисляет сумму первых n членов ряда.

                 
  + ---- + ---- + ---- ....  
                 
                 

Количество суммируемых членов ряда задается во время работы программы.

7. Написать программу, которая вычисляет факториал введенного с клавиатуры числа.

8. (FOR, WHILE, REPEAT – 3 программы с использованием каждого цикла) Написать программу, которая вычисляет среднее арифметическое вводимой с клавиатуры последовательности дробных чисел. Количество чисел должно задаваться во время работы программы.

9. (Дополнительно по желанию) Написать программу, которая "задумывает" число в диапазоне от 1 до 10 и предлагает пользователю угадать число за 5 попыток. Ниже представлен рекомендуемый вид экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом).

Игра "Угадай число".
Компьютер "задумал" число от 1 до 10.
Угадайте его за 5 попыток.
Введите число и нажмите <Enter>
-> 5
Нет.
-> 3
Вы выиграли! Поздравляю!



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-12-12 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: