编码一个名为CalculateResult的函数过程,该过程执行请求的操作并返回一个十进制值。此函数应接受以下参数:decOperand1 As Decimal-为第一个操作数输入的值。 strOperator As String-这四个运算符之一:+,-,*或/。 decOperand2 As Decimal-为第二个操作数输入的值。
这就是我需要编写任何可以提供的帮助的代码
答案 0 :(得分: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
答案 1 :(得分:0)
附加解析功能:
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
答案 2 :(得分:0)
这是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