Организация циклов в языке С
Теоретическая часть
Операторы цикла относятся к управляющим конструкциям всякого языка программирования. Управляющие операторы и конструкции языка задают порядок, в котором выполняются вычислительные операции программы [3.1].
3.1. Оператор while
Изучение операторов цикла начнем с оператора while. Цикл while имеет следующий формат (синтаксис) записи [3.2]:
while (expression) program statement;
Производится расчет выражения expression, заключенного в круглые скобки. Если в результате расчета выражения expression получается истинный результат ( TRUE ), то выполняется утверждение program statement, следующее непосредственно за закрывающей круглой скобкой. После выполнения этого утверждения вновь рассчитывается выражение expression. Если в результате расчета будет TRUE, то вновь будут выполнены утверждения program statement. Цикл повторяется до тех пор, пока в результате расчета выражения expression (в круглых скобках оператора while ) не будет получено значение FALSE (ложный), которое является признаком окончания цикла, после чего выполнение программы продолжается с утверждения, следующего за утверждением program statement. Когда требуется выполнить группу утверждений, то она (группа) располагается в фигурных скобках:
while (expression) { program statement; program2 statement2; program3 statement3; ... }
Открывающаяся фигурная скобка может следовать непосредственно после закрывающей круглой скобки оператора while. Все, что находится в фигурных скобках, будет выполняться, пока верно выражение expression.
Очевидно, что неверное задание выражения expression может привести к бесконечному циклу (к зацикливанию).
3.2. Оператор for
Оператор цикла for имеет следующий формат записи:
for (init_expression; loop_condition; loop_expression) program statement;
Три выражения, заключенные в круглые скобки оператора цикла for, задают условия выполнения программного цикла [3.2].
Первый параметр init_expression используется для задания начального значения цикла.
Второй компонент loop_condition определяет условие или условия, в соответствии с которыми будет происходить выход из цикла. Повторение будет происходить до тех пор, пока это условие (или условия) выполняются. Если условие не выполняется, то цикл немедленно заканчивается.
Третий параметр loop_expression выполняется каждый раз, когда заканчивается обработка тела цикла, т.е. program statement.
Чаще всего выражения init_expression и loop_expression являются операторами присваивания или вызовами функций, а второе выражение loop_condition – выражением отношения или логическим выражением [3.1]. Любую из трех частей можно опустить, но точки с запятыми должны остаться на своих местах. Если опустить init_expression или loop_expression, то соответствующие операции не будут выполняться. Если же опустить проверку условия loop_condition, то по умолчанию считается, что условие продолжения цикла всегда истинно, и тогда цикл станет бесконечным (произойдет зацикливание).
Когда требуется выполнения нескольких утверждений, то они должны заключаться в фигурные скобки:
for (init_expression; loop_condition; loop_expression) { program1 statement1; program2 statement2; program3 statement3; ... }
В представленном случае тело цикла находится в фигурных скобках.
Конструкция цикла, реализованная оператором for, может быть выполнена также и оператором while следующим образом [3.1]:
init_expression; while (loop_condition) { program statement; loop_expression; }
Исключением является применение операции continue.
Операторы отношения перечислены в табл. 3.1.
Операторы отношения языка программирования С | ||
---|---|---|
№ п/п | Оператор | Значение |
1) | == | Равно |
2) | != | Не равно |
3) | < | Меньше |
4) | <= | Меньше или равно |
5) | > | Больше |
6) | >= | больше или равно |
В программах языка С возможно применять вложенные циклы, каждый из которых контролируется своей переменной цикла и своим отношением (второе выражение в круглых скобках оператора for ). Вложенные циклы могут идти непосредственно друг за другом или составлять тело цикла с помощью фигурных скобок. Возможно также использование двух индексных переменных для инициализации начала цикла с последующим их инкрементированием (увеличением) или декрементированием (уменьшением).
3.3. Оператор do–while
Рассмотренные операторы цикла while и for производят проверку условия выполнения цикла до начала выполнения тела цикла [3.1]. Поэтому тело цикла может ни разу не выполниться, если с самого начала результатом расчета условия выполнения цикла будет значение FALSE (ложь). В случае необходимости производить проверку условия выполнения цикла после тела цикла (т.е. когда выполняется хотя бы одно предписанное действие в теле цикла) прибегают к циклу do–while.
Оператор цикла do–while имеет следующий формат записи [3.2]:
do program statement; while (loop_condition);
Выполнение цикла do–while происходит следующим образом: сначала выполняется утверждение program statement, затем производится проверка условия выполнения цикла loop_condition с помощью оператора while. Если результатом проверки будет значение TRUE (истина), то выполнение цикла продолжится, и утверждение program statement всякий раз будет выполняться вновь. Повторение цикла будет продолжаться до тех пор, пока в результате проверки условия выполнения цикла loop_condition будет получаться значение TRUE. Когда в результате проверки условия будет вычислено значение FALSE (ложь), то выполнение цикла прекратится и произойдет переход к утверждению (следующему фрагменту программы), непосредственно следующему за циклом [3.2].
Таким образом, цикл do–while гарантированно выполнится хотя бы один раз.
В случае выполнения нескольких утверждений используются фигурные скобки для выделения тела цикла:
do { program1 statement1; program2 statement2; program3 statement3; ... } while (loop_condition);
Оператор цикла while называется оператором цикла с предусловием, оператор цикла for называется оператором цикла с параметром, оператор цикла do–while называется оператором цикла c постусловием.
Практическая часть
Рассмотрим примеры программ с операторами циклов while, for и do–while.
Пример 1. Напишите программу вывода на экран пользователя целых положительных чисел с помощью оператора while. Начальное и последнее число должно задаваться пользователем с клавиатуры.
Программный код решения примера:
#include <stdio.h> #include <conio.h> int main(void) { int i, j = 0, n; printf("\n\t Enter the primary natural number: "); scanf_s("%d", &i); printf("\t Enter the last natural number: "); scanf_s("%d", &n); printf("\n\t The numbers are:"); while (i <= n) { printf("\n\t %3d", i); ++i; ++j; } printf("\n\t Total numbers: %d\n", j); printf("\n Press any key: "); _getch(); return 0; }
Возможный результат выполнения программы показан на рис. 3.1.
В программе использована функция scanf_s(), принятая в MS Visual Studio. В программе применено инкрементирование переменных, принятое в языке С, а именно ++i или ++j означает, что переменные увеличиваются на единицу. При этом знаки "++" могут располагаться перед именем переменной или после. Отличие в том, что ++i – это значение переменной после увеличения, а i++ – сначала переменная имеет заданное значение, а потом происходит ее увеличение. Для переменных цикла обе формы равнозначны.
Условием цикла является то, что пока переменная i меньше или равна переменной n (предполагается, что n больше начального значения i ), то будут выполняться действия (печать и увеличение переменной j ), заложенные в теле цикла. Расчет выражения, заключенного в круглые скобки оператора, предназначен для проверки нестрогого неравенства переменной i по отношению к переменной n. Если это неравенство выполняется, то в теле цикла происходят печать и увеличение (инкрементирование) переменных i, j.