Запрос «курсовая по программированию в Бауманке» обычно относится не к отдельному направлению подготовки, а к конкретной дисциплине или проекту внутри IT-программы. Это важно, потому что требования курса могут быть заметно жёстче обычной учебной разработки.
Например, кафедра ИУ7 публикует учебный план, где программирование изучается несколько семестров, а сама кафедра подчёркивает большое количество практических заданий и курсовых проектов.
Официальные страницы:
https://iu7.bmstu.ru/study-plans/
https://iu7.bmstu.ru/
Начните с алгоритмической задачи
Плохо:
«Создание программы на C++».
Сильнее:
«Разработка алгоритма маршрутизации на графе с анализом времени для графов различной плотности».
Язык является средством.
Результат - алгоритм и его поведение.
Техническое задание
Опишите:
- вход;
- выход;
- ограничения;
- ошибки;
- размер данных.
Например:
N до 100000.
Это сразу влияет на выбор структуры данных.
Примеры входа
Подготовьте:
- обычный;
- минимальный;
- максимальный;
- ошибочный.
Не тестируйте только один красивый пример.
Структура данных
Выбор:
- array;
- list;
- hash map;
- tree;
- heap;
- graph
должен следовать из операций.
Не используйте map там, где достаточно массива, только потому что он знаком.
Сложность операций
Составьте таблицу:
| Операция | Структура A | Структура B |
|---|---:|---:|
| поиск | ... | ... |
| вставка | ... | ... |
После этого выбор становится обоснованным.
Алгоритм
До кода запишите идею.
Например:
1. прочитать граф;
2. инициализировать очередь;
3. извлечь вершину;
4. обновить расстояния;
5. повторить.
Так легче найти логическую ошибку.
Инвариант
Для сложного алгоритма полезно сформулировать, что остаётся истинным на каждом шаге.
Это помогает объяснить корректность.
Например:
после извлечения вершины её расстояние является окончательным при условиях алгоритма.
Граничные случаи
Проверяйте:
- пустой ввод;
- один элемент;
- все одинаковые;
- уже отсортировано;
- максимум;
- отрицательные значения, если допустимы.
Большинство учебных ошибок прячется на границах.
Ошибка ввода
Программа должна корректно реагировать на неверный формат.
Не допускайте crash без сообщения, если ТЗ предусматривает пользовательский ввод.
Декомпозиция
Функция на 500 строк трудно тестируется.
Разделите:
- parsing;
- computation;
- output.
Это облегчает unit tests.
Чистая функция
Где возможно, отделите логику от I/O.
Функция:
input -> output
тестируется намного проще, чем функция, которая сама читает файл и печатает.
Имена
Переменная `a1` допустима для короткой формулы, но не для сложной бизнес-логики.
Имя должно помогать читать алгоритм.
Не компенсируйте плохие имена длинными комментариями.
Комментарии
Комментируйте:
- почему;
- ограничение;
- необычный алгоритм.
Не пишите:
`i++ // увеличить i`.
Код и так это показывает.
Ошибки памяти
Для C/C++ особенно следите за:
- lifetime;
- dangling pointer;
- buffer;
- double free.
Используйте sanitizers, если курс позволяет.
RAII
Управление ресурсом через объект уменьшает утечки.
Покажите, где ресурс создаётся и освобождается.
Не делайте ручной `new/delete` без необходимости.
Исключения
Определите, какие ошибки:
- возвращаются;
- обрабатываются;
- приводят к завершению.
Не ловите `...` и не игнорируйте проблему.
Рекурсия
Проверьте:
- базовый случай;
- глубину;
- стек.
Красивое рекурсивное решение может падать на большом N.
Итеративный вариант
Если глубина велика, сравните с итеративным.
Покажите память и время.
Не выбирайте стиль только по компактности кода.
