5.6. Инструкция while

5.6. Инструкция while

Синтаксис инструкции while следующий:

while ( условие )

инструкция

Пока значением условия является true, инструкция выполняется в такой последовательности:

* Вычислить условие.

* Выполнить инструкцию, если условие истинно.

* Если самое первое вычисление условия дает false, инструкция не выполняется.

Условием может быть любое выражение:

bool quit = false;

// ...

while ( ! quit ) {

// ...

quit = do_something();

}

string word;

while ( cin word ){ ... }

или объявление с инициализацией:

while ( symbol *ptr = search( name )) {

// что-то сделать

}

В последнем случае ptr видим только в блоке, соответствующем инструкции while, как это было и для инструкций for и switch.

Вот пример цикла while, обходящего множество элементов, адресуемых двумя указателями:

int sumit( int *parray_begin, int *parray_end )

{

int sum = 0;

if ( ! parray_begin || ! parray_end )

return sum;

while ( parray_begin != parray_end )

// прибавить к sum

// и увеличить указатель

sum += *parray_begin++;

return sum;

}

int ia[6] = { 0, 1, 2, 3, 4, 5 };

int main()

{

int sum = sumit( ia[0], ia[ 6 ] );

// ...

}

Для того чтобы функция sumit() выполнялась правильно, оба указателя должны адресовать элементы одного и того же массива (parray_end может указывать на элемент, следующий за последним). В противном случае sumit() будет возвращать бессмысленную величину. Увы, С++ не гарантирует, что два указателя адресуют один и тот же массив. Как мы увидим в главе 12, стандартные универсальные алгоритмы реализованы подобным же образом, они принимают параметрами указатели на первый и последний элементы массива.

Упражнение 5.11

Какие ошибки допущены в следующих циклах while:

(a)

string bufString, word;

while ( cin bufString word )

// ...

(b)

while ( vectorint::iterator iter != ivec.end() )

// ...

(c)

while ( ptr = 0 )

ptr = find_a_value();

(d)

while ( bool status = find( word )) {

word = get_next_word();

if ( word.empty() )

break;

// ...

}

if ( ! status )

cout "Слов не найдено ";

Упражнение 5.12

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

Упражнение 5.13

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