Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Название:Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:0101
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 краткое содержание
Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Листинг 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
bill = BASE1 + (RATE2 * (kwh - BREAK1)); else
if (kwh <= BREAK3) // количество кВт/ч в промежутке от 468 до 720
bill = BASE2 + (RATE3 * (kwh - BREAK2) ); else // количество кВт/ч превышает 680
bill = BASE3 + (RATE4 * (kwh - BREAK3));
Программа состоит из оператора if else, в части else которого указан другой оператор if else. Про второй оператор if else говорят, что он вложен в первый, а про третий — что он вложен во второй. Вспомните, что вся структура if else считается одним оператором, поэтому мы не обязаны заключать вложенные операторы if else в фигурные скобки. Однако использование скобок прояснило бы назначение этого конкретного формата.
Две показанных формы практически эквивалентны. Единственное различие в том, где размещаются пробелы и новые строки, но компилятор данный факт игнорирует. Тем не менее, первая форма предпочтительнее, поскольку она более ясно демонстрирует выбор из четырех возможностей. Эта форма позволяет легко увидеть существующие варианты выбора даже при беглом взгляде на программу. Применяйте отступы для вложенных операторов там, где они нужны — например, когда вы должны проверять две разных величины. Примером такой ситуации является повышенная на 10% плата за потребление электроэнергии свыше 720 киловатпчасов в летние месяцы.
Вы можете выстраивать в цепочку столько операторов 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;
258 глава 7 (Этот фрагмент может быть частью игровой программы, в которой переменная bonus представляет собой количество дополнительных “питательных таблеток”, которые игрок получает за очередной круг.)
Относительно ограничений компилятора следует отметить, что в стандарте С99 от компилятора требуется поддержка не менее 127 уровней вложенности.
Образование пар else и if
Когда в программе присутствует множество конструкций if и else, как компилятор решает, какой if какому else соответствует? В качестве примера рассмотрим следующий фрагмент программы:
if (number > 6)
if (number < 12)
printf("Вы закончили игру!\n");
else
printf("К сожалению, вы потеряли право хода!\n");
В каком случае выводится сообщение “К сожалению, вы потеряли право хода!” — когда значение переменной number меньше или равно 6 либо когда значение number больше 12? Другими словами, к какому if относится else — к первому или ко второму? Правильный ответ таков: else относится ко второму if. То есть вы получите следующие ответы.
Читать дальшеИнтервал:
Закладка: