Menu
CoddyTech

Повторение — калькулятор фигур

Часть раздела Объектно-ориентированное программирование путешествия по GDScript на Coddy. Урок 25 из 65.

challenge icon

Задание

Средне

Создайте калькулятор фигур, который обрабатывает настоящие фигуры, похожий на фигуру объект вне иерархии и объекты, которые он не может измерить.

  • Shape — абстрактный класс с абстрактными методами area() -> float, perimeter() -> float и shape_name() -> String. Его обычный метод describe() возвращает NAME: area A, perimeter P с двумя знаками после запятой.
  • Circle (radius), Rectangle (width, height) и Triangle (стороны a, b, c) наследуются от Shape. Их названия — Circle, Rectangle и Triangle. Площадь круга равна PI * r * r, а его периметр — 2 * PI * r. Для треугольника используйте формулу Герона: при s = (a + b + c) / 2 площадь равна sqrt(s * (s - a) * (s - b) * (s - c)).
  • CustomShape НЕ наследуется от Shape. У него есть custom_name и size; area() равен size * size, perimeter() равен 4 * size, а describe() использует тот же формат, что и Shape, с пользовательским названием.
  • ShapeCalculator содержит две статические функции. process(thing) возвращает [Shape] и результат describe() для объекта Shape, [Duck] и результат describe() для любого другого объекта, у которого есть метод describe(), и Cannot measure this object в противном случае. total_area(things) складывает результаты area() для каждого объекта, у которого есть метод area().

Предоставленный код считывает количество следующих объектов, затем по одному объекту в строке: circle R, rectangle W H, triangle A B C, custom NAME SIZE или unknown (обычный объект RefCounted). Для circle 5, custom Hexa 3 и unknown он выводит:

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

Ваш код нужно разместить в файлах shape.gd, circle.gd, rectangle.gd, triangle.gd, custom_shape.gd и shape_calculator.gd. В main.gd находится предоставленный код ввода/вывода, который нельзя редактировать.

Попробуйте сами

extends Node

func _ready():
	# Предоставленный код ввода-вывода: оставьте его без изменений
	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))

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор GDScript