C 教材:雙足標序列 (double array)

在數學語言中,序列其實就是一個向量。 向量中的每個元素又稱為分量。 在概念上,向量與序列,有以下三點不同:

  1. 向量的元素通常是實數或複數,序列的元素則是電腦中的資料型態。
  2. 一個 N 維的向量或序列,有 N 個分量。 在數學語言中,向量的分量足標可以是任意範圍的整數,但在 C 語言中, 序列的分量足標必須從 0N-1
  3. 在數學概念上,向量總是直立的,又稱為行向量 (column vector)。 在 C 語言的概念中,序列並無直立或橫躺的分別。試情況需要, 我們可以想像序列是行向量或是列向量 (row vector)。

在數學語言中,雙足標序列其實就是一個矩陣。 雙足標序列相對於矩陣,也有類似序列相對於向量那樣的不同。 但是這些小不同,並不影響大體的概念對應。 所以,從此以後,我們就認為序列即向量 (行向量或列向量都可能) 一范 MN 行的矩陣,又稱 MN 矩陣, 可以想像是由 NM 維的行向量所組成, 或是由 MN 維的列向量所組成。 以下程式設定了一個 3x4 的矩陣,名叫 A:

1 2 3 4
5 6 7 8
9 8 7 6
並且輸出它的第一列、第三行、主對角線的元素。
#include <stdio.h>
    
/* 示範一個矩陣  (test-matrix.c) */
#define M 3
#define N 4

main() {
    int i, j, A[M][N]={1,2,3,4,5,6,7,8,9,8,7,6};
    
    printf("The first row is: ");
    for (i=0, j=0; j<N; ++j)
        printf("%3d", A[i][j]);
    putchar('\n');
    printf("The 3rd column is: ");
    for (i=0, j=2; i<M; ++i)
        printf("%3d", A[i][j]);
    putchar('\n');
    printf("The main diagonal is: ");
    for (i=0, j=0; i<M && j<N; ++i, ++j)
        printf("%3d", A[i][j]);
    putchar('\n');
}   

從以上的範例,我們看到,在宣告的階段, A[M][N] 就宣告了一個 MN 矩陣, 而且在宣告指令中,可以順便定義矩陣的值。 定義的方法,是按照列的順序,稱為列導向 (row oriented), 依序寫出元素的值。 就如同序列一樣,矩陣元素的足標必須從 0 開始。 所以數學語言所謂的第一列,在 C 是 0 號列; 數學說的第三行,在 C 是 2 號行; 數學說的 a24 8素,在 C 是 A[1][3]。

也如同序列一樣,C 語言不會替您檢查輸入的元素個數是不是與矩陣的宣告個數一樣多。 例如一個 3x4 的矩陣共有 12 個元素,如果您定義了 9 個數值, 則剩下三個矩陣元素沒有定義, 它們是 A[2][1], A[2][2], A[2][3]。 如果您定義了 15 個數值,則前 12 個定義給了矩陣 A, 但是多出來三個則依序佔用了後續的記憶體。 故不得不慎。

習題

[BCC16-C]
單維彰 (2001/02/22) ---
[Prev] [Next] [Up]