Программирование >>  Инициализация объектов класса, структура 

1 ... 63 64 65 [ 66 ] 67 68 69 ... 395


char ch;

while ( cm >> ch )

являющееся условием:

switch( ch )

набора меток case, состоящих из ключевого слова case и константного выражения, с которым сравнивается условие. В данном случае каждая метка

case a: case e: case i:

case o:

представляет одну из гласных латинского алфавита: case u:

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

необязательной метки default, которая является аналогом части else инструкции if-else. Инструкции, соответствующие этой метке, выполняются, если условие не отвечает ни одной из меток case. Например, м1 можем подсчитать суммарное количество встретившихся символов, не являющихся

default: любой символ, не являющийся гласной

гласными буквами:

++non vowe1 cnt;

Константное выражение в метке case должно принадлежать к целому типу, поэтому

неверные значения меток case 3.14: не целое

следующие строки ошибочны:

case ival: не константа

Кроме того, две разные метки не могут иметь одинаковое значение.

Выражение условия в инструкции switch может быть сколь угодно сложным, в том числе включать вызовы функций. Результат вгчисления условия сравнивается с метками case, пока не будет найдено равное значение или не выяснится, что такого значения нет. Если метка обнаружена, выполнение будет продолжено с первой инструкции после нее, если же нет, то с первой инструкции после метки default (при ее наличии) или после всей составной инструкции switch.

Инструкция switch состоит из следующих частей:

ключевого слова switch, за которым в круглых скобках идет выражение,



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

#include <iostream>

int main() {

char ch;

int aCnt=0, eCnt=0, iCnt=0, oCnt=0, uCnt=0;

while ( cin >> ch )

Внимание! неверная реазация!

switch ( ch ) {

case a:

++aCnt; case e:

++eCnt; case i:

++iCnt; case o:

++oCnt;

case u: ++uCnt;

cout

Встретилась Встретилась Встретилась Встретилась Встретилась u: \t

a: \t

e: \t

i: \t

o: \t

aCnt eCnt iCnt oCnt uCnt

\n \n \n \n \n;

так, как хотелось бы:

Если значение ch равно i, выполнение начинается с инструкции после case i и iCnt возрастет на 1. Однако следующие ниже инструкции, ++oCnt и ++uCnt, также выполняются, увеличивая значения и этих переменных. Если же переменная ch равна a, изменятся все пять счетчиков.

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

break прерывает выполнение switch и передает управление инструкции, следующей за закрывающей фигурной скобкой, - в данном случае производится вывод. Вот как это должно выглядеть:



switch ( ch )

case a:

++aCnt;

break; case e:

++eCnt;

break;

++iCnt; break;

case o:

++oCnt;

break; case u:

++uCnt; break;

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

При каком условии программист может отказаться от инструкции break и позволить программе провалиться сквозь несколько меток case? Одним из таких случаев является необходимость выполнить одни и те же действия для двух или более меток. Это может понадобиться потому, что с case всегда связано только одно значение. Предположим, мы не хотим подсчитывать, сколько раз встретилась каждая гласная в отдельности, нас интересует только суммарное количество всех встретившихся гласных. Это можно

int vowelCnt = 0;

...

switch ( ch ) {

бой из символов a,e,1,o,u увеличит значение vowelCnt case a:

case e:

case i: case o: case u:

++vowe1Cnt; break;

сделать так:

Некоторые программисты подчеркивают осознанность своих действий тем, что предпочитают в таком случае писать метки на одной строке:



1 ... 63 64 65 [ 66 ] 67 68 69 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика