-
24点算法代码(VB)
2004-06-07
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://duckula.blogbus.com/logs/209912.html
Private Sub Command1_Click()
If TxtNum1.Text = "" Then
MsgBox "请输入数字!", vbExclamation + vbOKOnly
Else
If (Val(TxtNum1.Text) < 1) Or (Val(TxtNum1.Text) >= 10) Then
MsgBox "请输入一个1-10的数!", vbExclamation + vbOKOnly
Else
Num(1) = Val(TxtNum1.Text)
End If
End If
If TxtNum2.Text = "" Then
MsgBox "请输入数字!", vbExclamation + vbOKOnly
Else
If (Val(TxtNum2.Text) < 1) Or (Val(TxtNum2.Text) >= 10) Then
MsgBox "请输入一个1-10的数!", vbExclamation + vbOKOnly
Else
Num(2) = Val(TxtNum2.Text)
End If
End If
If TxtNum3.Text = "" Then
MsgBox "请输入数字!", vbExclamation + vbOKOnly
Else
If (Val(TxtNum3.Text) < 1) Or (Val(TxtNum3.Text) >= 10) Then
MsgBox "请输入一个1-10的数!", vbExclamation + vbOKOnly
Else
Num(3) = Val(TxtNum3.Text)
End If
End If
If TxtNum4.Text = "" Then
MsgBox "请输入数字!", vbExclamation + vbOKOnly
Else
If (Val(TxtNum4.Text) < 1) Or (Val(TxtNum4.Text) >= 10) Then
MsgBox "请输入一个1-10的数!", vbExclamation + vbOKOnly
Else
Num(4) = Val(TxtNum4.Text)
End If
End If
a = OperatorModule.Operator()
If Not (OperateorString1 = "") Then
Print OperateorString1
End If
If Not (OperateorString2 = "") Then
Print OperateorString2
End If
If Not (OperateorString3 = "") Then
Print OperateorString3
End If
If Not (OperateorString4 = "") Then
Print OperateorString4
End If
If Not (OperateorString5 = "") Then
Print OperateorString5
End If
End Sub-------------------------------------------
'模块OperatorModule
Public Num(4) As Single '定义数组,存储输入的数字Public OperateorString1 As String '运算表达式
Public OperateorString2 As String
Public OperateorString3 As String
Public OperateorString4 As String
Public OperateorString5 As String
Function Operator() As IntegerDim a As Integer '定义数字数组下彪,用来产生数字组合
Dim b As Integer
Dim c As Integer
Dim d As Integer
Dim op1 As Integer '定义运算付数组下标,用来产生运算符组合
Dim op2 As Integer
Dim op3 As IntegerDim answer1 As Single '存储运算结果
Dim answer2 As Single
Dim answer3 As SingleDim BracketLeft1 As String, BracketRight1 As String, BracketLeft2 As String, BracketRight2 As String '括号,分别表示为:第一个左括号,第一个右括号,第二个左括号,第二个右括号
For a = 1 To 4 '产生4个数字的组合,一共有4!=24种组合
For b = 1 To 4
If b <> a Then
For c = 1 To 4
If (c <> a) And (c <> b) Then
For d = 1 To 4
If (d <> a) And (d <> b) And (d <> c) Then
For op1 = 1 To 4 '运算符排序 共有4*4*4=64种
For op2 = 1 To 4
For op3 = 1 To 4
If caculate(Num(a), Num(b), op1, answer1) And caculate(answer1, Num(c), op2, answer2) And caculate(answer2, Num(d), op3, answer3) Then
If answer3 = 24 Then '如果结果为24,则产生运算表达式
'先将四个括号都清空
BracketLeft1 = ""
BracketRight1 = ""
BracketLeft2 = ""
BracketRight2 = ""
'如果第一个运算符为+或- 且第二个运算为 *或/ 那么第二个括号不能少
If (operate(op1) = "+" Or operate(op1) = "-") And (operate(op2) = "*" Or operate(op2) = "/") Then
BracketLeft2 = "("
BracketRight2 = ")"
End If
'如果第二个运算符为+或- 且第三个运算为 *或/ 那么第一个括号不能少
If (operate(op2) = "+" Or operate(op2) = "-") And (operate(op3) = "*" Or operate(op3) = "/") Then
BracketLeft1 = "("
BracketRight1 = ")"
End IfOperateorString1 = BracketLeft1 + BracketLeft2 + Trim(Str$(Num(a))) + Trim(operate(op1)) + Trim(Str$(Num(b))) + BracketRight2 + Trim(operate(op2)) + Trim(Str$(Num(c))) + BracketRight1 + Trim(operate(op3)) + Trim(Str$(Num(d))) '返回((x@y)@z)@w 格式的表达式,但此时这两个括号未必都还在
Operator = answer3
End If
End IfIf caculate(Num(a), Num(b), op1, answer1) And caculate(Num(c), Num(d), op3, answer2) And caculate(answer1, answer2, op2, answer3) Then
If answer3 = 24 Then
BracketLeft1 = ""
BracketRight1 = ""
BracketLeft2 = ""
BracketRight2 = ""
If (operate(op1) = "+" Or operate(op1) = "-") And (operate(op2) = "*" Or operate(op2) = "/") Then
BracketLeft1 = "("
BracketRight1 = ")"
End If
If (operate(op3) = "+" Or operate(op3) = "-") And (operate(op2) = "*" Or operate(op2) = "/") Then
BracketLeft2 = "("
BracketRight2 = ")"
End If
If (operate(op2) = "-") And (operate(op3) = "+" Or operate(op3) = "-") Then
BracketLeft2 = "("
BracketRight2 = ")"
End IfOperateorString2 = BracketLeft1 + Trim(Str$(Num(a))) + Trim(operate(op1)) + Trim(Str$(Num(b))) + BracketRight1 + Trim(operate(op2)) + BracketLeft2 + Trim(Str$(Num(c))) + Trim(operate(op3)) + Trim(Str$(Num(d))) + BracketRight2 '返回表达式
Operator = answer3
End If
End IfIf caculate(Num(b), Num(c), op2, answer1) And caculate(Num(a), answer1, op1, answer2) And caculate(answer2, Num(d), op3, answer3) Then
If answer3 = 24 Then
BracketLeft1 = ""
BracketRight1 = ""
BracketLeft2 = ""
BracketRight2 = ""
If (operate(op1) = "/") Or (operate(op1) = "*" And (operate(op2) = "+" Or operate(op2) = "-")) Then
BracketLeft2 = "("
BracketRight2 = ")"
End IfIf (operate(op1) = "-") And (operate(op2) = "+" Or operate(op2) = "-") Then
BracketLeft2 = "("
BracketRight2 = ")"
End If
If (operate(op1) = "+" Or operate(op1) = "-") And (operate(op3) = "*" Or operate(op3) = "/") Then
BracketLeft1 = "("
BracketRight1 = ")"
End IfOperateorString5 = BracketLeft1 + Trim(Str$(Num(a))) + Trim(operate(op1)) + BracketLeft2 + Trim(Str$(Num(b))) + Trim(operate(op2)) + Trim(Str$(Num(c))) + BracketRight2 + BracketRight1 + Trim(operate(op3)) + Trim(Str$(Num(d)))
Operator = answer3
End If
End If
If caculate(Num(b), Num(c), op2, answer1) And caculate(answer1, Num(d), op3, answer2) And caculate(Num(a), answer2, op1, answer3) Then
If answer3 = 24 Then
BracketLeft1 = ""
BracketRight1 = ""
BracketLeft2 = ""
BracketRight2 = ""
If (operate(op2) = "+" Or operate(op2) = "-") And (operate(op3) = "*" Or operate(op3) = "/") Then
BracketLeft2 = "("
BracketRight2 = ")"
End If
If (operate(op1) = "/") Or (operate(op1) = "*" And (operate(op3) = "+" Or operate(op3) = "-")) Then
BracketLeft1 = "("
BracketRight1 = ")"
End If
If (operate(op1) = "-") And (operate(op3) = "+" Or operate(op3) = "-") Then
BracketLeft2 = "("
BracketRight2 = ")"
End If
OperateorString3 = Trim(Str$(Num(a))) + Trim(operate(op1)) + BracketLeft1 + BracketLeft2 + Trim(Str$(Num(b))) + Trim(operate(op2)) + Trim(Str$(Num(c))) + BracketRight2 + Trim(operate(op3)) + Trim(Str$(Num(d))) + BracketRight1
Operator = answer3
End If
End IfIf caculate(Num(c), Num(d), op3, answer1) And caculate(Num(b), answer1, op2, answer2) And caculate(Num(a), answer2, op1, answer3) Then
If answer3 = 24 Then
BracketLeft1 = ""
BracketRight1 = ""
BracketLeft2 = ""
BracketRight2 = ""
If (operate(op1) = "/") Or (operate(op1) = "*" And (operate(op2) = "+" Or operate(op2) = "-")) Then
BracketLeft1 = "("
BracketRight1 = ")"
End If
If (operate(op1) = "-") And (operate(op2) <> "*" Or operate(op2) <> "/") Then
BracketLeft1 = "("
BracketRight1 = ")"
End If
If (operate(op2) = "/") Or (operate(op2) = "*" And (operate(op3) = "+" Or operate(op3) = "-")) Then
BracketLeft2 = "("
BracketRight2 = ")"
End If
If (operate(op2) = "-") And (operate(op3) = "+" Or operate(op3) = "-") Then
BracketLeft2 = "("
BracketRight2 = ")"
End If
OperateorString4 = Trim(Str$(Num(a))) + Trim(operate(op1)) + BracketLeft1 + Trim(Str$(Num(b))) + Trim(operate(op2)) + BracketLeft2 + Trim(Str$(Num(c))) + Trim(operate(op3)) + Trim(Str$(Num(d))) + BracketRight2 + BracketRight1
Operator = answer3
End If
End IfNext op3
Next op2
Next op1
End If
Next d
End If
Next c
End If
Next b
Next a
Operator = answer3
End Function
'计算结果
Function caculate(X As Single, Y As Single, Operator As Integer, answer As Single) As Boolean
Select Case Operator
Case 1
On Error GoTo ErrDoing
answer = X + Y
Case 2
On Error GoTo ErrDoing
answer = X - Y
Case 3
On Error GoTo ErrDoing
answer = X * Y
Case 4
On Error GoTo ErrDoing
If Y = 0 Then '被除数不能为0
caculate = False
Exit Function
Else
answer = X / Y
End If
End Select
ErrDoing:
If Err.Number = 6 Then
caculate = False
End If
caculate = True
End Function
'返回运算符
Function operate(op As Integer) As String
Select Case op
Case 1
operate = "+"
Case 2
operate = "-"
Case 3
operate = "*"
Case 4
operate = "/"
End Select
End Function随机文章:
CMWAP与CMNET的区别 2006-03-24MSDN: 解开 Windows 下的临界区中的代码死锁 2006-03-10废了我2天的一段代码 2006-02-23编写高效的线程安全类 2006-02-15Linux下的多线程编程 2006-02-14
收藏到:Del.icio.us










评论
感谢感谢