2020年11月8日 星期日

寫一些關於數學練習的程式(2)


         應該是太容易就把分數類型及轉換的程式給寫好,加料的壞習慣又來了,想說應該要有分數計算的部份才對吧!想不到這個念頭又讓自己陷入很損耗腦細胞的程式碼漩渦中…想起來很簡單自然的事情,在實現面常常都是複雜的…※不是艱難而是複雜!

趁此機會讓畫面有點樂趣
        我在這支程式的畫面中,用了許多「憤怒鳥」的圖,它是我女兒小時候很喜歡的卡通人物,※這組Angry bird的圖是取自https://snap2objects.com/ (https://creativecommons.org/licenses/by/3.0/)而程式的icon及裡頭的關於頁用的Garfield,則是我個人很喜歡的,用的圖也是我女兒小時候手繪的~




        在寫分數的加減乘除這個部份,比較費神的加減的部份,主要是因為分母通分的部份,還有讓電腦亂數出題,有可能會出一些答案是負數的,這個在小學可是不適用的…

還有,我不僅想讓程式自己出題、自己給出答案,還希望它能列出建議的計算過程,最後也能有語音講出來的功能,這些都是費功的地方,一時間開始思考分數的SOP算法是我個人的收獲…發現在這些計算中,求二數的「最大公因數」的能力非常重要,所以五年級的課程中,因數這個話題,小朋友一定要學好…

在程式中,我就要先寫一個取最大公因數的演算式才行,找了一下資料最棒的方式應該是「輾轉相除法」又稱歐幾里得算法(英語:Euclidean algorithm),而在中國則可以追溯至東漢出現的《九章算術(幾千年前的人智慧怎麼如些高呀!)

我實作出下列CODE

--求最大公因數

function gcd(m,n)

  local remainder = Math.Mod(m, n);

  while remainder ~= 0 do

   m = n;

   n = remainder;

   remainder  = Math.Mod(m, n);

   if remainder == 0 then

     break;

   end

  end

 return n;

end

--求最小公倍數

function lcm(m,n)

  local product = m*n;

  local gcd_n = gcd(m,n);

  return product/gcd_n;

end

        因為 二數乘積 = 最大公因數*最小公倍數,所以找出最大公因數後,鐵定能算出最小公倍數。在程式中需要二個數字,就把原始值送進涵數去,不過要避開0,否則程式就可能會掛掉了…

        在避開負數這個問題方面,則是善用了While迴圈:

   n2x = Math.Random(min_num, max_num);

   n3x = Math.Random(min_num, max_num);

while n2x < n3x do

   n2x = Math.Random(min_num, max_num);

   n3x = Math.Random(min_num, max_num);

  if n2x > n3x then

    break;

  end

end

在程式中若希望亂數產生的n2x必須大於n3x,就判斷一下,萬一不是這樣就進入while巡迴中重跑到合適再跳出


寫一些關於數學練習的程式(1)

 

        最近突然想到,又寫了一些跟數學相關的教學及自學程式,當然這是我一直有興趣的事,前陣子剛好家中女王提到中年級小朋友關於分數的學習問題,一時動了來寫寫相關教學程式的念頭…

寫個可以教小朋友分數程式
       分數相關的程式,我以前沒有寫過,因為處理分數「顯示」方式的問題很讓人覺得麻煩…,不過這次就玩玩看吧!頂多寫不好,又沒什麼壓力~一開始很單純的,就是希望畫面上動態地出現某個分數,讓小朋友可以去辨識是真分數、假分數或是帶分數,因為中年級的範圍好像就中有這樣,再往後一點就是假分數與帶分數的互換…對於電腦程式來說,這其實沒有什麼難度就是Math.Radom就解決了,當然花了許多功夫在分數的呈現方式上,六分之五又不能寫成5/6,雖然有點麻煩,但設計一些涵數就也解決了

認識分數的種類

分數轉換

    為了增加撰寫樂趣,我就想著若能讓這程式講話,唸出題目唸出答案,好像是不錯的點子,找到了https://soundoftext.com/ 這個網站可以讓人家輸入文字,下載成mp3所以就把預想中程式可能會說的字眼都分別存成獨立的mp3,我的策略是:要說話時就在程式中讓多個mp3音檔湊出那句話,一開始我把那些音檔一一送進播放器,問題出現了:雖然會講,但音檔與音檔在播放器交替時會有延遲,導致講話會鈍…

這是九十九的音檔波形
        怎麼解決這個問題呢?我想必須先能在送進播放器之前,將各音檔先動態合併起來,方法當然是去爬文(英文不好但又得去爬外國人說的),別跟我說用Audacity、用格式工廠、用Audio Joiner呀!這些沒用的…,我的需求是在我的程式中可以動態將多個聲波檔合併成一個聲波檔的方法,原則上就是CommandLine工具或是指令或是dll涵式庫之類的,想不到外國工程師的文中提到用Windows內建指令就行了,語法如下:> copy /b 1st.mp3+2st.mp3+3st.mp3 output.mp3
在程式中呼叫了cmd.exe來執行這樣的語法,果然可以將多個音檔合併成一個,不過很快就發現了問題,怎麼產生的mp3明明檔案大小是多個檔加起來的,但卻只唸2秒就沒了,原來這種方法合併mp3,會將mp3帶著的ID3 Tag也一起加起來,當ID3 Tag混亂的時候就會出現這種狀況…怎麼解決?想了一下午,終於…我試著用Gold wave 將所有音檔轉成同一個屬性(取樣率及位元率),這問題被解決了!

這算是寫這支程式自己學到了一點!
※要不然前一陣子都是在研究後推式的動力紙飛機怎樣才會飛




2020年9月25日 星期五

紙飛機也能STEAM

 

        去年我在https://www.kickstarter.com/ 集資平台跟隨了一個POWERUP 4.0 | Smartphone Controlled Paper Airplane 的專案,原本今年四月就可以完成,因為新冠疫情影響,整個專案的進度延後,九月份時,我拿到了這個套件…

剛從美國寄來的,我消毒後放了14天
        開箱囉!首先最重要的就是本體藍芽控制晶片及引擎,就是它讓紙飛有了超強的動力

靈魂所在,藍芽控制及馬達驅動板(設計得輕又小)

powerup 4.0是雙翼設計
        這樣就能飛了嗎?當然不行!要先有一點研究精神~首先知道一下:推出這個POWERUP 4.0專案的是一家以色列名為poweruptoys的電玩航空模型的小公司,專案發起人Shai Goitein 在這之前已有過 3 次成功集資的經驗,均以紙飛機相關產品為主題。
(圖片來源:POWERUP 4.0 飛行器集資頁面)

        與前幾代相比,POWERUP 4.0 內多加了 2 個傳感器、2 個高速馬達、1 個飛行計算儀器,因此在飛行表現上,第四代產品將有更多的動能推力,不只讓飛行更平穩,急轉彎等需求的機動性也會更高,飛高飛低、飛快飛慢都憑你心意…(話是這樣說沒錯,但根據實際經驗,操控部份還是需要一點時間來練習的)

        購買後,官方寄來的套件包中有一盒Paper Airplane Templates,裡頭是一個壓克力的桌上置放架及六種飛機折法的範本,每種範本附了二張有描線的紙可供練習,可以掃描範本紙上的ORcode會連結該飛機折法的影片…


所附的紙感覺上蠻普通的,但有印一些說明
          你會發現:「原來,折個紙飛機也是超有學問的…」,一開始就用官方附的紙來折,懂了之後到文具店買漂亮的紙來折,加上引擎後動力測試……感覺很有趣唷!室內不夠大當然沒法飛就是啦!
官方附的紙上頭有印一些花紋

自己買的紙磅數比較高比較挺
        APP連結飛加油門測試

        雖然使用原廠附的飛機模型來折肯定能飛,但我在網路上找到有人教折一台經典的長程飛機OmniWing,很令人喜愛,所以就折這個來飛飛看
這是一台翼展很寬的飛機,我使用8k的紙來折

        在這台的製作之前,其實我已經使用原廠的範例試飛過幾次,算是成功,只是在飛機的操控上,還是得多一些練習,否則不太容易達到外國人示範的長時間穩定盤旋,而且必須找到夠大的草坪,現場沒風是最好的情形…
一不小心飛機就卡在樹上了

 ★就帶個手機架,拍一下試飛的情形

其他說明:
※我在網路上看到了一段外國人的影片:Building the OmniWing Paper Airplane ,很喜歡這種形態的飛機
※又找到一段In Pursuit of a Slow Flying POWERUP Aircraft,這段影片的後半段,拍攝者在這飛機上加上了Powerup3.0在一個室內體育場館飛行,感覺很厲害的!

        所以雖然不是官方內建的飛機種類,但我著手折這種飛機來飛~



        也做了好幾種嚐試,發現並不是紙質越好的飛越好,事實上可能恰恰相反,關鍵是「重量」,這台OmniWing是三角形的寬翼機種,用A4紙來折感覺小了一點,所以我用B4及8k的紙來做,如果紙太好,重量就超重了,反而會難飛~但用輕薄的紙也有缺點,雖PowerUP套件有設計橫向支持桿,但在飛行的過程中,機翼可能太軟而承受不住!
使用好的紙,並在機翼內放入2mm的PLA棒支撐

後來發現機尾與引擎的位置如此是不行的
        這台第一次試飛的時候,「會飛」也飛得不錯,但怎麼直直向前飛去,不能轉彎呀!原來是機尾在引擎的後面,Powerup控制轉彎時,是靠兩個馬達不同的轉速來達成,結果這樣的結構無法產生效果~


後來我做了一些修改,再試!飛得可真不錯呢!

2020年7月12日 星期日

數學可以不會,但不要討厭它


        在現在全球都在熱潮中的人工智慧(Artificial Intelligence, AI)時代,對於小孩子的教育方向,美國政府最早提出了STEAM的教育理念,STEAM是由五個英文單字縮寫組成,也就是:
Science(科學)
Technology(技術)
Engineering(工程)
Arts(藝術)
Mathematics(數學)。
你應該可以發現「數學」是佔其中一項重要的指標的,但我們目前的教育環境,大多還是是以考試領導教學的,全球都在重視及培養國民理工素養,但我們這兒在教改及課程網領改革的過程中,學校的數學課時間卻減少了、國小甚至沒有電腦課程規畫,國中卻要學生寫程式…有點令人不解~
        當然囉!我只是一個小學老師,可能無法領會大教授們的教學理念遠景,在我實際的教學場域中,我儘可能帶給我所教到的小朋友正確的觀念,就像我這篇說的:「數學可以不會,但不要討厭它!」
        在我個人的教學經驗中,覺得現行教程裡五年級的數學範圍特別重要,幾何圖形面積體積、分數進階運用、因倍數、數字較複雜的計算…都在這時出現,我常跟認識的人說:五年級的數學如果學不好,國中又會惡夢重現,所以我在空暇時喜歡提出一些較需思考的數學題目,跟學生當作閒聊,「今天想不出來,明天想嘛!」又不會怎樣…有時候還會提出:這題想出來請喝飲料唷!

※哈哈,純屬娛樂
有一個重點,如果有學生算出所謂的答案,我都在要他說一下自己是怎麼想的,所以怎麼算的,有時講到一半就知道自己的算法有問題了!