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

10.7 Операция условия ?:.

В языке Си имеется короткий способ записи оператора if-else. Он называется "условным выражением" и использует операцию условия ?:. Эта операция состоит из двух частей и содержит три операнда, каждый из которых является выражением, причем вся запись выглядит следующим образом:

Выражение_1 ? выражение_2 : выражение_3.

Значение всего выражения равно величине выражения_2, если выражение_1 истинно, и величине выражения_3 в противном случае.

Например:

  • Выражение: (5 > 3) ? 1 : 2 имеет значение 1

  • Выражение: (3 > 5) ? 1 : 2 имеет значение 2

  • Выражение: (а > b) ? a : b имеет значение большей из величин а и b.

  • Выражение: x = (y < 0 )? -y : y; дает абсолютное значение числа. Смысл этого выражения заключается в следующем: если у меньше 0, то х = - у; в противном случае х = у. В терминах оператора if-else данный оператор мог бы выглядеть так: if(у < 0) х = -у; else х = у;

  • Условное выражение удобно использовать в тех случаях, когда имеется некоторая переменная, которой можно присвоить одно из двух возможных значений. Типичным примером является присваивание переменной значения большей из двух величин: mах = (а > b)? а : b;

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

10.8 Множественный выбор на основе операторов switch, break, default.

switch – переключатель,

break – выход из структуры,

default – невыполнение вариантов оператора switch.-

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

Общая структура оператора switch:

switch(целоe выражение)

{

case константа1 : операторы; (необязательные)

case константа2 : операторы; (необязательные)

case default (необязательный) : операторы; (необязательные)

}

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

animal.c – чтение с терминала буквы и выведение на печать названия животного начинающееся с этой буквы. */

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

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

#include<stdio.h>

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

main()

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

char ch;

printf("\nВведите букву алфавита, а я укажу");

printf("название животного, \n начинающееся с нее.\n");

printf("\nВведите, пожалуйста, букву; для завершения работы введите #. \n");

while((ch = getchar())!= '#')

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

if(ch != '\n') ; /* пропуск символа "новая строка" */

{ /*.---------------------------.begin if */

if(ch >= 'a' && ch <= 'я') /*разрешены только строчные буквы */

switch (ch)

{ /*.---------------------------.begin switch */

case 'a' : printf(" аргали, дикий горный азиатский баран. \n");

break;

case 'б' : printf(" бабирусса, дикая малайская свинья. \n");

break;

case 'в' : printf(" выхухоль, водоплавающий крот. \n");

break;

case 'г' : printf(" гиббон, длиннорукая обезьяна. \n");

break;

case 'д' : printf(" даман древесный. \n");

break;

default: printf(" Это трудная задача! \n");

break;

} /*.---------------------------.end switch */

else

printf(" \nЯ распознаю только строчные буквы. \n");

printf(" \nВведите, пожалуйста, следующую букву или #.\n");

} /*.---------------------------.end if */

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

return 0;

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

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

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

Введите букву алфавита, а я укажу название животного,

начинающееся с нее.

Введите, пожалуйста, букву; для завершения работы введите #.

а [Enter]

аргали, дикий горный азиатский баран.

Введите, пожалуйста, следующую букву или #.

г [Enter]

гиббон, длиннорукая обезьяна.

Введите, пожалуйста, следующую букву или #.

р [Enter]

Это трудная задача!

Введите, пожалуйста, следующую букву или #.

Т [Enter]

Я распознаю только строчные буквы.

Введите, пожалуйста, следующую букву или #.

# [Enter]

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

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

  • Вначале вычисляется выражение в скобках, расположенное за ключевым словом switch. В данном случае значением этого выражения будет символ, присвоенный переменной ch, который мы ввели перед этим.

  • Затем программа просматривает список "меток" (в этом примере case 'a':, case 'б': и т. д.) до тех пор, пока не находит "метку", которая соответствует данному значению.

  • Далее программа переходит к выполнению оператора, расположенного в этой строке.

  • Что произойдет в случае, когда такой подходящей строки не найдется? Если существует строка с "меткой" case default:, то будет выполняться оператор, помеченный этой меткой. В противном случае произойдет переход к оператору, расположенному за оператором switch.

  • Чтобы в каждом конкретном случае выполнялся только помеченный оператор, в операторе switch необходимо использовать операторы break. Выполнение оператора break приводит к тому, что в программе происходит выход из оператора switch и осуществляется переход к следующему за ним оператору.

  • При отсутствии оператора break будут выполнены все операторы, начиная с помеченного данной меткой.

  • Метки, имеющиеся в операторе switch, должны быть константами или константными выражениями (выражения, операнды которого константы) целого типа (включая тип char). Запрещается использовать в качестве метки переменную.

  • Значением выражения в скобках должна быть величина целого типа (включая тип char).

  • Когда мы хотим получить одинаковый результат при переходе к разным меткам, мы можем использовать метки без операторов.

Например:

case 'E':

case 'e':

printf(" ехидна, муравьед колючий \n" );

break;

Программа animal.c имеет две небольшие особенности.

  1. Поскольку мы собираемся использовать программу в диалоговом режиме, мы решили воспользоваться символом # вместо EOF в качестве признака прекращения ее работы. В работе компьютера могли бы возникнуть сложности, если бы он предложил нам ввести признак EOF или даже какой-нибудь управляющий символ, между тем как символ # вполне подходит для этой цели. Поскольку теперь отсутствует необходимость чтения символа EOF, мы не должны описывать в программе переменную ch типа int.

  2. Мы использовали оператор if, который позволяет игнорировать символы "новая строка" при вводе символов в программу. Это тоже некоторая плата за возможность диалоговой работы. Без этого оператора if каждый раз при нажатии клавиши [Enter] программе пришлось бы рассматривать данный признак как прочитанный символ.

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

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

  • Иногда возможности выбора нет. Вы не можете, например, применить оператор switch, когда выбор вариантов основывается на вычислении значения переменной или выражения типа int.

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

Проще написать, например, так: if(integer < 1000 && integer > 2). Замена этой строки оператором switch приведет к необходимости ввести в программу метки для всех целых чисел от 2 до 999.