Треки
/
AWK
AWK
/
Вправи
/
Матриця
Матриця

Матриця

Середня

Вказівки

Маємо рядок тексту (англ. string), який представляє матрицю чисел. Повернімо рядки та стовпці цієї матриці.

Отже, якщо маємо рядок тексту із вбудованими символами нового рядка, як ось:

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 зсередини функції в іншому просторі імен.

Як передаються параметри функцій

Параметри-масиви передаються за посиланням. Зміни, зроблені з масивом у функції, видно тому, хто викликав функцію.

Параметри, що не є масивами, передаються за значенням.

Для нетипізованих параметрів усе залежить від того, що функція з ними робить:

  • якщо функція ініціалізує його як масив, він стає параметром, переданим за посиланням;
  • якщо функція ініціалізує його як скалярне значення, тобто число або рядок тексту (англ. string), то це не посилання.

Повні подробиці можна знайти в посібнику, у розділі Передавання аргументів функції за значенням або за посиланням.

Локальні змінні

Локальні (у межах функції) змінні можна створити, використовуючи параметри, що передаються «за значенням». Не є помилкою передати у функцію менше значень, ніж кількість перелічених параметрів; зайві параметри залишаються «нетипізованими», доки їх не використають. Вони доступні для присвоєння скалярних значень у функції, які не зберігаються в глобальному просторі імен.

  • Якщо присвоїти параметру скалярне значення, воно локальне для функції.
  • Якщо присвоїти скаляр змінній, не названій у списку параметрів, ця змінна глобальна.

За домовленістю в сигнатурі функції спочатку йдуть очікувані параметри, потім пропуск (пробільні символи), а далі локальні параметри. Приклад:

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 вправи та справжнє наставництво від людей, і все це безкоштовно.