Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций(ОАиП).doc
Скачиваний:
70
Добавлен:
11.05.2015
Размер:
1.07 Mб
Скачать

9.3. Оператор цикла с постусловием do - while

Общий вид записи:

do код_цикла while (выражение);

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

9.4. Оператор цикла с предусловием и коррекцией for

Общий вид оператора:

for (выражение1; выражение2; выражение3) код_цикла;

Цикл for эквивалентен последовательности инструкций:

выражение1;

while (выражение2)

{

код_цикла ...

выражение3;

}

здесь выражение1 - инициация счетчика (начальное значение), выражение2 -условие продолжения счета, выражение3 - увеличение счетчика. Выражения 1,2 и 3 могут отсутствовать (пустые выражения), но символы «;» опускать нельзя.

Например, для суммирования первых N натуральных чисел можно записать:

sum = 0;

for ( i=1; i<=N; i++) sum+=i;

Операция «запятая» чаще всего используется в операторе for. Она позволяет включать в его спецификацию несколько инициализирующих выражений. Предыдущий пример можно записать в виде:

for ( sum=0 , i=1; i<=N; sum+= i , i++) ;

Оператор for имеет следующие возможности:

- можно вести подсчет с помощью символов, а не только чисел:

for (ch = 'a'; ch<='z'; ch++) ... ;

- можно проверить выполнение некоторого произвольного условия:

for (n = 0; s[i]>='0' && s[i]<'9'; i++) ... ;

или:

for (n = 1; n*n*n <=216; n++) ... ;

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

for (printf(" вводить числа по порядку! \n"); num!=6;)

scanf("%d", & num);

printf(" последнее число - это то, что нужно.\n");

В этом фрагменте первое сообщение выводится на печать один раз, а затем осуществляется прием вводимых чисел, пока не поступит число 6.

Параметры, входящие в выражения, находящиеся в спецификации ци­кла можно изменять при выполнении операций в коде цикла.

Например:

for (n = 1; n<1000; n += delta) ... ;

Параметр delta можно менять в процессе выполнения цикла.

Использование условных выражений позволяет во многих случаях значительно упростить программу. Например:

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

printf("%6d%c",a[i],( (i%10==0) || (i==n-1) ) ? '\n' : ’ ‘);

В этом цикле печатаются n элементов массива а по 10 в строке, разделяя каждый столбец одним пробелом и заканчивая каждую строку (включая последнюю) одним символом перевода строки. Символ перевода строки записывается поле каждого десятого и n-го элементов. За всеми остальными - пробел.

10. Операторы передачи управления

Формально к операторам передачи управления относятся:

- оператор безусловного перехода goto;

- оператор перехода к следующему шагу (итерации) цикла continue;

- выход из цикла, либо оператора switch - break;

- оператор возврата из функции return.

Рассмотрим их более подробно.

10.1. Оператор безусловного перехода goto

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

goto < метка >;

Он предназначен для передачи управления на оператор, помеченный меткой. Метка представляет собой идентификатор, оформленный по всем правилам идентификации переменных с символом «двоеточие» после него, например, пустой помеченный оператор:

m1: ;

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

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

for (...)

for (...)

{ ...

if ( ошибка ) goto error;

}

...

error: - операторы для устранения ошибки;

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

Пример нахождения первого отрицательного числа в двумерном массиве:

for (i=0; i<N; i++)

for(j=0; j<M; j++)

{

if (v[i][j]<0) goto found;

... // Не найден

}

found: ... // Найден

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

found = 0;

for (i=0; i<N && !found; i++)

for (j=0; j<M && !found; j++)

found = v[i][j]<0;

if (found) ... // Найден

else ... // Не найден