Menu
CoddyTech

Récapitulatif – Calculateur de formes

Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 25 sur 65.

challenge icon

Défi

Moyen

Créez un calculateur de formes qui gère des formes réelles, un objet semblable à une forme provenant de l’extérieur de la hiérarchie et des objets qu’il ne peut pas mesurer.

  • Shape est abstraite et possède les méthodes abstraites area() -> float, perimeter() -> float et shape_name() -> String. Sa méthode normale describe() renvoie NAME: area A, perimeter P avec deux décimales.
  • Circle (radius), Rectangle (width, height) et Triangle (côtés a, b, c) étendent Shape. Leurs noms sont Circle, Rectangle et Triangle. L’aire d’un cercle est PI * r * r et son périmètre 2 * PI * r. Pour le triangle, utilisez la formule de Héron : avec s = (a + b + c) / 2, l’aire est sqrt(s * (s - a) * (s - b) * (s - c)).
  • CustomShape n’étend PAS Shape. Il possède un custom_name et une size ; area() vaut size * size, perimeter() vaut 4 * size, et describe() utilise le même format que Shape, avec son nom personnalisé.
  • ShapeCalculator possède deux fonctions statiques. process(thing) renvoie [Shape] suivi de describe() pour un Shape, [Duck] suivi de describe() pour tout autre objet qui possède une méthode describe(), et Cannot measure this object dans les autres cas. total_area(things) additionne les résultats de area() de chaque objet qui possède une méthode area().

Le code fourni lit le nombre d’objets à traiter, puis un objet par ligne : circle R, rectangle W H, triangle A B C, custom NAME SIZE ou unknown (un simple objet RefCounted). Il affiche le résultat de process() pour chacun, ainsi que l’aire totale. Pour circle 5, custom Hexa 3 et unknown, il affiche :

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

Votre code doit se trouver dans shape.gd, circle.gd, rectangle.gd, triangle.gd, custom_shape.gd et shape_calculator.gd. main.gd contient le code fourni pour les entrées/sorties et ne peut pas être modifié.

Essayez vous-même

extends Node

func _ready():
	# Code d’entrée/sortie fourni : conservez-le tel quel
	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))

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur GDScript en ligne