發信人: 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 敘述。