打破才能創新
我看到很多模板的教育
從小學就是背多分?
於是看到很多人,很多老師,很多拿到資源的都在抄襲,最後產品都一樣都沒價值
什麼Line等等,不是沒人做就是一群人做的通訊軟體
我非本科系,我全部自學,我每天在想新的方法論
我是偏科,拿不到那些什麼政府資源,拿不到那些拿外國改一改Paper work就有錢領所以需要真本事
你的課程一點意義都沒有,也就是30年前的教科書這樣寫,20年前的教科書也是這樣寫,10年前的教科書還是這樣寫。也就是如什麼C#從1.0到2.0到3.0等等你會發現內容差不多,市售書10本8本都一樣。
另外翻過來說,程式教育的目的是什麼?我去山上教學生什麼都沒有,網路很差,電腦很爛,學生素質跟家庭?
基本教程式什麼迴圈等等由學校正規老師去教即可,不用叫什麼小學幾年級就塑模
我的教法是什麼是程式,為什麼需要程式,他就是解決生活面對的事,她是一種思維。然後告訴同學什麼亮燈,亮白色..最後出題讓她們寫紅綠燈程式。我教的事看得到用的到實際的東西。現在教育寫Hello,寫三角形到底幹什麼?價值是?我也丟專案給航太系三角行式,物體位移變大變小轉彎就是什麼都寫不出來。不是飛機都可以天上飛,不是工程數學都考100分。也就是台灣的教育都在背。真的用時沒有一招拿的出來。如果國小就這樣教他們的思維就跳脫不出去。而且通訊軟體的通訊協定也不是這樣,他是由很多發行訂閱通知非常多資料結構構成
雪白西丘斯 wrote:
Swift Playgrounds...(恕刪)
遊戲是最好的教育方式
要吃牛肉不一定要養頭牛
這種互動教學很多,現在人有很多線上互動課程可以用
以前說讀書,會讀書,不斷地學校讀書拿學歷
讀書其實有形無形不只是課本一些數位媒體人與人的互動都是,怎麼快速找到要的能力也是重點課程之一
遊戲教學有一個壞處,也就是程式是解決人遇到的問題並不是只用來玩.
我用STEAM平台教,丟給學生玩,現在小朋友都很聰明很快就破關
但他們可能覺得很好玩,誰最快破關,他們可能沒思考if loop 等實際含義
我喜歡用實際案例去驗證,比如說紅綠燈,平交道,電視,冰箱等看得到,摸得到且是實際人需要的當成隨堂測驗,不會叫他們去Show 什麼 Hello World,什麼畫愛心的
也就是程式是解決問題領域的,不是只是拿來技術展示的,就跟研發展一樣,你的產品解決一項別人的問題別人會買單,你花一個很貴人家看不懂或根本就沒有這種問題的技術展示就沒用
有心很重要
但~我真的想超英趕美,怎麼想突破..我也想怎麼教新進同仁,怎麼讓整個台灣等軟體工程更強
簡單的說如果你用if else loop 從頭寫到下,坦白說五個階層就非常難理解,坦白說你寫2000行就差不多
你沒有新方式,你怎麼寫2000萬行很容易擴充很容易維護
我爸是建築工人,簡單的說蓋10樓以下的房子,只要2年的師父不用看設計圖大家都能蓋,但要建101大樓就不是那麼容易,可以畫設計稿的建築師沒有幾個人且畫出來的都是非常有價值的
台灣軟體工程就是拿外國Open Source API 敲敲打打改改,組積木隨便拼一拼而已,很多細節就不說了
至於國小教,我覺得,現在小朋友也太可憐了,以前國中課程放在小學就教,英文,數學等等,也就是大人的無能卻要期待小孩去,最後大家書讀很高,卻都不知做什麼,薪水都很低
所以什麼if else loop 還是由正規的教育體系去教
在第2課最後面提到的問題,1加到100的總和是5050,但是從方程式y = x來算三角形面積計算,卻只有5000,為什麼多出50? 這是因為1加到100並不是直接計算三角形面積,而是計算100個長條形的面積,也就是說:
1 + 2 + 3 + ⋯ + 100
= 1x1 + 2x1 + 3x1 + ⋯ + 100x1 (即每個長方形高=y, 寬=1)
所以每個長條形會多算0.5的面積,100個長條形剛好多出50的誤差,如下圖。

微積分的原理就是將長條形再細分,逐漸減少誤差,慢慢就趨近於實際三角形的面積。例如我們如果將長條形的寬從1縮短為0.5,誤差就會減半,如下圖。

這樣的面積和,相當於以下算式:
0.5x0.5 + 1.0x0.5 + 1.5x0.5 + 2.0x0.5 + ⋯ + 99.5x0.5 + 100.0x0.5
要如何用迴圈來計算呢?這次我們不用 for 迴圈,改用 Swift 另外一種 while 迴圈:
// 1-2b while loop
// Created by Heman, 2021/07/08
let 寬 = 0.5
var x = 0.0, y = 0.0, 總和 = 0.0
while x < 100.0 {
x = x + 寬
y = x
總和 = 總和 + y * 寬
print(x, 總和)
}
print(總和)
因為寬度(x軸的間隔)是固定的,因此用 let 設為常數。x, y以及總和設為變數,初始值歸零,這裡要注意用 0.0,代表實數,而不是整數 0。
接下來進入 while 迴圈:
while x < 100.0 { }
意思是「當x小於100.0時,執行 { } 裡面的指令」,注意用實數 100.0,不能用整數 100。計算結果總和是5025,誤差從50減少為25!同理,如果將程式中常數「寬」改為0.1,誤差又更小了,甚至改到0.01以下(但不能是0.0),直到誤差可以接受(例如誤差小於1)為止。

同樣的原理可以計算任何曲線的面積(近似值),例如下面的拋物線(二次方程式: y = 25 - (0.2*x - 5)2),如果要計算x從0到50範圍內,曲線與x軸所圍的面積(近似值),同樣可以用 while 迴圈來解,就當成作業。
迴圈是程式語言中最強大的指令之一,在迴圈中不管是多複雜的運算,我們想讓電腦執行100次或100億次,也不過是更動一個數字的差別而已。
不過,對初學者來說,撰寫迴圈很容易出錯,以下三個範例程式都有些「小毛病」(稱為bug臭蟲),請動手試試看,你能夠找出bug嗎?
// 1-2c Debug exercise #1
// Created by Heman, 2021/07/09
// 求1到100整數和
var 總和 = 0
for i in 1...100 {
總和 = 總和 + i
}
print(i, 總和)
1-2c: 還記得什麼叫「迴圈參數」嗎?最後一行會造成什麼錯誤?
// 1-2d Debug exercise #2
// Created by Heman, 2021/07/09
let 寬 = 0.5
var x = 0.0, y = 0.0, 總和 = 0.0
while x < 100.0 {
y = x
總和 = 總和 + y * 寬
print(x, 總和)
x = x + 寬
}
print(總和)
1-2d 程式可以執行,但是結果差一點點,不盡人意,為什麼?因為迴圈最後一次執行,x = 99.5時, 因為我們先加總,再遞增x,所以下一次 x 變成100.0 時,已經不再是 x < 100.0,達成脫離迴圈的條件,結果總和就少加了一筆。
這種稱為「邊界條件(Boundary condition)」的問題,所謂「邊界條件」指的是第一次進入迴圈以及最後一次要脫離迴圈的條件,這會影響 { } 裡面程式碼的順序或邏輯,所以寫迴圈時務必要檢查邊界條件的情況。
// 1-2e Debug exercise #3
// Created by Heman, 2021/07/09
let 寬 = 0.5
var x = 0.0, y = 0.0, 總和 = 0.0
while x < 100.0 {
y = x
總和 = 總和 + y * 寬
print(x, 總和)
}
print(總和)
1-2e 程式可以執行,但是差了關鍵的一行,結果會造成很大的問題,稱為「無窮迴圈」,也就是說,永遠達不到脫離迴圈的條件,在此例中,脫離迴圈的條件是 x 大於或等於100.0,但是 x 沒有遞增,就永遠不會大於或等於100.0。
這是 while 迴圈以及另一個 repeat 迴圈特別要注意的問題。for 迴圈因為必須先界定好範圍,比較安全,不會造成無窮迴圈。
可見迴圈雖然是重複相同的工作,但其實每一次重複都有一點點差異,而且這點差異,必須能夠累積到達脫離迴圈的條件,否則就會造成無窮迴圈,變成瞎忙空轉。
這個邏輯其實跟宇宙運行的道理一模一樣,太陽雖然每天都是從東邊升起、西邊落下,但其實每天角度都有點微小差異,就是這點感覺不到的差異,造就地球的春夏秋冬以及豐富的生態。難怪古人說:「天行健,君子以自強不息」,我們每天學點新東西,多一些小改變,就能讓自身變強變好。
所以,下次如果有人對你說:「你這個別人已經做過了」、「你這個會失敗」、「你憑什麼跟別人不一樣」⋯⋯等等,不要太在意,答案就在迴圈裡:失敗就再重複一次,只要一直累積微小的差異,就會做出不一樣的東西。不用怕,年輕就是有失敗的本錢。
在範例1-2b中,我們提到 x, y 的初始值必須為 0.0,不能用整數 0,為什麼呢?
因為在Swift程式語言中,對「資料類型」有較嚴格的規定,所謂「資料類型(Data Type)」是指資料的分類,也可稱為「資料型態」,在某些運算時,不同的類型不能混用。
Swift的資料在用 var/let 定義時,就必須決定「資料類型」,而且之後不能再改變。
Swift 有哪些資料類型呢?在第一單元的課程中,我們先學基本的5種資料類型,包括字串(String)、整數(Int)、浮點數(Float)、實數(Double)以及邏輯(Bool, 或稱布爾、布林)。
Float 與 Double 兩種類型其實都是帶小數點的實數,Float是32位元,Double是64位元(位元長度是Float兩倍,故稱Double,可精確到小數點以下15位數,比奈米級更精確,Float精確度則只到小數點6位)。
- String 字串類型
- Int 整數類型(含正負值),在64位元電腦上最大可表示19位數
- Float 浮點數類型(32位元)
- Double 實數類型(64位元)
- Bool 邏輯類型(或稱布爾類型),只有兩種值 true, false
資料的宣告與命名習慣舉例如下:
let pi: Double
var r: Int
var myName: String
var 對話: String
注意這裡變數名稱與類型名稱之間的冒號(:),在 Swift 裡面有「屬於」「從屬」的意思,如
let c: Int定義常數c屬於整數類型。
如果我們定義常數或變數時給定初始值,則根據初始值,Swift可以自動判斷類型,這時「屬於某類型名稱」可省略掉。例如:
let pi = 3.1416
var r = 200
var myName = "Angela"
var 對話 = "Hi there! This is Angela."
注意其中 let pi = 3.1416,因為我們目前用的電腦大多是64位元,所以Swift在自動判斷實數類型時,會採用 Double 類型,如果用舊型32位元電腦,則自動判定為 Float 類型。
如果要寫一個很大的數值,可以用 e 來表示10進位的次方,例如亞佛加厥數,可以寫成 6.022e23 表示 6.022 x 1023,會自動判斷為 Double 類型。
let a = 6.022e23
當資料進行 + - * / 等運算時,不同類型之間不能混合運算,這是Swift語言比較嚴格的規定,如 Int 與 Double 不能直接運算,甚至包括 Float 與 Double 之間也不能混合。
如上例 pi 是 Double 實數,r 是整數,如果要計算面積:
let pi = 3.1416
var r = 200
var 面積 = pi * r * r
則會出現「類型錯誤」,如下圖。

這時候怎麼辦?就必須人工進行類型轉換,通通轉成Double實數類型,或是通通轉成Int整數類型,如下例:
var 面積 = pi * Double(r) * Double(r) // 定義面積為Double實數類型
或
var 面積 = Int(pi) * r * r // Int(pi) ==3,會截掉小數點(無條件捨去)
注意類型轉換後,並不影響原來的變數的類型,而只是取其值來轉換。所以 pi 仍是實數 3.1416,r 仍是整數 200。
這裡的 Double(r) 看起來好像是要將 r 倍增("Double"是兩倍的意思),但其實是要取 r 的值轉換為 Double 實數類型。這是 Swift 語言稍不完美的地方,但這不能歸咎Swift,因為幾乎所有現代程式語言,都繼承了 Double 類別名稱。
字串類型的資料值(稱為value或literal)必須用雙引號 " " 括起來,其中有個特殊的用法,就是倒斜線 \ 代表要進行特殊轉換,包括:
\t 對齊到下個定位鍵 (Tab)
\n 換行
\() 取用()內的變數值或運算結果
例如
var myName = "Angela"
var myAge = 16
var 對話 = "Hi there!\nThis is \(myName).\nI'm \(myAge).\n"
print("對話")
print(對話)
注意上面的「var 對話」中, \(myAge) 會自動將整數16轉換成字串"16"。
資料類型的觀念在 Swift 程式中非常重要,但也是初學者最容易混淆的部分,可以在Swift Playgrounds上面多做實驗,嘗試錯誤。






























































































