Какие ошибки допущены в следующих циклах 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 )
// ...
Напишите небольшую программу, которая запрашивает у пользователя две строки и печатает результат лексикографического сравнения этих строк (строка считается меньшей, если идет раньше при сортировке по алфавиту). Пусть она повторяет эти действия, пока пользователь не даст команду закончить. Используйте тип 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, продолжает выполняться. Например:
while ( 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, в который тот входит.
5.9. Инструкция continue
Инструкция continue завершает текущую итерацию цикла и передает управление на вычисление условия, после чего цикл может продолжиться. В отличие от инструкции break, завершающей выполнение всего цикла, инструкция continue завершает выполнение только текущей итерации. Например, следующий фрагмент программы читает из входного потока по одному слову. Если слово начинается с символа подчеркивания, оно обрабатывается, в противном случае программа переходит к новому слову.
while ( cin inBuf ) {
if ( inBuf[0] '= '_' )
continue; // завершение итерации
// обработка слова ...
}
Инструкция continue может быть использована только внутри цикла.
5.10. Инструкция goto
Инструкция goto обеспечивает безусловный переход к другой инструкции внутри той же функции, поэтому современная практика программирования выступает против ее применения.
Синтаксис goto следующий:
goto метка;
где метка – определенный пользователем идентификатор. Метка ставится перед инструкцией, на которую можно перейти с помощью goto, и должна заканчиваться двоеточием. Нельзя ставить метку непосредственно перед закрывающей фигурной скобкой. Если же это необходимо, их следует разделить пустой инструкцией:
end: ; // пустая инструкция
}