main( )
{
float kwh; /* количество использованных кВт/ч */
float bill; /* плата */
printf(" Укажите, пожалуйста, количество использованных кВт/ч.\n");
scanf(" %f, &kwh);
if (kwh < BREAK1) bill = RATEl * kwh;
else if(kwh < BREAK2) /* количествокВт/чмежду240 и540 */
bill = BASE1 + RATE2*kwh;
else /* количествокВт/чсвыше540 */
bill = BASE2 + RATE3*kwh;
printf(" Платаза%.1f кВт/ч составляет$%1.2f. \n", kwh, bill);
}
Для обозначения тарифов были использованы символические константы, которые поэтому оказались собранными в одном месте. Если электрическая компания изменит свои расценки (а это может случиться), то такое расположение констант не позволит нам забыть скорректировать какую-нибудь из них. Мы задали в символическом виде и константы, соответствующие граничным значениям потребляемой мощности Они также подвержены изменениям. Управляющая логика программы реализуется путем npoстого выбора одной из трех расчетных формул в зависимости oт значения переменной kwh, что иллюстрируется на рис. 7.2. Мы хотим подчеркнуть, что программа в процессе выполнения может достичь первого употребления elseтолько в том случае, если величина переменной kwhбольше или равна 240. Поэтому строка else if(kwh < BREAK2)эквивалентна требованию, чтобы значение kwhбыло заключено между 240 и 540, это мы и указали в комментарии к программе. Совершенно аналогично последнее употребление elseможет быть достигнуто, только если значение kwhбольше или равно 540. И наконец, отметим, что константы BASE1и BASE2представляют собой величину платы за первые 240 или 540 кВт/ч электроэнергии соответственно. Поэтому требуется только прибавить дополнительную плату за количество потребляемой электроэнергии, превышающее эти величины.

РИС. 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или второму?
Читать дальше