Menu
Coddy logo textTech

Completare un’attività

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

challenge icon

Sfida

Facile

In questa parte del tuo sistema di gestione delle attività, implementerai la possibilità di contrassegnare le attività come completate. Questa sfida si concentra sull’uso dei metodi con receiver puntatore per modificare i dati originali delle attività, mostrando come i puntatori ti permettano di aggiornare in modo permanente i campi di una struct.

Nota importante: Poiché i nomi delle attività possono contenere spazi (come "Buy groceries"), dovrai usare bufio.Scanner per leggere intere righe di input. La funzione fmt.Scanf smette di leggere al primo spazio, il che causerebbe problemi con i nomi delle attività contenenti spazi. Usa bufio.NewScanner(os.Stdin) e chiama scanner.Scan() seguito da scanner.Text() per leggere le righe complete.

Riceverai tre input:

  • Una stringa che rappresenta il numero di attività (ad esempio, "4")
  • Una stringa contenente i dati delle attività nel formato: "name1:status1,name2:status2,name3:status3", dove lo stato è "true" oppure "false" (ad esempio, "Buy groceries:false,Call dentist:true,Finish project:false,Review code:false")
  • Una stringa che rappresenta l’indice dell’attività da completare (ad esempio, "2" per la terza attività, usando l’indicizzazione a partire da 0)

Il tuo compito è:

  1. Definire la stessa struct Task delle sfide precedenti, con i campi Name (string) e Completed (bool)
  2. Creare una funzione chiamata completeTask che accetta come parametri un puntatore a una slice di struct Task e un indice (int)
  3. All’interno della funzione completeTask, modificare il campo Completed dell’attività all’indice specificato impostandolo a true
  4. Usare bufio.Scanner per leggere correttamente le righe di input:
    • Creare uno scanner: scanner := bufio.NewScanner(os.Stdin)
    • Per ogni riga di input: chiamare scanner.Scan() e poi scanner.Text()
    • In questo modo i nomi delle attività contenenti spazi vengono letti correttamente
  5. Analizzare i dati delle attività dal secondo input per creare la slice di attività:
    • Suddividere l’input usando le virgole per ottenere le singole voci delle attività
    • Per ogni voce, suddividerla usando i due punti per separare il nome dallo stato
    • Convertire la stringa dello stato in un booleano ("true" diventa true, "false" diventa false)
  6. Convertire la stringa del terzo input in un intero per ottenere l’indice dell’attività
  7. Chiamare la funzione completeTask con un puntatore alla tua slice e l’indice
  8. Dopo aver completato l’attività, mostrare tutte le attività usando lo stesso formato della sfida precedente:
    • Per le attività completate: "[x] [task_name]"
    • Per le attività non completate: "[ ] [task_name]"
  9. Stampare un messaggio di conferma: "Task '[task_name]' marked as completed!"
  10. Stampare il riepilogo aggiornato: "Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"

Usa il package strconv per convertire la stringa dell’indice in un intero. Questa sfida mostra come i receiver puntatore ti permettano di modificare la struttura dati originale, apportando modifiche permanenti alla tua lista di attività che persistono dopo la restituzione della funzione.

Provalo tu

package main

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

type Task struct {
	Name      string
	Completed bool
}

func viewAllTasks(tasks []Task) {
	for _, task := range tasks {
		if task.Completed {
			fmt.Printf("[x] %s\n", task.Name)
		} else {
			fmt.Printf("[ ] %s\n", task.Name)
		}
	}
}

func main() {
	var numTasksStr string
	fmt.Scanln(&numTasksStr)
	numTasks, _ := strconv.Atoi(numTasksStr)

	scanner := bufio.NewScanner(os.Stdin)
	scanner.Scan()
	taskData := scanner.Text()

	var tasks []Task
	taskEntries := strings.Split(taskData, ",")

	for _, entry := range taskEntries {
		parts := strings.Split(entry, ":")
		if len(parts) >= 2 {
			name := parts[0]
			completed, _ := strconv.ParseBool(parts[1])
			task := Task{
				Name:      name,
				Completed: completed,
			}
			tasks = append(tasks, task)
		}
	}

	viewAllTasks(tasks)

	completedCount := 0
	for _, task := range tasks {
		if task.Completed {
			completedCount++
		}
	}

	incompleteCount := numTasks - completedCount
	fmt.Printf("Total: %d tasks (%d completed, %d remaining)\n", numTasks, completedCount, incompleteCount)
}

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Go online