Menu
Coddy logo textTech

Собираем всё вместе

Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 25 из 68.

challenge icon

Задание

Легко

Пора завершить приложение для работы со списком задач. На этом последнем шаге ты объединишь всё из предыдущих уроков: структуру Task, функции addTask, viewAllTasks, completeTask и removeTask, управляемые сеансом menu actions.

Ты получишь три входные строки:

  • Строку с названием application и именем пользователя, разделёнными запятой (например, "MyTasks,Alice")
  • Строку с задачами, с которыми начинается list, в формате "name1:status1,name2:status2", где status — это "true" или "false" (например, "Write report:false,Call dentist:true"). Эта строка пуста, если list изначально пуст.
  • Строку с actions сеанса, разделёнными запятыми. action — это либо его имя само по себе, либо его имя и один параметр, соединённые с помощью | (например, "add|Buy groceries,view,complete|2,remove|0,exit"). list actions всегда заканчивается значением "exit".

Имена задач могут содержать пробелы, поэтому считывай все три строки с помощью bufio.Scanner, как в предыдущих уроках.

Твоя задача:

  1. Определить ту же структуру Task с полями Name (string) и Completed (bool)
  2. Вернуть четыре уже написанные тобой функции с теми же сигнатурами:
    • 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. Создать начальный list из второй входной строки, учитывая, что пустая строка означает пустой list
  4. Вывести приветственное сообщение и menu точно так же, как на первом шаге проекта:
    • "Welcome to [app_name], [user_name]!"
    • "1. Add Task"
    • "2. View Tasks"
    • "3. Complete Task"
    • "4. Remove Task"
    • "5. Exit"
    • "Current tasks: [count]"
  5. Выполнить actions по порядку. Перед каждой action сначала выводится её заголовок:
    • "add": вывести "--- ADD TASK ---", добавить задачу, указанную параметром, затем вывести "Task '[task_name]' added!"
    • "view": вывести "--- VIEW TASKS ---", вывести каждую задачу с помощью viewAllTasks, затем вывести строку сводки
    • "complete": вывести "--- COMPLETE TASK ---", отметить задачу с этим index, затем вывести "Task '[task_name]' marked as completed!"
    • "remove": вывести "--- REMOVE TASK ---", удалить задачу с этим index, затем вывести "Task '[task_name]' removed successfully!"
    • "exit": вывести "--- EXIT ---", затем "Final list:", затем весь list, потом строку сводки и наконец "Goodbye, [user_name]!". После exit ничего не выполняется.
  6. Индексы начинаются с 0, как в предыдущих уроках. Если index для "complete" или "remove" находится за пределами list, вместо этого выведи "Invalid task number" и оставь list без изменений.
  7. Строка сводки тебе уже знакома: "Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"

Используй пакет strings для разделения входных строк и пакет strconv для преобразования index в число. Этот последний шаг показывает, как небольшие функции, которые ты писал по одной, складываются в работающую программу.

Попробуйте сами

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