Menu
CoddyTech
flag Ar iconالعربيةdown icon

مراجعة - حاسبة الأشكال

جزء من قسم البرمجة كائنية التوجّه في رحلة 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 عادي). ويطبع process() لكل كائن، ثم المساحة الإجمالية. بالنسبة إلى 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 عبر الإنترنت