logo
Харви Дейтел, Пол Дейтел Как программировать на С++ / 02-Deitel-Стр-115-214

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