Прерывание и продолжение циклов

Lazarus IDE: Основы программирования в Windows Lazarus IDE: Основы программирования в Windows

Несмотря на то, что всё потихоньку уходит в сеть, программирование для настольных компьютеров остаётся востребованным. И будет таковым ещё долго. Ну а самая распространённая операционная система для настольных компьютеров – это по-прежнему Windows. Поэтому любой программист, даже если он собирается стать веб-разработчиком, должен знать хотя бы основы создания программ для Windows. Подробнее...

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

Бывают и другие случаи, когда не нужно выполнять всё тело цикла.

Для таких случаев в Паскале имеется две функции:

Break - прерывает цикл

Continue - начинает новую итерацию цикла

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

for i := 1 to 10 do
  begin
    WriteLn('Привет, МИР! ', i);
    if i = 5 then Break;
    WriteLn('Эта строка не будет выведена 5-й раз!');
  end;

В этом примере мы проверяем значение индексной переменной. Как только оно становится равным 5, мы прерываем цикл с помощью функции Break. Таким образом строка “Привет, МИР” будет выведена на экран 5 раз, а строка “Эта строка не будет выведена 5-й раз” будет выведена только 4 раза, так как после слова Break код цикла уже не выполняется и цикл завершается.

Ещё один пример:

i := 0;
while i < 10 do
  begin
    Inc(i);
    if i = 5 then Continue;
    WriteLn('Строка № 5 не будет выведена');
    WriteLn('Привет, МИР! ', i);
  end;

Здесь выполняется 10 итераций цикла (кстати, подумайте, почему 10). Однако в том случае, когда значение индексной переменной равно 5, мы не выводим строки на экран (то есть не выполняем код, который следует за словом Continue), а начинаем цикл сначала.

 ВАЖНО! 
Будьте внимательны! Если команду Inc(i) вы поместите после слова Continue, то вы получите не что иное, как бесконечный цикл. Попробуйте сами догадаться, почему это произойдёт.

Зачем вообще нужны команды прерывания и продолжения циклов?

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

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

i := 0;
x := 0;
y := 0;
while i <= КоличествоСтрокТаблицы do
  begin
    Inc(i);
    y := Столбец2[i];
    if y = 0 then Continue;
    x := Столбец1[i];
    x := x / y;
  end;

Как вы понимаете, это псевдокод, а не язык Паскаль. Но я так был вынужден сделать, так как нам пока недостаточно знаний, чтобы рассмотреть реальный пример. Мы ещё не изучали массивы и прочие прелести.

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

Ещё один важный момент. Возможно, вы сейчас сути этого не поймёте, но я об этом расскажу. Итак, почему я написал именно такой код:

y := Столбец2[i];
if y = 0 then Continue;
x := Столбец1[i];

а, например, не такой

x := Столбец1[i];
y := Столбец2[i];
if y = 0 then Continue;

Ведь второй вариант кажется более логичным и более понятным. Да. Но это только на первый взгляд.

Как будет работать программа во втором варианте?

Мы получаем значение первого столбца, затем получаем значение второго столбца. Потом проверяем значение второго столбца.

Но ведь оно может оказаться равным нулю, и тогда значение первого столбца нам не нужно! А мы его уже получили и потратили на это драгоценное процессорное время!

Хотя оба варианта будут работать правильно, но вариант

y := Столбец2[i];
if y = 0 then Continue;
x := Столбец1[i];

будет более грамотным с точки зрения экономии процессорного времени, так как в этом варианте мы НЕ выполняем код

x := Столбец1[i];

если значение второго столбца равно нулю. То есть мы экономим процессорное время и наша программа будет работать более быстро.

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

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

См. также:


Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

Яндекс.Метрика