Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование на языке Си. Учебно-методическое пособие
.pdf
21
где один оператор if вложен в другой, else-часть связывается с ближайшим
предыдущим оператором if. Чтобы изменить это соглашение, необходимо
использовать фигурные скобки:
z=0;
if (a > 0)
{ if (b > 0)
z = 1; }
else
z = 2;
выражение – не обязательно логического типа.
int a=2;
if (a) b=2/a;
Оператор-переключатель switch
Переключатель является специальным случаем условного оператора и
позволяет осуществлять многовариантный выбор, заменяя группу вложенных
операторов if-else. В общем случае от имеет следующий формат:
switch (выражение)
{
case const1: оператор
. . .
. . .
case const2: оператор
default: оператор
}
где любая case- или default-часть может отсутствовать, а также могут быть
опущены операторы в любой из этих частей. Здесь switch, case и default –
ключевые слова языка Си; выражение – произвольное выражение целого типа.
Предварительно вычисленное значение выражения в круглых скобках
сравнивается с const во всех вариантах case и управление передается той
группе операторов, которая соответствует найденному значению. В том случае,
когда значение ни одного из константных выражений не совпало со значением
выражения, выполняются операторы, связанные с меткой default, а при ее
отсутствии – оператор, непосредственно следующий за оператором switch.
Никакие два константные выражения в одном операторе-переключателе не
могут иметь одинаковых значений.

22
В следующем примере значение переменной operation, имеющей тип
char, определяет ту арифметическую операцию, которая должна быть
выполнена над переменными x и y:
switch (op)
{
case '+':
z = x + y;
break;
case '-':
z = x - y;
break;
case '*':
z = x*y;
break;
case '/':
z = x/y;
}
Ключевое слово case вместе с const служат просто меткой соответ-
ствующих операторов, и если будут выполняться операторы для некоторого
варианта case, то далее будут выполняться операторы всех последующих
вариантов до тех пор, пока не встретится оператор break (см. ниже). Поэтому,
если нескольким различным значениям выражения должны соответствовать
одни и те же действия, можно воспользоваться следующей конструкцией:
switch (key)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
printf ("Это цифра");
}
Условная операция ?:
результат = выражение1 ? выражение2 : выражение3

23
Если выражение1 истина (не равно 0) результату присваивается значение
выражения 2, иначе – выражения 3.
пример
max=a>b?a:b;
d = sqrt(a<0?-a:a);
пример сравнения условного оператора и условной операции
условный оператор
if(a>b) max=a;
else max=b;
if(c>max) max=c;
printf("max= %d\n", max);
условная операция
printf("max=%d\n"a>b && a>c ?a:b>c?b:c);
Контрольные вопросы
Сравните виды конструкций выбора.
Всегда ли ставятся скобки и какие в условном операторе?
Чем отличается простой оператор от составного оператора?
Зачем ставятся в переключателе операторы break и default?

24
3. Операторы цикла и передачи управления
Оператор цикла while
Оператор while позволяет циклически выполнять определенную
последовательность операторов до тех пор, пока истинно (не нулевое)
некоторое условие, проверяемое перед началом очередной итерации цикла
(цикл с предусловием). Формально его синтаксис может быть описан
следующей формулой:
while (выражение)
оператор;
где while – ключевое слово языка Си; выражение – произвольное выражение,
приводимое к логическому (целому) значению (условие продолжения
итераций); оператор – простой или составной оператор (тело цикла).
Если значение выражения истинно (отлично от нуля), то тело цикла
выполняется до тех пор, пока это выражение не станет ложным (равным нулю),
причем проверка производится всякий раз перед началом очередной итерации
цикла. Если же значение выражения ложно в момент инициализации цикла, то
тело цикла не выполняется ни разу и управление передается оператору,
следующему за оператором while.
В качестве примера использования оператора цикла с предусловием,
рассмотрим фрагмент программы, определяющей длину строки символов
string:
char string[]="abcdrf";
int count = 0;
while (string[count] != '\0')
count++;
После окончания работы этого фрагмента значение переменной count
равно количеству символов в строке string, не считая завершающего нульсимвола.
Пример вычисления факториала
fact=1; i=0;
while (i<12) {
fact*=++i;
printf("%d %d\n",i,fact);
}

25
Пример вычисления с заданной точностью eps = 0,001 суммы следующего ряда
S = 1/2 - 1/22 + 1/23 -… (-1)
n+1
1/2n
float s=0, e=1, eps = 0,001 ;
int z=1, n=1;
while (e>eps) {
n*=2;
e=1./n;
s+=e*z;
printf("%d %f\n",n,e);
z=-z;
}
printf("%f \n",s);
Оператор цикла do-while
Принципиальное назначение этого оператора такое же, как и
рассмотренного ранее оператора while. Семантическое различие двух этих
операторов цикла состоит лишь в том, что в рассматриваемом случае условие
продолжения проверяется после завершения очередной итерации (цикл с
постусловием). В общем виде оператор do-while запивается следующим
образом:
do {
оператор
}while (выражение);
где do и while – ключевые слова языка Си; оператор – простой или
составной оператор (тело цикла); выражение – произвольное выражение,
приводимое к логическому значению (условие продолжения итераций).
После однократного выполнения тела цикла вычисляется значение
выражения. Если найденное значение истинно (отлично от нуля), то
выполняется очередная итерация цикла. Этот процесс повторяется до тех пор,
пока значение выражения не станет ложным (равным нулю), после чего
управление передается оператору, непосредственно следующему за оператором
do-while. Таким образом, тело цикла всегда будет выполнено хотя бы один
раз.
Примеры вычисления факториалов
fact=1; i=0;
do {
fact*=++i;
printf("%d %d\n",i,fact);
} while (i<12);

26
Вычисление факториалов не превосходящих 1 000 000
fact=1; i=0;
do {
fact*=++i;
printf("%d %d\n",i,fact);
} while (fact<1000000);
Удобно использовать, когда цикл должен выполниться хотя бы один раз
do {
printf("vvedite 10>i>1 ");
scanf("%d",&i);
} while (i<1 || i>10);
Оператор цикла for
Общая форма записи оператора цикла for такова:
for (выражение1; выражение2; выражение3) {
оператор
}
где for – ключевое слово языка Си; выражение 1, 2 и 3 – произвольные
выражения, причем второе из них приводится к логическому значению;
оператор – простой или составной оператор (тело цикла).
Оператор for является наиболее мощным средством реализации
циклических алгоритмов и управления циклическими процессами. Он
объединяет в себе инициализацию переменных, проверку условия продолжения
итераций и модификацию переменных перед выполнением очередной
итерации.
1) выполняется выражение1
2) вычисляется выражение2, если оно ложно (==0) цикл заканчивается
3) вычисляется оператор – тело цикла
4) вычисляется выражение3
5) переход к п2
что по своей сути эквивалентно следующей группе операторов:
выражение1;
while (выражение 2) {
оператор;
выражение3;
}

27
Пример вычисления факториала
fact=1;
for(i=1;i<=12;i++) {
fact*=i;
printf("%d %d\n",i,fact);
}
Каждое из выражений в заголовке цикла может состоять из нескольких
подвыражений, связанных между собой операцией запятая (,). Эта операция
обеспечивает последовательное вычисление своих операндов слева направо,
причем ее результатом является значение самого правого операнда.
Применительно к оператору цикла for, операция запятая чаще всего
используется в тех случаях, когда необходимо иметь несколько
инициализирующих и корректирующих выражений.
for(fact=1, i=1;i<=12; fact*=i, printf("%d %d\n",i,fact),i++ ) ;
Если использовать два или более выражениий2 – условием будет последнее
выражение
for(fact=1, i=1;i<=12, fact<100000; fact*=i, printf("%d %d\n",i,fact),i++ ) ;
Любое из трех выражений, входящих в заголовок цикла, может быть
опущено при сохранении следующей за ним точки с запятой. В случае
отсутствия выражения 2 ему условно присваивается постоянное значение
"истина", что равносильно бесконечному циклическому процессу.
for(;;);
for(;выражение;) – аналог while
Вложенные циклы
Внутри одного цикла может располагаться другой, общее количество
повторений – произведение количества повторений одного цикла на количество
повторений второго.
Пример: вывод таблицы Пифагора
for(int i=1; i<10; i++) {
for(int j=1; j<10; j++)
printf("%4d",i*j);
printf("\n");
}

28
Пример: вычислить количество простых чисел в диапазоне от 1 до 100000
n=0;
for(int i=1; i<N; i++) {
int k=1;
for(int j=2; j<=sqrt(i); j++)
if(!(i%j)) { k=0; break;}
if(k) n++;
}
printf("n=%d\n",n);
Операторы передачи управления
Оператор завершения break
В ряде случаев возникает необходимость завершить выполнение какоголибо оператора цикла или оператора-переключателя раньше, чем это
произойдет в соответствии с принятой семантикой этих операторов.
Для этой цели служит оператор break, прекращающий выполнение
ближайшего вложенного оператора while, do-while, for или switch и
передающий управление оператору, следующему за заканчиваемым.
Идентификатор break является ключевым словом языка Си.
Пусть, например, необходимо найти сумму N чисел до первого
отрицательного элемента. Эту задачу можно решить с помощью следующего
программного фрагмента:
float s = 0, x;
for (i = 0; i < N; i++) {
printf("vvedite x");
scanf("%f",&x);
if (x < 0) break;
s = s + x;
}
printf("%f \n",s);
Оператор break вне одного из операторов while, do-while, for или switch
приводит к ошибке на этапе компиляции программы.
Оператор продолжения continue
При возникновении необходимости прекратить выполнение текущей
итерации ближайшего внешнего оператора while, do-while или for и перейти к
началу следующей итерации, может быть использован оператор continue. В

29
случае операторов while и do-while очередная итерация начинается с
вычисления и проверки истинности выражения, а в операторе for – с
вычисления значения выражения3. Идентификатор continue является
ключевым словом языка Си.
Пусть в примере теперь необходимо найти сумму положительных чисел
из N. Используя оператор continue, это можно сделать следующим образом:
float s = 0, x;
for (i = 0; i < N; i++) {
printf("vvedite x");
scanf("%f",&x);
if (x < 0) continue;
s = s + x;
} printf("%f \n",s);
Оператор перехода goto
Как и в большинстве языков программирования, в языке Си имеется
возможность безусловной передачи управления любому оператору в
пределах текущей функции, хотя гибкость управляющих конструкций этого
языка позволяет почти всегда обходиться без такой возможности.
Формальный синтаксис оператора перехода следующий:
goto label;
где goto – ключевое слово языка Си, а label – метка оператора в пределах
текущей функции. Согласно синтаксическим правилам языка Си, каждому
оператору программы может быть присвоено уникальное имя, называемое
меткой этого оператора. Сама метка является правильным идентификатором
языка, за которым следует символ двоеточие (:). Метки операторов могут быть
использованы только лишь как объекты ссылок в операторе goto.
Пример различного расположения меток в программе:
float s = 0, x;
for (i = 0; i < n; i++) {
//m:;
printf("vvedite x");
scanf("%f",&x);
if (x < 0) goto m;
s = s + x;
// m:;
}
m:printf("%f \n",s);

30
Оператор возврата return
Оператор return прекращает выполнение текущей функции и возвращает
управление той функции, из которой была вызвана текущая. В общем случае он
имеет следующий формат:
return выражение;
где return – ключевое слово языка Си, а выражение – произвольное
необязательное выражение.
После прекращения выполнения текущей функции и передачи
управления вызвавшей функции, выполнение последней продолжается с
оператора, непосредственно следующего за точкой вызова. Кроме этого, при
наличии выражения после return его значение передается вызвавшей функции.
Если же выражение в операторе return отсутствует, то возвращаемое текущей
функцией значение считается неопределенным.
В случае использования оператора return в главной функции (т.е.
функции, имеющей имя main), его действие приводит к прекращению
выполнения программы и передаче управления операционной системе.
Пример:
float s = 0, x;
for (i = 0; i < n; i++) {
printf("vvedite x");
scanf("%f",&x);
if (x < 0) return;
s = s + x;
}
printf("%f \n",s);
Контрольные вопросы
Какие выражения записываются в заголовке цикла? Правила записи этих
выражений.
Когда завершается выполнение цикла?
По какой причине может произойти зацикливание (цикл становится
бесконечным)?
Как можно досрочно выйти из цикла? Как можно досрочно перейти к
новому шагу цикла?
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
