4 結構化程式設計 (Structured Programming) 二

4.5 反覆結構 (Repetition Structure):DO 迥圈(Loops)

例題 : 計算 1+2+3+...+100
       S = 0
       N = 1
    10 IF ( N .LE. 100 ) THEN
           S = S + N
           N = N + 1
       GO TO 10
       END IF
       PRINT *, S

GO TO n 敘述用以改變循序執行的次序, 移到敘述 n 執行.

前例改用DO 迥圈, 則更為簡明:

       S = 0

       DO 10 N = 1, 100
           S = S + N
    10 CONTINUE

       PRINT *, S

從DO 敘述到敘述 10 之間的所有敘述, 會被反覆執行. N 由 1 開始, 每重覆執行一次, N 增 1, 一直到 100 為止. CONTINUE 敘述是一個虛設敘述 (Dummy statement), 用以標記位置。

假如計算 2+4+6+...+100,即 N 每次增2, 則DO 敘述應改為

       DO 10 N = 2, 100, 2

DO 敘述的一般格式:

      DO [label] I = e1, e2, e3

    I   控制變數 Control variable
    e1  初值 Begin range
    e2  終值 End range
    e3  增值 Stride

設計 DO 迥圈應注意事項: 例題:
  1. VIBRAT
  2. MULT
FORTRAN 90 -- 也可使用下列格式:
    DO I = e1, e2, e3
        ...
    END DO

例題:  Sum_of_Integers

4.7 DO WHILE 敘述

迥圈的反覆執行,由測試條件控制時,使用 DO WHILE 迥圈設計比較方便。

例題 : 計算 1+2+3+...+n 的總和,總和大於 LIMIT 時,n 最小是多少?

由於控制變數的終值未知,使用 DO 迥圈設計時比較不方便。 這就要使用 DO WHILE 迥圈設計。

      PROGRAM ADDER1

      INTEGER NUMBER, SUM, LIMIT

      PRINT *, 'ENTER VALUE 1 + 2 + ... + ? IS TO EXCEED'
      READ *, LIMIT

      NUMBER = 0
      SUM = 0

* While SUM does not exceed LIMIT, increment NUMBER and add to SUM

      DO WHILE (SUM .LE. LIMIT)
          NUMBER = NUMBER + 1
          SUM = SUM + NUMBER
      END DO

      PRINT *, '1 + ... +', NUMBER, ' =', SUM, ' >', LIMIT
      END
例題:
  1. ADDER1
  2. FAIL1
注意 : 有的Fortran 編譯程式不接受 DO WHILE 敘述,就要用 IF 和 GO TO 敘述來實現。
   10    IF (SUM .LE. LIMIT) THEN
          NUMBER = NUMBER + 1
          SUM = SUM + NUMBER
          GO TO 10
      END IF
例題:
  1. ADDER2
  2. FAIL2
FORTRAN 90 -- 多重選擇可使用CASE,例如
    SELECT CASE (SCORE)
        CASE (90:100)
            PRINT * 'A'
        CASE (80:99)
            PRINT * 'B'
        CASE (70:79)
            PRINT * 'C'
        CASE (60:69)
            PRINT * 'D'
        CASE (0:59)
            PRINT * 'F'
        CASE DEFAULT
            PRINT * 'OUT OF RANGE.'
    END SELECT

4.9 後測試控制結構

前面所提迥圈的反覆執行,由測試條件控制,條件的測試是在執行迥圈主體之
  WHILE ( condition ) DO ... ENDDO
  ================================

10    CONTINUE
        IF ( .NOT. condition ) GOTO 20
        ...................
         迥  圈  主  體
        ...................
        GOTO 10
20    CONTINUE

有時候條件的測試必須在執行迥圈主體之:

  DO ... WHILE ( condition )
  ==========================

10    CONTINUE
        ...................
         迥  圈  主  體
        ...................
      IF ( condition ) GOTO 10

例題 : 計算平均誤失時間

      PROGRAM FAIL3

      INTEGER COUNT, RESPON
      REAL FAILTM, SUM, MEAN

      SUM = 0
      COUNT = 0

* Read fail times, count and sum them until there are no more

10  CONTINUE
          PRINT *, 'ENTER FAIL TIME'
          READ *, FAILTM
          COUNT = COUNT + 1
          SUM = SUM + FAILTM
          PRINT *, 'MORE (0 = NO, 1 = YES)'
          READ *, RESPON
      IF (RESPON .NE. 0) GO TO 10

* Calculate and display mean time to failure

      IF (COUNT .GT. 0) THEN
          MEAN = SUM / COUNT
          PRINT *
          PRINT *, 'NUMBER OF FAIL TIME READINGS:', COUNT
          PRINT *, 'MEAN TIME TO FAILURE:', MEAN
      ELSE
          PRINT *, 'NO FAIL TIMES WERE ENTERED.'
      END IF

      END
例題:
  1. FAIL3
  2. 使用 DO ... END DO  FAIL4

4.10 測試和除錯技巧

開發程式時可能產生的錯誤

4.11 數值方法

  1. 曲線適配 (curve fitting) 及函數近似
  2. 解方程式
  3. 微分和積分
  4. 解微分方程式
  5. 解線性系統