ПРОГРАММА КУРСОВ / C++ И ИСКУССТВЕННЫЙ ИНТЕЛЛЕКТ
От первой строки
до своего проекта.
Одна платформа, две траектории. Выберите категорию и раскройте модуль, чтобы увидеть темы, практику и результат.
Материалы и задачи адаптируются к возрасту и подготовке группы.
Начальный маршрут / 4–8 классы
Программа по шагам
От понятных алгоритмов до собственной программы и первого знакомства с ИИ.
01Старт в программированииЗнакомимся с задачей, алгоритмом и инструментами разработчика.
Короткий разбор
Алгоритм — это последовательность действий для решения задачи. Исходный файл содержит текст программы; компилятор переводит его в исполняемый файл. После запуска программа выполняет инструкции из функции main.
Что изучаем
- Как разбить задачу на понятные шаги
- Редактор, исходный файл, компилятор и запуск программы
- Сообщение об ошибке: как найти строку и исправить её
Соберите и запустите программу, которая приветствует пользователя. Измените текст и объясните, что делает каждая строка.
#include <iostream>
int main() {
std::cout << "Hello, C++!\n";
return 0;
}Попробуйте: Измените сообщение и снова соберите программу. Что произойдёт, если пропустить точку с запятой?
Ученик самостоятельно запускает программу и исправляет простую ошибку.
Вопрос для самопроверки: Что произойдёт, если изменить текст сообщения, но не собрать программу заново?
02Переменные и ввод данныхУчимся хранить значения и получать ответы пользователя.
Короткий разбор
Переменная связывает имя с хранимым значением. Тип подсказывает, какие значения и операции допустимы: целые числа отличаются от дробных, а текст хранится в строке. Ввод даёт программе данные для работы.
Что изучаем
- Целые и дробные числа, символы и логические значения
- Имена переменных и присваивание
- Ввод через cin и вывод через cout
Напишите программу, которая спрашивает имя и число, затем выводит персональное сообщение и результат вычисления.
#include <iostream>
int main() {
int tasks = 0;
std::cout << "Tasks completed: ";
std::cin >> tasks;
std::cout << "Points: " << tasks * 5 << '\n';
}Попробуйте: Введите целое число 0, затем 3. Позже вы добавите проверку неверного ввода.
Ученик различает типы значений и проверяет результат на нескольких примерах.
Вопрос для самопроверки: Какой тип подойдёт для количества попыток, а какой — для имени участника?
03Условия и решенияДобавляем в программу выбор по заданным правилам.
Короткий разбор
Условие проверяет выражение и выбирает подходящую ветвь. Сравнение показывает, выполняется ли правило; важно продумать, что произойдёт, если оно не выполняется.
Что изучаем
- Сравнения и логические выражения
- Ветвления if и else
- Проверка граничных значений
Создайте викторину из трёх вопросов с подсчётом правильных ответов.
#include <iostream>
int main() {
int score = 0;
if (!(std::cin >> score)) return 1;
if (score >= 3) {
std::cout << "Goal reached!\n";
} else {
std::cout << "Keep practicing.\n";
}
}Попробуйте: Проверьте значения 2, 3 и 4. Добавьте отдельное сообщение для нуля.
Программа по-разному реагирует на правильный и неправильный ответ.
Вопрос для самопроверки: Какие варианты ответа должна проверить викторина, включая неожиданное значение?
04Циклы и повторениеИзучаем повторяющиеся действия и безопасную остановку программы.
Короткий разбор
Цикл повторяет действие, пока выполняется условие, либо заданное число раз. Счётчик помогает понимать, сколько шагов уже сделано. Условие остановки защищает от бесконечного повторения.
Что изучаем
- Циклы for и while
- Счётчик, накопление суммы и условие завершения
- Типичные ошибки при повторении
Сделайте игру «Угадай число» с ограниченным количеством попыток и подсказками.
#include <iostream>
int main() {
int total = 0;
for (int number = 1; number <= 5; ++number) {
total += number;
}
std::cout << "Total: " << total << '\n';
}Попробуйте: До запуска вычислите результат вручную. Измените верхнюю границу и сравните ответы.
Ученик объясняет, когда цикл продолжится и когда завершится.
Вопрос для самопроверки: Как изменится количество попыток после каждого хода и когда игра остановится?
05Массивы и строкиХраним несколько значений и работаем с текстом.
Короткий разбор
Массив позволяет хранить несколько значений одного типа. Доступ к элементу выполняется по индексу, начинающемуся с нуля; обращаться можно только к существующим элементам. Строка удобна для работы с текстом.
Что изучаем
- Индекс и границы массива
- Перебор элементов
- Строки и простая обработка пользовательского ввода
Составьте список результатов викторины и найдите лучший результат.
#include <iostream>
int main() {
int scores[] = {4, 7, 5};
int best = scores[0];
for (int score : scores) {
if (score > best) best = score;
}
std::cout << "Best: " << best << '\n';
}Попробуйте: Замените значения и проверьте случай одинаковых результатов. Почему здесь можно обратиться к scores[0]?
Программа обрабатывает набор данных без выхода за границы.
Вопрос для самопроверки: Как найти максимальный результат и что делать, если результатов ещё нет?
06Функции и разбиение задачиВыделяем небольшие понятные части программы.
Короткий разбор
Функция получает входные данные через параметры, выполняет отдельную задачу и при необходимости возвращает результат. Так один и тот же понятный блок можно вызвать несколько раз.
Что изучаем
- Определение и вызов функции
- Параметры и возвращаемое значение
- Названия, которые объясняют назначение кода
Вынесите проверку ответа и подсчёт результата викторины в отдельные функции.
#include <iostream>
int points_for(int correct) {
return correct * 10;
}
int main() {
std::cout << "Points: " << points_for(3) << '\n';
}Попробуйте: Вызовите функцию для разных значений. Добавьте функцию, которая проверяет допустимое число ответов.
Ученик может вызвать функцию с разными входными данными.
Вопрос для самопроверки: Какие данные нужны функции проверки ответа и что она должна вернуть?
07Мини-игра на C++Соединяем ввод, условия, циклы и функции в одном проекте.
Короткий разбор
Состояние игры описывает, что происходит сейчас: ожидание хода, подсчёт очков или завершение. Сначала полезно составить правила на бумаге, а затем проверить каждое возможное действие игрока.
Что изучаем
- Правила и состояния игры
- Обработка ошибок ввода
- Проверка сценариев победы и завершения
Создайте текстовую игру с меню, очками и несколькими ходами.
#include <iostream>
int main() {
const int secret = 7;
for (int attempt = 1; attempt <= 3; ++attempt) {
int guess = 0;
std::cout << "Your guess: ";
if (!(std::cin >> guess)) return 1;
if (guess == secret) {
std::cout << "You won!\n";
return 0;
}
if (guess < secret) {
std::cout << "Higher\n";
} else {
std::cout << "Lower\n";
}
}
std::cout << "No attempts left.\n";
}Попробуйте: Проверьте победу и проигрыш. Затем добавьте возможность повторной игры.
Игру можно пройти от начала до конца; правила понятны другому человеку.
Вопрос для самопроверки: Как игра отреагирует на неверный пункт меню и сможет ли участник начать заново?
08Знакомство с искусственным интеллектомИсследуем, как примеры и правила помогают классифицировать данные.
Короткий разбор
Признак — наблюдаемое свойство объекта, а категория — группа, к которой его относят. Правила могут давать ошибку, если примеров мало или признаки подходят сразу нескольким категориям.
Что изучаем
- Чем данные, правило и модель отличаются друг от друга
- Почему результат ИИ может ошибаться
- Не передавать личные данные и проверять ответы
Составьте небольшую таблицу признаков и придумайте правила, по которым программа предложит категорию объекта.
#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");
}Попробуйте: Это правило, заданное человеком, а не обученная модель. Найдите пример, где одного признака недостаточно.
Ученик приводит пример ошибки классификации и объясняет, как её проверить.
Вопрос для самопроверки: Какой пример нарушает придуманное вами правило и почему?
09ИИ как помощник разработчикаУчимся задавать вопросы, проверять подсказки и объяснять собственный код.
Короткий разбор
ИИ может предложить объяснение или вариант кода, но ответ нужно проверять. Хороший вопрос содержит описание задачи и ошибки; имена, телефоны, пароли и другие личные данные в запрос добавлять не нужно.
Что изучаем
- Как сформулировать задачу и ограничение
- Почему нельзя принимать ответ без проверки
- Проверка кода на простых и граничных примерах
Попросите объяснить ошибку в короткой программе, предложите исправление и проверьте его запуском с преподавателем.
#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 выполнялись.
Ученик объясняет исправление своими словами и показывает проверку.
Вопрос для самопроверки: Как убедиться, что предложенное исправление помогает и не ломает другие примеры?
10Итоговый проектСобираем собственную программу и готовим короткую презентацию.
Короткий разбор
Проект начинается с понятного результата для пользователя. План разделяют на небольшие этапы, после каждого проверяют работу; перед показом составляют инструкцию и проверяют программу на нескольких сценариях.
Что изучаем
- Идея, пользователь и правила работы
- Разработка небольшими шагами
- Тестирование и демонстрация результата
Выберите игру, викторину или помощника с простыми правилами; добавьте инструкцию и покажите три тестовых сценария.
Есть работающий код, понятная инструкция и демонстрация результата.
Вопрос для самопроверки: Кто будет пользоваться программой, какие действия он сможет выполнить и как проверить результат?
Углублённый маршрут / 9 класс и старше
Программа по шагам
От основ языка до структур данных, работы с файлами и проектирования решений с элементами ИИ.
01Среда разработки и первая программаВыстраиваем рабочий цикл от исходного файла до исполняемой программы.
Короткий разбор
Исходный код проходит сборку перед выполнением. Ошибки синтаксиса выявляются компилятором, а ошибки логики могут проявиться только на конкретных входных данных. Предупреждения сборки помогают заметить потенциальные проблемы заранее.
Что изучаем
- Редактор, компилятор и диагностика ошибок
- Структура программы, main, заголовки
- Сборка и запуск; базовые предупреждения компилятора
Соберите консольное приложение, измените параметры запуска и исправьте намеренно внесённую синтаксическую ошибку.
#include <iostream>
int main() {
std::cout << "Hello, C++!\n";
return 0;
}Попробуйте: Измените сообщение и снова соберите программу. Что произойдёт, если пропустить точку с запятой?
Студент объясняет разницу между исходным кодом, компиляцией и выполнением.
Вопрос для самопроверки: Чем ошибка компиляции отличается от ошибки логики?
02Типы, выражения и вводСтроим корректные вычисления и проверяем пользовательские данные.
Короткий разбор
Тип определяет представление данных и допустимые операции. Неявные преобразования и целочисленное деление могут дать неожиданный результат, поэтому входные данные и границы значений нужно проверять.
Что изучаем
- Типы, константы и преобразования
- Арифметические и логические выражения
- Консольный ввод, вывод и обработка ошибок
Напишите калькулятор с проверкой допустимых значений и деления на ноль.
#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 и вложенные циклы
- Границы, инварианты и оценка числа операций
Реализуйте игру с меню и подсчётом статистики; сравните два способа поиска значения.
#include <iostream>
int main() {
int total = 0;
for (int number = 1; number <= 5; ++number) {
total += number;
}
std::cout << "Total: " << total << '\n';
}Попробуйте: До запуска вычислите результат вручную. Измените верхнюю границу и сравните ответы.
Студент объясняет ход алгоритма и проверяет условия остановки.
Вопрос для самопроверки: Как алгоритм поведёт себя на пустом наборе, одном элементе и повторяющихся значениях?
04Функции и структура программыОрганизуем программу в небольшие проверяемые части.
Короткий разбор
Функция задаёт контракт: какие данные принимает и какой результат возвращает. Передача по значению создаёт отдельный параметр, а ссылка позволяет обращаться к существующему объекту в соответствии с выбранной сигнатурой.
Что изучаем
- Сигнатура, параметры, return и область видимости
- Передача по значению и по ссылке
- Разделение кода на файлы и повторное использование
Разделите калькулятор на функции чтения, вычисления и отображения; составьте набор проверок для каждой операции.
#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, перебор и изменение элементов
Создайте журнал результатов: добавление, поиск, среднее значение и вывод списка.
#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.
#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 помогают сократить ручное управление ресурсами.
Что изучаем
- Ссылки и указатели: смысл и различия
- Время жизни и владение ресурсом
- Предпочтение контейнеров и умных указателей ручному управлению
Проследите время жизни объектов и перепишите пример хранения данных с использованием контейнера.
#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Классы и моделированиеПредставляем предметную область через типы и объекты.
Короткий разбор
Класс объединяет состояние и операции, которые поддерживают корректность этого состояния. Конструктор задаёт начальные значения, а интерфейс позволяет использовать объект без знания всех деталей реализации.
Что изучаем
- Класс, поля, методы и конструктор
- Инкапсуляция и ответственность объекта
- Композиция и проектирование простых интерфейсов
Создайте типы «Вопрос» и «Викторина», добавьте проверку ответов и подсчёт баллов.
#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 и инструкции сборки
Сохраните и загрузите результаты программы; опишите запуск и набор тестовых сценариев.
#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Данные и основы машинного обученияПонимаем полный путь от исходных данных до оценки модели.
Короткий разбор
Признаки описывают объекты, метки обозначают ожидаемый ответ в задаче с учителем. Качество оценивают на данных, не использованных для настройки модели; одна высокая оценка не объясняет все виды ошибок.
Что изучаем
- Признаки, метки и постановка задачи
- Разделение данных на обучение и проверку
- Ошибки, качество и ограничения модели
На небольшом наборе примеров сравните решение по правилам и простую модель; обсудите случаи ошибок.
#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++, соберите их и проверьте граничные случаи.
#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 и демонстрацию.
Представлены исходный код, инструкция запуска, тестовые сценарии и объяснение результата.
Вопрос для самопроверки: Как другой человек соберёт проект, проверит его и поймёт известные ограничения?
Выберите свой первый шаг
Расскажите, что интересно участнику. Мы поможем выбрать подходящую траекторию.