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 GDScript của Coddy. Bài học 25 trên 65.

challenge icon

Thử thách

Trung bình

Xây dựng một trình tính toán hình dạng xử lý các hình dạng thực, một đối tượng giống hình dạng nhưng nằm ngoài hệ phân cấp và những đối tượng mà nó không thể đo lường.

  • Shape là lớp trừu tượng, có các phương thức trừu tượng area() -> float, perimeter() -> float và shape_name() -> String. Phương thức thông thường describe() trả về NAME: area A, perimeter P với hai chữ số thập phân.
  • Circle (radius), Rectangle (width, height) và Triangle (các cạnh a, b, c) kế thừa Shape. Tên của chúng là Circle, Rectangle và Triangle. Diện tích hình tròn là PI * r * r và chu vi là 2 * PI * r. Với hình tam giác, hãy dùng công thức Heron: với s = (a + b + c) / 2, diện tích là sqrt(s * (s - a) * (s - b) * (s - c)).
  • CustomShape KHÔNG kế thừa Shape. Nó có custom_name và size; area() là size * size, perimeter() là 4 * size, còn describe() dùng cùng định dạng với Shape, kèm tên tùy chỉnh.
  • ShapeCalculator có hai hàm tĩnh. process(thing) trả về [Shape] cộng với describe() cho một Shape, [Duck] cộng với describe() cho mọi đối tượng khác có phương thức describe(), và Cannot measure this object trong những trường hợp còn lại. total_area(things) cộng kết quả area() của mọi đối tượng có phương thức area().

Code được cung cấp đọc số lượng đối tượng tiếp theo, rồi đọc từng đối tượng trên một dòng: circle R, rectangle W H, triangle A B C, custom NAME SIZE hoặc unknown (một đối tượng RefCounted thông thường). Code sẽ in kết quả process() cho từng đối tượng và tổng diện tích. Với circle 5, custom Hexa 3 và unknown, chương trình in ra:

[Shape] Circle: area 78.54, perimeter 31.42
[Duck] Hexa: area 9.00, perimeter 12.00
Cannot measure this object
Total area: 87.54

Code của bạn nằm trong shape.gd, circle.gd, rectangle.gd, triangle.gd, custom_shape.gd và shape_calculator.gd. main.gd chứa code đầu vào/đầu ra được cung cấp và không thể chỉnh sửa.

Tự làm thử

extends Node

func _ready():
	# Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
	var count := int(OS.read_string_from_stdin())
	var things := []
	for i in count:
		var p := OS.read_string_from_stdin().split(" ")
		if p[0] == "circle":
			things.append(Circle.new(float(p[1])))
		elif p[0] == "rectangle":
			things.append(Rectangle.new(float(p[1]), float(p[2])))
		elif p[0] == "triangle":
			things.append(Triangle.new(float(p[1]), float(p[2]), float(p[3])))
		elif p[0] == "custom":
			things.append(CustomShape.new(p[1], float(p[2])))
		else:
			things.append(RefCounted.new())
	for thing in things:
		print(ShapeCalculator.process(thing))
	print("Total area: %.2f" % ShapeCalculator.total_area(things))

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 GDScript online