Выбрать главу

     Следующий шаг в "развитии" этой программы - придание ей способности подсчитывать число слов. Это лишь немного труднее того, что мы делали до сих пор, но сначала нам нужно изучить ряд дополнительных вопросов, связанных с использованием операторов if.

РАСШИРЕНИЕ ОПЕРАТОРА if С ПОМОЩЬЮ else

     Простейшей формой оператора if является та, которой мы только что воспользовались:

if(выражение)оператор

     Обычно под выражением здесь понимают условное выражение, с его помощью сравниваются значения двух величин (например x > y или c == 6). Если такое выражение истинно (x больше у или c равно 6), то оператор выполняется. В противном случае он пропускается. Вообще говоря, в качестве условия может быть использовано любое выражение, и если его значение равно 0, то оно считается ложным - дальнейшие детали мы обсудим чуть позже. Оператор может быть простым, как в нашем примере, или составным (блоком), начало и конец которого отмечены фигурными скобками:

if (score > big)  printf(" Полная победа!\n"); /* простой оператор */

 if (jое > rоn)                                    /* составной оператор */

{

   joecash + + ;  printf(" Ты проиграл, Рон.\n");

}

     Простая форма оператора if позволяет выбрать оператор (возможно, составной) или пропустить его. Язык Си предоставляет также возможность выбрать любой из двух операторов путем использования конструкции if-else.

Выбор: конструкция 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 /* тариф за первые 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(" Укажите, пожалуйста, количество использованных кВт/ч.\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 кВт/ч электроэнергии соответственно. Поэтому требуется только прибавить дополнительную плату за количество потребляемой электроэнергии, превышающее эти величины.