第二部分 《Visual FoxPro 程序设计(第二
版)》
复习提要与学习指导、习题及参考解答
本部分在对《Visual FoxPro 程序设计(第二版)》每一章内容进行提炼的基础上,收集 了该书的全部习题并给出参考解答,有利于读者复习检查,同时又使本书自成体系。我们希 望读者在学习检测时,能正确对待参考解答,相信自己,有些题目答案不止一种,不可能一 一罗列,同时给出的解答虽经测试通过,但也未必是最佳的。
2.1 数据库基础知识和 Visual FoxPro 初步
2.1.1 复习提要与学习指导
本章主要介绍关系数据库的基础知识和 Visual FoxPro 的基本情况,以及项目文件的创 建和项目管理器的使用。
由于 Visual FoxPro 是一种关系型数据库管理系统,因此掌握好关系数据库的基础知识, 有助于理解 Visual FoxPro 系统中的数据组织和操作方式,为学习教材第 3、4 章打下基础。
对于 Visual FoxPro 集成环境的学习,开始时只要有个初步了解,不必死记每一个菜单 和工具栏的功能和用法,随着学习的不断深入,自然会对集成环境的使用越来越熟悉。
1.关系数据库基础知识 (1)掌握数据库、DBMS 和数据库系统的概念,了解数据库的特点:共享性、独立 性、安全性、具有最小冗余度。
(2)了解信息的三个领域与数据模型。 现实(事物:特点)信息(实体:属性)数据(记录:字段)
表 2-1-1 关系数据库的基础知识和 Visual FoxPro 相关知识对照表
关系数据库的基础知识 信息世界中的实体对象及其属性和实体集 实体于实体之间的联系 关系模型中要求二维表的每一列有唯一字段名 关系模型中要求二维表不允许出现相同的两行 二维表的主关键字、侯选关键字 二维表的主关键字与外部关键字 Visual FoxPro 中相关知识 记录、字段和表 表与表之间的关系 表结构中不允许有相同字段名 表的主索引要求索引关键字表达式的值唯一 表的主索引、候选索引 永久关系中主表的主关键字与子表的外部关键字
Visual FoxPro 程序设计实训与考试指导(第二版)
三种数据模型:层次模型、网状模型、关系模型。 (3)掌握关系模型及其性质。 (4)理解二维表及其关键字。
(5)基本关系运算:选择、投影、连接。 2.熟悉 Visual FoxPro 集成环境 (1)熟悉 Visual FoxPro 的用户界面、环境设置。 (2)掌握项目管理器的使用。
(3)了解设计器、向导等常用工具的使用。 2.1.2 习题一及参考解答
一、选择题
1.数据库 DB、数据库系统 DBS、数据库管理系统 DBMS 三者之间的关系是(A.DBS 包括 DB 和 DBMS B.DBMS 包括 DB 和 DBS
C.DB 包括 DBS 和 DBMS D.DBS 就是 DB,也就是 DBMS
2.数据库系统的核心是( )。
A.数据库 B.操作系统 C.数据库管理系统 D.文件
3.以下有关数据库特点的论述,( )是不正确的。 A.数据库避免了一切数据重复 B.数据库具有较高的数据独立性 C.数据库中的数据可以共享 D.数据库减少了数据冗余
4.数据库是以一定的组织方式存储在一起的相关的有结构的( )集合。 A.程序 B.系统文件 C.命令 D.数据 5.Visual FoxPro 是一种关系型数据库管理系统,所谓关系是指( )。 A.各条记录中的数据彼此有一定的联系 B.一个数据库文件与另一个数据库文件之间有一定的联系 C.数据模型符合满足一定条件的二维表格式 D.数据库中各个字段之间彼此有一定的联系 6.Visual FoxPro 支持的数据模型是( )数据模型。 A.层次 B.关系 C.网状 D.树状 7.下列四个选项中,不属于基本关系运算的是( )。 A.连接 B.投影 C.选择 D.排序 8.Visual FoxPro 关系数据库管理系统能够实现的三种基本关系运算是( )。 A.索引、排序、查找 B.建库、录入、排序 C.选择、投影、联接 D.显示、统计、复制 9.Visual FoxPro 6.0 是一个( )位数据库系统。 A.8 B.16 C.32 D.64
。
84
)
10.Visual FoxPro 的最大特点是( )。
A.面向过程编程技术 B.面向对象编程技术
C.结构化编程技术 D.界面友好 11.显示与隐藏命令窗口的操作是( )。 A.单击“常
用”工具栏的“命令窗口”按钮 B.通过“窗口”菜单下的“命令窗口”选项来切换 C.直接按 Ctrl+F2 组合键 D.直接按 Ctrl+F4 组合键
12.下面关于工具栏的叙述,错误的是( )。 A.可以创建用户自己的工具栏 B.可以修改系统提供的工具栏 C.可以删除用户创建的工具栏 D.可以删除系统提供的工具栏 13.下面退出 Visual FoxPro 的操作方法中,错误的是( )。
A.从“文件”下拉菜单选择“退出”命令 B.单击“关闭窗口”按钮
C.在命令窗口中键入 QUIT 命令,然后按回车键 D.在命令窗口中键入 CLOSE 命令 14.退出 Visual FoxPro,使用的命令是( )。
A.ESC B.QUIT C.EXIT D. ^Q 15.在“选项”对话框的“文件位置”选项卡中可以设置( )。 A.表单的默认大小 B.默认目录 C.日期和时间的显示格式 D.程序代码的颜色 16.“项目管理器”的“数据”选项卡用于显示管理( )。 A.数
据库、自由表和查询 B.数据库、视图和查询 C.数据库、自由表、查询和视图 D.数据库、表单和标签 17.“项目管理器”的“文档”选项卡用于显示管理( )。 A.表
单、报表和查询 B.数据库、表单和报表 C.查询、报表和视图 D.表单、报表和标签
18.供用户对开发项目中的数据、文档和源代码等资源集中管理的工具是( )。
A.类库管理器 B.生成器 C.项目管理器 D.设计器 19.项目文件的扩展名为( )。 A..DBF B..PRG C..PJX
。 20.Visual FoxPro 的“控制中心”是( )
A.表单设计器 B.数据字典 C.数据库文件 二、填空题
D..FPT
D.项目管理器
1.Visual FoxPro 6.0 是一个 位的数据库管理系统。
和
2.数据处理中,对数据的管理大致经历了自由管理阶段、文件管理阶段、 分布式数据库管理阶段四个阶段。
3.用二维表的形式来表示实体之间联系的数据模型叫做 。
第二部分 《Visual FoxPro 程序设计(第二版)》复习提要与学习指导、习题及参考解答 85
86
Visual FoxPro 程序设计实训与考试指导(第二版)
4.二维表中的列称为关系的 ;二维表中的行称为关系的 5.能唯一标识实体的属性或若干属性的组合称 。 6.数据模型可分为 、 和 三种联系方式。 7.在连接运算中, 连接是去掉重复属性的等值连接。
。
8 .关系型数据库有三种基本操作,从表中取出满足条件的属性成分的操作称为 ,从表中选出满足条件的元组称为 ;将两个关系中具有共同属性值的元组 连接到一起,构成新表称为 。
9.Visual FoxPro 除支持面向过程的程序设计方法,还支持 程序设计方法。 10.安装 Visual FoxPro 6.0 之后,要添加或删除 Visual FoxPro 某些组件时,应当启动 Windows 的 程序。 11.安装完 Visual FoxPro 之后,系统自动用一些默认值来设置环境,要定制自己的系 统环境,应单击 菜单下的 菜单项。
12.打开“选项”对话框之后,要设置日期和时间的显示格式,应当选择“选项”对话 框的 选项卡。
13.要把帮助文件设置为复制到硬盘上的 Foxhelp.chm 文件,需要在“选项”对话框的 选项卡上设置。
14.项目管理器文件的扩展名是 。 15.项目管理器的 选项卡用于显示和管理数据库、自由表和查询等。
三、操作题
使用项目管理器在 C 盘根目录下建立一个名为 XSGL.PJX 的工程文件。
习题 1 参考解答
一、选择题
1~5:ACADC
6~10:BDCCB 11~15:ADDBB 16~20:ADCCD
二、填空题
1.32
2.数据库管理阶段 3.关系数据库 4.属性、元组 5.关键字
6.一对一,一对多,多对多 7.自然
8.投影、选择、连接 9.面向对象 10.添加/删除
11.工具、选项 12.区域 13.文件位置 14..PJX 15.数据 三、操作题
SET DEFAULT TO C:\\ &&设置默认路径到 C:\\
CREATE PROJECT XSGL 或 MODIFY PROJECT XSGL &&创建项目文件 也可:文件
→新建→项目→新建文件→选择 C 盘根目录并输入项目文件名 XSGL.pjx→保存
2.2 Visual FoxPro 6.0 基础知识
2.2.1 复习提要与学习指导
本章系 Visual FoxPro 基础知识,有助于学习数据表和程序设计的内容。对于数据的类 型、存储、函数和表达式之间的关系是:①无论是数据存储容器(常量、变量、数组、字 段、对象),还是函数返回值,或者表达式的值,它们的值必定属于某种数据类型;②数据 存储容器、函数和操作符是构成表达式的基本元素。学习本章时:
1.掌握 Visual FoxPro 常用的文件类型及命令格式。
2.掌握数据类型和数据存储(常量、变量、数组、字段、对象)。 (1)常量的表示。 1)字符型 C:单引号、双引号、方括号,长度为 0~254 个字符。 2)备注型 M:用来存放超过 254 个字符的文本,长度 0~64K,字段宽度为 4,用来存 放实际文本在备注文件中的地址。注意 memo、Memo 之间的区别,首字母大写表示包含内 容。备注字段内容的输入:双击 memo,打开编辑窗口,然后输入文本。
3)通用型 G:用来存放 OLE 对象,字段宽度为 4,存放实际内容在备注文件中的地址。 注意 gen、Gen 之间的区别,首字母大写表示包含内容。通用字段的输入:双击 gen,打开编 辑窗口,在编辑菜单中选中插入对象;如果是已有的图片文件,则选择通过文件创建。
4)日期型 D(日期时间型 T):花括号,长度固定 8 个字节。 set century on|off 表示是否采用 4 位的年份 set date to YMD|MDY|DMY|LONG 设置年月日的次序 set mark 设置年月日之间的分隔符 分为两种日期格式:传统日期格式——{mm/dd/yy hh:mm:ss}
严格日期格式——{^yyyy/mm/dd hh:mm:ss }
5)逻辑型 L:.t.、.f.、.y.、.n.,长度固定 1 个字节,字母不区分大小写,两边的点号不 能省略。
6)货币型 Y:长度固定 8 个字节,小数位数最多为 4 位,超出 4 位则自动四舍五入。 在交互状态下(命令窗口)用美圆$符号加数字表示。
第二部分 《Visual FoxPro 程序设计(第二版)》复习提要与学习指导、习题及参考解答 87
88
Visual FoxPro 程序设计实训与考试指导(第二版)
7)数值型 N(浮点型 F):在内存中占 8 个字节,在字段中由用户指定,但必须指定小 数位数,即使为 0。小数形式:3.14、指数形式:3.12E28、3.12E-28。
8 )整型 I :长 度固 定 4 个字 节, 无小 数位数 ,且 只能作 为字 段数据 类型 。 如 INT(3.98)=3,固定取整数部分,无四舍五入。
9)双精度型 B:宽度固定为 8 字节。 (2)变量:定义(变量的创建):通过赋值定义变量,由变量中的值确定其数据类型。
a=100:一次只能将一个值赋值给一个变量;
store 100 to a,b,c:一次可以将一个值赋值给多个变量。 访问变量:通过变量名访问变量
内存变量和字段名同名时,字段变量具有更高优先级,如果要访问内存 注意
内存变量的保存与恢复:
保存:SAVE TO FILENAME.MEM 将内存中的变量信息保存于文件 恢复:RESTORE FROM FILENEME
(3)数组:它也是内存变量,是一个有序的内存数据序列,它的每个值称为元素,可 以通过序号来访问。
定义(数组的声明):DECLARE | DIMENSION A(10),B(2,3) 私有数组 A(10):表示定义一个 10 个元素的数组 A B(2,3):表示定义一个 2 行 3 列的数组 B,共 6 个元素 LOCAL 局部数组
PUBLIC 公有数组(全局数组) 数组的存储:按行的顺序存储。例如,三行四列的数组 A(3,4),A(2,3)等价于 A(7)。 数组的赋值:对单个元素赋值。例如,A(2,3)=3,第 2 行第 3 列的值为 3,等价于
A(7)=3,这里既可以用元素的逻辑位置,也可用数组的存储位置。 对数组
名进行赋值:A=3,表示 A 数组的所有元素都为 3。 数组跟表的关系: Scater:将当前记录的每个字段传送到一维数组,作为它的一个元素。
Gather:将一维数组的每个元素的数据传送到表中作为一条记录的一个字段。 Copy to array:将整个表中的记录复制到二维数组。
Append form array:从二维数组中追加多条记录的数据到表。 1)数组的大小可以由命令根据表的字段数自动定义(对已定义的数组, 元素个数只会增加不会减少)。 2)数组元素的数据类型:一个数组中,每个元素的数据类型可以不同。 3)定义数组后,数组元素初值为.F.。 4)备注型和通用型字段不能和数组交换数据,备注字段和通用字段不会 成为数组元素。 5)如果已存在的数组,对它进行重新定义,里面的原有数据不会丢失, 其元素个数根据重新定义的个数确定。
M. 或者 M->。 变量,则须在内存变量名前加
注意
(4)字段:事先必须定义其数据类型,具有固定的数据类型,且宽度也是固定的。 (5)对象:是类的实例,它包含数据(属性)和过程(事件代码)。 3.掌握各类型数据运算的操作符以及表达式。 (1)算术操作符:**|^(乘方)、%(取余、结果的符号同第二个参数)。 (2)字符操作符:
+:直接将两个字符串直接连接;
-:将左边字符串尾部空格移到连接后新字符串的最后; $:判断左边的子串是否包含于右边的字符串中。 以 csrq 为索引名,按 zc 和 csrq 创建普通索引,其索引表达式: zc+csrq(数据类型不同)
CTOD(zc)+csrq(数据类型相同,但 zc 不可能转换为日期) zc+DTOC(csrq)
(3)日期操作符:
+:(日期+整数=日期)只有一种运算形式; -:(日期-整数=日期;日期-日期=相隔的天数,可以为负数)有两种运算形式。 日期在进行关系比较时,以前的日期小于现在的日期
year(date())-val(iif(left(xh,1)='9',\
(4)关系操作符:!=、#、<> 表示不等,查询设计器中的不等可以用相等再取否。
NOT KSS BETWEEN 3 AND 5 AND DELETED()=.F.
=(左部匹配、精确相等)set exact on(精确相等)|off(左部匹配、默认状态) 例如:\返回为.t. \返回为.f. = =(精确相等) 字符的排列序列有三种形式:
machine 机器序列——按机内码顺序排序:空格、大写、小写、一级汉字、二级汉字; Pinyin 拼音序列——按汉语拼音序列排序:空格、小写、大写、汉字按拼音顺序; Stroke 笔画序列——按笔画的多少排序:空格、小写、大写、汉字按笔画顺序。
系统默认的是拼音序列;改变字符序列的命令:SET COLIATE TO \
注意
(5)逻辑操作符:not| !(取反)、and(与、并且)、or(或、或者)
注意
操作符两边必须为逻辑值或返回值为逻辑型的表达式。 4.掌握常用系统函数的用法。
(1)数学函数:ABS()求绝对值、INT()取整,不具有四舍五入功能。
说明:INT(100.245*100+0.5)/100=100.25,四舍五入保留两位小数;CEILING()向上取 整、 FLOOR() 向下取 整; ROUND() 四舍五入,例如 : ROUND(300.14,1)=300.1 , ROUND(345.14,-1)=350;RAND()取大于等于 0 小于 1 的随机数。
mod(m,n):结果的符号由 n 的符号确定同号 m-int(m/n)*n 异号(int(m/n)+1)*n-m。
第二部分 《Visual FoxPro 程序设计(第二版)》复习提要与学习指导、习题及参考解答 89
90
Visual FoxPro 程序设计实训与考试指导(第二版)
MAX()、MIN()取最大(小)值。
(2)字符函数。 去掉空格函数:ALLTRIM()两边、LTRIM()左边、RTRIM()|TRIM()右边。 AT(cst, ctring[,n]):返回 CST 在 CTRING 中第 N 次出现时首字符的位置。 BTWEEN(dst,start,end):返回逻辑值,判断某个值是否属于某个区间。 BTWEEN 操作符:KSS BTWEEN 3 AND 5 BTWEEN(KSS,3,5) SPACE(n):返回 n 个空格的字符串。
LEN(cst):返回字符串 cst 的长度,包括首尾空格。例如:学号长度只能为 6、8、10, 则可用 inlist(len(alltrim(xh)),6,8,10)
(3)字符串截取:LEFT(str,n)从左边第一个字符开始;RIGHT(str,n)从右边第一个字符 开始;SUBSTR(str,start,n) 从指定位置字符开始,取指定的长度;REPLICATE(\\让表达式重复出现多次。
(4)日期时间函数:DATE()日期、DATETIME()日期时间、TIME()时间。
注意
以上返回值为日期或日期时间型。 YEAR()年、MONTH()月、DAY()日、DOW()|CDOW()星期
注意
以上返回值为整型。 (5)转换函数。
①STR(要转换的数值,总宽度,小数位数)数值→字符 说明:默认总宽度为 10,小数位数为 0 STR(314.159)=(7 个空格)314
当总宽度不能满足小数位数时,优先给整数 STR(314.159,5,3)= \314.2\; 当总宽度不能满足整数位数时,则系统返回星号(个数同总宽度)。
②VAL()字符→数值
注意
能够识别的:3.14、-3.14、3.14E2; 不能识别的:+-3.14、A3.14(这种情况的返回值为 0)。 ③ASC()字符→ASCII,返回首字母的 ASCII 值
ASC(\计算机\:返回首汉字的第一个字节数据
④CHR()ASCII→字符,返回该整数作为 ASCII 码所对应的字符 ⑤DTOC()日期→字符
说明:DTOC(日期[,1]),1 表示返回以年月日顺序且无分隔符的字符串。 例如:DTOC(DATE(),1)=\20040830\
⑥CTOD()字符→日期,要求参数必须为一个日期序列字符
说明:在 6.0 中,如果 SET STRICDATE TO 2,则日期必须为严格日期格式序列。 ⑦UPPER()小写→大写、LOWER()大写→小写 (6)数据测试函数。
TYPE()返回给定参数的数据类型,为一个表示该数据类型的字符。参数只能为字符型数
据,且都必须加引号。 说明:参数可以为常量、变量或表达式。
TYPE(\.F. OR .T.\)=L
当其数据类型不能确定时,返回字符 U。TYPE(\A= .T.\)=U
BETWEEN(3.14,4,5)返回.F.。注意:范围只能是从小到大。
INLIST(2,1,2,3,4,5,6) 第一个参数如果在其后出现,则返回.t.。 EMPTY()判断字段是否为空。空格、逻辑假值、数字 0 返回值为真。 ISNULL()判断是否为空值。只有为空值时,才返回真值。 ISBLANK()判断是否为空格。只有参数为空格串时,才返回真值。 IIF(条件,为真的结果,为假的结果) 此函数允许嵌套使用。 MESSAGEBOX(提示文本,按钮类型+图标类型+默认光标位置,标题栏文本)。
注意
此函数的返回值,可以推断出用户点击哪个按钮。 INKEY()返回一个键码值,判断用户按了键盘中的哪个键,回车键为 13。 GETFILE()显示打开对话框,返回用户选定的文件名及路径。
(7)表、数据库函数。 BOF()、EOF()、RECNO() RECCOUNT()记录数统计,包括逻辑删除的记录 FCOUNT()字段数统计 USED()判断表是否被打开、DBUSED()判断数据库是否被打开 ORDER()、TAG()、SELECT()工作区号、ALIAS()别名、DELETED() 5.掌握 NULL 值的处理。 NULL 等价于没有确定的值,任何变量被赋空值,都不会改变原来的数据类型。
Dimension a(3)
?type(\a(1)=.null. ?type(\
&&数组的所有元素将被赋初值.F. &&此处返回 L。因为定义数组后,每个元素被赋逻辑假值为初值 &&此处返回 L
空值在排序时,将优先于任何值。 判断空值的函数:
ISNULL()当值为真时,则该变量为空值。
6.宏替换和名称表达式。 名称表达式:由圆括号括起来的一个字符表达式,该字符表达式可以是单个变量或数组
元素,还可以是一个由字符运算符连接的字符表达式。
Nvar=100
Var_name=\
Store 1234 to (var_name) ?nvar
db_name=\dbf_name=\
use (db_name+\
&&红色部分的表达式可以直接用 nvar 代替 &&此处 nvar 的值为 1234
&&等价于 stud!xs
宏替换:与名称表达式具有相似的作用,在字符变量前面添加符号(&)。宏替换的使
用范围比名称表达式更广,但它的运算速度比名称表达式慢。
区别:(1)宏替换可以用来构成表达式,但名称表达式不能作为其他表达式的组成部分。
第二部分 《Visual FoxPro 程序设计(第二版)》复习提要与学习指导、习题及参考解答 91
92
Visual FoxPro 程序设计实训与考试指导(第二版)
field_name=\
locate for (field_name)= \王平\错误,名称表达式不能作为表达式的一部分,但可以作为命 令的一部分
locate for &field_name=\王平\正确
(2)某些命令和函数不能使用名称表达式
var_name=\(var_name)=\&var_name=\
cvar=\var_name=\
?substr((var_name),2,2) ?substr(&var_name,2,2)
&&不能正确赋值,赋值语句中不能使用名称表达式 && 正确
&&显示“va”此处名称表达式不起作用 &&显示“is”
将专业代号第一个字符为 1 的改成 9:
replace zydh with \正确
replace left(zydh,1) with \&&错误
(3)名称表达式不能充当整条命令,而宏替换可以 充当整条命令。
cvar=\(cvar) &&错误,它只能作为命令的一部分 &cvar &&正确
2.2.2 习题 2 及参考解答
一、选择题
1.下列关于 VFP 中命令的书写规则,说法不正确的是( )。 A.命令动词必须写在命令的最前面,而各短语的前后顺序可以任意排列 B.命令动词与短语之间、短语与短语之间、短语的各部分之间必须用空格分隔开 C.命令动词、短语保留字及函数名均可简写为前 4 个字符,而且英文字母大小写等效 D.当一行写不下时,可在适当位置输入续行符“;”并按回车键换行,继续输入该
命令,但一条命令的总长度最多可达 8192 个字符
2.扩展名为 DBC 的文件是( )。 A.表单文件 B.数据库表文件 C.数据库文件 D.项目文件 3.下列函数中函数值为字符型的是( )。 A.DATE() B.TIME() C.YEAR() D.DATETIME() 4.下面的数据类型默认值为.F.的是( )。 A.数值型 B.字符型 C.逻辑型 D.日期型 5.在 Visual FoxPro 中,有下面几个内存变量赋值语句:
X={^2002-09-10 10:10:10 PM}
Y=.T.
M=$125.50
N=120.46 Z=\
执行上述赋值语句之后,内存变量 X、Y、M、N 和 Z 的数据类型分别是( )。 A.D、L、Y、N、C B.D、L、M、N、C C.T、L、M、N、C D.T、L、Y、N、C 6.连续执行以下命令之后,最后一条命令的输出结果是( )。
X=\\
?IIF(\
A.A B.BCD C.A BCD D.ABCD
7.下面关于 Visual FoxPro 数组的叙述中,错误的是( )。 A.用 DIMENSION 和 DECLARE 都可以定义数组
B.Visual FoxPro 只支持一维数组和二维数组 C.一个数组中各个数组元素必须是同一种数据类型 D.新定义数组的各个数组元素初值为.F. 8.执行下列命令序列:
CLEAR ALL
DIMENSION sz(2,3)
则当前内存中定义的内存变量数、数组元素数及其初值分别为( )。 A.6,6,0 B.1,6,.F. C.1,6,0 D.6,6,.F. 9.在 Visual FoxPro 中,字段长度只受外存可用空间限制的字段类型为( )。 A.Character B.Memo C.Number D.Float 10.执行 A=\安徽考试\和 B=12 两条命令后,能够正确求值的表达式是( )。
A.RIGHT(A,4)+SUBSTR(B,2) B.VAL(LEFT(A,1))+B C.A+B D.SUBSTR(A,1,1)+B 11.以下四组函数运算中,结果相同的是( )。
A.LEET(\与 SUBSTR(\B.YEAR(DATE())与 SUBSTR(DTOC(DATE),7,2) C.VARTYPE(\与 VARTYPE(36-5*4) D.假定 A=\\与 A+B 12.下面的 Visual FoxPro 表达式中,不正确的是( )。 A.{^2009-05-01 10:10:10 AM}-10 B.{^2009-05-01}-DATE()
C.{^2009-05-01}+DATE() D.[^2009-05-01]+[1000] 13.下列函数中,函数值为数值的是( )。
A.AT(\人民\中华人民共和国\B.CTOD(\
C.BOF() D.SUBSTR(DTOC(DATE()),7) 14.求字母“W”的 ASCII 码,正确的函数为( )。
A.SUBSTR(\B.LEN(\C.ASC(\D.CHR(\15.将所有以“W”开头的内存变量保存到 MAB.MEM 文件中的操作为( )。
A.SAVE TO MAB B.SAVE TO MAB ALL LIKE W*
第二部分 《Visual FoxPro 程序设计(第二版)》复习提要与学习指导、习题及参考解答 93
94
Visual FoxPro 程序设计实训与考试指导(第二版)
C.SAVE TO MAB ALL LIKE W? 二、填空题
D.SAVE TO MAB ALL EXCEPT W*
?b+2x +|X| 1.数学表达式 的 Visual FoxPro 表达式是 。
2a 2.要把以 B 为第二个字符的全部内存变量存入内存变量文件 ABC.MEM 中,应使用命 令 。
3.当且仅当参加逻辑运算的两个具有逻辑值的表达式都取得真值时,结果为真的逻辑 运算称为 运算;当且仅当参加逻辑运算的两个具有逻辑值的表达式全为假时,结果 为假的逻辑运算称为 运算;使得参加逻辑运算的逻辑表达式取得与原值相反的值的 逻辑运算称为 运算。
4.Visual FoxPro 中表达式按运算结果类型可分为: 表达式、 表达 式、 表达式、 表达式和 表达式。
5.指出下列表达式的运算结果
ABS((-1^3)+EXP(0)+INT(10.2) + MOD(13,5))的结果是 。 \的结果是 。 UPPER(\的结果是 。
LEFT(\数据库\的计算结果是 。 6.指出下列日期函数的值,设当前时间是 2009 年 5 月 14 日 16 点 51 分 40 秒。 DTOC(DATE())+\的结果是 。 STR(YEAR(DATE()),4)+\年\月\日\的结果是 。
7.计算今天和 2008 年 8 月 8 日相差天数的表达式 。
8.判断字符串“ICQ”是否包含在字符串“ILVUANDCQ”中的表达式 9.随机产生整数值 1~26 的函数表达式 。 10.A=1354.567,对 A 求不保留小数的四舍五入运算的表达式 。 三、操作题
。
建立以下内存变量:
AA
BB CC(1) CC(2)
C N L D
\水平考试\ 20 .T.
2009 年 12 月 1 日
并将所有的内存变量保存到当前文件夹下文件 MAB.MEM 中。
习题 2 参考解答
一、选择题
1~5:CCBCD 6~10:CCBBB 11~15:ACACB
二、填空题
1.(-b+sqrt(2*x)+abs(x))/(2*a)
2.SAVE TO abc ALL LIKE ?B* 3.与、或、非
4.数值、字符、日期、关系、逻辑 5.13.00、VisualFoxPro(表示空格)、VISUAL FOXPRO、123456 6.05/14/09 16:51:40、2009 年 5 月 14 日 7.DATE()-{^2008.8.8}
8.判断\或 at(\结果是否为.T. 9.INT(RAND()*26+1)
10.ROUND(A,0) 或 INT(a+0.5) 三、操作题
在命令窗口输入以下命令:
AA= \水平考试\BB=20
DIMESION CC(2) CC(1)= .T.
CC(2)={^ 2009-12-1} SAVE TO MAB
2.3 数据库与数据表的操作
2.3.1 复习提要与学习指导 一、数据表
1.掌握表的概念、组成和分类。
表是相关数据的集合,按照一定的组织形式,以 DBF 为扩展名的文件保存,FPT(表备 注文件)。
组成:表结构和记录。 分类:自由表和数据库表。
2.掌握用表设计器创建和修改表结构的方法及其相关的 SQL 命令。 创建表的结构:
CREATE TABLE|dbf xs(xh c(9),xm c(8) NULL,csrq d not null) 修改表的结构:
ALTER TABLE XS ADD|RENAME|DROP COLUMN BJ C(2)|BJ TO BJBH|BJBH 修改字段的类型和宽度:
ALTER TABLE XS ALTER COLUMN BJBH N(5,0)
第二部分 《Visual FoxPro 程序设计(第二版)》复习提要与学习指导、习题及参考解答 95
96
Visual FoxPro 程序设计实训与考试指导(第二版)
3.掌握字段的基本属性(字段名、数据类型、宽度、小数位数和空值支持)。 命名规则:可以包含字母、数字和下划线、汉字;不能以数字开头;长度为 1~128(自 由表的字段名以及索引标志名长度只能为 10)。 数据类型:宽度固定的数据类型的名字
(8:D,T,B,Y 4:M,G,I 1:L 254:C)。 小数位数:包含在总宽度中,同时还要注意总宽度中还包含小数点一位。 空值:表示值不确定;空值可以等价于任何一种数据类型。
4.掌握表记录的追加、浏览、定位、修改、删除和筛选的操作。 (1)追加。
APPEND BLANK(CTRL+Y) 追加一条记录
APPEND FROM 表名 FOR 条件 追加多条记录 (以同名字段填充) INSERT BLANK (BEFORE) (VISUAL FOXPRO 命令)事先应将表打开
INSERT INTO XS[(XM,XH,XB) ]VALUES(\,\,\) (SQL 命令)如果该表未打开,则 会自动打开该表
如果省略字段名列表,则 VALUES 后面提供的值必须按照表中字段的先后顺序给出; 如果给出字段列表,则 VALUES 后面提供的值应按照字段列表的顺序给出。
(2)浏览。
BROWSE FOR/WHILE DISPLAY(分屏显示)/LIST FOR:所有满足条件的记录; WHILE:当遇到第一个不满足条件记录则停止命令的执行。 (3)定位。
相对定位 SKIP (正数|负数)当前记录号为 9 SKIP -3 绝对定位 GO (GOTO) N TOP BOTTON 定位到记录号为 N 的记录 条件定位 LOCATE FOR 条件 (定位在第一个满足条件的记录上) CONTINUE (定位到下一个满足条件的记录)
记录指针 BOF() EOF() RECNO()(记录号的变化范围:1~N+1) 空表 .T. .T. 1 表的最大记录号:当前记录总数+1 非空表 .F. .F. 1 记录指针指向 BOF 时,记录号为 1;记录指针指向 EOF 时,记录号为 N+1。 (4)修改。
REPLACE 字段名 WITH 表达式 FOR 条件 | 范围子句 (VFP 命令) REPLACE XB WITH \男\,CSRQ WITH DATE() FOR 条件:替换多个字段
REPLACE ALL XB WITH IIF(XB=1, \女\男\) REPLACE 默认只对当前记录进行处理 根据条件对同一个字段做不同的替换:
REPLACE ALL JBGZ WITH IIF(ZC=\教授\,JBGZ+400,IIF(ZC=\副教授\,JBGZ+300,IIF(ZC=\讲师
注意
对于数值型字段,必须指定小数位数,哪怕位数为 0。 \,JBGZ+200,JBGZ)))
范围子句:ALL——所有记录;
NEXT N——从当前记录开始的 N 条记录; REST——从当前记录开始,一直到记录的结束;
RECORDE N——记录号为 N 的记录。
UPDATE FROM 表文件名 SET 字段名=表达式 WHERE 条件 (SQL 命令) (5)删除。 1)逻辑删除。
DELETE ALL FOR 条件
2)物理删除(彻底删除)。 PACK:把带有删除标记的记录彻底删除; ZAP:将所有记录彻底删除,仅保留表结构。 以上两条命令,要求表以独占方式打开。 3)恢复记录。
RECALL 范围子句|FOR 条件:该命令如果不加范围和条件,则只恢复当前记录; DELETED():判断当前记录是否带有删除标记。 (6)筛选。
1)记录的筛选。 临时筛选:在普通命令后加 for/while 条件; 长期性筛选:set filter to 条件。
2)字段的筛选:browse fields 字段列表。
5.掌握表的打开和关闭方法,掌握工作区和当前工作区的概念。 打开表:use 表名
关闭表:use?close table?close all?close database(如果当前没有打开数据库,则该命令将 关闭所有的表)
工作区:内存中的一片区域,在一个工作区中同一时间只能打开一张表。 SELECT()工作区编号:1?N 任意一个无符号整数;前 10 个工作区可用 A~J 来表示。 ALIAS()工作区别名:默认为表的名字,当区号大于 10 且该表是重复打开,则别名为 W+区号。 对非当前工作区的表进行操作: 改变当
前工作区:用 SELECT 工作区号/别名 强行指定工作区:在命令中用 IN 工作区号|别名
SELECT 0:0 表示当前未被使用的且编号最小的工作区 CLOSE TABLES|ALL:执行该命令后,系统将 1 号工作区置为当前工作区 USE XS IN 0:打开 XS 表,该命令不改变当前工作区 USE IN XS :关闭别名为 XS 的工作区中的表
USE TECHER ALIAS XS GO TOP IN XS
6.掌握表的索引的概念,索引的类型,结构复合索引文件的创建,修改和使用。
第二部分 《Visual FoxPro 程序设计(第二版)》复习提要与学习指导、习题及参考解答 97
98
Visual FoxPro 程序设计实训与考试指导(第二版)
(1)索引文件的结构:索引序号+表的记录号。 (2)索引的类型。
1)主索引:适用于数据库表的结构复合索引。一张表只有一个,关键字段的值唯一。 2)候选索引(CANDIDATE):关键字段的值唯一。 3)普通索引。
4)唯一索引(UNIQUE):记录中出现了重复值,则只有第一个有效。 (3)索引文件的类型:
1)独立索引文件:IDX,文件中只能包含一个索引标志。 2)复合索引文件:CDX,文件中可以包含多个索引标志。
①结构复合索引:索引文件名与表文件名同名,索引文件随表文件的打开而自动打开。 ②非结构复合索引。
注意
项目管理器不能管理独立索引和复合索引。 (4)建立索引。
INDEX ON 关键字表达式 TAG 索引标志名 [CANDIDATE|UNIQUE] [FOR 条件] 多个字段建立索引表达式应该注意:
1)多个字符型的字段其先后顺序,影响索引结果:XM+XB 和 XB+XM。 2)多个数值型字段按表达式和值进行排序 JBGZ+GL,合理的排序:STR(JBGZ,7,2)+
STR(GL)
3)多个数据类型不相同的字段建立表达式,必须先统一类型。
转换函数:STR()数值转换为字符;VAL()字符转换为数值;DTOC()日期转换为字符; CTOD()字符转换为日期。 要求对学生表进行排序,先按照性别排序,性别相同的再按照出
生日期排序,出生日期
相同的则再按照成绩总分进行排序:XB+DTOC(CSRQ)+STR(ZF)。
(5)索引的使用。
1)主控索引:注意和主索引的区别。正在起作用的索引标志。 2)设定主控索引:
打开表的同时指定主控索引 USE XS ORDER XH 打开表之后指定主控索引 SET ORDER TO 索引标识名 3)索引标识的删除:DELETE TAG 索引标识名 4)索引的修改:使用 INDEX 命令重建索引 5)根据索引定位记录。
SEEK 表达式:SET ORDER TO XH ; SEEK \990101\
要求:1)需要对表达式字段建立索引并设置为主控索引;
2)结果将指向第一个满足条件的记录或者记录结束标识(没有找到相关记录)。 对定位结果的判断:FOUND() .T. 说明已经找到 .F. 表示没有找到相关记录
EOF() .F. 说明已经找到 .T. 表示没有找到相关记录
SEEK(表达式):
要求:需要对表达式字段建立索引并设置为主控索引
结果返回逻辑值,找到:.T.;没找到:.F. 等价于:SEEK 命令+FOUND()函数
7.掌握表之间的关系及其种类,掌握表的关联及其建立和解除的方法。 1:N、N:1、M:N、1:1 二、数据库
1.掌握数据库的概念、创建、打开和关闭。 数据库:包容器,相关表的集合,不包含表的记录数据。
创建:CREATE DATABASE JXSJ,形成 3 个文件:DBC(数据库)、DCT(库备注)、 DCX(库索引)。
注意
创建数据库后,该数据库自动打开且为当前数据库,但不会添加到项目 管理器中。
如果存在当前数据库,则此时创建的表如未特别说明(在命令中加 FREE 关键字),则 一定属于该数据库。
打开:OPEN DATABASE 数据库名 反复执行该命令能同时打开多个数据库,且最后打开的数据库为当前数据库。 设置当前数据库:SET DATABASE TO 数据库名 如果引用非当前数据库中的表,则在库名和表名之间加“!” 关闭数据库:CLOSE DATABASE、CLOSE ALL
2.掌握数据库的组成(库表、永久关系、视图、存储过程)。 数据库表:比自由表具有更多的属性,所有记录以 DBF 文件保存,扩展属性保存于数
据库文件中。 永久关系:建立的基础:通过索引建立,主表——主索引或候选索引,子表
——普通
索引。 目的是用来建立表与表之间的参照完整性,某些情况下作为默认的临时关系和默认
的连
接条件。 关系保存于数据库文件中,一旦建立,永久保存,当其中一张表从数据库中移去
时,关
系解除。 建立的对象:同一个数据库中的两张表。 常见的有一对多、多对多(通过纽带表
将其转换成两个一对多关系)。 建立步骤:分别建立主表和子表的相关索引,然后在数据库设计器中,从主表的主索引
标志拖放到子表的普通索引标志上(或命令方式建立永久关系)。 视图:不单独以文件的形
式保存,保存于数据库文件中。从一张表或多张表中按照一定
的条件来选取记录。 存储过程:在数据库文件中,用来保存用户代码的地方(参照完整性
约束代码,用户的 过程和函数)。
3.掌握库与表之间的更新和恢复。
第二部分 《Visual FoxPro 程序设计(第二版)》复习提要与学习指导、习题及参考解答 99
100 Visual FoxPro 程序设计实训与考试指导(第二版)
当数据库或表文件不存在时:
删除:REMOVE TABLE [DELETE] 针对于表文件不存在。 删除:FREE TABLE 表名 针对于数据库文件不存在。 数据库文件的删除:
DELETE DATABASE 删除数据库文件,同时使所有的数据库表变为自由表。 DELETE FILE 删除文件,数据库表不会变成自由表(等同于在资源管理器中删 除文件)。
4.掌握永久关系的概念、创建作用和删除。 作用:①用来建立参照完整性(主要作用);②某些场合作为默认的临时关系和连 接条件。
5.掌握库表字段的扩展属性(格式、掩码、标题和注释)及其设置方法。 格式(Format):控制字段的显示方式,如大写、中文日期 (A、K、L、T、!、$)。 掩码(Inputmask):控制字段的输入格式,如只能输入字母或数字(X、9、.、,、A)。 标题(Caption):在浏览窗口的列标题上显示的说明文字,不同于字段名,但字段名可 作为默认的标题(在表设计器中设置标题时,不需要加引号)。 注释(Comment):在项目
管理器中,当选中该字段后,在下面的说明栏中显示(在表 设计器中设置注释时,不需要加引号)。 默认值(Defaultvalue):当新增记录时,字段预先
具有的初值(在表设计器中设置时, 要根据该字段的数据类型来决定表示形式)。
6.掌握字段有效性规则、记录有效性规则、表触发器、库表之间参照完整性概念及其 设置方法,以及 Visual FoxPro 数据完整性概念。
字段有效性规则:一个逻辑表达式,控制该字段的数据的正确性(不能加引号)。 起作用的时间:在设置规则并保存的过程中,对表中已有的数据进行验证。当修改该字 段,光标离开该字段时。 字段规则信息:出错时的说明文字,注意要加引号。 记录有效性
规则:一个逻辑表达式,控制该记录中多个字段之间的数据有效性(不能加 引号)。 起作用的时间:在设置规则并保存的过程中,对表中已有的数据进行验证。当修改
表中
的记录,且光标离开该记录时。 记录规则信息:出错时的说明文字,注意要加引号。 触发
器:绑定在表上的一个逻辑表达式,分为删除、插入、更新。在进行相应操作时, 如果该表达式为真,则允许进行操作,否则禁止。
注意
参照完整性:控制多张表之间的数据一致性。可在同一数据库文件中具有永久关系的两 张表之间设置。
建立在永久关系的基础上;通过触发器设置;代码保存于存储过程中。 目的是为了防止出现孤立记录:在子表中出现,而主表中没有相关记录的记录。
当表达式设置为.F.时,则永远不能进行该操作。
三种规则:①更新规则:(父动)级联、限制、忽略;②删除规则:(父动)级联、限 制、忽略;③插入规则:(子动)限制、忽略。 Visual FoxPro 数据完整性:实体完整性(字段验证规则、记录验证规则)、参照完整 性、用户自定义完整性。
7.掌握临时关系的概念、建立与解除,以及与永久关系的区别和联系。 临时关系:两张打开表之间建立的一种关系,通过它可以使子表的记录指针跟随主 表的记录指针一起发生改变,一旦其中的某张表关闭,则该关系消失(作用:控制记录 的访问)。
临时关系和永久关系之间的区别和联系: 联系:①必须客观存在;②永久关系有时作为默认临时关系。 区别:①建立方式不同;②作用不同;③建立的对象不同、存在的形式不同;④子表所
拥有主表个数不同。 建立方式:在不同工作区中打开子表和主表,设置子表的主控索引,
在主表工作区执行 命令:
SET RELATION TO 关联字段名 INTO 子表表名 解除:SET RELATION TO 或者关闭其中的任何一张表。 2.3.2 习题 3 及参考解答
一、选择题
1.在 Visual FoxPro 系统中,.DBF 文件被称为( )。
A.数据库文件 B.表文件 C.程序文件 D.项目文件 2.表中备注字段的内容存放在( )文件中。 A.DBC B.DBF C.PRG D.FPT
3 .在 Visual FoxPro 的数据类型中,用于存放图像、声音等多媒体对象的类型是 ( )。
A.逻辑型 B.浮点型 C.通用型 D.字符型
4.在表结构中,逻辑型、日期型、备注型字段的宽度是固定的,它们分别是( )。 A.4,8,10 B.1,8,10 C.1,8,4 D.4,8,1 5.要求一个表的数值型字段具有 5 位小数,那么该字段的宽度最少应当定义成( )。 A.5 位 B.6 位 C.7 位 D.8 位
6.在输入记录后,按( )组合键存盘退出。 A.Ctrl+W B.Ctrl+Home C.Ctrl+Q D.Ctrl+N 7.下列操作中,能够用 MODIFY STRUCTURE 命令实现的是( )。 A.增加一条记录 B.修改一条记录的内容
第二部分 《Visual FoxPro 程序设计(第二版)》复习提要与学习指导、习题及参考解答 101
102 Visual FoxPro 程序设计实训与考试指导(第二版)
C.修改某个字段的宽度 C.建立两个表之间的关联 8.用 USE 命令打开一个表文件后,其记录指针指向( )。 A.第一条记录 B.任意一条记录 C.最后一条记录 D.最后一条记录后面的空记录 9.在表中相对移动记录和绝对移动记录指针的命令分别为( )。 A.LOCATE 和 SKIP B.LOCATE 和 GO C.SKIP 和 GO D.LOCATE 和 FIND 10.若 jsda 表包含 50 条记录,在执行 GO TOP 命令后,( )命令不能显示所有 记录。
A.LIST ALL B.LIST REST C.LIST NEXT 50 D.LIST RECORD 50 11.若打开非空 xsda 表再执行 SKIP -1 后,下列显示值为.F.的命令是( )。
A.?BOF() B.?EOF() C.?.T. D.? RECNO()=1 12.在 FoxPro 中,设数据表已经打开,要将数组中的数据复制到当前记录的各个字段 中,应当使用命令( )。
A.SCATTER TO B.DIMESION C.APPEND FROM D.GATHER FROM 13.在表中插入一条记录的命令是( )。
A.INSERT B.EDIT C.BROWSE D.DELETE 14.自动替换某一字段值的命令为( )。
A.EDIT B.BROWSE C.CHANGE D.REPLACE 15.物理删除一条记录可用两条命令实现,这两步的命令分别为( )。
A.PACK 和 ZAP B.PACK 和 RECALL C.DELETE 和 PACK D.DELETE 和 RECALL
16.对 GZ.DBF 表文件按工资字段由小到大排序,工资字段值相同的,按出生年月字段 由大到小排序,排序的文件名为 gzpx.dbf,正确的命令是( )。
A.SORT TO GZPX.DBF ON 工资/D, 出生年月/A B.SORT TO GZPX.DBF ON 工资/A, 出生年月/D C.SORT TO GZPX.DBF ON 出生年月/A, 工资/D D.SORT TO GZPX.DBF ON 出生年月/D, 工资/A 17.在对表的操作中,建立索引的命令是( )。
A.SORT B.STORE C.INDEX D.JOIN 18.建立索引时,( )字段不能作为索引字段。
A.字符型 B.数值型 C.备注型 D.日期型
19.对于表的索引描述中,( )说法是错误的。
A.复合索引文件的扩展名为 CDX B.结构复合索引文件在表打开的同时自动打开 C.当前显示的顺序为主控索引的大小顺序 D.每张表只能创建一个主索引和一个候选索引
20.若 xsda 表已按 xh 字段建立了结构复合索引,索引标识为 xsxh。为了显示学号为 “921627”的记录,( )不能实现其功能。 A.USE xsda ORDER TAG xsxh B.USE xsda
SEEK \LOCATE FOR xh= \
DISPLAY DISPLAY
D.USE xsda C.USE xsda
SET ORDER TO xsxh LIST FOR xh= \xsxh=\
FIND xsxh+\DISPLAY
21.Visual FoxPro 中关于数据库,下列说法正确的是( )。
A.数据库就是二维关系表 B.数据库是表和关系的集合 C.数据库就是关系 D.数据库就是数据表格 22.在 Visual FoxPro 中,建立数据库的命令为( )。
A.CREATE DATABASE B.CLOSE DATABASE
C.OPEN DATABASE D.MODIFY DATABASE 23.对于数据库操作,( )说法是正确的。 A.数据库被删除后,
则它所包含的数据库表也随着删除 B.打开了新的数据库,则原来已打开的数据库被关闭 C.数据库被关闭后,则它所包含的已打开的数据库表仍被打开 D.数据库被删除后,则它所包含的表变为自由表 24.在 Visual FoxPro 中,数据库表和自由表的字段名最大字符数分别是( )。
A.10,10 B.128,10 C.256,128 D.128,128 25.关于数据库表与自由表,下列说法正确的是( )。 A.数据库表可以转换为自由表,反之不能 B.自由表可以转换为数据库表,反之不能 C.两者不能相互转换
D.两者可以相互转换
26.在向数据库添加表的操作中,下列叙述中不正确的是( )。 A.可以用
ADD TABLE 命令将一个自由表添加到数据库中 B.可以将一个已属于一个数据库的表添加到另一个数据库中 C.可以在项目管理器将自由表拖放到数据库中使它成为数据库表 D.欲使一个数据库表成为另外一个数据库的表,则必须先使它成为自由表 27.下列( )命令不能在 xsgl 数据库中建立一个数据库表 jsda。
A.OPEN DATABASE xsgl
CREATE jsda (交互输入)
B.OPEN DATABASE xsgl
CREATE TABLE jsda(bh C(5),xm C(10),gz N(7,2)) C.CREATE jsda
第二部分 《Visual FoxPro 程序设计(第二版)》复习提要与学习指导、习题及参考解答 103
104 Visual FoxPro 程序设计实训与考试指导(第二版)
(交互输入)
OPEN DATABASE xsgl ADD TABLE jsda
D.CREATE TABLE jsda(bh C(5),xm C(10),gz N(7,2))
CLOSE TABLE
CLOSE DATABASE xsgl
28.Visual FoxPro 中,主索引可在( )中建立。
A.自由表 B.数据库表 C.任何表 D.自由表和视图 29.在 Visual FoxPro 中,主索引字段( )。 A.不能出现重复值或空值
B.能出现重复值或空值 C.能出现重复值,但不能出现空值 D.能出现空值,但不能出现重复值
30.当前数据表包含“姓名(C)”和“成绩(N)”字段,按“姓名”升序、“成绩”降序 建立索引文件,应使用的命令是( )。
A.INDEX TO IDX1 ON 姓名+成绩 B.INDEX TO IDX1 ON 姓名-成绩
C.INDEX TO IDX1 ON 姓名+STR(成绩,3) D.INDEX TO IDX1 ON 姓名+STR(100-成绩,3) 31.执行 USE xsgl!xsda ALIAS 学生 IN B 命令后,被打开的表的别名是( )。
A.xsda B.学生 C.B D.ALIAS 32.命令 SELECT 0 的功能是( )。 A.选择区号最小的空闲工作区 B.选择区号最大的空闲工作区 C.选择当前工作区的区号加 1 的工作区 D.随机选择一个工作区的区号
33.要在两张相关的表之间建立永久关系,这两张表应该是( )。
A.同一数据库内的两张表 B.两张自由表 C.一个自由表和一个数据库表 D.任意两个数据库表或自由表 34.表之间的“一对多”关系是指( )。 A.一个表与
多个表之间的关系 B.一个表中的一个记录对应另一个表中的多个记录 C.一个表中的一个记录对应另一个表中的一个记录 D.一个表中的一个记录对应多个表中的多个记录
35.要在两个数据库表之间建立一对多的永久关系,则至少要求在父表的结构复合索引 文件中创建一个( ),在子表的结构复合索引文件中也要创建索引。
A.独立索引 B.复合索引 C.主索引或候选索引 D.普通索引 36.永久关系建立后,( )。
A.在数据库关闭后自动取消 B.如不删除将长期保持 C.无法删除 D.只供本次运行使用
37.对于表之间的永久关系和临时关系,( )说法是错误的。 A.只要打开数
据库表,两数据库表之间永久关系就起作用 B.永久关系只能建立于数据库表之间,而临时关系可以建立于各种表之间 C.一个表只能和另外一个表之间建立临时关系 D.临时关系不保存在数据库中 38.当数据库表移出数据库后,仍然有效的是( )。 A.字
段的默认值 B.表的触发器 C.结构复合索引 D.记录的验证规则 39.以下( )操作不会激活记录的有效性规则的检验。
A.修改表结构并保存时 B.修改表的某一记录时 C.修改了记录值并执行 SKIP 命令时 D.修改表记录数据并关闭表时
40.在生成参照完整性中,设置更新操作规则时选择了“限制”选项卡后,下列说法中 ( )是正确的。 A.当更改父表的“主”或“候选”关键字值以后,自动更改子表记
录的对应值 B.允许更改子表中对应的普通索引关键字的字段值 C.禁止更改父表中的“主”或“候选”关键字的字段值 D.当更改了子表中的字段值,则自动更改父表中对应记录的字段值
二、填空题
1.在 Visual FoxPro 数据类型中,D 型字段的宽度是固定的 2.欲修改表结构,则必须以 方式打开表。
字节。
3.显示当前记录的命令为 ,修改表结构的命令为 。 4.求当前表中数值型字段平均值的命令为 ,分类汇总的命令为 。 5.在命令 SEEK、FIND、LOCATE、TOTAL 中, 执行时不要求对表进行索引的命令 是 。
6.在 Visual FoxPro 中,索引类型分别是:主索引、候选索引、普通索引和 。 7.数据库表的字段属性有:显示、 、匹配字段类型到类、注释。 8.创建数据库 xsgl 后,系统自动生成的三个文件为 、 和 。 9.如果一个数据库表的“插入触发器”设置为.F.,则不允许对该表作 记录的 操作。
10.在参照完整性的设置中,如果要求在主表中删除记录的同时删除子表中的相关记 录,则应将“删除”规则设置为 。
三、操作题
现有学生成绩表 XSCJ.DBF 和学生档案表 XSDA.DBF,结构如下:
XSCJ.DBF:学号(C/9)、姓名(C/3)、性别(C/2)、计算机(N/3)、英语(N/3)、总 分(N/4)
第二部分 《Visual FoxPro 程序设计(第二版)》复习提要与学习指导、习题及参考解答 105
106 Visual FoxPro 程序设计实训与考试指导(第二版)
XSDA.DBF:学号(C/9)、出生年月(D/8)、通信地址(M) 假设 XSCJ 在第 1 工作区打开,XSDA 在第 2 工作区打开,请按以下要求写出操作命令。 (1)在第 10 号记录之前插入一条空白记录
(2)删除至少有一门课程不及格的所有记录,然后将其恢复。 (3)计算每个学生的总分并存入“总分”字段中。 (4)求出全班的平均成绩并存入内存变量 AV 中。 (5)按总分以降序建立一个结构化索引文件,索引标识为 ZF,并按总分的降序显示所 有女生的数据。
(6)快速查找总分为 165 分的学生,并显示其学号、姓名及性别三项。 (7)逐屏显示学生的学号、姓名、性别、出生年月及通信地址。 (8)根据 XSCJ.DBF 和 XSDA.DBF 生成一个新的表 NEW.DBF,新的表包含学号、姓 名、性别、出生年月字段。
习题 3 参考解答
一、选择题 1~5:BDCCB 21~25:BABBD 二、填空题
6~10:ACACD 26~30:BDBAD
11~15:BDADC 31~35:BAABC
16~20:BCCDC 36~40:BCCAC
1.8 2.独占
3.DISPLAY、MODIFY STRUCTURE 4.AVERAGE 、TOTAL 5.LOCATE 6.唯一索引 7.字段有效性
8.DBC、DCT、DCX 9.插入 10.级联 三、操作题
1.SELECT 1
GO 10
INSERT BLANK BEFORE
2.DELETE FOR 计算机<60 OR 英语<60 RECALL ALL
3.REPLACE ALL 总分 WITH 英语+计算机
4.AVERAGE 总分 TO AV 5.INDEX ON 总分 TAG ZF DESC LIST FOR 性别=\女\6.SEEK 165
DISPLAY 学号,姓名,性别 7.SELECT 2
INDEX ON 学号 TO XH1 SELECT 1
INDEX ON 学号 TO XH2
SET RELATION TO 学号 INTO A
DISPLAY ALL 学号,姓名,性别,A.出生年月,A.通信地址 8.SELE 0
USE XSCJ SELE 0 USE XSDA
JION WITH XSCJ TO NEW FIELDS 学号,XSCJ.姓名,性别,出生年月 FOR 学号=XSCJ. 学号
2.4 查询和视图
2.4.1 复习提要与学习指导
1.掌握查询/视图设计器的使用,理解查询和视图字段、筛选、排序、分组的含义并掌
握其设置方法。
添加表:添加多张表时,注意添加的次序,主表——子表——主表(如果是数据库表, 则事先应打开该表所属的数据库)。
可添加的数据源表:自由表、数据库表、视图(注意:不能为查询)。 字段:设定输出字段
字段表达式 AS 字段标题 或 字符常量 AS 字段标题 如果是字符常量,则表示该字段全部填充该常量的值。例如,\优秀\等级 字段表达式:销售数量*零售价 AS 销售总额
统计函数的使用: 计数:COUNT(*),参数可以为星号或者任意输
出字段名。 求和:SUM(),参数可以是一个或多个数值型字段的表达式。 求平均值:AVG(),参数同 SUM()。 求最大值:MAX()。 求最小值:MIN()。
注意
输出字段中如果有统计函数,则一般有分组依据,按分组依据形成多条 记录;如不设定分组依据,则整个表将合并成一条记录。
第二部分 《Visual FoxPro 程序设计(第二版)》复习提要与学习指导、习题及参考解答 107
108 Visual FoxPro 程序设计实训与考试指导(第二版)
可以用星号表示输出表中所有字段。例如: Select * From stud!xs Where xb=\男\连接条件: 基于单张表的查询不需要考虑连接条件:
FROM stud!xs INNER JOIN stud!cj;
INNER JOIN stud!kc ; ON Cj.kcdh = Kc.kcdh ;
ON Xs.xh = Cj.xh; 注意:表和连接条件之间的对应关系 筛选
(Where):直接从表中选出满足条件的记录;有时还可用来建立表之间的连接。 条件类型:
LIKE:表示以什么开头或结尾 js.gh LIKE a LEFT(CSTR,N):从 CSTR 变量的左边开始取 N 个字符。 RIGHT(CSTR,N):从 CSTR 变量的右边开始取 N 个字符。 SUBSTR(CSTR,NSTART,NLEN):从 CSTR 变量的 NSTART 开始取 NLEN 个字符。 BETWEEN:表示在什么和什么之间。
CSRQ BETWEEN 01/01/81,12/31/82
也可以用逻辑运算符连接两个关系表达式来实现。例如: CSRQ>={01/01/80} .AND. CSRQ<={12/31/82} IN:表示在某个范围之内。 函数 inlist(变量,值的列表)
例如:inlist(len(alltrim(xs.xh)),6,8,10):学号字段的长度只能为 6、8、10。
SELECT * FROM xs WHERE xs.xh IN(SELECT DISTINCT cj.xh FROM cj):输出在成绩 表中有成绩的学生的信息。
MODI COMM CHAXUN1.QPR
实例文本框中应注意:①字符串不需加引号,除非和字段名同名;②日期不需加花括 号,但日期的格式必须满足 Visual FoxPro 系统的日期格式(月/日/年);③逻辑值必须按标 准形式(.T.,.F.);④不能用 M 或 G 型字段做选定条件;⑤不等于的表示:实际是相等情况 的取反(选定条件前面的“否”按钮)。
排序(ORDER BY):默认是按升序。注意字段列表的先后顺序影响排序结果,按多个 字段排序,不能用表达式,只需要将字段按次序列出,中间用逗号分隔,而且必须给出每个 字段的顺序(ASCE(升序,可省略)、DESC(降序))。
例如:按性别降序排序,性别相同按姓名升序排序。
例如,ORDER BY xb DESC,xm:如果姓名按降序,则也必须给定 DESC,不能省略。 分组(GROUP BY):分组依据。肯定是输出字段,但不能是通过计算得到的数值输出 字段。 不能使用的:SUM(CJ.CJ)、COUNT(*);可以使用的:LEFT(XH,2)。 分组依据可以
是一个字段,也可以是多个字段。 满足条件(HAVING):表示在查询结果的基础上进行的再次筛选,表达式中的字段不 是表中的原始字段。
例如:输出平均分在 75 分以上的学生名单
与筛选条件(WHERE)的区别:WHERE 表示可直接利用表中的字段或经过函数简单 处理来形成的条件。
杂项(TOP N PERCENT;DISTINCT):查询结果的范围。 例如:查询输出总分的前 3 名:
首先 结果按总分的降序排序,然后设置 取前 3 条记录(TOP 3) DISTINCT:表示忽略查询结果中的重复记录,重复记录只显示第一条 运行查询:查询文件中保存的是查询的命令
DO 查询文件名.QPR (扩展名不能省略)
选择查询的输出类型(INTO | TO): 默认的输出类型:浏览窗口
其他形式:INTO 自由表 TABLE、临时表 CURSOR、数组 ARRAY
(输出的字段数以及记录数决定数组的形状)
TO 报表 REPROT、标签 LABEL、屏幕 SCREEN、打印机 PRINT 2.掌握 SQL 语句尤其是 SELECT-SQL 语句的使用。
SELECT DISTINCT TOP N (PERCENT)输出字段列表(注意 * 的作用) FROM 数据源表 1 [INNER JOIN 数据源表 2 ON 连接条件]
[WHERE 筛选条件 (注意:多个条件表达式需用逻辑运算符连接)] [GROUP BY 分组依据] [HAVING 满足条件]
UNION
SELECT DISTINCT TOP N (PERCENT)输出字段列表 (注意:必须与前一查询的输出 列表一致)
FROM 数据源表 1 INNER JOIN 数据源表 2 ON 联接条件 WHERE 筛选条件 GROUP BY 分组依据 HAVING 满足条件
[ORDER BY 排序依据] (注意:依据可以是字段名或字段序号;它是对查询的最终结 果进行排序)
最后的 ORDER BY 对上两个查询的结果都有效。 学习时,注意把查询/视图设计器与 SELECT-SQL 命令相比较:设计器中的每一个设置 都是与 SELECT 命令中的子句或选项一一对应的。在使用设计器创建、修改查询和视图时, 可以通过菜单或工具栏立即查看 SQL 命令,通过比较,既有利于命令的记忆,又有利于对 设计器中操作的理解。
3.掌握用视图设计器设计本地视图的方法。 视图的分类:本地视图、远程视图。
创建视图的命令:CREATE SQL VIEW 视图名 AS SELECT 语句
注意
视图不以文件的形式保存,而是保存于数据库文件中。 第二部分 《Visual FoxPro 程序设计(第二版)》复习提要与学习指导、习题及参考解答 109
110 Visual FoxPro 程序设计实训与考试指导(第二版)
更新条件:(视图设计器区别于查询设计器的地方)。
设置关键字段:每个需修改数据的表中都必须设定;如果表中没有设置关键字段,则表 中的数据不允许修改及更新;关键字段设置的目的是为了防止更新冲突及出现重复记录 选定需要修改的字段: 使表可更新:选定发送 SQL 更新(SENDUPDATE);它是决定视图中修改的数据是否 反映到基表中去的一个开关。
参数化视图:实际上是筛选条件不确定的一种视图 需要注意条件实例的表示:?参数名 设置视图参数:实际上是确定视图参数的类型。 视图的使用:注意视图的打开与查询的打开不同。 视图是一张虚表,它的打开方式同表:USE 视图名
(注意:视图打开前,必须打开它所属的数据库) 视图的修改
和重命名:MODIFY VIEW 视图名 (此命令将打开视图设计器) 视图字段属性的设置:视图的输出字段 可以设置类似于数据库表的扩展属性 可在字段选项卡中,点击属性按钮;(注意:查询设计器不具有该按钮) 4.掌握查询和视图的概念、区别与联系。
联系 区别 查询 视图(本地) 都是检索数据的方法。查询是检查存储在表中的特定信息的一种结构化方法,视图是特殊的查 询;本质上都是 SELECT-SQL 命令;具有相同的数据源类型和输出类型,查询和视图设计器也基 本相同 存储 处理结果 SELECT-SQL 命令存储为 QPR 查询文件 查询结果为只读的数据 用 DO 命令运行 SELECT-SQL 命令存储在数据库中 可以更新查询结果中的基表记录数据 可以当作表用 USE 命令打开 使用 单独作为组合框、列表框的一种数据行源 作为作为组合框、列表框的一种数据行 类型(RowsourceType):“查询” 源时,与表一样为“别名”类型
有关数据库、表、视图、查询的关系结构见下图。
查询 1 查询
查询 2 查询 3 查询 4 数 视图
视图 1 视图 2 视图 3
基表
库表 1 库表 2 库表 3 自由表 1 自由表 2 自由表 3
2.4.2 习题四及参考解答
一、选择题
1.查询结果可进行( )。 A.数据修改 B.数据追加 2.视图( )。 A.可更新数据 C.不能修改
3.查询的数据源( )。 A.只能是自由表 C.只能是视图 4.视图是一个( )。
C.单独保存
D.保存在数据库中
B.能单独保存
D.不能单独保存,也不能修改 B.只能是关联的多表 D.表和视图
A.虚拟的表 B.真实的表 C.不依赖数据库的表 D.不能修改的表 5.在 Visual FoxPro 中,建立查询可用( )方法。 A.使用查询向导 B.使用查询设计器 C.直接使用 SELECT-SQL 命令 D.以上方法均可 6.关于查询的去向,以下说法不正确的是( )。 A.可输出到浏览窗口 B.可输出到一临时表 C.可输出到一报表文件 D.只可输出到屏幕 7.关于视图,下列说法错误的是( )。 A.对视图的使用与表一样,也可以进行插入、查询、删除、修改操作 B.视图与查询一样,都以文件的形式独立存在,都可以为数据库所管理 C.视图与表不一样,它是一种虚表,不存储数据 D.在 Visual FoxPro 中,可建立本地视图和远程视图
8.使用 SELECT-SQL 命令建立查询时,若要将查询结果输出到一临时数据表中,需要
使用( )子句。
A.INTO ARRAY B.INTO CURSOR C.INTO TABLE D.TO FILE 9.SQL 语句中删除表的命令是( )。
A.DROP TABLE B.DELETE TABLE C.ERASE TABLE D.DELETE DBF 10.UPDATE_SQL 语句的功能是( )。
A.数据定义 B.数据查询 C.修改表的列属性 D.修改表的列内容 11.SQL 语句中修改表结构的命令是( )。
第二部分 《Visual FoxPro 程序设计(第二版)》复习提要与学习指导、习题及参考解答 111
112 Visual FoxPro 程序设计实训与考试指导(第二版)
A.UPDATE STRUCTURE C.ALTER TABLE
12.SQL 语句的核心是( )。
B.MODIFY STRUCTURE
D.ALTER STRUCTURE
A.数据查询 B.数据修改 C.数据定义 D.数据控制
13.在 SQL 语句中,与表达式“cj BETWEEN 80 AND 90 ”功能相同的表达式是 ( )。
A.cj>=80 AND cj<=90 B.cj>80 AND cj<90 C.cj>=80 AND cj<90 D.cj>=80 OR cj=<90 14.用于显示部分查询结果的 TOP 短语,必须与( )同时使用。
A.GROUP BY B.OEDER BY C.WHERE D.INTO TABLE
15.在 SQL 语句中,与表达式“kcdm NOT IN([005],[008])”等义的表达式是( )。 A.kcdm=\B.kcdm!=\C.kcdm=\D.kcdm!=\16.使用 SQL 语句在表 xsda 中查询姓“马”的同学,正确的命令是( )。 A.SELECT * FROM xsda WHERE xm LIKE \马_\
B.SELECT * FROM xsda WHERE xm LIKE \马%\C.SELECT * FROM xsda WHERE xm=\马*\D.SELECT * FROM xsda WHERE xm=\马?\
17.使用 SQL 语句在表 xscj 中增加一条记录,xh 为“1234”,kcdm 为“999”,cj 为 88,正确的命令是( )。
A.INSERT INTO TABLE xscj VALUES(\
B.INSERT INTO xscj VALUES(\
C.INSERT INTO xscj(xh,kcdm,cj) VALUES(\D.INSERT INTO xscj VALUES(xh=\18.使用 SQL 语句将上题增加记录的分数调整为 90,正确的命令是( )。
A.UPDATE TABLE xscj SET cj=90 B.UPDATE xscj SET cj=90 C.UPDATE xscj SET cj=90 WHERE xh=\
D.UPDATE TABLE xscj SET cj=90 WHERE xh=\19.使用 SQL 语句将上题增加的记录逻辑删除,正确的命令是( )。
A.DROP TABLE xscj
B.DELETE TABLE xscj WHERE xh=\C.DELETE FROM xscj WHERE xh=\D.DROP FROM xscj WHERE xh=\
20.根据 xsda 和 xscj 表,找出所有选修了课程号为“009”的学生,正确的命令是 ( )。
A.SELECT * FROM xsda,xscj WHERE xsda.xh=xscj.xh AND kcdm=\B.SELECT * FROM xsda WHERE xsda.xh=xscj.xh AND kcdm=\
C.SELECT * FROM xsda INNER JOIN xscj WHERE xsda.xh=xscj.xh AND kcdm=\
D.SELECT * FROM xsda JOIN xscj WHERE xsda.xh=xscj.xh AND kcdm=\
21 .根据 xsda 表,找出和 xh 为“921608 ”在同一个专业的学生,正确的命令是 ( )。
A.SELECT * FROM xsda WHERE zy=(SELECT * FROM xsda WHERE xh=\B.SELECT * FROM xsda WHERE zy=(SELECT zy FROM xsda WHERE xh=\C.SELECT * FROM xsda WHERE xh=\D.SELECT zy FROM xsda WHERE xh=\ 22.根据 xsda 和 xscj 表,找出有满分的学生的专业,正确的命令是( )。
A.SELECT zy FROM xsda WHERE xh IN ANY(SELECT xh FROM xscj WHERE
cj=100)
B.SELECT UNIQUE zy FROM xsda WHERE xh=ALL(SELECT xh FROM xscj WHERE cj=100)
C.SELECT zy FROM xsda WHERE xh=ANY(SELECT xh FROM xscj WHERE cj=100)
D.SELECT DISTINCT zy FROM xsda WHERE xh=ANY(SELECT xh FROM xscj WHERE cj=100)
23.统计 xsda 表中的学生人数,结果存入表 TJRS.DBF 表中,正确的命令是( )。
A.SELECT * FROM xsda INTO DBF TJRS
B.SELECT SUM(*) FROM xsda INTO DBF TJRS C.SELECT CNT(*) FROM xsda INTO DBF TJRS D.SELECT AVG(*) FROM xsda INTO DBF TJRS 24.查询 xsda 表中入学成绩为最高分的学生信息并浏览,正确的命令是( )。
A.SELECT * FROM xsda TOP 1 B.SELECT * FROM xsda WHERE rxf=(SELECT MAX(rxf) FROM xsda) C.SELECT * FROM xsda WHERE rxf=(SELECT MIN(rxf) FROM xsda) D.SELECT * FROM xsda ORDER BY rxf TOP 1 25.查询 xsda 表中各系的学生读者人数并浏览,正确的命令是( )。
A.SELECT xi,CNT(*) FROM xsda GROUP BY xi B.SELECT xi,CNT(*) FROM xsda ORDER BY xi
C.SELECT xi,CNT(*) FROM xsda ORDER BY xi DISTINCT D.SELECT xi,CNT(*) FROM xsda 二、填空题
1.建立查询的方法有三种,分别为
2.视图有两种,分别是 和 3.多表查询时,表之间的连接类型有 、 、 和 。 4.查询的去向分别是 、 、 、图形、屏幕、报表和标签,共 有 种。
5.查询 更新数据,视图 更新数据。
第二部分 《Visual FoxPro 程序设计(第二版)》复习提要与学习指导、习题及参考解答 113
、
。
和 。
114 Visual FoxPro 程序设计实训与考试指导(第二版)
6.建立视图时,其数据源可以是 、 、 。 7.在 SQL 中,ALTER 命令配合 4 个子命令完成对表结构的不同操作: 子命令用于增加新字段, 子命令用于删除字段, 修改字段名, 子命令用于修改字段类型和宽度。
8.在 SQL 中,使用 子句可以消除结果中的重复记录。
9.在 ORDER BY 的选项中,ASC 表示 排序;DESC 表示 10.在 SQL 中,希望执行分组运算,需要使用 子句。 三、操作题
子命令用于
排序。
1.使用 SQL 语句建立如下数据表:
XS XH 980001 980002 980007 980008 KC KCH 01 02 03 04 05 06 CJ XH 980001 980001 980001 980002 980002 980002 980007 980007 980007 980008 980008 980008 KCH 01 02 04 01 02 04 04 05 06 01 02 03 CJ 83 92 81 72 65 95 78 79 88 55 90 70 KCM 计算机文化 C 语言 CAI 课件制作 数据结构 数据库原理 计算机网络 XSS 58 72 45 72 72 60 XM 王敏一 戴伟玲 林清霞 钱能 XB 男 女 女 女 NL 18 19 18 20
2.然后利用 SELECT-SQL 语句再实现以下操作: (1)显示 XS 表中所有“女”同学的信息;
(2)求所有学生的学习成绩,并列出姓名、性别、课程名、学时数和成绩; (3)显示所有选修“C 语言”的同学信息。 (4)显示总分比“钱能”同学高的学生 (5)显示成绩为前 3 名的同学的姓名、性别、课程名、和成绩
习题 4 参考解答
一、选择题
1~5:CADAD 6~10:DBBAD 11~15:CAABB 16~20:BCCCA 21~25:BDCBA
二、填空题
1.查询向导、查询设计器、SQL-SELECT 命令 2.本地视图、远程视图
3.内部联接、左联接、右联接、完全联接 4.浏览、临时表、表、7 5.不能、能(可以)
6.自由表、数据库表、视图
7.ADD、DROP、RENAME、ALTER 8.DISTINCT 9.升序、降序 10.GROUP BY 三、操作题
1.CREATE TABLE XS(XH C(6),XM C(8),XB C(2),NL N(2))
再交互或用 SQL 方式填写内容 CREATE TABLE KC(KCH C(2),KCM C(16),XSS N(3)) 再交互或用 SQL 方式填写内容 CREATE TABLE CJ(XH C(6),KCH C(2),CJ N(3)) 再交互或用 SQL 方式填写内容
2.(1)SELECT * FROM xs WHERE XB=\女\
(2)SELECT Xs.xm AS 姓名, Xs.xb AS 性别, Kc.kcm AS 课程名, Kc.xss AS 学时数, Cj.cj AS 成绩;
FROM xs INNER JOIN cj; INNER JOIN kc ;
ON Cj.kch = Kc.kch ; ON Xs.xh = Cj.xh
或
SELECT Xs.xm AS 姓名, Xs.xb AS 性别, Kc.kcm AS 课程名, Kc.xss AS 学时数,
第二部分 《Visual FoxPro 程序设计(第二版)》复习提要与学习指导、习题及参考解答 115
116 Visual FoxPro 程序设计实训与考试指导(第二版)
Cj.cj AS 成绩 FROM xs,cj,kc Where Cj.kch = Kc.kch and Xs.xh = Cj.xh (3)SELECT Xs.xh AS 学号, Xs.xm AS 姓名, Xs.xb AS 性别, Xs.nl AS 年龄;
FROM xs INNER JOIN cj; INNER JOIN kc ;
ON Cj.kch = Kc.kch ; ON Xs.xh = Cj.xh;
WHERE Kc.kcm = \语言\或
SELECT Xs.xh AS 学号, Xs.xm AS 姓名, Xs.xb AS 性别, Xs.nl AS 年龄;
FROM xs,cj,kc Where Cj.kch = Kc.kch and Xs.xh = Cj.xh and Kc.kcm = \语言\ (4)分步计算:
1)先求出“钱能”同学的总分。
SELECT sum( Cj.cj) as 总分; FROM xs INNER JOIN cj ; ON Xs.xh = Cj.xh;
WHERE Xs.xm = \钱能\&&产生含有“钱能”总分的临时表 2)ZF=总分 &&将“总分”取到变量中备用 3)SELECT Xs.xh, Xs.xm, sum( Cj.cj) as 总分;
FROM xs INNER JOIN cj ; ON Xs.xh = Cj.xh; GROUP BY Xs.xh; HAVING 总分> zf &&找到总分比“钱能”同学高的学生
(5)SELECT Xs.xm AS 姓名, Xs.xb AS 性别, Kc.kcm AS 课程名, Cj.cj AS 成绩;
FROM xs INNER JOIN cj; INNER JOIN kc ;
ON Cj.kch = Kc.kch ; ON Xs.xh = Cj.xh;
ORDER BY CJ.cj DESC TOP 3 或
SELECT Xs.xm AS 姓名, Xs.xb AS 性别, Kc.kcm AS 课程名, Cj.cj AS 成绩; FROM xs,cj,kc Where Cj.kch = Kc.kch and Xs.xh = Cj.xh ORDER BY CJ.cj DESC TOP 3
2.5 结构化程序设计
2.5.1 复习提要与学习指导
1.常用命令 *,&& ?
注释标记,*用来对整行进行注释,只能位于行的开始 换行显示(从新的一行开始显示后面的数据)
??
从当前行开始显示数据
CLEAR 清除主窗口中的内容 RUN 在命令窗口执行 WINOWS 应用程序 run notepad.exe QUIT/RETURN/CANCEL 结束 Visual FoxPro 应用程序或返回调用处 SET BELL ON|OFF
SET CENTURY ON|OFF
世纪开关(是否采用四位的年份)
SET DATE TO YMD|MDY|DMY 设置日期格式 SET DEFAULT TO 设置默认工作路径 SET ESCAPE ON|OFF 设置是否由 ESC 键终止程序运行
SET SAFETY ON|OFF 设置安全开关(当要修改和替换文件时,是否有警告信息) SET SECONDS ON|OFF SET TALK ON|OFF 设置 打开和关闭显示用户命令的中间结果 SET DECI TO n 设置程序中数值数据的小数位数为 n 位 WAIT “提示字符串” WINDOWS 用来返回程序结果的 2.掌握三种基本控制结构
(1)顺序结构。 最常见的最根本的程序结构,按程序代码依次执行。 (2)分支结构。
1)IF 语句(两分支,类似于 IIF(条件,表达式 1,表达式 2)函数)
IF 条件 [语句组 1] &&条件成立则执行
ELSE
[语句组 2] &&条件不成立则执行
ENDIF
2)CASE 结构(多分支)
DO CASE
CASE 表达式 1
[语句组 1] CASE 表达式 2
[语句组 2] ??
OTHERWISE
[语句组] ENDCASE
注意
&&表示其他情况
在 DO CASE 与第一个 CASE 之间不允许存在其他任何语句。一般情况 下,对于命令按钮组和选项按钮组的编程可以用 CASE 结构。 (3)循环结构。
1)DO WHILE … ENDDO:适用于循环次数未知的情况。
第二部分 《Visual FoxPro 程序设计(第二版)》复习提要与学习指导、习题及参考解答 117
118 Visual FoxPro 程序设计实训与考试指导(第二版)
DO WHILE 条件 [循环执行的语句]
ENDDO
当条件为真时,执行循环体
EXIT:终止整个循环结构的执行
LOOP:终止本次循环,直接进入下一轮的循环
跳过 LOOP 和 ENDDO 之间的所有语句,回到循环开始语句
【例】将任意字符(包括汉字)组成的字符串进行反序显示。
STORE \,CC P=SPACE(0)
DO WHILE LEN(C)>0
X=asc(left(c,1))
If x>127 && ASCII 的最大值为 01111111(127) I=2 &&汉字处理 Else
I=1 &&字母处理 Endif
P=left(c,i)+p C=substr(c,2*i-1) Enddo
?cc+\的反序为\
&& c=right(c,len(c)-i)使条件不断向循环终止条件转化
2)FOR…ENDFOR:用来对循环次数已知的情况。
FOR I=e1 TO e2 STEP e3
[循环执行的语句]
ENDFOR|NEXT
e1 循环初值、e2 循环终值、e3 步长(增量) e1
e1>e2 e3<0 从大到小,每次减
方法 2:
nsum=0
nmul=1 for i=1 to 10 nmul=nmul*i
nsum=nsum+nmul next i ?nsum
nsum=0 for i=1 to 10
nmul=1 &&保存阶乘值
&&外循环每执行一次,nmul 都重新赋值 for j=1 to I &&引用外层循环变量的值 nmul=nmul*j next j
&&以上内层循环用来求 I 的阶乘 nsum=nsum+nmul next i ?nsum
3)SCAN…ENDSCAN:用来对表中的记录进行操作,能自动改变记录指针的位置。
SCAN [范围|FOR 条件|WHILE 条件]
[循环执行的语句]
ENDSCAN
【例】统计教师表中性别为男的记录的条数。
ncount=0 use js
scan for xb=\男\ncount=ncount+1
&& skip 如果有此语句,则程序功能为统计顺序号为奇数的男教师人数 endscan
3.掌握创建用户自定义函数和过程的方法 (1)用户自定义函数(UDF)。 1)格式:
FUNCTION 函数名
parameter 参数列表 [函数的执行语句部分] return 结果表达式 ENDFUNC
&&当该函数需要从外部接受值时,必须有该语句,形
式参数
&&包括赋初值、处理
&&返回结果,UDF 必须包含该语句
注意
函数名不能作为函数体中的变量名 2)调用:
?函数名(参数列表) &&必须保证参数列表中数据的一一对应,实在参数 y=函数名(参数列表) 注意
实参和形参的一一对应包括:个数、次序、类型三个方面的对应 (2)过程 1)格式:
PROCEDURE 过程名
parameter 参数列表 &&当该过程需要从外部接受值时,必须有该语句 [过程的执行语句部分] &&包括赋初值、处理 ?结果 &&显示结果,此处不能用 RETURN 返回值 ENDPROC
2)调用:DO 过程名 WITH 参数列表。 (3)过程和函数存储的 4 种形式。
1)放于主程序单元之后,与主程序位于同一个 PRG 文件。 2)每个函数或过程单独以一个 PRG 文件存放,一个函数或过程存放一个文件。 3)所有的函数和过程存放于同一个 PRG 文件中,这个 PRG 文件称为过程文件。 如果是第三种存放形式,则在调用该函数或过程之前,必须执行命令:
第二部分 《Visual FoxPro 程序设计(第二版)》复习提要与学习指导、习题及参考解答 119
120 Visual FoxPro 程序设计实训与考试指导(第二版)
SET PROCEDURE TO 过程文件名 &&指定过程所在的位置信息
4)函数和过程也可存放于数据库文件的存储过程中。 如果函数和过程位于数据库的存储过程,则调用之前,必须先打开该数据库。
(4)参数传递的两种形式。 值传递:在函数或过程中改变参数的值,在程序运行结束后,该参数的值仍旧为原来的值。 引用传递:将参数的地址传递到函数和过程中,程序运行结束后,对该参数的改变将保留。 默认:函数采用值传递来传递参数;过程采用引用传递来传递参数。 设置默认的参数传递方式:SET UDFPARMS TO REFERENCE|VALUE 强行指定参数传递方式:值传递——变量名前加@
引用传递——变量名加括号 (5)变量的作用范围。 LOCAL(局部变量)只能在定义它的程序单位中使用,在它的上级或下级程序单位中无效 PRIVATE(私有变量)子程序中的同名变量在运行结束后消失,不影响主调程序的同名 变量
PUBLIC(全局变量)在整个程序运行过程中,在每个程序单位中都有效
2.5.2 习题 5 及参考解答
一、选择题
1.Visul FoxPro 的程序文件可以由( )命令建立或修改。 A.MODIFY COMMAND B.EDIT COMMAND C.CHANGE COMMAND D.DO COMMAND 2.在项目管理器中,程序存放在( )页中。
A.数据 B.文档 C.类 D.代码 3.Visual FoxPro 程序的三种基本结构是( )。 A.顺序结构、选择结构和循环结构 B.顺序结构、选择结构和逻辑结构 C.模块结构、转移结构和循环结构 D.网状结构、选择结构和逻辑结构 4.能放在可执行命令末尾的注释命令是( )。 A.REM B.&& C.* D.// 5.下列不正确的赋值语句是( )。 A.x=12 B.store 12 to x C.\D.input \ 6.假定 X=2,执行命令 ? X=X+1 后,结果是( )。 A.3 B.2 C..T.
。 7.下列语句中,不是输入命令的是( )
A.? B.INPUT C.ACCEPT
D..F.
D.WAIT
8.在当前位置处输出结果不回车换行的命令是( )。
A.? B.?? C.OUTPUT D.PRINT 9.下列语句中,( )是分支语句。 A.IF…ENDIF B.FOR…ENDFOR C.DO WHILE…ENDDO D.SCAN…ENDSCAN 10.对 DO CASE…ENDCASE 语句,下列说法中正确的是( )。 A.执行第
一个语句组 B.执行满足条件的第一个语句组 C.执行满足条件的所有语句组 D.执行 OTHERWISE 后面的语句组 11.对于 FOR I=1 TO 8 STEP 2 循环,正常退出循环后的 I 值为( )。
A.7 B.8 C.9 D.10
12.在 DO WHILE…ENDDO 循环中,若循环条件设置为.T.,则下列说法中正确的是
( )。
A.程序无法跳出循环 B.程序不会出现死循环 C.用 EXIT 可跳出循环 D.用 LOOP 可跳出循环 13.针对表的循环语句是( )。
A.FOR…ENDFOR B.DO WHILE…ENDDO
C.SCAN…ENDSCAN D.DO CASE…ENDCASE 14.不能将 LOOP 作为有效命令使用的程序结构是( )。
A.IF…ENDIF B.SCAN…ENDSCAN C.FOR…ENDFOR D.DO WHILE…ENDDO 15.执行一列程序后,屏幕显示的结果为( )。
X=20 Y=10 N=0
DO WHILE Y RETURN C.4 D.5 16.将数组的内容传送到表的命令是( )。 A.DIMENSION B.APPEND FROM ARRAY C.COPY TO ARRAY D.RELEASE 17.清除所有内存变量的命令是( )。 A.CLEAR C.DIMENSION 18.过程的引导语句是( )。 A.PROCEDURE A.10 B.20 B.PUBLIC D.RELEASE ALL B.PROGRAM 第二部分 《Visual FoxPro 程序设计(第二版)》复习提要与学习指导、习题及参考解答 121 122 Visual FoxPro 程序设计实训与考试指导(第二版) C.PARAMETERS D.FUNCTION 19.函数的返回值跟在( )之后 。 A.RETURN B.LPARAMETERS C.PARAMETERS D.FUNCTION 20.下列关于参数传递不正确的说法是( )。 A.传值的方式是“单向”的,即只 能由实参传递给虚参,而虚参不能返回给实参 B.传址的方式是“双向”的,即实参变量和虚参变量被分配为同一存储单元 C.将实参变量用括号括起来为传值方式,在实参变量前加“@”符号则为传址方式 D.在默认的情况下,Visul FoxPro 在调用子程序时采用传址方式 21.定义全局变量的命令为( )。 A.PUBLIC B.LOCAL C.DIMENSION D.PRIVATE 22.关于变量不正确的说法是( )。 A.全局变量在所有程序中都有效,都可以使 用 B.局部变量只能在创建它们的过程内部使用和修改 C.私有变量在定义它的程序以及它所调用的子程序范围内有效,即本层及下层有效 D.系统默认定义的变量都属于全局变量 23.在 Visual FoxPro 中,关于过程调用的叙述正确的是( )。 A.当实参的个数少于形参的个数时,多余的形参取逻辑假 B.当实参的个数多于形参的个数时,多余的实形参被忽略 C.实参必须与形参的个数相等 D.实参必须与形参的个数相等且类型一一对应 24.只能关闭过程文件的命令是( )。 A.CLOSE PROCEDURE C.CLOSE DATABASES C.SET INDEX TO D.USE 25.调用子程序传递实参时,通过( )语句。 A.PARAMETERS B.WITH C.TO D.LINK 二、阅读下列程序,根据要求写出结果 【程序 1】 SET TALK OFF X=5 DO CASE CASE X>10 Y=X+5 CASE X>0 Y=X*3 OTHERWISE Y=X**2+10 ENDCASE ?Y SET TALK ON 运行结果: 【程序 2】 SET TALK OFF S=0 P=5 DO WHILE P<=10 P=P+1 S=S+P*2 ENDDO ? S RETURN 运行结果: 【程序 3】 SET TALK OFF STORE 1 TO X,Y DO WHILE .T. X=X+1 Y=Y+X IF X>=5 EXIT ENDIF ENDDO ?X,Y RETURN 则程序运行后 x 为 【程序 4】 SET TALK OFF CLEAR DIMENSION B(5) B=5 I=1 S=0 DO WHILE I<5 S=S+B(I) I=I+2 ENDDO ? \RETURN ,y 为 。 运行结果: 【程序 5】 SET TALK OFF CLEAR 第二部分 《Visual FoxPro 程序设计(第二版)》复习提要与学习指导、习题及参考解答 123 124 Visual FoxPro 程序设计实训与考试指导(第二版) STORE 0 TO X,Y,S1,S2,S3 DO WHILE X<10 X=X+1 DO CASE CASE INT(X/2)=X/2 S1=S1+X/2 CASE X % 3 = 0 S2=S2+X/3 CASE INT(X/2)<>X/2 S3=S3+1 ENDCASE ENDDO ? S1,S2,S3 SET TALK ON RETURN 运行结果: 【程序 6】 *运行以下程序,输入 10,5 两个数: SET TALK OFF CLEAR INPUT \请输入第一个数:\INPUT \第二个数:\ FOR I=1 TO a*b IF MOD(I,a)=0 AND MOD(I,b)=0 ?I EXIT ENDIF ENDFOR RETURN 该程序的作用(功能): 【程序 7】 sta=\ stb=\stz=\ FOR I=1 TO LEN(stb) IF SUBSTR(stb,I,1)<>sta stz=stz+ SUBSTR(stb,I,1) ENDIF ENDFOR ?stz 该程序的作用(功能): 【程序 8】 **主程序 PROG.PRG** CLEAR SET TALK OFF X=\同学们\Y=\你们好!\? \主程序中 X=\ ? \主程序中 Y=\DO SUBPRO ? \返回主程序后 X=\ ? \返回主程序后 Y=\ ? \返回主程序后 Z=\Z=300 ? \子程序中 X=\ ? \子程序中 Y=\ ? \子程序中 Z=\RETURN **过程 SUBPRO** PROCEDURE subpro PRIVATE X PUBLIC Z X=100 Y=2 Z=5 ENDPROC 运行结果: 【程序 9】 *MAIN.PRG SET TALK OFF A=3 B=5 DO PP WITH 2*A,B SET TALK ON RETURN PROCEDURE pp PARAMETERS X,Y CLEAR S=X*Y ? \ENDPROC 运行结果: 【程序 10】 *MAIN PROGRAM SET TALK OFF STORE 3 TO L,H AREA=0 DO SUB WITH L,H,AREA ? L,H,AREA DO SUB WITH L,H,AREA 第二部分 《Visual FoxPro 程序设计(第二版)》复习提要与学习指导、习题及参考解答 125 126 Visual FoxPro 程序设计实训与考试指导(第二版) ? L,H,AREA RETURN PROCEDURE SUB PARAMETERS A,B,C C=A*B A=A*2 B=B*2 ENDPROC 运行结果: 三、在横线处填上适当的内容,使程序完整 1.下面程序是求 1~500 内被 3 整除的数的个数以及最后一个不能被 3 整除的数。 SET TALK OFF N=0 I=1 DO WHILE I<500 IF N=N+1 ELSE ENDIF I=I+1 ENDDO ? N,P SET TALK ON 2.以下程序的功能是判断自然数 n 是否为素数的程序。 set talk off cleaR input \for I=2 to n-1 if i%n=0 endif next if ?n, \是素数\ else ?n, \不是素数\ endif set talk on return 3.在表 SSS.DBF 中查询某专业的学生, SSS.DBF 中有“专业”字段名。 SET TALK OFF USE SSS ACCEPT "请输入专业名称:" GET ZY LOCATE FOR 专业=ZY IF ? "没有符合条件的记录,按任意键结束!" WAIT CLEAR RETURN ENDIF * 逐条显示该专业所有学生的记录 DO WHILE .NOT.EOF() DISPLAY ENDDO WAIT RETURN 4.在表 ABC.DBF 中查询“姓名”为李燕的记录。 SET TALK OFF USE ABC SEEK "李燕" IF FOUND() DISPLAY ELSE ?"库中没有李燕的记录!" ENDIF USE RETURN 5.本程序是根据输入的表,在表中查找指定“姓名”的记录,如果找到则删除此记录。 SET TALK OFF ACCEPT "输入数据库名:" TO KNAME USE ACCEPT "姓名:" TO NAME LOCATE IF .NOT. ELSE ? "查无此人" ENDIF USE SET TALK ON RETURN 6.设学生的数学、物理、英语这三门课程的期末考试成绩存放在表 CJ.DBF 中。如果 某一学生三门课程的成绩均达到 85 分以上(包括 85 分在内),应在该学生记录的“等级” 这一字段中填入“优秀”。 SET TALK OFF 第二部分 《Visual FoxPro 程序设计(第二版)》复习提要与学习指导、习题及参考解答 127 128 Visual FoxPro 程序设计实训与考试指导(第二版) USE CJ DO WHIL.NOT.EOF() IF 数学>=85 SKIP ENDIF ENDDO USE RETURN 7.在表 STUD.DBF 中查找总分最高者并输出其姓名、专业和总分。 USE TALK OFF USE STUD XM=姓名 ZY=专业 ZF=总分 DO WHILE.NOT.EOF() IF ZF<总分 ENDIF ENDDO CLEAR ?XM, ZY, ZF USE RETURN 8.设成绩表 CJK.DBF 中“数学”(数值型字段)这门课程的学分为 4,的方法如下: 数学≥90,学 分值为 4; 80≤数学<90,学分值为 3; 70≤数学<80,学分值为 1; 60≤数学<70,学分值为 1; 数学<60,学分值为 0。 计算任一学数学这门课程的学分值的程序如下: SET TALK OFF USE CJK ACCEPT"输入学号:"TO XH XF=0 && 存放学分值 LOCATE FOR 学号=XH DO CASE CASE XF=4 CASE XF=3 其学分值计算 CASE XF=2 CASE XF=1 OTHERWISE XF=0 ENDCASE ?"学号:",XF USE RETURN 9.下列程序是用来求长方形面积,请将它写完整。 X=3 Y=5 S=AREA(X,Y) ? \RETURN FUNCTION AREA S1=X*Y RETURN ENDFUNC 10.学生成绩表 score.dbf(学号(C/3),姓名(C/6),成绩(N/5/1),名次(n/2/0))的 记录如下: 学号 001 002 003 004 姓名 A B C D 成绩 56 78 90 60 名次 程序的功能是替换填写名次字段,要求成绩相同的同学的名次相同(已知:已建立了按 成绩降序的单索引文件 sc.idx)。 Set talk off Use score index sc Sc=成绩 Mc=1 Do while .not.eof() Replace 名次 with mc while 成绩=sc if Sc<>成绩 mc=mc+1 endif Enddo Use Set talk on return 第二部分 《Visual FoxPro 程序设计(第二版)》复习提要与学习指导、习题及参考解答 129 130 Visual FoxPro 程序设计实训与考试指导(第二版) 四、编程题 1.从键盘输入两个数 a、b,如果两数相等,则显示 a=b(如 5=5),如果两数不等,如 3 和 5,则显示 3<5 或 5>3。 1 1 1 1 1 FOR 循环、DO WHILE 循环编程。 2.求1 ? + ? … + ? 之值。分别用 2 3 4 99 100 3.编写一个过程,计算下面表达式的值: s = ∑ 1 i(i + 1) i =1 n 在主程序中分别输出 n=10、100、1000 时 s 的值。 4.用 FUNCTION 语句定义以下函数: 10+x (0≤x<30) y= 20-(x-30) (30≤x<40) 10-(x-50) (40≤x<60) 编程序,从键盘输入 x 的值,程序输出 y 的值。 5.计算下列表达式之值:S=11+22+33+44+55+? 要求设计一个程序,根据输入的数字,显示计算结果。 6.打印“水仙花数”。“水仙花数”指一个三位数,其各位数字的立方和等于该数本 身。如 153=13+53+33。 7.编程输出如下图案. 8.打印如下杨辉三角形(打印 8 行)。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 ?? 9.一个四行五列的矩阵,求出其中最大元素的值,以及所在的行号与列号。 10 .设学生总成绩表 ZCJ.DBF ,共有若干条记录,其结构为:学号(C/10 )、姓名 (C/8)、性别(C/2)、数学(N/3)、英语(N/3)、总分(N/5/1)。 试设计一个程序完成以下功能: (1)根据数学、英语成绩,计算每个同学的总分。 (2)分别用 DO 循环、FOR 循环和 SCAN 循环求出平均不及格的人数。 (3)建立索引,将表中的所有记录按总分从高到低的顺序显示出来。 习题 5 参考解答 一、选择题 1~5:ADABC 6~10:DABAB 11~15:CCCAC 16~20:BDAAD 21~25:ADAAB 二、阅读下列程序,写出运行结果 1.15 2.102 3.5、15 4.S,I= 10 5 5.15 4 3 6.求输入的 2 个数的最小公倍数 7.删除 stb 中与 sta 中相同的字母 8.主程序中 X=同学们 主程序中 Y=你们好! 返回主程序后的 X=同学们 返回主程序后的 Y= 2 返回主程序后的 Z= 5 子程序中的 X=同学们 子程序中的 Y= 2 子程序中的 Z= 300 9.X=30 10. 6 12 6 12 9 36 三、在横线处填上适当的内容,使程序完整 1.MOD(I,3)=0、P=I 2.EXIT、I=N 3.NOT FOUND() 或 EOF()、CONTINUE 4.INDEX ON 姓名 TAG XM 5.&KNAME、FOR 姓名=NAME、EOF()、DELETE 6.AND 物理>=85 AND 英语>=85、REPLACE 等级 WITH \优秀\ 7.SKIP、XM=姓名、ZY=专业、ZF=总分 8.数学>=90、数学>=80、数学>=70、数学>=60 9.PARAMETERS X,Y 、S1 10.skip、Sc=成绩 第二部分 《Visual FoxPro 程序设计(第二版)》复习提要与学习指导、习题及参考解答 131 132 Visual FoxPro 程序设计实训与考试指导(第二版) 四、编程题 1. CLEAR INPUT TO A INPUT TO B DO CASE CASE A=B ?ALLTRIM(STR(A))+\CASE A>B ?ALLTRIM(STR(A))+\CASE A ?ALLTRIM(STR(A))+\ENDCASE RETURN 2. *使用 FOR 循环 JG=0 FOR I=1 TO 100 IF MOD(I,2)<>0 &&奇数 JG=JG+1/I ELSE JG=JG-1/I ENDIF ENDFOR ?JG CANCEL *使用 DO WHILE 循环 JG=0 I=1 DO WHILE I<=100 IF MOD(I,2)<>0 &&奇数 JG=JG+1/I ELSE JG=JG-1/I ENDIF I=I+1 ENDDO ?JG CANCEL 3. S=0 INPUT \请输入一个数:\ DO SUB WITH N ?S