1、1,第2章 语言概述及程序设计基础,淮海工学院计算机系 陈加顺,2,2.4 数据类型和字段类型,1.数据类型 字符型(C) 由任意字符(字母、数字、空格、符号等)组成 每个字符占一个字节,最多可有254个字符 字符型的常量要用英文的单引号或双引号括起来 (不可用中文标点)如:“A0001”、数学系 由数字组成的编码,它们认同字符型数据 货币型(Y) 当涉及货币时使用,取代数值型,小数位数超过4位自动舍去 宽度为8字节 使用货币型数据要在前面加上符号“$”,如:$100,3,2.4 数据类型和字段类型,数值型(N) 表示数量 由数字09、小数点、正负号组成 内存变量18字节,字段变量120字节
2、小数点和小数位数是字段总长度的一部分 浮点型(F) 与数值型等价 包含此类型是为了提供兼容性,4,2.4 数据类型和字段类型,日期型(D) 用于存储有关年月日的数据 宽度为8字节 日期型常量要放在花括号中, 如:dDate=02/24/2010 dBlank=:空日期 系统默认格式为mm/dd/yy,可通过SET DATE、SET MARK、SET CENTURY命令设置日期格式,或通过系统的“选项”对话框中的“区域”卡中设置,5,2.4 数据类型和字段类型,日期时间型(T) 在保存日期、时间或二者兼有时使用 宽度为8字节,第一个4字节保存日期,其余保存时间 与日期型一样,要用“”将数据括起来
3、 可同时包含日期时间,也可只包含两者之一 若缺省日期系统用1899年12月30日填入,若缺省时间,系统用午夜零点填入 若要指定空日期时间值,要在花括号中加一个冒号,如::EXAMPLE,6,2.4 数据类型和字段类型,逻辑型(L) 只含有两个值:真(.T.)、假(.F.) 宽度固定,为1字节 是一种高效的存储方法 双精度型(B) 用于存储精度较高、位数固定的数值 宽度为8字节 小数点的位置由输入的数值决定,7,2.4 数据类型和字段类型,整型(I) 用于存储无小数的数值 宽度为4字节 备注型(M) 用于在表达式存储数据块 宽度为4字节 存储指向备注文件中具体内容的指针 备注文件:.FPT,8,
4、2.4 数据类型和字段类型,通用型(G) 用于存储OLE对象 宽度为4字节 表中存储的是指向OLE对象的引用 链接OLE(Object Linking and Embedding)对象 嵌入OLE对象,浮点型、双精度型、整型、备注型、通用型、 只能用于字段。,9,2.4 数据类型和字段类型,2.常量与变量 (1)名称命名规则 名称中只能包含字母、汉字(中文版)、下划线“_”和数字符号; 名称的开头只能是字母、汉字或下划线,不能是数字; 除了自由表的字段名、表的索引标识名至多只能10个字符外,其余的名称的长度可以是在1128个字符; 避免使用系统的保留字; 字母不分大小写。,10,2.2 存储数
5、据容器,(2)常量 常量的值在操作过程中始终保持不变 数值型常量即常数,表示数量大小,由数字、小数点和正负号构成,占8字节对于特大或特小可用浮点数表示 例:3.12E28 货币型常量 表示货币值,表示时需加上符号,11,字符型常量 也称字符串,它是由字符串“定界符”括起来的一串字符,这些字符可以是一切可以表示的字符 定界符可以是单引号、双引号或方括号 注意点:不能使用中主标点为的单引号或双引号作为字符串的定界符;定界符必须成对匹配;若某种定界符本身是字符串的内容,则需要用另一种定界符表示该字符串;不包含任何字符的字符串是空串,与包含空格的字符串不同;字符串的字母,其大小写不等价,12,逻辑型常
6、量 取值有两个真或假 表示形式:表示真.T.或.t.或.Y.或.y. ;表示假有.F. 或.f.或 .N.或 .n. 日期型常量和日期时间型常量 用花括号作定界符 分隔符:年月日间用斜扛或连字符或点符号或空格;时分秒用冒号 传统日期格和严格日期格式,13,变量 变量的创建,内存中一个存储单元的位置(地址) 变量名是存储位置的符号表示; 变量分为内存变量和字段变量两种; 用赋值号“=”或用STORE命令创建变量、赋值。 cSchool=“Suzhou University” nSum=0 STORE 0 TO A,B,C,D,E,不特别说明的话,通常变量就是指内存变量。,创建变量的同时给变量赋值
7、。,“Store”与“=”区别,14,控制变量的访问,LOCAL(声明局部变量) 用LOCAL创建的变量只能在创建他们的程序中使用; 不能被更高层或更低层的程序访问。 PRIVATE(声明私有变量) 将调用程序中定义的变量在当前程序中隐藏起来,用户可在当前程序中使用同名变量而不影响变量的原始值; PUBLIC(声明全局变量) 在当前工作期中任何程序都能使用和修改全局变量,命令窗口中声明的变量是全局变量。,15,访问变量,在VFP中,若变量与字段同名,字段具有更高的优先权。 要访问变量,可在变量前加上:m.或m-。 示例: 当前打开的表中有XS字段,且当前记录的Xh值为“001”,在命令窗口中下
8、命令: Xh=222 ?Xh,m-Xh 返回结果为:“001” 222,?:返回变量或表达式的值; ?:返回的结果在同一行显示。,16,内存变量的保存与恢复,保存内存变量是系统在内存中设置的临时存储单元,当退出VFP时,数据自动丢失,若要保存便于以后使用,可用命令SAVE TO 格式如下 :SAVE TO FileName ALL LIKE Skeleton| ALL EXCEPT Skeleton说明:FileName为内存变量文件名。 Skeleton为变量名通配符,用于指定哪些变量需要保存或哪些变量不需要保存 例:SAVE TO mVar ALL LIKE ?Yan*,17,内存变量的保
9、存与恢复,恢复将内存变量文件中所保存的内存变量恢复到内存,可以使用RESTORE FROM命令,格式如下:RESTORE FROM FileName ADDITIVE,18,数 组,数组也是变量; 数组由一系列被称为元素的有序数据构成; 两要素:数组名和序号(下标); VFP中数组的最大维数为二维; 数组在使用前必先声明 DECLARE:声明私有数组 DIMENSION:声明私有数组 PUBLIC:声明全局数组 LOCAL:声明局部数组,数组在声明之后,元素的初值为.F.。,19,数 组,数组是一种特殊的内存变量,它是存储在内存中的有序的数据值系列,其中的数据值被称为元素,并可通过数据序号引用
10、。 数组声明 格式:DECLEAR | DIMENSION | PUBLIC | LOCAL 数组名(行数,列数) DECLEAR xx(4) DIMENSION XY(4),XZ(5,2) PUBLIC AB(20), CB(40) DECLEAR CC(4,10), DD(10,4),20,给数组元素赋值,DIMENSION AA6,3 AA1,2=2 &数组的第二个元素被赋值2 AA=3 &数组的全部元素被赋值3 BB=AA &把数组第一个元素的值赋给变量BB ?AA &显示数组第一个元素的值,21,数据存储窗口的作用域,22,3. 函数Vfp提供的函数称为”系统函数”,用户定义的函数称
11、为“用户自定义函数” 一般格式: 函数名(参数1,参数2,) 数据类型类函数 字符函数、数值函数、日期时间函数、数据转换函数 数据库类函数 环境类函数 输入输出类函数 程序设计类函数,23,ALLTRIM():首尾去空 ASC() :取ASC码 AT()/ATC():检测子串在主串中的位置 LEFT()/RIGHT():取串左/右边子串 LEN():串长 LOWER()/UPPER():转换为小/大写 MAX()/MIN():取最大/小值 SPACE():产生空格 SUBSTR():取子串,24,常用函数,ABS():取绝对值 INT():取整 MOD():取余 RAND():随机数(01)
12、ROUND():四舍五入函数 CDOW():以字符返回星期几 CMONTH():取月份(字符) DATE():取系统日期,25,常用函数,DAY():取系统日期中的“日” DOW():取星期几(17) HOUR():取小时 MINUTE():取分钟 MONTH():取月份 YEAR():取年份 CHR():根据所给数值给出字符 CTOD():字符型转日期型 DTOC():日期型转字符型 DATETIME():取系统日期时间,26,常用函数,STR():数值转字符 VAL():字符转数值 BETWEEN():是否在中间 EMPTY():是否空 TYPE():类型 FCOUNT() :取表的字段总
13、数 FIELD() :取表的字段名 USED() :测试表是否打开 RECCOUNT() :返回记录总数,27,常用函数,BOF() :记录开始标记 EOF() :记录结束标记 RECNO() :当前记录号 GETFILE() :弹出“打开”对话框 PUTFILE() :弹出“另存为”对话框 GETDIR():弹出“选择目录”对话框 GETCOLOR():弹出“颜色”对话框 RGB() :返回一个颜色 MESSAGEBOX() :消息对话框 IIF():条件成立返回第一结果,否则返回第二个结果,28,4. 运算符 数值运算符,29,字符操作符,30,日期和日期时间操作符 注:不可以对两个日期型
14、数据或日期时间型数据进行相加运算+:一个日期型的量与一个整数之间的运算; -:日期与整数、日期与日期的运算。 逻辑操作符NOT(!):取反运算,即:NOT .T.=.F.,NOT .F.=.T.,31,逻辑与运算(AND),串联系电路中,当灯泡L1与L2同时亮时,安培表中才有电流。,32,逻辑或运算(OR),并联电路中, 灯泡L1和L2中有一个亮, 安培表中即有电流。,33,关系运算符,关系操作符:、=、=、= 在比较过程中决定大小有三种不同的比较方式: Machine序列 按照机内码顺序 PinYin序列 按拼音顺序 Stroke序列 按笔画多少排序 可以通过“选项”和“数据”选项卡设置 或
15、通过命令SET COLLATE命令,格式SET要COLLATE TO “Machine”?AB, aA,A,混合表达式中,运算符的优先级为:字符、日期和时间、 算术运算符优先于关系运算符,关系运算符优先于逻辑运 算符。,34,设置精确比较精确比较的结果受SET EXACT 命令所设置的系统环境影响当使用SET EXACT OFF时,若“=”右边的字符串长度比左边的短,则左边的字符串取右边长度相同的子字符串参加比较当使用SET EXACT ON 时,通过在字符串后面加空格的方法使两个字符串的长度相等,然后进行比较 例: SET EXACT ON ? “BCDE”=“BC” & .F. ? “BC
16、”=“BCDE” & .F. ? “BC ”=“BC” &.T. ? “BC”=“BC ” &.T. ? “BCDE”=“BCDE” SET EXACT OFF ? “BCDE”=“BC” &.T. ?”BC”=“BCDE” &.F. ?”BC ”=“BC” &.T. ? “BC”=“BC ” &.F. ?”BCDE”=”BCDE” &.T.,35,名称表达式,名称表达式是由圆括号括起来的一个字符表达式,可以用来替换命令和函数中的名称(如:字段名、变量名、窗口名、菜单名、文件名和对象名等)。 若要使用名称列表,须用逗号将各个名称分隔开。 名称表达式不能出现在赋值语句的左边 名称表达式的使用:
17、名称表达式替换变量名 例:nVar=100 var_name=“nVar” STORE 123.4 TO (var_name) ?nVar &结果为123.4,相当于 nVar=123.4,36,名称表达式替换命令中文件名 dbf_name=“js” use (dbf_name) &use js名称表达式作函数参数string1=“Visual FoxPro”str_var=“string1”?substr(str_var),1,6)用字符表达式构成一个名称表达式 Db_name=“jxsj” Dbf_name=“js” Use(db_name+”!”+dbf_name),37,宏替换,宏替换
18、与名称表达式具有相似的作用,可使用宏替换的方法用内存变量替换名称。 使用宏替换时,将连字符()放在变量前。 例:nVar=100nVarb=100var_name=“nVar”STORE 123.4 TO &var_nameSTORE 200 TO &var_name.b,38,与名称表达式的区别: 含有名称表达式的命令或函数的运行速度比含有宏替换的要快 宏替换可以替换整个命令,而名称表达式不行 宏替换可以用以构成表达式,而名称表达式不能作为其他表达式的组成部分 field_name=“js.xm” locate for &field_name=“程东萍” &能定位 locate for (f
19、ield_name)=“程东萍” &不能定位 在某些命令和函数中不能使用名称表达式 Var_name=“cVar3” &var_name=“test2” (var_name)=“test2” &不能正确赋值 Store “test1” to (var_name) ?&var_name ?(var_name),39,练习,下面程序运行的结果为_: I=“1” J=“2” X12=“Good” ?X&I&J 下面程序运行的结果为_: x=1 y=2 c=x+y ?&c,Good,12,40,2.6 空值处理,Null特点: 等价于没有任何值 与0、空字符串(“”)及空格不同 排序优先于其他数据 在
20、计算过程中或大多数函数都可以用到NULL Null值会影响命令、函数、逻辑表达式和参数的行为。 操作:字段中【Ctrl】+【0】来赋NULL值Isnull函数测试字段、变量或一个表达式的值是否为NULL,41,命令和函数解释空值的方式:NULL值作参数传递时,遵循的规则: 给命令传递NULL值将产生错误 将NULL作为有效值的函数,将向结果传递NULL值 向应该接收数值型 参数和函数传递NULL值,将产生错误,42,向下列函数传递NULL值将返回假:ISBLANK(),ISDIGIT(),ISLOWER() ISUPPER(),ISALPHA(),EMPTY() INSERT-SQL、UPDA
21、TE-SQL、SELECT-SQL命令通过ISNULL和IS NOT NULL子句处理NULL值 如果参与计算的所有值都为NULL,则VFP合计函数产生NULL,否则任何NULL值均将被忽略,43,逻辑表达式中NULL的行为,44,练习,.null. AND .F.、.null. OR .F.、.null.=.null.三个表达式的值分别为_。 A. .null.、.null.、.null. B. .F.、.null.、.null. C. .F.、.null.、.T. D. .F.、.F.、.null.,正确答案为: B,45,几个函数的比较,46,2.7 程序设计简介,2.7.1 创建与运行
22、程序 创建程序 “文件/新建”菜单命令 常用工具栏“新建”按钮 MODIFY COMMANDFileName|? 运行程序 工具栏上的“!”按钮 在项目管理器窗口中选择程序文件,然后单击“运行”命令按钮 在命令窗口中使用DO命令:DO:ProgramNameWITH ParameterList,47,2.7.2 程序结构 顺序结构按顺序执行程序中的命令store 4.12 to ps=p*p*3.14?“圆面积为:”,s 分支结构 If.elseendif语句,格式为if lExpression thencommand1elsecommand2endif,Do caseendcase语句格式:
23、do casecase lExpression1Command1case lExpression2Command2case lExpressionNCommandNotherwisecommandsendcase,48,控制语句,条件分支:(根据逻辑表达式的值决定程序的流程) IF-ENDIF,IF-ELSE-ENDIF DO CASE-ENDCASE(多分支) 循环:(使一组语句组重复执行若干次) SCAN-ENDSCAN(只适用于对表记录的操作) FOR-ENDFOR/NEXT DO WHILE-ENDDO LOOP:无条件循环 EXIT:无条件结束循环,49,累加示例,计算S=1+3+5
24、+99 S=0 FOR I=1 TO 99 STEP 2 S=S+I ENDFOR 计算N=1*1+2*2+3*3+10*10 N=0 FOR J=I TO 10 N=N+J*J ENDFOR,50,累乘示例,计算P=3*5*7*25 P=1 FOR K=3 TO 25 STEP 2 P=P*K ENDFOR 计算10! F=1 FOR I=1 TO 10 F=F*I ENDFOR,51,随机数示例,随机产生10个1050的随机整数 DIME A(10) FOR I=1 TO 10 A(I)=INT(50-10+1)*RAND()+10 ENDFOR 随机生成一个4行8列的矩阵 DIME B(
25、4,8) FOR I=1 TO 4 FOR J=1 TO 8 B(I,J)=INT(10*RAND() NEXT J NEXT I,52,闰年问题,一个年份满足以下条件之一即为闰年: 能被4整除且不能被100整除 能被400整除 输入一个年份值给变量nYear IF MOD(nYear,4)=0 AND MOD(nYear,100)0 OR MOD(nYear,400)=0 ?”是闰年“ ELSE ?”不是闰年” ENDIF,53,子程序,结构化程序设计的主要特点。 一个应用程序的许多功能可以编写成一个个独立的子程序、过程或用户自定义函数 。 用DO命令调用其他的程序。 一个主程序可以调用任意
26、多个子程序。 允许嵌套的DO调用层数为128层。,54,自定义函数(UDF),自定义函数或过程可存放在独立的程序文件(.PRG)中或数据库文件(存储过程)中。自定义过程: PROCEDURE myproc 代码区 ENDPROC 自定义函数: FUNCTION myfunc 代码区 ENDFUNC,55,调用自定义函数,不带参数调用 DO myproc =myfunc() ?myfunc() 带参数调用 DO myproc WITH 参数列表 =myfunc(参数列表) ?myfunc(参数列表) 如果自定义过程(函数)存放在独立文件中则先用命令 SET PROCEDURE TO 过程文件名
27、来打开文件。,56,参数传递,接受参数的过程或函数的第一句必须是 PARAMETERS 参数列表 传递的参数一般与接收参数数目相等,许少不许多。 参数之间用逗号分隔,最多27个。 传递参数有两种方式: 按引用方式:SET UDFPARMS TO REFERENCE 按值方式:SET UDFPARMS TO VALUE 强制传递方式: 用括号括起变量,表示按值传递 在变量前加上,表示按引用传递,57,NULL值处理,特点: 等价于没有任何值 与0、空字符串(“”)或空格不同 排序优先于其他数据 在计算过程中或大多数函数中都可以用到null值 Null值会影响命令、函数、逻辑表达式和参数的行为 给字段或变量赋.NULL.值时,该字段或变量的数据类型不变,只是值变为.NULL.,58,练习,请完善下面计算生肖的自定义函数sx() FUNCTION sx PARAMETERS nYear LOCAL n,csx csx=“猴鸡狗猪鼠牛虎兔龙蛇马羊” IF PARAMETERS()=0 nYear=YEAR(DATE() _ n=MOD(nYear,12) _SUBSTR(csx,2*n+1,2) ENDFUNC,ENDIF,RETURN,