13. Мини-проект: Менеджер задач

Идея проекта

Менеджер задач (To-Do List) — это программа, которая помогает пользователю управлять своими делами: добавлять задачи, отмечать выполненные и сохранять их в файл.
Этот проект объединяет всё, что вы уже изучили: структуры, циклы, условия, функции, файлы и немного ООП.

Постановка задачи

Программа должна уметь:
  • Добавлять новую задачу.
  • Показывать список всех задач.
  • Отмечать задачу как выполненную.
  • Сохранять и загружать задачи из файла.

Структура программы

Для начала создадим структуру для хранения задач:

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;

struct Task { string title; bool done; };

Функции для работы с задачами

Создадим отдельные функции, чтобы программа была понятнее.

void addTask(vector<Task>& tasks, const string& title) {
    tasks.push_back({title, false});
    cout << "Задача добавлена!" << endl;
}

void showTasks(const vector<Task>& tasks) { cout << "\nСписок задач:\n"; for (size_t i = 0; i < tasks.size(); i++) { cout << i + 1 << ". [" << (tasks[i].done ? 'X' : ' ') << "] " << tasks[i].title << endl; } }

void markDone(vector<Task>& tasks, int index) { if (index < 1 || index > (int)tasks.size()) { cout << "Неверный номер задачи!" << endl; return; } tasks[index - 1].done = true; cout << "Задача выполнена!" << endl; }

Сохранение и загрузка в файл


void saveToFile(const vector<Task>& tasks, const string& filename) {
    ofstream file(filename);
    for (auto& t : tasks) {
        file << t.title << '|' << t.done << '\n';
    }
    file.close();
}

void loadFromFile(vector<Task>& tasks, const string& filename) { ifstream file(filename); if (!file.is_open()) return; tasks.clear(); string line; while (getline(file, line)) { size_t sep = line.find('|'); if (sep != string::npos) { string name = line.substr(0, sep); bool done = (line.substr(sep + 1) == "1"); tasks.push_back({name, done}); } } file.close(); }

Главное меню программы

Теперь соединим всё в одной функции main().

int main() {
    vector<Task> tasks;
    string filename = "tasks.txt";
    loadFromFile(tasks, filename);

int choice; do { cout << "\n=== МЕНЕДЖЕР ЗАДАЧ ===\n"; cout << "1. Добавить задачу\n"; cout << "2. Показать задачи\n"; cout << "3. Отметить как выполненную\n"; cout << "4. Сохранить и выйти\n"; cout << "Выберите действие: "; cin >> choice; cin.ignore();

if (choice == 1) { cout << "Введите название задачи: "; string title; getline(cin, title); addTask(tasks, title); } else if (choice == 2) { showTasks(tasks); } else if (choice == 3) { cout << "Введите номер задачи: "; int num; cin >> num; markDone(tasks, num); } else if (choice == 4) { saveToFile(tasks, filename); cout << "Данные сохранены. До встречи!" << endl; }

} while (choice != 4);

return 0; }

Пример работы программы

=== МЕНЕДЖЕР ЗАДАЧ === 1. Добавить задачу 2. Показать задачи 3. Отметить как выполненную 4. Сохранить и выйти Выберите действие: 1 Введите название задачи: Купить хлеб Задача добавлена!

Выберите действие: 2 Список задач: 1. [ ] Купить хлеб

Добавляем улучшения

Вот как можно сделать программу ещё лучше:
  • Добавить даты или приоритеты для задач.
  • Использовать цветной вывод (через ANSI-коды).
  • Сделать автосохранение после каждого действия.
  • Добавить возможность удалить задачу.

Советы новичкам

  • Разделяйте код на функции — так его легче читать и отлаживать.
  • Не бойтесь использовать STL (например, vector и string) — это мощные инструменты C++.
  • Регулярно сохраняйте данные в файл — чтобы не потерять прогресс.
  • Пробуйте улучшать программу шаг за шагом: от простого к сложному.

Итоги урока

Теперь вы знаете:
  • Как создавать структуры и хранить данные в векторе.
  • Как работать с файлами для сохранения данных.
  • Как реализовать простое меню и взаимодействие с пользователем.
  • Как построить реальный мини-проект на C++!