7 一維陣列

在許多場合中,往往必需處理一組資料。 這組資料中每一項的性質和型式都相同。 FORTRAN 提供一種結構化資料型式 -- 陣列,處理這一類資料。

7.1 註標變數

由於陣列儲存多項資料,而一個陣列只用一個名稱。 為了使用陣列的個別資料,在陣列名稱 之外,還得另一數表示在陣列中的位置,此數即稱為註標 (subscript)。 使用註標的變數,稱為註標變數 (subscripted variable)。 一個陣列只含一個註標的,稱為一維陣列。

變數使用註標時,將註標括在括弧中,列在其名稱之後。 例如,一班各個學生的成績用陣列 SCORE 表示,則其中第三位學生的成績可用 SCORE(3) 表示。 註標可以是整常數,整變數或陳式 (expression)。

陣列宣告

使用陣列之前,必須宣告陣列的大小,即註標的最大值。
宣告陣列用 DIMENSION 敘述,其形式如下

       DIMENSION a1(l1:u1), ... an(ln:un)

式中 li, ui 為整常數, li 表示 註標的最小值,而 ui 表示最大值。 假如 li 為 1, 則 li: 可省略。

例如,假設全班人數有50人,則陣列 SCORE 應宣告如

      DIMENSION SCORE(1:50)
      REAL SCORE

DIMENSION SCORE(50) REAL SCORE

也可簡略為

      REAL SCORE(1:50)

REAL SCORE(50)

7.2 陣列的輸入和輸出

陣列的輸入和輸出,可採用三種方式
  1. 使用 DO 迴圈
  2. 使用陣列名稱
  3. 使用隱式 DO 迴圈

使用 DO 迴圈

      INTEGER LIMIT
      PARAMETER(LIMIT = 50)
      REAL SCORE(LIMIT)
      INTEGER I

      DO 10 I = 1, LIMIT
         READ *, SCORE(I)
   10 CONTINUE

例題: VLIST1(List of Velocities -- version 1) (source)

使用陣列名稱

      READ *, SCORE

例題: VLIST2(List of Velocities -- version 2) (source)

使用隱式 DO 迴圈

IO 串列使用 DO 迴圈的結構表示,如
      READ *, ( SCORE(I = 1, LIMIT) )

注意,IO 串列要括在括弧中。

例題 : VLIST3(List of Velocities -- version 3) (source)

7.3 例題: Processing a list of Failure Times

FAIL (source)

7.4 陣列的處理

指定數值

指定數值給陣列時,由於陣列包含一組資料,每一項資料必須個別指定數值。

例如,

      DO 10 I = 1, 30
         NUMBER(I) = I ** 2
   10 CONTINUE

陣列的初值可使用 DATA 敘述,在編譯階段予以指定。

例如,

      REAL ALPHA(10)
      DATA ALPHA /5*0.0, 4*2.5, 3.8/

隱式 DO 迴圈也可用於 DATA 敘述的變數串列。例如,

      INTEGER N, I
      REAL ALPHA(10)
      DATA N, (ALPHA(I), I=3, 7) /10, 5*0.0/

當做引數

副程式可以使用陣列做為引數。 不過實際引數和形式引數,都必須有陣列宣告。

例如,

      INTEGER LIMIT
      PARAMETER (LIMIT = 50)
      REAL ITEM(LIMIT), MEAN
      INTEGER NUM, I

      PRINT *, 'ENTER NUMBER OF ITEMS AND THE ITEMS'
      READ *, NUM, (ITEM(I), I = 1, NUM)
      PRINT 100, NUM, MEAN(ITEM, NUM)    <-- ITEM 是實際引數
100   FORMAT(1X, 'MEAN OF THE ', I3, ' NUMBERS IS ', F6.2)
      END

      FUNCTION MEAN(X, N)      <-- X 是形式引數

      INTEGER XLIMIT
      PARAMETER (XLIMIT = 50)
      REAL MEAN, X(XLIMIT), SUM
      INTEGER N, I

      SUM = 0
      DO 10 I = 1, N
          SUM = SUM + X(I)
10    CONTINUE
      MEAN = SUM / REAL(N)
      END

例題: Calculating the mean of a list

  1. fixed dimensions
    AVE1 (source)
  2. adjustable dimensions
    AVE2 (source)

COMMON 中的陣列

假設在一程式單元中用
      REAL A(5)
      COMMON A

而在另一程式單元中用

      REAL ALPHA(5)
      COMMON ALPHA

COMMON 敘述分配共用區的前五個位置,給陣列 A 和 ALPHA。 換句話說,陣列名稱不同, 但是記憶位置同。

7.5 例題

  1. Frequency Distribution and Bar Graphs
    1. generating a frequency distribution:  FREQ1 (source)
    2. generating a bar graph:  FREQ2 (source)
  2. Averages of Grouped Data:  ROCKET (source)

7.6 向量處理

向量具有二種屬性:量值(magnitude)和方向

向量表示法

向量在平面或三維空間可用有方向性的線段表示。 線段的長度代表向量的量值, 而其定向(orientation) 代表向量的方向。

採用直角座標制時, 平面上的向量 a 可用在 x 和 y 座標軸的分量(component) (ax ay)表示。 一般的多維向量可用 (a1, a2, ... , an) 表示, ai 表示在 i 座標軸的分量。 FORTRAN 處理向量時, 可用一維陣列表示。

向量運算

  量值的計算

      FUNCTION NORM(A, ARRDIM, N)

      INTEGER ARRDIM, N, I
      REAL NORM, SUM, A(ARRDIM)
      SUM = 0.0
      DO 10 I = 1, N
         SUM = SUM + A(I)**2
   10 CONTINUE
      NORM = SQRT(SUM)
      END

  向量的加減

      SUBROUTINE VECSUM(A, B, ARRDIM, N, C)

      INTEGER ARRDIM, N, I
      REAL A(ARRDIM), B(ARRDIM), C(ARRDIM)

      DO 10 I = 1, N
         C(I) = A(I) + B(I)
   10 CONTINUE
      END

兩向量 A 和 B 相加, 和向量為 C。 兩向量相減, 將上述副程式中 + 號改為 - 號即可。 略為修改上述副程式, 也可處理純量和向量相乘。

7.7 排序和搜尋

排序(sorting)

將一串列中的項目,按照遞增或遞減的次序重新排列。

例題: simple selection sort
SORTER (source)

搜尋(searching)

在一堆資料中,尋找特定的項目及其相關資訊。
  1. linear search
    從串列的第一項開始,逐項尋找,一直到找到或找遍為止。
  2. binary search
    先檢查串列的中央項,假如不是所要的項目,再從前半或後半。 重複此程序,一直到找到或找遍為止。 注意,使用此方法,串列中的項目必須已經排序過。
例題: binary search
CHEM (source)

FORTRAN 90 特色

  1. 一陣列可指定給另一陣列, 如 A = B
  2. 陣列初值的指定可以是一組數值或隱式 DO 迴圈,例如
        A = (/ 1,2,3,4,5,6,7,8.9.10/ )
        A = (/ I, I = 1, 10 /)
        A = (/ 1, (I, I = 2, 9), 10 /)
    
    
  3. 運算子和函數可應用在陣列,例如
        A = A + B
        D = 2 * ABS(B) + 1
        P = (C > 0) .AND. (MOD(B, 3) = 0)