Множественный выбор: конструкция else-if

Множественный выбор: конструкция else-if

     Часто нам приходится осуществлять выбор более, чем из двух вариантов. Чтобы учесть это, мы можем расширить структуру if-else конструкцией else-if. Рассмотрим конкретный пример. Расценки, назначаемые за коммунальные услуги некоторыми компаниями зависят от количества потребляемой энергии. Приведем расценки, установленные за пользование электроэнергией:

Первые         240 кВт/ч:    0.05418 долл. за кВт/ч

Следующие      300 кВт/ч:    0.07047 долл. за кВт/ч

Свыше           540 кВт/ч:    0.09164 долл. за кВт/ч

     Если вас занимает этот вопрос, мы могли бы подготовить программу, вычисляющую стоимость потребляемой энергии. Приведем пример программы, являющейся первым шагом, сделанным в этом направлении:

 

                                                                   РИС. 7.1. Операторы if и if else

/* счет за электроэнергию */

/* вычисляет плату за электроэнергию */

#definе RATE1 0.05418 /* тариф за первые 240 кВт/ч */

#define RATE2 0.07047 /* тариф за следующие 300 кВт/ч */

#define RATE3 0.09164 /* тариф за потребление свыше 540 кВт/ч */

#define BASE1 13.00   /* плата за первые 240 кВт/ч */

#define BASE2 34.14   /* плата за первые 540 кВт/ч */

#define BREAK1 240.0  /* величина, определяющая первое условие ветвления */

#define BREAK2 540.0  /* величина, определяющая второе условие ветвления */

main( )

{

float kwh;  /* количество использованных кВт/ч */

float bill; /* плата */

printf(" Укажите, пожалуйста, количество использованных кВт/ч. ");

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. ", 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 представляет собой количество дополнительных "фотонных бомб" или "питательных гранул", получаемых игроком для следующей партии ).

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

R.11.7 Множественный доступ

Из книги Справочное руководство по C++ автора Страустрап Бьярн

R.11.7 Множественный доступ Если добраться до имени можно несколькими путями по графу, задающему множественное наследование, то право доступа этого имени считается максимальным из прав, получаемых на разных путях. Поясним это примером:class W { public: void f(); };class A: private virtual W {};class B:


R.16.3.4 Область видимости макроимен и конструкция #undef

Из книги Delphi. Учимся на примерах автора Парижский Сергей Михайлович

R.16.3.4 Область видимости макроимен и конструкция #undef После появления макроопределения идентификатор из него считается определенным и остается в текущей области видимости (независимо от правил областей видимости в С++) до конца единицы трансляции или пока его определение


Конструкция with-do

Из книги Журнал «Компьютерра» N8 от 27 фераля 2007 года автора Журнал «Компьютерра»


Конструкция for-do

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

Конструкция for-do Синтаксис конструкции for-do для цикла с увеличением значения счетчика:for идентификатор_счетчика := начальное_значение to конечное_эначение do блок_кода;Синтаксис конструкции for-do для цикла с уменьшением значения счетчика:for идентификатор_счетчика :=


Конструкция while-do

Из книги Приемы создания интерьеров различных стилей автора Тимофеев С. М.

Конструкция while-do Синтаксис конструкции while-do: while выражение do блок_кода;Выход из цикла while-do происходит в том случае, если выражение, расположенное между ключевыми словами while и do, дает значение False. Цикл может не выполниться ни одного


Конструкция repeat-until

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

Конструкция repeat-until Синтаксис конструкции repeat-until: repeat блок_кода until выражение;Выход из цикла repeat-until происходит в том случае, если выражение, расположенное после ключевого слова until, дает значение


FANатичная конструкция: Как из корпуса сделать конфетку

Из книги Инфобизнес за один день автора Ушанов Азамат

FANатичная конструкция: Как из корпуса сделать конфетку Автор: Филипп КазаковНесколько месяцев назад я созрел-таки для серьезного мероприятия - замены корпуса компьютера. Как часто бывает, немедленной реализации задумки воспрепятствовала масса объективных


Базисная конструкция

Из книги автора

Базисная конструкция Простота типизации в ОО-подходе есть следствие простоты объектной вычислительной модели. Опуская детали, можно сказать, что при выполнении ОО-системы происходят события только одного рода - вызов компонента (feature call):x.f (arg)означающий выполнение


Витая конструкция

Из книги автора

Витая конструкция Методы создания резных изделий из дерева разнообразны. Сейчас мы рассмотрим еще один метод, который позволяет создавать витые конструкции, наподобие той, что вы видели в комнате для курения кальянов в главе 5.На этот раз витая конструкция будет


Конструкция SELECT ... INTO

Из книги автора

Конструкция SELECT ... INTO Конструкция SELECT ... INTO обычна для PSQL. Когда из таблицы запрашиваются значения, предложение INTO позволяет сохранить их в переменных - в локальных переменных или в выходных аргументах. В этой процедуре нет выходных параметров. Мы используем переменную ANY


Конструкция FOR SELECT ... DO

Из книги автора

Конструкция FOR SELECT ... DO Для поиска множества строк в процедуре мы используем конструкцию FOR SELECT ... DO. Ее синтаксис:FOR<выражение-выбора>INTO <:переменная [, :переменная [, ...]] DO<составной-оператор>;<выражение-выбора> может быть любым запросом выбора, использующим


3. Оригинальная конструкция инфопродукта

Из книги автора

3. Оригинальная конструкция инфопродукта Можно сделать оригинальный инфопродукт по конструкции. Например, в вашей нише все делают исключительно аудио– или видеокурсы. А вы сделайте, например, интеллект-карты, коучинговую программу, месячный тренинг. Найдите другой


Конструкция flash-диска USB

Из книги автора

Конструкция flash-диска USB Несмотря на разнообразие корпусов, все flash-диски USB устроены одинаково. Половинки корпуса часто соединены защелками и обычно легко разбираются. Исключение составляют водонепроницаемые или ультрамодные корпуса – для их вскрытия иногда приходится


Виды и конструкция карт памяти

Из книги автора

Виды и конструкция карт памяти Многие компании время от времени предлагали пользователям разные конструкции карт памяти. За редкими исключениями все они несовместимы между собой по числу и расположению контактов и электрическим характеристикам. Flash-карты бывают двух