Menu
CoddyTech

Repaso: calculadora de formas

Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 25 de 65.

challenge icon

Desafío

Intermedio

Construye una calculadora de figuras que gestione figuras reales, un objeto similar a una figura que no pertenezca a la jerarquía y objetos que no pueda medir.

  • Shape es abstracta, con los métodos abstractos area() -> float, perimeter() -> float y shape_name() -> String. Su método normal describe() devuelve NAME: area A, perimeter P con dos decimales.
  • Circle (radius), Rectangle (width, height) y Triangle (lados a, b, c) extienden Shape. Sus nombres son Circle, Rectangle y Triangle. El área de un círculo es PI * r * r y su perímetro 2 * PI * r. Para el triángulo, usa la fórmula de Herón: con s = (a + b + c) / 2, el área es sqrt(s * (s - a) * (s - b) * (s - c)).
  • CustomShape NO extiende Shape. Tiene un custom_name y un size; area() es size * size, perimeter() es 4 * size y describe() usa el mismo formato que Shape, con su nombre personalizado.
  • ShapeCalculator tiene dos funciones estáticas. process(thing) devuelve [Shape] más describe() para un Shape, [Duck] más describe() para cualquier otro objeto que tenga un método describe(), y Cannot measure this object en caso contrario. total_area(things) suma area() de todos los objetos que tengan un método area().

El código proporcionado lee cuántos objetos siguen y, después, uno por línea: circle R, rectangle W H, triangle A B C, custom NAME SIZE o unknown (un objeto RefCounted simple). Imprime process() para cada uno y el área total. Para circle 5, custom Hexa 3 y unknown imprime:

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

Tu código va en shape.gd, circle.gd, rectangle.gd, triangle.gd, custom_shape.gd y shape_calculator.gd. main.gd contiene el código de entrada/salida proporcionado y no se puede editar.

Pruébalo tú mismo

extends Node

func _ready():
	# Código de entrada/salida proporcionado: mantenlo tal como está
	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))

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de GDScript online