Menu
Coddy logo textTech

Eliminar una tarea

Parte de la sección Lógica y Flujo del Journey de C++ de Coddy — lección 21 de 56.

challenge icon

Desafío

Fácil

Extiende tu herramienta de lista de tareas implementando la funcionalidad de eliminación para borrar tareas específicas de la lista. Esto se basa en la lección anterior al añadir la capacidad de eliminar tareas por su número de posición.

Se proporcionarán las siguientes entradas:

  • Un entero n que representa el número de tareas a añadir inicialmente
  • Luego n cadenas que representan las descripciones de las tareas
  • Un entero taskNumber que representa el número de tarea a eliminar (indexación basada en 1)

Tu programa debe:

  1. Comenzar con la misma configuración de la lección anterior (un std::vector<std::string> vacío llamado tasks y el mensaje de bienvenida)
  2. Leer el número de tareas con cin >> n, luego llamar a cin.ignore() para descartar el salto de línea sobrante antes de leer las cadenas de tareas con getline()
  3. Añadir cada descripción de tarea al vector usando push_back()
  4. Leer el número de tarea a eliminar
  5. Validar que el número de tarea esté dentro del rango válido (1 al tamaño del vector)
  6. Si el número de tarea no es válido, imprimir un mensaje de error
  7. Si el número de tarea es válido, usar el método .erase() para eliminar la tarea en la posición especificada
  8. Imprimir un mensaje de confirmación que muestre qué tarea fue eliminada
  9. Mostrar las tareas restantes en un formato de lista numerada
  10. Mostrar el número total actualizado de tareas

Importante — mezclar cin y getline():
Cuando lees un entero con cin >> n, este deja un carácter de salto de línea ('\n') en el búfer de entrada. Si luego llamas a getline(), este leerá inmediatamente ese salto de línea sobrante como una cadena vacía en lugar de tu entrada real. Para solucionar esto, llama a cin.ignore() justo después de cin >> n para descartar el salto de línea sobrante:

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);
}

Utiliza exactamente el siguiente formato de salida:

Para un número de tarea 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 una eliminación de tarea 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]

Recuerda que .erase() requiere un iterador, así que usa tasks.erase(tasks.begin() + index) donde index es la posición basada en 0 (taskNumber - 1). Valida la entrada comprobando si taskNumber es mayor que 0 y menor o igual a tasks.size(). Si la lista queda vacía después de la eliminación, imprime "No tasks remaining." en lugar de la lista de tareas restantes.

Pruébalo tú mismo

#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 las lecciones de Lógica y Flujo