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 רגיל). הוא מדפיס את 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 אונליין