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

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

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

Представим, что нам надо написать программу, переводящую мили в километры. Структура программы выглядит так:

int val;

bool more = true; // фиктивное значение, нужное для

// начала цикла

while ( more ) {

val = getValue();

val = convertValue(val);

printValue(val);

more = doMore();

}

Проблема заключается в том, что условие вычисляется в теле цикла. for и while требуют, чтобы значение условия равнялось true до первого вхождения в цикл, иначе тело не выполнится ни разу. Это означает, что мы должны обеспечить такое условие до начала работы цикла. Альтернативой может служить использование do while, гарантирующего выполнение тела цикла хотя бы один раз. Синтаксис цикла do while таков:

do

инструкция

while ( условие );

инструкция выполняется до первой проверки условия. Если вычисление условия дает false, цикл останавливается. Вот как выглядит предыдущий пример с использованием цикла do while:

do {

val = getValue();

val = convertValue(val);

printValue(val);

} while doMore();

В отличие от остальных инструкций циклов, do while не разрешает объявлять объекты в своей части условия. Мы не можем написать:

// ошибка: объявление переменной

// в условии не разрешается

do {

// ...

mumble( foo );

} while ( int foo = get_foo() ) // ошибка

потому что до условной части инструкции do while мы дойдем только после первого выполнения тела цикла.

Упражнение 5.14

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

(a)

do

string rsp;

int vail, va12;

cout "Введите два числа: ";

c-in vail va12;

cout "Сумма " vail

" и " va12

" = " vail + va12 "\n\n"

"Продолжить? [да][нет] ";

cin rsp;

while ( rsp[0] != 'n' );

(b)

do {

// ...

} while ( int iva1 = get_response() );

(c)

do {

int ival = get_response();

if ( iva1 == some_value() )

break;

} while ( iva1 );

if ( !iva1 )

// ...

Упражнение 5.15

Напишите небольшую программу, которая запрашивает у пользователя две строки и печатает результат лексикографического сравнения этих строк (строка считается меньшей, если идет раньше при сортировке по алфавиту). Пусть она повторяет эти действия, пока пользователь не даст команду закончить. Используйте тип string, сравнение строк и цикл do while.

5.8. Инструкция break

Инструкция break останавливает циклы for, while, do while и блока switch. Выполнение программы продолжается с инструкции, следующей за закрывающей фигурной скобкой цикла или блока. Например, данная функция ищет в массиве целых чисел определенное значение. Если это значение найдено, функция сообщает его индекс, в противном случае она возвращает -1. Вот как выглядит реализация функции:

// возвращается индекс элемента или -1

int search( int *ia, int size, int value )

{

// проверка что ia != 0 и size 0 ...

int loc = -1;

for ( int ix = 0; ix size; ++ix ) {

if ( value == ia[ ix ] ) {

// нашли!

// запомним индекс и выйдем из цикла

loc = ix;

break;

}

} // конец цикла

// сюда попадаем по break ...

return loc;

}

В этом примере break прекращает выполнение цикла for и передает управление инструкции, следующей за этим циклом, – в нашем случае return. Заметим, что break выводит из блока, относящегося к инструкции for, а не if, хотя является частью составной инструкции, соответствующей if. Использование break внутри блока if, не входящего в цикл или в switch, является синтаксической ошибкой:

// ошибка: неверное использование break

if ( ptr ) {

if ( *ptr == "quit" )

break;

// ...

}

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