Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Оператор-переключатель switch
В тех случаях, когда в программе необходимо произвести выбор одногоиз нескольких вариантов, удобно применять оператор 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.
|
Последнее изменение этой страницы: 2017-03-14; Просмотров: 315; Нарушение авторского права страницы