第2章语言概述及程序设计基础.docx
《第2章语言概述及程序设计基础.docx》由会员分享,可在线阅读,更多相关《第2章语言概述及程序设计基础.docx(21页珍藏版)》请在冰点文库上搜索。
第2章语言概述及程序设计基础
第二章VFP程序设计基础
2.1数据类型及数据容器
1.数据类型:
数据对象的取值集合。
VFP的基本数据类型
字段类型
代号
说明
字段宽度
使用示例
字符型
C
由任意字母、数字,空格,汉字和符号组成
每个字符为1个字节,最多可有254个字符
学生的学号或姓名,"8199101"或'李立',[ss]
货币型
Y
货币单位
8个字节
工资,$1246.89
日期型
D
包含有年、月,日的数据
8个字节
出生日期,
{^02/25/2000}
日期时间型
T
包含有年、月、日、时、分、秒的数据
8个字节
上班时间,
{02/25/20009:
15:
15AM}
逻辑型
L
“真”或“假”的布尔值
1个字节
课程是否为必修课,
.T.或.F.
数值型
N
整数或小数
在内存中占8个字节;在表中占1至20个字节
考试成绩,83.5
通用型
G
OLE对象
在表中占4个字节
图片或声音
备注型
M
不定长度的一段文字
在表中占4个字节
学生简历
2.数据容器
VFP中用来存储数据的容器有:
常量、变量、数组、记录和对象。
(1)常量(constants):
一个在操作过程中保持不变的数值或字符串。
常量类型
数值型常量
字符型常量
逻辑型常量
日期型常量
表示方式
-25.36
"abc","123","中国"
.T..F.
{^03/07/2000}
(2)内存变量(variables):
是内存中的一个存储单元的位置,其中的内容可以变化,但标识该存储位置的名称(即变量名)不变。
◆变量的赋值方式:
1)用STORE命令如:
STORE"王兰"TOc1,c2,c3
2)用赋值操作符“=”如:
c1="王兰"
◆变量的作用域:
即变量起使用的有效范围。
变量作用域
定义作用域的关键字
特点
局部变量
LOCAL
只能在一个函数或过程中被访问,其他过程或函数不能访问此变量的数据。
当其所属程序停止运行时,局部变量将被释放。
私有变量
PRIVATE
私有变量在VFP中是默认的,不需要特殊的关键字定义。
但是,如果在更高一级例程(routine)中已经有同名变量,可以用PRIVATE关键字予以声明,以限定其范围。
当定义此变量的例程结束时,此变量也被相应释放。
可使用私有变量在被调用的函数中共享数据。
公共变量
PUBLIC
可用于所有过程和函数,而不限于定义该变量的过程和函数。
可使用全局变量在多个过程或函数之间共享数据,在命令窗口中创建的任何变量自动具有全局属性。
◆变量的访问:
当变量和字段同名时,字段有优先被访问权。
要在变量名前加m.或m->以示区别,如m.cStud
例:
对学生表中字段进行访问。
◆内存变量的保存与恢复
内存变量是系统在内存中设置的临时存储单元,当退出VFP时数据自动丢失,可以使用SAVETO命令将变量保存到文件中。
Savetofilename[alllike通配符|allexcept通配符]
Restorefromfilename[additive]
(3)数组(array):
是存储在一个变量中由单个变量名引用的有序数据集合。
在VFP中,一个数组中的数据不必是同一种数据类型。
常用的有一维数组,二维数组。
◆数组元素的标识:
通过一个数值下标来引用,如AA
(2),AA(2,3)
◆数组类型的声明:
私有数组——用DECLARE或DIMENSION定义
全局数组——用PUBLIC定义
局部数组——用LOCAL定义
DIMENSION/DECLARE/PUBLIC/LOCALAA(2,5)
◆数组元素的赋值:
AA=45&&给数组的名字赋值相当于给数组中所有元素赋值。
AA
(1)=45&&给数组中元素赋值。
补充:
将二维数组转化为一维数组。
(4)记录:
表中的一行,由字段组成。
使用命令输出表中的一条记录。
Browse/display/listfor
2.2运算符及其表达式
1.命令
即:
由用户发出的、指示VFP进行某种操作的指令。
如USEaaa&&打开一个名为aaa.dbf的数据表
2.运算符
数值运算符
()
^或**
*
/
%(取余数)
+
-
关系运算符
<
<=
>
>=
<>或!
=或#==
逻辑运算符
()
NOT或!
(非)
AND(和)
OR(或)
日期和时间运算符
+
-
注意:
日期型:
天数时间型:
秒数
字符运算符:
+
-
$
两个特殊的运算符
圆点操作符(.):
用于分隔对象的名称以及分隔对象中的属性、事件、方法。
范围转变操作符(:
:
):
提供了从一个子类中调用一个父类的方法。
3.表达式
即:
变量、运算符、常量、函数、字段名、控制以及属性的组合,求值结果为单个值。
Ø算术表达式:
由算术操作符和数值型数据构成的表达式,结果为数值型。
例?
15%4+1&&结果为4
Ø字符表达式:
由字符操作符和字符型数据构成的表达式结果为字符型。
注意:
“+”,“-”,“$”
Ø日期表达式:
由日期操作符和日期、时间型数据构成的表达式。
注意:
1Dexpression–Expression结果为日期型
2Dexpression-Dexpression结果为数值型
Ø逻辑表达式:
由逻辑操作符和逻辑型数据构成的表达式,结果为逻辑型。
A
B
A.AND.B
A.OR.B
.NOT.A
F
F
F
F
T
F
T
F
T
T
T
F
F
T
F
T
T
T
T
F
Ø关系表达式:
用于对同类型的数据的比较,其运算结果为逻辑型
例:
?
{^2001/01/12}>{^2001/02/15}&&结果为.F.
?
5>2&&结果为.T.
?
“abc”>”bcd”&&结果为.F.
(1)设置字符的排序顺序
setcollateto
machine:
按照机内码顺序排序
空格<大写字母<小写字母<一级汉字<二级汉字
pinyin:
(默认)汉字按拼音排序,对于西文字符大小关系
空格<小写字母<大写字母
stroke:
按汉字书写笔画的多少排序,对于西文字符大小关系
空格<小写字母<大写字母
(2)字符串精确比较
使用“=”进行精确比较会受到SETEXACTON/OFF的影响:
1.setexactoff:
如果右边比左边长,则为假,如果右边比左
边短,则从左边取与右边等长的字符串与右边进行比较。
Setexactoff
?
”bcde”=”bc”,”bc”=”bcde”,”bc”=”bc”
?
”bc”=”bc”,”bcde”=”bcde”
2.setexacton:
通过在字符后加空格的方法使两个字符串的
长度相等,然后进行比较。
Setexactoff
?
”bcde”=”bc”,”bc”=”bcde”,”bc”=”bc”
?
”bc”=”bc”,”bcde”=”bcde”
Ø名称表达式:
由圆括号括起来的一个字符表达式,用来替换命令或函数中的名称。
例:
DBF_NAME="xs"
USE(DBF_NAME)
Ø宏替换:
用宏替换符号&表示,并用一个点符号(.)来结束这个宏替换表达式,它与名称表达式具有相似的作用。
例:
已知A="1",B="2",C12="GOOD"
则C&A&B=
nvar=100
nvarb=100
var_name=”nvar”
store123.4to&var_name
store200to&var_name.b
例题:
阅读下列程序,并填写运行结果。
CLEAR
x=”OK”
STORE“学习”TOy
ok=’努力’
?
&x+(y)
运行以上程序后,屏幕显示的结果时 。
2.3函数(按照书本的顺序讲解)
即:
一个预先编制好的模块,可由VFP程序在任何地方调用。
函数的使用方法:
名称、功能、参数、返回值
自定义函数:
由用户为自己的应用程序创建的专用函数,可作为独立的程序文件保存在磁盘上也可作为过程文件存放在其他程序中。
2.4程序设计基础
1.基本概念
程序:
为解决某一问题而设计的一系列指令。
主程序:
通常被用户直接执行的程序。
子程序:
在程序中被调用的程序。
2.创建与运行程序
◆创建程序:
VFP程序是包含一系列命令的文本文件,扩展名为.Prg
(1)项目管理器创建
(2)ModifyCommand程序名
◆运行程序
(1)在项目管理器中运行
(2)Do程序名with参数
注意点:
程序文件(.prg),编译后的程序文件(.fxp)
3.程序结构:
顺序结构,分支结构,循环结构,子程序结构
(1)顺序结构:
即按程序中的语句顺序依次执行。
举例:
计算圆的面积
**计算园面积**
p=3.1415926&&园周率
r=10&&园的半径
s=p*r^2
l=2*p*r
?
'园面积为'+alltrim(str(s,10,2))
?
'园周长为'+alltrim(str(l,10,2))
(2)分支结构
条件语句:
情况语句:
IF条件
命令组1
[ELSE
命令组2]
ENDIF
DOCASE
CASE情况1
命令组1
CASE情况2
命令组2
…
[OTHERWISE
其它命令组]
ENDCASE
举例:
1.根据X的正负情况决定Y的值(1,-1)
***根据X的正负情况决定Y的值(1,-1)
ifx>0
y=1
else
y=-1
endif
?
y
2.根据成绩输出等级
X=82
Docase
Casex>=90
?
”优秀”
Casex>=80
?
”良好”
Casex>=70
?
”中等”
Casex>=60
?
”及格”
Casex<60
?
”不及格”
Endcase
(3).循环结构
FOR
循环语句(预知循环次数)
FOR变量=初值TO终值[STEP步长]
命令组
ENDFOR|NEXT
DOWHILE
循环语句(未知循环次数)
DOWHILE条件
命令组
ENDDO
SCAN
循环语句(针对全部记录)
SCAN[范围][FOR|WHILE条件]
命令组
ENDSCAN
举例:
1。
求1到100的所有整数的和(奇数之和)
***求100以内的整数之和
n=100
s=0
forI=1tonstep1
s=s+I
endfor
?
alltrim(str(n))+”以内的整数和s=”,s
2.求100的阶乘
***100的阶乘
p=1
forI=1ton
p=p*I
endfor
?
alltrim(str(n))+”以内的阶乘p=”,p
3.将由ASSCII码字符组成的字符串进行反序显示,任意字符呢?
***将由ASSCII码字符组成的字符串进行反序显示
store“abcdefg”toc,cc
p=space(0)
dowhilelen(c)>0
p=left(c,1)+p
c=substr(c,2)
enddo
?
cc+”的反序为:
”+p
***将由任意字符(包括汉字)组成的字符串进行反序显示
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
4.统计学生籍贯为江苏南京的学生人数
***统计学生籍贯为江苏南京的学生人数
usexs
s=0
scan
ifxs.jg=”江苏南京”
s=s+1
endif
endscan
?
”籍贯为江苏南京的学生人数”,s
循环结构中的LOOP命令和EXIT命令:
ØLOOP是短路语句,表示从此开始下一次循环;
ØEXIT是退出语句,表示跳出循环。
举例:
1.求1—100之间非3的倍数的所有奇数之和。
***求1-100之间非3的倍数的所有奇数之和
s=0
forI=1to100step2
ifmod(I,3)=0
loop
endif
s=s+I
endfor
?
”1-100之间非3的倍数的所有奇数之和为”,s
2.随机产生一个要求在70到80之间的数。
***随机产生70-80之间的数
x=0
dowhile.t.
x=rand()*100
ifx>70andx<80
exit
endif
enddo
?
x
(4).子程序
子程序的的形式可以是一个程序文件,也可以是一个过程或自定义函数。
子程序
自定义函数
过程
特点
总是被其他程序调用而不单独执行,可以调用其他子程序,不一定要返回一个值。
能以一个独立的文件储存,也可包含在调用程序中,必须返回一个值。
是一个程序段,是程序的组成部分,一般放在程序的最后。
定义方法
与程序相同,只是在子程序的结尾加需一条返回命令:
RETURN[表达式|TOMASTER|TO程序文件名]
FUNCTION函数名
PARAMETERS参数表
命令组
RETURN表达式
注:
用此命令定义的函数以独立的文件形式储存。
PROCEDURE过程名
PARAMETRS参数表
命令组
RETURN
调用方法
DO子程序名[WITH参数表]
=函数名(参数表)
DO过程名WITH参数表
3.过程与用户自定义函数
用户可以将经常执行的具有某种功能的一段代码独立出来,创建一个过程或用户自定义函数。
如果需要多次用到该功能,就不必多次编写代码,而只需调用这个过程或自定义函数。
(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]
2.4程序设计事例
*****以下部分为自定义函数
***自定义函数ntoc
functionntoc
parameterspdigit
localcstring
cstring=”零一二三四五六七八九”
returnsubstr(cstring,pdigit*2+1,2)
endfunc
***自定义函数dtocc():
将日期型数据转换为“XXXX年XX月XX日”
Functiondtocc
Parametersdedate
Cyear=str(year(dedate),4)+”年”
Cmonth=str(month(dedate),2)+”月”
Cday=str(day(dedate),2)+”日”
Returncyear-cmonth-cday
Endfunc
FUNCTIONJC
PARAMETERSnum&&传递一个数值参数num,返回num的阶乘
s=1
FORn=1TOnum
s=s*n
ENDFOR
RETURNs
***程序功能:
计算数列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
******程序功能:
统计由ASCII码字符组成的字符串中包含字母的个数
CLEAR
cString="TheUnitedStatesofAmericaisabbreviatedtoU.S.A.."
nResult=0
DOWHILELEN(cString)>0
c=LEFT(cString,1)
IFBETWEEN(c,"a","z")orBETWEEN(c,"A","Z")
nResult=nResult+1
ENDIF
cString=SUBSTR(cString,2)
ENDDO
?
"包含"+ALLT(STR(nResult))+"个英文字母"
*********以下部分为自定义函数
计算S=1!
+2!
+3!
+4!
+。
。
。
+10!
s=0
FORn=1TO10
s=s+fjk(n)
ENDFOR
?
s
***自定义函数fjk()用于计算阶乘
FUNCTIONsjk
PARAMETERSx&&传递一个数值参数x,返回x的阶乘
p=1
FORn=1TOx
p=p*n
ENDFOR
RETURNp
Endfunc
历年考试试题示例:
1.在VisualFoxPro系统中,下列命名中不能作为变量名的是______。
A.姓名 B.2004姓名 C.姓名2004 D._2004学生
2.在VisualFoxPro系统中,下列表示中不属于常量的是_________。
A..T. B.[T] C."T" D.T
3.函数INT(-3.14)的返回值是___________。
A.-4 B.-3 C.3 D.4
4.执行下列命令后,屏幕上显示的结果是____________。
X="AREYOUOk?
"
Y="are"
?
AT(Y,X)
A.1 B..F. C..T. D.0
5.运行以下程序后,VFP主窗口显示的结果是_______。
CLEAR
N=0
DOWHILEn〈10
IFINT(n/2)=n/2
?
”W”
ENDIF
?
?
“Fox”
n=n+1
ENDDO
A.显示5行,内容均为WFoxFox B.显示5行,内容均为WfoxWFox
C.显示4行,内容均为WFoxFox D.显示4行,内容均为FoxFoxW
6.完善下列程序,以显示7~1000以内能被7整除且含有数字5的所有整数(例如35、56、105等)。
FORn=7TO1000
ch=ALLT(STR(n))
IF "5"$ch
?
n
ENDIF
ENDFOR
7.运行下列程序后,显示的运行结果的第二行为
SETTALKOFF
CLEAR
Y="11111111"
FORI=1TOLEN(y)
X=LEFT(y,i)
?
SPACE(20-i*2)+x+"*"+x+"="+ALLT(STR(VAL(x)*VAL(x)))
ENDFOR
典型例题:
程序改错(10分)
1、下列程序的功能是统计一个字符串中包含多少个汉字(假设这些汉字均属于GB2312字符集),其基本算法是从字符串中依次取一个字符,如果其ASCII码值大于127,则为一个汉字内码的第一个字节。
要求:
(1)项目中有一个程序文件Pcode,将下列程序输入到其中并进行修改;
(2)在修改程序时,不允许修改程序的总体框架和算法,不允许增加或减少语句数目。
cString=”Microsoft)公司开发的视窗(Windows)操作系统’&&赋初值
nCount=0
DOWHILELEN(cString)=0
IFASC(LEFT(cString,1))>127
nCount=nCount+1
cString=SUBSTR(cString,3)
ELSE
CString=SUBSTR(cString,1)
ENDIF
ENDDO
WAITWINDOWS’汉字个数为’+str(nCount)
2.下列程序的功能是:
将一个字符串中的各个单词的首字母组成其缩写形式(大写字母),其中,字符串由多个英文单词组成且各单词之间用一个空格分隔,例如,对于字符串“centralprocessingunit”,生成其缩写形式“CPU”。
其基本算法为:
字符串左边加一个空格,然后依次检查字符串的每一个字符,如果该字符为字母且左边为空格,则该字母为首字母。
要求:
(1)目中有一个程序文件Pco