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 deines Aufgabenverwaltungssystems implementierst du 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 zeigt, wie Pointer das dauerhafte Aktualisieren von Struct-Feldern ermöglichen.

Wichtiger Hinweis: Da Aufgabennamen Leerzeichen enthalten können (wie "Buy groceries"), musst du bufio.Scanner verwenden, um vollständige Eingabezeilen zu lesen. Die Funktion fmt.Scanf beendet das Lesen beim ersten Leerzeichen, wodurch Aufgabennamen mit Leerzeichen nicht korrekt gelesen würden. Verwende bufio.NewScanner(os.Stdin) und rufe anschließend scanner.Scan() gefolgt von scanner.Text() auf, um vollständige Zeilen zu lesen.

Du erhältst drei Eingaben:

  • Eine Zeichenkette, die die Anzahl der Aufgaben darstellt (z. B. "4")
  • Eine Zeichenkette mit Aufgabedaten im Format: "name1:status1,name2:status2,name3:status3", wobei der Status entweder "true" oder "false" ist (z. B. "Buy groceries:false,Call dentist:true,Finish project:false,Review code:false")
  • Eine Zeichenkette, die den Index der zu erledigenden Aufgabe darstellt (z. B. "2" für die dritte Aufgabe bei einer Indizierung ab 0)

Deine Aufgabe ist es:

  1. Dieselbe Task-Struct wie in den vorherigen Herausforderungen zu definieren, mit den Feldern Name (string) und Completed (bool)
  2. Eine Funktion namens completeTask zu erstellen, die einen Pointer auf einen Slice von Task-Structs und einen Index (int) als Parameter übernimmt
  3. Innerhalb der Funktion completeTask das Feld Completed der Aufgabe am angegebenen Index auf true zu setzen
  4. bufio.Scanner zu verwenden, um die Eingabezeilen korrekt zu lesen:
    • Einen Scanner erstellen: scanner := bufio.NewScanner(os.Stdin)
    • Für jede Eingabezeile: scanner.Scan() und anschließend scanner.Text() aufrufen
    • Dadurch wird sichergestellt, dass Aufgabennamen mit Leerzeichen korrekt gelesen werden
  5. Die Aufgabedaten aus der zweiten Eingabe zu analysieren, um deinen Slice mit Aufgaben zu erstellen:
    • Die Eingabe an Kommas aufteilen, um einzelne Aufgabeneinträge zu erhalten
    • Jeden Eintrag am Doppelpunkt aufteilen, um Name und Status zu trennen
    • Die Statuszeichenkette in einen booleschen Wert umwandeln ("true" wird zu true, "false" wird zu false)
  6. Die dritte Eingabezeichenkette in eine Ganzzahl umwandeln, um den Aufgabenindex zu erhalten
  7. Deine Funktion completeTask mit einem Pointer auf deinen Slice und dem Index aufzurufen
  8. Nach dem Erledigen der Aufgabe alle Aufgaben im selben Format wie in der vorherigen Herausforderung anzuzeigen:
    • Für erledigte Aufgaben: "[x] [task_name]"
    • Für nicht erledigte Aufgaben: "[ ] [task_name]"
  9. Eine Bestätigungsnachricht auszugeben: "Task '[task_name]' marked as completed!"
  10. Die aktualisierte Zusammenfassung auszugeben: "Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"

Verwende das Paket strconv, um die Indexzeichenkette in eine Ganzzahl umzuwandeln. Diese Herausforderung zeigt, wie Pointer-Receiver dir ermöglichen, die ursprüngliche Datenstruktur zu ändern, sodass dauerhafte Änderungen an deiner Aufgabenliste auch nach der Rückkehr aus 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

Übe selbstständig: Online-Go-Compiler