Выбрать главу

  

                                        РИС. 7.2. Блок схема программы расчета платы за электроэнергию

     Фактически конструкция else-if является видоизмененным способом задания условного оператора, с которым мы познакомились раньше. Ядро нашей программы представляет собой другую форму записи следующей последовательности операторов.

if(kwh < BREAK1) bill = RATEl*kwh;

else if(kwh < BREAK2)

        bill = BASE1 + RATE2*kwh;

else

    bill = BASE2 + RATE3*kwh;

     Отсюда видно, что программа состоит из оператора if-else, для которого часть else представляет собой другой оператор if-else.

     Про второй оператор if-else говорят, что он "вложен" в первым. (Между прочим, вся структура if-else считается одним оператором. Вот почему мы не должны заключать вложенную конструкцию if-else в фигурные скобки).

     Эти две формы записи являются абсолютно эквивалентными. Единственное отличие - дополнительные пробелы и символы "новая строка", но они игнорируются компилятором. Тем не менее первая форма записи предпочтительнее, поскольку она более четко показывает, что мы осуществляем выбор из трех возможностей. Кроме того, она облегчает просмотр программы и понимание семантики каждого варианта. Применяйте форму записи, использующую вложение операторов там, где это необходимо - например когда требуется проверить значения двух разных величин или (в нашем случае) если бы была установлена 10%-ная дополнительная плата за потребление энергии свыше 540 кВт/ч только в летние месяцы.

     В одном операторе можно использовать столько конструкций else if, сколько нужно, что иллюстрируется приведенным ниже фрагментом:

if (score < 1000)

bonus = 0; else if (score < 1500)

bonus = 1; else if (score < 2000)

bonus = 2; else if (score < 2500)

bonus = 4; else bonus = 6;

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

Объединение операторов if и else

     Когда у вас в программе имеется несколько конструкции if и else, каким образом компилятор решает, какому оператору if соответствует какой оператор else? Рассмотрим, например, фрагмент программы:

if(number > 6)

  if(number < 12)

    printf ("Вы закончили!\n");

else

printf("Простите, вы потеряли ход.\n");

     В каком случае фраза "Простите, вы потеряли ход!" будет напечатана? Когда значение переменной number меньше или равно 6, или когда оно больше 12? Другими словами, чему соответствует else: первому if или второму?

     Ответ выглядит так: else соответствует второму if, т.е. при выполнении программы результаты будут такими:

Число:       Результат:

5                Нет

10              Вы закончили!

15              Простите, вы потеряли ход!

     Существует правило, которое гласит, что else соответствует ближайшему if, кроме тех случаев, когда имеются фигурные скобки. Мы сознательно записали этот фрагмент так, как будто else соответствует первому if, но вспомните, что компилятор не обратит внимания на отступы в строках. Если мы действительно хотим чтобы else соответствовал первому if, необходимо данный фрагмент оформить следующим образом:

if(number > 6)

{

    if(number < 12) printf (" Вызакончили'\n");

}

else

    printf(" Простите, вы потеряли ход!\n");

Теперь результат может выглядеть так

Число:      Результат:

   5           Простите, вы потеряли ход!

  10          Вы закончили!

  15          Нет

 

                                                           РИС. 7.3. Структура соответствия if и else.

Резюме: использование операторов if для организации выбора из нескольких вариантов

КЛЮЧЕВЫЕ CЛOBA: if, else

ОБЩИЕ ЗАМЕЧАНИЯ:

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

ФОРМА ЗАПИСИ 1:

if(выражение) оператор

Оператор выполняется, если выражение истинно.

ФОРМА ЗАПИСИ 2:

if(выражение)

оператор1 else

оператор2

Если выражение истинно, выполняется оператор1, в противном случае - оператор2.

ФОРМА ЗАПИСИ 3:

if(выражение1) оператор1

else if(выражение2) оператор2

else оператор3

Если выражение1 истинно, выполняется оператор1. Если выражение1 ложно, но выражение2 истинно, выполняется оператор2. В случае, когда оба выражения ложны, выполняется оператор3.

ПРИМЕР:

if(legs == 4)

    printf("Это, возможно, лошадь. \n");

else if (legs > 4)

    printf(" Это не лошадь. \n");

else   /* случай, когда legs < 4 */

{ legs++;

  printf(" Теперь животное имеет еще одну ногу.\n");

}

ЧТО ВАЖНЕЕ: ОПЕРАЦИИ ОТНОШЕНИЯ ИЛИ ВЫРАЖЕНИЯ