vb基础   vb实例教程   api调用   控件使用   经验技巧   数据库操作   算法及技术   vb源码下载
您的位置:首页 >> vb教程 >> vb基础

简单计算函数的编写过程
出处:网络

    计算主程序负责初始算式整理、算式中变量的赋值、脱括号及脱括号后的算式整理、调用简单计算函数、输出计算结果。
    思路:如果第一个运算符是乘除,则计算它前后的两个数,其值作为新算式的第一个数,再继续计算这个新算式;如果是加减则用第一个数加减后面的算式(如果是减,还要将其后的+变为-,-变为+)。
    这是一个递归的思路,据此得到以下算法:
A:函数入口,需要两个参数,分别表示该算式在大算式中的起止位置。
B:如果算式中只有一个元素,则函数值等于该元素,L;否则C
C:如果算式中有三个元素,即“数符数”的形式,则D;否则E
D:计算它们,并将计算结果作为函数值,L
E:如果第一个运算符是乘除则F;否则H
F:计算前两个数,并将结果赋值给第二个数。
G:函数值等于以第二个数为起点的新算式的值。L
H:如果第一个运算符是+则I;否则J
I:函数值等于第一个加上以第二个数为起点的算式的值。L
J:将后面的加号都换成减号,而减号则都换成加号。
K:函数值等于第一个数减去以第二个数为起点的新算式的值。
L:返回。
以此算法得到QB语言程序functionjdjs$(a%,b%)(附后)
虽然调试通过了,却总不满足,一个简单算式的计算好象不至于
如此复杂。为此闷了两天,晚上停电,黑暗中却出现了灵感,赶紧深
入思考,得到思路二:
根据算术运算先乘除后加减的规则,先搜索算式中的乘除号,进
行计算,其值作为新的元素,代替原来的三个元素,然后再搜索、计
算、替代……直到找不到乘除号,此时的算式只有加减,顺序进行加
减运算,即可得到结果。
根据思路二,得到算法二:
A:函数入口,仍需要两个参数a和b。
B:搜索算式中的乘除号,若有则C;否则E
C:计算与之相连的前后两个数,并赋值给第一个数。
D:将后面的各元素均前移两位,形成新的算式,B
E:如果只有一个元素,则G;否则F
F:按1±2→2,2±3→3,……的方法顺序计算。
G:返回最后那个元素的值。
以此算法得到QB语言程序functionjdjs2$(a%,b%)(附后)
算法二思路简洁清晰,容易实现,而且因不用递归,节省了大量
的堆栈操作,速度也应该更快。
附:两个简单计算函数源程序说明:程序中的csf()和lx()是主
程序中定义的全局数组变量,csf存储算式各段,lx存储各段类型,这
里规定+1-2*3/4(5)6数字7。
DEFINTA-B,I-N
DEFSTRC
DEFDBLD
FUNCTION jdjs$(a,b)简单计算函数之一,递归算法
IF a=b THEN如果只有一个元素,则立即返回这个元素
jdjs=csf(a)
ELSE
IF b-a=2 THEN'如果有三个元素,即"数符数"的形式,则将计算
结果返回
da=VAL(csf(a)):db=VAL(csf(b))
SELECT CASElx(a+1)
CASE1:da=da+db
CASE2:da=da-db
CASE3:da=da*db
CASE4:da=da/db
END SELECT
jdjs=STR$(da)
ELSE'如果有更多的元素,则应根据以下情况分别处理
IF lx(a+1)=1 THEN'第一个运算符如果是“+”,则进行递归处理
jdjs=STR$(VAL(csf(a))+VAL(jdjs(a+2,b)))
ELSEIF lx(a+1)=2 THEN'如果是"-",则需要将后面的加减号对调,然后进行递归处理
FOR kk=a+3 TO b-1 STEP 2
IF lx(kk)=2 THEN
lx(kk)=1
ELSE
IF
lx(kk)=1 THEN
lx(kk)=2
NEXT
jdjs=STR$(VAL(csf(a))-VAL(jdjs(a+2,b)))
ELSE'如果是乘除号,则先计算这两个数并赋值给第二个数,然后进行
递归处理
IF lx(a+1)=3 THEN
csf(a+2)=STR$(VAL(csf(a))*VAL(csf(a+2)))
ELSE
csf(a+2)=STR$(VAL(csf(a))/VAL(csf(a+2)))
END IF
jdjs=jdjs(a+2,b)
END IF
END IF
END IF
END FUNCTION
DEFINTA-B,I-N
DEFSTRC
DEFDBLD
FUNCTION jdjs2$(a,b)'简单计算函数之二,先乘除后加减的算法
DO:ycc=0'该循环先进行算式中的乘除运算.Ycc记录算式中有无
乘除号
FOR I=a+1 TO b-1 STEP 2
IF lx(I)>2 THEN
IF lx(I)=3 THEN
csf(I-1)=STR$(VAL(csf(I-1))*VAL(csf(I+1)))
ELSE
csf(I-1)=STR$(VAL(csf(I-1))/VAL(csf(I+1)))
END IF
FOR k=I TO b-2:csf(k)=csf(k+2):lx(k)=lx(k+2):NEXT'整理算式
ycc=1:EXITFOR
END IF
NEXT
'FOR kk=a TO b:PRINTkk,csf(kk),lx(kk):NEXT'调试时用来
观察变量
IFycc=1 THEN b=b-2
LOOP UNTIL ycc=0
IF b>a THEN'再按顺序进行加减运算,如果只有一个元素,则跳过下
面的循环,直接返回它
FOR I=a+1 TO b-1 STEP 2
IF lx(I)=1 THEN
csf(I+1)=STR$(VAL(csf(I-1))+VAL(csf(I+1)))
ELSE
csf(I+1)=STR$(VAL(csf(I-1))-VAL(csf(I+1)))
END IF
NEXT
END IF
jdjs2=csf(b)
END FUNCTION

[返回]

     

首页 | 设为首页 | 加入收藏 | 关于本站 | 友情链接 | 版权声明

     
 
Copyright© www.bianceng.cn Powered by 编程入门网 All Rights Reserved
吉ICP备06005558号