矩陣

矩陣

中等

說明

給定一個代表數字矩陣的字串,回傳該矩陣的列與欄。

例如,給定一個內嵌換行的字串:

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 專屬的擴充功能。

從檔案讀取

這個練習中,你要從檔案讀取資料,而不是從主要輸入資料流讀取。 請閱讀 Gnu awk 手冊中關於getline的說明,特別是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,透過 3 個概念92 個練習 和真人引導來學習並精通 AWK,全部免費。