Курсовая по программированию в МФТИ чаще относится к конкретной дисциплине внутри ПМИ, ИВТ, программной инженерии, физической или инженерной программы, а не к отдельному направлению с названием «Программирование».
В актуальном наборе 2026 года МФТИ есть ПМИ, несколько программ ИВТ и программная инженерия. Поэтому оформление и глубину проекта нужно брать из реального курса.
Официальная страница:
https://pk.mipt.ru/bachelor/2026_rules/
Программа начинается с задачи
Плохо:
«Разработка программы на C++».
Сильнее:
«Реализация структуры данных для динамического множества с анализом времени операций».
Язык вторичен.
Главное:
- задача;
- ограничения;
- корректность;
- производительность.
Specification
Запишите:
- input;
- output;
- ограничения;
- invalid input;
- memory limit;
- time limit.
Не начинайте писать функцию, пока непонятно, что она должна делать на границе.
Контракты
Для функции полезно определить precondition и postcondition.
Например:
входной массив отсортирован.
После:
индекс первого элемента >= x.
Так тесты становятся яснее.
Структура данных
Выбирайте по операциям.
Если нужны быстрый поиск, вставка, минимум и порядок, разные структуры дают разный компромисс.
Не используйте дерево только ради сложности.
Complexity table
Сделайте таблицу:
| Операция | Array | Hash | Tree |
|---|---:|---:|---:|
После этого обоснуйте выбор.
Корректность
Ответьте на вопрос:
почему результат всегда правильный?
Инструменты:
- invariant;
- induction;
- contradiction;
- known theorem.
Тесты не заменяют доказательство для всех входов, если курс требует теорию.
Инвариант
Например, в binary search нужный элемент всегда остаётся внутри текущего интервала.
Покажите состояние до шага, после шага и termination.
Это лучше слов «алгоритм очевиден».
Граничные случаи
Проверьте:
- empty;
- one item;
- max size;
- duplicates;
- negative;
- sorted/reversed.
Ошибка часто живёт не в обычном случае.
Integer overflow
Если n до 10^9, произведение n*n может не поместиться в int.
Выберите тип осознанно.
Не исправляйте overflow после странного runtime.
Floating point
Не сравнивайте double через `==` без понимания задачи.
Для численных расчётов используйте tolerance.
Но tolerance должен быть связан с масштабом.
Memory
Оцените:
- asymptotic;
- peak;
- stack/heap.
Рекурсия на миллион уровней не подходит, даже если код красивый.
Iteration vs recursion
Сравните readability, depth и overhead.
Не делайте рекурсию самоцелью.
Parsing
Отделите чтение от алгоритма.
Так можно benchmark вычисление отдельно от I/O.
Error handling
Ошибка пользователя и внутренняя ошибка должны отличаться.
Например:
- invalid format -> понятное сообщение;
- invariant violation -> fail/test.
Не глотайте exception пустым catch.
Tests
Структура:
- unit;
- boundary;
- randomized;
- regression.
Каждый test должен иметь название по поведению.
Не test1.
Randomized testing
Для алгоритма можно сравнивать с медленным эталоном на тысячах случайных входов.
Например:
optimized vs brute force.
Это сильный способ проверки.
