В тех случаях, когда в программе необходимо произвести выбор одногоиз нескольких вариантов, удобно применять оператор switch. Его синтаксис:
switch (<выражение>)
{
case <константа1>: <список операторов1>;
case <константа2>: <список операторов2>;
…
case <константаN>: <список операторовN>;
default: <список операторов>;
}
Оператор-переключатель выполняется следующим образом. Вычисляется значение выражения в скобках, приведенного после ключевого слова switch, затем программа просматривает список меток, указанных после слов case, до тех пор, пока не находит ту, которая соответствует данному значению. Далее программа переходит к выполнению оператора, расположенного в этой строке. Если подходящей метки не найдется и если существует строка с меткой default:, то будет выполнятся оператор, помеченный этой меткой. В противном случае произойдет переход к оператору, расположенному за оператором switch.
Метки, имеющиеся в операторе switch, должны быть константами или константными выражениями (выражениями, операнды которого константы) целого или символьного типа. Запрещается использовать в качестве метки переменную. Значением выражения в скобках должна быть величина целого или символьного типа. Список операторов варианта может быть либо пустым, либо заканчиваться одним из операторов завершения (break, continue, goto, return). Если у вариантов нет общих частей, то рекомендуется каждый вариант завершать оператором break.
Программа 89
#include < stdio.h >
main ()
{
int c;
printf("Введите цифру от 1 до 7:");
c=getchar();
printf("\nСоответствующий день недели:");
switch (с)
{
case '1': (printf("\nПонедельник!");break;}
case ' 2': {printf("\nВторник!");break;}
case '3': (printf("\nСреда!");break;}
case '4': {printf("\nЧетверг!");break;}
case '5': (printf("\nПятница!");break;)
case '6': {printf("\nСуббота!");break;}
default:printf("\nBocкpeceньe!");
}
}
Если не использовать оператор завершения, то по окончании выполнения списка операторов выбранного варианта произойдет переход на следующий вариант из списка.
Оператор цикла for
Оператор
for (<оператор1>;<выражение>;<оператор2>) <оператор3>;
позволяет организовать повторяющийся вычислительный процесс и называется оператором цикла. Как правило, оператор1 и оператор2 являются операторами присваивания или обращениями к функции, а выражение1 - условным выражением.
Цикл for удобно использовать в тех случаях, когда заранее известно количество повторений тела цикла, или имеется явно выраженная переменная, управляющая циклом. В этом случае выражение1 вычисляется один раз и задает инициализацию управляющей переменной.
Выражение1 является условием завершения цикла, а оператор2 задает приращение управляющей переменной.
Например, следующая конструкция
for (i=l; i<n; i++) <оператор>;
является широко распространенной и позволяет «перебрать» первые п натуральных чисел. Из первой строки цикла for можно сразу узнать всю информацию о параметрах цикла: начальное значение переменной i, ее конечное значение, а также насколько увеличивается значение переменной i при каждом выполнении тела цикла.
Любой из операторов и выражений в цикле for может быть опущен, хотя точка с запятой при этом должна оставаться. Если отсутствует оператор1 или оператор2, то он просто выпадает из вычислений. Если же отсутствует выражение1, то считается, что оно всегда истинно.
Например,цикл
for (i=l;;i++) {
…
}
является бесконечным.
Существуют разнообразные возможности применения цикла for:
1) можно применять операцию уменьшения для счета в порядке убывания вместо счета в порядке возрастания
for(n=10;n>0;n-)
printf("%d \n",n);
2) при желании можно вести счет двойками, десятками и т.д.
for (n=2;n<60;n+=2)
printf("%d\n",n);
3) можно вести подсчет при помощи символов, а не только чисел
for(ch='a';ch<='z';ch++)
printf("Beличинa кода ASCII для %с равна %d.\n",ch,ch);
4) можно проверить выполнение некоторого произвольного условия, отличного от условия, налагаемого на число итераций
for(num=l;num*num*num<216;num++)
5) можно сделать так, чтобы значение некоторой величины возрастало не в арифметической, а в геометрической прогрессии
for(n=l;n<1500;n*=3)
printf("-%d \n",n);
6) в качестве третьего выражения можно использовать любое правильно составленное выражение; какое бы выражение вы ни указали, его значение будет меняться при каждой итерации
for(x= I;у<=75;у=5*(х++)+10)
printf("%d, %d\n",x,y);
7) можно даже опустить одно или более выражений (но при этом нельзя опускать символы ";"); необходимо только включить в тело цикла несколько операторов, которые в конце концов приведет к завершению его работы
ans=2;
for(n=3;ans<=25;)
ans=ans*n;
Тело цикла for(;;)
printfC"* \ n");
будет выполняться бесконечное число раз, поскольку пустое условие всегда считается истинным;
8) первое выражение не обязательно должно инициализировать переменную; вместо этого, например, там мог бы стоять оператор printf() некоторого специального вида; необходимо помнить, что первое выражение вычисляется только один раз перед тем, как остальные части цикла начнут выполняться
for(printf("3апоминайте введенные числа!\n");num = 6;)
scanf('"%d",&num);
printf("ЭTO как раз то, что я хочу!\n");
в этом фрагменте первое сообщение оказывается выведенным на печать один раз, а затем осуществляется прием вводимых чисел до тех пор, пока не поступит число 6;
9) параметры, входящие в выражения, находящиеся в спецификации цикла, можно изменить при выполнении операций в теле цикла; предположим, например, что есть цикл со спецификацией следующего вида:
for(n=l;n< l000;n+=delta)
и если после нескольких итераций программа решает, что величина параметраdaltaслишком мала или велика, оператор if внутри цикла может изменить значение этого параметра (в диалоговой программе пользователь может изменитьэтот параметр в процессе выполнения цикла).
В качестве оператора в теле цикла также может быть цикл. На количество вложений циклов друг в друга ограничений нет.
В спецификацию цикла for может быть включено несколько инициализирующих или корректирующих выражений. Например, два вложенных цикла можно записать двумя различными способами:
1. for(i=l;i<10;i++)
for(j=l;j<10;j++)
<оператор>
2. for(i=l,j=l;i<10,j<10;i++,j++)
<оператор>
В нижеследующей программе переменные х, у, z изменяются параллельно.
Программа 90
# include<stdio.h>
main()
{
int x,y,z,v,u,zero();
for(x=l,y=l,z=l;x<10;x++,y++,z++)
printf("x=%d y=%d z=%d\n", х, y, z);
}
Результат работы программы:
x=l y=l z=l
x=2 y=2 z=2
x=3 y=3 z=3
x=4 y=4 z=4
x=5 y=5 z=5
x=6 y=6 z=6
x=7 y=7 z=7
x=8 y=8 z=8
x=9 y=9 z=9
Оператор цикла while
В общем виде цикл while записывается так:
while (<выражение>) <оператор>;
Цикл while является «условным» циклом, использующим предусловие (т.е. условие на входе). Он называется условным, потому что выполнение оператора зависит от истинности условия, описываемого с помощью выражения..
Если выражение «истинно» (или в общем случае не равно нулю), то оператор, входящий в цикл while, выполняется один раз, а затем выражение проверяется снова. Эта последовательность действий, состоящая из проверки и выполнения оператора, периодически повторяется до тех пор, пока выражение не станет ложным (или в общем случае равным нулю). После этого управление передается оператору, следующему за оператором цикла while.
При построении цикла while необходимо включить в него какие-то конструкции, изменяющие величину проверяемого выражения так, чтобы в конце концов оно стало ложным. В противном случае выполнение цикла никогда не завершится.
Пример 1. Алгоритм Евклида.
Программа 91
#include<stdio.h>
main()
{
int x,y;
scanf("\n%d",&x); scanf("\n%d",&y);
while (x!=y)
{
if (x>y) x=x-y; else y=y-x;
)
printf("\n%d",x);
)
Пример 2. Проверить, содержит ли квадрат натурального числа n цифру 3.
Программа 92
#include<stdio.h>
main()
{
int i,n,a;
scanf("%d",&n); n=n*n; i=10000;
while(i>=l)
{
a=n/i; /* если результат целочисленного деления n/i
меньше 1,то а=0 */
n=n-a*i;
if(a==3) goto abc; else i=i/10;
)
printf("цифры 3 в числе n^2 нет");
goto cd;
abc: printf("цифра 3 в числе n^2 есть");
cd:;
}
Оператор цикла do/while
В языке Си имеется также конструкция цикла с постусловием (условие на выходе), где истинность условия проверяется после выполнения каждой итерации цикла. Этот подход реализуется с помощью цикла do/while.
Тело цикла do/while всегда выполняется по крайней мере один раз, поскольку проверка условия осуществляется только после его завершения.
Форма записи:
do <оператор>
while (<выражение>);
Оператор break
Оператор break дает возможность выйти из операторов цикла for, while, do/while, а также из переключателя switch без проверки условия. Оператор break приводит к немедленному выходу из самого внутреннего охватывающего его цикла или из переключателя.
Оператор break может использоваться для выхода из цикла в тех случаях, когда заданы два разных условия прекращения его работы.
Программа 93
# include<stdio.h>
main()
{
int x=l,y,z;
printf("Мы будем вычислять значение функции y=2*x+z\n");
printf("Введите значение z:"); scant("%d",&z);
while(x<1000)
(
y=2*x+z;x++; if y=100 (printf(= 100\n"); break; }
} if y=100
printf("Цикл закончен!!!");
else printf ("Цикл закопчен!!! Но y<>lOO.");
}
Наличие оператора break позволяет использовать «бесконечные циклы». В ряде случаев весьма удобно записать заголовок цикла без всякого условия в виде
for(;;),
а выход из цикла оформить с помощью операторов break.