Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛЕКЦИИ_ПО_ПРОГРАММИРОВАНИЮ_ПРЕПОД_3403_220301.doc
Скачиваний:
27
Добавлен:
06.11.2018
Размер:
845.31 Кб
Скачать

11.6 Вложенные циклы.

Вложенным называется цикл, находящийся внутри другого цикла.

/* ПРОГРАММА:

delay.c - организация временных задержек на основе вложенных циклов.

*/

/*#############################################*/

/*============================= include */

#include<stdio.h>

/*============================= define */

#define DELAY 4000

#define MIN -32768 /* минимальное целое число */

#define MAX 32768 /* максимальное целое число */

/*============================= main() */

main()

{/*.---------------------------.begin main() */

int n,m;

for(n=0; n<DELAY; n++)

{

for(m=MIN; m<MAX; m++);

printf(”X”);

}

return 0;

}/*.---------------------------.end main() */

/*#############################################*/

РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ.

Замедление работы программы вывода символа X”на печать.

ПОЯСНЕНИЯ К ПРОГРАММЕ.

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

Счетчик внешнего цикла n увеличивает это время в DELAY раз.

***************************************************************

11.7 Операторы выход из структуры (break), продолжение (continue), безусловный переход (to go).

Операторы, определяющие циклические вычисления, и условные операторы (if, if-else, switch) являются основными средствами управления выполнением программы на языке Си. Они обычно используются для реализации общей структуры программы.

Операторы break, continue, to go применяются реже, поскольку слишком частое их использование ухудшает читаемость программы, увеличивает вероятность ошибок и затрудняет ее модификацию.

ВЫХОД ИЗ СТРУКТУРЫ (break).

Важнейшим из этих трех управляющих операторов является оператор break. Он может использоваться в операторе switch, где часто это просто необходимо, а также в циклах любого из трех типов for, while или do while. Когда в ходе выполнения программы встречается указанный оператор, его выполнение приводит к выходу из конструкций switch, for, while или do while, в которых он содержится, и переходу к следующему оператору программы. Если оператор break находится внутри некоторой совокупности вложенных структур, его действие распространяется только на самую внутреннюю структуру, в которой он непосредственно содержится.

Бывает, что break используется для выхода из цикла в тех случаях, когда заданы два разных условия прекращения его работы. Ниже приводится цикл, реализующий эхо-печать символов и завершающийся при чтении либо признака EOF, либо символа "новая строка":

while((ch = getchar())!= EOF) {if(ch == '\n') break; putchar(ch);}

Мы сделаем логику этого фрагмента программы более понятной, если объединим оба условия прекращения работы цикла в одном выражении:

while((ch = getchar()) != EOF && ch != '\n') putchar(ch);

Если вы обнаружите, что break является частью оператора if, посмотрите, нельзя ли по-другому выразить это условие (как мы только что сделали), чтобы необходимость его использования отпала.

ПРОДОЛЖЕНИЕ (continue).

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

Заменим оператор break в последнем фрагменте на continue:

while((ch = getchar())!==EOF) { if(ch == '\n') continue; putchar(ch);}

В версии, использующей оператор break, работа цикла полностью прекращается, как только при вводе встречается символ "новая строка". В версии с оператором continue просто пропускаются символы "новая строка", а выход из цикла происходит, только когда читается признак EOF. Этот фрагмент более компактно можно записать следующим образом:

while((ch=getchar())!= EOF) if(ch != '\n') putchar(ch);

В данном случае, изменение условия в операторе if на обратное условие позволяет исключить необходимость введения в цикл оператора continue.

С другой стороны, оператор continue помогает иногда сократить некоторые программы, особенно если они включают в себя вложенные операторы if else.

БЕЗУСЛОВНЫЙ ПЕРЕХОД (goto).

Оператор goto - одно из важнейших средств языков Бейсик и Фортран. Этот оператор также реализован и в языке Си. Однако, на языке Си, в отличие от языков Бейсик и Фортран, можно и нужно программировать, совершенно его не используя. Создатели языка Си Керниган и Ритчи считают оператор goto "чрезвычайно плохим" средством и предлагают "применять его как можно реже или не применять совсем".

Оператор goto состоит из двух частей - ключевого слова goto и имени метки. Имена меток образуются по тем же правилам, что и имена переменных. Приведем пример записи оператора:

goto part2; /* goto и имя метки */

Чтобы этот оператор выполнился правильно, необходимо наличие другого оператора, имеющего метку part2, за которой следует двоеточие.

part2: /* имя метки и двоеточие */

printf(" Управление передано оператору, находящемуся на метке. \n");

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

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