1. Введення і виведення під час запуску та два вікна IDE
Коли ви вперше запускаєте консольну програму в IDE, вона може здаватися магічною коробкою: натиснули кнопку — і щось відбулося. Але далі починаються «паранормальні явища»: програма зависла, виведення не там, а інколи взагалі запускається не те, що ви щойно змінювали. Це нормально! Ви просто вперше стикаєтеся з тим, що Build і Run — це два абсолютно різні процеси.
Дуже корисно уявляти це так: IDE одночасно обслуговує «два текстові канали». Один канал — це спілкування з компілятором: синтаксичні помилки, результати Build. Другий — реальна консоль вашої програми: те, що виводить std::cout і зчитує std::cin. Якщо переплутати ці канали, відчуття буде як у людини, яка намагається розмовляти з мікрохвильовкою через холодильник: техніка наче є, а логіки немає.
Подивімося на схему життєвого циклу вашої програми:
flowchart TD
A[Ви змінили код] --> B[IDE запускає збирання]
B -->|Синтаксичні помилки| C[Вікно Build/Problems: програму не запущено!]
B -->|Успіх| D[IDE запускає програму]
D --> E[Вікно Run/Console: чекаємо на введення з клавіатури]
D --> F[Вікно Run/Console: бачимо виведення std::cout]
Невелика таблиця, яка збереже вам нерви:
| Де ви бачите текст | Що це означає | Приклад |
|---|---|---|
| Build / Problems / Messages | Результати роботи компілятора та лінкера. Помилки в коді. | |
| Run / Console | Реальна робота програми. Введення і виведення даних. | |
2. Швидкі експерименти з введенням даних
У Web-IDE платформа зазвичай сама показує окремі поля «Input» і «Output». Натомість локальна IDE CLion показує «термінал усередині IDE» (вкладка Run), і тепер саме ви відповідаєте за те, щоб увести дані в потрібний момент із клавіатури.
Читання кількох значень і ілюзія зависання
Якщо програма чекає число, а ви його не ввели, вона чекатиме нескінченно. У компʼютера немає телепатії. Памʼятайте: std::cin >> a >> b; очікує рівно два значення!
#include <iostream>
int main() {
int a = 0, b = 0;
std::cin >> a >> b; // Очікуємо два числа, наприклад: 10 20
std::cout << (a + b) << '\n'; // Виведе 30
return 0;
}
Якщо ви введете лише 10 і натиснете Enter, програма мовчки блиматиме курсором, чекаючи на друге число.
Після того як ви введете друге число, програма відпрацює і успішно завершиться.
Читання до завершення введення
Іноді, особливо в алгоритмічних задачах, невідомо, скільки чисел введе користувач. Тоді ми переносимо читання просто в умову циклу while. Цикл працюватиме, доки в консоль надходитимуть нові числа:
#include <iostream>
int main() {
int x = 0;
while (std::cin >> x) {
std::cout << (x * 2) << " "; // Введення: 1 2 3 -> Виведення: 2 4 6
}
return 0;
}
Щоб повідомити консолі, що введення завершено, тобто надіслати сигнал EOF (End Of File), натисніть Ctrl+D на macOS/Linux або Ctrl+Z потім Enter на Windows. Ця дія переведе потік введення в стан EOF. Як ви памʼятаєте з теми про логічні типи, у цей момент перевірка std::cin >> x поверне значення false, і цикл while негайно завершиться.
3. Аргументи командного рядка: argc / argv
Не лякайтеся страшного синтаксису char* argv[]. Масиви та вказівники ми детально вивчимо в майбутніх модулях.
Іноді вам потрібно передати програмі налаштування ще до того, як вона почне читати дані через std::cin. Наприклад, сказати їй: «Запустися в тихому режимі» або «Покажи меню довідки». Для цього існують аргументи командного рядка.
У C++ є друга форма функції main, спеціально для цих цілей:
int main(int argc, char* argv[])
- argc (Argument Count) — кількість переданих аргументів. Це значення завжди не менше за 1, адже першим аргументом завжди є назва самої запущеної програми.
- argv (Argument Vector) — масив рядків, точніше — масив C-рядків. У
argv[1]лежатиме перший переданий вами параметр, уargv[2]— другий, і так далі.
Мініприклад: режим роботи за прапорцем
Зробімо найпростіший обробник: якщо під час запуску програмі передали прапорець --help, ми надрукуємо підказку.
#include <iostream>
#include <string>
int main(int argc, char* argv[]) {
// Перевіряємо, чи існує аргумент, перш ніж читати його, щоб уникнути помилок доступу до памʼяті
if (argc >= 2 && std::string(argv[1]) == "--help") {
std::cout << "Довідка: ця програма додає числа.\n";
return 0;
}
std::cout << "Звичайний запуск програми...\n";
return 0;
}
Хм, --help не працює — треба налаштувати конфігурацію запуску.
4. Run Configuration
Але як передати той самий --help в IDE? Адже ми просто натискаємо зелену кнопку запуску!
Річ у тім, що в сучасних IDE кнопка запускає не просто код — вона запускає конфігурацію запуску. Це збережений «рецепт»: яку програму запускати, з якими аргументами і з якого каталогу.
Щоб додати аргументи в CLion:
- Поряд із зеленою кнопкою запуску ▶ вгорі екрана знайдіть розкривний список із назвою вашого проєкту і натисніть його.
- Виберіть Edit Configurations... (Редагувати конфігурації).
Відкриється вікно налаштувань. Нас цікавлять два поля:
- Program arguments: тут ви вказуєте параметри через пробіл. Введіть тут
--helpі натисніть OK. Тепер, коли ви натиснете кнопку запуску,argcдорівнюватиме 2, а програма виконає блок із підказкою. - Working directory: робочий каталог. Якщо ваша програма шукатиме файл
data.txtза відносним шляхом, то шукатиме його саме в цьому каталозі. Запамʼятайте це поле: воно знадобиться вам пізніше, під час роботи з файлами.
Запустімо програму.
5. Основи налагодження
Головна навичка розробника — уміння знаходити логічні помилки. Коли програма не падає, але видає неправильний результат, замість того щоб гадати, ми використовуємо режим Debug. Він дає змогу ніби зупинити час усередині програми й побачити, які значення мають змінні.
#include <iostream>
int main() {
auto lang = "C++";
std::cout << "Вітаємо у " << lang << "!\n";
for (int i = 1; i <= 5; i++) {
std::cout << "i = " << i << std::endl;
}
return 0;
}
Задача: Ми хочемо на власні очі побачити, як змінюється змінна i всередині циклу, ще до того, як її значення виведеться на екран.
Дія: точка зупинки (Breakpoint)
Клацніть лівою кнопкою миші на номер рядка std::cout << .... Там зʼявиться червоне коло. Потім натисніть іконку зеленого жука (Debug) 🐞.
Програма дійде до червоного кола і зупиниться. На нижній панелі відкриється вікно Debug. Прямо в редакторі коду сірим текстом зʼявиться поточне значення змінної i = 1.
Тепер програма чекає на ваші команди. Використовуйте кнопки на панелі Debugger внизу:
- F8 — Крок поверх (Step Over). Виконати поточний рядок і перейти до наступного. Натисніть
F8кілька разів, щоб побачити, як цикл проходить свої ітерації, перестрибує вгору, а зміннаiпоступово збільшується: 2, 3, 4. - F7 — Крок усередину (Step Into). Якщо на поточному рядку викликається якась ваша функція (у нас її немає),
F7«провалиться» всередину цієї функції, щоб ви могли подивитися, як вона працює покроково. - F9 — Продовжити (Resume Program). Відпустити програму і дати їй працювати далі у звичайному швидкому темпі, доки вона не зустріне наступну точку зупинки (червоне коло) або не завершиться.
Налагоджувач — це один із найпотужніших ваших інструментів у C++.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ