Removendo uma Tarefa
Parte da seção Lógica & Fluxo do Journey de C++ da Coddy — lição 21 de 56.
Desafio
FácilEstenda sua ferramenta de lista de tarefas implementando a funcionalidade de remoção para excluir tarefas específicas da lista. Isso se baseia na lição anterior, adicionando a capacidade de remover tarefas pelo seu número de posição.
As seguintes entradas serão fornecidas:
- Um número inteiro
nrepresentando o número de tarefas a serem adicionadas inicialmente - Em seguida,
nstrings representando as descrições das tarefas - Um número inteiro
taskNumberrepresentando o número da tarefa a ser removida (indexação baseada em 1)
Seu programa deve:
- Começar com a mesma configuração da lição anterior (um
std::vector<std::string>vazio chamadotaskse a mensagem de boas-vindas) - Ler o número de tarefas com
cin >> n, depois chamarcin.ignore()para descartar a nova linha restante antes de ler as strings de tarefa comgetline() - Adicionar cada descrição de tarefa ao vetor usando
push_back() - Ler o número da tarefa a ser removida
- Validar se o número da tarefa está dentro do intervalo válido (1 até o tamanho do vetor)
- Se o número da tarefa for inválido, imprimir uma mensagem de erro
- Se o número da tarefa for válido, usar o método
.erase()para remover a tarefa na posição especificada - Imprimir uma mensagem de confirmação mostrando qual tarefa foi removida
- Exibir as tarefas restantes em um formato de lista numerada
- Mostrar o número total atualizado de tarefas
Importante — misturando cin e getline():
Quando você lê um número inteiro com cin >> n, ele deixa um caractere de nova linha ('\n') no buffer de entrada. Se você chamar getline() em seguida, ele lerá imediatamente essa nova linha restante como uma string vazia em vez da sua entrada real. Para corrigir isso, chame cin.ignore() logo após cin >> n para descartar a nova linha restante:
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);
}Use o seguinte formato de saída exato:
Para número de tarefa inválido:
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].Para remoção de tarefa válida:
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]Lembre-se que .erase() requer um iterador, então use tasks.erase(tasks.begin() + index) onde index é a posição baseada em 0 (taskNumber - 1). Valide a entrada verificando se taskNumber é maior que 0 e menor ou igual a tasks.size(). Se a lista ficar vazia após a remoção, imprima "No tasks remaining." em vez da lista de tarefas restantes.
Experimente você mesmo
#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;
}Todas as lições de Lógica & Fluxo
1Ponteiros e Memória
O que é um Ponteiro?Operador de EndereçoOperador de DesreferenciaçãoPonteiros NulosPonteiros e ArraysMemória Dinâmica com 'new'Liberando Memória com 'delete'Recapitulação - Prática com Ponteiros2Vetores (Arrays Dinâmicos)
Introdução ao std::vectorCriando um VetorAdicionando ElementosAcessando ElementosTamanho do VetorIterando com um Loop ForLoop For Baseado em IntervaloRemovendo ElementosRecapitulação - Operações com Vetores3Projeto: Ferramenta de Lista de Tarefas
Visão Geral do ProjetoAdicionando uma Tarefa