Курс — «Программирование на C для начинающих». Проекты и практические задания. #38 Проект 2: Управление списком задач
Здравствуйте, дорогие друзья.
В этом разделе мы создадим простую программу для управления списком задач на языке C. Этот проект поможет вам закрепить знания о работе с массивами, структурами, функциями и файловым вводом-выводом. Программа будет позволять пользователю добавлять, удалять, просматривать и сохранять задачи.
Описание проекта
Цель проекта — создать консольное приложение, которое позволяет пользователю управлять списком задач. Программа должна поддерживать следующие функции:
- Добавление новой задачи.
- Удаление задачи по номеру.
- Просмотр всех задач.
- Сохранение списка задач в файл.
- Загрузка списка задач из файла.
Требования
- Программа должна поддерживать основные операции управления списком задач.
- Программа должна запрашивать у пользователя действия через консоль.
- Программа должна сохранять и загружать список задач в файл.
- Программа должна обрабатывать ошибки, такие как некорректный ввод и отсутствие файла.
Реализация проекта
Рассмотрим пошаговую реализацию программы для управления списком задач.
- Создание структуры для хранения задачи:
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <stdio.h> #include <string.h> #define MAX_TASKS 100 #define MAX_TASK_LENGTH 256 typedef struct { char description[MAX_TASK_LENGTH]; } Task; Task tasks[MAX_TASKS]; int task_count = 0; |
2. Функции для управления списком задач:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
void add_task() { if (task_count >= MAX_TASKS) { printf("Error: Maximum number of tasks reached\n"); return; } printf("Enter task description: "); fgets(tasks[task_count].description, MAX_TASK_LENGTH, stdin); // Удаляем символ новой строки, если он присутствует size_t len = strlen(tasks[task_count].description); if (len > 0 && tasks[task_count].description[len - 1] == '\n') { tasks[task_count].description[len - 1] = '\0'; } task_count++; printf("Task added successfully\n"); } void delete_task() { int index; printf("Enter task number to delete: "); scanf("%d", &index); getchar(); // Считываем символ новой строки if (index < 1 || index > task_count) { printf("Error: Invalid task number\n"); return; } for (int i = index - 1; i < task_count - 1; i++) { strcpy(tasks[i].description, tasks[i + 1].description); } task_count--; printf("Task deleted successfully\n"); } void view_tasks() { if (task_count == 0) { printf("No tasks available\n"); return; } for (int i = 0; i < task_count; i++) { printf("%d. %s\n", i + 1, tasks[i].description); } } |
3. Функции для сохранения и загрузки списка задач:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
void save_tasks() { FILE *file = fopen("tasks.txt", "w"); if (file == NULL) { printf("Error: Unable to open file for writing\n"); return; } for (int i = 0; i < task_count; i++) { fprintf(file, "%s\n", tasks[i].description); } fclose(file); printf("Tasks saved successfully\n"); } void load_tasks() { FILE *file = fopen("tasks.txt", "r"); if (file == NULL) { printf("Error: Unable to open file for reading\n"); return; } task_count = 0; while (fgets(tasks[task_count].description, MAX_TASK_LENGTH, file) != NULL) { // Удаляем символ новой строки, если он присутствует size_t len = strlen(tasks[task_count].description); if (len > 0 && tasks[task_count].description[len - 1] == '\n') { tasks[task_count].description[len - 1] = '\0'; } task_count++; if (task_count >= MAX_TASKS) { break; } } fclose(file); printf("Tasks loaded successfully\n"); } |
4. Основная функция программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
int main() { int choice; do { printf("\nTask Manager\n"); printf("1. Add task\n"); printf("2. Delete task\n"); printf("3. View tasks\n"); printf("4. Save tasks\n"); printf("5. Load tasks\n"); printf("0. Exit\n"); printf("Enter your choice: "); scanf("%d", &choice); getchar(); // Считываем символ новой строки switch (choice) { case 1: add_task(); break; case 2: delete_task(); break; case 3: view_tasks(); break; case 4: save_tasks(); break; case 5: load_tasks(); break; case 0: printf("Exiting...\n"); break; default: printf("Error: Invalid choice\n"); } } while (choice != 0); return 0; } |
Тестирование программы
После завершения написания программы важно протестировать её на различных входных данных, чтобы убедиться, что она работает корректно.
Примеры тестов:
- Добавление задачи:
Add task -> Enter task description -> View tasks
- Удаление задачи:
Add task -> Enter task description -> Delete task -> Enter task number -> View tasks
- Сохранение задач:
Add task -> Enter task description -> Save tasks -> Exit -> Restart program -> Load tasks -> View tasks
- Загрузка задач:
Save tasks -> Exit -> Restart program -> Load tasks -> View tasks
- Обработка ошибок:
Delete task -> Enter invalid task number -> Add task -> Enter task description -> Delete task -> Enter valid task number
Создание программы для управления списком задач — это отличный способ закрепить знания о работе с массивами, структурами, функциями и файловым вводом-выводом в языке C. Этот проект помогает понять, как работать с данными и управлять ими в программе. Вы можете расширить этот проект, добавив поддержку дополнительных функций, таких как редактирование задач, сортировка задач по приоритету и другие полезные функции. Практика в написании таких проектов поможет вам стать более уверенным и опытным программистом на языке C.
На этом все. Всем хорошего дня!