Menu
CoddyTech

Powtórzenie – kalkulator kształtów

Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 25 z 65.

challenge icon

Wyzwanie

Średni

Zbuduj kalkulator kształtów, który obsługuje rzeczywiste kształty, obiekt podobny do kształtu spoza hierarchii oraz obiekty, których nie potrafi zmierzyć.

  • Shape jest klasą abstrakcyjną z abstrakcyjnymi metodami area() -> float, perimeter() -> float i shape_name() -> String. Jego zwykła metoda describe() zwraca NAME: area A, perimeter P z dokładnością do dwóch miejsc po przecinku.
  • Circle (radius), Rectangle (width, height) i Triangle (boki a, b, c) rozszerzają Shape. Ich nazwy to Circle, Rectangle i Triangle. Pole koła to PI * r * r, a jego obwód to 2 * PI * r. W przypadku trójkąta użyj wzoru Herona: dla s = (a + b + c) / 2 pole wynosi sqrt(s * (s - a) * (s - b) * (s - c)).
  • CustomShape NIE rozszerza Shape. Ma custom_name i size; area() wynosi size * size, perimeter() wynosi 4 * size, a describe() używa tego samego formatu co Shape, z własną nazwą.
  • ShapeCalculator ma dwie funkcje statyczne. process(thing) zwraca [Shape] oraz wynik describe() dla obiektu Shape, [Duck] oraz wynik describe() dla każdego innego obiektu, który ma metodę describe(), a w pozostałych przypadkach Cannot measure this object. total_area(things) sumuje wyniki area() wszystkich obiektów, które mają metodę area().

Dostarczony kod odczytuje liczbę kolejnych obiektów, a następnie po jednym w każdym wierszu: circle R, rectangle W H, triangle A B C, custom NAME SIZE lub unknown (zwykły obiekt RefCounted). Wypisuje wynik process() dla każdego obiektu oraz łączne pole. Dla circle 5, custom Hexa 3 i unknown wypisuje:

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

Umieść swój kod w plikach shape.gd, circle.gd, rectangle.gd, triangle.gd, custom_shape.gd i shape_calculator.gd. main.gd zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

extends Node

func _ready():
	# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
	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))

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator GDScript online