Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛЕКЦИИ_ПО_ПРОГРАММИРОВАНИЮ_ПРЕПОД_3403_220301.doc
Скачиваний:
27
Добавлен:
06.11.2018
Размер:
845.31 Кб
Скачать

10.2 Оператор если - иначе (if else).

Оператор if-else дает возможность выбрать одно из двух действий.

Общий вид оператора if-else:

if (выражение условия) оператор else оператор

Если выражение истинно, то выполняется первый оператор, а если ложно, то выполняется оператор, следующий за ключевым словом else.

Операторы могут быть простыми или составными (тогда используются фигурные скобки).

/* ПРОГРАММА:

cod_mes.c – кодировка сообщений путем увеличения кода символов на 1.

*/

/*#############################################*/

/*============================= include */

#include<stdio.h>

/*============================= main() */

main()

{/*.---------------------------.begin main() */

char ch;

while((ch = getchar()) != EOF)

{/*.---------------------------.begin while */

if(ch =='\n' ) putchar(ch); /* символ новая строка не меняется */

else

putchar(ch + 1); /* заменить остальные символы */

}/*.---------------------------.end while) */

return 0;

}/*.---------------------------.end main() */

/*#############################################*/

РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ.

Сообщение будет состоять из символов, код которых будет увеличен на 1.

ПОЯСНЕНИЯ К ПРОГРАММЕ.

Код символа новая строка останется неизменным.

***************************************************************

10.3 Множественный выбор на основе операторов if, else.

Когда надо сделать выбор более, чем из двух вариантов конструкция if-else принимает более сложную форму.

/* ПРОГРАММА:

price_el – стоимость электроэнергии.

Расценки, назначаемые за коммунальные услуги некоторыми компаниями, зависят от количества потребляемой энергии.

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

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

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

*/

/*#############################################*/

/*============================= include */

#include<stdio.h>

/*============================= define */

#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() */

main()

{/*.---------------------------.begin main() */

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

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

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

scanf(" %f, &kwh);

/* количество кВт/ч до 240 */

if (kwh < BREAK1) bill = RATEl * kwh;

/* количество кВт/ч между 240 и 540 */

else if(kwh < BREAK2) bill = BASE1 + RATE2*kwh;

/* количество кВт/ч свыше 540 */

else bill = BASE2 + RATE3*kwh;

printf(" Плата за %.1f кВт/ч составляет $%1.2f. \n", kwh, bill);

return 0;

}/*.---------------------------.end main() */

/*#############################################*/

РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ.

Программа вычисляет плату за электроэнергию в зависимости от количества потребляемой энергии.

ПОЯСНЕНИЯ К ПРОГРАММЕ.

  • Для обозначения тарифов были использованы символические константы, которые поэтому оказались собранными в одном месте. Если электрическая компания изменит свои расценки (а это может случиться), то такое расположение констант не позволит нам забыть скорректировать какую-нибудь из них.

  • Мы задали в символическом виде и константы, соответствующие граничным значениям потребляемой мощности. Они также подвержены изменениям.

  • Управляющая логика программы реализуется путем выбора одной из трех расчетных формул в зависимости oт значения переменной kwh.

  • Программа в процессе выполнения может достичь первого употребления else только в том случае, если величина переменной kwh больше или равна 240. Поэтому строка else if(kwh < BREAK2) эквивалентна требованию, чтобы значение kwh было заключено между 240 и 540, это мы и указали в комментарии к программе.

  • Совершенно аналогично последнее употребление else может быть достигнуто, только если значение kwh больше или равно 540.

  • Наконец, отметим, что константы BASE1 и BASE2 представляют собой величину платы за первые 240 или 540 кВт/ч электроэнергии соответственно. Поэтому требуется только прибавить дополнительную плату за количество потребляемой электроэнергии, превышающее эти величины.

***************************************************************

ПРИМЕЧАНИЕ 1.

Можно использовать подряд любое количество конструкций else if.

if (score < 1000) bonus = 0;

else if (score < 1500) bonus = 1;

else if (score < 2000) bonus = 4;

else bonus = 6;

Этот фрагмент взят из игровой программы, где переменная bonus представляет собой количество дополнительных очков (bonus), получаемых игроком для следующей партии в зависимости от счета (score) предыдущей партии.

ПРИМЕЧАНИЕ 2.

Оператор else соответствует ближайшему оператору if, кроме тех случаев, когда имеются фигурные скобки.

/* ФРАГМЕНТ ПРОГРАММЫ:

/*=============*/

if(number > 6)

{

if(number < 12) printf (“ 6 < number. < 12\n”);

}

else

printf("6 > number. \n");

/*=============*/

РЕЗУЛЬТАТ РАБОТЫ ФРАГМЕНТА ПРОГРАММЫ.

number: результат работы фрагмента:

5 6 > number.

10 6 < number. < 12

15 .

10.4 ОПЕРАЦИИ ОТНОШЕНИЯ ( < <= => > == != ).

Операции отношения используются в выражениях условия операторов while и for. Эти oпeраторы проверяют, истинно или ложно данное выражение. В языке Си значение "истина" соответствует 1, а значение "ложь" соответствует 0. В языке Си имеются шесть операций отношения.

ОПЕРАЦИИ ОТНОШЕНИЯ.

Операция отношения

Смысл операции отношения

<

Меньше

<=

меньше или равно

==

Равно

>=

больше или равно

>

Больше

!=

не равно

ПРИМЕЧАНИЕ.

В языке Си нельзя использовать знак = вместо ==. С помощью операции присваивания = некоторое значение присваивается переменной слева от знака равенства. Операция присваивания изменяет значения переменной в левой части. С помощью операции отношения равно == проверяется, равно ли выражение, стоящее слева от знака, выражению справа от него. Операция равно не изменяет значения переменной в левой части.

canoes = 3 присваивает значение 3 переменной canoes.

canoes == 5 проверяет, равняется ли значение переменной canoes 5.

В ряде случаев компилятор не сможет обнаружить ошибки, связанной с неправильным использованием знаков этих операций, что приведет к ошибочным результатам.

Примеры операций отношения:

if(number < 6) printf(" Ваше число слишком мало.\n" );

while(сh!= '$') сount ++;

if(total == 100) printf(" Вы набрали максимум очков!\n");

if (ch > 'м') printf(" Отправьте этого человека по другому маршруту \n");

  • В условных выражениях разрешается использовать также и символы, причем при сравнении их берется машинный код (ASCII).

  • Использовать операции отношения для сравнения строк не разрешается (для этого используются специальные функции).

  • Операции отношения можно использовать также при работе с числами с плавающей точкой. Однако при сравнениях этих чисел рекомендуется ограничиться лишь операциями < и >, т.к. ошибки округления могут привести к тому, что числа окажутся неравными, хотя по логике они должны быть равны. Например, произведение 3 и 1/3 равно 1.0, но если мы представим 1/3 в виде 6 разрядной десятичной дроби, то произведение будет равно 0,999999, что не равняется в точности 1.

/* ПРОГРАММА:

true_false_1.c – истина – ложь.

*/

/*#############################################*/

/*============================= include */

#include<stdio.h>

/*============================= main() */

main()

{/*.---------------------------.begin main() */

int true, false;

true = (10 > 2); /* отношение истинно */

false = (10 = =2); /* отношение ложно */

printf("true = %d; false = %d\n" , true, false);

return 0;

}/*.---------------------------.end main() */

/*#############################################*/

РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ.

true = 1 false = 0

ПОЯСНЕНИЯ К ПРОГРАММЕ.

В языке Си значение "истина" соответствует 1, a значение "ложь" соответствует 0.

***************************************************************

/* ПРОГРАММА:

true_false_2.c – истина – ложь.

*/

/*#############################################*/

/*============================= include */

#include<stdio.h>

/*============================= main() */

main()

{/*.---------------------------.begin main() */

if(1) printf(" 1 соответствует истине. \n" );

else printf(" 1 не соответствует истине. \n");

if(0) printf(" 0 не означает ложь. \n");

else printf(" 0 означает ложь. \n");

return 0;

}/*.---------------------------.end main() */

/*#############################################*/

РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ.

1 соответствует истине.

0 означает ложь.

ПОЯСНЕНИЯ К ПРОГРАММЕ.

1 должна рассматриваться как истинное утверждение, а 0 - как ложное. Поэтому, в первом операторе if должна выполниться первая ветвь (ветвь if), а во втором операторе if - вторая ветвь (ветвь else).

***************************************************************

Из приведенных примеров следует, что в качестве проверочных значений оператора if можно использовать 1 и 0. Спрашивается, можно ли использовать для этой цели другие числа. Если да, что при этом происходит?

/* ПРОГРАММА:

true_false_3.c – истина – ложь.

*/

/*#############################################*/

/*============================= include */

#include<stdio.h>

/*============================= main() */

main()

{/*.---------------------------.begin main() */

if (200) printf("200 - это истина. \n");

if(-33) printf("-33 - это истина. \n");

return 0;

}/*.---------------------------.end main() */

/*#############################################*/

РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ.

200 - это истина.

-33 - это истина.

ПОЯСНЕНИЯ К ПРОГРАММЕ.

В языке Си числа 200 и -33 тоже рассматриваются как "истина". Вообще, все ненулевые величины принимаются в качестве "истины" и только 0 - как "ложь".

***************************************************************

ПРИМЕЧАНИЕ.

Строку if(goats !=0) можно заменить строкой if(goats), поскольку выражение (goats != 0) и выражение (goats) оба примут значение 0, или "ложь", только в том случае, если значение переменной goats равно 0. Смысл второй формы записи менее очевиден, чем первой. Однако, в результате компиляции она оказывается более эффективной, так как при реализации программы требует меньшего числа машинных операций.