Информатика -продвинутый курс


ОПЕРАТОРЫ. УПРАВЛЯЮЩИЕ КОНСТРУКЦИИ ЯЗЫКА


Операторы служат основными строительными блоками программы. В языке Си указанием на наличие оператора служит символ «точка с запятой», стоящий в конце него.

Операторы состоят из выражений. Выражение представляет собой объединение операций и операндов. Операндом называется то, над чем выполняется операция.

Оператор присваивания

Общий вид оператора присваивания <Имя> = <Выражение>;

Пример: int x, у, а;

х=5;

у=х*2+7;

а=у/4;

Переменные получают значения: х=5, у=17, а=4.

В языке Си разрешается включать присваивания в выражения, т. е. присваивание может

рассматриваться как операция с учетом старшинства и влияния скобок.

Пример:

а=(у=(х=5)*2+7)/4.



В результате переменная х получает значение 5, причем это значение участвует в дальнейших вычислениях. Затем выполняется умножение (5*2), сложение (10+7) и еще одно присваивание (у=17). Переменная у получает значение 17, после чего производится деление (17/4), результат которого присваивается переменной а.

В языке Си для компактной записи операторов присваивания имеются специальные операции

+=_=*= /= %= Так, следующие две записи на языке Си эквивалентны: i = i+2 и i+=2.

Пример:

int x,y;

х=у=5;

х+=2; /* х увеличить на 2, результат х=7 */ у- =3; /* у уменьшить на 3. результат у=2 "7 х*=у; /* х умножить на у, результат х=14 */ .- х/=++у; /* разделить х на увеличенный у; результат у=3,х= 12/3 */

Операция присваивания сама по себе имеет значение (равное значению выражения, стоящего справа от знака "=") и может входить в выражения.

Оператор if/else

Общий вид оператора:

If(<выражение>) <оператор1>

else <оператор2>;

Здесь часть "else <оператор2>" является необязательной, можно применять и одиночный оператор

If(<выражение>) <оператор1>;

Вначале вычисляется значение выражения. Оператор выполняется, если значение выражения истинно. Если выражение ложно (его значение равно нулю), и если есть часть с else, то выполняется оператор2.

Программа 88


В1?В2:ВЗ

Сначала вычисляется значение выражения В1. Если оно отлично от нуля (истинно), то вычисляется значение выражения В2, которое и становится значением условного выражения. В противном случае вычисляется значение выражения ВЗ, и оно становится значением условного выражения.

Условное выражение удобно использовать в тех случаях, когда имеется некоторая переменная, которой можно присвоить одно из двух возможных значений. Типичными примерами являются присваивание переменной значения большей из двух величин:

max = (a>b)?a:b;

и нахождение абсолютного значения числа:

х = (у<0)?-у : у;

Оператор-переключатель 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.

Оператор продолжения continue

Оператор continue вызывает преждевременное завершение выполнения тела цикла и переход к следующему шагу цикла. Оператор continue действует только на самый внутренний цикл, частью которого он является.

Программа 94

#include<stdio.h>

main()

(

int x,y,z;

printf("Мы будем вычислять значение функции y=2*x+z\n");

printf("в промежутках [1;6] и [13;18].");

printf("Введите значение z= "}; scant("%d",&z) ;

for(x=l;x<18;x++)

{

if ((x>6) and (x<13))

continue;

y=2*x+z; printf(= %d, у= %d",x,y);

}

}

Оператор безусловного перехода goto

 

Оператор перехода предназначен для безусловной передачи управления в заданную точку программы. Его выполнение заключается в передаче управления оператору, помеченному заданной меткой.

В качестве метки используется идентификатор. Метка отделяется от оператора, к которому она относится, двоеточием. Помеченный оператор должен находиться в пределах той же функции, что и оператор goto. Может быть помечен любой оператор, но никакие два разных оператора не должны иметь одинаковые метки (внутри одной и той же функции). Кроме того, один оператор может быть помечен несколькими метками.



Форма:

goto <метка>;...

<метка>: <оператор>

Составные операторы и блоки

Символы "{" и "}" используются для объединения описаний и операторов в составной оператор или блок, так что все конструкции, заключенные в фигурные скобки, оказываются синтаксически эквивалентными одному оператору. Точка с запятой никогда не ставится после первой фигурной скобки, которая завершает блок.

Составной оператор - последовательность операторов, заключенная в фигурные скобки (при необходимости его используют в качестве «внутреннего» оператора в операторах ветвления и цикла). Он называется также «блоком». Блоки не могут быть вложенными.

Пример /* I -й вариант */

Программа 95

#include<stdio.h>

main()

{

int sam,index=0;

/* В цикл включен только оператор присваивания. Печать данных */ /* будет произведена только один раз - после завершения цикла */

while(index++<10)

sam=10*index+2;

printf("sum= %d\n",sam) ;

)

Результат работы программы:

sam = 102

 /* II -й вариант */

Программа 96

#include<stdio.h>

main ()

(

int sam,index=0;

/* Наличие фигурных скобок гарантирует, что оба оператора */

/* являются частью цикла while, и печать результатов будет */

/* производиться на каждом шаге работы цикла. Весь составной*/

/* оператор рассматривается как один оператор, являющийся */

/* составной частью оператора while. */

while(index++<10)

{

sam=10*index+2; printf("sum = %d\n",sam);

}

}

Результат работы программы:

sam = 12

sam = 22

sam = 32

sam = 42

sam = 52

sam = 62

sam = 72

sam = 82

sam = 92

sam = 102

Пустой оператор

состоит только из точки с запятой (;) и используется для обозначения пустого тела управляющего оператора.


Содержание раздела