Перейти к основному содержимому

Циклы

Цикл - это многократное выполнение одинаковых действий при условии выполнения заданного условия.

В языке Си существует три вида циклов:

  • for - цикл с известным количеством шагов.
  • while - цикл с предусловием.
  • do...while - цикл с постусловием.

Цикл for

Цикл for имеет следующее формальное определение:

for(инициализация; условие; приращение;)
{
// тело цикла
}

Инициализация цикла выполняется один раз перед выполнением цикла. Как правило, это инициализация счетчиков, контролирующих число итераций цикла.

Условие проверяется перед каждой итерацией цикла и если возвращается не нулевое значение (то есть условие истинно), то выполняется тело цикла.

Приращение выполняется после каждой итерации цикла и обычно здесь происходит увеличение счетчиков цикла.

Указывать все три выражения в определении цикла не обязательно. Можно опустить любое из них или вовсе не указывать ни один из параметров.

Циклы могут быть вложенными. Пример:

#include <stdio.h>

int main( void )
{
for(int i=1; i < 10; i++)
{
for(int j = 1; j < 10; j++)
{
printf("%d \t", i * j);
}
printf("\n");
}
return 0;
}

Цикл do...while

В цикле do..while сначала выполняется код цикла, а потом происходит проверка условия в инструкции while. Если условие истинно, то есть не равно 0, то цикл повторяется.

do
{
// тело цикла
}
while(условие);

Так как проверка условия выполняется после прохождения цикла, то при любом заданном условии тело цикла выполнится хотя бы один раз. Пример:

int i = -1;
do
{
printf("%d", i);
i--;
}
while(i > 0);

Цикл while

Цикл while, в отличие от цикла do..while сначала проверяет условия и если оно выполняется, то есть не равно 0, то тогда выполняется код цикла:

while(условие){
// тело цикла
}

Пример цикла, выводящего на консоль числа от 5 до 0:

#include <stdio.h>

in main( void )
{
int i = 5;
while(i >= 0)
{
printf("%d \n" , i);
i--;
}
return 0;
}

Операторы continue и break

Для выхода из цикла до его завершения можно воспользоваться оператором break. Например:

int i = 1;
for( ; ; )
{
printf("%d * %d = %d \n", i, i, i * i);
i++;
if(i > 5) break;
}

Для пропуска только текущей итерации используется оператор continue. Например, надо посчитать сумму только нечетных чисел:

#include <stdio.h>

int main( void )
{
int result = 0;
for(int i=0; i<10; i++)
{
if(i % 2 == 0) continue;
result +=i;
}
printf("result = %d", result);
return 0;
}

Для проверки числа на четность, мы сравниваем остаток от целочисленного деления на 2 с нулем. Если они равны, то используем оператор continue для перехода к следующей итерации цикла.

Оператор goto

Для организации сложного потока управления в языке Си есть опреатор goto. Его использование делает программу тяжелой для восприятия и трудночитаемой. Поэтому крайне не рекомендуется его использование. Пример использования:

#include <stdio.h>

int main( void )
{
printf("Hello");
goto skip;
printf("World!");
skip:
return 0;
}

Самостоятельная работа

Задачи

Задача 1

Напишите программу, которая с помощью цикла for выводит в одну строку все нечетные числа от 10 до 30 через пробел.

  • Данные на входе: нет
  • Данные на выходе: 11 13 15 17 19 21 23 25 27 29

Задача 2

Ввести целое число и определить количество и сумму цифр в нём.

  • Данные на входе: Целое число
  • Данные на выходе: Два числа через пробел

Пример №1:

  • Данные на входе: 1546
  • Данные на выходе: 4 16

Пример №2:

  • Данные на входе: 25385
  • Данные на выходе: 5 23

Задача 3

Найти наименьший общий делитель НОД для двух чисел, используя алгоритм Евклида.

  • Данные на входе: Два числа через пробел
  • Данные на выходе: Число

Пример №1:

  • Данные на входе: 14 35
  • Данные на выходе: 7

Задача 4

Подсчитать количество натуральных чисел n (11 <= n <= 999), являющихся палиндромами, и распечатать их.

  • Данные на входе: нет
  • Данные на выходе: Числа через пробел