Процедурная парадигма
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).
На блок-схеме безусловный переход указывается линией со стрелкой.

