Menu
CoddyTech

Завершение задачи

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

challenge icon

Задание

Легко

В этой части системы управления задачами ты реализуешь возможность отмечать задачи как выполненные. Это задание посвящено использованию методов с указателем-получателем для изменения исходных данных задачи и демонстрирует, как указатели позволяют навсегда обновлять поля структуры.

Важное примечание: Поскольку имена задач могут содержать пробелы (например, "Buy groceries"), для чтения целых строк ввода нужно использовать bufio.Scanner. Функция fmt.Scanf прекращает чтение на первом пробеле, из-за чего имена задач с пробелами будут прочитаны некорректно. Используй bufio.NewScanner(os.Stdin) и вызывай scanner.Scan(), а затем scanner.Text(), чтобы читать строки целиком.

Ты получишь три входных значения:

  • Строку, представляющую количество задач (например, "4")
  • Строку с данными задач в формате: "name1:status1,name2:status2,name3:status3", где статус — это либо "true", либо "false" (например, "Buy groceries:false,Call dentist:true,Finish project:false,Review code:false")
  • Строку, представляющую индекс задачи, которую нужно выполнить (например, "2" для третьей задачи при нумерации с 0)

Твоя задача:

  1. Определи ту же структуру Task, что и в предыдущих заданиях, с полями Name (string) и Completed (bool)
  2. Создай функцию с именем completeTask, которая принимает в качестве параметров указатель на срез структур Task и индекс (int)
  3. Внутри функции completeTask измени поле Completed задачи с заданным индексом на true
  4. Используй bufio.Scanner, чтобы правильно читать строки ввода:
    • Создай сканер: scanner := bufio.NewScanner(os.Stdin)
    • Для каждой строки ввода вызови scanner.Scan(), а затем scanner.Text()
    • Это гарантирует, что имена задач с пробелами будут прочитаны правильно
  5. Разбери данные задач из второго входного значения, чтобы создать срез задач:
    • Раздели ввод по запятым, чтобы получить отдельные записи задач
    • Для каждой записи выполни разделение по двоеточию, чтобы отделить имя от статуса
    • Преобразуй строку статуса в логическое значение ("true" становится true, "false" становится false)
  6. Преобразуй третью входную строку в целое число, чтобы получить индекс задачи
  7. Вызови функцию completeTask, передав ей указатель на срез и индекс
  8. После выполнения задачи отобрази все задачи в том же формате, что и в предыдущем задании:
    • Для выполненных задач: "[x] [task_name]"
    • Для невыполненных задач: "[ ] [task_name]"
  9. Выведи сообщение с подтверждением: "Task '[task_name]' marked as completed!"
  10. Выведи обновлённую сводку: "Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"

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

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

package main

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

type Task struct {
	Name      string
	Completed bool
}

func viewAllTasks(tasks []Task) {
	for _, task := range tasks {
		if task.Completed {
			fmt.Printf("[x] %s\n", task.Name)
		} else {
			fmt.Printf("[ ] %s\n", task.Name)
		}
	}
}

func main() {
	var numTasksStr string
	fmt.Scanln(&numTasksStr)
	numTasks, _ := strconv.Atoi(numTasksStr)

	scanner := bufio.NewScanner(os.Stdin)
	scanner.Scan()
	taskData := scanner.Text()

	var tasks []Task
	taskEntries := strings.Split(taskData, ",")

	for _, entry := range taskEntries {
		parts := strings.Split(entry, ":")
		if len(parts) >= 2 {
			name := parts[0]
			completed, _ := strconv.ParseBool(parts[1])
			task := Task{
				Name:      name,
				Completed: completed,
			}
			tasks = append(tasks, task)
		}
	}

	viewAllTasks(tasks)

	completedCount := 0
	for _, task := range tasks {
		if task.Completed {
			completedCount++
		}
	}

	incompleteCount := numTasks - completedCount
	fmt.Printf("Total: %d tasks (%d completed, %d remaining)\n", numTasks, completedCount, incompleteCount)
}

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Онлайн-компилятор Go