Menu
CoddyTech

Xem tất cả 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 22 trên 68.

challenge icon

Thử thách

Dễ

Tiếp tục xây dựng hệ thống quản lý công việc, giờ bạn sẽ triển khai chức năng hiển thị tất cả công việc theo định dạng thân thiện với người dùng. Thử thách này tập trung vào việc duyệt qua danh sách công việc và hiển thị trạng thái hoàn thành của từng công việc bằng các dấu hiệu trực quan rõ ràng.

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

  • Một chuỗi (string) 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")

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

  1. Định nghĩa lại struct Task như trong các thử thách trước, với các trường Name (string) và Completed (bool)
  2. Tạo một hàm có tên viewAllTasks, nhận một slice gồm các struct Task làm tham số
  3. Bên trong hàm viewAllTasks, duyệt qua slice và in ra từng công việc theo định dạng sau:
    • 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]"
  4. Phân tích dữ liệu công việc từ đầu vào thứ hai để tạo slice công việc:
    • Tách đầu vào theo dấu phẩy để lấy từng mục công việc riêng lẻ
    • Với mỗi mục, tách theo dấu hai chấm để phân chia 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. Gọi hàm viewAllTasks với slice đã tạo
  6. Sau khi hiển thị tất cả công việc, in ra phần tổng kết theo định dạng: "Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"

Ví dụ, nếu bạn có các công việc "Buy groceries:false,Call dentist:true,Finish project:false", đầu ra sẽ hiển thị từng công việc với ô đánh dấu phù hợp, sau đó là phần tổng kết với tổng số công việc và thống kê trạng thái hoàn thành. Thử thách này giúp bạn luyện tập cách duyệt slice, định dạng hiển thị theo điều kiện bằng câu lệnh if và trình bày tiến độ công việc một cách rõ ràng cho người dùng.

Tự làm thử

package main

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

type Task struct {
	Name      string
	Completed bool
}

func viewAllTasks(tasks []Task) {
	// TODO: Viết hàm (function) để hiển thị tất cả công việ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]"
}

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

	// TODO: Phân tích dữ liệu công việc từ chuỗi (string) taskData
	// Tách theo dấu phẩy để lấy từng mục công việc
	taskEntries := strings.Split(taskData, ",")
	_ = taskEntries

	// 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 rồi tạo các struct Task

	// TODO: Gọi hàm viewAllTasks với slice đã tạo

	// TODO: Tính toán và in ra phần tổng kết
	// Định dạng: "Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
	_ = tasks
	_ = numTasks
}

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