Удаление задачи
Часть раздела Логика и управление потоком путешествия по 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Проект: Список задач
Обзор проектаДобавление задачиПотренируйтесь самостоятельно: Онлайн-компилятор C++