Menu
CoddyTech

Xóa một việc cần làm

Thuộc phần Logic và luồng điều khiển trong hành trình GO của Coddy. Bài học 24 trên 68.

challenge icon

Thử thách

Dễ

Trong phần này của hệ thống quản lý công việc, bạn sẽ triển khai khả năng xóa công việc khỏi danh sách. Thử thách này tập trung vào thao tác với lát cắt (slice) bằng cách dùng hàm append để tạo lại một lát cắt không có phần tử cụ thể, qua đó minh họa cách xóa vĩnh viễn các mục khỏi cấu trúc dữ liệu.

Bạn sẽ nhận ba đầu vào:

  • Một chuỗi biểu thị số lượng công việc, ví dụ: "4"
  • Một chuỗi chứa dữ liệu công việc theo định dạng: "name1:status1,name2:status2,name3:status3", trong đó trạng thái là "true" hoặc "false", ví dụ: "Buy groceries:false,Call dentist:true,Finish project:false,Review code:true"
  • Một chuỗi biểu thị chỉ số của công việc cần xóa, ví dụ: "1" để chọn công việc thứ hai, sử dụng chỉ số bắt đầu từ 0

Nhiệm vụ của bạn là:

  1. Định nghĩa lại struct Task giống như trong các thử thách trước, với các trường Name (string) và Completed (bool)
  2. Tạo hàm có tên removeTask nhận một lát cắt các struct Task và một chỉ số (int) làm tham số
  3. Bên trong hàm removeTask, trả về một lát cắt mới đã xóa công việc ở chỉ số đã cho bằng cách dùng append để kết hợp các phần tử trước và sau chỉ số đó
  4. Phân tích dữ liệu công việc từ đầu vào thứ hai để tạo lát cắt công việc:
    • Tách đầu vào theo dấu phẩy để lấy từng mục công việc
    • Với mỗi mục, tách theo dấu hai chấm để phân biệt tên và trạng thái
    • Chuyển chuỗi trạng thái thành giá trị boolean ("true" trở thành true, "false" trở thành false)
  5. Chuyển chuỗi đầu vào thứ ba thành số nguyên để lấy chỉ số công việc
  6. Lưu tên của công việc cần xóa trước khi gọi hàm removeTask
  7. Gọi hàm removeTask với lát cắt và chỉ số, rồi lưu lát cắt được trả về
  8. Sau khi xóa công việc, hiển thị tất cả công việc còn lại theo cùng định dạng như trong các thử thách trước:
    • Với công việc đã hoàn thành: "[x] [task_name]"
    • Với công việc chưa hoàn thành: "[ ] [task_name]"
  9. In thông báo xác nhận: "Task '[task_name]' removed successfully!"
  10. In bản tổng kết đã cập nhật: "Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"

Dùng package strconv để chuyển chuỗi chỉ số thành số nguyên. Thử thách này minh họa cách dùng append để tạo lại lát cắt bằng cách kết hợp các phần trước và sau phần tử mục tiêu, qua đó xóa các mục khỏi tập hợp mà vẫn giữ nguyên thứ tự của những phần tử còn lại.

Tự làm thử

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

Tất cả bài học trong Logic và luồng điều khiển

Tự luyện tập: Trình biên dịch Go online