На этом шаге мы изучим условную конструкцию if...else.
Общий вид условного оператора:
if (<выражение>) <оператор1>; else <оператор2>;
if (<выражение>) <оператор1>;
Вначале вычисляется значение выражения. Если его значение отлично от нуля, то выполняется оператор1. Если его значение равно нулю, и если есть else-часть, то выполняется оператор2. Если значение выражения равно нулю, но конструкция else отсутствует (имеется в наличии сокращенная форма условного оператора), то никаких действий в этом операторе не выполняется, а осуществляется переход к следующему оператору.
Примеры:
if (х > 0) {x = -x; a =2*b;} //Полная условная конструкция. else { int i = 2; x *=i; a=b/x;} if (a<0) a=-a; //Сокращенная условная конструкция.
При использовании блоков (то есть составных операторов с определениями и описаниями) нельзя забывать о локализации определяемых в блоке объектов. Например, следующая конструкция будет ошибочной:
if (j>0) {int i; i=2*j;} else i=-j;
Приведем несколько примеров использования этого оператора.
#include <iostream.h> main () { int a,b; cout<<"Введите первое число - "; cin>>a; cout<<endl<<"Введите второе число - "; cin>>b; if (a==b) //"Внешняя" условная конструкция. cout<<"Заданные числа равны."<<endl; else if (a>b) //"Внутреняя" условная конструкция. cout<<"Первое число больше второго."<<endl; else cout<<"Второе число больше первого."<<endl; }
#include<iostream.h> main () { int x,y,z,s,A; /* ---------- */ cout<<"Задайте четырехзначное число: "; cin>>A; cout<<endl; //Находим цифры четырехзначного числа. x = A%10; y = ((A-x)/10)%10; z = ((((A-x)/10)-y)/10)%10; s = (((((A-x)/10)-y)/10)-z)/10; //Попарно проверяем полученные цифры. if (x==s && z==y) cout<<"Число "<<A<<" является \"перевертышем\""<<endl; else cout<<"Число "<<A<<" не является \"перевертышем\""<<endl; }
Главное предостережение, которое мы хотим сделать, состоит в том, чтобы не использовать знак = вместо ==. С помощью операции присваивания некоторое значение присваивается переменной слева от знака равенства. В то же время с помощью операции отношения равенство проверяется: равно ли выражение, стоящее слева от знака, выражению, стоящему слева от него. Например:
canoes = 3; //Присваивает значение 3 переменной canoes. canoes==3 //Проверяет, равняется ли значение переменной canoes 3.
При программировании требуется аккуратность, потому что в ряде случаев компилятор не сможет обнаружить ошибки, связанной с неправильным использованием знаков этих операций, что приведет к результатам, отличным от ожидаемых.
В заключение остановимся на некоторых особенностях использования условного оператора. В качестве оператора1 может стоять любой оператор, в частности, снова оператор if...else. При этом может возникнуть неоднозначность, если во вложенной последовательности операторов if...else конструкция else опускается. В этом случае нужно помнить следующее правило: else всегда соответствует ближайшему предыдущему if, не содержащему else. Например, в конструкции
if (n>0) if (a>b) z = a; else z = b;
Если требуется отнести else к внешнему if, то необходимо использовать фигурные скобки:
if (n>0) { if (a>b) z = a; } else z = b;
Часто нам приходится осуществлять выбор более, чем из двух вариантов. Чтобы учесть это, мы можем расширить конструкцию if...else конструкцией else if. Приведем весьма распространенный способ выбора по значению из нескольких вариантов:
if (<выражение1>) <оператор1> else if (<выражение2>) <оператор2> else if (<выражение3>) <оператор3> ... ... ... else <операторN>
Выражения просматриваются последовательно слева направо; как только какое-то выражение становится истинным, выполняется следующий за ним оператор, и на этом вся цепочка заканчивается. Последняя else-часть, как и раньше, может быть опущена.
На следующем шаге мы рассмотрим несколько примеров использования
условной конструкции
при решении задач.