陳維龍
摘要:VB是常用的程序設(shè)計語言,簡捷、易用,運(yùn)行穩(wěn)定,運(yùn)行效率較高。在數(shù)學(xué)教學(xué)中,常遇到一些邏輯復(fù)雜,個例較多,難于歸納總結(jié)的問題,教師在準(zhǔn)備與講析這些問題的時候很難找到解決思路,無所適從。筆者將這些問題通過VB編譯成程序來運(yùn)行處理,可以充分發(fā)揮計算機(jī)的優(yōu)勢,迅速解決這些數(shù)學(xué)難題。
關(guān)鍵詞:VB;窮舉法;數(shù)學(xué)問題
● 問題提出
前幾天,上小學(xué)四年級的兒子指著試卷上的一個填空題,問我怎么做,題目描述:“用4、5、6、7、8這五個數(shù)組成一個兩位數(shù)和一個三位數(shù),乘積最大是( ? ),乘積最小是( ? )”。初一看好像是很簡單的一道題,我和妻子兩個人想當(dāng)然地找出了多個組合,可馬上都被自己的新發(fā)現(xiàn)打破,百思不得其解。于是,又上網(wǎng)搜索相關(guān)問題,得出各類答案與解決方案,但都有一些缺陷,有些規(guī)則看似有用,但當(dāng)把題中的五個數(shù)字更換為其他數(shù)時,規(guī)則又不一定適用。其間,我們雖然已找到了最大值和最小值,但卻不知道是不是恰當(dāng)?shù)拇鸢浮S谑?,我想到設(shè)計一個程序,用程序來解決這個問題,并試圖在此基礎(chǔ)上找到解答此類問題的規(guī)則。
● 算法分析
此類問題,在找不出明顯的規(guī)則之前,只有通過窮舉法羅列出符合要求的全部組合,計算出每個組合的最大值與最小值,將每個組合的組合規(guī)則記錄到規(guī)則數(shù)組中,當(dāng)窮舉完所有的組合后,整理規(guī)則數(shù)組,去除重復(fù)的值,也就是組合規(guī)則,然后可以找出最大值組合與最小值組合的規(guī)律。因?yàn)榇祟愵}很少出現(xiàn)0這個數(shù),所以我設(shè)計時只用了1~9這九個數(shù),總結(jié)出來的規(guī)律可適用于有0出現(xiàn)求最大乘積的情況,求最小乘積的情況要稍作變通。描述算法如下:
①本程序通過嵌套循環(huán),從1~9這九個數(shù)中選取隨機(jī)五個不重復(fù)的數(shù),作為題干中要求的五個個位數(shù),并列出所有可能出現(xiàn)的組成一個兩位數(shù)和一個三位數(shù)的組合。
②在①循環(huán)中,每次找到符合要求的五個個位數(shù)后,將其分別填入五個文本框中,并均作如下運(yùn)算,先采用冒泡法,對這五個數(shù)進(jìn)行從小到大排序,并依次填回五個文本框中。然后對用于存放乘數(shù)、乘積及數(shù)值組合規(guī)則的四個數(shù)組進(jìn)行重定義,以便能夠存儲新得到的六個數(shù)及兩個數(shù)值組合規(guī)則。然后對剛?cè)〉玫奈鍌€個位數(shù)進(jìn)行操作,通過嵌套循環(huán),分別將任意兩個或三個組成一個數(shù),再將剩下的三個數(shù)或兩個數(shù)組成另一個數(shù),連同所得到的兩個乘積及數(shù)值組合規(guī)則一起存入數(shù)組。當(dāng)這五個個位數(shù)的所有可能組合均運(yùn)算成功并存入相應(yīng)數(shù)組后,從乘積數(shù)組中找出最大值和最小值,以及與之相對應(yīng)的兩組乘數(shù)和數(shù)值組合規(guī)則,輸出到富文本框RB1,同時將數(shù)值組合規(guī)則寫入最大值規(guī)則與最小值規(guī)則數(shù)組str_gzb()中。
③判斷①循環(huán)是否符合循環(huán)要求,如果符合,再進(jìn)入下一次循環(huán)。如果已完成所有符合要求的組合的運(yùn)算,則退出循環(huán)。
④去除規(guī)則數(shù)組str_gzb()中重復(fù)項(xiàng),統(tǒng)計出最大值和最小值的組合規(guī)則。也可以將得要的結(jié)果拷貝到Excel中,手工統(tǒng)計組合規(guī)則。
⑤數(shù)值組合規(guī)則規(guī)定如下:五個數(shù)字中最小的數(shù)所處的位置用A表示,最大的數(shù)所處的位置用E表示,其他類推。如題干中的4、5、6、7、8五個數(shù),組成一個兩位數(shù)47,其取值規(guī)則就是AD,組成一個三位數(shù)568,其取值規(guī)則就是BCE,在取值規(guī)則數(shù)組中記錄為“ADBCE”。
● VB程序設(shè)計過程
在有了比較完善的算法分析之后,我利用VB程序進(jìn)行了設(shè)計。過程為:
①在VB中建立一個工程,增加一個窗體form1。
②在窗體中添加數(shù)組控件text1(0~4)、command1、Richtextbox1等控件,并設(shè)置command1控件的Caption屬性為“開始計算!”,設(shè)置Richtextbox1控件的名稱為“RB1”,調(diào)整各控件到適當(dāng)位置。
③添加窗體load代碼,聲明所要用到的各個動態(tài)數(shù)組,在command1中添加運(yùn)算過程代碼,添加用于記錄所選取數(shù)值組合規(guī)則的過程GL的代碼。
④運(yùn)算測試,修繕程序。
⑤將工程輸出為可執(zhí)行文件。
● 源碼
利用VB程序設(shè)計完成后,所有的源代碼也一一完成,清晰地展現(xiàn)了利用此程序進(jìn)行數(shù)學(xué)運(yùn)用、算法分析的過程。部分源代碼如下。
Private Sub Form_Load()
Dim S() As Integer ? ? ?'存放乘積
Dim G(), H() As Integer ?'存放乘數(shù)一 ,乘數(shù)二
Dim Str_Gz() As String ?'存放當(dāng)前算術(shù)表述式規(guī)則
Dim str_gzb() As String ? '存放所有數(shù)據(jù)組合中最大值和最小值規(guī)則數(shù)組
Dim Str_bs As String ? ?'保存當(dāng)前算術(shù)表述式的變量
Dim Str_Gz1, Str_Gz2 As String ?'存放本次循環(huán)最大值和最小值的數(shù)值組合規(guī)則
End Sub
Private Sub Command1_Click()
Dim Ta, Tb, Tc, Td, Te As Integer ?'存放五個隨機(jī)的個位數(shù)的變量
Dim nIndex As Long ? ? ? '循環(huán)變量
Dim A, B, C, D, E, F As Integer ? ?'循環(huán)變量
ReDim str_gzb(2)
RB1.Text = RB1.Text & "所選數(shù)字 Max算式 Max規(guī)則 Max乘積Min算式 Min規(guī)則 Min乘積" & vbCrLf ? ?'設(shè)置列表的簡易列頭
For Ta = 1 To 9
For Tb = 1 To 9
For Tc = 1 To 9
For Td = 1 To 9
For Te = 1 To 9
If Ta <> Tb And Ta <> Tc And Ta <> Td And Ta <> Te And Tb <> Tc And Tb <> Td And Tb <> Te And Tc <> Td And Tc <> Te And Td <> Te Then
Text1(0).Text = Ta
Text1(1).Text = Tb
Text1(2).Text = Tc
Text1(3).Text = Td
Text1(4).Text = Te
……
ReDim Preserve str_gzb(UBound(str_gzb()) + 2) ?'不作判斷直接重定義這個數(shù)組,會增加一些空值,但不影響對數(shù)值組合規(guī)則的統(tǒng)計
str_gzb(UBound(str_gzb()) - 1) = Str_Gz1
str_gzb(UBound(str_gzb())) = Str_Gz2
……
RB1.Text = RB1.Text & "******************************************" & vbCrLf
RB1.Text = RB1.Text & "乘積最大的組合規(guī)則和乘積最小的組合規(guī)則:" & vbCrLf
For i = 0 To UBound(str_gzb) ?'此循環(huán)部分代碼借鑒網(wǎng)絡(luò)代碼,去除最值組合規(guī)則數(shù)組中重復(fù)項(xiàng)
For j = 0 To i – 1
If str_gzb(i) = str_gzb(j) Then Exit For
Next
If j = i Then RB1.Text = RB1.Text & str_gzb(i) & vbCrLf
Next
End Sub
……
Else
If N(i) = A Then GL = GL & "A" "A"表示此位置是五個數(shù)中最小的數(shù),其余類推
If N(i) = B Then GL = GL & "B"
If N(i) = C Then GL = GL & "C"
If N(i) = D Then GL = GL & "D"
If N(i) = E Then GL = GL & "E"
End If
Next i
End Function
● 運(yùn)行測試
設(shè)計完此程序后,我進(jìn)行了測試,因?yàn)檫\(yùn)算量大,程序運(yùn)行時間一般需要一個小時以上,程序也可能出現(xiàn)假死現(xiàn)象,只要耐心等待即可。運(yùn)行結(jié)果如下圖(圖片根據(jù)運(yùn)行結(jié)果進(jìn)行了拼接)。
由分析結(jié)果可以看出,此類問題的組合規(guī)則如下:將最大數(shù)作為兩位數(shù)的十位,第四大數(shù)作為兩位數(shù)的個位,將第二大數(shù)作為三位數(shù)的百位,第三大數(shù)作為三位數(shù)的十位,最小數(shù)作為三位數(shù)的個位,這樣組合出來的兩位數(shù)和三位數(shù)乘積最大;將最小數(shù)作為兩位數(shù)的十位,第三大數(shù)作為兩位數(shù)的個位,將第四大數(shù)作為三位數(shù)的百位,第二大數(shù)作為三位數(shù)的十位,最大數(shù)作為三位數(shù)的個位,這樣組合出來的兩位數(shù)和三位數(shù)乘積最小。
● 思考
作為一款經(jīng)典的高級程序設(shè)計語言,VB的生命力依然旺盛,依然可以作為中小型程序的首選語言。