回 帖 发 新 帖 刷新版面

主题:计算算术表达式(不使用括号)的值

计算算术表达式(不使用括号)的值:
如输入:3*6+4*5^3-48/12
则输出:514

回复列表 (共3个回复)

沙发

3*6+4*5^3-48/12
=18+4*125-4
=18+500-4
514

板凳

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 楼

上面程序中的“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$)

我来回复

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