- •Предисловие.
- •1. Введение.
- •1.1. История создания языка си.
- •1.2. Стандарты языка си.
- •2. Основные сведения, необходимые для создания программ на языке си.
- •2.1 Процесс создания исполняемого файла.
- •2.2 Распределение памяти программы.
- •2.3 Некоторые основные понятия.
- •2.4 Данные.
- •2.5 Структура простой программы.
- •3. Определение размеров типов данных и объектов.
- •4. Строки и строковые константы.
- •5. Директива препроцессора # define.
- •6. Функции форматированного ввода – вывода.
- •6.1 Функция форматированного вывода printf().
- •6.2 Функция форматированного ввода scanf().
- •7. Операции и операторы.
- •7.1 Арифметические операции
- •7.4 Порядок выполнения операций.
- •8. Выражения и операторы
- •8.1 Выражения.
- •8.2 Операторы.
- •8.3 Составные операторы.
- •8.4 Преобразование типов.
- •8.5 Операция приведения типов.
- •9. Функции ввода и вывода символов.
- •9.1 Функции getchar() и putchar().
- •9.2 Функции getch() и getche().
- •9.3 Ввод и вывод последовательности символов.
- •9.4 Подсчет символов, вводимых с клавиатуры.
- •9.5 Вывод символов из вводимого с клавиатуры файла.
- •9.6 Переключение ввода-вывода данных.
- •10. Принятие решений.
- •10.1 Оператор если (if).
- •10.2 Оператор если - иначе (if else).
- •10.3 Множественный выбор на основе операторов if, else.
- •10.5 Приоритеты операций отношения.
- •10.6 Логические операции (and, or, not).
- •10.7 Операция условия ?:.
- •10.8 Множественный выбор на основе операторов switch, break, default.
- •11. Циклы.
- •11.1 Цикл пока (while).
- •11.2 Цикл для (for).
- •11.4 Операция запятая ,.
- •11.5 Цикл делай пока (do while).
- •11.6 Вложенные циклы.
- •11.7 Операторы выход из структуры (break), продолжение (continue), безусловный переход (to go).
- •Литература.
- •Оглавление.
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 имеет две небольшие особенности.
-
Поскольку мы собираемся использовать программу в диалоговом режиме, мы решили воспользоваться символом # вместо EOF в качестве признака прекращения ее работы. В работе компьютера могли бы возникнуть сложности, если бы он предложил нам ввести признак EOF или даже какой-нибудь управляющий символ, между тем как символ # вполне подходит для этой цели. Поскольку теперь отсутствует необходимость чтения символа EOF, мы не должны описывать в программе переменную ch типа int.
-
Мы использовали оператор if, который позволяет игнорировать символы "новая строка" при вводе символов в программу. Это тоже некоторая плата за возможность диалоговой работы. Без этого оператора if каждый раз при нажатии клавиши [Enter] программе пришлось бы рассматривать данный признак как прочитанный символ.
***************************************************************
-
Когда требуется использовать оператор switch, а когда конструкцию else-if? Если есть возможность применить оператор switch, программа будет выполняться более эффективно.
-
Иногда возможности выбора нет. Вы не можете, например, применить оператор switch, когда выбор вариантов основывается на вычислении значения переменной или выражения типа int.
-
Удобного способа воспользоваться оператором switch в случае, когда возможные значения переменной попадают в некоторый диапазон, также не существует.
Проще написать, например, так: if(integer < 1000 && integer > 2). Замена этой строки оператором switch приведет к необходимости ввести в программу метки для всех целых чисел от 2 до 999.