Menu
CoddyTech

סיכום – רשימה מותאמת אישית

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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() פועלות כמו מתודות המערך בעלות אותם שמות.
  • 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 אונליין