Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Язык Си

..pdf
Скачиваний:
6
Добавлен:
20.11.2023
Размер:
7.64 Mб
Скачать

1.Создайте программы всех рассмотренных в лекции примеров.

2.Поэкспериментируйте с функцией printf: меняйте специ­ фикаторы форматов, точность, ширину поля и отмечайте, как из­ меняется представление данных на экране.

3.Вычислить площадь треугольника по заданным координа­ там вершин (данные вводить с консоли).

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

ИОПЕРАТОР ВЫБОРА

4.1.Условный оператор if-else

Сокращенный вид условного оператора следующий:

if (условие) действие

На блок-схеме это выглядит следующим образом:

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

Примечание. В Си и Си++ логические выражения принимают два значения: 1 - истина; 0 - ложь.

int а=9;

float b=8;

if(a<b)

printf(na=%d\n" ,а) ;

printf("b=%f",b);

Врезультате программа напечатает

Ь=8.000000,

поскольку условие а < Ъ ложно и строка printf(”a=%d\n”,a); будет пропущена.

int а=6;

float b=8;

if(a<b)

p r i n t f (Ma=%d\nM, а) ;

pr i n t f ("b=%f" , b ) ;

Врезультате программа напечатает

а=6

Ь=8 . 000000

Обратим внимание на то, что строкаprintf("b=%f\b); не при­ надлежит условию и выполняется в любом случае. Если нужно, чтобы условию принадлежали обе строки (или более), то их необ­ ходимо заключить в фигурные скобки {}.

int а=9;

float b=8;

if(a<b)

{printf (,,a=%d\n,,/а) ;

printf (,,b=%f,l/b) ;

}

В результате программа ничего не напечатает, так как усло­ вие ложно и обе функции printfбудут пропущены.

Закрепим данный момент еще на двух примерах.

int a=5;

float b=6;

if(a>b)

{a++;

b— ;

}

a+=b;

printf ("a=%d\nb=%f", a, b) ;

Результат на экране:

a=ll

b=6.000000

int a=5;

float b=6;

if(a>b)

a++;

b— ;

a+=b;

p r i n t f (,fa=%d\nb=%f " , а., Ъ) ;

Результат на экране:

а=10

b=5.000000

Если после заголовка условия нет фигурных скобок, то

условию принадлежит только одно действие - самое первое после условия.

Еще одна распространенная ошибка - точка с запятой ста­ вится сразу после круглых скобок, в которых записано условие. Посмотрим, к чему это приводит.

int a=5; float b=6;

if (a>b) ;*— ОПАСНО!

{a++; b— ;

}

printf ("a=%d\nb=%f ", a, b) ;

Результат на экране: a=6

b=5.000000

Ожидали получить a = 5, b = 6, поскольку условие a > b лож­ но и a++, b — не должны были выполниться, но имеем другой результат. Так получилось, потому что выражения, входящие в так называемое действие, ВСЕГДА должны заканчиваться точкой с запятой (если это не новое условие - см. следующий абзац). В данном случае получается, что условию принадлежит пустое дей­ ствие, т.е. если условие выполнится (истина), то делать при этом ничего не нужно (пустой прямоугольник на блок-схеме). Таким образом, выражения а++, Ъ— уже не входят в действие, т.е. вы­ полняются независимо от условия.

Оператор if может быть вложенным. Это значит, что дейст­ вием одного условия является новое условие со своим действием.

i n t а=6,с=7; f l o a t b=8;

i f( a< b) { if (Ob) b — ; а++ г

}

с — ; Ответ: а ~ 7, Ъ 8, с = 6.

В данном примере строки

if(c>b) b— ; а++;

являются действием для условия а < Ь, поскольку они заключены в фигурные скобки {} сразу после этого условия. Выражение b — является действием для условия с > Ь. Выражение с — не отно­ сится ни к одному из условий и выполняется в любом случае.

Количество вложений может быть любым.

int а=6,с=7; float b=8,d=4; i f( a<b)

{if(c>b)

b— ;

C + + ;

if(b<5)

{if(a>5)

d+=b;

}

c— ;

Ответ: a = 6, b = 8, c = 7, d= 4.

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

if (a<5)

if(a<5)

{if(b>5)

if(b>5)

{if(c>0)

if(c>0)

c=a+b;

c=a+b;

}

b+=5;

}

a--;

b+=5;

 

a— ;

 

одинаковы и обоим случаям соответствует одна блок-схема.

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

i f (а<5) if(b>5) if(c>0)

c=a+b; <— Первая точка с запятой после группы условий

Ь + = 5 ; а— ;

Для условия if(а < 5) действием является новое условие if(b > 5), а для него действием является условие if(c > 0), для ко­

торого

действием является с = а +

которое и заканчивается

первой

точкой с запятой. Отсюда ясно, что выражения 6 + = 5;

а — ; не принадлежат условиям и выполняются в любом случае. Полный вид условного оператора следующий:

if (условие) действие 1 else действие 2

На блок-схеме это выглядит так:

Истина

Ложь

Л

г

Условие

_______5

 

i_______

Действие 1

Действие 2

т

Выполнение оператора if-else начинается с проверки условия. Если условие истинно, то выполняется действие 1. Если условие ложно, то выполняется действие 2. Таким образом, в «ложной» ветке появилось действие, чего не было в простом операторе if.

В каждое из действий 1, 2 могут входить блоки из выраже­ ний, которые в этом случае необходимо заключать в фигурные скобки {}.

int a=9,c;

float b=5;

if(a<b)

{a++;

b— ;

}

else

{a— ;

b++;

}

c=a+b;

Ответ: a = 8, b = 6, c = 14.

Оператор if-else также может быть вложенным:

int a=3,b=6;

if(a<b)

if(b<5)

a++; else a— ; else b++; b— ;

При такой записи кода опять не сразу понятно, к какому из операторов if относится else. В этом случае ищем первый else - он относится к ближайшему if Соответственно, следующий else бу­ дет относиться к предыдущему if и т.д. По этой схеме в последнем примере определяем, что else а — относится к if(b < 5), a else b++ относится к if(а < Ь). Следовательно, b — вообще не относится к условиям, что отображено на блок-схеме ниже.

Самый простой способ сделать данный код более удобным для чтения - расставить фигурные скобки.

int a=3,b=6; i f (a < b)

{if(b<5)

а++; e l s e

а— ;

}

e l s e

b++;

b— ;

Еще один способ упростить чтение кода - делать при наборе соответствующие отступы и пропуски строк.

int a=3/b=6; if ( a< b )

if(Ь<5)

а++; e l s e

а— ;

e l s e

b++;