Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Липпман.doc
Скачиваний:
8
Добавлен:
14.08.2019
Размер:
7.54 Mб
Скачать

5.8. Инструкция 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 ] ) {

// нашли!

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

1oc = ix;

break;

}

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

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

return 1oc;


}

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

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

if ( ptr ) {

if ( *ptr == "quit" )

break;

// ...


}

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

white ( cin >> inBuf )

{

switch( inBuf[ 0 ] ) {

case '-':

for ( int ix = 1; ix < inBuf.size(); ++ix ) {

if ( inBuf[ ix ] == ' ' )

break; // #1

// ...

// ...

}

break; // #2

case '+':

// ...

}


}

Инструкция break, помеченная // #1, завершает выполнение цикла for внутри ветви case '-' блока switch, но не сам switch. Аналогично break // #2 завершает выполнение блока switch, но не цикла while, в который тот входит.