Menu
CoddyTech

Ôn tập: xây dựng tiện ích

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 57 trên 68.

challenge icon

Thử thách

Dễ

Tạo một package stringutil toàn diện với các hàm thao tác chuỗi và minh họa cách sử dụng package này trong một chương trình chính. Thử thách này sẽ kiểm tra khả năng tạo package tiện ích tùy chỉnh, triển khai các hàm được xuất và sử dụng package từ một chương trình khác của bạn.

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

  • Một chuỗi chứa các đặc tả hàm theo định dạng "function1:description1,function2:description2" (ví dụ: "Reverse:reverses a string,ToUpper:converts to uppercase,ToLower:converts to lowercase")
  • Một chuỗi chứa các chuỗi kiểm thử được phân tách bằng dấu gạch đứng theo định dạng "string1|string2|string3" (ví dụ: "hello|Go Programming|WORLD")

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

  1. Tạo package stringutil bằng cách khai báo package stringutil
  2. Phân tích đầu vào thứ nhất bằng cách tách theo dấu phẩy để lấy từng đặc tả hàm
  3. Với mỗi đặc tả hàm, tách theo dấu hai chấm để lấy tên hàm và mô tả
  4. Triển khai các hàm được xuất sau trong package stringutil:
    • Reverse(s string) string - trả về chuỗi với các ký tự theo thứ tự ngược lại
    • ToUpper(s string) string - trả về chuỗi đã chuyển thành chữ hoa
    • ToLower(s string) string - trả về chuỗi đã chuyển thành chữ thường
    • Length(s string) int - trả về độ dài của chuỗi
  5. Trong chương trình chính, nhập package stringutil
  6. Hiển thị tiêu đề package: "=== STRINGUTIL PACKAGE DEMONSTRATION ==="
  7. Hiển thị các hàm có sẵn:
    • "Available functions in stringutil package:"
    • Với mỗi hàm từ đầu vào thứ nhất: "- [function_name]: [description]"
  8. Phân tích đầu vào thứ hai bằng cách tách theo dấu gạch đứng để lấy từng chuỗi kiểm thử
  9. Hiển thị tiêu đề kiểm thử: "Testing stringutil functions:"
  10. Với mỗi chuỗi kiểm thử, minh họa tất cả các hàm:
    • "Testing with: \"[test_string]\""
    • " stringutil.Reverse: \"[reversed_result]\""
    • " stringutil.ToUpper: \"[uppercase_result]\""
    • " stringutil.ToLower: \"[lowercase_result]\""
    • " stringutil.Length: [length_result]"
  11. Tính toán và hiển thị thống kê:
    • "=== STATISTICS ==="
    • "Total test strings processed: [number_of_test_strings]"
    • "Functions available in package: [number_of_functions_from_first_input]"
    • "Total function calls made: [total_function_calls]"
  12. Hiển thị chuỗi dài nhất và ngắn nhất:
    • "Longest string: \"[longest_string]\" (length: [length])"
    • "Shortest string: \"[shortest_string]\" (length: [length])"
  13. Hiển thị thông báo hoàn tất: "Package demonstration completed successfully"

Sử dụng package strings để tách chuỗi đầu vào và thao tác với văn bản, đồng thời dùng package fmt để định dạng đầu ra. Với hàm Reverse, bạn cần chuyển chuỗi thành một lát rune, đảo ngược thứ tự rồi chuyển lại thành chuỗi. Hãy nhớ rằng tất cả các hàm được xuất phải bắt đầu bằng chữ cái viết hoa để các package khác có thể truy cập. Thử thách này minh họa cách tạo các package tiện ích có thể tái sử dụng và tổ chức các chức năng liên quan thành một nhóm.

Tự làm thử

package main

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

// TODO: Tạo các hàm (function) cho package stringutil tại đây
// Vì không thể dùng các tệp riêng, hãy định nghĩa các hàm trực tiếp tại đây
// Thông thường, các hàm này nằm trong một tệp package riêng

// func Reverse(s string) string {
//     // Chuyển sang rune, đảo ngược rồi chuyển lại thành chuỗi
// }

// func ToUpper(s string) string {
//     // Dùng strings.ToUpper
// }

// func ToLower(s string) string {
//     // Dùng strings.ToLower
// }

// func Length(s string) int {
//     // Trả về len(s)
// }

func main() {
	// Đọc đầu vào bằng bufio.Scanner để xử lý khoảng trắng đúng cách
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	functionSpecs := scanner.Text()
	
	scanner.Scan()
	testStrings := scanner.Text()
	
	// Phân tích đặc tả hàm (function)
	funcList := strings.Split(functionSpecs, ",")
	
	// Phân tích các chuỗi kiểm thử
	testList := strings.Split(testStrings, "|")
	
	// TODO: Viết code bên dưới
	// 1. Hiển thị tiêu đề package
	// 2. Hiển thị các hàm có trong funcList (kiểm tra độ dài mảng)
	// 3. Kiểm thử tất cả các hàm với từng chuỗi kiểm thử
	// 4. Tính toán và hiển thị số liệu thống kê
	// 5. Tìm và hiển thị chuỗi dài nhất và ngắn nhất (kiểm tra xem testList có phần tử không)
	// 6. Hiển thị thông báo hoàn thành
	
	// Nhớ dùng các hàm trong package stringutil như:
	// Reverse(testString)
	// ToUpper(testString)
	// ToLower(testString)
	// Length(testString)
}

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