JavaRush /Курсы /C++ SELF /Ввод/вывод в IDE, конфигурации запуска и основы отладки (...

Ввод/вывод в IDE, конфигурации запуска и основы отладки (дебаг)

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[]) {
    // Check if argument exists before reading to avoid memory access errors
    if (argc >= 2 && std::string(argv[1]) == "--help") {
        std::cout << "Help: This program adds numbers.\n";
        return 0;
    }

    std::cout << "Normal program startup...\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 << "Hello and welcome to " << 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++.

1
Задача
C++ SELF, 5 уровень, 4 лекция
Недоступна
Плюсовая сумма
Плюсовая сумма
1
Задача
C++ SELF, 5 уровень, 4 лекция
Недоступна
Чётный сбор
Чётный сбор
1
Задача
C++ SELF, 5 уровень, 4 лекция
Недоступна
Рамка карты
Рамка карты
1
Задача
C++ SELF, 5 уровень, 4 лекция
Недоступна
Поиск множителей
Поиск множителей
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ