主题:计算算术表达式(不使用括号)的值
tangran
[专家分:20] 发布于 2005-05-13 14:43:00
计算算术表达式(不使用括号)的值:
如输入:3*6+4*5^3-48/12
则输出:514
回复列表 (共3个回复)
沙发
amwkfbb [专家分:50] 发布于 2005-05-14 09:45:00
3*6+4*5^3-48/12
=18+4*125-4
=18+500-4
514
板凳
moz [专家分:37620] 发布于 2005-05-14 12:25:00
1. 用val和mid$按顺序抽取数字和运算符号
2. 根据运算规则计算运算顺序
3. 执行运算求和
用你的题目举例吧,但只能假设只运算四则运算和乘方,其他函数嘛.....
i$="3*6+4*5^3-48/12"
'[color=000080]'先处理一下把含有的空格去除先,预防万一[/color]
for i=len(i$) to 1 step -1
if mid$(i$,i,1)=space$(1) then i$=left$(i$,i-1)+mid$(i$,i+1)
next
l=len(i$)
m=100
'[color=000080]'假设最多运算数字为100个吧[/color]
dim n(m),f$(m)
for i=1 to m
j=j+1
n(i)=val(mid$(i$,j))
if n(i)=0 and mid$(i$,j,1)<>"0"then print "出错了"
j=j+len(str$(n(i)))-1
if j>l then
f$(i)="end"
exit for
endif
f$(i)=mid$(i$,j,1)
next
if i>m then print "运算的个数超过了";m;"个,请重新修改程序"
do until i=1
h=h+1
if h>=i then exit do
if yun(f$(h+1))<=yun(f$(h)) then
n(h)=desu(n(h),f$(h),n(h+1))
i=i-1
for ii=h to (i-1)
f$(ii)=f$(ii+1)
n(ii+1)=n(ii+2)
next
f$(ii)=f$(ii+1)
h=0
end if
loop
print "运算结果是";n(1)
system
function yun(a$)
yun=(instr(1,"最后 +- */\ ^ ",a$)+1)\5
'[color=000080]把运算符号分等级,每五个符号为一级吧,当然了,这随你喜欢去更改的[/color]
end function
function desu(a,b$,c)
select case b$
case "^"
desu=a^c
case "*"
desu=a*c
case "\"
desu=a\c
case "/"
desu=a/c
case "+"
desu=a+c
case "-"
desu=a-c
case else
'[color=000080]'有其他运算规则照样加上去喽[/color]
end select
end function
[color=000080]其实有了这个方法就可以把它做成函数,处理括号就不是问题,可以找到最里层的括号,也就是算式中最后左括号,和这个左括号右边的第一个右括号,把算式当参数计算出来后就可以把这一对括号取消掉,再继续这步骤直到得到结果[/color]
上面这个办法有点过火,其实不应该走回头路的。
我还有一种更方便的办法:
i$="3*6+4*5^3-48/12"
f$="计算.bas" '当然还可以用英文文件名的
ff=freefile
open f$ for output as #ff
print #ff,"print ";i$ '呵呵,还可以更改输出到文件以便你再利用的
print #ff,"system"
close
run f$
3 楼
moz [专家分:37620] 发布于 2005-05-14 16:15:00
上面程序中的“1. 用val和mid$按顺序抽取数字和运算符号 ”效果好像不太好,识别不了重复的0,如果 i$="0003*5+0000*90" 这样就会出错了,
所以要换一下抽取的方法:
su$=""
for k=1 to len(i$)
k$=mid$(i$,k,1)
if instr(1,".0123456789", k$)then
su$=su$+k$
p=1
elseif instr(1,"^+-*/\",k$)then
if p=0 and k$="-" then
su$=su$+k$
else
i=i+1
f$(i)=k$
n(i)=val(su$)
su$=""
endif
p=0
else
print "算式中有其他非法字符"
endif
next
i=i+1
f$(i)="end"
n(i)=val(su$)
我来回复