Menu
Coddy logo textTech

Mettere tutto insieme

Fa parte della sezione Logica e flusso del percorso GO di Coddy. Lezione 25 di 68.

challenge icon

Sfida

Facile

È il momento di completare la tua applicazione per gli elenchi di attività. In quest’ultimo passaggio riunirai tutto ciò che hai imparato nelle lezioni precedenti: la struct Task, addTask, viewAllTasks, completeTask e removeTask, gestite da una sessione di azioni del menu.

Riceverai tre input:

  • Una stringa con il nome dell’applicazione e il nome dell’utente separati da una virgola (ad es., "MyTasks,Alice")
  • Una stringa con le attività iniziali dell’elenco, nel formato "name1:status1,name2:status2", dove lo stato è "true" o "false" (ad es., "Write report:false,Call dentist:true"). Questa riga è vuota se l’elenco iniziale non contiene attività.
  • Una stringa con le azioni della sessione, separate da virgole. Un’azione è composta solo dal suo nome oppure dal suo nome e da un parametro, uniti da | (ad es., "add|Buy groceries,view,complete|2,remove|0,exit"). L’elenco delle azioni termina sempre con "exit".

I nomi delle attività contengono spazi, quindi leggi tutte e tre le righe con bufio.Scanner, come nelle lezioni precedenti.

Il tuo compito è:

  1. Definire la stessa struct Task con i campi Name (string) e Completed (bool)
  2. Ripristinare le quattro funzioni che hai già scritto, con le stesse firme:
    • addTask(tasks []Task, taskName string) []Task
    • viewAllTasks(tasks []Task), che stampa "[x] [task_name]" per un’attività completata e "[ ] [task_name]" per una ancora aperta
    • completeTask(tasks *[]Task, index int)
    • removeTask(tasks []Task, index int) []Task
  3. Creare l’elenco iniziale a partire dal secondo input, ricordando che una riga vuota corrisponde a un elenco vuoto
  4. Stampare il messaggio di benvenuto e il menu, esattamente come nel primo passaggio del progetto:
    • "Welcome to [app_name], [user_name]!"
    • "1. Add Task"
    • "2. View Tasks"
    • "3. Complete Task"
    • "4. Remove Task"
    • "5. Exit"
    • "Current tasks: [count]"
  5. Eseguire le azioni in ordine. Ogni azione stampa prima la propria intestazione:
    • "add": stampare "--- ADD TASK ---", aggiungere l’attività indicata dal parametro, quindi stampare "Task '[task_name]' added!"
    • "view": stampare "--- VIEW TASKS ---", elencare tutte le attività con viewAllTasks, quindi stampare la riga di riepilogo
    • "complete": stampare "--- COMPLETE TASK ---", contrassegnare come completata l’attività all’indice indicato, quindi stampare "Task '[task_name]' marked as completed!"
    • "remove": stampare "--- REMOVE TASK ---", rimuovere l’attività all’indice indicato, quindi stampare "Task '[task_name]' removed successfully!"
    • "exit": stampare "--- EXIT ---", poi "Final list:", quindi l’intero elenco, poi la riga di riepilogo e infine "Goodbye, [user_name]!". Dopo l’uscita non viene eseguito nient’altro.
  6. Gli indici partono da 0, come nelle lezioni precedenti. Se l’indice di un’azione "complete" o "remove" è fuori dall’intervallo dell’elenco, stampa invece "Invalid task number" e lascia invariato l’elenco.
  7. La riga di riepilogo è quella che già conosci: "Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"

Usa il package strings per suddividere le righe di input e il package strconv per convertire un indice in un numero. Quest’ultimo passaggio mostra come le piccole funzioni che hai scritto una alla volta si combinano per formare un programma funzionante.

Provalo tu

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

type Task struct {
	Name      string
	Completed bool
}

// TODO: Ripristina addTask, viewAllTasks, completeTask e removeTask
// dalle lezioni precedenti di questo progetto

func main() {
	// Crea uno scanner per leggere le righe di input
	scanner := bufio.NewScanner(os.Stdin)

	// Leggi il nome dell'applicazione e il nome dell'utente
	scanner.Scan()
	names := scanner.Text()

	// Leggi le attività inizialmente presenti nell'elenco
	scanner.Scan()
	taskData := scanner.Text()

	// Leggi le azioni della sessione
	scanner.Scan()
	actionData := scanner.Text()

	// TODO: Completa l'implementazione
	// 1. Dividi names in corrispondenza di "," per ottenere il nome dell'applicazione e il nome dell'utente
	// 2. Crea lo slice iniziale delle attività a partire da taskData
	// 3. Stampa il messaggio di benvenuto, il menu e il numero attuale di attività
	// 4. Esegui nell'ordine tutte le azioni in actionData, stampando prima l'intestazione di ciascuna
}

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Go online