книги / Язык Си
..pdf1.Создайте программы всех рассмотренных в лекции примеров.
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++;