Menu
Coddy logo textTech

Terminer une tâche

Fait partie de la section Logique & Flux du Journey GO de Coddy. Leçon 23 sur 68.

challenge icon

Défi

Facile

Dans cette partie de votre système de gestion des tâches, vous allez implémenter la possibilité de marquer les tâches comme terminées. Ce défi se concentre sur l’utilisation de récepteurs pointeurs pour modifier les données de la tâche d’origine, en montrant comment les pointeurs vous permettent de mettre à jour définitivement les champs d’une structure.

Remarque importante : Comme les noms des tâches peuvent contenir des espaces (comme "Buy groceries"), vous devrez utiliser bufio.Scanner pour lire des lignes d’entrée entières. La fonction fmt.Scanf arrête la lecture au premier espace, ce qui empêcherait de lire correctement les noms de tâches contenant des espaces. Utilisez bufio.NewScanner(os.Stdin) et appelez scanner.Scan(), puis scanner.Text() pour lire des lignes complètes.

Vous recevrez trois entrées :

  • Une chaîne représentant le nombre de tâches (par exemple, "4")
  • Une chaîne contenant les données des tâches au format : "name1:status1,name2:status2,name3:status3", où le statut est soit "true", soit "false" (par exemple, "Buy groceries:false,Call dentist:true,Finish project:false,Review code:false")
  • Une chaîne représentant l’index de la tâche à terminer (par exemple, "2" pour la troisième tâche, avec un indexage commençant à 0)

Votre tâche consiste à :

  1. Définir la même structure Task que dans les défis précédents, avec les champs Name (string) et Completed (bool)
  2. Créer une fonction appelée completeTask qui prend comme paramètres un pointeur vers une tranche de structures Task et un index (int)
  3. Dans la fonction completeTask, modifier le champ Completed de la tâche à l’index donné pour lui attribuer la valeur true
  4. Utiliser bufio.Scanner pour lire correctement les lignes d’entrée :
    • Créer un scanner : scanner := bufio.NewScanner(os.Stdin)
    • Pour chaque ligne d’entrée : appeler scanner.Scan(), puis scanner.Text()
    • Cela garantit que les noms de tâches contenant des espaces sont lus correctement
  5. Analyser les données des tâches de la deuxième entrée pour créer votre tranche de tâches :
    • Séparer l’entrée par des virgules pour obtenir les entrées individuelles des tâches
    • Pour chaque entrée, la séparer au niveau des deux-points afin de distinguer le nom et le statut
    • Convertir la chaîne du statut en booléen ("true" devient true, "false" devient false)
  6. Convertir la chaîne de la troisième entrée en entier pour obtenir l’index de la tâche
  7. Appeler votre fonction completeTask avec un pointeur vers votre tranche et l’index
  8. Après avoir terminé la tâche, afficher toutes les tâches en utilisant le même format que dans le défi précédent :
    • Pour les tâches terminées : "[x] [task_name]"
    • Pour les tâches incomplètes : "[ ] [task_name]"
  9. Afficher un message de confirmation : "Task '[task_name]' marked as completed!"
  10. Afficher le récapitulatif mis à jour : "Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"

Utilisez le package strconv pour convertir la chaîne de l’index en entier. Ce défi montre comment les récepteurs pointeurs vous permettent de modifier la structure de données d’origine, en apportant des changements permanents à votre liste de tâches qui persistent après le retour de la fonction.

Essayez vous-même

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

Toutes les leçons de Logique & Flux

Entraînez-vous par vous-même : Compilateur Go en ligne