3. Управляющие
конструкции в Си.
3.1 Операторы циклов в Си.
Теперь поговорим об операторах
цикла более детально. Для этого несколько
изменим программу пересчёта температуры по
Фаренгейту в температуру по Цельсию и рассмотрим
аналогичную программу на языке Паскаль.
Рассмотрим сначала программу
на Паскале.
Зарезервированное слово const означает начало раздела описания
констант. В этом разделе описаны две константы и
их значения.
Использование констант делает
программу более “читаемой”. Но ещё более важно
то, что если Вам понадобится, по какой-либо
причине, изменить значение константы, то это надо
сделать только однажды (в разделе описания
констант), а не выискивать её по всей программе.
В рассмотренной ниже программе,
в операторе fahr:=LOWER;
переменной fahr
присваивается значение переменной LOWER.
Оператор while fahr<=UPPER do является оператором цикла. Так как
тело данного оператора является составным
оператором, то оно расположено между словами begin и end.

Теперь рассмотрим программу на
языке Си. Обратите внимание, что описание
переменных здесь происходит до написания самой
функции, и делается это с помощью специальной
директивы препроцессора: #define LOWER 0. Данная директива определяет
константу.
В языке Си, чтобы описать
константу, необходимо, начиная с самой левой
позиции, записать ключевое слово #define, имя константы, пробел, её
значение.
Как видите, вторая константа,
определяется таким же образом и ей присваивается
значение 300.

Обратите внимание на запись
следующей строки: float fahr=LOVER; Язык Си допускает совмещение
оператора объявления и присваивания. Это удобно,
поскольку программа становится более короткой и
более наглядной.
С оператором цикла while
(fahr<=UPPER) мы уже знакомились.
Тело данного цикла – составной оператор, поэтому
все входящие в него операторы заключены между
фигурными скобками.
Обратите внимание на наличие в
теле цикла следующей строки: fahr=fahr+step; Этот оператор примечателен тем, что
на каждом шаге цикла увеличивает переменную fahr, которая используется для проверки
окончания цикла (аналогичный оператор
присутствует и в программе на Паскале). Не будь
этого оператора, переменная fahr не изменяла бы своего значения и
условное выражение за ключевым словом while всегда было бы истинным. Это привело
бы к бесконечному повторению цикла, как говорят,
к зацикливанию.
Сравните различие в выводе на
печать в этих программах. Формат вывода
переменных указывается, как видите, различным
образом, но вот одна общая деталь. Как на Паскале,
так и на Си для определения значения
спецификатора, можно непосредственно выводить
результат выражения, определив его в операторе
вывода.
Оператор while определяет операции, которые
циклически выполняются до тех пор, пока
проверяемое выражение не станет ложным (равным
нулю).
Оператор while – это цикл с ПРЕДУСЛОВИЕМ;
решение выполнять ли в очередной раз тело цикла
принимается ПЕРЕД началом его выполнения.
Вполне возможно, что тело цикла не будет
выполнено ни разу.
Мы уже говорили о том, что
оператор, образующий тело цикла, может быть либо
простым, либо составным.
При построении цикла while необходимо включить в него какие-то
конструкции, изменяющие величину проверяемого
выражения так, чтобы в конце концов оно стало
ложным. В противном случае выполнение цикла
никогда не завершится. Не менее важно
инициализировать все переменные, участвующие в
условном выражении цикла while.
При организации цикла, когда
его тело должно быть выполнено фиксированное
число раз, осуществляется три операции:
- инициализация счётчика;
- сравнение его величины с
некоторым граничным значением;
- увеличение значения счётчика
при каждом прохождении тела цикла.

Инициализация счётчика
осуществляется вне цикла (1), его приращение
внутри цикла (3). Всё это увеличивает вероятность
ошибки.
В цикле for инициализация, проверяемое условие
и приращение счётчика собраны в одном месте.
Рассмотрим следующий фрагмент:

В круглых скобках после
ключевого слова for
содержится три выражения, разделённых
символами “точка с запятой”. Первое
выражение служит для инициализации счетчика. Оно
осуществляется только один раз – когда цикл for
начинает выполняться.
Второе выражение служит для
проверки условия; она производится перед каждым
возможным выполнением тела цикла. Когда
выражение становится ложным, цикл завершается.
Третье выражение
вычисляется в конце каждого выполнения тела
цикла.
В цикле for, любое выражение может быть
пропущено, но при этом нельзя опускать символы
“точка с запятой”

Тело цикла for(;;) будет выполняться бесконечное
число раз, поскольку пустое условие всегда
считается истинным.
Сразу же бросается разница в
использовании данного цикла с аналогичным
циклом в Паскале. В языке Паскаль для оператора for определяется только начальное и
конечное значение счётчика, которые задают
диапазон изменения значения счетчика и
направление изменения (возрастание или
убывание).

Так же как на языке Паскаль, так
и на языке Си тело цикла может быть составным
оператором.
Оператор for – это цикл с ПРЕДУСЛОВИЕМ:
решение выполнить в очередной раз тело цикла или
нет, принимается ДО НАЧАЛА его прохождения.
Поэтому может случиться так, что тело цикла не
будет выполнено ни разу. В реализации цикла for
на Паскале такая ситуация так же
возможна, если начальное и конечное значение
счётчика определяется каким-либо выражением.
Однако следует заметить, что в
языке Си существует операция “запятая”. Эта
операция увеличивает гибкость использования
цикла for, позволяя
включать в его спецификацию несколько
инициализирующих или корректирующих выражений.

Применение операции “запятая”
не ограничено только циклом for, но именно в них она используется
особенно часто. Следует также знать, что при её
использовании гарантируется, что выражения, к
которым она применяется (т.е. выражения,
разделённые запятой), будут вычисляться слева
направо. Надо заметить, что данная операция для
Паскаля не характерна и аналогов ей нет. Давайте
рассмотрим пример на использование операции “запятая”.

В нашем примере переменная count
будет инициализирована до
переменной cost. В данном случае это не имеет
значения, но порядок инициализации мог бы
оказаться существенным, если выражение,
соответствующее cost,
содержало бы переменную count.
Циклы while
и for, являются циклами с
предусловием. Проверка истинности условия
осуществляется перед началом каждой итерации
цикла.
Как и в языке Паскаль, так и в
языке Си, имеется конструкция, которая является
циклом с постусловием. Такой конструкцией
является цикл do-while, где
истинность условие проверяется после
выполнения каждой итерации цикла. В языке
Паскаль аналогом такому циклу является
конструкция repeat-until.

Оба цикла с постусловием всегда
выполняются, по крайней мере, один раз, поскольку
проверка, как в первом, так и во втором случае,
осуществляется только после его завершения. В Си,
оператор do while определяет
действия, которые циклически выполняются до тех
пор, пока проверяемое условие не станет ложным
(равным нулю), в то время как оператор repeat until прекращает работу при истинном
условии.
Напомним, что оператор,
образующий тело цикла, может быть как простым,
так и составным.
В теле операторов цикла могут
использоваться новые операторы: break и continue.
Оператор break обеспечивает
немедленный выход из цикла. Оператор continue вызывает прекращение и начало
следующей итерации. Использование оператора break в Паскале так же предусмотрено и
назначение его такое же. |