Menu
Coddy logo textTech

Usuwanie zadania

Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 24 z 68.

challenge icon

Wyzwanie

Łatwy

W tej części systemu zarządzania zadaniami zaimplementujesz możliwość usuwania zadań z listy. To wyzwanie koncentruje się na manipulowaniu wycinkami za pomocą funkcji append, aby odtworzyć wycinek bez określonego elementu, pokazując, jak trwale usuwać elementy ze struktury danych.

Otrzymasz trzy dane wejściowe:

  • Łańcuch znaków reprezentujący liczbę zadań (np. "4")
  • Łańcuch znaków zawierający dane zadań w formacie: "name1:status1,name2:status2,name3:status3", gdzie status to "true" albo "false" (np. "Buy groceries:false,Call dentist:true,Finish project:false,Review code:true")
  • Łańcuch znaków reprezentujący indeks zadania do usunięcia (np. "1" oznacza drugie zadanie, przy indeksowaniu od 0)

Twoje zadanie:

  1. Zdefiniuj taką samą strukturę Task jak w poprzednich wyzwaniach, z polami Name (string) i Completed (bool)
  2. Utwórz funkcję o nazwie removeTask, która przyjmuje jako parametry wycinek struktur Task oraz indeks (int)
  3. Wewnątrz funkcji removeTask zwróć nowy wycinek, z którego usunięto zadanie o podanym indeksie, używając append do połączenia elementów znajdujących się przed indeksem docelowym i za nim
  4. Przeanalizuj dane zadań z drugiego wejścia, aby utworzyć wycinek zadań:
    • Podziel dane wejściowe po przecinkach, aby uzyskać poszczególne wpisy zadań
    • Dla każdego wpisu podziel go po dwukropku, aby oddzielić nazwę od statusu
    • Przekształć łańcuch znaków statusu na wartość logiczną ("true" staje się true, a "false" staje się false)
  5. Przekształć trzeci łańcuch wejściowy na liczbę całkowitą, aby uzyskać indeks zadania
  6. Zapisz nazwę zadania do usunięcia przed wywołaniem funkcji removeTask
  7. Wywołaj funkcję removeTask, przekazując jej wycinek i indeks, a następnie zapisz zwrócony wycinek
  8. Po usunięciu zadania wyświetl wszystkie pozostałe zadania, używając tego samego formatu co w poprzednich wyzwaniach:
    • W przypadku ukończonych zadań: "[x] [task_name]"
    • W przypadku nieukończonych zadań: "[ ] [task_name]"
  9. Wyświetl komunikat potwierdzający: "Task '[task_name]' removed successfully!"
  10. Wyświetl zaktualizowane podsumowanie: "Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"

Użyj pakietu strconv, aby przekształcić łańcuch znaków indeksu na liczbę całkowitą. To wyzwanie pokazuje, jak używać append do odtwarzania wycinków przez łączenie fragmentów znajdujących się przed elementem docelowym i za nim, skutecznie usuwając elementy z kolekcji i zachowując kolejność pozostałych elementów.

Spróbuj swoich sił

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

Wszystkie lekcje w sekcji Logika i przepływ sterowania

Poćwicz samodzielnie: Kompilator Go online