Файл: Могилев А.В. Информатика.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 31.03.2021

Просмотров: 6822

Скачиваний: 51

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

316 

Пример:

 

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

 (нахождение наибольшего из двух целых чисел а и b) 

#include <stdio.h> 
main( ) 

int a,b; 
printf("Введите первое число -

 ");

 scanf("%d", &a) ; 

printf("Введите второе число - "); scanf("%d", &b) ; 
if (a==b) 
printf("Заданные числа равны.\n"); 
else 
if (a>b) 

printf("Первое число больше второго."); 

else printf("Второе число больше первого."); 

При  программировании  требуется  аккуратно  различать  знаки  =  и  ==,  потому  что  в  ряде 

случаев  компилятор  не  сможет  обнаружить  ошибки,  связанной  с  неправильным  использованием 
знаков этих операций, что приведет к неверным результатам. 

В  качестве  оператора!  может  стоять  любой  оператор,  в  частности,  снова  оператор  if/else. 

При этом может возникнуть неоднозначность, если во вложенной последовательности операторов 
if/else часть else опускается. Else всегда соответствует ближайшему предыдущему if, не содержа-
щему else. 

Например, в конструкции 

if(n>0) 

if(a>b) z=a; 
else z=b; 

else  относится  к  внутреннему  if.  Если  требуется  отнести  else  к  внешнему  if,  то  необходимо  ис-
пользовать фигурные

 

скобки: 

if(n>0) 

if(a>b) z=a; 

} else z=b; 

Часто приходится осуществлять выбор более чем из двух вариантов. Чтобы учесть это, кон-

струкция if/else расширяется конструкцией else/if. Распространенный способ выбора по значению 
из нескольких вариантов: 

 


background image

 

317 

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

else if (<выражение3>) <оператор3>  
else <oпepaтop>; 

 

Выражения просматриваются последовательно сверху вниз; как только какое-то выражение 

становится истинным, выполняется следующий за ним оператор, и на этом вся цепочка заканчива-
ется. Последняя часть else,

 

как и раньше, может быть опущена. 

В языке Си имеется компактный способ записи одного из видов оператора if/else. Он назы-

вается «условным выражением» или «тернарной операцией». Такое выражение выглядит в общем 
виде так: 

 
В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 


background image

 

318 

#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-)  


background image

 

319 

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) 
 


background image

 

320 

и если после нескольких итераций программа решает, что величина параметра

 

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