JavaRush /Курси /C++ SELF /Введення і виведення в IDE, конфігурації запуску та основ...

Введення і виведення в IDE, конфігурації запуску та основи налагодження (debug)

C++ SELF
Рівень 5 , Лекція 4
Відкрита

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 Результати роботи компілятора та лінкера. Помилки в коді.
error: expected ';'
Run / Console Реальна робота програми. Введення і виведення даних.
Hello, World!

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:

  1. Поряд із зеленою кнопкою запуску вгорі екрана знайдіть розкривний список із назвою вашого проєкту і натисніть його.
  2. Виберіть 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++.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ