Usuwanie zadania
Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 24 z 68.
Wyzwanie
ŁatwyW 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:
- Zdefiniuj taką samą strukturę
Taskjak w poprzednich wyzwaniach, z polamiName(string) iCompleted(bool) - Utwórz funkcję o nazwie
removeTask, która przyjmuje jako parametry wycinek strukturTaskoraz indeks (int) - Wewnątrz funkcji
removeTaskzwróć nowy wycinek, z którego usunięto zadanie o podanym indeksie, używającappenddo połączenia elementów znajdujących się przed indeksem docelowym i za nim - 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)
- Przekształć trzeci łańcuch wejściowy na liczbę całkowitą, aby uzyskać indeks zadania
- Zapisz nazwę zadania do usunięcia przed wywołaniem funkcji
removeTask - Wywołaj funkcję
removeTask, przekazując jej wycinek i indeks, a następnie zapisz zwrócony wycinek - 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]"
- W przypadku ukończonych zadań:
- Wyświetl komunikat potwierdzający:
"Task '[task_name]' removed successfully!" - 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
1Zaawansowane sterowanie przepływem
Instrukcja switch z `fallthrough`Przerywanie zagnieżdżonych pętliKontynuowanie określonej pętliInstrukcja `goto`Podsumowanie — zaawansowane sterowanie pętlami4Projekt: Prosta lista zadań
Konfiguracja projektuDodawanie zadania2Struktury i metody
Definiowanie metod dla strukturOdbiorniki przez wartośćOdbiorniki przez wskaźnikWybór odbiornikówMetody a funkcjePodsumowanie — działanie struktur5Mapy w szczegółach
Mapy strukturWskaźniki jako wartości mapSprawdzanie, czy mapy są nilPorównywanie mapPodsumowanie — licznik częstości słów3Interfejsy (podstawy)
Czym jest interfejs?Definiowanie interfejsuImplementowanie interfejsuUżywanie typów interfejsowychPusty interfejsAsercje typuPrzełącznik typówPodsumowanie – kształty i zachowaniaPoćwicz samodzielnie: Kompilator Go online