Menu
CoddyTech

Ôn tập: Máy tính hình học

Thuộc phần Lập trình hướng đối tượng trong hành trình GO của Coddy. Bài học 33 trên 107.

challenge icon

Thử thách

Dễ

Hãy xây dựng một chương trình tính toán hình học kết hợp tất cả các khái niệm về interface trong chương này. Bạn sẽ tạo một hệ thống xử lý thống nhất các hình dạng hình học khác nhau thông qua một interface chung, qua đó minh họa sức mạnh của tính đa hình trong Go.

Bạn sẽ sắp xếp code trong ba tệp:

  • shape.go: Định nghĩa một interface Shape có hai phương thức: Area() float64 và Perimeter() float64. Đồng thời, tạo một hàm tên là DescribeShape nhận bất kỳ Shape nào và trả về một chuỗi đã định dạng, hiển thị cả diện tích lẫn chu vi của hình.
  • shapes.go: Tạo hai struct triển khai interface Shape:
    • Một Rectangle có các trường Width và Height
    • Một Circle có trường Radius
    Mỗi struct cần triển khai cả hai phương thức Area() và Perimeter(), cùng với phương thức String() (triển khai fmt.Stringer) để trả về phần mô tả dễ đọc về hình.
  • main.go: Đọc dữ liệu hình dạng từ đầu vào, tạo các hình tương ứng và dùng hàm DescribeShape để hiển thị thông tin về từng hình. Đồng thời, in trực tiếp từng hình để minh họa interface Stringer.

Đầu vào sẽ có dạng:

  • Dòng 1: Chiều rộng hình chữ nhật (số thực)
  • Dòng 2: Chiều cao hình chữ nhật (số thực)
  • Dòng 3: Bán kính hình tròn (số thực)

Trong các phép tính, dùng 3.14159 làm giá trị pi. Chu vi hình tròn là 2 * pi * radius.

Các phương thức String() cần trả về:

  • Rectangle: Rectangle(Width x Height)
  • Circle: Circle(Radius: R)

Hàm DescribeShape cần trả về:

Area: [area], Perimeter: [perimeter]

Định dạng tất cả giá trị số thực với hai chữ số thập phân bằng %.2f.

Ví dụ, với các đầu vào 4, 3 và 5, đầu ra cần là:

Rectangle(4.00 x 3.00)
Area: 12.00, Perimeter: 14.00
Circle(Radius: 5.00)
Area: 78.54, Perimeter: 31.42

In từng hình trước bằng phương thức String(), sau đó in phần mô tả từ DescribeShape. Xử lý hình chữ nhật trước, rồi đến hình tròn.

Tự làm thử

package main

import (
	"fmt"
)

func main() {
	// Đọc các giá trị đầu vào
	var width, height, radius float64
	fmt.Scanln(&width)
	fmt.Scanln(&height)
	fmt.Scanln(&radius)

	// TODO: Tạo Rectangle với chiều rộng và chiều cao đã cho

	// TODO: Tạo Circle với bán kính đã cho

	// TODO: In ra hình chữ nhật (dùng phương thức String())
	// TODO: In ra mô tả của hình chữ nhật bằng DescribeShape()

	// TODO: In ra hình tròn (dùng phương thức String())
	// TODO: In ra mô tả của hình tròn bằng DescribeShape()
}

Tất cả bài học trong Lập trình hướng đối tượng

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