Язык Си - руководство для начинающих
Шрифт:
Выбор: конструкция if-else
В предыдущей главе мы привели очень простую программу шифровки сообщений, которая заменяла каждый символ следующим по порядку в таблице ASCII. К сожалению, она заменила даже символ "новая строка", что привело к объединению нескольких строк в одну. Можно исключить эту проблему, написав программу, реализующую простой выбор: если символ - "новая строка", то оставить его без изменений, в противном случае преобразовать его. Вот как это можно запрограммировать на языке Си:
/* код1 */
#include
main
{
char ch;
while((ch = getchar) != EOF)
{
if(ch =='\n' ) /*
putchar(ch); /* "новая строка" неизменным */
else
putchar(ch + 1); /* заменить остальные символы */
}
}
В прошлый раз был использован файл, содержащий следующий текст:
Good spelling is an aid to clear writing.
Его использование в качестве теста для нашей новой программы приводит к результату:
Ура! Она работает!
Между прочим, совсем несложно написать и программу дешифровки. Скопируйте для этого программу код1, но только замените выражение (ch + 1) на (ch - 1).
Вы обратили внимание на общий вид оператора if-else. Он выглядит следующим образом:
if (выражение)оператор
else
оператор
Если выражение истинно, то выполняется первый оператор, а если ложно, то выполняется оператор, следующий за ключевым словом else. Операторы могут быть простыми или составными. Правила языка Си не требуют отступа в строке, но это стало обычной практикой. Отступ позволяет с первого взгляда заметить те операторы, выполнение которых зависит от проверяемого условия.
Простая конструкция if позволяет нам выбирать: выполнить или нет некоторое действие; конструкция же if-else дает возможность выбрать одно из двух действий. Что делать, если нам требуется осуществить выбор из большого числа вариантов?
Множественный выбор: конструкция else-if
Часто нам приходится осуществлять выбор более, чем из двух вариантов. Чтобы учесть это, мы можем расширить структуру if-else конструкцией else-if. Рассмотрим конкретный пример. Расценки, назначаемые за коммунальные услуги некоторыми компаниями зависят от количества потребляемой энергии. Приведем расценки, установленные за пользование электроэнергией:
Первые 240 кВт/ч: 0.05418 долл. за кВт/ч
Следующие 300 кВт/ч: 0.07047 долл. за кВт/ч
Свыше 540 кВт/ч: 0.09164 долл. за кВт/ч
Если вас занимает этот вопрос, мы могли бы подготовить программу, вычисляющую стоимость потребляемой энергии. Приведем пример программы, являющейся первым шагом, сделанным в этом направлении:
РИС. 7.1. Операторы if и if else
/* счет за электроэнергию */
/* вычисляет плату за электроэнергию */
#definе RATE1 0.05418 /*
#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(" Укажите, пожалуйста, количество использованных кВт/ч.\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)