Menu
CoddyTech

Rückblick – Formrechner

Teil des Abschnitts Objektorientierte Programmierung der GDScript-Journey von Coddy. Lektion 25 von 65.

challenge icon

Aufgabe

Mittel

Erstelle einen Formrechner, der echte Formen, ein formenähnliches Objekt außerhalb der Hierarchie und Objekte behandelt, die er nicht messen kann.

  • Shape ist abstrakt und besitzt die abstrakten Methoden area() -> float, perimeter() -> float und shape_name() -> String. Seine normale Methode describe() gibt NAME: area A, perimeter P mit zwei Dezimalstellen zurück.
  • Circle (radius), Rectangle (width, height) und Triangle (Seiten a, b, c) erweitern Shape. Ihre Namen sind Circle, Rectangle und Triangle. Die Fläche eines Kreises ist PI * r * r und sein Umfang 2 * PI * r. Verwende für das Dreieck die Formel von Heron: Mit s = (a + b + c) / 2 beträgt die Fläche sqrt(s * (s - a) * (s - b) * (s - c)).
  • CustomShape erweitert Shape NICHT. Es hat einen custom_name und eine size; area() ist size * size, perimeter() ist 4 * size, und describe() verwendet dasselbe Format wie Shape, mit seinem benutzerdefinierten Namen.
  • ShapeCalculator besitzt zwei statische Funktionen. process(thing) gibt [Shape] plus describe() für ein Shape zurück, [Duck] plus describe() für jedes andere Objekt, das eine describe()-Methode besitzt, und andernfalls Cannot measure this object. total_area(things) addiert die area() aller Objekte, die eine area()-Methode besitzen.

Der bereitgestellte Code liest ein, wie viele Objekte folgen, und anschließend eines pro Zeile: circle R, rectangle W H, triangle A B C, custom NAME SIZE oder unknown (ein einfaches RefCounted-Objekt). Er gibt für jedes Objekt process() und die Gesamtfläche aus. Für circle 5, custom Hexa 3 und unknown gibt er Folgendes aus:

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

Dein Code gehört in shape.gd, circle.gd, rectangle.gd, triangle.gd, custom_shape.gd und shape_calculator.gd. main.gd enthält den bereitgestellten Ein- und Ausgabecode und kann nicht bearbeitet werden.

Probier es selbst

extends Node

func _ready():
	# Vorgegebener Ein-/Ausgabecode: unverändert lassen
	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))

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-GDScript-Compiler