- •1. Знакомство со средой программирования
- •2. Создание проекта
- •3. Простейшая программа на c, функция main()
- •3. Подключение дополнительных библиотек, функция printf
- •4. Переменные, типы переменных, литералы
- •5. Форматированный вывод
- •6. Считывание данных с консоли
- •7. Условный оператор if, условные операции.
- •7.1 Оператор else
- •8. Операторы цикла while, do … while, for
- •8.1 Цикл while
- •8.2 Цикл do … while
- •8.3 Цикл for
- •9. Массивы
- •9.1 Объявление массивов
- •9.2 Инициализация массивов
- •9.3 Многомерные массивы
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++);