Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
620251-ПБ / МУ_ЛР_Информатика / ЛР №6 Delphi циклы и массивы.doc
Скачиваний:
46
Добавлен:
16.03.2016
Размер:
234.5 Кб
Скачать
    1. Вечный цикл

На процессорах Pentium IV вечный цикл выполняется в два раза быстрее!

Из программистского фольклора.

Одна из самых больших неприятностей в программировании – зацикливание. Если при каждом проходе цикла в условии ничего не меняется, то цикл никогда не прекратится и программа "зависнет". Чтобы ее прервать насильно, нужно нажать клавиши Ctrl+C или Ctrl+Break. Вот яркий пример вечного цикла:

s:=0;

WHILE s<100 DO

i:=i+1;

В теле цикла находится только один оператор i:=i+1. Его выполнение никак не влияет на значение переменной s, которое всегда будет равным нулю и, соответственно, меньшим 100. Поэтому такой цикл никогда не прекратится.

Правило: в условии цикла обязательно должна присутствовать переменная6 значение которой изменяется в теле цикла.

    1. Цикл с постусловием

Трубку вы схватите как раз тогда, когда в ней зазвучат сигналы отбоя.

Из законов Мэрфи.

Другая разновидность цикла отличается тем, что условие проверяется не до, а после выполнения тела цикла. Поэтому цикл с постусловием обязательно выполняется как минимум один раз. Именно поэтому он не чаще всего не годится для решения вычислительных задач: возникает лишняя итерация (проход) цикла, и, складывая 1+2+3, можно получить ответ 10=1+2+3+4.

Цикл с постусловием записывается оператором REPEAT.. UNTIL. Его общий вид таков:

REPEAT

оператор1

оператор n

UNTIL условие;

Тело цикла составляют операторы, стоящие между REPEAT и UNTIL. Дополнительные BEGIN..END здесь не нужны – синтаксис оператора и так позволяет помещать в тело цикла несколько операторов.

Важная особенность цикла REPEAT состоит в том, что его условие является условием прекращения цикла. Цикл прерывается и программа идет дальше, как только условие становится истинным. Напомним, что в цикле WHILE все наоборот- там цикл прерывается, как только условие становится ложным.

Цикл с постусловием идеально подходит для организации контроля корректности вводимых пользователем данных. Например, мы ожидаем ввода числа от 1 до 3 (скажем, при выборе, куда вводить информацию: на экран или в файл). Как обезопасить себя на тот случай, если гнусный пользователь возьмет и введет 4 или 0? Очень просто:

VAR a:BYTE;

BEGIN

REPEAT

a:=StrToInt(LabeledEidit1.Text)

UNTIL (a>=1) AND (a<=3);

После ввода числа проверяется условие его нахождения в интервале [1;3]. Если введенное число не попадает в указанный интервал, условие будет ложным и цикл повторится до тех пор, пока условие не окажется истинным.

Обозначение цикла с постусловием на блок-схемах показано на Рис. 2.

Рис. 2. Обозначение цикла с постусловием на блок-схемах.

    1. Цикл с переменной

Во всякой формуле константы должны рассматриваться как переменные.

Из законов Мэрфи.

Весьма часто возникает необходимость просто выполнить участок программы заданное число раз. Конечно, можно организовать такой цикл при помощи оператора WHILE. Например, нам нужно перебрать все целые числа от 10 до 20 и просуммировать их. Сделать это можно следующим образом:

VAR i: BYTE; s: WORD;

BEGIN

i:=10;

s:=0;

WHILE i<=20 DO

BEGIN

s:=s+i;

i:=i+1

END;

Такая программа работоспособна, но громоздка и некрасива. Есть способ лучше – использовать цикл с переменной FOR..TO. Его общий вид таков:

FOR переменная:=начальное значение TO конечное значение DO

оператор;

Оператор FOR автоматически перебирает значения целой переменной от начального до конечного c шагом 1 и при каждом увеличении переменной на единицу выполняет оператор. Обратите внимание, что оператор FOR работает только с целыми числами и шаг приращения всегда равен единице.

Перепишем нашу программу, используя оператор FOR:

VAR i: BYTE; s: WORD;

BEGIN

s:=0;

FOR i:=10 TO 20 DO

s:=s+i;

Программа стала проще и понятнее. Кстати, не следует думать, что уменьшение длины исходного текста программы приводит и к уменьшению размера создаваемого при компиляции исполнимого файла.

А что делать, если нужно перебирать не целые, а дробные значения? Единственный выход – по-прежнему перебирать целые, а в теле цикла делить их на 10,100,1000… для получения дробного числа. Например, просуммируем числа от 0.1 до 1.2 с шагом 0.1:

VAR i:BYTE; s:REAL;

BEGIN

s:=0.0; { обязательно 0.0, а не 0 – это вещественное число }

FOR i:=1 TO 12 DO

s:=s+i/10;

Иногда нужно перебирать числа в обратную сторону – от большего к меньшему. Обычный цикл FOR в случае, когда начальное значение переменной цикла меньше конечного, вообще не будет выполняться ни разу. Однако в Delphi предусмотрен вариант цикла с переменной, в котором шаг равен минус единице. Все отличие состоит в том, что слово TO заменяется на DOWNTO:

FOR i:=20 DOWNTO 10 DO…

На блок-схемах цикл с переменной изображается так, как показано на Рис. 3.

Рис. 3. Обозначение цикла с переменной на блок-схемах.