ماتریس

ماتریس

متوسط

دستورالعمل‌ها

فرض کنید رشته‌ای دارید که نمایانگر یک ماتریس از اعداد است. سطرها و ستون‌های آن ماتریس را برگردانید.

حالا رشته‌ای را در نظر بگیرید که در آن خطوط جدید جاسازی شده‌اند، مانند:

9 8 7
5 3 2
6 6 7

که نمایانگر این ماتریس است:

    1  2  3
  |---------
1 | 9  8  7
2 | 5  3  2
3 | 6  6  7

Code شما باید بتواند موارد زیر را بیرون بدهد:

  • فهرستی از سطرها، به این ترتیب که هر سطر از چپ به راست خوانده می‌شود و سطرها از بالا به پایین پیمایش می‌شوند،
  • فهرستی از ستون‌ها، به این ترتیب که هر ستون از بالا به پایین خوانده می‌شود و ستون‌ها از چپ به راست پیمایش می‌شوند.

سطرهای ماتریس نمونه‌ی ما:

  • 9، 8، 7
  • 5، 3، 2
  • 6، 6، 7

و ستون‌های آن:

  • 9، 5، 6
  • 8، 3، 6
  • 7، 2، 7

مفاهیم تازه‌ی AWK

این اولین تمرینی است که در آن راه‌حل یک اسکریپت «main» نیست. هدف نوشتن کتابخانه‌ای از توابع است که در دیگر برنامه‌های awk گنجانده شود. در این تمرین چند مفهوم تازه و جالب برای دیدن وجود دارد.

بخش‌های زیر که با «(gawk)» برچسب خورده‌اند، به‌طور خاص افزونه‌های GNU awk هستند.

خواندن از یک فایل

در این تمرین، داده‌ها را از یک فایل می‌خوانید، نه از جریان ورودی اصلی. درباره‌ی getline در دفترچه‌ی راهنمای GNU awk بخوانید، به‌ویژه شکل‌های Getline/File و Getline/Variable/File.

بیشتر درباره‌ی آرایه‌ها

آرایه‌ی دوبعدی می‌تواند راهی برای پیاده‌سازی این راه‌حل باشد. GNU awk دو روش برای نمایش آن دارد:

گنجاندن فایل‌ها (gawk)

به دستور @include در فایل تست توجه کنید. این دستور به gawk می‌گوید فایل نام‌برده را بخواند و ارزیابی کند.

فضاهای نام (gawk)

همه‌ی متغیرهای awk سراسری‌اند (به‌جز پارامترهای تابع که محلیِ همان تابع‌اند). احتمال برخورد نام‌ها زیاد است، به‌ویژه وقتی کتابخانه‌های شخص ثالث گنجانده می‌شوند. فضاهای نام روشی برای تفکیک محل ذخیره‌ی متغیرها هستند. به دستور @namespace در فایل‌های تمرین توجه کنید.

فضای نام پیش‌فرض «awk» نام دارد. داشتن یک فضای نام پیش‌فرض به برنامه‌نویس اجازه می‌دهد از داخل تابعی در فضایی نام دیگر، یک تابع توکار awk را فراخوانی کند.

نحوه‌ی پاس داده شدن پارامترهای تابع

پارامترهای آرایه‌ای با ارجاع پاس داده می‌شوند. تغییراتی که تابع در آرایه ایجاد می‌کند، برای فراخوانی‌کننده قابل مشاهده است.

پارامترهای غیرآرایه‌ای با مقدار پاس داده می‌شوند.

برای پارامترهای بدون نوع، به کاری بستگی دارد که تابع با آن‌ها انجام می‌دهد:

  • اگر تابع آن را به‌عنوان آرایه مقداردهی اولیه کند، به پارامتری تبدیل می‌شود که با ارجاع پاس داده شده است،
  • اگر تابع آن را به‌عنوان یک مقدار اسکالر (یک عدد یا یک رشته) مقداردهی اولیه کند، دیگر ارجاع نیست.

جزئیات کامل در دفترچه‌ی راهنما، در پاس دادن آرگومان‌های تابع با مقدار یا با ارجاع آمده است.

متغیرهای محلی

متغیرهای محلیِ تابع را می‌توان با استفاده از پارامترهای «پاس با مقدار» ساخت. پاس دادن مقدارهای کمتر از تعداد پارامترهای فهرست‌شده به یک تابع خطا نیست؛ پارامترهای اضافی تا زمانی که استفاده نشوند «بدون نوع» می‌مانند. می‌توان در تابع به آن‌ها مقدارهای اسکالری نسبت داد که در فضای نام سراسری ذخیره نمی‌شوند.

  • اگر به پارامتری مقدار اسکالر نسبت دهید، آن مقدار محلیِ تابع است.
  • اگر به متغیری اسکالر نسبت دهید که در فهرست پارامترها نام برده نشده است، آن متغیر سراسری است.

طبق قرارداد، در امضای تابع ابتدا پارامترهای مورد انتظار می‌آیند، سپس مقداری فاصله، و بعد پارامترهای محلی. برای مثال:

function add(a, b,    total) {
    # here, `typeof(total)` is "untyped"
    total = a + b
    # now, `typeof(total)` is "number"
    return total
}

BEGIN {
    sum = add(5, 10)
    print sum             # 15
    print typeof(total)   # untyped, meaning "total" is unused in this scope
}
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
AWK Exercism

آماده‌اید ماتریس را شروع کنید؟

در Exercism ثبت‌نام کنید تا AWK را همراه با 3 مفهوم92 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.