Menu
CoddyTech

Riepilogo - Calcolatore di forme

Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 25 di 65.

challenge icon

Sfida

Medio

Crea un calcolatore di forme che gestisca forme reali, un oggetto simile a una forma ma esterno alla gerarchia e oggetti che non può misurare.

  • Shape è astratta, con i metodi astratti area() -> float, perimeter() -> float e shape_name() -> String. Il suo metodo normale describe() restituisce NAME: area A, perimeter P con due cifre decimali.
  • Circle (radius), Rectangle (width, height) e Triangle (lati a, b, c) estendono Shape. I loro nomi sono Circle, Rectangle e Triangle. L’area di un cerchio è PI * r * r e il suo perimetro è 2 * PI * r. Per il triangolo, usa la formula di Erone: con s = (a + b + c) / 2, l’area è sqrt(s * (s - a) * (s - b) * (s - c)).
  • CustomShape NON estende Shape. Ha un custom_name e una size; area() è size * size, perimeter() è 4 * size e describe() usa lo stesso formato di Shape, con il suo nome personalizzato.
  • ShapeCalculator ha due funzioni statiche. process(thing) restituisce [Shape] più il risultato di describe() per un Shape, [Duck] più il risultato di describe() per qualsiasi altro oggetto che abbia un metodo describe() e Cannot measure this object in caso contrario. total_area(things) somma il risultato di area() per ogni oggetto che abbia un metodo area().

Il codice fornito legge quanti oggetti seguono, poi uno per riga: circle R, rectangle W H, triangle A B C, custom NAME SIZE oppure unknown (un semplice oggetto RefCounted). Stampa il risultato di process() per ciascuno e l’area totale. Per circle 5, custom Hexa 3 e unknown stampa:

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

Il tuo codice va in shape.gd, circle.gd, rectangle.gd, triangle.gd, custom_shape.gd e shape_calculator.gd. main.gd contiene il codice fornito per l’input/output e non può essere modificato.

Provalo tu

extends Node

func _ready():
	# Codice di input/output fornito: lascialo così com'è
	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))

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore GDScript online