C 教材:流程控制

前面的兩個華氏與攝氏轉換的例子,都是一次只做一個轉換。 如果我們想要在一個程式裡面做許多次轉換呢? 例如,現在我們要將華氏溫度,從 30 到 100 之間,每 5 度列出一個華氏與攝氏的對照表。 則我們需要做 15 次轉換計算,並輸出 15 行數字。 假設這個程式的原始碼叫做 f2c-straight.c

我們知道,一個 C 寫成的程式,從 main() 的第一個指令開始執行, 逐一按照次序執行 main() 裡面的指令。 所以,用一根腸子通到底的方法來寫 f2c.c,就像這樣:


#include <stdio.h>
 
/* 錯誤示範,請勿學習  (f2c-straight.c) */
main() {
    double fahr;
 
    fahr = 30;
    printf("%3.0f\t%4.1f\n", fahr, 5*(fahr-32)/9);
    fahr = 35;
    printf("%3.0f\t%4.1f\n", fahr, 5*(fahr-32)/9);
    fahr = 40;
    printf("%3.0f\t%4.1f\n", fahr, 5*(fahr-32)/9);
    fahr = 45;
    printf("%3.0f\t%4.1f\n", fahr, 5*(fahr-32)/9);
    fahr = 50;
    printf("%3.0f\t%4.1f\n", fahr, 5*(fahr-32)/9);
    fahr = 55;
    printf("%3.0f\t%4.1f\n", fahr, 5*(fahr-32)/9);
    fahr = 60;
    printf("%3.0f\t%4.1f\n", fahr, 5*(fahr-32)/9);
    fahr = 65;
    printf("%3.0f\t%4.1f\n", fahr, 5*(fahr-32)/9);
    fahr = 70;
    printf("%3.0f\t%4.1f\n", fahr, 5*(fahr-32)/9);
    fahr = 75;
    printf("%3.0f\t%4.1f\n", fahr, 5*(fahr-32)/9);
    fahr = 80;
    printf("%3.0f\t%4.1f\n", fahr, 5*(fahr-32)/9);
    fahr = 85;
    printf("%3.0f\t%4.1f\n", fahr, 5*(fahr-32)/9);
    fahr = 90;
    printf("%3.0f\t%4.1f\n", fahr, 5*(fahr-32)/9);
    fahr = 95;
    printf("%3.0f\t%4.1f\n", fahr, 5*(fahr-32)/9);
    fahr = 100;
    printf("%3.0f\t%4.1f\n", fahr, 5*(fahr-32)/9);
}

注意,在這個程式裡面,我們至少做了一個建設性的改良: 不必宣告 cels 變數,直接在 printf() 裡面計算,然後馬上輸出, 不必浪費一個變數的空間來儲存計算的結果。 以上程式的執行結果是
 30     -1.1
 35      1.7
 40      4.4
 45      7.2
 50     10.0
 55     12.8
 60     15.6
 65     18.3
 70     21.1
 75     23.9
 80     26.7
 85     29.4
 90     32.2
 95     35.0
100     37.8
看起來蠻不錯的。

但是,前面那個程式也未免太笨了一點吧? 萬一我們需要重複做這種計算七千遍,難道要寫一萬四千行那樣的原始碼嗎? 程式語言如果要這樣使用,恐怕沒有今日的電腦文明了。 我們應該很明顯地看到,前面那個程式所做的事情,重複了 15 遍, 每一遍只是 fahr 的值比前一遍增加了 5 而已。 怎樣叫 C 自己去重複 15 遍,而我們不必一五一十地寫 15 遍呢? 這就要用到 C 的流程控制 (flow control)語法結構。 這種結構,使得 C 的執行順序不再是一個接著一個地做, 有時候它會回頭重新執行某個指令, 有時候它會不執行下一個指令而跳到更後面的指令去。

流程控制的方法分成三大類:

分岔 (branching)利用 ifelse 語法結構
迭代 (iteration)利用 whilefordo 語法結構
遞迴 (recursion)利用自我呼叫的函式
我們將在後面幾節,介紹 whilefor 兩種語法結構。 其他的留待稍後再談。

習題

  1. f2c-straight.c 的輸出增加一列表頭,告訴使用者,輸出的兩行資料是什麼東西。
  2. f2c-straight.cfahr 宣告成 int, 其他不變,是否會發生錯誤?試試看結果如何。

[BCC16-C]
單維彰 (2000/03/24) ---
[Prev] [Next] [Up]