Menu
Coddy logo textTech

Eine Aufgabe entfernen

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

challenge icon

Aufgabe

Einfach

In diesem Teil deines Aufgabenverwaltungssystems implementierst du die Möglichkeit, Aufgaben aus deiner Liste zu entfernen. Diese Herausforderung konzentriert sich auf die Manipulation von Slices mithilfe der Funktion append, um einen Slice ohne ein bestimmtes Element neu zu erstellen, und zeigt, wie du Elemente dauerhaft aus deiner Datenstruktur entfernst.

Du erhältst drei Eingaben:

  • Eine Zeichenkette, die die Anzahl der Aufgaben darstellt (z. B. "4")
  • Eine Zeichenkette mit Aufgabendaten 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:true")
  • Eine Zeichenkette, die den Index der zu entfernenden Aufgabe darstellt (z. B. "1" für die zweite Aufgabe bei einer Indizierung ab 0)

Deine Aufgabe ist es:

  1. Dieselbe Task-Struktur wie in den vorherigen Herausforderungen zu definieren, mit den Feldern Name (string) und Completed (bool)
  2. Eine Funktion namens removeTask zu erstellen, die einen Slice von Task-Strukturen und einen Index (int) als Parameter übernimmt
  3. Innerhalb der Funktion removeTask einen neuen Slice zurückzugeben, aus dem die Aufgabe am angegebenen Index entfernt wurde, indem append verwendet wird, um die Elemente vor und nach dem Zielindex zu verbinden
  4. Die Aufgabendaten aus der zweiten Eingabe zu verarbeiten, um deinen Slice von Aufgaben zu erstellen:
    • Die Eingabe durch 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)
  5. Die Zeichenkette der dritten Eingabe in eine Ganzzahl umwandeln, um den Aufgabenindex zu erhalten
  6. Den Namen der zu entfernenden Aufgabe speichern, bevor die Funktion removeTask aufgerufen wird
  7. Deine Funktion removeTask mit deinem Slice und dem Index aufrufen und den zurückgegebenen Slice speichern
  8. Nach dem Entfernen der Aufgabe alle verbleibenden Aufgaben im selben Format wie in den vorherigen Herausforderungen ausgeben:
    • Für abgeschlossene Aufgaben: "[x] [task_name]"
    • Für nicht abgeschlossene Aufgaben: "[ ] [task_name]"
  9. Eine Bestätigungsnachricht ausgeben: "Task '[task_name]' removed successfully!"
  10. Die aktualisierte Zusammenfassung ausgeben: "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 du append verwenden kannst, um Slices durch das Verbinden von Teilen vor und nach einem Zielelement neu zu erstellen und dadurch effektiv Elemente aus deiner Sammlung zu entfernen, während die Reihenfolge der verbleibenden Elemente erhalten bleibt.

Probier es selbst

package main

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

type Task struct {
	Name      string
	Completed bool
}

func completeTask(tasks *[]Task, index int) {
	(*tasks)[index].Completed = true
}

func main() {
	// Read input using bufio.Scanner to handle spaces properly
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	_ = scanner.Text() // Read but don't use the number of tasks
	
	scanner.Scan()
	taskDataStr := scanner.Text()
	
	scanner.Scan()
	indexStr := scanner.Text()
	
	// Parse task data
	taskEntries := strings.Split(taskDataStr, ",")
	tasks := make([]Task, len(taskEntries))
	
	for i, entry := range taskEntries {
		parts := strings.Split(entry, ":")
		if len(parts) >= 2 {
			name := parts[0]
			status := parts[1] == "true"
			tasks[i] = Task{Name: name, Completed: status}
		}
	}
	
	// Convert index string to integer
	index, _ := strconv.Atoi(indexStr)
	
	// Complete the task
	taskName := tasks[index].Name
	completeTask(&tasks, index)
	
	// Display all tasks
	for _, task := range tasks {
		if task.Completed {
			fmt.Printf("[x] %s\n", task.Name)
		} else {
			fmt.Printf("[ ] %s\n", task.Name)
		}
	}
	
	// Print confirmation message
	fmt.Printf("Task '%s' marked as completed!\n", taskName)
	
	// Count completed and incomplete tasks
	completedCount := 0
	for _, task := range tasks {
		if task.Completed {
			completedCount++
		}
	}
	incompleteCount := len(tasks) - completedCount
	
	// Print summary
	fmt.Printf("Total: %d tasks (%d completed, %d remaining)\n", len(tasks), completedCount, incompleteCount)
}

Alle Lektionen in Logik & Ablauf

Übe selbstständig: Online-Go-Compiler