Menu
Coddy logo textTech

全体をまとめる

CoddyのGOジャーニー「論理とフロー」セクションの一部。レッスン 25/68。

challenge icon

チャレンジ

簡単

タスクリストアプリケーションを完成させる時間です。この最後のステップでは、前のレッスンで扱ったすべてをまとめます。Task 構造体、addTaskviewAllTaskscompleteTaskremoveTask を、メニューアクションのセッションから実行します。

次の3つの入力を受け取ります。

  • アプリケーション名とユーザー名をコンマで区切った文字列(例:"MyTasks,Alice"
  • リストの開始時点のタスクを、"name1:status1,name2:status2" 形式で表した文字列。status は "true" または "false" です(例:"Write report:false,Call dentist:true")。リストが空の状態で始まる場合、この行は空になります。
  • セッションのアクションをコンマで区切った文字列。アクションは、名前だけの場合と、名前と1つのパラメーターを | で結合した場合があります(例:"add|Buy groceries,view,complete|2,remove|0,exit")。アクションリストは必ず "exit" で終わります。

タスク名にはスペースが含まれるため、前のレッスンと同様に、3行すべてを bufio.Scanner で読み取ってください。

あなたのタスクは次のとおりです。

  1. Name(string)フィールドと Completed(bool)フィールドを持つ、同じ Task 構造体を定義する
  2. すでに作成した4つの関数を、同じシグネチャで再び用意する
    • addTask(tasks []Task, taskName string) []Task
    • viewAllTasks(tasks []Task)。完了したタスクには "[x] [task_name]" を、まだ未完了のタスクには "[ ] [task_name]" を出力する
    • completeTask(tasks *[]Task, index int)
    • removeTask(tasks []Task, index int) []Task
  3. 2番目の入力から開始時点のリストを構築する。空行は空のリストを意味することに注意する
  4. ウェルカムメッセージとメニューを、プロジェクトの最初のステップとまったく同じように出力する
    • "Welcome to [app_name], [user_name]!"
    • "1. Add Task"
    • "2. View Tasks"
    • "3. Complete Task"
    • "4. Remove Task"
    • "5. Exit"
    • "Current tasks: [count]"
  5. アクションを順番に実行する。各アクションでは、まずヘッダーを出力する
    • "add""--- ADD TASK ---" を出力し、パラメーターで指定された名前のタスクを追加してから、"Task '[task_name]' added!" を出力する
    • "view""--- VIEW TASKS ---" を出力し、viewAllTasks ですべてのタスクを一覧表示してから、サマリー行を出力する
    • "complete""--- COMPLETE TASK ---" を出力し、そのインデックスのタスクを完了にしてから、"Task '[task_name]' marked as completed!" を出力する
    • "remove""--- REMOVE TASK ---" を出力し、そのインデックスのタスクを削除してから、"Task '[task_name]' removed successfully!" を出力する
    • "exit""--- EXIT ---" を出力し、続けて "Final list:"、リスト全体、サマリー行、最後に "Goodbye, [user_name]!" を出力する。exit の後には何も実行しない。
  6. インデックスは前のレッスンと同様に0始まりです。"complete" または "remove" のインデックスがリストの範囲外の場合は、代わりに "Invalid task number" を出力し、リストは変更しない
  7. サマリー行は、すでに知っている次の形式です。"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"

strings パッケージを使って入力行を分割し、strconv パッケージを使ってインデックスを数値に変換してください。この最後のステップでは、1つずつ作成してきた小さな関数が組み合わさることで、動作するプログラムになることを確認できます。

自分で試してみよう

package main

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

type Task struct {
	Name      string
	Completed bool
}

// TODO: Bring back addTask, viewAllTasks, completeTask and removeTask
// このプロジェクトの以前のレッスンから

func main() {
	// 入力行を読み取るためのスキャナーを作成する
	scanner := bufio.NewScanner(os.Stdin)

	// アプリケーション名とユーザー名を読み取る
	scanner.Scan()
	names := scanner.Text()

	// リストが開始するタスクを読み取る
	scanner.Scan()
	taskData := scanner.Text()

	// セッションのアクションを読み取る
	scanner.Scan()
	actionData := scanner.Text()

	// TODO: 実装を完成させる
	// 1. names を "," で分割してアプリ名とユーザー名を取得する
	// 2. taskData から開始タスクのスライスを構築する
	// 3. ウェルカムメッセージ、メニュー、現在のタスク数を出力する
	// 4. actionData 内のすべてのアクションを順番に実行し、最初にそのヘッダーを出力する
}

論理とフローのすべてのレッスン

自分で練習してみよう: Goオンラインコンパイラ