Menu
Coddy logo textTech

Oznaczanie zadania jako ukończonego

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

challenge icon

Wyzwanie

Łatwy

W tej części systemu zarządzania zadaniami zaimplementujesz możliwość oznaczania zadań jako ukończonych. To wyzwanie koncentruje się na użyciu odbiorców wskaźnikowych do modyfikowania oryginalnych danych zadania i pokazuje, jak wskaźniki pozwalają trwale aktualizować pola struktury.

Ważna uwaga: Ponieważ nazwy zadań mogą zawierać spacje (na przykład "Buy groceries"), musisz użyć bufio.Scanner, aby odczytywać całe wiersze danych wejściowych. Funkcja fmt.Scanf przestaje czytać przy pierwszej spacji, co powodowałoby błędne odczytywanie nazw zadań zawierających spacje. Użyj bufio.NewScanner(os.Stdin) i wywołaj scanner.Scan(), a następnie scanner.Text(), aby odczytać całe wiersze.

Otrzymasz trzy dane wejściowe:

  • Łańcuch reprezentujący liczbę zadań (np. "4")
  • Łańcuch zawierający dane zadań w formacie: "name1:status1,name2:status2,name3:status3", gdzie status ma wartość "true" albo "false" (np. "Buy groceries:false,Call dentist:true,Finish project:false,Review code:false")
  • Łańcuch reprezentujący indeks zadania do ukończenia (np. "2" oznacza trzecie 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 completeTask, która przyjmuje jako parametry wskaźnik do wycinka struktur Task oraz indeks (int)
  3. Wewnątrz funkcji completeTask zmodyfikuj pole Completed zadania o podanym indeksie, ustawiając je na true
  4. Użyj bufio.Scanner, aby prawidłowo odczytać wiersze danych wejściowych:
    • Utwórz skaner: scanner := bufio.NewScanner(os.Stdin)
    • Dla każdego wiersza danych wejściowych wywołaj scanner.Scan(), a następnie scanner.Text()
    • Dzięki temu nazwy zadań zawierające spacje zostaną poprawnie odczytane
  5. Przetwórz 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
    • Przekonwertuj łańcuch statusu na wartość logiczną ("true" staje się true, a "false" staje się false)
  6. Przekonwertuj trzeci łańcuch wejściowy na liczbę całkowitą, aby uzyskać indeks zadania
  7. Wywołaj funkcję completeTask, przekazując jej wskaźnik do wycinka i indeks
  8. Po ukończeniu zadania wyświetl wszystkie zadania w tym samym formacie co w poprzednim wyzwaniu:
    • W przypadku ukończonych zadań: "[x] [task_name]"
    • W przypadku nieukończonych zadań: "[ ] [task_name]"
  9. Wyświetl komunikat potwierdzający: "Task '[task_name]' marked as completed!"
  10. Wyświetl zaktualizowane podsumowanie: "Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"

Użyj pakietu strconv, aby przekonwertować łańcuch indeksu na liczbę całkowitą. To wyzwanie pokazuje, jak odbiorcy wskaźnikowi umożliwiają modyfikowanie oryginalnej struktury danych, dzięki czemu zmiany listy zadań są trwałe i pozostają po zakończeniu działania funkcji.

Spróbuj swoich sił

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

Wszystkie lekcje w sekcji Logika i przepływ sterowania

Poćwicz samodzielnie: Kompilator Go online