主题:让你呕吐三天的题
QB爱好者
[专家分:370] 发布于 2007-08-14 19:34:00
输入一个表达式(关系,逻辑,计算)
输出它的值
例:
input:(3+(4>5 or 5<=6))*23-(1>2)
output :46
回复列表 (共31个回复)
21 楼
lz27 [专家分:300] 发布于 2007-08-30 16:40:00
SUB peach
DIM istack1(32) AS INTEGER
DIM istack1point AS INTEGER
DIM i AS INTEGER
DIM j AS INTEGER
DIM k AS INTEGER
DIM l AS INTEGER
i = 1
DO
l = i
j = 0
WHILE ASC(MID$(tree1(l), 2, 1)) <> 0
j = j + 1
l = ASC(MID$(tree1(l), 2, 1))
WEND
PRINT SPACE$(j * 4);
SELECT CASE ASC(MID$(tree1(i), 5, 1))
CASE 1
PRINT "%" + STR$(CVI(RIGHT$(tree1(i), LEN(tree1(i)) - 5)))
CASE 2
PRINT "&" + STR$(CVL(RIGHT$(tree1(i), 4)))
CASE 5
PRINT "$" + RIGHT$(tree1(i), LEN(tree1(i)) - 5)
CASE 6
SELECT CASE ASC(MID$(tree1(i), 6, 1))
CASE 1
PRINT "^"
CASE 2
PRINT "*"
CASE 3
PRINT "/"
CASE 4
PRINT "\"
CASE 5
PRINT "mod"
CASE 6
PRINT "+"
CASE 7
PRINT "-"
CASE 8
PRINT "and"
CASE 9
PRINT "not"
CASE 10
PRINT "or"
CASE 17
PRINT "xor"
CASE 11
PRINT ">"
CASE 12
PRINT "<"
CASE 13
PRINT "="
CASE 14
PRINT ">="
CASE 15
PRINT "<="
CASE 16
PRINT "<>"
END SELECT
CASE 7
PRINT "@" + RIGHT$(tree1(i), LEN(tree1(i)) - 5)
CASE 255
PRINT "?" + RIGHT$(tree1(i), LEN(tree1(i)) - 5)
END SELECT
k = ASC(MID$(tree1(i), 4, 1))
IF k <> 0 THEN
istack1point = istack1point + 1
istack1(istack1point) = k
END IF
k = ASC(MID$(tree1(i), 3, 1))
IF k <> 0 THEN
i = k
ELSE
IF istack1point <> 0 THEN
i = istack1(istack1point)
istack1point = istack1point - 1
ELSE
EXIT DO
END IF
END IF
LOOP
END SUB
22 楼
lz27 [专家分:300] 发布于 2007-08-30 16:41:00
FUNCTION pear$ (expr1 AS STRING)
DIM expression AS STRING
DIM flag AS INTEGER
DIM i AS INTEGER
DIM j AS INTEGER
DIM k AS INTEGER
DIM l AS INTEGER
DIM m AS INTEGER
DIM f AS STRING
DIM pearpoint AS INTEGER
DIM peartype AS INTEGER
expression = apple$(expr1)
j = 0
k = 0
FOR i = 1 TO LEN(expression)
f = MID$(expression, i, 1)
IF f = "(" THEN j = j + 1
IF f = ")" THEN j = j - 1
IF f = CHR$(34) THEN k = k + 1
IF j = 0 AND (k MOD 2 = 0) THEN
SELECT CASE f
CASE "^"
pearpoint = i
peartype = 1
END SELECT
END IF
NEXT
j = 0
k = 0
FOR i = 1 TO LEN(expression)
f = MID$(expression, i, 1)
IF f = "(" THEN j = j + 1
IF f = ")" THEN j = j - 1
IF f = CHR$(34) THEN k = k + 1
IF j = 0 AND (k MOD 2 = 0) THEN
SELECT CASE UCASE$(f)
CASE "*"
pearpoint = i
peartype = 2
CASE "/"
pearpoint = i
peartype = 3
CASE "\"
pearpoint = i
peartype = 4
CASE "M"
IF i + 4 > LEN(expression) THEN
IF UCASE$(MID$(expression, i - 1, 5)) = " MOD " THEN
pearpoint = i
peartype = 5
END IF
END IF
END SELECT
END IF
NEXT
j = 0
k = 0
flag = 0
FOR i = 1 TO LEN(expression)
f = MID$(expression, i, 1)
IF f = "(" THEN j = j + 1
IF f = ")" THEN j = j - 1
IF f = CHR$(34) THEN k = k + 1
IF j = 0 AND (k MOD 2 = 0) THEN
SELECT CASE f
CASE "+"
IF i <> 1 THEN
pearpoint = i
peartype = 6
END IF
CASE "-"
IF i <> 1 THEN
pearpoint = i
peartype = 7
END IF
END SELECT
END IF
NEXT
23 楼
lz27 [专家分:300] 发布于 2007-08-30 16:41:00
j = 0
k = 0
FOR i = 1 TO LEN(expression)
f = MID$(expression, i, 1)
IF f = "(" THEN j = j + 1
IF f = ")" THEN j = j - 1
IF f = CHR$(34) THEN k = k + 1
IF j = 0 AND (k MOD 2 = 0) THEN
SELECT CASE f
CASE "="
pearpoint = i
peartype = 13
CASE ">"
pearpoint = i
peartype = 11
IF i + 1 < LEN(expression) THEN
IF MID$(expression, i + 1) = "=" THEN
pearpoint = i
peartype = 14
i = i + 1
END IF
END IF
CASE "<"
pearpoint = i
peartype = 12
IF i + 1 < LEN(expression) THEN
IF MID$(expression, i + 1, 1) = "=" THEN
pearpoint = i
peartype = 15
i = i + 1
ELSEIF MID$(expression, i + 1, 1) = ">" THEN
pearpoint = i
peartype = 16
i = i + 1
END IF
END IF
END SELECT
END IF
NEXT
j = 0
k = 0
FOR i = 1 TO LEN(expression)
f = MID$(expression, i, 1)
IF f = "(" THEN j = j + 1
IF f = ")" THEN j = j - 1
IF f = CHR$(34) THEN k = k + 1
IF j = 0 AND i + 4 <= LEN(expression) AND (i <> 1) AND (k MOD 2 = 0) THEN
SELECT CASE UCASE$(f)
CASE "A"
IF UCASE$(MID$(expression, i - 1, 5)) = " AND " THEN
pearpoint = i
peartype = 8
END IF
CASE "N"
IF UCASE$(MID$(expression, i, 4)) = "NOT " THEN
pearpoint = i
peartype = 8
END IF
CASE "O"
IF UCASE$(MID$(expression, i - 1, 4)) = " OR " THEN
pearpoint = i
peartype = 10
END IF
CASE "X"
IF UCASE$(MID$(expression, i - 1, 5)) = " XOR " THEN
pearpoint = i
peartype = 17
END IF
END SELECT
END IF
NEXT
f = CHR$(pearpoint) + CHR$(peartype)
pear$ = f
END FUNCTION
24 楼
lz27 [专家分:300] 发布于 2007-08-30 16:42:00
SUB strawberry
DIM i AS INTEGER
DIM j AS INTEGER
DIM k AS INTEGER
DIM l AS INTEGER
DIM f AS STRING
DIM f0 AS STRING
i = 0
DO
i = i + 1
IF ASC(MID$(tree1(i), 5, 1)) = 255 THEN
f = pear$(MID$(tree1(i), 6, LEN(tree1(i)) - 5))
k = ASC(MID$(f, 2, 1))
j = ASC(MID$(f, 1, 1))
f = apple$(MID$(tree1(i), 6, LEN(tree1(i)) - 5))
SELECT CASE k
CASE 0
f0 = orange$(f)
IF f0 = "H" THEN
ELSE
tree1(i) = LEFT$(tree1(i), 4) + f0
END IF
CASE 1, 2, 3, 4, 6, 7, 11, 12, 13
tree1bound = tree1bound + 1
tree1(i) = LEFT$(tree1(i), 2) + CHR$(tree1bound) + MID$(tree1(i), 4, 1) + CHR$(6) + CHR$(k)
f0 = LTRIM$(RTRIM$(LEFT$(f, j - 1)))
tree1(tree1bound) = CHR$(2) + CHR$(i) + CHR$(0) + CHR$(tree1bound + 1) + CHR$(255) + f0
tree1bound = tree1bound + 1
f0 = LTRIM$(RTRIM$(MID$(f, j + 1, LEN(f) - j)))
tree1(tree1bound) = CHR$(0) + CHR$(i) + CHR$(0) + CHR$(0) + CHR$(255) + f0
CASE 10, 14, 15, 16
tree1bound = tree1bound + 1
tree1(i) = LEFT$(tree1(i), 2) + CHR$(tree1bound) + MID$(tree1(i), 4, 1) + CHR$(6) + CHR$(k)
f0 = LTRIM$(RTRIM$(LEFT$(f, j - 1)))
tree1(tree1bound) = CHR$(2) + CHR$(i) + CHR$(0) + CHR$(tree1bound + 1) + CHR$(255) + f0
tree1bound = tree1bound + 1
f0 = LTRIM$(RTRIM$(MID$(f, j + 2, LEN(f) - j)))
tree1(tree1bound) = CHR$(0) + CHR$(i) + CHR$(0) + CHR$(0) + CHR$(255) + f0
CASE 5, 8, 11
tree1bound = tree1bound + 1
tree1(i) = LEFT$(tree1(i), 2) + CHR$(tree1bound) + MID$(tree1(i), 4, 1) + CHR$(6) + CHR$(k)
f0 = LTRIM$(RTRIM$(LEFT$(f, j - 1)))
tree1(tree1bound) = CHR$(2) + CHR$(i) + CHR$(0) + CHR$(tree1bound + 1) + CHR$(255) + f0
tree1bound = tree1bound + 1
f0 = LTRIM$(RTRIM$(MID$(f, j + 3, LEN(f) - j)))
tree1(tree1bound) = CHR$(0) + CHR$(i) + CHR$(0) + CHR$(0) + CHR$(255) + f0
CASE 9
tree1bound = tree1bound + 1
tree1(i) = LEFT$(tree1(i), 2) + CHR$(tree1bound) + MID$(tree1(i), 4, 1) + CHR$(6) + CHR$(k)
f0 = LTRIM$(RTRIM$(RIGHT$(f, LEN(f) - 4)))
tree1(tree1bound) = CHR$(2) + CHR$(i) + CHR$(0) + CHR$(0) + CHR$(255) + f0
END SELECT
END IF
LOOP UNTIL i = tree1bound
END SUB
25 楼
lz27 [专家分:300] 发布于 2007-08-30 16:45:00
把从
'2.bas
'copyright (c) 2007 Lingluo.Z
'all rights received
开始到上面结束的代码复制到2.bas就可以了
调用eval%("表达式字符串") 返回的就是表达式的值了
(代码 兼容qb和freebasic)
26 楼
lz27 [专家分:300] 发布于 2007-08-30 16:51:00
终于传好了 -> 这些东西我写了两个月 (业余时间,现在我要高三了)
昨天特地整理了一下 debug了一个错误
恩 看不懂不要问我 里面有些代码是什么意思其实我也忘记了:P
雨中飞燕 :x 我的传了你的也应该传一下把
27 楼
雨中飞燕 [专家分:18980] 发布于 2007-08-30 18:49:00
要我发我的并没有问题,只不过是VB下写的代码,
不记得是什么时候写的了,貌似是高一时候的东西
我那个代码所支持的符号及函数:
+, -, *, /, \, mod, ^, <, >, =, <=, >=, <>, and, or, xor, eqv, imp, (, ), [, ], {, }, abs, sgn, fix, int, not, sqr, exp, lg, ln, log, sin, cos, tg, tan, cot, ctg, sec, csc, arcsin, arccos, arctan, arcctg, arcsec, arccsc, sinh, cosh, tanh, arcsinh, arccosh, arctanh, pi, π, x, y, z (参变量x,y,z)
28 楼
雨中飞燕 [专家分:18980] 发布于 2007-08-30 19:25:00
软件下载地址:
[url]http://upload.programfan.com/upfile/200708301924542.rar[/url]
29 楼
Matodied [专家分:7560] 发布于 2007-08-30 19:37:00
lz27:
你的程序中过程和函数都是用水果命名的,让人家根本不知道你这过程和函数是什么意思。
希望说清楚点。
30 楼
雨中飞燕 [专家分:18980] 发布于 2007-08-30 21:43:00
刚刚看了一下lz27的代码,490行。。。。。。
我自己的代码,620行。。。
还好,代码量相差不是很多。。。
我来回复