【问题标题】:Visual Basic Help for making a simple calculator用于制作简单计算器的 Visual Basic 帮助
【发布时间】:2018-12-06 04:17:06
【问题描述】:

编写一个名为CalculateResult 的函数过程,该过程执行请求的操作并返回一个十进制值。此函数应接受以下参数: decOperand1 As Decimal - 为第一个操作数输入的值。 strOperator As String - 这四个运算符之一:+、-、* 或 /。 decOperand2 As Decimal - 为第二个操作数输入的值。

这是我需要编写的代码,任何可以提供的帮助将不胜感激

【问题讨论】:

标签: calculator basic


【解决方案1】:

可能的编码方案:

REM Code a Function procedure named CalculateResult that performs the
REM requested operation and returns a decimal value. This function should
REM accept the following parameters: decOperand1 As Decimal - The value
REM entered for the first operand. strOperator As String - One of these
REM four operators: +, -, *, or /. decOperand2 As Decimal - The value
REM entered for the second operand.
PRINT "Enter value1";: INPUT decOperand1&
PRINT "Enter operand(+,-,*,/,^)";: INPUT strOperator$
PRINT "Enter value2";: INPUT decOperand2&
PRINT "Result"; CalculateResult(decOperand1&, strOperator$, decOperand2&)
END
FUNCTION CalculateResult (decOperand1&, strOperator$, decOperand2&)
    SELECT CASE strOperator$
        CASE "+", "+="
            CalculateResult = decOperand1& + decOperand2&
        CASE "-", "-="
            CalculateResult = decOperand1& - decOperand2&
        CASE "*", "*="
            CalculateResult = decOperand1& * decOperand2&
        CASE "/", "/="
            CalculateResult = decOperand1& / decOperand2&
        CASE "^", "^="
            CalculateResult = decOperand1& ^ decOperand2&
        CASE ELSE
            PRINT "Unknown operator."
    END SELECT
END FUNCTION

【讨论】:

  • 例如“10 * (20 - 1)”是什么?
【解决方案2】:

附加解析功能:

REM Code a Function procedure named CalculateResult that performs the
REM requested operation and returns a decimal value. This function should
REM accept the following parameters: decOperand1 As Decimal - The value
REM entered for the first operand. strOperator As String - One of these
REM four operators: +, -, *, or /. decOperand2 As Decimal - The value
REM entered for the second operand.
PRINT "Enter value1";: INPUT decOperand1&
PRINT "Enter operand(+,-,*,/,^)";: INPUT strOperator$
PRINT "Enter value2";: INPUT decCalc2$
IF decCalc2$ = "" THEN
    PRINT "Result:"; CalculateResult2(decOperand1&, strOperator$)
ELSE
    decOperand2& = VAL(decCalc2$)
    PRINT "Result:"; CalculateResult(decOperand1&, strOperator$, decOperand2&)
END IF
END
FUNCTION CalculateResult (decOperand1&, strOperator$, decOperand2&)
    SELECT CASE strOperator$
        CASE "+", "+="
            CalculateResult = decOperand1& + decOperand2&
        CASE "-", "-="
            CalculateResult = decOperand1& - decOperand2&
        CASE "*", "*="
            CalculateResult = decOperand1& * decOperand2&
        CASE "/", "/="
            CalculateResult = decOperand1& / decOperand2&
        CASE "^", "^="
            CalculateResult = decOperand1& ^ decOperand2&
        CASE ELSE
            PRINT "Unknown operator."
    END SELECT
END FUNCTION
FUNCTION CalculateResult2 (decOperand1&, strOperator$)
    SELECT CASE strOperator$
        CASE "++"
            CalculateResult2 = decOperand1& + 1&
        CASE "--"
            CalculateResult2 = decOperand1& - 1&
        CASE "//" ' shift-left
            CalculateResult2 = decOperand1& * 2&
        CASE "**" ' shift-right
            CalculateResult2 = decOperand1& / 2&
        CASE ELSE
            PRINT "Unknown operator."
    END SELECT
END FUNCTION

【讨论】:

    【解决方案3】:

    这是 QB45、QB64 中成熟的递归下降解析器:

    REM File: Recursive descent parser 2019.
    
    DIM SHARED Out2 AS STRING
    DIM SHARED Token AS INTEGER
    DIM SHARED Token1 AS STRING
    DIM SHARED Token2 AS STRING
    DIM SHARED Token.Index AS INTEGER
    
    DO
        COLOR 15, 0
        PRINT "Equation";: INPUT Out2
        IF Out2 = "" THEN EXIT DO
        COLOR 14, 0
        PRINT "Equals:"; Equate(Out2)
    LOOP
    COLOR 7, 0
    END
    
    FUNCTION Equate (Out2$)
        Temp# = DFalse
        Var = INSTR(Out2$, " ")
        WHILE Var
            Out2$ = LEFT$(Out2$, Var - 1) + MID$(Out2$, Var + 1)
            Var = INSTR(Out2$, " ")
        WEND
        IF Out2$ <> "" THEN
            Out2$ = UCASE$(Out2$)
            Token.Index = 1
            CALL Get.Token
            CALL Parse1(Temp#)
        END IF
        Equate = Temp#
    END FUNCTION
    
    ' logical parser
    SUB Parse1 (Temp#)
        CALL Parse2(Temp#)
        Token.Parsed$ = Token2$
        DO
            SELECT CASE Token.Parsed$
                CASE "|", "&", "~", "?", ":"
                    Eat$ = ""
                CASE ELSE
                    EXIT DO
            END SELECT
            Token.Stored$ = Token1$
            CALL Get.Token
            CALL Parse2(Temp2#)
            Token1$ = Token.Stored$
            CALL Arith(Token.Parsed$, Temp#, Temp2#)
            Token.Parsed$ = Token2$
        LOOP
    END SUB
    
    ' relational parser
    SUB Parse2 (Temp#)
        CALL Parse3(Temp#)
        Token.Parsed$ = Token2$
        DO
            SELECT CASE Token.Parsed$
                CASE "<", ">", "=", "#", ">=", "<=", "<>", "^="
                    Eat$ = ""
                CASE ELSE
                    EXIT DO
            END SELECT
            Token.Stored$ = Token1$
            CALL Get.Token
            CALL Parse3(Temp2#)
            Token1$ = Token.Stored$
            CALL Arith(Token.Parsed$, Temp#, Temp2#)
            Token.Parsed$ = Token2$
        LOOP
    END SUB
    
    ' addition/subtraction parser
    SUB Parse3 (Temp#)
        CALL Parse4(Temp#)
        Token.Parsed$ = Token2$
        DO
            SELECT CASE Token.Parsed$
                CASE "+", "-"
                    Eat$ = ""
                CASE ELSE
                    EXIT DO
            END SELECT
            Token.Stored$ = Token1$
            CALL Get.Token
            CALL Parse4(Temp2#)
            Token1$ = Token.Stored$
            CALL Arith(Token.Parsed$, Temp#, Temp2#)
            Token.Parsed$ = Token2$
        LOOP
    END SUB
    
    ' modulo parser
    SUB Parse4 (Temp#)
        CALL Parse5(Temp#)
        Token.Parsed$ = Token2$
        DO
            SELECT CASE Token.Parsed$
                CASE "%"
                    Eat$ = ""
                CASE ELSE
                    EXIT DO
            END SELECT
            Token.Stored$ = Token1$
            CALL Get.Token
            CALL Parse5(Temp2#)
            Token1$ = Token.Stored$
            CALL Arith(Token.Parsed$, Temp#, Temp2#)
            Token.Parsed$ = Token2$
        LOOP
    END SUB
    
    ' integer division parser
    SUB Parse5 (Temp#)
        CALL Parse6(Temp#)
        Token.Parsed$ = Token2$
        DO
            SELECT CASE Token.Parsed$
                CASE "\"
                    Eat$ = ""
                CASE ELSE
                    EXIT DO
            END SELECT
            Token.Stored$ = Token1$
            CALL Get.Token
            CALL Parse6(Temp2#)
            Token1$ = Token.Stored$
            CALL Arith(Token.Parsed$, Temp#, Temp2#)
            Token.Parsed$ = Token2$
        LOOP
    END SUB
    
    ' multiplication/division parser
    SUB Parse6 (Temp#)
        CALL Parse7(Temp#)
        Token.Parsed$ = Token2$
        DO
            SELECT CASE Token.Parsed$
                CASE "*", "/"
                    Eat$ = ""
                CASE ELSE
                    EXIT DO
            END SELECT
            Token.Stored$ = Token1$
            CALL Get.Token
            CALL Parse7(Temp2#)
            Token1$ = Token.Stored$
            CALL Arith(Token.Parsed$, Temp#, Temp2#)
            Token.Parsed$ = Token2$
        LOOP
    END SUB
    
    ' power parser
    SUB Parse7 (Temp#)
        CALL Parse7a(Temp#)
        Token.Parsed$ = Token2$
        DO
            SELECT CASE Token.Parsed$
                CASE "^"
                    Eat$ = ""
                CASE ELSE
                    EXIT DO
            END SELECT
            Token.Stored$ = Token1$
            CALL Get.Token
            CALL Parse7a(Temp2#)
            Token1$ = Token.Stored$
            CALL Arith(Token.Parsed$, Temp#, Temp2#)
            Token.Parsed$ = Token2$
        LOOP
    END SUB
    
    ' dual-unary parser
    SUB Parse7a (Temp#)
        CALL Parse8(Temp#)
        Token.Parsed$ = Token2$
        DO
            SELECT CASE Token.Parsed$
                CASE "<<", ">>", "--", "++", "**", "//", "||", "##", "^^"
                    Eat$ = ""
                CASE ELSE
                    EXIT DO
            END SELECT
            Token.Stored$ = Token1$
            CALL Get.Token
            '    CALL Parse8(Temp2#) ' no secondary token
            Token1$ = Token.Stored$
            CALL Arith(Token.Parsed$, Temp#, Temp2#)
            Token.Parsed$ = Token2$
        LOOP
    END SUB
    
    ' not/unary plus/unary negative parser
    SUB Parse8 (Temp#)
        Token.Negate$ = "" ' reset token storage
        Token.Parsed$ = Token2$ ' store token
        ' process token
        DO
            SELECT CASE Token.Parsed$
                CASE "!", "-", "+", "--", "++"
                    Eat$ = ""
                CASE ELSE
                    EXIT DO
            END SELECT
            CALL Get.Token ' read next token
            Token.Negate$ = Token.Negate$ + Token.Parsed$
            Token.Parsed$ = Token2$ ' store token
        LOOP
        CALL Parse9(Temp#) ' get next operator
        ' process the combined operators
        FOR Token.Type = LEN(Token.Negate$) TO 1 STEP -1
            SELECT CASE MID$(Token.Negate$, Token.Type, 1) ' get next token
                CASE "+"
                    Eat$ = ""
                CASE "-"
                    Temp# = -Temp# ' perform negate
                CASE "!" ' not
                    Temp# = NOT Temp# ' perform not calculation
            END SELECT
        NEXT
    END SUB
    
    SUB Parse9 (Temp#)
        SELECT CASE Token
            CASE 1
                SELECT CASE Token2$
                    CASE "("
                        CALL Get.Token
                        IF Token2$ <> ")" THEN
                            DO
                                CALL Parse1(Temp#)
                            LOOP UNTIL Token2$ = ")" OR Token = False
                            CALL Get.Token
                        END IF
                    CASE ")"
                        CALL Get.Token
                        EXIT SUB
                END SELECT
            CASE 2
                SELECT CASE RIGHT$(Token2$, 1)
                    CASE "H" ' hexidecimal
                        Temp# = DFalse
                        Var = False
                        FOR Var1 = LEN(Token2$) - 1 TO 1 STEP -1
                            Var2 = VAL("&H" + (MID$(Token2$, Var1, 1)))
                            Temp# = Temp# + Var2 * 16 ^ Var
                            Var = Var + 1
                        NEXT
                    CASE "O" ' octal
                        Temp# = DFalse
                        Var = False
                        FOR Var1 = LEN(Token2$) - 1 TO 1 STEP -1
                            Var2 = VAL(MID$(Token2$, Var1, 1))
                            Temp# = Temp# + Var2 * 8 ^ Var
                            Var = Var + 1
                        NEXT
                    CASE "B" ' binary
                        Temp# = DFalse
                        Var = False
                        FOR Var1 = LEN(Token2$) - 1 TO 1 STEP -1
                            IF MID$(Token2$, Var1, 1) = "1" THEN
                                Temp# = Temp# + 2 ^ Var
                            END IF
                            Var = Var + 1
                        NEXT
                    CASE ELSE ' decimal
                        Temp# = VAL(Token2$)
                END SELECT
                CALL Get.Token
            CASE 3
                SELECT CASE Token2$
                    CASE "RND"
                        Temp# = RND
                    CASE "ABS"
                        CALL Get.Token
                        CALL Get.Token
                        CALL Parse1(Temp#)
                        Temp# = ABS(Temp#)
                    CASE "NOT"
                        CALL Get.Token
                        CALL Get.Token
                        CALL Parse1(Temp#)
                        Temp# = NOT (Temp#)
                    CASE "SGN"
                        CALL Get.Token
                        CALL Get.Token
                        CALL Parse1(Temp#)
                        Temp# = SGN(Temp#)
                    CASE "SQR"
                        CALL Get.Token
                        CALL Get.Token
                        CALL Parse1(Temp#)
                        Temp# = SQR(Temp#)
                    CASE "OR"
                        CALL Get.Token
                        CALL Get.Token
                        CALL Parse1(Temp#)
                        Number# = Temp#
                        CALL Get.Token
                        CALL Parse1(Temp#)
                        Temp# = Number# OR Temp#
                    CASE "AND"
                        CALL Get.Token
                        CALL Get.Token
                        CALL Parse1(Temp#)
                        Number# = Temp#
                        CALL Get.Token
                        CALL Parse1(Temp#)
                        Temp# = Number# AND Temp#
                    CASE "EQV"
                        CALL Get.Token
                        CALL Get.Token
                        CALL Parse1(Temp#)
                        Number# = Temp#
                        CALL Get.Token
                        CALL Parse1(Temp#)
                        Temp# = Number# EQV Temp#
                    CASE "IMP"
                        CALL Get.Token
                        CALL Get.Token
                        CALL Parse1(Temp#)
                        Number# = Temp#
                        CALL Get.Token
                        CALL Parse1(Temp#)
                        Temp# = Number# IMP Temp#
                    CASE "MOD"
                        CALL Get.Token
                        CALL Get.Token
                        CALL Parse1(Temp#)
                        Number# = Temp#
                        CALL Get.Token
                        CALL Parse1(Temp#)
                        Temp# = Number# MOD Temp#
                    CASE "XOR"
                        CALL Get.Token
                        CALL Get.Token
                        CALL Parse1(Temp#)
                        Number# = Temp#
                        CALL Get.Token
                        CALL Parse1(Temp#)
                        Temp# = Number# XOR Temp#
                END SELECT
                CALL Get.Token
        END SELECT
    END SUB
    
    SUB Arith (Token.Parsed$, Temp#, Temp2#)
        SELECT CASE Token.Parsed$
            CASE "+"
                Temp# = Temp# + Temp2#
            CASE "-"
                Temp# = Temp# - Temp2#
            CASE "/"
                Temp# = Temp# / Temp2#
            CASE "\"
                Temp# = Temp# \ Temp2#
            CASE "*"
                Temp# = Temp# * Temp2#
            CASE "^"
                Temp# = Temp# ^ Temp2#
            CASE "<"
                Temp# = Temp# < Temp2#
            CASE ">"
                Temp# = Temp# > Temp2#
            CASE "<<"
                Temp# = Temp# * 2#
            CASE ">>"
                Temp# = Temp# \ 2#
            CASE "||"
                Temp# = Temp# * 10#
            CASE "##"
                Temp# = Temp# \ 10#
            CASE "^^"
                Temp# = Temp# ^ 10#
            CASE "++"
                Temp# = Temp# + 1#
            CASE "--"
                Temp# = Temp# - 1#
            CASE "**"
                Temp# = Temp# ^ 2#
            CASE "//"
                Temp# = SQR(Temp#)
            CASE "="
                Temp# = Temp# = Temp2#
            CASE "<="
                Temp# = Temp# <= Temp2#
            CASE ">="
                Temp# = Temp# >= Temp2#
            CASE "#", "<>"
                Temp# = Temp# <> Temp2#
            CASE "^="
                Temp# = Temp# ^ Temp2#
            CASE "|"
                Temp# = Temp# OR Temp2#
            CASE "&"
                Temp# = Temp# AND Temp2#
            CASE "%"
                Temp# = Temp# MOD Temp2#
            CASE "~"
                Temp# = Temp# XOR Temp2#
            CASE "?"
                Temp# = Temp# IMP Temp2#
            CASE ":"
                Temp# = Temp# EQV Temp2#
        END SELECT
    END SUB
    
    SUB Get.Token
        Token.List$ = " -+*/\^()[]{}<>=#|&!%~?:,"
        Token2$ = ""
        Token = False
        IF Token.Index > LEN(Out2) THEN
            Token2$ = ""
            EXIT SUB
        END IF
        CALL Get.Token2(Token.Exists)
        IF Token.Exists THEN
            EXIT SUB
        END IF
        Token.Element$ = MID$(Out2, Token.Index, 1)
        IF LEN(Token.Element$) THEN
            IF INSTR(Token.List$, Token.Element$) THEN
                Token = 1
                Token2$ = Token.Element$
                Token.Index = Token.Index + 1
                EXIT SUB
            END IF
        END IF
        Token.Element$ = MID$(Out2, Token.Index, 1)
        IF (Token.Element$ >= "0" AND Token.Element$ <= "9") OR Token.Element$ = "." THEN
            DO
                IF LEN(Token.Element$) = False THEN
                    EXIT DO
                END IF
                IF INSTR(Token.List$, Token.Element$) THEN
                    EXIT DO
                END IF
                Token2$ = Token2$ + Token.Element$
                Token.Index = Token.Index + 1
                Token.Element$ = MID$(Out2, Token.Index, 1)
            LOOP
            Token = 2
            EXIT SUB
        END IF
        Token.Element$ = MID$(Out2, Token.Index, 1)
        IF Token.Element$ >= "A" AND Token.Element$ <= "Z" THEN
            DO
                IF LEN(Token.Element$) = False THEN
                    EXIT DO
                END IF
                IF INSTR(Token.List$, MID$(Out2, Token.Index, 1)) THEN
                    EXIT DO
                END IF
                Token2$ = Token2$ + Token.Element$
                Token.Index = Token.Index + 1
                Token.Element$ = MID$(Out2, Token.Index, 1)
            LOOP
            Token = 3
            EXIT SUB
        END IF
    END SUB
    
    ' tokens of length 2
    SUB Get.Token2 (Token.Exists)
        Token.Exists = False
        Next.Token$ = MID$(Out2, Token.Index, 2)
        SELECT CASE Next.Token$
            CASE "||"
                Token = 1
                Token2$ = "||"
                Token.Index = Token.Index + 2
                Token.Exists = True
            CASE "##"
                Token = 1
                Token2$ = "##"
                Token.Index = Token.Index + 2
                Token.Exists = True
            CASE "<<"
                Token = 1
                Token2$ = "<<"
                Token.Index = Token.Index + 2
                Token.Exists = True
            CASE ">>"
                Token = 1
                Token2$ = ">>"
                Token.Index = Token.Index + 2
                Token.Exists = True
            CASE "--"
                Token = 1
                Token2$ = "--"
                Token.Index = Token.Index + 2
                Token.Exists = True
            CASE "++"
                Token = 1
                Token2$ = "++"
                Token.Index = Token.Index + 2
                Token.Exists = True
            CASE "**"
                Token = 1
                Token2$ = "**"
                Token.Index = Token.Index + 2
                Token.Exists = True
            CASE "//"
                Token = 1
                Token2$ = "//"
                Token.Index = Token.Index + 2
                Token.Exists = True
            CASE ">=", "=>"
                Token = 1
                Token2$ = ">="
                Token.Index = Token.Index + 2
                Token.Exists = True
            CASE "<=", "=<"
                Token = 1
                Token2$ = "<="
                Token.Index = Token.Index + 2
                Token.Exists = True
            CASE "<>", "><"
                Token = 1
                Token2$ = "<>"
                Token.Index = Token.Index + 2
                Token.Exists = True
            CASE "^="
                Token = 1
                Token2$ = "^="
                Token.Index = Token.Index + 2
                Token.Exists = True
            CASE "^^"
                Token = 1
                Token2$ = "^^"
                Token.Index = Token.Index + 2
                Token.Exists = True
        END SELECT
    END SUB
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      • 2011-09-01
      相关资源
      最近更新 更多