前段时间,女儿所在的学校要求家长每天都要给孩子出一些加减法的数学题,让孩子练习。作为会一点程序设计的我来说,总想偷一些懒,于是制作了以下程序。
程序窗口,如下所示。
具体源代码如下:
首先,在表单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.

打印报表,如下所示。