Menu
CoddyTech

Объединение всего вместе

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

challenge icon

Задание

Легко

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

На вход будут поданы три значения:

  • Строка с названием приложения и именем пользователя, разделёнными запятой (например, "MyTasks,Alice")
  • Строка с начальными задачами в формате "name1:status1,name2:status2", где статус — это "true" или "false" (например, "Write report:false,Call dentist:true"). Если список изначально пуст, эта строка будет пустой.
  • Строка с действиями в последовательности, разделёнными запятыми. Действие состоит либо только из своего имени, либо из имени и одного параметра, соединённых символом | (например, "add|Buy groceries,view,complete|2,remove|0,exit"). Список действий всегда заканчивается на "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. Сформировать начальный список из второй строки входных данных, помня, что пустая строка означает пустой список
  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]!". После выхода ничего не выполняется.
  6. Индексы начинаются с 0, как и в предыдущих уроках. Если индекс для действия "complete" или "remove" выходит за пределы списка, вместо этого выведи "Invalid task number" и оставь список без изменений.
  7. Строка со сводкой уже знакома тебе: "Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"

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

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

package main

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

type Task struct {
	Name      string
	Completed bool
}

// TODO: Восстановить addTask, viewAllTasks, completeTask и removeTask
// из предыдущих уроков этого проекта

func main() {
	// Создать scanner для чтения строк ввода
	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