المصفوفة

المصفوفة

متوسط

التعليمات

إذا أُعطيت سلسلة نصية تمثّل مصفوفة من الأعداد، فأرجِع صفوف تلك المصفوفة وأعمدتها.

إذن، إذا أُعطيت سلسلة نصية مضمَّن فيها أسطر جديدة مثل:

9 8 7
5 3 2
6 6 7

وهي تمثّل هذه المصفوفة:

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

فينبغي أن يكون الكود الخاص بك قادرًا على إنتاج ما يلي:

  • مصفوفة من الصفوف، تُقرأ كل صف من اليسار إلى اليمين بينما ننتقل من أعلى إلى أسفل عبر الصفوف،
  • ومصفوفة من الأعمدة، تُقرأ كل عمود من أعلى إلى أسفل بينما ننتقل من اليسار إلى اليمين.

صفوف مصفوفتنا في المثال:

  • 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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.