Процедурная парадигма
4.1.1.6. Оператор цикла с индексом
Не смотря на то, что цикл с параметром - одна из первых синтаксических конструкций, не существует единого стандарта на его запись. В "наиболее общей форме" этот цикл записывается так:
для <пер> от <начало> до <конец> шаг <шаг> делать <оператор>Листинг 4.6.
где <пер> является переменной целого типа, принимающая значение переменной - индекса. Вне цикла ее значение не определено (попросту, ее нельзя использовать вне цикла). <начало> означает начальное значение индекса в цикле, <конец> - конечное значение индекса в цикле, а <шаг> - приращение цикла на каждой итерации (по-умолчанию используется приращение переменной цикла, равное "+1"). <начало>, <конец> и <шаг> могут принимать значения констант и переменных, однако переопределение этих параметров в цикле запрещено. Параметр <оператор> имеет то же значение, что и в описании цикла: "пока" (см. [раздел 4.1.1.4]).
Конструкция, приведенная в [4.6], задает переменной <пер> последовательность значений: <начало>, <начало>+<шаг>, <начало>+2·<шаг>, …, <конец> на каждой итерации. При этом "тело цикла" повторяется int((<конец>-<начало>)/<шаг>)+1 число раз (см. формулу 4.7), Это число должно быть больше нуля.
n := int( (<конец>-<начало>)/<шаг>)+1Листинг 4.7.
[Пример 03]
/* Объявление переменных цикла: */ int i, imax=10; /* Присвоение начального значения переменной: */ i = 0; /* Объявление цикла и условия остановки цикла: i >= 10 */ while( i < imax ) { // Тело цикла; i++; // Инкремент переменной i (увеличение ее значения на единицу) } /* Конец цикла */
В Примере 04 приведен код подпрограммы, задающий обратный порядок следования символов в строке языка Си без использования специальных функций:
[Пример 04]
/* Определение констант */ const short MAXSTRLENGTH = 255; /* Определение переменных */ char c; //Временная переменная str[MAXSTRLENGTH]; // искомая строка int i, nmax, imax; // Индекс массива и максимальное число итераций /* Определение числа повторений */ imax = strlen(str); nmax = imax/2; // Для неполных строк /* Цикл: */ for( i = 0; i < nmax; i++) { c = str[i]; str[i] = str[imax-i]; str[imax-i] = c; /* В цикле меняются первые и последние элементы */ } /* Конец цикла */
На блок-схеме цикл с параметром имеет следующий вид (см. рис. 4.5).
На языке Quick Basic алгоритм из примера 04 будет записан следующим образом:
[Пример 05]
STRINGS$ = "Demo" REM Определяется длина строки переменной STRINGS$ IMAX% = LEN(STRINGS$) + 1 REM Определяется число циклов NMAX% = IMAX% / 2 REM Цикл: FOR I% = 1 TO NMAX% C$ = MID$(STRINGS$, I%, 1) MID$(STRINGS$, I%, 1) = MID$(STRINGS$, IMAX% - I%, 1) MID$(STRINGS$, IMAX% - I%, 1) = C$ NEXT I% REM Конец цикла PRINT STRINGS$ END
Цикл с параметром используются в следующих случаях:
- При задании точного числа повторений тела цикла;
- Для последовательного изменения "индекса массива" (при операциях с ними в теле цикла). Об индексах массива см. "Другие типы данных" .
4.1.1.7. Оператор множественного выбора
Этот оператор используется для выбора одной из нескольких альтернатив выполнения алгоритма, задающихся значением целой переменной. Его синтаксис примерно следующий:
Для <переменная> выбор <откр_скобка> при <значение1>: <тело 1>; break; при <значение2>: <тело 2>; break; … иначе: <последнее тело>; <закр_скобка>Листинг 4.8.
где <откр_скобка><закр_скобка> - "составной оператор" (см. [раздел 4.1.1.13]); <переменная> - переменная целого типа или типа, приводимого к целому (например, перечисления, одиночный символ и т.п.); <значение n> - одно из возможных значений этой переменной, < тело n> - последовательность действий для этого значения переменной; и <последнее тело> - последовательность операций в случае, если переменная не принимает ни одного из значений в блоке: при.
[Пример 06]
если <значение 1> то <тело 1> иначе если <значение 2> то <тело 2> иначе если … иначе <последнее тело>
где <тело> - оператор или последовательность операторов, заключенных в скобки.
4.1.1.8. Оператор выхода из цикла: "break"
Иногда в реализации алгоритма возникают условия, когда нужно выйти из цикла до завершения всех его итераций. Именно для этих целей служит оператор выхода из цикла. Его синтаксис следующий:
break;Листинг 4.9.
Этот оператор прекращает действие текущего цикла, и переводит выполнение программы в точку за прерванным циклом (в тело программы или в тело "родительского" цикла).
4.1.1.9. Оператор новой итерации: "continue";
Часто в реализации алгоритма требуется прервать выполнение тела цикла и перейти к следующей итерации. Эта операция реализована в разных языках по-разному. На языке Си его синтаксис следующий:
continue;Листинг 4.10.
Конкретную реализацию этой конструкции смотри [59,31,51,74].
Приведем пример, как можно использовать операции " break " и " continue " в бесконечном цикле на языке Си:
[Пример 07]
char c; // Определение переменной while(1) // бесконечный цикл { c=getc() // Чтение символа с клавиатуры // Выход, если введен символ ("эникейщиком") if( c ) then break; else continue; }
4.1.1.10. Оператор безусловного перехода: "goto"
Этот оператор является самым первым оператором для изменения последовательности выполняемых действий. В настоящее время его применение считается "дурным тоном", поэтому его использования необходимо избегать. Однако он незаменим в следующих случаях:
- В языке отсутствуют другие конструкции алгоритма, более "структурированные" (например, в языке Ассемблер);
- Необходимо выполнить "кессонный" выход из цикла при возникновении "исключительной ситуации".
Синтаксис оператора безусловного перехода следующий:
goto <метка>Листинг 4.11.
где <метка> - смотри первое примечание (в разделе 4.1.1.2).
На блок-схеме безусловный переход указывается линией со стрелкой.