主题:让你呕吐三天的题
QB爱好者
[专家分:370] 发布于 2007-08-14 19:34:00
输入一个表达式(关系,逻辑,计算)
输出它的值
例:
input:(3+(4>5 or 5<=6))*23-(1>2)
output :46
回复列表 (共31个回复)
11 楼
雨中飞燕 [专家分:18980] 发布于 2007-08-28 14:36:00
不吐,我用VB写过了,还支持所有的三角函数、反三角,指数对数幂等所有的初等函数,还有逻辑运算,按位运算
不过代码就长了点而已
12 楼
lz27 [专家分:300] 发布于 2007-08-28 14:57:00
楼上的 你这个代码可不可以 放在网上看一看啊
我也写过一个 用freebasic 不过只支持整数 很复杂的
13 楼
QB爱好者 [专家分:370] 发布于 2007-08-28 15:15:00
11楼的,那再加一点难度:支持字符串。
14 楼
雨中飞燕 [专家分:18980] 发布于 2007-08-28 15:20:00
不能给你代码,最多给个编译好的程序你看看(我的代码实在写得糟糕)
15 楼
lz27 [专家分:300] 发布于 2007-08-30 16:37:00
'2.bas
'
'Copyright (c) 2007 Lingluo.Z
'All Rights Reserved
'
DECLARE SUB peach ()
DECLARE SUB error1 ()
DECLARE FUNCTION apple$ (expr1 AS STRING)
DECLARE FUNCTION orange$ (f0 AS STRING)
DECLARE FUNCTION pear$ (expr1 AS STRING)
DECLARE SUB strawberry ()
DECLARE FUNCTION eval% (exprstr AS STRING)
DECLARE FUNCTION i112% (i AS INTEGER)
DECLARE SUB i627 ()
DIM SHARED tree1(1 TO 255) AS STRING
DIM SHARED tree1bound AS INTEGER
tree1bound = 1
PRINT eval%("(3+(4>5 or 5<=6))*23-(1>2)")
while inkey$="":wend
end
16 楼
lz27 [专家分:300] 发布于 2007-08-30 16:38:00
FUNCTION apple$ (expr1 AS STRING)
DIM expression AS STRING
DIM i AS INTEGER
DIM j AS INTEGER
DIM k AS INTEGER
DIM flag AS INTEGER
DIM f AS STRING
expression = LTRIM$(RTRIM$(expr1))
flag = 0
k = 0
WHILE (flag = 0) AND (LEFT$(expression, 1) = "(") AND (RIGHT$(expression, 1) = ")")
FOR i = 2 TO LEN(expression) - 1
f = MID$(expression, i, 1)
IF f = CHR$(34) THEN k = k + 1
IF f = "(" AND (k MOD 2 = 0) THEN j = j + 1
IF f = ")" AND (k MOD 2 = 0) THEN j = j - 1
IF j < 0 THEN flag = 1
NEXT
IF flag = 0 THEN expression = MID$(expression, 2, LEN(expression) - 2)
WEND
expression = LTRIM$(RTRIM$(expression))
apple$ = expression
END FUNCTION
SUB error1
PRINT "Expression Error!"
WHILE INKEY$ = "": WEND
END
END SUB
FUNCTION eval% (exprstr AS STRING)
tree1bound = 1
tree1(1) = CHR$(1) + CHR$(0) + CHR$(0) + CHR$(0) + CHR$(255) + exprstr
strawberry
i627
eval% = CVI(RIGHT$(tree1(1), LEN(tree1(1)) - 5))
END FUNCTION
17 楼
lz27 [专家分:300] 发布于 2007-08-30 16:39:00
FUNCTION i112% (i AS INTEGER)
DIM j AS INTEGER
j = ASC(MID$(tree1(i), 5, 1))
IF j = 1 THEN
i112% = CVI(MID$(tree1(i), 6, LEN(tree1(i)) - 5))
ELSE
error1
END IF
END FUNCTION
18 楼
lz27 [专家分:300] 发布于 2007-08-30 16:39:00
SUB i627
DIM i AS INTEGER
DIM j AS INTEGER
DIM k AS INTEGER
DIM l AS INTEGER
DIM h AS INTEGER
DO
i = 1
l = 0
DO
IF ASC(MID$(tree1(i), 3, 1)) <> 0 THEN
i = ASC(MID$(tree1(i), 3, 1))
l = i
ELSE
IF ASC(MID$(tree1(i), 4, 1)) = 0 THEN
EXIT DO
ELSE
i = ASC(MID$(tree1(i), 4, 1))
END IF
END IF
LOOP
IF l = 0 THEN EXIT DO
k = ASC(MID$(tree1(l), 2, 1))
IF ASC(MID$(tree1(l), 4, 1)) <> 0 THEN h = ASC(MID$(tree1(l), 4, 1))
SELECT CASE ASC(MID$(tree1(k), 6, 1))
CASE 1
tree1(k) = LEFT$(tree1(k), 2) + CHR$(0) + MID$(tree1(k), 4, 1) + CHR$(1) + MKL$(i112%(l) ^ i112%(h))
CASE 2
tree1(k) = LEFT$(tree1(k), 2) + CHR$(0) + MID$(tree1(k), 4, 1) + CHR$(1) + MKL$(i112%(l) * i112%(h))
CASE 3, 4
tree1(k) = LEFT$(tree1(k), 2) + CHR$(0) + MID$(tree1(k), 4, 1) + CHR$(1) + MKL$(i112%(l) \ i112%(h))
CASE 5
tree1(k) = LEFT$(tree1(k), 2) + CHR$(0) + MID$(tree1(k), 4, 1) + CHR$(1) + MKL$(i112%(l) MOD i112%(h))
CASE 6
tree1(k) = LEFT$(tree1(k), 2) + CHR$(0) + MID$(tree1(k), 4, 1) + CHR$(1) + MKL$(i112%(l) + i112%(h))
CASE 7
tree1(k) = LEFT$(tree1(k), 2) + CHR$(0) + MID$(tree1(k), 4, 1) + CHR$(1) + MKL$(i112%(l) - i112%(h))
CASE 8
tree1(k) = LEFT$(tree1(k), 2) + CHR$(0) + MID$(tree1(k), 4, 1) + CHR$(1) + MKL$(i112%(l) AND i112%(h))
CASE 9
tree1(k) = LEFT$(tree1(k), 2) + CHR$(0) + MID$(tree1(k), 4, 1) + CHR$(1) + MKL$(NOT i112%(l))
CASE 10
tree1(k) = LEFT$(tree1(k), 2) + CHR$(0) + MID$(tree1(k), 4, 1) + CHR$(1) + MKL$(i112%(l) OR i112%(h))
CASE 17
tree1(k) = LEFT$(tree1(k), 2) + CHR$(0) + MID$(tree1(k), 4, 1) + CHR$(1) + MKL$(i112%(l) XOR i112%(h))
CASE 11
IF i112%(l) > i112%(h) THEN
tree1(k) = LEFT$(tree1(k), 2) + CHR$(0) + MID$(tree1(k), 4, 1) + CHR$(1) + MKL$(-1)
ELSE
tree1(k) = LEFT$(tree1(k), 2) + CHR$(0) + MID$(tree1(k), 4, 1) + CHR$(1) + MKL$(0)
END IF
19 楼
lz27 [专家分:300] 发布于 2007-08-30 16:40:00
CASE 12
IF i112%(l) < i112%(h) THEN
tree1(k) = LEFT$(tree1(k), 2) + CHR$(0) + MID$(tree1(k), 4, 1) + CHR$(1) + MKL$(-1)
ELSE
tree1(k) = LEFT$(tree1(k), 2) + CHR$(0) + MID$(tree1(k), 4, 1) + CHR$(1) + MKL$(0)
END IF
CASE 13
IF i112%(l) = i112%(h) THEN
tree1(k) = LEFT$(tree1(k), 2) + CHR$(0) + MID$(tree1(k), 4, 1) + CHR$(1) + MKL$(-1)
ELSE
tree1(k) = LEFT$(tree1(k), 2) + CHR$(0) + MID$(tree1(k), 4, 1) + CHR$(1) + MKL$(0)
END IF
CASE 14
IF i112%(l) >= i112%(h) THEN
tree1(k) = LEFT$(tree1(k), 2) + CHR$(0) + MID$(tree1(k), 4, 1) + CHR$(1) + MKL$(-1)
ELSE
tree1(k) = LEFT$(tree1(k), 2) + CHR$(0) + MID$(tree1(k), 4, 1) + CHR$(1) + MKL$(0)
END IF
CASE 15
IF i112%(l) <= i112%(h) THEN
tree1(k) = LEFT$(tree1(k), 2) + CHR$(0) + MID$(tree1(k), 4, 1) + CHR$(1) + MKL$(-1)
ELSE
tree1(k) = LEFT$(tree1(k), 2) + CHR$(0) + MID$(tree1(k), 4, 1) + CHR$(1) + MKL$(0)
END IF
CASE 16
IF i112%(l) <> i112%(h) THEN
tree1(k) = LEFT$(tree1(k), 2) + CHR$(0) + MID$(tree1(k), 4, 1) + CHR$(1) + MKL$(-1)
ELSE
tree1(k) = LEFT$(tree1(k), 2) + CHR$(0) + MID$(tree1(k), 4, 1) + CHR$(1) + MKL$(0)
END IF
END SELECT
LOOP
END SUB
20 楼
lz27 [专家分:300] 发布于 2007-08-30 16:40:00
FUNCTION orange$ (f0 AS STRING)
DIM f AS STRING
DIM rets AS STRING
DIM i AS INTEGER
DIM j AS INTEGER
DIM flag AS INTEGER
f0 = LTRIM$(RTRIM$(f0))
rets = "H"
f = MID$(f0, 1, 1)
flag = 0
IF f = "+" OR f = "-" OR (ASC(f) >= ASC("0") AND ASC(f) <= ASC("9")) THEN
FOR i = 2 TO LEN(f0)
IF NOT (ASC(MID$(f0, i, 1)) >= ASC("0") AND ASC(MID$(f0, i, 1)) <= ASC("9")) THEN flag = 1
NEXT
IF flag = 0 THEN
IF (VAL(f0) <= 32767) AND (VAL(f0) >= -32768) THEN
rets = CHR$(1) + MKI$(VAL(f0))
ELSE
error1
END IF
END IF
END IF
orange$ = rets
END FUNCTION
我来回复