發信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信區: test
標  題: 星星流講座 0018
發信站: ☆清華電機☆ (Tue May 16 11:39:54 1995)
轉信站: star

星星流講座 0018         C 語言教室

第 4 講 之 3            基本的流程控制
                        Topic: Flow Design

再來看看比較難一點的部份:

label1:
    if (input != 0)                        ◇ 數字是否為 0 ?
    {
        scanf ("%d", &input);              □ 輸入一數字並加總
        if (input > 0)                     ◇ 數字是否小於 0?
            sum += input;
        goto label1;
    }

    sum *= 1.05;                           □ 結總並加上營業稅
 

這個地方和我們的流程圖順序不一樣,我們的流程圖順序是:
 

          □ 輸入一數字並加總 ←┬───┐
                   ↓           │ 是   │
             ◇ 數字是否小於 0?┘      │否
                   ↓否                 │
             ◇ 數字是否為 0 ? ────┘
                   ↓是

為什麼要把順序換過來呢?那是因為流程圖本身有問題。當數字小於 0 的
時候,當然是不能加總的 (錢有負值的嗎?) 。而當數字等於 0 的時候,
表示輸入完畢,就不需要再輸入了,所以我們先判斷輸入數字是否為 0,
如果為 0 那就不需要再輸入下一個了。輸入一個數字之後,判斷它的值是
否合法,然後再加總。

你也許會想到,為什麼不等全部輸入完再判斷呢?我們可以用陣列呀!
這是因為用陣列太浪費空間了。

現在相信給各位一個流程圖,你大概都能用 if-else 和 goto 來完成了,
我們比較感興趣的是:怎麼設計流程圖?

寫程式解決一個問題,可以分成五個步驟:

                        定義問題 (Requirement Collection)
                                ↓
                        分析需求 (Requirement Analysis)
                                ↓
                        程式設計 (Coding)
                                ↓
                        測試更正 (Testing and Debugging)
                                ↓
                        程式維護 (Maintainence)

我們現在要講的,就是實施前兩個步驟的一種方法。首先是定義問題:我
們要做一個收銀機的程式,它可以加總,算出總金額和找錢的數目。這是
我們寫這個程式的終極目標,所以不管怎麼樣,做出來的程式一定必須符
合這個需求。

有了需求,我們就要分析它,研究出如何做它,一個基本的方法是畫流程
圖。流程圖最常用的就是方塊和菱形,方塊代表程序,菱形代表條件判斷
和分支,只要會這兩個就可以了,其他的除非你考試要考,否則也不太用
的到 :p 我們現在就收銀機程式的需求來想想如何畫流程圖。

收銀機的行為是操作員把資料一筆一筆的輸入,輸入完之後按加總鍵算出
總金額。我們使用的鍵盤上並沒有什麼加總鍵可以利用,這時候該怎麼辦
呢?我們可以利用輸入一個不可能發生的數值來當做是加總鍵。什麼是不
可能發生的數值?那當然是小於或等於 0 的數值了,我們就挑 0 來當做
我們的加總鍵。為什麼挑 0 呢?因為所有的電腦裡處理條件跳躍都用 0
當作基準,這是比較深入一些的考量了。到目前為止,我們就可以畫出如
下的流程了:

              □ 輸入一數字 ←─┬───┐
                   ↓           │ 是   │
             ◇ 數字是否小於 0?┘      │否
                   ↓否                 │
             ◇ 數字是否為 0 ? ────┘

輸入一個數值,如果數值的值不對,那麼表示操作員操作錯誤,必須重新
輸入。那麼,輸入完的數字要存在那兒呢?這是一個問題,因為如果是正
確的數字,它就沒有儲存的必要,直接加進總金額就可以了。所以我們可
以畫流程圖如下:

          □ 輸入一數字並加總 ←┬───┐
                   ↓           │ 是   │
             ◇ 數字是否小於 0?┘      │否
                   ↓否                 │
             ◇ 數字是否為 0 ? ────┘

但是數字小於 0 時是不可以加總的,所以正確的流程圖應為:

              □ 輸入一數字 ←─┬───┐
                   ↓           │ 是   │
             ◇ 數字是否小於 0?┘      │否
                   ↓否                 │
                □ 加總                 │
                   ↓                   │
             ◇ 數字是否為 0 ? ────┘

接下來後面的東西就簡單了:

                () 開始
                   ↓
              □ 輸入一數字 ←─┬───┐
                   ↓           │ 是   │
             ◇ 數字是否小於 0?┘      │否
                   ↓否                 │
                □ 加總                 │
                   ↓                   │
             ◇ 數字是否為 0 ? ────┘
                   ↓是
           □ 結總並加上營業稅
                   ↓
          □ 要求操作員輸入收銀金額 ←┐
                   ↓                 │是
        ◇ 檢查金額是否小於應收貨款 ─┘
                   ↓否
             □ 輸出找錢金額
                   ↓
               () 結束

寫程式最大的障礙不在於技術不夠,而是在於想像力不足。所以對於解決問題,
平常就必須多多努力學習如何分析它,這才是學習程式設計最主要的課題。

發信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信區: test
標  題: 星星流講座 0021
發信站: ☆清華電機☆ (Wed May 24 23:07:41 1995)
轉信站: star

星星流講座              C 語言教室

第 4 講 之 3 補充       基本的流程控制
                        Topic: ?: operator

C 語言中為了使程式更加地精簡,增加了 ?: 這個運算子,請看下面的例子:

        if (i > 3)
            z = i - 3;
        else
            z = 0;

可以改寫成

        z = (i > 3) ? i - 3 : 0;

這個運算子是用來做條件運算式 (Conditional Expressions),它可以消去不少
麻煩的 if-else 敘述。