Menu
Coddy logo textTech

Rimuovere un’attività

Fa parte della sezione Logica e flusso del percorso C++ di Coddy. Lezione 21 di 56.

challenge icon

Sfida

Facile

Estendi il tuo strumento per gli elenchi di attività implementando la funzionalità di rimozione per eliminare attività specifiche dall’elenco. Questa lezione si basa sulla precedente e aggiunge la possibilità di rimuovere le attività in base al loro numero di posizione.

Verranno forniti i seguenti input:

  • Un intero n che rappresenta il numero di attività da aggiungere inizialmente
  • Quindi n stringhe che rappresentano le descrizioni delle attività
  • Un intero taskNumber che rappresenta il numero dell’attività da rimuovere (indicizzazione a partire da 1)

Il tuo programma dovrebbe:

  1. Iniziare con la stessa configurazione della lezione precedente (un std::vector<std::string> vuoto chiamato tasks e il messaggio di benvenuto)
  2. Leggere il numero di attività con cin >> n, quindi chiamare cin.ignore() per scartare il carattere di nuova riga residuo prima di leggere le stringhe delle attività con getline()
  3. Aggiungere la descrizione di ogni attività al vettore usando push_back()
  4. Leggere il numero dell’attività da rimuovere
  5. Verificare che il numero dell’attività sia compreso nell’intervallo valido (da 1 alla dimensione del vettore)
  6. Se il numero dell’attività non è valido, stampare un messaggio di errore
  7. Se il numero dell’attività è valido, usare il metodo .erase() per rimuovere l’attività nella posizione specificata
  8. Stampare un messaggio di conferma che mostri quale attività è stata rimossa
  9. Visualizzare le attività rimanenti in un elenco numerato
  10. Mostrare il numero totale di attività aggiornato

Importante: combinare cin e getline():
Quando leggi un intero con cin >> n, nel buffer di input rimane un carattere di nuova riga ('\n'). Se poi chiami getline(), leggerà immediatamente quel carattere di nuova riga residuo come stringa vuota invece dell’input effettivo. Per risolvere il problema, chiama cin.ignore() subito dopo cin >> n per scartare il carattere di nuova riga residuo:

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

Usa il seguente formato di output esatto:

Per un numero di attività non valido:

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].

Per la rimozione di un’attività valida:

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]

Ricorda che .erase() richiede un iteratore, quindi usa tasks.erase(tasks.begin() + index) dove index è la posizione a partire da 0 (taskNumber - 1). Convalida l’input verificando che taskNumber sia maggiore di 0 e minore o uguale a tasks.size(). Se l’elenco diventa vuoto dopo la rimozione, stampa "No tasks remaining." invece dell’elenco delle attività rimanenti.

Provalo tu

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

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore C++ online