第5章 程序设计基础.docx
《第5章 程序设计基础.docx》由会员分享,可在线阅读,更多相关《第5章 程序设计基础.docx(17页珍藏版)》请在冰豆网上搜索。
第5章程序设计基础
第五章程序设计基础
5.1程序设计概述
程序设计是利用系统所提供的设计工具,按照程序设计语言的规范描述解决问题的算法并进行程序编写的过程。
这个过程包括分析,设计,编码,测试和排错等不同阶段。
程序设计的方法主要有两类:
⏹结构化程序设计(structuredprogramming,SP)
⏹面向对象的程序设计(object-orientedprogramming,OOP)
面向对象的程序设计是通过对类、子类和对象等的设计来体现的,类是面向对象程序设计技术的核心。
类:
定义了对象特征以及对象外观和行为的模板,类有如下特征:
◆封装性:
隐藏了类中对象的内部数据或操作细节,只看到外表信息。
◆继承性:
任何类都可以从其它已有的类中派生,新类保持了父类中的行为和属性,但增加了新的功能。
体现了面向对象设计方法的共享机制。
◆多态性:
相同的操作可作用于多种类型的对象上,并获得不同的结果。
◆抽象性:
提取一个类或对象与众不同的特征,而不对该类或对象的所有信息进行处理。
5.2结构化程序设计
结构化程序设计:
是指根据不同的情况和条件,控制程序去执行相应操作的语句序列
程序控制结构主要有:
顺序结构,分支结构,循环结构和子程序,任何一个程序可以含有多种程序结构
5.2.1创建,修改与运行程序
1.创建和修改程序文件
VFP程序是包含一系列命令的文本文件,扩展名为.Prg
创建程序文件:
⑴.通过菜单创建:
⑵.通过命令:
ModifyCommand程序名
2.运行程序
(1)在项目管理器/常用工具栏运行
(2)Do程序名with参数
注意点:
在VFP中,一旦运行程序文件,系统会自动地对程序文件(.prg)进行编译,生成“伪编译”程序(.fxp),执行程序时,系统实质上是执行.FXP文件
5.2.2顺序结构
顺序结构:
是指程序运行时按照语句排列的先后顺序,一条一条地依次执行。
举例1:
**计算园面积**
p=3.1415926&&园周率
r=10&&园的半径
s=p*r^2
l=2*p*r
?
'园面积为'+alltrim(str(s,10,2))
?
'园周长为'+alltrim(str(l,10,2))
5.2.3分支结构
所谓分支结构:
是指程序运行过程中,根据条件执行不同的操作。
两种实现分支语句:
IFELSEENDIF
DOCASEENDCASE
条件语句:
情况语句:
IF条件1
命令组1
[ELSE
命令组2]
ENDIF
DOCASE
CASE条件1
命令组1
CASE条件2
命令组2
…
[OTHERWISE
其它命令组]
ENDCASE
举例2:
***根据X的正负情况决定Y的值(1,-1)
ifx>0
y=1
else
y=-1
endif
?
y
举例3:
***求解一元二次方程的根(三个参数分别对应于一元二次方程的系数,parameters语句用于接收程序的参数)
Parametersa,b,c
Ifa=0
=messagebox(“二次项目系数不能为零”,48)
Return&&该语句的作用是结束当前程序的执行并返回
Endif
Delta=b*b-4*a*c
Ifdelta>0
?
”方程有两个不等的实数根:
”
?
?
(-b+sqrt(delta))/(2*a)
?
?
(-b-sqrt(delta))/(2*a)
Else
Ifdelta=0
?
”方程有两个相等的实数根:
”
?
?
–b/2*a
Else
?
”方程有两个复根:
”
Real_part=–b/2*a
Img_part=sqrt(-delta)/(2*a)
?
alltrim(str(real_part,6,2))+”+”+allt(str(img_part,6,2))+”i”
?
alltrim(str(real_part,6,2))+”-”+allt(str(img_part,6,2))+”i”
Endif
Endif
举例4:
***根据给定的成绩输出成绩所在的等级
X=82
Docase
Casex>=90
?
”优秀”
Casex>=80
?
”良好”
Casex>=70
?
”中等”
Casex>=60
?
”及格”
Casex<60
?
”不及格”
Endcase
5.2.4循环结构
循环就是使得一组语句重复执行若干次,可以预先指定要循环的次数,也可以根据某个条件控制循环,有三种循环结构:
FORENDFOR;
DOWHILEENDDO;
SCANENDSCAN;
1.FORENDFOR循环:
若预先知道循环的次数
FOR循环(预知循环次数)
FORnvar=初值TO终值[STEP步长]
循环体语句
ENDFOR|NEXT
nvar是用来作为计数器使用的循环变量,计数器有初值和终值
在循环体中可以包含LOOP和EXIT语句:
LOOP语句:
是短路语句,用于将控制直接返回给FOR语句,即忽略LOOP后的循环体语句,以进入新的一次循环;
EXIT语句:
是退出语句,用于将控制传递给ENDFOR语句后的第一条语句,即跳出语句;
FOR循环的执行过程:
(1)将初值赋给循环变量nvar;
(2)判断循环变量的值是否超出终值,若超出终值,则结束循环,否则执行循环体;
(3)计算循环变量的值:
循环变量=循环变量+步长;
(4)转到
(2)步骤执行。
举例5:
求1到100的所有整数的和(所有奇数,所有偶数之和)
n=100
s=0
forI=1tonstep1
s=s+I
endfor
?
alltrim(str(n))+”以内的整数和s=”,s
举例6:
求100的阶乘(1*2*3*……*99*100)
p=1
forI=1ton
p=p*I
endfor
?
alltrim(str(n))+”以内的阶乘p=”,p
举例7:
将英文字母组成的字符串加密(如果大写则用其后面的第四个代替原子母,如果小写则用其后面的第二个代替原子母)
M=space(0)
Cstring=”China”
Fori=1tolen(cstring)
Nc=asc(substr(cstring,I,1))
Ifnc>64andnc<91
M=m+chr(nc+4)
Else
M=m+chr(nc+2)
Endif
Endfor
Waitwindowscstring+”字符加密后为:
”+m
举例8:
求1—100之间非3的倍数的所有奇数之和。
s=0
forI=1to100step2
ifmod(I,3)=0
loop
endif
s=s+I
endfor
?
”1-100之间非3的倍数的所有奇数之和为”,s
2.DOWHILEENDDO循环:
如果预先不能确定循环的次数,而要根据某一条件决定是否结束循环,则可用DOWHILE循环
DOWHILE循环
DOWHILE条件1
循环体语句
ENDDO
举例9.将由ASCII码字符组成的字符串进行反序显示,任意字符呢?
store“abcdefg”toc,cc
p=space(0)
dowhilelen(c)>0
p=left(c,1)+p
c=substr(c,2)
enddo
?
cc+”的反序为:
”+p
举例10.将由任意字符(包括汉字)组成的字符串进行反序显示
store“abcdefg汉语”toc,cc
p=space(0)
dowhilelen(c)>0
x=asc(left(c,1))
ifx>127
I=2
Else
I=1
endif
p=left(c,i)+p
ifi=1
c=substr(c,2)
else
c=substr(c,3)
endif
enddo
?
cc+”的反序为:
”+p
举例11.程序功能:
计算数列1,1/2,1/3,1/4……,1/n之和,当某一项的值与前一项的值之差小于0.001时停止计算。
CLEAR
n=1
m=1
nSum=0
DOWHILE.T.
nSum=nSum+1/n
m=1/n
n=n+1
IFm-1/n<0.001
exit
ENDIF
ENDDO
?
"该数列的和为:
",nSum
3.SCANENDSCAN循环:
仅用于处理表的记录,若对表中所有记录执行某一操作,可以用该语句
SCAN循环语句
SCAN[scope][FOR条件]
循环体语句
ENDSCAN
举例12.统计籍贯为江苏南京的学生人数
usexs
s=0
scan
ifxs.jg=”江苏南京”
s=s+1
endif
endscan
?
”籍贯为江苏南京的学生人数”,s
5.2.5过程与自定义函数
用户可以将经常执行的具有某种功能的一段代码独立出来,将其作为一个过程或用户自定义函数。
如果需要多次用到该功能,就不必多次编写代码,而只需调用这个过程或自定义函数。
过程通常用于实现某一处理功能,而函数用于实现某一处理功能并且有返回值。
只是定义上有点区别,在可以实现的功能和调用方法上没有区别
子程序的形式可以是一个程序文件,也可以是一个过程或自定义函数。
1.过程与自定义函数的定义
过程定义语法:
PROCEDURE过程名
Parameters参数列表
命令组
[return[表达式]]
ENDPROC
函数定义语法:
FUNCTION函数名
Parameters参数列表
命令组
[return[表达式]]
ENDFUNC
说明:
1。
Parameters用来传递参数
2.Return用于指定过程或自定义函数的返回值,缺省时,返回值为真(.T.)
2.过程与函数的创建方法
方法一:
在命令窗口中输入:
MODIFYCOMMAND程序名
方法二:
单击文件菜单→新建→程序→新文件→在编辑窗口中编辑程序→完成后关闭→给出合适的程序名及保存位置。
程序的注释:
方法1:
*|NOTE<注释内容>可出现在程序中的任何地方
方法2:
&&<注释内容>一般用于命令的尾部
给程序加注释的目的是为了提高程序的可读性。
用户创建的过程或自定义函数可以存储在数据库的存储过程中,或以一个程序文件保存一个或多个过程或自定义函数,如果过程或自定义函数存在于单独的程序文件中,该程序文件称为过程文件。
3.过程与自定义函数的调用
方法一:
用DO命令
do过程名[in程序文件名][with实际参数列表]
方法二:
用函数的调用方法。
Functionname(实际参数列表)
方法三:
利用SETPROCEDURETO命令打开程序文件。
SETPROCEDURETOprogramname1
doprocedurename[withparameterlist]
举例13以下自定义函数ntoc()功能是将0-9之间的阿拉伯数字转换为一个“零-九”之间的中文数字。
functionntoc
parametersn
localcstring
cstring=”零一二三四五六七八九”
returnsubstr(cstring,n*2+1,2