Łączenie wszystkiego w całość
Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 25 z 68.
Wyzwanie
ŁatwyCzas dokończyć aplikację do tworzenia listy zadań. W tym ostatnim kroku połączysz wszystko z poprzednich lekcji: strukturę Task, funkcje addTask, viewAllTasks, completeTask i removeTask, obsługiwane przez sesję działań w menu.
Otrzymasz trzy dane wejściowe:
- Ciąg znaków z nazwą aplikacji i nazwą użytkownika, rozdzielonymi przecinkiem (np.
"MyTasks,Alice") - Ciąg znaków z zadaniami, które znajdują się na liście na początku, w formacie
"name1:status1,name2:status2", gdzie status to"true"lub"false"(np."Write report:false,Call dentist:true"). Ten wiersz jest pusty, jeśli lista na początku nie zawiera żadnych zadań. - Ciąg znaków z działaniami w sesji, rozdzielonymi przecinkami. Działanie to sama jego nazwa albo jego nazwa i jeden parametr połączone znakiem
|(np."add|Buy groceries,view,complete|2,remove|0,exit"). Lista działań zawsze kończy się na"exit".
Nazwy zadań mogą zawierać spacje, dlatego odczytaj wszystkie trzy wiersze za pomocą bufio.Scanner, tak jak w poprzednich lekcjach.
Twoje zadanie:
- Zdefiniuj tę samą strukturę
Taskz polamiName(string) iCompleted(bool) - Przywróć cztery napisane wcześniej funkcje o tych samych sygnaturach:
addTask(tasks []Task, taskName string) []TaskviewAllTasks(tasks []Task), która wyświetla"[x] [task_name]"dla ukończonego zadania i"[ ] [task_name]"dla zadania, które wciąż jest otwartecompleteTask(tasks *[]Task, index int)removeTask(tasks []Task, index int) []Task
- Utwórz początkową listę na podstawie drugiego wejścia, pamiętając, że pusty wiersz oznacza pustą listę
- Wyświetl wiadomość powitalną i menu, dokładnie tak jak w pierwszym kroku projektu:
"Welcome to [app_name], [user_name]!""1. Add Task""2. View Tasks""3. Complete Task""4. Remove Task""5. Exit""Current tasks: [count]"
- Wykonuj działania po kolei. Każde działanie najpierw wyświetla swój nagłówek:
"add": wyświetl"--- ADD TASK ---", dodaj zadanie o nazwie podanej jako parametr, a następnie wyświetl"Task '[task_name]' added!""view": wyświetl"--- VIEW TASKS ---", wyświetl każde zadanie za pomocąviewAllTasks, a następnie wyświetl wiersz podsumowania"complete": wyświetl"--- COMPLETE TASK ---", oznacz zadanie o podanym indeksie jako ukończone, a następnie wyświetl"Task '[task_name]' marked as completed!""remove": wyświetl"--- REMOVE TASK ---", usuń zadanie o podanym indeksie, a następnie wyświetl"Task '[task_name]' removed successfully!""exit": wyświetl"--- EXIT ---", następnie"Final list:", potem całą listę, następnie wiersz podsumowania, a na końcu"Goodbye, [user_name]!". Po wyjściu nic więcej się nie wykonuje.
- Indeksy zaczynają się od 0, tak jak w poprzednich lekcjach. Jeśli indeks w działaniu
"complete"lub"remove"znajduje się poza listą, wyświetl"Invalid task number"i pozostaw listę bez zmian. - Wiersz podsumowania jest taki, jaki już znasz:
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
Użyj pakietu strings, aby podzielić wiersze wejściowe, oraz pakietu strconv, aby zamienić indeks na liczbę. Ten ostatni krok pokazuje, jak małe funkcje, które pisałeś po kolei, składają się na działający program.
Spróbuj swoich sił
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Task struct {
Name string
Completed bool
}
// TODO: Przywróć addTask, viewAllTasks, completeTask i removeTask
// z poprzednich lekcji tego projektu
func main() {
// Utwórz scanner do odczytywania wierszy wejścia
scanner := bufio.NewScanner(os.Stdin)
// Odczytaj nazwę aplikacji i nazwę użytkownika
scanner.Scan()
names := scanner.Text()
// Odczytaj zadania początkowo znajdujące się na liście
scanner.Scan()
taskData := scanner.Text()
// Odczytaj działania wykonywane podczas sesji
scanner.Scan()
actionData := scanner.Text()
// TODO: Dokończ implementację
// 1. Podziel names według "," na nazwę aplikacji i nazwę użytkownika
// 2. Utwórz początkowy wycinek zadań na podstawie taskData
// 3. Wyświetl powitanie, menu i bieżącą liczbę zadań
// 4. Wykonaj kolejno wszystkie działania z actionData, wyświetlając najpierw nagłówek każdego z nich
}
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