Menu
CoddyTech

Revisão - Calculadora de Formas

Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 25 de 65.

challenge icon

Desafio

Médio

Crie uma calculadora de formas que lide com formas reais, um objeto semelhante a uma forma, mas que esteja fora da hierarquia, e objetos que ela não consiga medir.

  • Shape é abstrata, com os métodos abstratos area() -> float, perimeter() -> float e shape_name() -> String. Seu método normal describe() retorna NAME: area A, perimeter P com duas casas decimais.
  • Circle (radius), Rectangle (width, height) e Triangle (lados a, b, c) estendem Shape. Seus nomes são Circle, Rectangle e Triangle. A área de um círculo é PI * r * r e seu perímetro, 2 * PI * r. Para o triângulo, use a fórmula de Heron: com s = (a + b + c) / 2, a área é sqrt(s * (s - a) * (s - b) * (s - c)).
  • CustomShape NÃO estende Shape. Ela tem um custom_name e um size; area() é size * size, perimeter() é 4 * size, e describe() usa o mesmo formato que Shape, com seu nome personalizado.
  • ShapeCalculator tem duas funções estáticas. process(thing) retorna [Shape] mais describe() para um Shape, [Duck] mais describe() para qualquer outro objeto que tenha um método describe(), e Cannot measure this object nos demais casos. total_area(things) soma o resultado de area() de cada objeto que tenha um método area().

O código fornecido lê quantos objetos vêm a seguir e, então, um por linha: circle R, rectangle W H, triangle A B C, custom NAME SIZE ou unknown (um objeto simples RefCounted). Ele imprime process() para cada um e a área total. Para circle 5, custom Hexa 3 e 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

Seu código deve ficar em shape.gd, circle.gd, rectangle.gd, triangle.gd, custom_shape.gd e shape_calculator.gd. main.gd contém o código fornecido de entrada/saída e não pode ser editado.

Experimente você mesmo

extends Node

func _ready():
	# Código de entrada/saída fornecido: mantenha-o 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 as lições de Programação orientada a objetos

Pratique por conta própria: Compilador de GDScript online