- 中查找“简单计算函数的编写过程”更多相关内容
- 中查找“简单计算函数的编写过程”更多相关内容
- ·上一篇文章:将文件大小变成相应的字符串
- ·下一篇文章:打开/关闭光驱门
简单计算函数的编写过程
计算主程序负责初始算式整理、算式中变量的赋值、脱括号及脱括号后的算式整理、调用简单计算函数、输出计算结果。 思路:如果第一个运算符是乘除,则计算它前后的两个数,其值作为新算式的第一个数,再继续计算这个新算式;如果是加减则用第一个数加减后面的算式(如果是减,还要将其后的+变为-,-变为+)。 这是一个递归的思路,据此得到以下算法:A: 函数入口,需要两个参数,分别表示该算式在大算式中的起止位 置。B: 如果算式中只有一个元素,则函数值等于该元素,L;否则CC: 如果算式中有三个元素,即“数符数”的形式,则D;否则ED: 计算它们,并将计算结果作为函数值,LE: 如果第一个运算符是乘除则F;否则HF: 计算前两个数,并将结果赋值给第二个数。G: 函数值等于以第二个数为起点的新算式的值。LH: 如果第一个运算符是+则I;否则JI: 函数值等于第一个加上以第二个数为起点的算式的值。LJ: 将后面的加号都换成减号,而减号则都换成加号。K: 函数值等于第一个数减去以第二个数为起点的新算式的值。L: 返回。 以此算法得到QB语言程序function jdjs$(a%,b%)(附后) 虽然调试通过了,却总不满足,一个简单算式的计算好象不至于如此复杂。为此闷了两天,晚上停电,黑暗中却出现了灵感,赶紧深入思考,得到思路二: 根据算术运算先乘除后加减的规则,先搜索算式中的乘除号,进行计算,其值作为新的元素,代替原来的三个元素,然后再搜索、计算、替代……直到找不到乘除号,此时的算式只有加减,顺序进行加减运算,即可得到结果。 根据思路二,得到算法二:A: 函数入口,仍需要两个参数a和b。B: 搜索算式中的乘除号,若有则C;否则EC: 计算与之相连的前后两个数,并赋值给第一个数。D: 将后面的各元素均前移两位,形成新的算式,BE: 如果只有一个元素,则G;否则FF: 按1±2→2,2±3→3,……的方法顺序计算。G: 返回最后那个元素的值。 以此算法得到QB语言程序function jdjs2$(a%,b%)(附后) 算法二思路简洁清晰,容易实现,而且因不用递归,节省了大量的堆栈操作,速度也应该更快。 附:两个简单计算函数源程序说明:程序中的csf()和lx()是主程序中定义的全局数组变量,csf存储算式各段,lx存储各段类型,这里规定+1 -2 *3 /4 (5 )6数字7。```````````````````````````````````````````````````````````DEFINT A-B, I-NDEFSTR CDEFDBL DFUNCTION jdjs$ (a, b) `简单计算函数之一, 递归算法IF a = b THEN `如果只有一个元素,则立即返回这个元素jdjs = csf(a)ELSEIF b - a = 2 THEN `如果有三个元素,即"数符数"的形式,则将计算结果返回da = VAL(csf(a)): db = VAL(csf(b))SELECT CASE lx(a + 1)CASE 1: da = da + dbCASE 2: da = da - dbCASE 3: da = da * dbCASE 4: da = da / dbEND SELECTjdjs = 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 2IF lx(kk) = 2 THEN lx(kk) = 1 ELSE IF lx(kk) = 1 THEN lx(kk)= 2NEXTjdjs = STR$(VAL(csf(a)) - VAL(jdjs(a + 2, b)))ELSE `如果是乘除号,则先计算这两个数并赋值给第二个数,然后进行递归处理IF lx(a + 1) = 3 THENcsf(a + 2) = STR$(VAL(csf(a)) * VAL(csf(a + 2)))ELSEcsf(a + 2) = STR$(VAL(csf(a)) / VAL(csf(a + 2)))END IFjdjs = jdjs(a + 2, b)END IFEND IFEND IFEND FUNCTION``````````````````````````````````````````````````````````DEFINT A-B, I-NDEFSTR CDEFDBL DFUNCTION jdjs2$ (a, b) `简单计算函数之二, 先乘除后加减的算法DO: ycc = 0 `该循环先进行算式中的乘除运算. Ycc记录算式中有无乘除号FOR I = a + 1 TO b - 1 STEP 2IF lx(I) > 2 THENIF lx(I) = 3 THENcsf(I - 1) = STR$(VAL(csf(I - 1)) * VAL(csf(I + 1)))ELSEcsf(I - 1) = STR$(VAL(csf(I - 1)) / VAL(csf(I + 1)))END IFFOR k = I TO b - 2: csf(k) = csf(k + 2): lx(k) = lx(k + 2): NEXT `整理算式ycc = 1: EXIT FOREND IFNEXT`FOR kk = a TO b: PRINT kk, csf(kk), lx(kk): NEXT `调试时用来观察变量IF ycc = 1 THEN b = b - 2LOOP UNTIL ycc = 0IF b > a THEN `再按顺序进行加减运算,如果只有一个元素,则跳过下面的循环,直接返回它FOR I = a + 1 TO b - 1 STEP 2IF lx(I) = 1 THENcsf(I + 1) = STR$(VAL(csf(I - 1)) + VAL(csf(I + 1)))ELSEcsf(I + 1) = STR$(VAL(csf(I - 1)) - VAL(csf(I + 1)))END IFNEXTEND IFjdjs2 = csf(b)END FUNCTION
Tags:
作者:佚名评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论