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

مراجعة - قائمة مخصصة

جزء من قسم البرمجة كائنية التوجّه في رحلة GDScript على Coddy. الدرس 34 من 65.

challenge icon

التحدي

متوسط

اكتب CustomList في custom_list.gd، وهو صنف يغلّف مصفوفة خاصة _items ويوفّر ما تحتاج إليه القائمة من خلال الدوال والدوال الافتراضية:

  • تخزّن _init(items = []) نسخة من items، كي لا تؤثر التغييرات اللاحقة على المصفوفة المُمرَّرة في القائمة.
  • تضيف append(item) عنصرًا في النهاية. تحذف pop_back() العنصر الأخير وتعيده، أو تعيد null عندما تكون القائمة فارغة.
  • تعيد get_at(index) العنصر، أو null عندما يكون الفهرس خارج النطاق من 0 إلى size() - 1. تستبدل set_at(index, value) العنصر وتعيد true، أو تعيد false إذا كان الفهرس خارج القائمة.
  • تعمل size() وhas(item) وclear() مثل دوال Array التي تحمل الأسماء نفسها.
  • تحل concat(other) محل العامل +: فهي تعيد CustomList جديدة تحتوي على عناصر هذه القائمة، تليها عناصر other، ولا تغيّر أيًا من القائمتين.
  • تعيد _to_string() العناصر بالطريقة التي تُطبع بها المصفوفة، مثل [3, 1, 4].
  • تتيح _iter_init() و_iter_next() و_iter_get() لحلقة for المرور على العناصر.

يقرأ الكود المرفق الأعداد الأولية (في سطر واحد، تفصل بينها مسافات، وقد يكون السطر فارغًا)، وينشئ القائمة، ويضيف 99 إلى المصفوفة التي مرّرها، ثم يطبع القائمة. بعد ذلك يقرأ عدد الأوامر وينفّذ أمرًا واحدًا في كل سطر: append N وpop وget I وset I N وhas N وsize وsum (حلقة for تمرّ على القائمة) وclear وconcat N N .... بالنسبة إلى هذا الإدخال:

3 1 4
8
append 1
get 2
get 9
set 0 5
has 4
sum
pop
concat 9 2

تكون المخرجات:

[3, 1, 4]
[3, 1, 4, 1]
Item 2: 4
No item at 9
[5, 1, 4, 1]
Has 4: true
Sum: 11
Popped 1
[5, 1, 4] + [9, 2] = [5, 1, 4, 9, 2]

ضع الكود في custom_list.gd. يحتوي main.gd على كود الإدخال والإخراج المرفق، ولا يمكن تعديله.

جرّب بنفسك

extends Node

func _ready():
	# رمز الإدخال والإخراج المقدَّم: اتركه كما هو
	var numbers := to_numbers(OS.read_string_from_stdin().split(" ", false))
	var list := CustomList.new(numbers)
	# يجب أن تحتفظ القائمة بنسختها الخاصة
	numbers.append(99)
	print(list)
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ", false)
		match parts[0]:
			"append":
				list.append(int(parts[1]))
				print(list)
			"pop":
				var item = list.pop_back()
				print("Empty" if item == null else "Popped %d" % item)
			"get":
				var item = list.get_at(int(parts[1]))
				print(("No item at " + parts[1]) if item == null else "Item %s: %d" % [parts[1], item])
			"set":
				if list.set_at(int(parts[1]), int(parts[2])):
					print(list)
				else:
					print("No item at " + parts[1])
			"has":
				print("Has %s: %s" % [parts[1], list.has(int(parts[1]))])
			"size":
				print("Size: %d" % list.size())
			"sum":
				var total := 0
				for item in list:
					total += item
				print("Sum: %d" % total)
			"clear":
				list.clear()
				print(list)
			"concat":
				var other := CustomList.new(to_numbers(parts.slice(1)))
				print("%s + %s = %s" % [list, other, list.concat(other)])

func to_numbers(words: PackedStringArray) -> Array:
	var result := []
	for word in words:
		result.append(int(word))
	return result

جميع دروس البرمجة كائنية التوجّه

تدرّب بنفسك: مترجم GDScript عبر الإنترنت