Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C++ лекции.doc
Скачиваний:
22
Добавлен:
21.04.2019
Размер:
536.06 Кб
Скачать

8.2 Цикл do … while

Цикл do … while является циклом с постусловием. Это значит, что в отличае от цикла while, где условие продолжения цикла выполняется перед выполнением тела цикла, в цикле do … while условие продолжения цикла выполняется после выполнения тела цикла.

Оператор do … while имеет следующий синтаксис:

do

оператор_тела_цикла;

while (условие_продолжения_цикла);

Обратите внимание, что после оператора do точка с запятой не ставится (если поставить точку запятой после do, это будет считаться пустым оператором), а вот в конце оператора do … while точка с запятой ставится.

#include <stdio.h>

#include <math.h>

#include <time.h>

int main() {

srand( time(NULL) );

int number = rand() % 900 + 100;

printf("Я загадал число меньшее 1000 и большее 100.");

int guess;

do {

printf("Попробуй угадать моё число: ");

scanf("%d", &guess);

if (guess > number)

printf("Мое число меньше");

else if (guess < number)

printf("Мое число больше");

} while (guess != number);

printf("Правильно!");

}

Внимание! В цикле do … while обязательно нужно использовать составной оператор, если тело цикла содержит несколько действий! Если в этом примере убрать фигурные скобки в цикле — компилятор выдаст ошибку.

Теперь программа избавилась от бессмыссленного значения -1 в инициализации переменной guess и стала более логичной.

Как и операторы ветвления, операторы цикла можно заключать друг в друга. Например, это может быть необходимо для того, что бы проверить вводимое в «Угадайке» пользователем число на вхождение в диапозон 100 .. 1000.

#include <stdio.h>

#include <math.h>

#include <time.h>

int main() {

srand( time(NULL) );

int number = rand() % 900 + 100;

printf("Я загадал число меньшее 1000 и большее 100.");

int guess;

// игра

do {

// ввод пользователем числа

do {

printf("Введите число между 100 и 1000: ");

scanf("%d", &guess);

} while (guess > 1000 || guess < 100);

// сравнение введенного числа

if (guess > number)

printf("Мое число меньше");

else if (guess < number)

printf("Мое число больше");

} while (guess != number);

// победа

printf("Правильно!");

}

В этом примере число будет принято только в том случае, если оно не будет больше 1000 или меньше 100. Однако в этом примере программа не сообщает пользователю, что он совершил ошибку. По-этому ту часть, которая отвечает за ввод пользователем значения, лучше выполнить следующим образом:

// ввод пользователем числа

printf("Введите число между 100 и 1000: ");

scanf("%d", &guess);

while (guess > 1000 || guess < 100) {

printf("Вы ввели неправильное число. Число должно быть меньше 1000 и больше 100. Введите ещё раз: ");

scanf("%d", &guess);

}

8.3 Цикл for

Третий доступный в языке C оператор цикла for является циклом с предусловием. Цикл for имеет сложный синтаксис, однако он очень удобен своей компактностью.

for (инициализация_переменных; условие_продолжения; итерация)

оператор_тела_цикла;

В блоке «инициализация_переменных» можно задать начальные значения переменных и объявлять в этом новые переменные (это справедливо только для C++ - в стандарте C нельзя объявлять переменные в этом блоке).

В блоке «итерация» можно записать некоторые выражения, которые будут выполняться после выполнения тела цикла.

Например:

for (int i = 0; i < 10; ++i)

printf("%d ", i);

Этот код выведет значения от 0 до 9.

Сначала выполнится оператор инициализации — будет создана переменная i, которая инициализуется нулем. После этого выполнится проверка на продолжение цикла. Далее выполнится тело цикла, после чего выполнится итератор цикла и i увеличится, после чего снова произойдет проверка.

В принципе, допустимо писать оператор for и в такой форме:

for (int i = 0; i < 10; printf("%d ", i++));

Этот пример полностью аналогичен предыдущему, однако настоятельно рекомендуется не использовать блоки цикла for не по назначению — это сильно усложняет восприятие кода.

Кроме того, возможно использование оператора , (запятая) в блоках цикла. Этот оператор позволяет выполнять в каждом блоке сразу несколько действий:

int i;

double doub;

for (i = 0, doub = 100.0; i < 10 && doub > 5; i++, doub /= 2.)

printf("%d %f", i, doub);

В принципе, можно было бы использовать оператор «запятая» и в условии, однако оператор && использовать лучше, поскольку если левая часть оператора && ложна — то правая даже не проверяется. Так же заметьте, что ничто не мешает использовать оператор «запятая» в любом месте программы, обходясь без составных операторов, однако старайтесь этого не делать. Единственное, что мешает использовать оператор «запятая» - это объявление переменных. Объявление переменных использует символ запятой в другом контексте, так что объявлять переменные разных типов через запятую не возможно.

Так же некоторые блоки могут быть пустыми:

for (int i = 0; i < 10; )

printf("%d ", i++);

Если же убрать и инициализацию, то цикл for становится полностью аналогичен циклу while:

int i = 0;

for (; i < 10; )

printf("%d ", i++);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]