Листинг 7.3. Программа cypher2. с

Ниже показан результат пробного выполнения программы; обратите внимание, что строчные и прописные буквы изменяются, а пробелы и знаки препинания — нет:
Look! It's a programmer!
MpplI Ju't b qsphsbnnfs!
В табл. 7.1 и 7.2 перечислены функции, предоставляемые в результате включения заголовочного файла ctype.h. Кое-где упоминается локаль; это относится к возможности языка С указывать локаль, которая модифицирует или расширяет базовое использование С. (Например, во многих странах в записи дробных частей применяется запятая, а не десятичная точка, и отдельная локаль могла бы указывать, что при выводе данных с плавающей запятой должна использоваться запятая, приводя к отображению 123.45 как 12 3, 45.) Обратите внимание, что функции отображения не изменяют исходный аргумент, а вместо этого возвращают модифицированное значение. То есть оператор
tolower(ch); // не приводит к изменению ch
не изменяет значение переменной ch. Чтобы изменить ch, запищите следующий оператор:
ch = tolower(ch); // преобразовать ch к нижнему регистру
Управляющие операторы С: ветвление и переходы 255

Таблица 7.1. Функции проверки символьных значений в ctype.h
Множественный выбор else if

Жизнь нередко ставит нас перед выбором из более чем двух вариантов. Чтобы учесть этот факт, структуру if else можно расширить посредством конструкции else if. Давайте рассмотрим конкретный пример. Коммунальные предприятия часто выставляют счета за электроэнергию в зависимости от потребленного объема. Ниже приведены тарифы на потребленную электроэнергию в одной из таких компаний, основанные на киловатт-часах (кВт/ч).
256 глава 7
Если вы намерены вести учет расхода электроэнергии, то имеет смысл написать программу для вычисления стоимости потребленной электроэнергии. Программа в листинге 7.4 является первым шагом в этом направлении.
Листинг 7.4. Программа electric.с

Вот пример вывода:
Введите объем израсходованной электроэнергии в кВт/ч.
580
Сумма к оплате за 580.0 кВт/ч составляет $97.50.
В программе из листинга 7.4 для представления тарифов применяются символические константы, которые для удобства собраны в одном месте. Если компания-производитель электроэнергии меняет свои тарифы (это возможно), наличие их в одном месте упрощает модификацию. В листинге также используются символические константы для точек разрыва. Они тоже могут изменяться. Константы BASE1 и BASE2 выражены через тарифы и точки разрыва. Таким образом, если тарифы и точки разрыва меняются, значения BASE1 и BASE2 обновляются автоматически. Вы можете вспомнить, что препроцессор не выполняет вычислений. Там, где в программе появляется константа BASE1, она заменяется выражением 0.13230 * 360.0. Компилятор вычислит числовое значение этого выражения (47.62 8) ив окончательном коде программы будет присутствовать число 4 7.628, а не выражение.
Управляющие операторы С: ветвление и переходы 257
Поток программы прямолинеен. В зависимости от значения переменной kwh выбирается одна из трех формул. Вы должны уделить особое внимание тому факту, что единственным условием попадания программы на первый else является ввод значения kwh, которое равно или больше 360. Таким образом, строка else if (kwh <= BREAK2) в действительности эквивалентна требованию, чтобы значение kwh находилось в пределах от 360 до 482, как указано в комментариях. Подобным же образом, финальная конструкция else может быть достигнута, только когда значение kwh превышает 720. И, наконец, обратите внимание, что константы BASE1, BASE2 и BASE3 представляют общую стоимость для первых 360, 468 и 720 киловатт-часов соответственно. Поэтому необходимо суммировать только дополнительные затраты за электроэнергию, потребленную сверх указанных объемов.
Фактически конструкция else if — это вариация того, что вы уже знаете. Например, основная часть программы представляет собой всего лишь другой способ написания следующего кода:
if (kwh <= BREAK 1)
bill = RATE1 * kwh;
else
if (kwh <= BREAK2) // количество кВт/ч в промежутке от 360 до 468
Читать дальше