Menu
CoddyTech

Ringkasan: Kalkulator Bentuk

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 25 dari 65.

challenge icon

Tantangan

Sedang

Buat kalkulator bentuk yang menangani bentuk nyata, object mirip bentuk dari luar hierarki, dan object yang tidak dapat diukurnya.

  • Shape bersifat abstrak, dengan method abstrak area() -> float, perimeter() -> float dan shape_name() -> String. Method normalnya describe() mengembalikan NAME: area A, perimeter P dengan dua angka desimal.
  • Circle (radius), Rectangle (width, height) dan Triangle (sisi a, b, c) memperluas Shape. Nama mereka adalah Circle, Rectangle dan Triangle. Luas lingkaran adalah PI * r * r dan kelilingnya 2 * PI * r. Untuk segitiga, gunakan rumus Heron: dengan s = (a + b + c) / 2, luasnya adalah sqrt(s * (s - a) * (s - b) * (s - c)).
  • CustomShape TIDAK memperluas Shape. Object ini memiliki custom_name dan size; area() adalah size * size, perimeter() adalah 4 * size, dan describe() menggunakan format yang sama dengan Shape, dengan nama kustomnya.
  • ShapeCalculator memiliki dua fungsi statis. process(thing) mengembalikan [Shape] ditambah describe() untuk Shape, [Duck] ditambah describe() untuk object lain apa pun yang memiliki method describe(), dan Cannot measure this object jika tidak. total_area(things) menjumlahkan area() dari setiap object yang memiliki method area().

Kode yang disediakan membaca jumlah object yang akan menyusul, lalu satu object per baris: circle R, rectangle W H, triangle A B C, custom NAME SIZE atau unknown (object RefCounted biasa). Kode ini mencetak process() untuk setiap object dan total luasnya. Untuk circle 5, custom Hexa 3 dan unknown, kode ini mencetak:

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

Kodemu ditulis di shape.gd, circle.gd, rectangle.gd, triangle.gd, custom_shape.gd dan shape_calculator.gd. main.gd berisi kode input/output yang disediakan dan tidak dapat diedit.

Coba sendiri

extends Node

func _ready():
	# Kode input/output yang disediakan: biarkan apa adanya
	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))

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler GDScript online