回 帖 发 新 帖 刷新版面

主题:让你呕吐三天的题

输入一个表达式(关系,逻辑,计算)
输出它的值
例:
input:(3+(4>5 or 5<=6))*23-(1>2)
output :46

回复列表 (共31个回复)

11 楼

不吐,我用VB写过了,还支持所有的三角函数、反三角,指数对数幂等所有的初等函数,还有逻辑运算,按位运算
不过代码就长了点而已

12 楼

楼上的 你这个代码可不可以 放在网上看一看啊
我也写过一个 用freebasic 不过只支持整数 很复杂的

13 楼

11楼的,那再加一点难度:支持字符串。

14 楼

不能给你代码,最多给个编译好的程序你看看(我的代码实在写得糟糕)

15 楼

'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 楼

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 楼

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 楼

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 楼

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 楼

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

我来回复

您尚未登录,请登录后再回复。点此登录或注册