Шаг 23.
Условные конструкции. Оператор if...else

    На этом шаге мы изучим условную конструкцию 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;   
так как переменная i локализована в блоке и не существует вне его.

    Приведем несколько примеров использования этого оператора.


    Пример 1. Нахождение наибольшего из двух целых чисел a и b.
   #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;
   }
Текст этой программы можно взять здесь.


    Пример 2.Определить, является ли заданное четырехзначное число "перевертышем".
   #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.

    Если требуется отнести 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-часть, как и раньше, может быть опущена.


    Замечание. Применяйте отступы в строках, чтобы сделать структуру программы более наглядной.


    На следующем шаге мы рассмотрим несколько примеров использования условной конструкции при решении задач.


Предыдущий шаг Содержание Следующий шаг