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