BUY WinRAR

Скачай WinRAR сейчас!

120x90-p3m001.gif (5583 bytes)

Партнерская программа для русскоязычных сайтов

Бесплатный файловый хостинг.

Первоклассный софт для всех.

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 в Паскале так же предусмотрено и назначение его такое же.

Google
Rambler's Top100 Яндекс цитирования PageRank

Регистрация доменов .RU по минимальной ценеРегистрация в системе обмена ссылками