Удаление задачи
Часть раздела Логика и управление потоком путешествия по C++ на Coddy — урок 21 из 56.
Задание
ЛегкоРасширьте свой инструмент для работы со списком задач, реализовав функциональность удаления определенных задач из списка. Это задание основывается на предыдущем уроке, добавляя возможность удаления задач по их порядковому номеру.
Будут предоставлены следующие входные данные:
- Целое число
n, представляющее количество задач, которые нужно добавить изначально - Затем
nстрок, представляющих описания задач - Целое число
taskNumber, представляющее номер задачи для удаления (индексация начинается с 1)
Ваша программа должна:
- Начаться с той же настройки из предыдущего урока (пустой
std::vector<std::string>с именемtasksи приветственное сообщение) - Считать количество задач с помощью
cin >> n, затем вызватьcin.ignore(), чтобы отбросить оставшийся символ новой строки перед чтением строк задач с помощьюgetline() - Добавить каждое описание задачи в вектор, используя
push_back() - Считать номер задачи для удаления
- Проверить, находится ли номер задачи в допустимом диапазоне (от 1 до размера вектора)
- Если номер задачи неверный, вывести сообщение об ошибке
- Если номер задачи верный, использовать метод
.erase()для удаления задачи в указанной позиции - Вывести подтверждающее сообщение, показывающее, какая задача была удалена
- Отобразить оставшиеся задачи в формате нумерованного списка
- Показать обновленное общее количество задач
Важно — смешивание 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;
}Все уроки раздела Логика и управление потоком
1Указатели и память
Что такое указатель?Оператор взятия адресаОператор разыменованияНулевые указателиУказатели и массивыДинамическая память и 'new'Освобождение памяти и 'delete'Итоги: Практика с указателями2Векторы (динамические массивы)
Знакомство с std::vectorСоздание вектораДобавление элементовДоступ к элементамРазмер вектораИтерация с помощью цикла ForRange-based цикл ForУдаление элементовИтоги: операции с векторами5Проект: Инструмент инвентаризации
Настройка проектаДобавление и обновление товаров3Проект: Список задач
Обзор проектаДобавление задачи