Removendo uma Tarefa
Parte da seção Lógica & Fluxo do Journey de C++ da Coddy. Lição 21 de 56.
Desafio
FácilAmplie sua ferramenta de lista de tarefas implementando a funcionalidade de remoção para excluir tarefas específicas da lista. Isso dá continuidade à lição anterior, adicionando a capacidade de remover tarefas pelo número de posição.
As seguintes entradas serão fornecidas:
- Um inteiro
nrepresentando o número de tarefas a serem adicionadas inicialmente - Em seguida,
nstrings representando as descrições das tarefas - Um 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 uma mensagem de boas-vindas) - Ler o número de tarefas com
cin >> ne, em seguida, chamarcin.ignore()para descartar a quebra de linha restante antes de ler as strings das tarefas 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, exibir 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 - Exibir uma mensagem de confirmação mostrando qual tarefa foi removida
- Exibir as tarefas restantes em um formato de lista numerada
- Exibir o número total atualizado de tarefas
Importante: combinando cin e getline():
Quando você lê um inteiro com cin >> n, ele deixa um caractere de quebra de linha ('\n') no buffer de entrada. Se você chamar getline() em seguida, ela lerá imediatamente essa quebra de 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 quebra de 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 exato de saída:
Para um 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 uma 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 de que .erase() exige um iterador, portanto use tasks.erase(tasks.begin() + index), em que 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, exiba "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 TarefaPratique por conta própria: Compilador de C++ online