Menu
Coddy logo textTech

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

Часть раздела Логика и управление потоком путешествия по 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" для третьей задачи, используя индексацию с нуля)

Ваша задача:

  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)
}

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