摘要载入中…    请稍等…












内容载入中…    请稍等…

如长时间看不到内容,请关闭浏览器,重新打开此页!

芯友首页 应用软件 编程开发 网络硬件 资源下载 动漫音乐 精美图库 芯友论坛 视频教程 电脑技术QQ群:72845454
 ★★photoshop学友-史上最强播放器★★
 位置:编程开发>VB>VB-API文章
◎→ 本类最新
功能强大的SendMessage函数
Win95系统API函数大揭秘
WIN32 API的分类介绍--
WIN32 API的分类介绍--
WIN32 API的分类介绍--
WIN32 API
VB中用API函数实现文件夹列表
◎→相关资源
C语言入门视频教程
C#编程WinForm入门视频
Asp.net入门视频教程下载
VC++编程视频教程下载
VB窗体文章
HTML入门教程
VB基础视频教程
VB窗体文章
VB文件文章
VB数据库文章
VB-API文章
VB控制文章
◎→ 热门资源
利用API 使Text框只读
利用API 使Text框只读
利用 API 可以直接拨号
快速读取TextBox第N行的数据
可以直接用API改变textbox的扩展
将文件大小变成相应的字符串
功能强大的SendMessage函数

简单计算函数的编写过程


日期:2008-10-20 17:47:08    来源:互联网
   
 ·简单电子邮件发送程序 ·如何关闭/重新启动计算机?
 ·功能强大的SendMessage函数 ·如何使用 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语言程序function jdjs$(a%,b%)(附后)

  虽然调试通过了,却总不满足,一个简单算式的计算好象不至于
如此复杂。为此闷了两天,晚上停电,黑暗中却出现了灵感,赶紧深
入思考,得到思路二:

  根据算术运算先乘除后加减的规则,先搜索算式中的乘除号,进
行计算,其值作为新的元素,代替原来的三个元素,然后再搜索、计
算、替代……直到找不到乘除号,此时的算式只有加减,顺序进行加
减运算,即可得到结果。

  根据思路二,得到算法二:
A: 函数入口,仍需要两个参数a和b。
B: 搜索算式中的乘除号,若有则C;否则E
C: 计算与之相连的前后两个数,并赋值给第一个数。
D: 将后面的各元素均前移两位,形成新的算式,B
E: 如果只有一个元素,则G;否则F
F: 按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-N
DEFSTR C
DEFDBL D
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 CASE lx(a + 1)
CASE 1: da = da + db
CASE 2: da = da - db
CASE 3: da = da * db
CASE 4: 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

``````````````````````````````````````````````````````````
DEFINT A-B, I-N
DEFSTR C
DEFDBL D
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: EXIT FOR
END IF
NEXT
`FOR kk = a TO b: PRINT kk, csf(kk), lx(kk): NEXT `调试时用来
观察变量
IF ycc = 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  
 [1]

简单的聊天程序

如何让用户自行输入方程式,并计算其结果?

使用调用外部程序函数实现API函数高级功能

用VB编写定时关闭计算机的程序

--->QQ聊天记录偷看器 1.2┊操作简单支持所有QQ、TM版本┊简体中文绿色特别版
--->计算机等级考试训练模拟软件(三级网络技术) V1.05 破解版
--->计算机等级考试训练模拟软件(一级B) V2.04 破解补丁
--->由作者李俊编写的“熊猫烧香”病毒专杀工具
--->蓝光工程量计算稿 V1.86┊辅助结算人员完成工程量的计算┊简体中文绿色特别版
Tags:  简单 计算 函数 编写

芯友网版权所有 1999-2006 | 著作权与商标声明 | 法律声明 | 服务条款 | 隐私声明 | 联系我们