我没有Anders的天才!除了执着和热情我一无所有!
  • 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 Integer

        Dim 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 Integer

        Dim answer1 As Single   '存储运算结果
        Dim answer2 As Single
        Dim answer3 As Single

        Dim 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 If

                                                        OperateorString1 = 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 If

                                              

                                                If 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 If

                                                        OperateorString2 = 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 If

                                              

                                                If 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 If

                                                        If (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 If

                                                        OperateorString5 = 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 If

                                              

                                                If 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 If

                                            Next 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


    收藏到:Del.icio.us




    评论

  • 太好了~我终于找到VB的了



    感谢感谢
  • 有vc的 么 ??