⚙️ C++
حلقة for في C++17: دليل مفصل
Условия и циклы C++: if, switch, for, while с примерами
Программы без управления потоком были бы тривиальны — они делали бы одно и то же при любых данных. Условия и циклы делают программы умными и гибкими.
Условный оператор if/else
#include <iostream>
using namespace std;
int main() {
// Простой if
int temp = 22;
if (temp > 20) {
cout << "Тепло! Идём гулять." << endl;
}
// if-else
int age = 16;
if (age >= 18) {
cout << "Вход разрешён." << endl;
} else {
cout << "Только с 18 лет. Ещё " << (18-age) << " лет." << endl;
}
// if-else if-else: множество вариантов
int score = 75;
if (score >= 90) cout << "Отлично (A)" << endl;
else if (score >= 80) cout << "Хорошо (B)" << endl;
else if (score >= 70) cout << "Удовлетворительно (C)" << endl;
else if (score >= 60) cout << "Посредственно (D)" << endl;
else cout << "Неудовлетворительно (F)" << endl;
// Логические операторы
bool hasTicket = true, hasID = true;
if (age >= 18 && hasTicket && hasID) {
cout << "Добро пожаловать на концерт!" << endl;
}
return 0;
}
Тернарный оператор
// условие ? значение_если_true : значение_если_false
int a=15, b=28;
int max = (a > b) ? a : b; // 28
string sign = (a > 0) ? "положительное" : "неположительное";
// В выводе
cout << "Максимум: " << ((a > b) ? a : b) << endl;
// Чётность
for (int i=1; i<=5; i++)
cout << i << " — " << (i%2==0 ? "чётное" : "нечётное") << endl;
Оператор switch
#include <iostream>
using namespace std;
int main() {
int day = 3;
switch (day) {
case 1: cout << "Понедельник" << endl; break;
case 2: cout << "Вторник" << endl; break;
case 3: cout << "Среда" << endl; break;
case 4: cout << "Четверг" << endl; break;
case 5: cout << "Пятница" << endl; break;
case 6: cout << "Суббота" << endl; break;
case 7: cout << "Воскресенье" << endl; break;
default: cout << "Неверный день" << endl;
}
// Несколько case → один блок
int month = 4;
int daysCount;
switch (month) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
daysCount = 31; break;
case 4: case 6: case 9: case 11:
daysCount = 30; break;
case 2:
daysCount = 28; break;
default:
daysCount = -1;
}
cout << "Дней в месяце: " << daysCount << endl; // 30
// Switch со строками — через if/else (switch в C++ не поддерживает string напрямую)
string cmd = "start";
if (cmd == "start") cout << "Запуск..." << endl;
else if (cmd == "stop") cout << "Остановка..." << endl;
else cout << "Неизвестная команда" << endl;
return 0;
}
Цикл for
#include <iostream>
using namespace std;
int main() {
// Базовый for
for (int i = 0; i < 5; i++) cout << i << " "; // 0 1 2 3 4
cout << endl;
// Обратный отсчёт
for (int i = 10; i >= 1; i--) cout << i << " ";
cout << "ПУСК!" << endl;
// Шаг 2
for (int i = 0; i <= 10; i += 2) cout << i << " "; // 0 2 4 6 8 10
cout << endl;
// Сумма 1..100 = 5050
int sum = 0;
for (int i = 1; i <= 100; i++) sum += i;
cout << "Сумма 1..100 = " << sum << endl;
// Числа Фибоначчи
int fa=0, fb=1;
cout << "Фибоначчи: ";
for (int i=0; i<10; i++) {
cout << fa << " ";
int tmp = fa + fb; fa = fb; fb = tmp;
}
cout << endl; // 0 1 1 2 3 5 8 13 21 34
// Таблица умножения
cout << "
Таблица умножения:" << endl;
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
cout << i*j;
if (i*j < 10) cout << " ";
else if (i*j < 100) cout << " ";
else cout << " ";
}
cout << endl;
}
return 0;
}
Цикл while: игра "Угадай число"
#include <iostream>
#include <cstdlib> // rand(), srand()
#include <ctime> // time()
using namespace std;
int main() {
// Инициализация генератора случайных чисел
srand(time(nullptr));
int secret = rand() % 100 + 1; // Случайное число 1..100
int guess = 0;
int attempts = 0;
cout << "Угадайте число от 1 до 100!" << endl;
while (guess != secret) {
cout << "Ваш вариант: ";
cin >> guess;
attempts++;
if (guess < secret) {
cout << "Больше! ↑" << endl;
} else if (guess > secret) {
cout << "Меньше! ↓" << endl;
} else {
cout << "🎉 Правильно! Число было " << secret << endl;
cout << "Попыток: " << attempts << endl;
}
}
return 0;
}
Цикл do-while
#include <iostream>
using namespace std;
int main() {
// do-while: выполнить СНАЧАЛА, ПОТОМ проверить
int n = 0;
do {
cout << "n = " << n << endl;
n++;
} while (n < 3);
// Классика: ввод с проверкой
int age;
do {
cout << "Введите возраст (1-120): ";
cin >> age;
if (age < 1 || age > 120)
cout << "Ошибка! Введите от 1 до 120.
";
} while (age < 1 || age > 120);
cout << "Принятый возраст: " << age << endl;
return 0;
}
Range-based for (C++11): перебор коллекций
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
// Массив
int nums[] = {1, 2, 3, 4, 5};
int sum = 0;
for (int n : nums) { // Для каждого n в nums
sum += n;
}
cout << "Сумма: " << sum << endl; // 15
// Вектор
vector<string> fruits = {"яблоко", "груша", "банан"};
for (const string& f : fruits) { // & для эффективности (без копирования)
cout << "Фрукт: " << f << endl;
}
// Строка — тоже итерируемая
string word = "Привет";
for (char c : word) {
cout << c << " "; // П р и в е т
}
cout << endl;
// auto& для произвольного типа
vector<int> squares = {1, 4, 9, 16, 25};
for (auto& sq : squares) {
cout << sq << " ";
}
cout << endl;
return 0;
}
break и continue
#include <iostream>
using namespace std;
int main() {
// break: выйти из цикла
for (int i=0; i<10; i++) {
if (i==5) { cout << "
Нашли 5!" << endl; break; }
cout << i << " ";
}
// 0 1 2 3 4
// continue: пропустить итерацию
for (int i=0; i<10; i++) {
if (i%2==0) continue; // пропускаем чётные
cout << i << " "; // 1 3 5 7 9
}
cout << endl;
// Поиск простого числа
cout << "Простые числа до 50: ";
for (int n=2; n<=50; n++) {
bool prime = true;
for (int d=2; d*d<=n; d++) {
if (n%d==0) { prime=false; break; }
}
if (prime) cout << n << " ";
}
cout << endl;
// FizzBuzz
for (int i=1; i<=20; i++) {
if (i%15==0) cout << "FizzBuzz
";
else if (i%3==0) cout << "Fizz
";
else if (i%5==0) cout << "Buzz
";
else cout << i << "
";
}
return 0;
}
Практика: треугольник и паттерны
#include <iostream>
using namespace std;
int main() {
int n = 5;
// Треугольник из звёздочек
cout << "Треугольник:" << endl;
for (int row=1; row<=n; row++) {
for (int col=1; col<=row; col++) cout << "* ";
cout << endl;
}
// Пирамида
cout << "Пирамида:" << endl;
for (int row=1; row<=n; row++) {
for (int sp=n-row; sp>0; sp--) cout << " "; // пробелы
for (int star=1; star<=2*row-1; star++) cout << "*"; // звёздочки
cout << endl;
}
// Шахматная доска
cout << "Шахматная доска:" << endl;
for (int i=0; i<8; i++) {
for (int j=0; j<8; j++) cout << ((i+j)%2==0 ? "■ " : "□ ");
cout << endl;
}
return 0;
}
Итого: что мы узнали
- ✅
if / else if / else— ветвление программы - ✅ Тернарный оператор
? :— компактный if/else - ✅
switch: нуженbreak, иначе fall-through - ✅
for— цикл с известным числом итераций - ✅
while— условие проверяется ДО тела - ✅
do-while— условие проверяется ПОСЛЕ тела - ✅ Range-based
for (auto& x : collection)— C++11, перебор коллекций - ✅
break— выход из цикла;continue— пропуск итерации