Мы можем употребить в этом месте составную инструкцию, тогда объявление переменной file_name будет синтаксически правильным. Использование блока гарантирует, что объявленная переменная видна только внутри него, а в этом контексте она заведомо инициализирована. Вот как выглядит правильный текст:
case ok:
{
// ок
string file_name = get_file_name();
// ...
break;
}
Модифицируйте программу из данного раздела так, чтобы она подсчитывала не только буквы, но и встретившиеся пробелы, символы табуляции и новой строки.
Модифицируйте программу из данного раздела так, чтобы она подсчитывала также количество встретившихся двухсимвольных последовательностей ff, fl и fi.
Найдите и исправьте ошибки в следующих примерах:
(a)
switch ( ival ) {
case 'a': aCnt++;
case 'e': eCnt++;
default: iouCnt++;
}
(b)
switch ( ival ) {
case 1:
int ix = get_value();
ivec[ ix ] = ival;
break;
default:
ix = ivec.sizeQ-1;
ivec[ ix ] = ival;
}
(c)
switch ( ival ) {
case 1, 3, 5, 7, 9:
oddcnt++;
break;
case 2, 4, 6, 8, 10:
evencnt++;
break;
}
(d)
int iva1=512 jva1=1024, kva1=4096;
int bufsize;
// ...
switch( swt ) {
case ival:
bufsize = ival * sizeof( int );
break;
case jval:
bufsize = jval * sizeof( int );
break;
case kval:
bufsize = kval * sizeof( int );
break;
}
(e)
enum { illustrator = 1, photoshop, photostyler = 2 };
switch ( ival ) {
case illustrator:
--i11us_1icense;
break;
case photoshop:
--pshop_1icense;
break;
case photostyler:
--psty1er_license;
break;
}
5.5. Инструкция цикла for
Как мы видели, выполнение программы часто состоит в повторении последовательности инструкций - до тех пор, пока некоторое условие остается истинным. Например, мы читаем и обрабатываем записи файла, пока не дойдем до его конца, перебираем элементы массива, пока индекс не станет равным размерности массива минус 1, и т.д. В С++ предусмотрено три инструкции для организации циклов, в частности for и while, которые начинаются проверкой условия. Такая проверка означает, что цикл может закончиться без выполнения связанной с ним простой или составной инструкции. Третий тип цикла, do while, гарантирует, что тело будет выполнено как минимум один раз: условие цикла проверяется по его завершении. (В этом разделе мы детально рассмотрим цикл for; в разделе 5.6 разберем while, а в разделе 5.7 - do while.)
Цикл for обычно используется для обработки структур данных, имеющих фиксированную длину, таких, как массив или вектор:
#include vector
int main() {
int ia[ 10 ];
for ( int ix = 0; ix 10; ++-ix )
ia[ ix ] = ix;
vectorint ivec( ia, ia+10 );
vectorint::iterator iter = ivec.begin() ;
for ( ; iter != ivec.end(); ++iter )
*iter *= 2;
return 0;
}
Синтаксис цикла for следующий:
for (инструкция-инициализации; условие; выражение )
инструкция
инструкция-инициализации может быть либо выражением, либо инструкцией объявления. Обычно она используется для инициализации переменной значением, которое увеличивается в ходе выполнения цикла. Если такая инициализация не нужна или выполняется где-то в другом месте, эту инструкцию можно заменить пустой (см. второй из приведенных ниже примеров). Вот примеры правильного использования инструкции-инициализации:
// index и iter определены в другом месте
for ( index =0; ...
for ( ; /* пустая инструкция */ ...
for ( iter = ivec.begin(); ...
for ( int 1o = 0,hi = max; ...
for ( char *ptr = getStr(); ...
условие служит для управления циклом. Пока условие при вычислении дает true, инструкция продолжает выполняться. Выполняемая в цикле инструкция может быть как простой, так и составной. Если же самое первое вычисление условия дает false, инструкция не выполняется ни разу. Правильные условия можно записать так:
(... index arraySize; ... )
(... iter != ivec.end(); ... )