S9G3 小學(xué)進退位計數(shù)器
這次以小學(xué)的進退位計數(shù)器為例,來展示用腳本按鈕來控制進位器的數(shù)珠的變化。主要使用 SetValue 與 If 來控制算珠的加減與進退位。除了腳本指令,最重要的是問題拆解的思維,讓我們用數(shù)學(xué)語言來描述現(xiàn)象。

一、將數(shù)字轉(zhuǎn)化為數(shù)珠串

說明:這節(jié)主要建立位值列表 ns={1,7,2,9} , 并且將這轉(zhuǎn)為數(shù)字 n 。同時用序列來繪制四堆數(shù)珠 nns 。
操作
ns = {1,7,2,9}
ds = {1000,100,10,1}
n = sum(ns*ds)
# 利用雙層序列來繪制數(shù)珠 nss。
nss=Sequence(Sequence(Circle((2*d,k-0.5),0.5),k,1,ns(d)),d,1,4)
# ls 水平線
ls=Sequence(Segment((0,k),(10,k)),k,0,30,5)
二、制作加減按鈕

說明:這節(jié)主要新增 +- 按鈕來用腳本控制每一串?dāng)?shù)珠的變化。
在個位?+ 的腳本為 SetValue(ns, ns+{0,0,0,1}) ,這是用 SetValue 來改變 ns 的值。其中 ns+{0,0,0,1} 為讓個位加 1。

而 - 按鈕的腳本要留意,其值不可為負。以千位的?- 腳本為例:?SetValue(ns, If(ns(1)>0,ns+{-1,0,0,0},ns))?。通過 If 判斷千位至少大于 0 時,才能對千位減 1。

步驟:
SetValue(ns, ns+{0,0,0,1})??# 個位的『+ 』腳本
SetValue(ns, ns+{0,0,1,0})??# 十位的『+?』腳本
SetValue(ns, ns+{0,1,0,0})??# 百位的『+?』腳本
SetValue(ns, ns+{1,0,0,0})?# 千位的『+?』腳本
SetValue(ns, If(ns(4)>0,ns+{0,0,0,-1},ns))??#?個位的『-』腳本
SetValue(ns, If(ns(3)>0,ns+{0,0,-1,0},ns))???#?十位的『+?』腳本
SetValue(ns, If(ns(2)>0,ns+{0,-1,0,0},ns))???#?百位的『+?』腳本
SetValue(ns, If(ns(1)>0,ns+{-1,0,0,0},ns))??# 千位的『+?』腳本
三、制作進位退位按鈕

說明:這節(jié)主要新增進退位按鈕來用腳本控制每一串?dāng)?shù)珠的變化。
以個位的進位為例,通過?SetValue(ns, ns+{0,0,+1,-10}) 可將個位少 10,十位多 1,來達到進位的效果。但要確保個位至少有 10 個數(shù)珠,才能滿十進一。因此,進位腳本要加入 If 判斷?SetValue(ns,?If(ns(4)>9,ns+{0,0,+1,-10},ns))?。
而退位的腳本也是類似,需要檢查至少有一可退位。以千位的退位為例,通過SetValue(ns,?If(ns(1)>0,ns+{-1,+10,0,0},ns))?。

步驟:
SetValue(ns,?If(ns(4)>9,ns+{0,0,+1,-10},ns))??#?個位的進位腳本
SetValue(ns,?If(ns(3)>9,ns+{0,+1,-10,0},ns))??# 十位的進位腳本
SetValue(ns,?If(ns(2)>9,ns+{+1,-10,0,0},ns))??# 百位的進位腳本
SetValue(ns,?If(ns(3)>0,ns+{0,0,-1,+10},ns))??#?十位的退位腳本
SetValue(ns,?If(ns(2)>0,ns+{0,-1,+10,0},ns))??# 百位的退位腳本
SetValue(ns,?If(ns(1)>0,ns+{-1,+10,0,0},ns))??# 千位的退位腳本
四、繪制進位退位框

說明:為了讓進退位時,顯示數(shù)珠的改變。加入序列?nds 來顯示這 10 個進位的小圓圈。而bcs 的位置利用 bdx,bdy 來記錄,并用 nd = 1,2,3,4 來切換每位的腳本。但這個進退位的 bcs 不是一直都處于顯示狀態(tài),所以需要一個真假值?backFlag 來切換其顯示。?

以百位退位為例,在百位退位按下后。先設(shè)定 nd=2, 并用?If( ns(nd)>0, ... , ...) 檢查是后可退位。若可退位,則將 backFlag 設(shè)定為 True。并同時設(shè)定 bdx = nd+1,bdy = ns(nd+1)-9。來設(shè)定 nds 的位置。其中 nds?表示十個紅色小圈,其指令為?nds=Sequence( Circle(?(2*ndx,k-0.5),0.5) , k, ndy,ndy+9) .?

以百位的進位為例,先設(shè)定 nd 為 2,接著檢查是否有滿十才能進一。若有的話,再設(shè)定 backFlag 為真。并且設(shè)定 ndx 為 nd,而 ndy 為 ns(nd)-9。來顯示將要進位的 10 個小紅圈。

接著再設(shè)定重置按鈕與數(shù)值 n ,并將 +,- 的按鈕加入 backFlag 為 False 的設(shè)定就可完成這進退位計數(shù)器。

步驟:
# 設(shè)定紅色小圈 nds 序列的相關(guān)參數(shù)?
ndx = Slider(1,4,1)
ndy = slider(1,30,1)
nds=Sequence( Circle(?(2*ndx,k-0.5),0.5) , k, ndy, ndy+9) .?
nd = Slider(1,4,1)
# 退位腳本(以百位為例?)
SetValue(nd,2)
SetValue(backFlag,If(ns(nd)>0,True,False))
SetValue(ndx,nd+1)
SetValue(ndy,ns(nd+1)+1)
SetValue(ns,If(ns(nd)>0,ns+{0,-1,+10,0},ns))
# 進位腳本(以百位為例?)
Setvalue(nd,2)
SetValue(backFlag,If(ns(nd)>9,True,False))
SetValue(ndx,nd)
SetValue(ndy,ns(nd)-9)
SetValue(ns,If(ns(nd)>9,ns+{1,-10,0,0},ns))
# + 腳本(以百位為例?)
SetValue(ns,?ns+{0,1,0,0})?#?千位的『+?』腳本
SetValue(backFlag,False))
# -?腳本(以百位為例?)
SetValue(ns, If(ns(2)>0,ns+{0,-1,0,0},ns))??#?個位的『-』腳本
SetValue(backFlag,False))
# 重置腳本
SetValue(backFlag,False))
SetValue(ns,{0,0,0,0}))
小結(jié)
此節(jié)的腳本指令較多,最想和大家分享的是問題拆解的思維。對于每個操作顯示,都要拆解為按鈕來觸發(fā)位值的改變。
在寫腳本時,要留意程式觸發(fā)的條件限制。例如,退位、進位時,要留意是否有足夠的數(shù)字可以進退位的轉(zhuǎn)化。
在顯示進退位的紅色小圈時,關(guān)鍵在于能拆解為描述紅圈的位置。
本節(jié)主要的腳本就是 setValue 與?If 的搭配使用,最重要的還是在練習(xí)用數(shù)學(xué)語言來描述現(xiàn)象,讓電腦可理解我們要它執(zhí)行的操作。
相關(guān)鏈接
【GGB】https://www.geogebra.org/classic/xtjr8wzj
【Bili】https://www.bilibili.com/video/bv1xv41177Qk
【youtube】https://www.youtube.com/playlist?list=PLXH05kw-i_5Im8iCK_hHB86v9e5E5Ewl2