Собираем всё вместе
Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 25 из 68.
Задание
ЛегкоПора завершить приложение для работы со списком задач. На этом последнем шаге ты объединишь всё из предыдущих уроков: структуру 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, как в предыдущих уроках.
Твоя задача:
- Определить ту же структуру
Taskс полямиName(string) иCompleted(bool) - Вернуть четыре уже написанные тобой функции с теми же сигнатурами:
addTask(tasks []Task, taskName string) []TaskviewAllTasks(tasks []Task), которая выводит"[x] [task_name]"для выполненной задачи и"[ ] [task_name]"для задачи, которая всё ещё открытаcompleteTask(tasks *[]Task, index int)removeTask(tasks []Task, index int) []Task
- Создать начальный list из второй входной строки, учитывая, что пустая строка означает пустой list
- Вывести приветственное сообщение и menu точно так же, как на первом шаге проекта:
"Welcome to [app_name], [user_name]!""1. Add Task""2. View Tasks""3. Complete Task""4. Remove Task""5. Exit""Current tasks: [count]"
- Выполнить 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 ничего не выполняется.
- Индексы начинаются с 0, как в предыдущих уроках. Если index для
"complete"или"remove"находится за пределами list, вместо этого выведи"Invalid task number"и оставь list без изменений. - Строка сводки тебе уже знакома:
"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 по порядку, сначала печатая его заголовок
}
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведениеПотренируйтесь самостоятельно: Онлайн-компилятор Go