Menu
CoddyTech

Özet - Şekil Hesaplayıcı

Coddy'nin GDScript Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 25 / 65.

challenge icon

Görev

Orta

Gerçek şekilleri, hiyerarşinin dışından gelen şekil benzeri bir nesneyi ve ölçemeyeceği nesneleri işleyen bir şekil hesaplayıcı oluştur.

  • Shape soyuttur ve area() -> float, perimeter() -> float ve shape_name() -> String soyut yöntemlerine sahiptir. Normal yöntemi describe(), iki ondalık basamakla NAME: area A, perimeter P döndürür.
  • Circle (radius), Rectangle (width, height) ve Triangle (kenarlar a, b, c) sınıfları Shape sınıfını genişletir. Adları Circle, Rectangle ve Triangle şeklindedir. Bir dairenin alanı PI * r * r, çevresi ise 2 * PI * r şeklindedir. Üçgen için Heron formülünü kullan: s = (a + b + c) / 2 olmak üzere alan sqrt(s * (s - a) * (s - b) * (s - c)) şeklindedir.
  • CustomShape, Shape sınıfını genişletmez. Bir custom_name ve size değerine sahiptir; area() sonucu size * size, perimeter() sonucu 4 * size olur ve describe(), özel adını kullanarak Shape ile aynı biçimi kullanır.
  • ShapeCalculator iki statik işleve sahiptir. process(thing), bir Shape için [Shape] ile describe() sonucunu; describe() yöntemi olan diğer herhangi bir nesne için [Duck] ile describe() sonucunu döndürür; bunların dışındaki durumlarda Cannot measure this object döndürür. total_area(things), area() yöntemi olan her nesnenin alanını toplar.

Sağlanan kod, kaç nesnenin geleceğini okur ve ardından her satırda bir nesne okur: circle R, rectangle W H, triangle A B C, custom NAME SIZE veya unknown (düz bir RefCounted nesnesi). Her biri için process() sonucunu ve toplam alanı yazdırır. circle 5, custom Hexa 3 ve unknown için şu çıktıyı verir:

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

Kodunu shape.gd, circle.gd, rectangle.gd, triangle.gd, custom_shape.gd ve shape_calculator.gd dosyalarına yaz. main.gd, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

extends Node

func _ready():
	# Sağlanan giriş/çıkış kodu: olduğu gibi bırakın
	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))

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online GDScript derleyicisi