Menu
Coddy logo textTech

Удаление задачи

Часть раздела Логика и управление потоком путешествия по C++ на Coddy — урок 21 из 56.

challenge icon

Задание

Легко

Расширьте свой инструмент для работы со списком задач, реализовав функциональность удаления определенных задач из списка. Это задание основывается на предыдущем уроке, добавляя возможность удаления задач по их порядковому номеру.

Будут предоставлены следующие входные данные:

  • Целое число n, представляющее количество задач, которые нужно добавить изначально
  • Затем n строк, представляющих описания задач
  • Целое число taskNumber, представляющее номер задачи для удаления (индексация начинается с 1)

Ваша программа должна:

  1. Начаться с той же настройки из предыдущего урока (пустой std::vector<std::string> с именем tasks и приветственное сообщение)
  2. Считать количество задач с помощью cin >> n, затем вызвать cin.ignore(), чтобы отбросить оставшийся символ новой строки перед чтением строк задач с помощью getline()
  3. Добавить каждое описание задачи в вектор, используя push_back()
  4. Считать номер задачи для удаления
  5. Проверить, находится ли номер задачи в допустимом диапазоне (от 1 до размера вектора)
  6. Если номер задачи неверный, вывести сообщение об ошибке
  7. Если номер задачи верный, использовать метод .erase() для удаления задачи в указанной позиции
  8. Вывести подтверждающее сообщение, показывающее, какая задача была удалена
  9. Отобразить оставшиеся задачи в формате нумерованного списка
  10. Показать обновленное общее количество задач

Важно — смешивание cin и getline():
Когда вы считываете целое число с помощью cin >> n, оно оставляет символ новой строки ('\n') в буфере ввода. Если вы затем вызовете getline(), он немедленно прочитает этот оставшийся символ новой строки как пустую строку вместо вашего фактического ввода. Чтобы исправить это, вызовите cin.ignore() сразу после cin >> n, чтобы отбросить оставшийся символ новой строки:

cin >> n;
cin.ignore(); // discard the leftover newline
for (int i = 0; i < n; i++) {
    string task;
    getline(cin, task); // now reads correctly
    tasks.push_back(task);
}

Используйте следующий точный формат вывода:

Для неверного номера задачи:

Welcome to Task List Tool!

Menu Options:
1. Add Task
2. View Tasks
3. Quit

Task list system initialized and ready!
Error: Invalid task number. Please enter a number between 1 and [total tasks].

Для успешного удаления задачи:

Welcome to Task List Tool!

Menu Options:
1. Add Task
2. View Tasks
3. Quit

Task list system initialized and ready!
Task "[removed task description]" removed successfully!
Remaining Tasks:
1. [first remaining task]
2. [second remaining task]
...
Total tasks: [updated number of tasks]

Помните, что .erase() требует итератор, поэтому используйте tasks.erase(tasks.begin() + index), где index — это позиция с отсчетом от 0 (taskNumber - 1). Проверьте ввод, убедившись, что taskNumber больше 0 и меньше или равен tasks.size(). Если после удаления список становится пустым, выведите "No tasks remaining." вместо списка оставшихся задач.

Попробуйте сами

#include <iostream>
#include <vector>
#include <string>

int main() {
    std::vector<std::string> tasks;
    
    std::cout << "Welcome to Task List Tool!" << std::endl;
    std::cout << std::endl;
    std::cout << "Menu Options:" << std::endl;
    std::cout << "1. Add Task" << std::endl;
    std::cout << "2. View Tasks" << std::endl;
    std::cout << "3. Quit" << std::endl;
    std::cout << std::endl;
    std::cout << "Task list system initialized and ready!" << std::endl;
    
    int n;
    std::cin >> n;
    
    for (int i = 0; i < n; i++) {
        std::string task;
        std::cin >> task;
        tasks.push_back(task);
    }
    
    if (tasks.empty()) {
        std::cout << "No tasks available." << std::endl;
    } else {
        std::cout << "Your Tasks:" << std::endl;
        for (int i = 0; i < tasks.size(); i++) {
            std::cout << (i + 1) << ". " << tasks[i] << std::endl;
        }
        std::cout << "Total tasks: " << tasks.size() << std::endl;
    }
    
    return 0;
}

Все уроки раздела Логика и управление потоком