Выбрать главу

occurs = 1;

int size = ivec.size();

for ( int ix = 1; ix size; ++ix )

{

if ( minVal == ivec[ ix ] )

++occurs;

else

if ( minVal ivec[ ix ] ){

minVal = ivec[ ix ];

occurs = 1;

}

}

return minVal;

}

int main()

{

int ia[] = { 9,1,7,1,4,8,1,3,7,2,6,1,5,1 };

vectorint ivec( ia, ia+14 );

int occurs = 0;

int minVal = min( ivec, occurs );

cout "Минимальное значение: " minVal

" встречается: " occurs " раз.\n";

return 0;

}

Результат работы программы:

Минимальное значение: 1 встречается: 5 раз.

В некоторых случаях вместо инструкции if-else можно использовать более краткое и выразительное условное выражение. Например, следующую реализацию функции min():

template class valueType

inline const valueType

min( valueType vall, valueType va12 )

{

if ( vall va12 )

return vall;

return va12;

}

можно переписать так:

template class valueType

inline const valueType

min( valueType vall, valueType va12 )

{

return ( vall va12 ) ? vall : va12;

}

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

if ( ch == 'a' ||

ch == 'A' )

++aCnt;

else

if ( ch == 'e' ||

ch == 'E' )

++eCnt;

else

if ( ch == 'i' ||

ch == 'I' )

++iCnt;

else

if ( ch == 'o' ||

ch == '0' )

++oCnt;

else

if ( ch == 'u' ||

ch == 'U' )

++uCnt;

В качестве альтернативы таким цепочкам С++ предоставляет инструкцию switch. Это тема следующего раздела.

Упражнение 5.3

Исправьте ошибки в примерах:

(a) if ( ivall != iva12 )

ivall = iva12

else

ivall = iva12 = 0;

(b) if ( ivat minval )

minvat = ival;

occurs = 1;

(c) if ( int ival = get_value())

cout "ival = "

ival endl;

if ( ! ival )

cout "ival = 0\n";

(d) if ( ival = 0 )

ival = get_value();

(e) if ( iva1 == 0 )

else ival = 0;

Упражнение 5.4

Преобразуйте тип параметра occurs функции min(), сделав его не ссылкой, а простым объектом. Запустите программу. Как изменилось ее поведение?

5.4. Инструкция switch

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

Для иллюстрации инструкции switch рассмотрим следующую задачу. Нам надо подсчитать, сколько раз встречается каждая из гласных букв в указанном отрывке текста. (Общеизвестно, что буква e – наиболее часто встречающаяся гласная в английском языке.) Вот алгоритм программы:

* Считывать по одному символу из входного потока, пока они не кончатся.

* Сравнить каждый символ с набором гласных.

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

* Напечатать результат.

Написанная программа была запущена, в качестве контрольного текста использовался раздел из оригинала данной книги. Результаты подтвердили, что буква e действительно самая частая:

aCnt: 394

eCnt: 721

iCnt: 461

oCnt: 349

uCnt: 186

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

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

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. Например, мы можем подсчитать суммарное количество встретившихся символов, не являющихся гласными буквами: