第2章 VF程序设计基础.docx
- 文档编号:29026153
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:22
- 大小:52.04KB
第2章 VF程序设计基础.docx
《第2章 VF程序设计基础.docx》由会员分享,可在线阅读,更多相关《第2章 VF程序设计基础.docx(22页珍藏版)》请在冰豆网上搜索。
第2章VF程序设计基础
Vf程序设计基础
(数据类型:
数据有不同类型,不同地方用的数据类型是不一样,C,N,D(8),L
(1),I(4),T(8),Y(8),M(4)……注意有些字段的宽度是系统规定的)
2.1常量与变量P48
1、常量(P48)值不变
字符型(C):
1、三种定界符,单引号、双引号、中括号(英文的标点符号)
‘’,“”,[]必须成对出现,两边一致
2、空串与包含空格的字符串不同‘’与‘’
要点3、定界符本身也是字符串内容时,需用另外一种定界符为该字符串定界
合法:
‘K“ABC”S’,‘[DDD]’,'"五一"庆祝会'
非法:
[[ABC]],““AAN””,““五一”庆祝会”
数值型(N):
1、注意科学记数法5.878E12等于5.878*10^12
整型I宽度系统定义4个字节(不含小数)
货币型(Y):
1、小数自动四舍五入取4位2、用8个字节表示(宽度)
?
$12345.67896====>12345.6790
日期型(D):
{}称定界符,^称脱字符,分隔符有3种(/,-,.)
用8个字节表示(宽度)
1、严格的日期格式:
{^2006/09/01},任何情况下可以用
2、传统的日期格式受SETSTRITO0|1的设置影响
3、日期格式的设置命令
SETCENTURYON|OFF年份用4位|2位(2010年9月11小题)
SETMARKTO用什么分隔符’\’,’-‘,’.’
如:
SETMARKTO‘-‘(注意一定加定界符)
SETDATETOYMD按‘年月日’的格式Y:
年M:
月D:
日
(默认显示是“月/日/年”)
日期时间型(T)
逻辑型(L):
1、用一个字节表示2、真、假值(.T.和.F.或.Y.和.N.)3、.T.>.F.为真
2、变量(P52)
值可以随时更改,变量有内存变量(及数组变量)和字段变量
1命名规则:
名字组成可以是字符(包括汉字)、下划线、数字
要点:
但不能以数字开头,只能以字符(英文、中文)或下划线开头。
合法:
A12,AB,_AB
非法:
1A,2B
2变量赋值
“=“:
单个变量赋值(“=”也可以是关系(比较)运算符,注意区别)
STORETO:
多个变量赋相同值
A=56&&把数值型常量56赋给变量A
STORE80TOD,B,C
变量的值是最后一次赋的值(要点)
A=24&&把24这个数值型常量赋给变量A,A是数值型变量,其值为24
A=‘BNM’&&把’BNM’这个字符型常量赋给变量A,A是字符型变量,其值为’BNM’
?
A&&结果是BNM字符
AccepttoA
IFA=[123]
S=0
ENDIF
S=1
?
S
A)0B)1C)123D)由A的值确定(2010年3月笔试29题)
内存变量的数据类型由其值决定(要点)
A=12则变量A是一个数值型的内存变量。
B=‘ABC’,则变量B是一个字符型的内存变量。
3、输出变量的值:
?
,?
?
A=12
?
A
要点:
当内存变量和字段变量同名时,优先输出字段变量的值,如要输出内存变量的值,应指明是内存变量?
M->内存变量或M.内存变量
举例:
假设职员表已在当前工作区打开,其当前记录的“姓名”字段值为“李彤”(C型字段)。
在命令窗口输入并执行如下命令:
姓名=姓名-“出勤”
?
姓名
屏幕上会显示
A)李彤B)李彤出勤C)李彤出勤D)李彤-出勤
(2010年3月笔试27题)
4、内存变量其他命令
显示(DISPMEMO或LISTMEMO)
LIKE模糊匹配,*、?
表示任意一串或一个(通配符)
清除CLEARMEMO
例:
LISTMEMOLIKEA*显示以字母A开头的内存变量
数组:
一般先定义,后使用P52
二维数组F(A,B)F:
数组名,A、B是下标,A、B的最小值是1,共有A*B个元素,每个元素初值都为.F.
1、创建或定义数组DIMEF(2,3)或DECLAREF(2,3)
定义一维数组DIMEF(9)定义二维数组DIMEF(2,3)
2、定义数组后,每个元素初值为.F.(要点)
3、F=3,则所有元素的值都赋值3
4、用一维数组的形式访问二维数组:
(按行的顺序访问)
二维
F(1,1)
F(1,2)
F(1,3)
F(2,1)
F(2,2)
F(2,3)
一维
F
(1)
F
(2)
F(3)
F(4)
F(5)
F(6)
(要点)
表与数组
表当前记录复制到数组元素中:
SCATTER……TO数组名
USECHENGJI&&打开数据表CHENGJI
GO6&&指针指向第6条记录
SCATTERTOF&&自动定义一个数组,数组名F,元素和数据表的字段个数相同
?
F
(1),F
(2)
数组复制到表当前记录:
GATHERFROM数组名
2.2表达式P55
常量、变量、函数通过特定的运算符连接起来P56
特别注意:
数据类型匹配
数字表达式:
同数学的算术表达式,运算符,()、*、+……结果:
数值注意:
如A是变量,则(A)是表达式
字符表达式:
+(完全连接),-(不完全连接)?
‘ABC’-‘ABC’
结果:
字符
日期表达式:
日期-日期,日期+N,日期-N结果:
日期或数值
要点:
日期+日期是非法
关系表达式:
运算符号P58结果:
逻辑型
数值、货币、日期数据比较(先比较“年”,再比较“月”,最后比较“天”)
字串包含测试:
A、B是字符型变量,A$B,A是B的子串,则为真,否则为假。
?
‘女’$’男女’——>.t.
?
‘学生’$’大学生’->.t.
假设有一个字段变量:
姓名姓名中含有“张“字,则‘张’$姓名——>.t.
姓“张”的记录,则姓名=‘张’——>.t.
或SUBST(姓名,1,2)=‘张’---->.T.
或LEFT(姓名,2)=‘张’----->.T.
字符排序:
工具——选项——数据——排序序列中设置
ASCII码:
?
MAX(‘2’,’12’,’05’),MAX(2,12,05)
拼音:
?
MIN(‘章’,’柳’,’陈’),
字符比较:
?
‘人’>’人民’,’人’<’人民’结果.F.和.T.
注意?
'abc'>'ab','abc'<'ab','abc'='ab'——>.F..F..T.
要点:
1、相等比较运算时,右边字符串同左边字符串的开始部分,为真
2、关系运算符的两边数据一定要匹配
3、和$运算的区别,例查找姓王的同学(=),查找名字中有“王”字的同学($)
假设数据表中有字段:
姓名,用VF命令LISTFOR条件,则
判定姓王的同学的条件:
姓名=’王’--->.T.
判定姓名中有“王”字的同学的条件:
’王’$姓名--->.T.
特别注意:
姓名是字段变量,因此不能加定界符
字符串精确比较与EXAC设置(要点)P59
==:
精确比较(绝对等于)
SETEXACON|OFF:
是|否严格OFF是默认设置
1、“==”:
不管EXAC的设置,精确比较“==“要两边完全相同(含空格),则.t.,否则为.f.
2、“=”:
(1)SETEXACOFF(非严格比较):
右边的字符串同左边字符串的开始部分,.T.
(2)SETEXACON(严格比较):
等长(短的尾部补空格)
再进行精确比较(左右是否完全一样)
例:
A=’AB‘
B=’AB’
C=’ABC’
SETEXACOFF
?
A==B,A=B,B=A,B=C,C=B结果:
.F..T..F..F..T.
SETEXACON
?
A==B,A=B,B=A,B=C,C=B结果:
.F..T..T..F..F.
逻辑表达式:
.T.>.F.为真结果:
逻辑型
优先级(高——>低):
非(NOT),与(AND),或(OR)
与:
且,两边必须都为真结果才是.T.,其他都是.F.。
或:
或者,两边的表达式结果都为.F.时才是.F.,其他都是.T.
运算符优先级:
算术—字符—日期—关系—逻辑
例子:
?
((10%3=1)AND15-2=0)OR‘电脑’!
=’计算机’
?
((1=1)and13=0)OR‘电脑’!
=’计算机’
(.T.AND.F.)OR.T.
.F.OR.T.
.T.
2.3函数P61
(带*或**和加粗的是要点,其他函数要弄清楚大概功能)
数值函数P61-62
1、绝对值函数和符号函数ABS(<数值表达式>)SIGN(<数值表达式>)
2、平方根函数SQRT(<数值表达式>)
**4、取整函数INT(<数值表达式>)
5、四舍五入函数ROUND(<数值表达式1>,<数值表达式2>)
6、余数函数MOD(<数值表达式1>,<数值表达式2>)
字符函数P62-63
**1、字符串长度函数LEN(<字符表达式>)
?
len(space(10)-space(10))
2、大小写转换函数upper()、lower()
**3、空格字符生成函数SAPCE(<数值表达式>)
**4、删除前后空格函数ALLTRIM(<字符表达式>)
A=’abcdefg‘
?
len(a)
?
len(allt(a))
**5、取子串函数SUBSTR、LEFT、RIGHT
A=’计算机科学技术’
?
SUBSTR(A,7,4)---->科学
?
LEFT(A,6)------>计算机
?
RIGHT(A,4)------>技术
有如下赋值语句,结果为”大家好”的表达式是
a=”你好”
b=”大家”
A)b+at(a,1)B)b+right(a,1)C)b+left(a,3,4)D)b+right(a,2)
(笔试试卷出现多次)
6、计算字串出现次数函数OCCURS(< 字符表达式1>,<字符表达式2>)
?
OCCU(‘计’,’计算机是计算的机器’)
**7、求子串位置函数AT()结果:
数值型
?
AT(‘is’,’thisisbook’,1)---->3
?
AT(‘is’,’thisisbook’,2)----->6
?
AT(‘人民’,’中华人民共和国’)----->5
8、子串替换函数STUFF()
?
STUFF(‘GOODBYE’,6,3,’MORNING’)
9、字符替换函数CHRTRAN()
?
CHRTRAN(‘ABACAD’,’ACD’,’X12’)
*11、日期时间函数P65
**年份、月份、天函数
?
year({^2005/06/28})
A={^2008/06/28}
?
year(a),MONTH(A),DAY(A)-------->数值型数据
数据类型转换函数P66
*12、数值转换字符STR(〈数值表达式〉,……)数字——>字符
A=-123.456
?
STR(A,9,2),STR(A,6,2),STR(A)
字符转换数值VAL(〈字符表达式〉)字符——>数值
A=’-3212B12’
?
VAL(A)
*13、字符转换成日期CTOD()
*日期转换成字符DTOC()
A=DATE()
?
DTOC(A)&&转换后输出的格式MM/DD/YYYY
?
DTOC(A,1)&&带参数1,则转换后输出的格式是YYYYMMDD,没有分隔符
?
LEFT(DTOC(A,1),4)------>2010
**14、宏替换函数&,替换出字符型变量的内容P67
A=’10+90’
?
a
?
&a,&a+500
X=50
Y=100
Z=”x+y”
?
50+&z
例:
2010年9月笔试16题
*15、测试函数P68-70
1)值域测试函数BETWEEN?
BETWEEN(50,50,200)包含两头
2)空值测试函数ISNULL.null.相当于不确定(输入CTRL+0)
3)“空值”测试函数EMPTY()?
EMPTY(0)“空值”对于不同的数据类型不同
例:
?
EMPTY(.null.),EMPTY(45),EMPTY(''),EMPTY(0)
?
ISNULL(SPACE(0)),ISNULL(.null.),ISNULL(45)
4)数据类型测试函数VARTYPE()
?
VARTYPE(TIME())----->c&&时间函数的数据类型返回值是字符
?
VARTYPE(123)------->n&&返回数据类型是数值
?
vartype(.null.)-------->X&&“空值”的返回值是X
*16、表文件头BOF()、尾EOF()、记录号RECNO()、记录个数RECCOUNT()测试函数
例:
数据表ABC有20条记录
USEABC
?
BOF()----->.F.
SKIP-1
?
BOF()----->.T.
?
RECNO()----->当前记录号的值是1
GOBOTTOM
?
EOF()------>.F.
Skip
?
eof()------>.T.
?
recno()------->注意,当前记录号的值是21
注意:
空表的bof()和eof()函数都为真
理解:
DOWHILENOTEOF()这个循环语句的条件是什么意思
推导:
EOF()->尾,值真。
NOTEOF()->非尾,真。
要点理解:
当指针不是指向文件尾时,运行循环体,直到指针指向文件尾止
USEBMK
DOWHILENOTEOF()
DISP&&显示当前记录
SKIP&&指针下移
ENDDO
*17、条件测试函数
?
IIF(LEN(SPACE(5))<>5,1,-1)------>?
例:
2010年笔试考试填空第8小题
2.4程序与程序文件P71
1、注释&&
2010/9笔试笔试28题
3月11题
续行(分号);
2、程序文件的建立与修改命令P72
MODICOMM<文件名>建立以.prg为扩展名的命令文件
运行:
DO文件名,真正运行的是经过编译的文件:
.FXP
MODIFILE<文件名>建立以.txt为扩展名的文本文件
运行:
DO文件名.txt
两者区别,都要求熟练
3、简单的输入、输出命令
命令
输入是否保存
数据类型
否回车
其他
INPUT
保存
N,C,L,DC
是
字符型数据加定界符
ACCE
保存
C
是
字符型数据不加定界符
WAIT
否保存
C
否
字符型数据不加定界符
例:
input‘请输入一个数’tox
2.5程序的基本结构P75
结构化程序三种基本结构:
顺序结构、选择结构、循环(重复)结构(笔试要点)
一、顺序结构:
依次运行程序中的语句
二、选择结构:
IF-ENDIF语句和DOCASE-ENDCASE语句
SETTALKOFFSETTALKOFF
CLEARCLEAR
INPU'输入一个正整数'toxINPU'输入一个正整数'tox
IFX>=300docase
?
'A'casex>=300
ELSE?
‘A’
IFX>=200CASEX>=200
?
'B'?
‘B’
ELSECASEX>=100
IFX>=100?
‘C’
?
'C'OTHERWISE
ELSE?
‘D’
?
'D'ENDCASE
ENDIF
ENDIF
ENDIF
输入一个数80结果是:
输入一个数120结果是:
要使输出结果为B,X要满足什么条件?
改成DOCASE语句怎么实现?
三、循环结构
1、条件循环DOWHILE—ENDDO语句,注意循环体中的LOOP和EXIT
I=5
DOWHILEI>0
?
I
I=I-1
ENDDO
2、FOR---ENDFOR语句(记数循环),注意循环体中的LOOP和EXIT
输入10个数,找出最大的和最小的数
见P81面例子:
从键盘输入十个数,找出最大和最小的数
3、SCAN—ENDSCAN语句(扫描循环,针对数据表)P81
格式:
SCANFOR条件
<循环体>
ENDSCAN
执行该语句时,记录指针自动、依次在指定范围内满足条件的记录上移动,对每一条记录执行循环体内的命令(指针自动向下移动,直到文件尾)
类似DOWHILE.not.eof()
循环体
SKIP
ENDDO
例根据一个“成绩“表的分数填写字段“等级”,分别用上面两个语句设计程序
假设“成绩”表有“分数”、“等级”等字段,分数60或以上,等级填“及格”,否则填“不及格”,用DOWHILE循环设计程序:
USE成绩&&打开成绩表,指针指向第1条记录
DOWHILENOTEOF()
IF分数>=60
REPL等级WITH“及格”
ELSE
REPL等级WITH“不及格”
ENDIF
SKIP&&指针下移一条记录
ENDDO
用SCANFOR循环设计程序:
USE成绩&&打开成绩表,指针指向第1条记录
SCANFOR分数>=60
REPL等级WITH“及格”
ENDS
……
例1、把成绩表中所有成绩>=60(及格)的记录显示出来
2、把不及格的记录做删除标记(逻辑删除)
2.6多模块程序设计P82
为什么要用到模块设计:
将大的应用程序划分为一个个功能单一的模块程序,便于开发、阅读和维护
模块:
可以是命令文件、子程序、过程文件、过程、(函数)
过程有什么作用?
&&主程序
settalkoff
inpu"请输入一个自然数:
"toa
?
JSJC(a)
SETTALKON
&&下面是过程
procJSJC
paran
s=1
forx=1ton
s=s*x
endfor
returns
&&过程返回S的值
过程作用:
重复调用,精简主程序便于开发、阅读和维护(签名与盖章的关系)
过程的定义:
PROC过程名
命令序列
ENDPROC
过程可以放在主程序的后面
参数传递P84
下面程序ABC.PRG:
&&主程序开始
CLEAR
STORE100TOX1,X2
P4(X1,X2)
?
“调用过程后X1,X2的值是:
”,X1,X2
&&主程序结束
&&过程开始
PROCP4
PARAA,B
STOREA+1TOA
STOREB+1TOB
ENDPROC
&&过程结束
1、过程调用有两种格式:
1)DOP4WITHX1,X2
2)P4(X1,X2)
2、认识形参(形式参数),实参(实际参数),形参数目不能少于实参(要点)
3、参数传递有:
按值传递:
形参变量值的改变不影响实参(单向)
X1——>AX2——>B
按引用传递:
形参变量值改变时,实参值也随之改变(双向)
X1——>A——>X1X2——>B——>X2
4、怎么传递?
(要点)
1)如果实参是表达式(变量加括号就是表达式)
无论哪一种过程调用格式,形参不影响实参,单向传递
2)如果实参是变量
1、DO过程名WITH实参1,实参2……双向传递
2、过程名(实参1,实参2……),单向传递,除非设置SETUDFPTOREFE
过程中的参数传递用以上要点去验证操作
(笔试原题)假设有程序ABC.PRG,代码如下:
输出结果是什么?
&&主程序
clear
store3tox
store5toy
PLUS(X,Y)
?
x,y
&&过程
PROCPLUS
PARAA1,A2
A1=A1+A2
A2=A1+A2
ENDPROC
结果是:
A)35B)813C)313D)813
(笔试原题)下例程序执行的结果是
X1=20
X2=30
SETUDFPARMSTOvalue
DOTESTWITHX1,X2
?
X1,X2
PROCEDURETEST
PARAMETERSa,b
x=a
a=b
b=x
endpro
A)3030B)3020C)2020D)2030
变量的作用域P86
1)全局变量,用PUBLIC声明的变量,在任何模块都可以使用的,一直有效。
(除非用CLEARMEMO命令清除)
命令窗口中直接使用的变量是全局变量,DISPMEMO验证
2)私有变量,在程序中直接使用的(没有任何声明),作用域是建立它的模块及其下属模块
私有变量所在的程序关闭,程序运行结束,自动清除。
实例操作程序中验证
3)局部变量,只能在建立它的本层模块中使用(上、下层都不能使用),用LOCAL声明的
全局:
整个矩形区域私有:
整个大圆区域局部:
圆环区域
变量的隐藏的作用:
子程序或过程的变量值不影响主程序的同名变量
格式:
PRIVATE<内存变量表>(PRIVATE:
私有,隐藏)
例(笔试原题)
X=2
Y=3
?
X,Y
DOSUB1
?
?
X,Y
PROCSUB1
PRIVY
X=4
Y=5
RETURN
选择:
A、2345B、2343C、4545D、2323
SETTALKOFF
CLEAR
STORE3TOX
STORE5TOY
DOPLUS
?
X,Y
PROCPLUS&&过程
PRIVATEX&&变量X隐藏,其值改变不影响主程序的同名变量,
X=100
Y=200&&变量Y没有隐藏,影响主程序中的变量Y的值
ENDPROC
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第2章 VF程序设计基础 VF 程序设计 基础