130 Глава 2
Замечание по мобильности 2.2
Проверка на символическую константу EOF, а не на -1 делает программу более мобильной. Стандарт ANSII устанавливает, что EOF имеет целое отрицательное значение (но не обязательно -1). Так что EOF может иметь различные значения в разных системах.
В системе UNIX и многих других признак конца файла вводится комбинацией
<ctrl-d>
в последней строке. Эта нотация означает одновременное нажатие клавиши ctrl и клавиши d. В других системах, таких, как VAX VMS корпорации DEC или MS-DOS корпорации Microsoft признак конца файла вводится нажатием
<ctrl-z>
Пользователь вводит оценки с клавиатуры. Когда он нажимает клавишу возврата каретки или ввода, символы читаются функцией cin.get() по одному за раз. Если введенный символ не признак конца файла, начинает работать структура switch. За ключевым словом switch следует в скобках имя переменной grade. Это так называемое управляющее выражение. Предположим, пользователь ввел в качестве оценки букву С. С автоматически сравнивается с каждым условием case в структуре switch. Если встречается совпадение (case 'C' :), то выполняется оператор, следующий за этой меткой case. В случае буквы С переменная cCount увеличивается на 1 и работа структуры switch немедленно завершается по оператору break.
Оператор break вызывает передачу программного управления на первый оператор после структуры switch. Оператор break используется потому, что в противном случае условия case в операторе switch работают совместно. Если везде в структуре switch не использовать break, тогда каждый раз, когда одно из условий case удовлетворяется, будут выполняться операторы всех последующих меток case. Если ни одно условие не выполнено, то выполняются операторы после метки default (умолчание), печатающие в нашей программе сообщение об ошибке.
После каждой метки case может быть предусмотрено одно или более действий. Структура switch отличается от всех других структур тем, что при нескольких действиях после case не требуется заключать их в фигурные скобки. В общем случае структура множественного выбора switch при использовании break в каждом разделе case соответствует блок-схеме, приведенной на рис. 2.23.
Из этой блок-схемы видно, что каждый оператор break в конце case вызывает немедленный выход из структуры switch. Отметим снова, что (не считая маленьких окружностей и линий связи) блок-схема содержит только символы прямоугольников и ромбов. Представьте себе опять, что программист имеет доступ к глубокому бункеру, содержащему пустые структуры switch — столько, сколько может потребоваться программисту для складывания их пачками и вложения в другие управляющие структуры, чтобы структурированно отобразить управляющую логику алгоритма. И затем эти прямоугольники и ромбы заполняются необходимыми действиями и условиями выбора в соответствии с алгоритмом. Вложенные управляющие структуры — дело обычное, но вложенные структуры switch в программах встречаются редко.
Типичная ошибка программирования 2.17
Забывают вставить оператор break, когда он нужен в структуре switch.
Управляющие структуры
131
Типичная ошибка программирования 2.18
Пропуск пробела между ключевым словом case и целым значением, которое проверяется в структуре switch, может вызвать логическую ошибку. Например, запись case3: вместо case 3: просто создаст неиспользуемую метку (мы поговорим об этом подробнее в главе 18). Дело в том, что в этой структуре switch не будут совершены соответствующие действия, когда управляющее выражение switch будет иметь значение 3.
Хороший стиль программирования 2.23
Вставляйте метку default в оператор switch. Случаи неудачных проверок в операторе switch без метки default будут игнорироваться. Включение метки default фиксирует внимание программиста на необходимости обрабатывать исключительную ситуацию. Но бывают ситуации, в которых никакой обработки по метке default не требуется.
Хороший стиль программирования 2.24
Хотя предложения case и default могут размещаться в структуре switch в произвольном порядке, стоит учесть практику качественного программирования - помещать default в конце.
действия в случае а | ь | break |
|
f |
|
действия в случае ь | L | break |
|
Т |
|
Рис. 2.23.Структура множественного Bbi6opswitch
- 116 Глава 2
- 2.13. Основы повторения, управляемого счетчиком
- 2.14. Структура повторения for (цикл)
- 120 Глава 2
- 122 Глава 2
- 2.15. Пример использования структуры for
- 124 Глава 2
- 126 Глава 2
- 2.16. Структура множественного выбора switch
- Глава 2
- 130 Глава 2
- 132 Глава 2
- 2.17. Структура повторения do/while
- 134 Глава 2
- 2.18. Операторы break и continue
- Глава 2
- 2.19. Логические операции
- 138 Глава 2
- Глава 2
- 2.21. Заключение по структурному программированию
- IfcrpyKTypa (единственный выбор)
- Глава 2
- Глава 2
- 148 Глава 2
- Глава 2
- Глава 2
- Глава 2
- 156 Глава 2
- 158 Глава 2
- 160 Глава 2
- 2.1. А) следование, выбор и повторение, b) if/else. С) управляемым счет чиком или определенным заранее, d) Метку, сигнал, флаг или лож ный сигнал.
- 162 Глава 2
- 164 Глава 2
- 166 Глава 2
- 168 Глава 2
- 170 Глава 2
- 172 Глава 2
- 174 Глава 2
- 176 Глава 2
- 178 Глава 3
- Глава 3
- 3.3. Математические библиотечные функции
- 3.4. Функции
- Глава 3
- 3.5 Определения функций
- 184 Глава 3
- 186 ГлаваЗ
- 3.6. Прототипы функций
- 188 Глава 3
- 3.7. Заголовочные файлы
- 3.8. Генерация случайных чисел
- Глава 3
- 192 Глава 3
- 194 Глава 3
- 3.9. Пример: азартная игра
- Глава 3
- 198 Глава 3
- 3.10. Классы памяти
- 200 Глава 3
- 3.11. Правила, определяющие область действия
- 202 Глава 3
- 204 Глава 3
- 3.12 Рекурсия
- Глава 3
- 6) Значения, возвращаемые после каждого рекурсивного вызова
- 3.13. Пример использования рекурсии: последовательность чисел Фибоначчи
- Глава 3
- 3.14. Рекурсии или итерации
- 212 Глава 3
- Глава 3
- Глава 4
- Глава 5
- Глава 6
- 3.15. Функции с пустыми списками параметров
- 214 Глава 3
- 3.16. Встраиваемые функции