Удаление задачи
Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 24 из 68.
Задание
ЛегкоВ этой части системы управления задачами ты реализуешь возможность удалять задачи из списка. В этом задании основное внимание уделяется манипуляциям со срезами с помощью функции append, чтобы восстановить срез без определённого элемента и продемонстрировать, как навсегда удалять элементы из структуры данных.
Тебе будут переданы три входных значения:
- Строка, представляющая количество задач (например,
"4") - Строка с данными задач в формате:
"name1:status1,name2:status2,name3:status3", где статус — это либо"true", либо"false"(например,"Buy groceries:false,Call dentist:true,Finish project:false,Review code:true") - Строка, представляющая индекс задачи, которую нужно удалить (например,
"1"для второй задачи при нумерации индексов с 0)
Тебе нужно:
- Определить ту же структуру
Task, что и в предыдущих заданиях, с полямиName(string) иCompleted(bool) - Создать функцию с именем
removeTask, которая принимает в качестве параметров срез структурTaskи индекс (int) - Внутри функции
removeTaskвернуть новый срез, в котором удалена задача с заданным индексом. Для этого используйappend, чтобы объединить элементы до целевого индекса и после него - Разобрать данные задач из второго входного значения и создать срез задач:
- Разделить входную строку по запятым, чтобы получить отдельные записи задач
- Для каждой записи разделить её по двоеточию, чтобы отделить имя от статуса
- Преобразовать строку статуса в логическое значение (
"true"становитсяtrue,"false"становитсяfalse)
- Преобразовать строку из третьего входного значения в целое число, чтобы получить индекс задачи
- Сохранить имя задачи, которую нужно удалить, до вызова функции
removeTask - Вызвать функцию
removeTask, передав ей срез и индекс, и сохранить возвращённый срез - После удаления задачи вывести все оставшиеся задачи в том же формате, что и в предыдущих заданиях:
- Для выполненных задач:
"[x] [task_name]" - Для невыполненных задач:
"[ ] [task_name]"
- Для выполненных задач:
- Вывести сообщение с подтверждением:
"Task '[task_name]' removed successfully!" - Вывести обновлённую сводку:
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
Используй пакет strconv, чтобы преобразовать строку с индексом в целое число. В этом задании показано, как с помощью append восстанавливать срезы, объединяя части до целевого элемента и после него, эффективно удаляя элементы из коллекции и сохраняя порядок оставшихся элементов.
Попробуйте сами
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Task struct {
Name string
Completed bool
}
func completeTask(tasks *[]Task, index int) {
(*tasks)[index].Completed = true
}
func main() {
// Read input using bufio.Scanner to handle spaces properly
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
_ = scanner.Text() // Read but don't use the number of tasks
scanner.Scan()
taskDataStr := scanner.Text()
scanner.Scan()
indexStr := scanner.Text()
// Parse task data
taskEntries := strings.Split(taskDataStr, ",")
tasks := make([]Task, len(taskEntries))
for i, entry := range taskEntries {
parts := strings.Split(entry, ":")
if len(parts) >= 2 {
name := parts[0]
status := parts[1] == "true"
tasks[i] = Task{Name: name, Completed: status}
}
}
// Convert index string to integer
index, _ := strconv.Atoi(indexStr)
// Complete the task
taskName := tasks[index].Name
completeTask(&tasks, index)
// Display all tasks
for _, task := range tasks {
if task.Completed {
fmt.Printf("[x] %s\n", task.Name)
} else {
fmt.Printf("[ ] %s\n", task.Name)
}
}
// Print confirmation message
fmt.Printf("Task '%s' marked as completed!\n", taskName)
// Count completed and incomplete tasks
completedCount := 0
for _, task := range tasks {
if task.Completed {
completedCount++
}
}
incompleteCount := len(tasks) - completedCount
// Print summary
fmt.Printf("Total: %d tasks (%d completed, %d remaining)\n", len(tasks), completedCount, incompleteCount)
}Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком
Оператор switch с `fallthrough`Выход из вложенных цикловПереход к следующей итерации конкретного циклаОператор `goto`Повторение: расширенное управление циклами4Проект: простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели-значенияПолучатели-указателиВыбор получателейМетоды и функцииПовторение: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картПовторение — счётчик частоты слов8Проект: простой складской учёт
Обзор проектаПроверка запасов3Интерфейсы (основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование типов интерфейсовПустой интерфейсУтверждения типовПереключатель типовПовторение — формы и поведениеПотренируйтесь самостоятельно: Онлайн-компилятор Go