Циклы

При решении практических задач постоянно возникает необходимость в повторении действия заданное количество раз

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

while — цикл с предусловием;

for — параметрический цикл (цикл с заданным числом повторений).

Цикл с предусловием while

Общая форма записи:

while (Условие) {
	Блок операций;
}

Операции в цикле будут выполняться до тех пор, пока условие будет верно.

При построении цикла while в блок операций необходимо включить конструкции, изменяющие величину проверяемого выражения, так, чтобы в конце концов оно стало ложным. Иначе выполнение цикла будет осуществляться бесконечно(бесконечный цикл).

Рассмотрим цикл с предусловием

1
2
3
4
5
6
7
8
9
10
11
12

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
	int i;
	i = 1;
	while (i <= 10) {  // пока i меньше или равен 10 выполняем действия
		printf("%i\n", i); 
		i++;              
	}
	return 0;
}

Этот цикл выполняется до тех пор, пока истинно условие. Тело цикла - это две строки, одна выводит число, вторая изменяет его. Очевидно, что этот цикл будет выполнен 10 раз и выведет на экран это:

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

Параметрический цикл for

Общая форма записи:

for (Инициализация; Условие; Изменение счётчика) {
	Блок операций;
}

Инициализация - присваивание параметру цикла начального значения;
Условие - проверка условия повторения цикла, чаще всего - сравнение величины параметра с некоторым граничным значением;
Изменение счётчика - изменение значения параметра для следующего прохождения тела цикла.

Пример с циклом for:

Задача: посчитать сумму чисел от 1 до введенного N.

1
2
3
4
5
6
7
8
9
10
11
12
13

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
	int N, sum, i;
	scanf("%i", &N);
	sum = 0;  // начальное значение sum
	for (i = 1; i <= N; i++) {  // цикл от 1 до N с шагом 1
		sum = sum + i;
	}
	printf("sum = %i", sum);
	return 0;
}

Вложенные циклы

В Си допускаются вложенные циклы, то есть когда один цикл находится внутри другого:

for (i = 0; i<n; i++) {  // внешний цикл - Цикл1     
	for (j = 0; j<n; j++) {   // вложенный цикл - Цикл2
		// блок операций Цикла2
	}
	// блок операций Цикла1;
}

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

Пример:

Задача: вывести таблицу умножения до 10*10.

1
2
3
4
5
6
7
8
9
10
11
12
13

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
	int i, j;
	for (i = 1; i <= 10; i++) { 
		for (j = 1; j <= 10; j++) { 
			printf("%3d ", i * j);
		}
		printf("\n");  // перевод строки
	}
	return 0;
}

Результат работы программы:


Оператор break - оператор прерывания цикла

Оператор break позволяет выйти из цикла, не дожидаясь ложного условия.

Задача: Даны числа от A до B включительно. Нужно вывести первое число, которое делится на 2 и на 3.

Решение с циклом for:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
	int A, B, i;
	scanf("%i%i", &A, &B);
	for (i = A; i <= B; i++) {  // цикл от A до B с шагом 1 
		if (i % 2 == 0 && i % 3 == 0) {  // если условие верно, то выходим из цикла
			break;                     
		}
	}
	printf("%i", i);
	return 0;
}

Решение с циклом while:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
	int A, B;
	scanf("%i%i", &A, &B);
	while (A <= B) {  // цикл пока A <= B с шагом 1
		if (A % 2 == 0 && A % 3 == 0) {  // проверка условия
			break;
		}
		A++;
	}
	printf("%i", A);
	return 0;
}

Оператор continue

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
	int N, a;
	scanf("%i", &N);
	for (int i = 0; i < N; i++) {
		scanf("%i", &a);
		if (a % 2 == 0) {  // если условие верно, то пропускаем остальную часть
			continue;
		}
		printf("%i ", a);
	}
	return 0;
}

Code.C © Copyright Павел Калашников 2021
обратная связь code.c04@mail.ru