Опубликован: 23.10.2009 | Уровень: для всех | Доступ: платный
Лекция 4:

Процедурная парадигма

< Лекция 3 || Лекция 4: 1234 || Лекция 5 >
4.1.1.6. Оператор цикла с индексом

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

для <пер> от <начало> до <конец> шаг <шаг> делать <оператор>
Листинг 4.6.

где <пер> является переменной целого типа, принимающая значение переменной - индекса. Вне цикла ее значение не определено (попросту, ее нельзя использовать вне цикла). <начало> означает начальное значение индекса в цикле, <конец> - конечное значение индекса в цикле, а <шаг> - приращение цикла на каждой итерации (по-умолчанию используется приращение переменной цикла, равное "+1"). <начало>, <конец> и <шаг> могут принимать значения констант и переменных, однако переопределение этих параметров в цикле запрещено. Параметр <оператор> имеет то же значение, что и в описании цикла: "пока" (см. [раздел 4.1.1.4]).

Конструкция, приведенная в [4.6], задает переменной <пер> последовательность значений: <начало>, <начало>+<шаг>, <начало>+2·<шаг>, …, <конец> на каждой итерации. При этом "тело цикла" повторяется int((<конец>-<начало>)/<шаг>)+1 число раз (см. формулу 4.7), Это число должно быть больше нуля.

n := int( (<конец>-<начало>)/<шаг>)+1
Листинг 4.7.
Примечание: если по формуле 4.7 получается отрицательное число, компилятор выдаст сообщение об ошибке. Если оно находится в пределах [0;1], то число повторений не определено (все зависит от реализации языка).
Примечание: этот цикл соответствует модификатору: " {n} " в регулярных выражениях (n-точное число повторений). Оператор "цикл с параметром" может быть реализован циклом: "пока" - следующим образом (см. Пример 03):

[Пример 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).

Оператор цикла с параметром на блок-схеме

Рис. 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

Цикл с параметром используются в следующих случаях:

  1. При задании точного числа повторений тела цикла;
  2. Для последовательного изменения "индекса массива" (при операциях с ними в теле цикла). Об индексах массива см. "Другие типы данных" .
4.1.1.7. Оператор множественного выбора

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

Для <переменная> выбор <откр_скобка>
при <значение1>:
	<тело 1>; break;
при <значение2>:
	<тело 2>; break;
…
иначе:
	<последнее тело>;
<закр_скобка>
Листинг 4.8.

где <откр_скобка><закр_скобка> - "составной оператор" (см. [раздел 4.1.1.13]); <переменная> - переменная целого типа или типа, приводимого к целому (например, перечисления, одиночный символ и т.п.); <значение n> - одно из возможных значений этой переменной, < тело n> - последовательность действий для этого значения переменной; и <последнее тело> - последовательность операций в случае, если переменная не принимает ни одного из значений в блоке: при.

Замечание: оператор множественного выбора может "моделироваться" повторением оператора ветвления, например:

[Пример 06]

если <значение 1> то <тело 1>
иначе если <значение 2> то <тело 2>
иначе если …
иначе <последнее тело>

где <тело> - оператор или последовательность операторов, заключенных в скобки.

Замечание: оператор множественного выбора не часто встречается в символьных вычислениях. Вместо него чаще используется конструкция из примера 06.
Множественный выбор на блок-схеме.

Рис. 4.6. Множественный выбор на блок-схеме.
4.1.1.8. Оператор выхода из цикла: "break"

Иногда в реализации алгоритма возникают условия, когда нужно выйти из цикла до завершения всех его итераций. Именно для этих целей служит оператор выхода из цикла. Его синтаксис следующий:

break;
Листинг 4.9.

Этот оператор прекращает действие текущего цикла, и переводит выполнение программы в точку за прерванным циклом (в тело программы или в тело "родительского" цикла).

Замечание: если по условию нужно выйти изо всех циклов ("кессонный выход"), лучше использовать оператор безусловного перехода goto (см. раздел 4.1.1.10).
Примечание: в языке Perl изменен порядок выхода из цикла и синтаксис операций. Подробнее смотри [59].
4.1.1.9. Оператор новой итерации: "continue";

Часто в реализации алгоритма требуется прервать выполнение тела цикла и перейти к следующей итерации. Эта операция реализована в разных языках по-разному. На языке Си его синтаксис следующий:

continue;
Листинг 4.10.

Конкретную реализацию этой конструкции смотри [59,31,51,74].

Замечание. в языках, не имеющих конструкции: " continue ", (например - в Quick Basic), данную операцию можно "моделировать" с помощью безусловного перехода " goto " на метку после последнего оператора тела цикла.

Приведем пример, как можно использовать операции " break " и " continue " в бесконечном цикле на языке Си:

[Пример 07]

char c; // Определение переменной

while(1) 		// бесконечный цикл
{
	c=getc() 	// Чтение символа с клавиатуры
	// Выход, если введен символ ("эникейщиком")
	if( c ) then break; else continue;
}
4.1.1.10. Оператор безусловного перехода: "goto"

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

  1. В языке отсутствуют другие конструкции алгоритма, более "структурированные" (например, в языке Ассемблер);
  2. Необходимо выполнить "кессонный" выход из цикла при возникновении "исключительной ситуации".
Примечание: "Кессонный выход" из вложенного цикла подразумевает прекращение итераций и выход не только из "текущего цикла" (в котором возникла исключительная ситуация), но также из "родительского цикла" и даже вообще из всех циклов, заставив ЭВМ продолжать выполнение программы вслед за вложенными циклами. "Кессонным" этот выход называется так потому, что он как бы соответствует "немедленному подъему водолаза на поверхность", без предварительной адаптации его к пониженным давлениям. В результате этого подъема у водолаза может наблюдаться "кессонная болезнь", которая заключается в закупоривании сосудов пузырьками сжатого воздуха. Поскольку этот подъем небезопасен, его используют редко. То же самое относится к "кессонному выходу из цикла": при возможности его следует избегать.

Синтаксис оператора безусловного перехода следующий:

goto <метка>
Листинг 4.11.

где <метка> - смотри первое примечание (в разделе 4.1.1.2).

На блок-схеме безусловный переход указывается линией со стрелкой.

< Лекция 3 || Лекция 4: 1234 || Лекция 5 >
Юрий Фролов
Юрий Фролов
Украина
Ольга Галанина
Ольга Галанина
Россия