فهرست امتیازهای برتر یک بازیکن بازی را مدیریت کنید.
وظیفهی شما این است که مؤلفهی امتیازهای برترِ بازی کلاسیک Frogger را بسازید؛ یکی از پرفروشترین و اعتیادآورترین بازیهای تمام دوران و یک کلاسیک از دوران آرکید. وظیفهی شما این است که متدهایی بنویسید که بالاترین امتیاز فهرست، آخرین امتیاز اضافهشده و سه امتیاز برتر را برگردانند.
این تمرین میخواهد که خروجی به شکل خاصی مرتب شود. مانند بسیاری از زبانهای برنامهنویسی، پیمایش یک آرایه با ترتیبی وابسته به پیادهسازی و بهظاهر تصادفی انجام میشود. معمولاً این ترتیبی نیست که آدمها میخواهند ببینند. GNU awk چند قابلیت مرتبسازی در اختیارتان میگذارد.
asort: مرتبسازی آرایهای با اندیس عددی بر اساس مقادیر آرایه.
#!gawk
BEGIN {
for (i = 1; i <= 5; i++)
nums[i] = int(100 * rand())
# returns the array size
n = asort(nums, sorted)
for (i = 1; i <= n; i++)
print i, nums[i], sorted[i]
}
که خروجی آن چنین است
1 92 30
2 59 57
3 30 59
4 57 74
5 74 92
شکل n = asort(array) آرایهی نامبرده را در جای خودش مرتب میکند.
این ویژگی بیشتر برای آرایههای با اندیس عددی مفید است.
فرایندی که آرایهی sorted را پر میکند، اندیسهای اصلی آرایه را دور میریزد:
اندیسگذاری آرایهی sorted از ۱ تا n انجام میشود.
asorti: مرتبسازی یک آرایه بر اساس اندیسهای آرایه.
تابع asorti آرایهای «مقصد» را پر میکند که اندیسهای مرتبشدهی آرایهی «مبدأ» را در خود دارد.
#!gawk
BEGIN {
nums["foo"] = int(100 * rand())
nums["bar"] = int(100 * rand())
nums["qux"] = int(100 * rand())
print "unordered"
for (i in nums)
print i, nums[i]
print "ordered by index"
n = asorti(nums, sorted)
for (i = 1; i <= n; i++)
print sorted[i], nums[sorted[i]]
}
که خروجی آن چنین است
unordered
foo 92
qux 30
bar 59
ordered by index
bar 59
foo 92
qux 30
PROCINFO["sorted_in"]: پیمایش یک آرایه با ترتیب مشخص.
آرایهی توکار PROCINFO اطلاعات زیادی دربارهی فرایند در حال اجرای awk در خود دارد
یک عضو جالب این آرایه sorted_in است
مقدار این کلید آرایه، اسم تابعی است که تعیین میکند اندیسهای آرایه با چه ترتیبی در حلقههای for (indx in array) پردازش شوند.
این تابع میتواند اسم یک تابع تعریفشده توسط کاربر باشد، یا شماری تابع مرتبسازی از پیش تعریفشدهی آماده وجود دارد، از جمله:
"@ind_str_asc"، "@ind_str_desc": مرتبسازی آرایه بر اساس اندیس، با ترتیب الفبایی، صعودی یا نزولی."@ind_num_asc"، "@ind_num_desc": مرتبسازی آرایه بر اساس اندیس، با ترتیب عددی، صعودی یا نزولی."@val_str_asc"، "@val_str_desc": مرتبسازی آرایه بر اساس مقدار، با ترتیب الفبایی، صعودی یا نزولی."@val_num_asc"، "@val_num_desc": مرتبسازی آرایه بر اساس مقدار، با ترتیب عددی، صعودی یا نزولی.مثال asort بالا را میتوان چنین پیادهسازی کرد:
PROCINFO["sorted_in"] = "@val_num_asc"
for (idx in nums)
print idx, nums[idx]
3 30
4 57
2 59
5 74
1 92
مثال asorti را میتوان چنین نوشت:
PROCINFO["sorted_in"] = "@ind_str_asc"
for (idx in nums)
print idx, nums[idx]
bar 59
foo 92
qux 30
این روش به ما امکان میدهد از آرایهی موقت sorted و مقدار بازگشتی n پرهیز کنیم.
مرتب و تمیز.
تابع مرتبسازی تعریفشده توسط کاربر ۴ پارامتر میگیرد: اندیس و مقدار یک عنصر آرایه و اندیس و مقدار عنصر دیگری از آرایه:
function compare(idx1, val1, idx2, val2) {...}
مقدار بازگشتی چنین است:
idx1 پیش از idx2 میآیدidx1 پس از idx2 میآیدعلاوه بر PROCINFO["sorted_in"] که ترتیب حلقهی for (idx in array) را کنترل میکند،
هر دو تابع asort و asorti هم میتوانند اسم یک تابع مقایسه را به عنوان پارامتر سوم بگیرند.