int GetOpt()
{
char ch=*pch++;
int opt=0;
switch(ch)
{
case '+':opt=ADD;break;
case '-':opt=SUB;break;
case '*':opt=MUL;break;
case '/':opt=DIV;break;
}
return opt;
}
function getNumber(var s:string):extended;
var i,code:integer;
begin
i:=1;
while s[i] in ['0'..'9','.'] do inc(i);
val(copy(s,1,i-1),result,code);
end;
试试看这个:
function expr(var s:string):extended;
//表达式求值 (4+5)*6-8*(1+1) = 38
// (4+5)*6/3-8*(1+4)=-22
//表达式两边要用()括起来
var
flag:boolean;
ch:char;
begin
flag:=false;
case s[1] of
'0'..'9' : result:=getNumber(s);
'(' : begin
delete(s,1,1);
result:=expr(s);
flag:=true;
end;
end;
while (s[1]<>')') do
begin
ch:=s[1];
delete(s,1,1);
case ch of
'+': result:=result+expr(s);
'-': result:=result-expr(s);
'*': if s[1]='('
then result:=result*expr(s)
else result:=result*getNumber(s);
'/': if s[1]='('
then result:=result/expr(s)
else result:=result/getNumber(s);
end; //case ch
end; //while s[1]
if flag then delete(s,1,1);
end;
DEFINT A-Z
DECLARE FUNCTION kh$ (x$)
DECLARE FUNCTION zl$ (x$)
DECLARE FUNCTION js$ (x$)
DECLARE FUNCTION lg$ (x$, a, n)
LINE INPUT "Please Input A Express:", x$
FOR a = 1 TO LEN(x$)
IF MID$(x$, a, 1) = "-" THEN MID$(x$, a, 1) = "_"
NEXT: PRINT "Result="; kh$(x$)
FUNCTION js$ (x$)
x$ = zl$(x$)
FOR a = 1 TO LEN(x$)
i$ = MID$(x$, a, 1)
IF i$ = "*" OR i$ = "/" THEN IF i$ = "*" THEN x$ = lg$(x$, a, 3) ELSE x$ = lg$(x$, a, 4)
NEXT
x$ = zl(x$)
FOR a = 1 TO LEN(x$)
i$ = MID$(x$, a, 1)
IF i$ = "+" OR i$ = "_" THEN IF i$ = "+" THEN x$ = lg$(x$, a, 1) ELSE x$ = lg$(x$, a, 2)
NEXT: js$ = x$
END FUNCTION
FUNCTION kh$ (x$)
FOR x = 1 TO LEN(x$)
i$ = MID$(x$, x, 1)
IF i$ = "(" THEN
k = k + 1: IF k = 1 THEN a = x
ELSEIF i$ = ")" THEN
k = k - 1
IF k = 0 THEN
b$ = MID$(x$, a + 1, x - a - 1)
MID$(x$, a, x - a + 1) = STRING$(x - a + 1, 32)
MID$(x$, a, x - a + 1) = kh$(b$)
END IF
END IF
NEXT: kh$ = js$(x$)
END FUNCTION
FUNCTION lg$ (x$, a, n)
DIM p AS DOUBLE, q AS DOUBLE
FOR x = a - 1 TO 1 STEP -1
s = ASC(MID$(x$, x, 1))
IF s = 42 OR s = 43 OR s = 95 OR s = 47 THEN EXIT FOR
NEXT
FOR y = a + 1 TO LEN(x$)
s = ASC(MID$(x$, y, 1))
IF s = 42 OR s = 43 OR s = 95 OR s = 47 THEN EXIT FOR
NEXT
p = VAL(MID$(x$, x + 1, a - 1)): q = VAL(MID$(x$, a + 1, y - 1))
IF n = 3 THEN
b$ = LTRIM$(STR$(p * q))
ELSEIF n = 4 THEN
b$ = LTRIM$(STR$(p / q))
ELSEIF n = 1 THEN
b$ = LTRIM$(STR$(p + q))
ELSEIF n = 2 THEN
b$ = LTRIM$(STR$(p - q))
END IF
MID$(x$, x + 1, y - 1) = STRING$(y - x - 1, 32)
MID$(x$, x + 1, y - 1) = b$: lg$ = x$
END FUNCTION
FUNCTION zl$ (x$)
FOR a = 1 TO LEN(x$)
IF MID$(x$, a, 1) <> " " THEN b$ = b$ + MID$(x$, a, 1)
NEXT: zl$ = b$
END FUNCTION