Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C++ для начинающих (Стенли Липпман) 3-е хххх.pdf
Скачиваний:
86
Добавлен:
30.05.2015
Размер:
5.92 Mб
Скачать

С++ для начинающих

209

(c)

for ( int ix = 0; ix < sz; ++ix )

// ...

if ( ix != sz )

// ...

(d)

int ix;

for ( ix < sz; ++ix ) // ...

(e)

for ( int ix = 0; ix < sz; ++ix, ++ sz )

// ...

Упражнение 5.9

Представьте, что вам поручено придумать общий стиль использования цикла for в вашем проекте. Объясните и проиллюстрируйте примерами правила использования каждой из трех частей цикла.

Упражнение 5.10

bool is_equa1( const vector<int> &vl,

Дано объявление функции:

const vector<int> &v2 );

Напишите тело функции, определяющей равенство двух векторов. Для векторов разной длины сравнивайте только то количество элементов, которое соответствует меньшему из двух. Например, векторы (0,1,1,2) и (0,1,1,2,3,5,8) считаются равными. Длину векторов можно узнать с помощью функций v1.size() и v2.size().

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

while ( условие )

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

инструкция

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

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

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

С++ для начинающих

210

3. Если самое первое вычисление условия дает 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() будет возвращать бессмысленную величину. Увы, С++ не гарантирует, что два указателя адресуют один и

С++ для начинающих

211

тот же массив. Как мы увидим в главе 12, стандартные универсальные алгоритмы реализованы подобным же образом, они принимают параметрами указатели на первый и последний элементы массива.

Упражнение 5.11

(a)

string bufString, word;

while ( cin >> bufString >> word )

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

(b)

while ( vector<int>::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 << "Слов не найдено\n";

Упражнение 5.12

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

Упражнение 5.13

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

С++ для начинающих

212

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 {

val = getValue();

val = convertValue(val); printValue(val);

цикла do while:

}while doMore();

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

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

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

do {

// ...

mumble( foo );

своей части условия. Мы не можем написать:

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