Итоговый проект: консольный менеджер задач
Цель
Создай консольный менеджер задач. Пользователь должен уметь добавлять задачу, показывать список, отмечать задачу выполненной и сохранять список в файл.
Модель данных
struct Task { std::string title; bool completed = false;};Храни задачи в std::vector<Task>. Для добавления используй push_back, для обхода — range-based for, а для изменения состояния выбирай задачу по индексу после проверки границ.
Раздели ответственность
Рекомендуемый набор функций:
PrintMenu()— выводит команды.AddTask(std::vector<Task>& tasks)— добавляет задачу.ListTasks(const std::vector<Task>& tasks)— показывает список.CompleteTask(std::vector<Task>& tasks, std::size_t index)— отмечает задачу выполненной.LoadTasks(...)иSaveTasks(...)— чтение и запись файла.
Передавай контейнер по ссылке, когда функция должна его изменить, и по const-ссылке, когда она только читает данные.
Главный цикл
Используй цикл while для меню. Через switch выбирай команду, а через if проверяй границы и корректность введённых значений. Обрабатывай конец ввода и ошибки потока, чтобы программа не застревала в бесконечном цикле.
Формат сохранения
Для учебного проекта можно сохранять по одной задаче на строку, но нужно продумать обработку символов новой строки внутри названия и формат поля completed. Для более надёжного варианта используй явный формат данных с экранированием или готовую библиотеку формата.
Не считывай произвольный бинарный дамп объекта Task: строка содержит внутреннее управление памятью и не может безопасно сохраняться простым копированием байтов.
Проверочный список
- Можно добавить несколько задач.
- Пустой список отображается корректно.
- Неверный индекс не приводит к выходу за границы.
- Файл может отсутствовать при первом запуске.
- Ошибки чтения и записи не игнорируются.
- После перезапуска задачи восстанавливаются.
Что улучшить дальше
Добавь удаление задач, фильтр по выполненным, поиск по названию, сортировку и модульные тесты. Затем вынеси реализацию из main.cpp в отдельные заголовочные и исходные файлы и собери проект через CMake.
Итог
Итоговый проект объединяет базовый синтаксис с практикой проектирования. Главное — не писать всё в одной функции: разделяй ввод, бизнес-логику и работу с файлами.
