ПРОГРАММА КУРСОВ / C++ И ИСКУССТВЕННЫЙ ИНТЕЛЛЕКТ

От первой строки
до своего проекта.

Одна платформа, две траектории. Выберите категорию и раскройте модуль, чтобы увидеть темы, практику и результат.

МАРШРУТ ОБУЧЕНИЯ
01 Понимаем02 Пишем код03 Проверяем04 Создаём проект

Материалы и задачи адаптируются к возрасту и подготовке группы.

Углублённый маршрут / 9 класс и старше

Программа по шагам

От основ языка до структур данных, работы с файлами и проектирования решений с элементами ИИ.

12 модулей
01Среда разработки и первая программаВыстраиваем рабочий цикл от исходного файла до исполняемой программы.

Короткий разбор

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

Что изучаем

  • Редактор, компилятор и диагностика ошибок
  • Структура программы, main, заголовки
  • Сборка и запуск; базовые предупреждения компилятора
ПРАКТИЧЕСКОЕ ЗАДАНИЕ

Соберите консольное приложение, измените параметры запуска и исправьте намеренно внесённую синтаксическую ошибку.

ПРИМЕР НА C++Первая программа
#include <iostream>

int main() {
    std::cout << "Hello, C++!\n";
    return 0;
}

Попробуйте: Измените сообщение и снова соберите программу. Что произойдёт, если пропустить точку с запятой?

Что получится

Студент объясняет разницу между исходным кодом, компиляцией и выполнением.

Вопрос для самопроверки: Чем ошибка компиляции отличается от ошибки логики?

02Типы, выражения и вводСтроим корректные вычисления и проверяем пользовательские данные.

Короткий разбор

Тип определяет представление данных и допустимые операции. Неявные преобразования и целочисленное деление могут дать неожиданный результат, поэтому входные данные и границы значений нужно проверять.

Что изучаем

  • Типы, константы и преобразования
  • Арифметические и логические выражения
  • Консольный ввод, вывод и обработка ошибок
ПРАКТИЧЕСКОЕ ЗАДАНИЕ

Напишите калькулятор с проверкой допустимых значений и деления на ноль.

ПРИМЕР НА C++Ввод и вычисление
#include <iostream>

int main() {
    int tasks = 0;
    std::cout << "Tasks completed: ";
    if (!(std::cin >> tasks) || tasks < 0) {
        std::cout << "Enter a non-negative integer.\n";
        return 1;
    }
    std::cout << "Points: " << tasks * 5 << '\n';
}

Попробуйте: Проверьте значения 0 и 3, затем попробуйте отрицательное число и текст.

Что получится

Результаты проверены на обычных, граничных и ошибочных входных данных.

Вопрос для самопроверки: Как изменится результат деления двух целых чисел и что делать при делении на ноль?

03Условия, циклы и алгоритмыПереводим постановку задачи в последовательность вычислений.

Короткий разбор

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

Что изучаем

  • if/else, switch и логика условий
  • for, while и вложенные циклы
  • Границы, инварианты и оценка числа операций
ПРАКТИЧЕСКОЕ ЗАДАНИЕ

Реализуйте игру с меню и подсчётом статистики; сравните два способа поиска значения.

ПРИМЕР НА C++Сумма в цикле
#include <iostream>

int main() {
    int total = 0;
    for (int number = 1; number <= 5; ++number) {
        total += number;
    }
    std::cout << "Total: " << total << '\n';
}

Попробуйте: До запуска вычислите результат вручную. Измените верхнюю границу и сравните ответы.

Что получится

Студент объясняет ход алгоритма и проверяет условия остановки.

Вопрос для самопроверки: Как алгоритм поведёт себя на пустом наборе, одном элементе и повторяющихся значениях?

04Функции и структура программыОрганизуем программу в небольшие проверяемые части.

Короткий разбор

Функция задаёт контракт: какие данные принимает и какой результат возвращает. Передача по значению создаёт отдельный параметр, а ссылка позволяет обращаться к существующему объекту в соответствии с выбранной сигнатурой.

Что изучаем

  • Сигнатура, параметры, return и область видимости
  • Передача по значению и по ссылке
  • Разделение кода на файлы и повторное использование
ПРАКТИЧЕСКОЕ ЗАДАНИЕ

Разделите калькулятор на функции чтения, вычисления и отображения; составьте набор проверок для каждой операции.

ПРИМЕР НА C++Функция и результат
#include <iostream>

int points_for(int correct) {
    return correct * 10;
}

int main() {
    std::cout << "Points: " << points_for(3) << '\n';
}

Попробуйте: Вызовите функцию для разных значений. Добавьте функцию, которая проверяет допустимое число ответов.

Что получится

Компоненты имеют понятные интерфейсы и проверяются отдельно.

Вопрос для самопроверки: Когда функции достаточно вернуть значение, а когда оправдан параметр по ссылке?

05Массивы, строки и контейнерыРаботаем с наборами данных средствами стандартной библиотеки.

Короткий разбор

Контейнер std::vector управляет последовательностью элементов, а std::string — строковыми данными. Размер контейнера может меняться; корректная проверка границ и обработка пустого набора остаются ответственностью программы.

Что изучаем

  • Массивы и границы доступа
  • std::string и обработка текста
  • std::vector, перебор и изменение элементов
ПРАКТИЧЕСКОЕ ЗАДАНИЕ

Создайте журнал результатов: добавление, поиск, среднее значение и вывод списка.

ПРИМЕР НА C++Последовательность в vector
#include <iostream>
#include <vector>

int main() {
    std::vector<int> scores{4, 7, 5};
    scores.push_back(8);
    int total = 0;
    for (int score : scores) total += score;
    if (!scores.empty()) {
        std::cout << "Average: "
                  << static_cast<double>(total) / scores.size() << '\n';
    }
}

Попробуйте: Попробуйте пустой вектор. Почему перед вычислением среднего нужно проверить его размер?

Что получится

Программа корректно обрабатывает пустой и заполненный список.

Вопрос для самопроверки: Какие проверки нужны перед обращением к первому элементу и вычислением среднего?

06Алгоритмы и структуры данныхВыбираем способ хранения и обработки данных под задачу.

Короткий разбор

Способ хранения влияет на удобные операции и затраты. Стандартные алгоритмы отделяют действие от конкретного контейнера; корректность результата и понятное условие сравнения важнее преждевременной оптимизации.

Что изучаем

  • Поиск, сортировка и сравнение подходов
  • Итераторы и стандартные алгоритмы
  • Оценка времени работы на уровне идеи
ПРАКТИЧЕСКОЕ ЗАДАНИЕ

Отсортируйте результаты по нескольким условиям и сравните ручной алгоритм со std::sort.

ПРИМЕР НА C++Сортировка результатов
#include <algorithm>
#include <iostream>
#include <vector>

int main() {
    std::vector<int> scores{7, 2, 7, 4};
    std::sort(scores.begin(), scores.end());
    for (int score : scores) std::cout << score << ' ';
    std::cout << '\n';
}

Попробуйте: Проверьте пустой вектор и повторяющиеся значения. Измените порядок на обратный.

Что получится

Студент объясняет выбранную структуру данных и проверяет порядок результатов.

Вопрос для самопроверки: Какие тестовые наборы покажут ошибку в сортировке или компараторе?

07Ссылки, память и ресурсыРазбираемся, как безопасно работать с временем жизни объектов.

Короткий разбор

Объекты имеют время жизни, а ресурсы должны освобождаться владельцем. Ссылки и указатели не гарантируют, что объект всё ещё существует; стандартные контейнеры и RAII помогают сократить ручное управление ресурсами.

Что изучаем

  • Ссылки и указатели: смысл и различия
  • Время жизни и владение ресурсом
  • Предпочтение контейнеров и умных указателей ручному управлению
ПРАКТИЧЕСКОЕ ЗАДАНИЕ

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

ПРИМЕР НА C++Изменение контейнера по ссылке
#include <iostream>
#include <vector>

void add_score(std::vector<int>& scores, int value) {
    scores.push_back(value);
}

int main() {
    std::vector<int> scores{3};
    add_score(scores, 5);
    std::cout << "Count: " << scores.size() << '\n';
}

Попробуйте: Объясните, какой объект изменяет функция. Сравните с параметром, переданным по значению.

Что получится

Студент распознаёт опасность обращения к недействительным данным.

Вопрос для самопроверки: Почему нельзя использовать ссылку на объект после окончания его времени жизни?

08Классы и моделированиеПредставляем предметную область через типы и объекты.

Короткий разбор

Класс объединяет состояние и операции, которые поддерживают корректность этого состояния. Конструктор задаёт начальные значения, а интерфейс позволяет использовать объект без знания всех деталей реализации.

Что изучаем

  • Класс, поля, методы и конструктор
  • Инкапсуляция и ответственность объекта
  • Композиция и проектирование простых интерфейсов
ПРАКТИЧЕСКОЕ ЗАДАНИЕ

Создайте типы «Вопрос» и «Викторина», добавьте проверку ответов и подсчёт баллов.

ПРИМЕР НА C++Класс для вопроса
#include <iostream>
#include <string>

class Question {
public:
    Question(std::string text, int answer) : text_(text), answer_(answer) {}
    bool is_correct(int value) const { return value == answer_; }
    const std::string& text() const { return text_; }
private:
    std::string text_;
    int answer_;
};

int main() {
    Question question("How much is 2 + 3?", 5);
    std::cout << question.text() << '\n';
    std::cout << (question.is_correct(5) ? "Correct" : "Try again") << '\n';
}

Попробуйте: Добавьте второй вопрос и проверьте верный и неверный ответы. Какие данные остаются закрытыми?

Что получится

Данные и операции распределены по классам, поведение проверено примерами.

Вопрос для самопроверки: Какие данные и действия принадлежат вопросу, а какие — всей викторине?

09Файлы, отладка и GitСохраняем результат работы и делаем проект воспроизводимым.

Короткий разбор

Работа с файлами может завершиться ошибкой: файла может не быть или у процесса может не оказаться прав. Программа должна проверять открытие и операции чтения/записи, а инструкция — описывать сборку и запуск.

Что изучаем

  • Чтение и запись текстовых файлов
  • Диагностика ошибок, точки останова и проверки
  • История изменений, README и инструкции сборки
ПРАКТИЧЕСКОЕ ЗАДАНИЕ

Сохраните и загрузите результаты программы; опишите запуск и набор тестовых сценариев.

ПРИМЕР НА C++Сохранение результата
#include <fstream>
#include <iostream>

int main() {
    std::ofstream output("result.txt");
    if (!output) {
        std::cerr << "Cannot open the file.\n";
        return 1;
    }
    output << "Score: 30\n";
    if (!output) {
        std::cerr << "Cannot write the result.\n";
        return 1;
    }
    std::cout << "Result saved.\n";
}

Попробуйте: Откройте созданный файл, затем проверьте обработку ошибки при отсутствии доступа к записи.

Что получится

Проект собирается по инструкции и корректно сообщает об ошибке файла.

Вопрос для самопроверки: Что пользователь увидит, если файл результатов недоступен или пуст?

10Данные и основы машинного обученияПонимаем полный путь от исходных данных до оценки модели.

Короткий разбор

Признаки описывают объекты, метки обозначают ожидаемый ответ в задаче с учителем. Качество оценивают на данных, не использованных для настройки модели; одна высокая оценка не объясняет все виды ошибок.

Что изучаем

  • Признаки, метки и постановка задачи
  • Разделение данных на обучение и проверку
  • Ошибки, качество и ограничения модели
ПРАКТИЧЕСКОЕ ЗАДАНИЕ

На небольшом наборе примеров сравните решение по правилам и простую модель; обсудите случаи ошибок.

ПРИМЕР НА C++Простое правило классификации
#include <iostream>

int main() {
    int has_wings = 0;
    std::cout << "Wings? Enter 1 for yes, 0 for no: ";
    if (!(std::cin >> has_wings) || (has_wings != 0 && has_wings != 1)) return 1;
    std::cout << (has_wings == 1 ? "Group A\n" : "Group B\n");
}

Попробуйте: Это правило, заданное человеком, а не обученная модель. Найдите пример, где одного признака недостаточно.

Что получится

Студент объясняет, что проверялось, какие данные использовались и чему нельзя доверять без проверки.

Вопрос для самопроверки: Почему качество на обучающих примерах не гарантирует качество на новых данных?

11Генеративный ИИ и разработкаИспользуем ИИ для объяснения и прототипирования с обязательной проверкой.

Короткий разбор

Генеративная модель предлагает вероятный ответ, поэтому может уверенно ошибаться. Запросу нужны контекст и ограничения, а результату — проверка фактов, самостоятельный анализ, сборка и тестирование кода.

Что изучаем

  • Постановка задачи и контекст
  • Проверка кода, фактов и полученного результата
  • Конфиденциальность и ответственное применение
ПРАКТИЧЕСКОЕ ЗАДАНИЕ

Сравните два предложенных решения задачи на C++, соберите их и проверьте граничные случаи.

ПРИМЕР НА C++Проверка предложенного решения
#include <cassert>
#include <iostream>

bool is_even(int number) {
    return number % 2 == 0;
}

int main() {
    assert(is_even(0));
    assert(is_even(-2));
    assert(!is_even(3));
    std::cout << "Checks passed.\n";
}

Попробуйте: Добавьте свои проверки. Скомпилируйте без определения NDEBUG, чтобы assert выполнялись.

Что получится

Студент может объяснить, исправить и протестировать полученный код.

Вопрос для самопроверки: Какие тесты выявят ошибку в коде, который выглядит правдоподобно?

12Итоговый проект и защитаПроходим путь от идеи до работающего прототипа.

Короткий разбор

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

Что изучаем

  • Требования, этапы и распределение задач
  • Тестирование, ограничения и возможные улучшения
  • Демонстрация и аргументация решений
ПРАКТИЧЕСКОЕ ЗАДАНИЕ

Разработайте приложение на C++ или исследовательский прототип с элементом ИИ; подготовьте README и демонстрацию.

Что получится

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

Вопрос для самопроверки: Как другой человек соберёт проект, проверит его и поймёт известные ограничения?

// первый шаг

Выберите свой первый шаг

Расскажите, что интересно участнику. Мы поможем выбрать подходящую траекторию.

Записаться