以 fChart 馭 Python:運算子與運算式

作者:Ted Lee

接續著fChart系列的前文《以 fChart 馭 Python:練 fChart 了沒?》,我們將針對圖1的「10大項目之2」的27個實例(可從此處下載),從原始問題描述到以流程圖表達解法,再到對照流程圖寫出 Python 語法程式的過程詳細說明整個解題的問題解決過程。

圖 1:10 大項目之 2。

原始問題

我們試圖把會安老師編排的範例一一還原到初始的問題形式來帶領讀者們思考「問題 — 流程圖 —> 解法」一連串的問題解決(problem solving)奇幻之旅 [2]。其中,我們再將這 27 題範例細分成「變數處理、+-×/ 四則運算、數學」三大類,並在數學類中加入與 108 課綱之各科領綱的學科知識點對應 [3]。

變數處理類

  1. 更改變數值:在程式中改變變數的值。
  2. 指定成其他變數值:在程式中指定(assign)變數內容為其他變數的值。
    一般應用的時機可能會是要保留某變數的舊值(previous value)。

邏輯運算類

  1. 邏輯運算子and:二擇一的邏輯選擇判斷,如果條件 A(test > 150)「且」條件 B(count != 50) 同時滿足(test > 150 and count != 50),印出「成立」;否則,印出「不成立」。
    例如:五科總成績都及格 且 平均為 B 即可申請獎學金。註:關於且(and)、或(or)及非(not)的複合(compound)邏輯運算符號請參考 https://reurl.cc/nEZEQ6 。註:請注意它們要全部「小寫」!
  2. 邏輯運算子or:承 1,二擇一的邏輯選擇判斷,如果條件 A(test > 150) 「或」條件 B(count <= 50)有一個(含)以上的條件同時滿足時(test > 150 or count != 50),則印出「成立」;否則,印出「不成立」。
    註:讀者們請注意 or 二個字要全部小寫!

+-×/ 四則運算類

  1. 扣分程式:+ – * / 四則運算之 -。給原始分數 score 及扣分 minus,並將之相減 score – minus 。
  2. 年齡加2:+ – * / 四則運算之 +。計算兩年後的年齡 age + 2。
  3. 加法運算:+ – * / 四則運算之 +。求兩數 n1 和 n2 之和(sum) n1 + n2。
  4. 減法運算:+ – * / 四則運算之 -。求兩數之差。
  5. 除法運算:+ – * / 四則運算之 /。求兩數 n1 和 n2 之商(quotient) n1 / n2。
  6. 加法和減法:+ – * / 四則運算之 +。求兩數 n1 和 n2 之和與差(difference) n1 – n2 。
  7. 加法和除法:+ – * / 四則運算之 /。求兩數 n1 和 n2 之和 n1 + n2 與商 n1/ n3。
  8. 計算今年幾歲:輸入出生的西元年份,並計算相對應的年齡。
  9. 計算二科成績總分:輸入英文及數學成績並計算其和。
  10. 計算三科平均成績:承 9, 輸入英文、數學及電腦成績並計算其平均(average)。
  11. 執行2次不同運算元的加法:+ – * / 四則運算之 +。計算國語 C 和數學 Math 兩科的總分 Chinese + Math。數學因為題目出錯,每人都加十分 Math + 10。

數學類

  1. 長方形面積:長(length)135 單位,給定寬(width)後,自動計算出此長方形(rectangle)的面積(area) length * width 。
    註:面積的概念請參此處,它在 108 新課綱是排在國小數學教授 。
  2. 正方形面積:給邊長(side),自動計算正方形(square)面積 s * s。
  3. 圓面積:定義圓周率常數(constant)PI (編程界習慣以全大形(upper case)的英文字母來表之,請讀者們務必養成這個習慣,因為我們寫出的曠世鉅作是要來和世界各國的朋友交流的喔!)的為 3.1415926,並在程式中設定(hard code)半徑 r(radius)為 21。然後計算此圓的面積 PI * r * r。
    註:圓面積的概念在 108 新課綱是排在國中數學科教授 。
  4. 三角形面積:給三角形的底 b(base)和高 h(height),算出三角形面積 (b×h)/2。
  5. 三角形周長:給三角三個邊的邊長 a、b、c,計算出它的周長(circumference)a + b + c。
    註:周長的概念在 108 新課綱是排在國小階段教授 。
  6. 圓周長:承 5,給圓的半徑 r,計算它的半徑 2 * PI * r。
  7. 計算BMI值:給定身高 height(需以公尺計)和體重 weight後,計算出其 BMI(Body Measurement Index,身體質量指數)weight / (height * height)。
  8. 溫度轉換公式_華氏轉攝氏:給定溫度華氏(Fahrenheit) f,自動轉換為攝氏(Celsius)溫度 c = 5.0 / 9.0 * (f -32)。
    其中,為什麼公式(formula)裡頭的常數會有整數(integer)及浮點數(floating point)混雜呢?這當中要討論到程式語言的資料型別(data type)問題,我們將在下節中由轉換後的 Python 程式之執行結果來討論。
    註:溫度的概念在 108 新課綱是排在國中理化科教授。
  9. 溫度轉換公式_攝氏轉華氏:承 8,給定攝氏溫度 c,自動轉換為華氏溫度 f = (9.0 * c) / 5.0 + 32.0。
  10. 數學方程式:求 x = 5,y = 10,二元二次方程式(equation)之解。
    註:方程式的概念在 108 新課綱是排在國中數學科教授 ;二元二次方程式的概念在 108 新課綱是排在高中數學科教授 。
  11. 數學方程式2:求公式之計算結果。
    其中,Sin 裡頭的參數(parameter)計算是將 30 度轉為徑度(radian)。
    註:三角函數(trigonometric functions)的概念在 108 新課綱是排在高中數學科教授 。角度量測的度度量和徑(新課綱翻成「弧」)度量轉換公式為,也是在 108 新課綱的高中數學科教授。
  12. 數學方程式3:承 11,給定 x 和 y,求方程式之解。

流程圖符號識讀

本文的範例中使用了結構化程式設計(structural programming)的選擇結構(selective structure)。在不套疊(nested)的單層情況下,它會有判斷條件「成立」或「不成立」的抉擇。

此外,我們也可能使用複合判斷條件(且 and、或 or、非 not…)來表達某些邏輯判斷條件,例如:在圖 2 中,若菱形的判斷條件滿足時往下方的 YES 走;否則往右邊的 NO 走。

它對應的 Python 語法如下。請留意:英文半形的「:」表示以下的指令(instructions)是包在縮排(identation)(四格空白鍵(space)起首 [4])的區塊(block)中的。


1
2
3
4
5
6
if ():
   #條件成立的敘述

else:

    #條件不成立的敘述

圖 2:結構化程式設計的選擇結構

流程圖與 Python 語法對轉

變數處理類

1. 02-01.更改變數值:

因為我們在上一篇「以 fChart 馭 Python:變數與輸出輸入(2/11)」中已詳細示範如何在 fChartCodeEditor 的指令選單中選取適當的指令來產生對應的語法,因此,本節將不再贅述。

從 fChart 流程圖轉換為 fChartCodeEditor上的Python 程式碼,最後,以「02-01.更改變數值.py」存檔執行後就能看到執行結果如圖 3 所示。

註:語法選單像極了學騎腳踏車,學會了、長大了,再學騎機車,然後學開汽車。所以,學會了就會了,是時候該自己看著流程圖敲出對應指令的放飛練習了![5]

圖 3 :輸出變數值更新前、後的內容

2. 02-02.指定成其他變數值:

Python 程式碼轉換妥後以「02-02.指定成其他變數值.py」存檔執行後就能看到如圖 4 所對應的執行結果。

註:事實總是殘酷的,不是每個人一生下來就會當好爸媽的。所以,程式碼編輯有一個重要功課要修練:除錯(debug)[6]。

圖 5 中,就犯了輸出變數值之前要先用 str() 函式轉換成字串型態才合法的疏忽(當然,這是我們自己人工輸入的錯誤,從語法選單中選擇指令就不會出現這個錯誤)。

圖 4 :輸出變數值重新指定前、後的內容

圖 5:錯中學。

邏輯運算類

1. 02-03.邏輯運算子and:

Python 程式轉換妥後以「02-03.邏輯運算子and.py」存檔執行後就能看到如圖 5 所對應的執行結果。

圖 6:複合邏輯「且」判斷條件式。

2.02-04.邏輯運算子or:

Python 程式轉換妥後以「02-04.邏輯運算子or.py」存檔執行後就能看到如圖 7 所對應的執行結果。註:流程圖中 test 和 count 兩變數的值是寫死在程式開頭,讀者們可自行甞試改成由鍵盤手動敲入。要注意型別轉換的問題喔!

圖 7:複合邏輯「或」判斷條件式。

+-×/ 四則運算類

1.02-05.扣分程式:

Python 程式轉換妥後以「02-05.扣分程式.py」存檔執行後就能看到如圖 8 所對應的執行結果。

圖 8:- 運算。

2. 02-06.年齡加2:

Python 程式轉換妥後以「02-06.年齡加2.py」存檔執行後就能看到如圖 9 所對應的執行結果。

3.02-07.加法運算:

Python 程式轉換妥後以「02-07.加法運算.py」存檔執行後就能看到如圖 10 所對應的執行結果。

圖 10:計算兩數之和。

4.02-08.減法運算:

Python 程式轉換妥後以「02-08.減法運算.py」存檔執行後就能看到如圖 11 所對應的執行結果。

圖 11:計算兩數之差。

5.02-09.除法運算:

Python 程式轉換妥後以「02-09.除法運算.py」存檔執行後就能看到如圖 12 所對應的執行結果。

註:會算商和餘數就可以試著寫寫看最大公因數、最小公倍數、中國餘式定理…等密碼學(Cryptography)基的礎「商餘問題」。

圖 12:計算兩數之商。

6. 02-10.加法和減法:

承 3 和 4,本題的差異只是改從鍵盤輸入兩個值做計算。Python 程式轉換妥後以「02-10.加法和減法.py」存檔執行後就能看到如圖 13 所對應的執行結果。

圖 13:使用者輸入兩數的 + 和 – 計算。

7. 02-11.加法和除法:

承 3 和 5,Python 程式轉換妥後以「02-11.加法和除法.py」存檔執行後就能看到如圖 14 所對應的執行結果。

圖 14:兩數的 + 和 / 計算。

9. 02-27.計算今年幾歲:

Python 程式轉換妥後以「02-27.計算今年幾歲.py」存檔執行後就能看到如圖 15 所對應的執行結果。

圖 15:計算年齡。

10. 02-25.計算二科成績總分:

Python 程式轉換妥後以「02-25.計算二科成績總分.py」存檔執行後就能看到如圖 16 所對應的執行結果。

圖 16:計算英文和數學兩科總分。

11. 02-26.計算三科平均成績:

承 10,Python 程式轉換妥後以「02-26.計算三科平均成績.py」存檔執行後就能看到如圖 17 所對應的執行結果。

圖 17:計算英文、數學和電腦三科總分。

12. 02-12.執行2次不同運算元的加法:

承 3,本題是變數 Chinese + Math 計算完後再讓 Math +10,Python 程式轉換妥後以「02-12.執行2次不同運算元的加法.py」存檔執行後就能看到如圖 18 所對應的執行結果。

註:細心的讀者們應該有發現:數學的送分應在國語和數學加總之前才對!

圖 18:不同運算元的加法運算。

數學類

1. 02-13.長方形面積:

將 Python 程式轉換妥後以「02-13.長方形面積.py」存檔執行後就能看到如圖 19 所對應的執行結果。

圖 19:計算長方形面積。

2. 02-14.正方形面積:

將 Python 程式轉換妥後以「02-14.正方形面積.py」存檔執行後就能看到如圖 20 所對應的執行結果。

圖 20:計算正方形面積。

3. 02-15.圓面積:

將 Python 程式轉換妥後以「02-15.圓面積.py」存檔執行後就能看到如圖 21 所對應的執行結果。

圖 21:計算圓形面積。

4. 02-16.三角形面積:

將 Python 程式轉換妥後以「02-16.三角形面積.py」存檔執行後就能看到如圖 22 所對應的執行結果。

圖 22:計算三角形面積。

5. 02-17.三角形周長:

將 Python 程式轉換妥後以「02-17.三角形周長.py」存檔執行後就能看到如圖 23 所對應的執行結果。

圖 23:計算三角形周長。

6. 02-18.圓周長:

將 Python 程式轉換妥後以「02-18.圓周長.py」存檔執行後就能看到如圖 24 所對應的執行結果。

圖 24:計算圓周長。

7. 02-19.計算BMI值:

將 Python 程式轉換妥後以「02-19.計算BMI值.py」存檔執行後就能看到如圖 25 所對應的執行結果。

圖 25:計算 BMI 值。

9. 02-20.溫度轉換公式_華氏轉攝氏:

將 Python 程式轉換妥後以「02-20.溫度轉換公式_華氏轉攝氏.py」存檔執行後就能看到如圖 26 所對應的執行結果。

註:本題可做兩項實驗來觀察 Python 的型別處理。

如圖 27所示,我們可以很容易地觀察出在轉換公式的計算過程中,為了保留計數結果的精確性,Python會自動取浮點數來儲存計算的中繼結果。
所以, 華氏212度轉換為攝氏後的結果為 100.0。另一方面,眼尖的讀者們可能會問道:為什麽FlowProgramming_Edit的執行結果卻是完整的整數呢?
因為它是用 Visual Basic(VB)來執行的,不同程式語言對型別的處理可能會有差別。

圖 26:華氏轉攝氏。

圖 27:型別的實驗。

10. 02-21.溫度轉換公式_攝氏轉華氏:

承9,將 Python 程式轉換妥後以「02-21.溫度轉換公式_攝氏轉華氏.py」存檔執行後就能看到如圖 28 所對應的執行結果。

圖 28:攝氏轉華氏。

11. 02-22.數學方程式:

承 9,將 Python 程式轉換妥後以「02-22.數學方程式.py」存檔執行後就能看到如圖 29 所對應的執行結果。註:變數 x 的冪次方(power)在 Python 中是以「x ** 次方」 來表示。

圖 29:計算二元二次方程式的值 1。

12. 02-23.數學方程式2:

將 Python 程式轉換妥後以「02-23.數學方程式2.py」存檔執行後就能看到如圖 30 所對應的執行結果。

其中,因為方程式中有用到 sin() 函式,而它已定義在 Python 的 math 模組裡,所以,需要用 import 關鍵字來將之引入,如圖 31 所示。

圖 30:計算方程式的值。

圖 31:數學模組及其相關函式。

12. 02-24.數學方程式3:

承 11,將 Python 程式轉換妥後以「02-24.數學方程式3.py」存檔執行後就能看到如圖 32 所對應的執行結果。

圖 32:計算二元二次方程式的值 2。

補充說明

  • 六種授權條款
  • 感謝不具名之數學顧問大力協助。
  • 很多人都說:「…根據 108 課綱…」,試問有真正去把它的內容翻出來細看過的有幾人?在論文寫作中,強調出處引用(citation)。然而,若教育工作者或研究者,沒人會想去面對這一連串冰冷的專業文字吧?
  • Python 語言的縮排方式有四個(或以上)空白鍵或定位鍵(tab)。此外,縮排的方式更是要一致,也就是說:不能混用!筆者在國中教授 Python 時看到為數不少的學生們不斷的犯此「縮排錯誤(identation error)」(區塊內的指令縮排方式凹凹凸凸),也許和他們這個世代強調「個人自由」而不喜被死板板的教條約束有關吧?
  • 會安老師精編的「fChart 150例」愈練愈會有一種感覺:能很快從流程圖的結構轉換成 Python 語法,即使不一定了解程式在做什麼。這就是初練內功的感覺!
  • 常常聽到初學者說:「我都照著 xxx 打的程式,(我)應該不會錯才對!」程式是誰打的?(你)、為什麼隔壁同學一樣看著 xxx 打就可以成功執行,你就不行?──從程式編輯中學謙卑。程式錯的機會小,人錯的機會大(很多)!

(作者為本刊專欄作家,本文同步表於作者部落格,原文連結;責任編輯:謝涵如)

 

Ted Lee
Ted Lee

Author: Ted Lee

從工程師轉任中學教師,又為了捍衛教育理念,投身成為 STEAM 教育工作者,自稱「無可救藥的人文教育理想主義者」的李俊德(Ted Lee)。

Share This Post On

Submit a Comment

發佈留言必須填寫的電子郵件地址不會公開。