歡迎來到問題分析!

在程式設計師寫下第一行程式碼之前,他們必須先做一件非常重要的事:理解問題。這就像砌樂高模型一樣。你在組裝積木前,總得先看看盒子上的圖案,搞清楚你要做的是什麼,對吧?

這一章節,我們將學習如何從複雜混亂的現實問題中,抽絲剝繭,找出電腦解決問題所需的關鍵資訊。這可是演算法與程式設計旅程的第一步!

1. 識別並移除不必要的細節

現實生活中的問題往往充滿了「雜訊」——這些資訊聽起來很有趣,但對電腦解決問題卻毫無幫助。這種過濾雜訊的過程,我們稱為抽象化(Abstraction)

「地圖」的比喻

想像一下你正在看一張社區地圖。它會顯示每一棵草或每個人家門的顏色嗎?當然不會!那樣太雜亂了。它只會顯示你找到路所需的道路和地標。這就是抽象化:保留重要的部分,捨棄其餘無關的細節。

例子:
假設你要編寫一個程式來計算雜貨店購買蘋果的總金額。
「陳伯伯以每個 2 元的價格販售紅蘋果。他經營這家店已經 40 年了,而且他戴著一頂藍色帽子。如果學生買了 5 個蘋果,他們要付多少錢?」

不必要的細節:
- 陳伯伯的名字和他經營多久了。
- 他帽子的顏色。
- 買家是學生的這個事實。

必要的細節:
- 蘋果的單價(\( \$2 \))。
- 購買的蘋果數量(5 個)。

重點總結:

隨時問自己:「這段資訊會改變最終結果嗎?」如果答案是「不會」,那它就是不必要的細節!


2. 指定輸入(Inputs)

輸入(Input)是指傳送到系統或程式中進行處理的資料。把它想像成烹飪食譜所需的「原始食材」。

有效輸入的要求

電腦不像人類那麼聰明;它們需要準確知道預期的是什麼樣的資料。如果你在電腦預期「數字」時輸入了「文字」,它可能會當機!為了防止這種情況,我們需要定義有效輸入的要求(Requirements for valid inputs)

常見要求:
1. 資料型態(Data Type):它是整數(Integer)、小數(Float)還是文字(String)?
2. 範圍(Range):對於「年齡」輸入,數值應該要在 0 到 120 之間。
3. 格式(Format):對於「日期」輸入,應該是 DD/MM/YYYY 還是 YYYY-MM-DD

如果一開始覺得很難,別擔心!只要記住:有效輸入就是「乾淨」的資料,讓程式在不崩潰的情況下就能實際運作。


3. 指定輸出(Outputs)

輸出(Output)是電腦處理輸入資料後產生的資訊。這就像食譜比喻中「做好的料理」。

正確輸出的要求

程式給出答案並不代表它一定是正確的答案。我們必須指定什麼才算是正確的輸出。

例子:成績評定程式
- 輸入:學生成績(例如:75)。
- 處理:檢查成績是否 \( \geqslant 50 \)。
- 正確輸出:「及格」(如果成績為 50 分或以上)或「不及格」(如果成績低於 50 分)。
- 錯誤輸出:如果成績 20 分程式卻顯示「及格」,那這個輸出就是錯誤的,因為它沒有遵循規則。

重點總結:

輸入是你給電腦的東西;輸出是電腦回饋給你的結果。兩者都必須遵循嚴格的規則才具有參考價值。


4. 融會貫通:IPO 模型

要記住如何分析問題,一個簡單的方法就是使用 IPO 模型。這能幫助你在設計演算法前理清思緒。

I - 輸入(Input):我們需要什麼資料?
P - 處理(Process):我們如何處理這些資料?(邏輯/運算)
O - 輸出(Output):最終結果是什麼?

記憶小撇步:想像一台榨汁機
輸入:柳橙。
處理:擠壓與過濾。
輸出:柳橙汁。


快速複習箱

1. 抽象化:移除不必要的細節,專注於重要事項。
2. 有效輸入:符合特定規則的資料(例如正確的型態或範圍)。
3. 正確輸出:能精確反映問題邏輯的結果。
4. 常見錯誤:納入與計算無關的「故事性」細節(例如名字或顏色)。


你知道嗎?

軟體出現 Bug 最常見的原因通常不是因為程式寫得不好,而是因為問題分析做錯了!如果程式設計師沒有正確識別「有效輸入」的需求,當使用者輸入意想不到的內容時,程式就可能會失效。永遠記得:先分析,後編碼!