Menu
Coddy logo textTech

Eine Aufgabe abschließen

Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy — Lektion 23 von 68.

challenge icon

Aufgabe

Einfach

In diesem Teil Ihres Aufgabenverwaltungssystems implementieren Sie die Möglichkeit, Aufgaben als erledigt zu markieren. Diese Herausforderung konzentriert sich auf die Verwendung von Pointer-Receivern, um die ursprünglichen Aufgabendaten zu ändern, und demonstriert, wie Pointer es Ihnen ermöglichen, Strukturfelder dauerhaft zu aktualisieren.

Wichtiger Hinweis: Da Aufgabennamen Leerzeichen enthalten können (wie "Buy groceries"), müssen Sie bufio.Scanner verwenden, um ganze Eingabezeilen zu lesen. Die Funktion fmt.Scanf stoppt das Lesen beim ersten Leerzeichen, was Aufgabennamen mit Leerzeichen unterbrechen würde. Verwenden Sie bufio.NewScanner(os.Stdin) und rufen Sie scanner.Scan() gefolgt von scanner.Text() auf, um vollständige Zeilen zu lesen.

Sie erhalten drei Eingaben:

  • Einen String, der die Anzahl der Aufgaben darstellt (z. B. "4")
  • Einen String, der Aufgabendaten im Format "name1:status1,name2:status2,name3:status3" enthält, wobei der Status entweder "true" oder "false" ist (z. B. "Buy groceries:false,Call dentist:true,Finish project:false,Review code:false")
  • Einen String, der den Index der zu erledigenden Aufgabe darstellt (z. B. "2" für die dritte Aufgabe, unter Verwendung von 0-basierter Indizierung)

Ihre Aufgabe ist es:

  1. Definieren Sie dieselbe Task-Struktur aus den vorherigen Herausforderungen mit den Feldern Name (string) und Completed (bool)
  2. Erstellen Sie eine Funktion namens completeTask, die einen Pointer auf einen Slice von Task-Strukturen und einen Index (int) als Parameter entgegennimmt
  3. Ändern Sie innerhalb der Funktion completeTask das Feld Completed der Aufgabe am angegebenen Index auf true
  4. Verwenden Sie bufio.Scanner, um die Eingabezeilen ordnungsgemäß zu lesen:
    • Erstellen Sie einen Scanner: scanner := bufio.NewScanner(os.Stdin)
    • Für jede Eingabezeile: Rufen Sie scanner.Scan() und dann scanner.Text() auf
    • Dies stellt sicher, dass Aufgabennamen mit Leerzeichen korrekt gelesen werden
  5. Parsen Sie die Aufgabendaten aus der zweiten Eingabe, um Ihren Slice von Aufgaben zu erstellen:
    • Teilen Sie die Eingabe durch Kommas, um die einzelnen Aufgabeneinträge zu erhalten
    • Teilen Sie jeden Eintrag durch einen Doppelpunkt, um Name und Status zu trennen
    • Konvertieren Sie den Status-String in einen Boolean ("true" wird zu true, "false" wird zu false)
  6. Konvertieren Sie den dritten Eingabestring in eine Ganzzahl, um den Aufgabenindex zu erhalten
  7. Rufen Sie Ihre Funktion completeTask mit einem Pointer auf Ihren Slice und dem Index auf
  8. Nachdem Sie die Aufgabe abgeschlossen haben, zeigen Sie alle Aufgaben im gleichen Format wie in der vorherigen Herausforderung an:
    • Für erledigte Aufgaben: "[x] [task_name]"
    • Für nicht erledigte Aufgaben: "[ ] [task_name]"
  9. Geben Sie eine Bestätigungsmeldung aus: "Task '[task_name]' marked as completed!"
  10. Geben Sie die aktualisierte Zusammenfassung aus: "Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"

Verwenden Sie das Paket strconv, um den Index-String in eine Ganzzahl umzuwandeln. Diese Herausforderung zeigt, wie Pointer-Receiver es Ihnen ermöglichen, die ursprüngliche Datenstruktur zu modifizieren und dauerhafte Änderungen an Ihrer Aufgabenliste vorzunehmen, die auch nach Rückkehr der Funktion bestehen bleiben.

Probier es selbst

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

Alle Lektionen in Logik & Ablauf