第六步驟的流程圖

對於結構化的程式來說,流程圖已經在很多地方無用武之地了,可是對於比較複雜的條件控制敘述,運用流程圖來設計還是有一定程度的幫忙,對於這種程式來說讀流程圖會比讀程式要容易,比較不會忽略掉一些可能性。以下我們逐步地設計這個轉換的流程:

 
內容

步驟 1

初步的想法:

找一個標準的範例 135 ==> 一百三十五

135 = 1*100+3*10+5, N=135, H=1, T=3, O=5

簡單分析一下轉換的規則, 發現

  1. 如果 100<=N, 就會印出 "H 百", 如果 H==0, 百位數字就都不印出
  2. 如果 10<=N<=99 , 就會印出 "T 十", 如果 T==0, 十位數字就都不印出
  3. 如果 1<=N<=9 , 就會印出 "O", 如果 O==0 不需印出個位數字

好像可以用下面流程圖來實現 (完整功能的程式是一步一步慢慢修正設計得到的, 一開始有一些錯誤不見得很糟糕)

問題:

  1. 10 ==> 十 (不好, 十就好了), 15 ==> 十五 (不好, 十五就好了)
  2. 105 ==> 一百五 (不對, 應該是一百五)

分析:

  1. 上面這個流程圖其實把H, T, O 三個位數的數值分開來想了; 對於 "H" 和 "百" 的列印是對的, 但是列印 "T" 和 "十" 的時候, 不能不考量 "H" 和 "O" 的數值
  2. 列印 "T" 和 "十" 在 1<=N<=19 和 101<=N<=119 (201<=N<=219, ...) 有特別的規則, 例如:
    05 ==> 五, 105 ==> 一百
    15 ==> 五, 115 ==> 一百一十
    所以在下一步驟裡我們檢查 H > 0 然後個自判斷

步驟 2

請特別注意因為我們用圖形來表示, 我們也特別以規律的方法來畫, 例如 N 小的畫在左邊, N 大的畫在右邊, 又特別用紅字標示每一塊所處理的 N 數值, 這樣可以很方便地檢查是不是考慮時有漏掉任何狀況, 這是為什麼像這樣比較複雜的判斷邏輯不直接寫程式碼的原因


問題: N == 0 的時候什麼都不印

問題: 許多程式碼不斷地重複

步驟 3

使用函數去除重複的程式碼

步驟 4

進一步簡化流程的方法:

上面這個流程圖還是蠻複雜的, 雖然可以確定已經考慮所有的狀況了, 可是轉換成程式還是挺複雜的, 如果不用函數的話, 會出現三層的 if 敘述

if (...)
{
    if (...)
    {
        if (...)
        {
            ...
        }
        else
        {
            ...
        }
    }
    else
    {
        ....
    }
}

讓我們再分析一下, 看能不能有更直覺的方式來設計: 其實關鍵問題只在於三種狀況

  1. 10 <= N <= 19 的時候, 不要印出 "一十" 而印 "十"
  2. H01 <= N <= H09 (101<=N<=109, 201<=N<=209, ..., 901<=N<=909) 的時候, 要多印出 "零"
  3. N==0 時印出 "零"

如此就可以再修改步驟一裡的流程圖變成下圖

概念上是不是稍微簡化一些呢? 換成程式以後會變成連續的 5 個 if 敘述, 其中第二個會是兩層的巢狀 if 敘述

請記得把列印 H, T, O 的三個部份用 switch 或是 if 寫在一個獨立函數裡

程式設計課程 首頁

製作日期: 10/06/2012 by 丁培毅 (Pei-yih Ting)
E-mail: [email protected] TEL: 02 24622192x6615
海洋大學 電機資訊學院 資訊工程學系 Lagoon