前段時間,女兒所在的學校要求家長每天都要給孩子出一些加減法的數學題,讓孩子練習。作爲會一點程序設計的我來說,總想偷一些懶,於是製作了以下程序。
程序窗口,如下所示。
具體源代碼如下:
首先,在表單Form1的 init 事件中, 加入以下代碼
CLOSE TABLES ALL
THISFORM.spinner1.VALUE=0
THISFORM.spinner2.VALUE=10
THISFORM.optiongroup1.VALUE=1
THISFORM.optiongroup1.INTERACTIVECHANGE
WITH THISFORM.list1
.BOUNDCOLUMN=1
.COLUMNWIDTHS='100'
.COLUMNCOUNT=1
.COLUMNLINES=.T.
.ITEMTIPS=.T.
.ROWSOURCETYPE=6
.ROWSOURCE=""
ENDWITH
THISFORM.spinner1.VALUE=0
THISFORM.spinner2.VALUE=10
THISFORM.optiongroup1.VALUE=1
THISFORM.optiongroup1.INTERACTIVECHANGE
WITH THISFORM.list1
.BOUNDCOLUMN=1
.COLUMNWIDTHS='100'
.COLUMNCOUNT=1
.COLUMNLINES=.T.
.ITEMTIPS=.T.
.ROWSOURCETYPE=6
.ROWSOURCE=""
ENDWITH
第二,在單選按鈕組Optiongroup1的 InteractiveChange 事件中,加入以下代碼
THISFORM.list1.ROWSOURCE=""
IF USED("_temp")
USE IN _temp
ENDIF
m=THIS.VALUE
s=""
DO CASE
CASE m=1
s="和的最大值"
CASE m=2
s="被減數的最大值"
CASE m=3
s="積的最大值"
CASE m=4
s="被除數的最大值"
CASE m=5
s="以內的加減法"
CASE m=6
s="以內的乘除法"
CASE m=7
s="和的最大值"
CASE m=8
s="被減數的最大值"
ENDCASE
THISFORM.label2.CAPTION=s
IF USED("_temp")
USE IN _temp
ENDIF
m=THIS.VALUE
s=""
DO CASE
CASE m=1
s="和的最大值"
CASE m=2
s="被減數的最大值"
CASE m=3
s="積的最大值"
CASE m=4
s="被除數的最大值"
CASE m=5
s="以內的加減法"
CASE m=6
s="以內的乘除法"
CASE m=7
s="和的最大值"
CASE m=8
s="被減數的最大值"
ENDCASE
THISFORM.label2.CAPTION=s
第三,“生成試題”命令按鈕Command1的 Click 事件中加入以下代碼
m1=THISFORM.optiongroup1.VALUE
m2=THISFORM.spinner1.VALUE &&數量
m3=THISFORM.spinner2.VALUE &&最大數
m4=LEN(ALLT(STR(m3))) &&最大數的位數
m4=IIF(m3=10,1,m4)
IF USED("_temp")
USE IN _temp
ENDIF
CREATE CURSOR _temp (nn1 c(30),nn2 c(30),nn3 c(30))
SELE _temp
THISFORM.list1.ROWSOURCE="_temp.nn1"
DO WHILE RECC()<m2
k1=INT(RAND()*m3)
k2=INT(RAND()*m3)
DO CASE
CASE m1=1 && 兩數的加法
IF k1>=0 AND k2>=0 AND k1+k2<=m3
s=STR(k1,m4)+"+"+STR(k2,m4)
APPE BLAN
REPL nn1 WITH s
ENDIF
CASE m1=2 && 兩數的減法
IF k1>=0 AND k2>=0 AND k1-k2<=m3 AND k1-k2>=0
s=STR(k1,m4)+"-"+STR(k2,m4)
APPE BLAN
REPL nn1 WITH s
ENDIF
CASE m1=3 && 兩數的乘法
IF k1>0 AND k2>=0 AND k1*k2<=m3
s=STR(k1,m4)+"×"+STR(k2,m4)
APPE BLAN
REPL nn1 WITH s
ENDIF
CASE m1=4 && 兩數的除法
IF k1>0 AND k2>0 AND INT(k1/k2)=k1/k2 &&注意除數不能爲0
s=STR(k1,m4)+"÷"+STR(k2,m4)
APPE BLAN
REPL nn1 WITH s
ENDIF
CASE m1=5 &&加減混合
k01=MOD(INT(RAND()*100),2) &&兩次運算的符號
k02=IIF(k01=0,1,0) &&兩次運算符號相反
IF k01=0 &&加法
k41=k1+k2
k3=INT(RAND()*k41)
k42=k41-k3
s=STR(k1,m4)+"+"+STR(k2,m4)+"-"+STR(k3,m4)
ELSE
k41=k1-k2
k3=INT(RAND()*m3)
k42=k41+k3
s=STR(k1,m4)+"-"+STR(k2,m4)+"+"+STR(k3,m4)
ENDIF
IF k1>0 AND k2>=0 AND k41>=0 AND k42>=0 AND k41<=m3 AND k42<=m3 AND k2+k3<>0
APPE BLAN
REPL nn1 WITH s
ENDIF
CASE m1=6 &&乘除混合
EXIT
CASE m1=7 &&三數連加
k3=INT(RAND()*m3)
s=STR(k1,m4)+"+"+STR(k2,m4)+"+"+STR(k3,m4)
IF k1>0 AND k2>=0 AND k3>=0 AND k1+k2+k3<=m3 AND k2+k3<>0
APPE BLAN
REPL nn1 WITH s
ENDIF
CASE m1=8 &&三數連減
k3=INT(RAND()*m3)
s=STR(k1,m4)+"-"+STR(k2,m4)+"-"+STR(k3,m4)
IF k1>0 AND k2>=0 AND k1-k2>=0 AND k1-k2-k3>=0 AND k2+k3<>0
APPE BLAN
REPL nn1 WITH s
ENDIF
ENDCASE
ENDDO
SELE _temp
REPLACE ALL nn2 WITH STRTRAN(STRTRAN(STRTRAN(STRTRAN(s,"+","+"),"-","-"),"×","*"),"÷","/")
REPLACE ALL nn3 WITH RTRIM(nn1)+"="
GO TOP
THISFORM.list1.ROWSOURCE="_temp.nn1"
THISFORM.list1.REFRESH
m2=THISFORM.spinner1.VALUE &&數量
m3=THISFORM.spinner2.VALUE &&最大數
m4=LEN(ALLT(STR(m3))) &&最大數的位數
m4=IIF(m3=10,1,m4)
IF USED("_temp")
USE IN _temp
ENDIF
CREATE CURSOR _temp (nn1 c(30),nn2 c(30),nn3 c(30))
SELE _temp
THISFORM.list1.ROWSOURCE="_temp.nn1"
DO WHILE RECC()<m2
k1=INT(RAND()*m3)
k2=INT(RAND()*m3)
DO CASE
CASE m1=1 && 兩數的加法
IF k1>=0 AND k2>=0 AND k1+k2<=m3
s=STR(k1,m4)+"+"+STR(k2,m4)
APPE BLAN
REPL nn1 WITH s
ENDIF
CASE m1=2 && 兩數的減法
IF k1>=0 AND k2>=0 AND k1-k2<=m3 AND k1-k2>=0
s=STR(k1,m4)+"-"+STR(k2,m4)
APPE BLAN
REPL nn1 WITH s
ENDIF
CASE m1=3 && 兩數的乘法
IF k1>0 AND k2>=0 AND k1*k2<=m3
s=STR(k1,m4)+"×"+STR(k2,m4)
APPE BLAN
REPL nn1 WITH s
ENDIF
CASE m1=4 && 兩數的除法
IF k1>0 AND k2>0 AND INT(k1/k2)=k1/k2 &&注意除數不能爲0
s=STR(k1,m4)+"÷"+STR(k2,m4)
APPE BLAN
REPL nn1 WITH s
ENDIF
CASE m1=5 &&加減混合
k01=MOD(INT(RAND()*100),2) &&兩次運算的符號
k02=IIF(k01=0,1,0) &&兩次運算符號相反
IF k01=0 &&加法
k41=k1+k2
k3=INT(RAND()*k41)
k42=k41-k3
s=STR(k1,m4)+"+"+STR(k2,m4)+"-"+STR(k3,m4)
ELSE
k41=k1-k2
k3=INT(RAND()*m3)
k42=k41+k3
s=STR(k1,m4)+"-"+STR(k2,m4)+"+"+STR(k3,m4)
ENDIF
IF k1>0 AND k2>=0 AND k41>=0 AND k42>=0 AND k41<=m3 AND k42<=m3 AND k2+k3<>0
APPE BLAN
REPL nn1 WITH s
ENDIF
CASE m1=6 &&乘除混合
EXIT
CASE m1=7 &&三數連加
k3=INT(RAND()*m3)
s=STR(k1,m4)+"+"+STR(k2,m4)+"+"+STR(k3,m4)
IF k1>0 AND k2>=0 AND k3>=0 AND k1+k2+k3<=m3 AND k2+k3<>0
APPE BLAN
REPL nn1 WITH s
ENDIF
CASE m1=8 &&三數連減
k3=INT(RAND()*m3)
s=STR(k1,m4)+"-"+STR(k2,m4)+"-"+STR(k3,m4)
IF k1>0 AND k2>=0 AND k1-k2>=0 AND k1-k2-k3>=0 AND k2+k3<>0
APPE BLAN
REPL nn1 WITH s
ENDIF
ENDCASE
ENDDO
SELE _temp
REPLACE ALL nn2 WITH STRTRAN(STRTRAN(STRTRAN(STRTRAN(s,"+","+"),"-","-"),"×","*"),"÷","/")
REPLACE ALL nn3 WITH RTRIM(nn1)+"="
GO TOP
THISFORM.list1.ROWSOURCE="_temp.nn1"
THISFORM.list1.REFRESH
第四,“打印預覽”命令按鈕Command2的 Click 事件中加入以下代碼
THISFORM.LOCKSCREEN=.T.
_m_maxbutton=THISFORM.MAXBUTTON
_m_windowstate=THISFORM.WINDOWSTATE
_m_caption=THISFORM.CAPTION
THISFORM.MAXBUTTON=.T.
THISFORM.WINDOWSTATE=2
THISFORM.CAPTION=' 預覽'
REPORT FORM 算數.lbx PREVIEW WINDOWS form1
THISFORM.MAXBUTTON=_m_maxbutton
THISFORM.WINDOWSTATE=_m_windowstate
THISFORM.CAPTION=_m_caption
THISFORM.LOCKSCREEN=.F.
_m_maxbutton=THISFORM.MAXBUTTON
_m_windowstate=THISFORM.WINDOWSTATE
_m_caption=THISFORM.CAPTION
THISFORM.MAXBUTTON=.T.
THISFORM.WINDOWSTATE=2
THISFORM.CAPTION=' 預覽'
REPORT FORM 算數.lbx PREVIEW WINDOWS form1
THISFORM.MAXBUTTON=_m_maxbutton
THISFORM.WINDOWSTATE=_m_windowstate
THISFORM.CAPTION=_m_caption
THISFORM.LOCKSCREEN=.F.
打印報表,如下所示。