Хелпикс

Главная

Контакты

Случайная статья





1.1.3. Условный оператор.. if(<условие>) {<действия1>}else{<действия2>;};



1. 1. 3. Условный оператор.

Условный оператор (ветвление) - алгоритмическая конструкция, которая представляет разветвление алгоритма в зависимости от значения (истинности или ложности) некоторого условия. В общем виде конструкция выглядит так:

< если > < условие> < то > < действия1> < иначе > < действия2>

и читается как «если условие истинно, то выполнить действия1, иначе (если условие ложно), выполнить действия2». В качестве действий выступает один или несколько операторов, объединенных в блок. В С++ синтаксис условного оператора таков:

 

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

 

или, если действий (операторов) несколько:

if(< условие> ) {< действия1> }else{< действия2>; };

G! Обратите внимание, что когда ветка < то > состоит из одного оператора, перед else ставится точка с запятой.

 

Условный оператор может быть неполным, без ветки < иначе> < действия2>. Тогда, если условие ложно(условие не выполняется), управление передается следующему в общей последовательности оператору.

 

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

 

Здесь знаки « + » и «-» обозначают «да» (условие выполняется) и «нет» (условие не выполняется). Например, вычисление y, заданного формулой:       можно представить следующей блок-схемой:

 

Например, вычислениеy, заданного этой формулой, на C++ выглядит так:

if (x< 0)y=x*x; else y=x+1;

 

Пример использования неполного условного оператора: суммируются числа, вводимые с клавиатуры; если число отрицательное, оно прежде заменяется единицей. Пусть переменная а хранит значение введенного числа, а переменная S хранит сумму введенных чисел. Фрагмент блок-схемы решения такой задачи:


 

Программа на С++:

if (a< 0)a=1;

S+=a;

Пример выполнения нескольких действий в ветках < то > и < иначе >:

if (x< 0) { y=x*x; z=x+y; }else{ y=x+1; z=0; };

 

Вложенный ЕСЛИ. Каждая из ветвей условного оператора может содержать произвольное количество операторов, среди которых могут быть снова ветвления (вложенные «если»). Например, следующий отрывок программы:

x=10;

if (x> 5)

{ x-=5; if (x> 7) { x+=4; y=x; }else{ x=x*x-1; y=x+8; };

}

else{ x-=4; y=1; };

выполняется так: переменная x получает в результате присваивания значение 10. Затем проверяется условие x> 5? В данном случае оно выполняется, поэтому вначале x получает новое значение 5, затем проверяется (вложенное) условие x> 7? Оно ложно, тогда последовательно исполняются операторы, идущие после else: x=x*x-1 и y=x+8, результат x=24, y=32. На этом внутренний if заканчивается, ветка else внешнего if не исполняется, общий результат остается тем же: x=24, y=32. Если же изменить начальное присваивание, например, вместо x=10 записать x=2, то исполнение программы будет идти по другой ветке, соответствующей внешнему else: x=x-4; y=1, и результат будет другой: x=-2, y=1.

Блок-схема для этой программы имеет вид:

 

Какие операции можно включать в условие? Условие – это логическая формула, значение которой может быть вычислено. Простейшее условие – это отношение: больше ( > ), меньше ( < ), больше или равно ( > = ), меньше или равно ( < = ), не равно (! = ), равно ( == ).

 

G! Обратите внимание, что сравнение на равенство обозначается двумя знаками =, для отличия от присваивания.

 

Поскольку логические константы true и false также являются логической формулой, то они могут представлять условие в операторе ветвления, т. е. формально правомерны записи if(true)… илиif(false)… - всегда истинные или всегда ложные условия. Константы true и false могут быть заменены в программе числовыми значениями 1 и 0 соответственно, запись условий тогда if(1)… илиif(0)…Более того,

G! в С++ допустимо в качестве условия арифметическое выражение или даже присваивание; значение условия считается истиной, когда значение этого выражения или присваиваемое значение неноль, и ложью, когда результат выражения или присваивания – ноль. Эта возможность унаследована от языка С, хотя она нарушает принятую семантику условного оператора в языках с сильной типизацией, к которым относится С++. Например, возможны условия:

if(z=x-y){…} – значение условия истинно, если z в результате присваивания не ноль, и ложно в противном случае;

if(z=x-y> 0){…} – условие истинно, если значение z в результате присваивания будет больше нуля, и ложно в противном случае.

 

 

G!! Если при сравнении двух значений, например, а и b допущена ошибка в условном операторе: вместо if(a==b) записано if(a=b), то сообщения об ошибке в С++ не последует. Вместо сравнения будет выполнено присваивание a=b;, в результате которого a получит значение переменной b и общим результатом – значением условия - будет истина, если a не равно нулю, и ложь, если a станет равным нулю.

 

Таким образом, условия if(f=(101==105))иif(101==105) по истинности одинаковы – оба ложны, но в первом случае переменная f получит значение 0 (или false).

C++ предоставляет логические операции , которые могут использо­ваться для формирования сложных условий путем комбинирования простых условий. Логическими операциями являются:

! (логическоеНЕ - отрицание),

& & (логическое И - конъюнкция),

|| (логичес­кое ИЛИ - дизъюнкция),

Приоритет этих операций: вначале выполняются отрицания, затем конъюнкции (умножения в алгебре логики) и только потом – дизъюнкции (сложения в алгебре логики).

Например:

if ( a==b ||c> =d & & c< a ) x=a+b; else x=a-b;

Учитывая приоритеты операций, условие в этом операторе эквивалентно формуле: (a==b)|| ((c> =d)& & (c< a)).

Вспомним, что условие А& & В истинно, если оба аргумента А и В истинны одновременно, а условие А||В истинно, если истинен хотя бы один арумент А или В. Отсюда следуют правила проверки истинности операций & & и || в С++, которые стоит учитывать при программировании:

& & - если первый операнд 0 (т. е. ложь), то второй вообще не вычисляется, так как результат уже не может быть истиной, поэтому, если во втором аргументе содержатся присваивания или операции ++, -- (это возможно в С++), то они будут игнорироваться;

|| - если первый аргумент не 0 (т. е. истина), то второй аргумент также не вычисляется, поскольку результат всей операции уже истина, независимо от значения второго операнда.

Кроме условного оператора в C++ есть еще условная операция, которая имеет похожую структуру:

 

(< условие> )? < действие1>: < действие2>;

 

Эта операция формирует условное выражение. Выражение имеет значение. Оно равно значению действия1, если условие истинно, и значению действия2, если условие ложно. Например, операция

a> b? 7: a+b выдаст значение 7, если a> b, и значение суммы a+b, если а£ b.

 

Условный оператор позволяет сделать выбор одной из двух альтернатив пути в алгоритме, в соответствии с двузначной логикой. Если же альтернатив несколько, то для реализации выбора одной из них придется строить довольно громоздкий условный оператор if со многими вложенными if. Чтобы облегчить эту задачу во многих языках определен так называемый оператор множественного ветвления. В С++ это оператор switch.

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

switch < переменная>

{case значение 1: < операторы 1>



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.