Операторы цикла
В языке Си реализованы три вида операторов цикла:
1) while — цикл с предусловием;
2) do...while — цикл с постусловием;
3) for — цикл с заданным числом повторений (цикл с предусловием).
Цикл while
Общая форма записи
while(условие)
<оператор>;
или while(условие)
{ <оператор 1>;
<оператор 2>;
...
}
Если условие истинно (т. е. не равно нулю), то выполняется оператор или группа операторов, входящих в цикл while, затем выражение проверяется снова. Последовательность действий, состоящая из проверки и выполнения оператора, повторяется до тех пор, пока выражение не станет ложным. После этого происходит выход из цикла, и далее выполняется оператор, стоящий после оператора цикла.
При построении цикла while в него необходимо включить конструкции, изменяющие величину проверяемого выражения так, чтобы в конце концов оно стало ложным. Иначе выполнение цикла никогда не завершится.
Цикл while – цикл с предусловием, поэтому вполне возможно, что тело цикла не будет выполнено ни разу.
Пример
|
|
int к=5, n=10; while(к<n) { printf("k=%d n=%d\n",k, n); к+=2; n++; } |
Если после оператора while стоит несколько строк кода, принимающих участие в цикле, то ставятся фигурные скобки {}.
Цикл do...while
Общая форма записи
do <оператор>;
while (условие);
Цикл do...while – это цикл с постусловием, в котором истинность выражения проверяется после выполнения всех операторов, включенных в цикл. Тело цикла выполняется до тех пор, пока условие не станет ложным, т. е. тело цикла выполнится хотя бы один раз. Использовать цикл лучше всего в тех случаях, когда должна быть выполнена хотя бы одна итерация.
do printf("\n Введите число 10"); scanf("%d",&number); while(number!=10); |
Важно!!! В цикле do...while после условия ставится точка с запятой!
Цикл for
Общая форма записи
for(<инициализация>; <проверка условия>; <коррекция>)
{<оператор>;
...
}
Цикл for – цикл с фиксированным числом повторений. Для организации такого цикла должны рассматриваться три операции:
– инициализация счетчика;
– сравнение его величины с некоторым граничным значением;
– изменение значения счетчика при каждом прохождении тела цикла.
Все три компонента цикла for являются выражениями. Они записываются в скобках и разделяются точкой с запятой. Первое выражение служит для инициализации счетчика. Инициализация осуществляется только один раз — когда цикл for начинает выполняться. Второе выражение — для проверки условия перед каждым возможным выполнением тела цикла. Когда выражение становится ложным, цикл завершится. Третье выражение вычисляется в конце каждого выполнения тела цикла. Счетчик может, как увеличиваться, так и уменьшаться. Например,
|
|
main () { int num; for(num=l; num<=5; num++) printf(" % 5d % 5d \n",num, num*num); } |
В качестве третьего выражения может использоваться любое правильно составленное выражение, изменяющее значение проверяемого условия. Например:
for (х=1; у<=35; у=5*х++ +10)
printf ("%10d %10d\n",х,у);
Важно!!! Можно опустить одно или несколько выражений, но нельзя опускать точку с запятой.
Параметры, находящиеся в заголовке цикла, можно изменить при выполнении операций в теле цикла. При этом на месте опущенного выражения должен стоять пустой оператор «;».
к=2; for(n=3; k<=25;) { k*=n; } |
Если отсутствует <проверка условия>, то считается, что оно всегда истинно. Поэтому цикл for(;;) является бесконечным и предполагается, что он будет прерван другими средствами, такими как break или return.
В цикле for часто используется операция «запятая» для разделения нескольких выражений. Это позволяет включить в спецификацию цикла несколько инициализирующих или корректирующих выражений. Выражения, к которым применяется операция «запятая», вычисляются слева направо.
for(i=0,j=l; i<n; i++, j=i);
Запятые, которые разделяют аргументы функций, переменные в описаниях не относятся к операции «запятая».
В Си допускаются вложенные циклы, т. е. когда один цикл находится внутри другого.
for (i= 0;i<n;i++) { for(j =0; j<n; j++) {... } } |
Рекомендации по выбору цикла. При выборе цикла необходимо оценить следующие факторы:
– Нужен ли цикл с предусловием или цикл с постусловием (чаще используется цикл с предусловием).
– Если в цикле необходима инициализация и коррекция, то цикл for более предпочтителен. Этот цикл чаще всего используется при подсчете числа прохождений тела цикла с обновлением индекса.
Операторы break и continue
В теле любого цикла можно использовать оператор break, который позволяет выйти из цикла, не завершая его.
while(<условие>)
break;
или
switch(<целое выражение>)
{ case <константное выражение1>: <оператор1>; break;
...
}
Оператор continue позволяет пропустить часть операторов тела цикла и начать новую итерацию.
while(<условие>)
continue;
Во вложенных циклах действие операторов break и continue распространяется только на самую внутреннюю структуру (в которой они содержатся). Использование этих операторов возможно, но нежелательно, т.к. они ухудшают читаемость программы, увеличивают вероятность ошибок, затрудняют модификацию.
main () {
int i,j;
float k;
printf(" Введите j");
scant("%d", &j);
for (i = -5; i <= 5; i++)
{ if(i==0)
continue;
}
printf("\n %d/%d =%f ",j, i,k=j/i);
Оператор безусловного перехода (goto)
Общая форма записи
goto метка;
метка: <оператор>;
Выполнение оператора goto вызывает передачу управления в программе оператору, помеченному меткой. Переход может осуществляться в пределах одной функции.
Для отделения метки от оператора используется двоеточие. Помеченный оператор может появиться в программе как до оператора goto, так и после. Имена меток образуются по тем же правилам, что и имена переменных.
b: s=const*flag;
if (size>12)
gоtо a;
else
gоtо b;
а: cost=cost*3;
flag= 1;
Использование goto в программе крайне нежелательно, так как он усложняет логику программы. Язык Си реализован таким образом, что можно программировать без оператора goto.