全国计算机等级考试二级

时间:2019-05-15 14:28:18下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《全国计算机等级考试二级》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《全国计算机等级考试二级》。

第一篇:全国计算机等级考试二级

全国计算机等级考试二级证书

简介 ***2432010年9月二级access

证书样本

全国计算机等级考试和高考、全国英语四六级考试一样,是国家教育部考试中心推出的三大权威考试,是在校大学生必须参加的考试和衡量计算机水平最权威、含金量和承认度最高的认证,并唯一得到国家和各用人单位的统一认可。

创想独有优势

通过率高:在全国平均通过率不到10%的情况下,创想分中心10级助产班参考7人,双科通过6人;10级护理5班参考21人,双科通过17人;创想分中心历届一次性通过率全省第一。

创想学员毕业受欢迎:

06级陈燕燕同学毕业后考取济宁汶上县医院事业编;

08级马玉宝同学,毕业后被济南市第三人民医院录用;2010年9月份前二级access

09级刘晓燕同学优先被济南市中心人民医院选为实习生。证书全通通用,上网可查。查询网址

第二篇:全国计算机等级考试二级vfp考点

010二级公共基础知识复习纲要

第 1 章

数据结构与算法

考点1:算法具有4个基本特征:可行性、确定性、有穷性、拥有足够的情报。确定性:是指算法中每一个步骤都必须是有明确定义的,不允许模棱两可的定义 有穷性:是指算法必须能在有限的时间内做完

一个算法由两种基本要素组成:一是对数据对象的运算和操作,二是算法的控制结构 考点2:算法复杂度包括时间复杂度和空间复杂度 时间复杂度

执行算法所需要的计算工作量 空间复杂度

执行这个算法所需要的内存空间 考点3:数据结构

一:讨论的问题:1.数据元素之间的逻辑关系,即数据的逻辑结构 2.数据元素在计算机中的存储关系,即数据的存储结构 3.对各种数据结构进行的运算

考点4:数据结构分为两大类型:线性结构与非线性结构。(1)如果一个非空的数据结构满足下列两个条件: ① 有且只有一个根结点;

② 每一个结点最多有一个前件,也最多有一个后件。则称该数据结构为线性结构。

如果一个数据结构不是线性结构,则称之为非线性结构。考点5:线性表

特点:(1)线性表中所有元素所占的存储空间是连续的

(2)线性表中各数据元素在存储空间中是按逻辑顺序依次存放的 考点5: 栈的基本概念

栈(stack)是一种特殊的线性表,是限定只在一端进行插入与删除的线性表。栈是按照“先进后出”或“后进先出”的原则组织数据的。考点6:队列的基本概念

队列是只允许在一端进行删除,在另一端进行插入的顺序表,通常将允许删除的这一端称为队头,允许插入的这一端称为队尾。当表中没有元素时称为空队列。即先进先出表。循环队列就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用

考点7: 链表

在链式存储方式中,要求每个结点由两部分组成:一部分用于存放数据元素值,称为数据域;另一部分用于存放指针,称为指针域。其中指针用于指向该结点的前一个或后一个结点(即前件或后件)。考点8:二叉树性质

(1)

在树结构中,每一个结点只有一个前件,称为父结点,没有父结点的只有一个,成为根结点

(2)

没有后件的结点成为叶子结点

(3)

一个结点所拥有的后件个数称为该结点的度,在树中,所有结点中最大的度称为树的度

(4)

树的最大层次称为树的深度

(5)

在二叉树的第k层上,最多有2^(k-1)个结点(6)

深度为m的二叉树最多有2^m-1个结点(7)

任意一棵二叉树,度为0的结点(即叶子结点)总是比度为2的结点多一个(8)

满二叉树:除最后一层外,每一层上的所有结点都有两个子节点

(9)

完全二叉树:除最后一层外,每一层上的结点数都达到最大值,在最后一层上只缺少右边的若干结点

考点9: 二叉树的遍历

根据访问根结点的次序,二叉树的遍历分为三类:前序遍历、中序遍历和后序遍历。(1)前序遍历

先访问根结点,然后遍历左子树,最后遍历右子树;并且在遍历左、右子树 时,仍需先访问根结点,然后遍历左子树,最后遍历右子树。(2)中序遍历

先遍历左子树、然后访问根结点,最后遍历右子树;并且,在遍历左、右子 树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树。例如,对图 1-1 中的二叉树进行中序遍历的结果(或称为该二叉树的中序序列)(3)后序遍历

先遍历左子树、然后遍历右子树,最后访问根结点;并且,在遍历左、右子 树时,仍然先遍历左子树,然后遍历右子树,最后访问根结点。考点10:各种排序的复杂度(1)顺序查找需要比较n 次

(2)冒泡排序在最坏的情况下需要比较次数为n(n-1)/2。(3)简单插入排序法,最坏情况需要n(n-1)/2 次比较;(4)希尔排序法,最坏情况需要O(n1.5)次比较。

(5)简单选择排序法,最坏情况需要n(n-1)/2 次比较;(6)堆排序法,最坏情况需要O(nlog2n)次比较。

第二章:程序设计基础

考点1:结构化程序设计的原则

(1)自顶向上:先考虑整体,再考虑细节;先考虑全局目标,再考虑局部目标;(2)逐步求精:对复杂问题应设计一些子目标作为过渡,逐步细化;

(3)模块化:把程序要解决的总目标分解为分目标,再进一步分解为具体的小目标,把每个小目标称为一个模块。

(4)限制使用goto 语句:在程序开发过程中要限制使用goto 语句。考点2:结构化程序的基本结构

结构化程序的基本结构有三种类型:顺序结构、选择结构和循环结构。

考点3: 面向对象方法涵盖对象及对象属性与方法、类、继承、多态性几个基本要素。对象是面向对象方法中最基本的概念,主要特点:(1)标识惟一型

(2)分类性(3)多态性

(4)封装性

(5)模块独立性好 考点4:消息:对象间的相互合作需要一个机制来协助进行,这个机制就是消息 考点5:继承是面向对象的方法的一个主要特征,分为单继承和多重继承

第三章:软件工程基础

考点1: 计算机软件是包括程序、数据以及相关文档的完整集合,软件工程包括3 个要素:方法、工具和过程

考点2: 软件产品从提出、实现、使用维护到停止使用退役的过程称为软件生命周期。软件生命周期还可以分为软件定义、软件开发、软件运行维护阶段 软件定义阶段包括:可行性研究、需求分析

软件开发阶段包括:概要设计、详细设计、实现、测试 软件维护阶段包括:使用、维护、退役

考点3:软件工程的理论和技术性研究主要包括:软件开发技术和软件工程管理 考点4:数据流图图符的含义

圆形表示加工,箭头表示数据流,等于号表示存储文件,矩形表示源、潭

考点5:数据字典:是结构化分析方法的核心,数据字典是对所有与系统相关的数据元素的一个有组织的列表

考点6:软件需求规格说明书是需求分析阶段的最后成果 考点7:模块独立性

衡量模块独立性的定性标准:内聚性与耦合性

内聚性:是一个模块内部各个元素间彼此结合的紧密程度的度量 耦合性:模块间互相连接的紧密程度的度量 一个优秀的设计应尽量做到高内聚、低耦合

考点8:典型的数据流类型有两种:变换型和事务型 考点9:程序流程图图符的含义

考点10:软件测试是为了发现错误而执行程序的过程 静态测试是由人工进行的测试 动态测试是基于计算机的测试

考点11:白盒测试主要方法:逻辑覆盖、基本路径测试

黑盒测试主要方法:等价类划分法、边界值分析法、错误推测法、因果图等

软件测试过程一般按4个步骤来进行:单元测试、集成测试、验收测试、系统测试

考点12:程序调试的任务是诊断和改正程序中的错误,与测试不同,软件测试是尽可能多的发现错误

第四章:数据库设计基础

考点1:数据库管理系统是数据库的机构,它是一种系统软件,负责数据库中的数据组织,数据操纵,数据维护,控制及保护和数据服务等 考点2:数据库系统提供的数据语言:(1)

数据定义语言:该语言负责数据的模式定义与数据的物理存取构建(2)

数据操纵语言负责数据的操纵,包括查询及增、删、改等

(3)

数据控制语言负责数据完整性、安全性的定义与检查以及并发控制、故障恢复等 考点3:数据库系统由如下几部分组成:数据库、数据库管理系统、数据库管理员、硬件平台与软件平台

考点4:数据独立性是数据与程序间的互不依赖性,即数据库中数据独立于应用程序而不依赖于应用程序,数据独立性分为物理独立性和逻辑独立性 考点5:数据库的三级模式

(1)

概念模式:是数据库系统中全局数据逻辑结构的描述,是全体用户公共数据视图(2)

外模式:是用户的数据视图,也就是用户所见到的数据模式(3)

内模式:它给出了数据库物理存储结构与物理存取方法 考点6:数据模型所描述的内容有三个方面:(1)

数据结构:主要描述数据的类型、内容、性质以及数据间的联系(2)

数据操作:主要描述在相应数据结构上的操作类型与操作方式(3)

数据约束:主要描述数据结构内数据间的语法、语义联系 考点7:E-R模型

(1)E-R模型由三个基本概念组成:实体、联系和属性

(2)在E-R图示法中:矩形表示实体集,椭圆形表示属性,菱形表示联系

考点8:关系模型的约束包括实体完整性约束、参照完整性约束、用户自定义完整性约束 考点9:关系代数

并运算:关系R与S经并运算后所得到的关系是由那些在R内或在S内的有序组 交运算:关系R与S经交运算后所得到的关系是由那些即在R内又在S内的有序组 差运算:关系R与S经差运算后所得到的关系是由那些在R内但不在S内的有序组 自然连接: 考点10:E-R图与关系的转换

E-R图中实体与联系都可以转换成关系,属性也可以转换成关系的属性 1.1 数据库基础知识

考点1 计算机数据管理的发展 1数据与数据处理

数据是指存储在某一种媒体上能够识别的物理符号。数据处理的中心问题是数据管理。2计算机数据管理(l)人工管理。(2)文件系统。(3)数据库系统。

(4)分布式数据库系统。(5)面向对象数据库系统。3数据库管理系统

为数据库的建立、使用和维护而配置的软件称为数据库管理系统DBMS(DataBase Management System)。

图1-1 数据库系统中数据与程序的关系 考点2 数据库系统 1有关数据库的概念

(1)数据库(DataBase):存储在计算机存储设备上、结构化的相关数据的集合。

(2)数据库应用系统(DBAS):是由系统开发人员利用数据库系统资源开发出来的,面向某一类实际应用的应用软件系统。

(3)数据库管理系统(DBMS):对数据实行专门管理,提供安全性和完整性等统一机制,可以对数据库的建立、使用和维护进行管理。

(4)数据库系统(DBS):是指引进数据库技术后的计算机系统,实现有组织地、动态地存储大量相关数据,提供数据处理和信息资源共享的便利手段。数据库系统由硬件系统、数据库、数据库管理系统及相关软件、数据库管理员和用户等部分组成。2数据库系统的特点

(l)实现数据共享,减少数据冗余。(2)采用特定的数据模型。(3)具有较高的数据独立性。(4)具有统一的数据控制功能。考点3 数据模型 1实体的描述(1)实体。

(2)实体的属性。(3)实体集和实体型。

2实体间联系及联系的种类(1)一对一联系。(2)一对多联系。(3)多对多联系。3数据模型简介

为了反映事物本身及事物之间的各种联系,数据库中的数据必须有一定的结构,这种结构用数据模型来表示,通常有以下3种。(1)层次数据模型。(2)网状数据模型。(3)关系数据模型。小提示:

数据库DB、数据库系统DBS和数据库管理系统DBMS之间的关系是DBS包括DB和DBMS。1.2 关系模型

关系模型的用户界面非常简单,一个关系的逻辑结构就是一张二维表。这种用二维表的形式表示实体和实体间联系的数据模型称为关系数据模型。1关系术语

(l)关系:一个关系就是一张二维表,每个关系有一个关系名。在Visual FoxPro中一个关系存储为一个文件,扩展名为DBF,称为“表”。

对关系的描述称为关系模式,一个关系模式对应一个关系的结构,格式为: 关系名(属性名1,属性名2,„,属性名n)(2)元组:在一个二维表中,水平方向的行称为元组,每一行为一个元组。(3)属性:将二维表中垂直方向的列称为属性,每一列都有一个属性名。(4)域:属性的取值范围,即不同元组对同一个属性的取值所限定的范围。

(5)关键字:属性或属性的组合,其值能够唯一地标识一个元组。在Visual FoxPro中,主关键字和候选关键字就起唯一标志一个元组的作用。

(6)外部关键字:如果表中一个字段不是本表的主关键字或候选关键字,而是另一个表的主关键字或候选关键字,那么这个字段(属性)就称为外部关键字。2关系的特点

(1)关系必须规范化。

(2)在同一个关系中不能出现同名属性,Visual FoxPro中表示为字段名的不同。(3)关系中不允许有完全相同的元组,即冗余。(4)在一个关系中元组的次序无关紧要。(5)在一个关系中列的次序无关紧要。考点5 关系运算

对关系数据库进行查询时,需要找到用户感兴趣的数据,这就需要对关系进行一定的关系运算,关系的基本运算有两类:传统的集合运算和专门的关系运算。1传统的集合运算

(1)并:两个相同结构关系的并是由属于这两个关系的全部元组组成的集合。

(2)差:两个相同结构关系的差是由属于前一个关系的元组而不属于后一个关系的元组组成的集合。例如,关系R和S的差结果是由属于R但不属于S的元组组成的集合。(3)交:两个相同结构关系的交是由属于这两个关系所共有的元组组成的集合。2专门的关系运算

(1)选择:从关系中找出满足给定条件的元组的操作。(2)投影:从关系模式中指定若干个属性组成新的关系:

(3)连接:关系的横向结合,将两个关系模式拼接成一个更宽的关系模式。

(4)自然连接:在连接运算中,按照字段值对应相等为条件进行的连接操作称为等值连接。自然连接是去掉重复属性的等值连接。小提示:

选择和投影运算的操作对象只是一个表,相当于对一个二维表进行切割。连接运算则需要把两个表作为操作对象。如果两个表以上进行连接,应当两两进行连接。1.3 数据库设计基础 考点6 数据库设计步骤 1设计原则

(l)关系数据库的设计应遵从概念单一化“一事一地”的原则。(2)避免在表之间出现重复字段。

(3)表中的字段必须是原始数据和基本数据元素。(4)用外部关键字保证有关联的表之间的联系。2设计步骤

利用Visual FoxPro来开发数据库应用系统,可以按照以下步骤来设计。(1)需求分析。(2)确定需求表C(3)确定需求字段。(4)确定联系。(5)设计精确

1.4 Visual FoxPro系统概述 考点7 Visual FoxPro的特点(l)增强项目与数据库管理。

(2)提高应用程序开发的生产率。(3)互操作性与支持Internet。(4)充分利用已有数据。2.1程序与程序文件 程序与程序文件

考点1 程序的概念、建立与执行 1程序的概念

程序是能够完成一定任务的命令集合。这组命令被存放在称为程序文件或命令文件的文本文件中。当运行程序时,系统会按照一定的次序自动执行包含在程序文件中的命令。2程序文件的建立与修改

程序文件的建立与修改一般是通过调用系统内置的文本编辑器来进行的。其建立步骤如下。(l)打开文本编辑窗口。

(2)在文本编辑窗口中输入程序内容,此处所输入的程序命令不会马上被执行。

(3)编辑完成后,从“文件”菜单中选择“保存”命令或按快捷键Ctrl+W保存程序文件。3打开或修改程序文件的方法

(1)从“文件”菜单中选择“打开”命令,弹出“打开”对话框。(2)在“文件类型”列表框中选择“程序”。(3)在文件列表框中选定要修改的文件,并单击“确定”按钮。

(4)编辑修改后,从“文件”菜单中选择“保存”命令或按快捷键Ctrl+W保存程序文件,若要放弃修改,可直接按Esc键,或从“文件”菜单中选择“还原”命令。4程序文件的执行

程序文件建立后,可使用多种方式、多次执行它,常用的以下有两种方式。(l)菜单方式。(2)命令方式。

考点2 简单的输入输出命令

程序一般都包含数据输入、数据处理和数据输出3个部分。1 INPUT命令

格式:INPUT[<字符表达式>]TO<内存变量> 功能:该命令等待用户从键盘输入数据,当用户回车后,系统将表达式的值存入指定的内存变量。

注释:输入的数据可以是常量、变量,也可以是更为一般的表达式。但不能不输入任何内容直接按回车键输入字符串时必须加定界符,输入逻辑型常量时要用圆点定界(如.T.,.F.),则输入日期时间型常量时要用大括号(如{^2001-03-01})。2 ACCEPT命令

格式:ACCEPT[<字符表达式>]TO<内存变量> 功能:该命令等待用户从键盘输入字符串,当用户回车后,系统将表达式的值存入指定的内存变量。

注释:该命令只能接收字符串。用户在输入字符串时不需要加定界符;否则,系统会把定界符作为字符串本身的一部分。如果不输入任何内容而直接按回车键,系统会把空串赋给指定的内存变量。3 WAIT命令

格式:WAIT[<字符表达式>][TO<内存变量>][WINDOW[AT<行>,<列>]] [NOWAIT][CLEARINOCLEAR][TIMEOUT<数值表达式>] 功能:该命令显示字符表达式的值作为提示信息,暂停程序的执行,直到用户按任意键或单击鼠标时继续程序运行。

注释:<内存变量>用来保存用户输入的字符,其类型为字符型。若用户按的是Enter键或单击了鼠标,那么<内存变量>中保存的将是空串若不选TO <内存变量>短语,则输入的单字符不保留。小提示:

如果用DO命令执行查询文件、菜单文件,在文件名中必须要包括扩展名(QPR、MPR)。7.2 程序的基本结构

程序结构是指程序中命令或语句执行的流程结构,包括3种基本结构:顺序结构、选择结构和循环结构。考点3 顺序结构

顺序结构是最简单的程序结构,它是按命令在程序中出现的先后次序依次执行。考点4 选择结构

支持选择结构的语句包括条件语句和分支语句。1条件语句 格式: IF<条件> <语句序列1> [ELSE> <语句序列2>] ENDIF 功能:该语句根据<条件>是否成立从两组代码中选择一组执行。语句的执行流程图如图7-1和图7-2所示。

图7-1有ELSE的选择语句

图7-2无ELSE的选择语句 2分支语句

格式:DO CASE CASE<条件1> <语句序列1> CASE<条件2> <语句序列2> ……

CASE<条件n> <语句序列n> [OTHERWISE <语句序列>] ENDCASE

功能:语句执行时,依次判断CASE后面的条件是否成立。分支语句实现的是一种扩展的选择结构,可以根据条件从多组代码中选择一组执行。分支语句的流程如图7-3所示。

图7-3 多分支语句 考点5 循环结构

循环结构也称为重复结构,是指程序在执行的过程中,其中的某段代码被重复执行若一干珠。被重复执行的代码段,通常称为循环体。Visual FoxPro支持循环结构的语句包括:DO WHILE-ENDDO、FOR-ENDFOR和SCAN-ENDSCAN。1 DO WHILEENDFOR语句 格式:

FOR<循环变量>=<初值>TO<终值>[STEP<步长>] <循环体> ENDFOR 功能:首先将初值赋给循环变量,然后判断循环条件是否成立(若步长为正值,则循环条件为<循环变量><=<终值>;若步长为负值,则循环条件为<循环变量>>=<终值>)。如果成立,则执行循环体,然后循环变量增加一个步长值,并再次判断循环条件,一直到条件为假时,退出循环体。该语句通常用于实现循环次数已知情况下的循环结构〕 3 SCAN-ENDSCAN语句 格式:

SCAN[<范围>][FOR<条件1>][WHERE<条件2>] <循环体> ENDSCAN

功能:该循环语句一般用于处理表中记录,语句可指明需要处理的记录范围及应满足的条件。执行该语句时,记录指针自动、依次地在当前表的指定范围内满足条件的记录上移动,对每一条记录执行循环体内的命令。7.3 多模块程序

模块是一个相对独立的程序段,它可以被其他模块调用,也可以调用其他模块。通常,把被其他模块调用的模块称为子程序,把调用其他模块而没有被其他模块调用的模块称为主程序。应用程序一般都是多模块程序,包含多个程序模块。考点6 模块的定义和调用 1模块的定义

在Visual FoxPro中,模块可以是命令文件,也可以是过程。过程定义的语句格式为: PROCEDURE|FUNCTION<过程名> <命令序列> [RETURN[<表达式>]] [ENDPROCIENDFUNC] 功能说明如下。

(1)PROCEDURE|FUNCTION命令表示一个过程的开始,并命名过程。过程名必须以字母或下划线开头,可以包含数字、字母和下划线。

(2)当程序执行到RETURN命令时,控制将转回到调用处(或命令窗口),并返回表达式的值。若默认RETURN命令,系统将在过程结束处自动调用一条隐含的RETURN命令。(3)ENDPROC|ENDFUNC命令表示一个过程的结束。如果默认此语句,那么过程结束于下一条PROCEDURE|FUNCTION命令或文件尾。2模块的调用

模块调用的格式有两种。

(1)使用DO命令,格式如下。DO<文件名>|<过程名>(2)在名字后加一对小括号,格式如下。<文件名>|<过程名>()3打开过程文件 命令格式如下。

SET PROCEDURE TO[<过程文件1>[,<过程文件2>,„][ADDITIVE] 4关闭过程文件 命令格式如下。

RELEASE PROCEDURE<过程文件1>[,<过程文件2>,„] 考点7 参数传递

模块程序可以接收调用程序传递过来的参数。

(1)PARAMETERS<形参变量1>[,<形参变量2>,„]。(2)LPARAMETERS<形参变量1>[,<形参变量2>,„]。

说明PARAMETERS声明的形参被看做是模块程序中建立的私有变量,LPARAMETERS声明的形参被看做是模块程序中建立的局部变量。除此之外,两条命令无其他区别。不管是PARAMETERS或LPARAMETERS,都应该是模块程序的第一条可执行命令。(1)调用参数调用模块程序参数的格式如下。

DO<文件名>|<过程名>WITH<实参1>[,<实参2>,„] <文件名>|<过程名>(<实参1>[,<实参2>,„])说明:实参可以是常量、变量或一般表达式,调用模块程序时,形参的数目不能少于实参的数目,当形参数目多于实参数目时,多余的形参取初值逻辑假.F.。

(2)参数的传递。模块中参数的传递分为两种:按值传递(实参一般为常量和表达式)和引用传递(实参一般为变量)。参数的传递方式可以重新设置,格式如下。SET UDFPARMS TO VALUE|REFERENCE 考点8 变量的作用域

变量的一个重要属性是作用域。变量的作用域指的是变量在什么范围内是有效或能够被访问的。在Visual FoxPro中,可分为公共变量、私有变量和局部变量3类。1.公共变量

在任何模块中都可使用的变量称为公共变量,公共变量必须先定义后使用,格式如下。PUBLIC<内存变量表> 说明:该命令是建立公共的内存变量,并赋以初值逻辑假.F.。建立好的公共变量一直有效,即使程序结束返回命令窗口也不会消失,只有执行CLEAR MEMORY,RELEASE或QUIT等命令后,才能被释放。2私有变量

在程序中直接使用(没有预先声明),而由系统自动隐含建立的变量都是私有变量。私有变量的作用域是建立它的模块及其下属的各层模块。3局部变量

局部变量只能在建立它的模块中使用,不能在上层或下层模块中使用。程序结束时,自动释放局部变量。格式如下 LOCAL<内存变量表> 说明:该变量同样给建立的内存变量赋以初值逻辑假.F.,也必须先定义后使用。当子程序中定义的变量名与主程序中同名时,为避免子程序中的变量值改变主程序中的变量值,可在子程序中使用PRIVATE命令隐藏主程序中可能存在的变量,使这些变量在子程序中暂时无效。格式如下。

(1)PRIVATE<内存变量表>。

(2)PRIVATE ALL[LIKE<通配符>|EXCEPT<通配符>]。说明:该命令并不建立内存变量,它只是隐藏指定的在上层模块中可能已经存在的内存变量,但是当模块程序返回到上层模块时,被隐藏的变量就自动恢复有效性,保持原值。7.4 程序调试

考点9 调试器环境

程序调试是指在发现程序有错误的情况下,确定出错位置并纠正错误。计算机一般能够发现程序的出错位置,但对于计算机不能发现的错误,只能由用户自己来查错。Visual FoxPro提供的功能强大的调试工具—调试器,可帮助我们进行这项工作。调用调试器的方法一般有两种。

(l)选择“工具”菜单中的“调试器”命令。(2)在命令窗口中输入DEBUG命令。考点10 设置断点

可以设置以下4种类型的断点。

(1)在定位处中断:可指定一行代码,当程序调试执行到该行时,中断程序运行。

(2)如果表达式值为真,则在定位处中断:指定一行代码及一个表达式,当程序调试执行到该行代码时,如果表达式值为真,就中断程序运行。

(3)当表达式值为真时中断:可以指定一个表达式,在程序调试执行过程中,当该表达式值为逻辑真.T.时,中断程序运行。

(4)当表达式值改变时中断:可以指定一个表达式,在程序调试执行过程中,当该表达式值改变时,中断程序运行。考点11 “调试”菜单

“调试”菜单包含执行程序、选择执行方式、终止程序执行、修改程序,以及调整程序执行速度等命令。各命令具体功能如下。

(1)运行:执行在跟踪窗口中打开的程序:

(2)继续执行:当程序被中断时,该命令可使程序在中断处继续往下执行。(3)取消:终止程序的调试执行,并关闭程序。

(4)定位修改:终止程序的调试执行,然后在文本编辑窗口中打开调试程序。

(5)跳出:以连续方式而非单步方式继续执行被调用模块程序中的代码,然后在调用程序的调用语句的下一行处中断。

(6)单步:单步执行下一行代码。如果下一行代码调用了过程或者方法程序,那么该过程或者方法程序在后台执行。

(7)单步跟踪:单步执行下一行代码。

(8)运行到光标处:从当前位置执行代码直至光标处中断。

(9)调速:打开“调整运行速度”对话框,设置两代码行执行之间的延迟秒数。

(10)设置下一条语句:程序中断时选择该命令,可使光标所在行成为恢复执行后要执行的语句。

3.1 Visual FoxPro数据库及其建立 考点1 建立和使用数据库 1数据库的建立

(1)在项目管理器中建立数据库。(2)通过“新建”对话框建立数据库。(3)使用命令建立数据库,格式为:

CREATE DATABASE[DatabaseName |?] 2数据库的打开

(1)在项目管理器中打开。(2)通过“打开”对话框打开数据库。(3)使用命令打开数据库,格式为:

OPEN DATABASE[FileName |?][EXCLUSIVE I SHARED] [NOUPDATE] [VALIDATE] 考点2 修改和删除数据库

Visual FoxPro在建立数据库时建立了扩展名分别为dbc、dct和dcx的3个文件,用户不能直接修改这些文件。

Visual FoxPro中修改数据库实际是打开数据库设计器,完成数据库中各种对象的建立、修改和删除等操作。

可以有3种方法打开数据库设计器。(1)从项目管理器中打开数据库设计器。(2)从“打开”对话框中打开数据库设计器。(3)使用命令打开数据库设计器,格式为: MODIFY DATABASE[DatabaseName|?] 在项目管理器中不管删除还是移去数据库文件,都不会删除其所包含的各个对象做口数据表)。如果要在删除数据库的同时删除其所包含的数据表,就必须使用命令,格式为: DELETE DATABASE DatabaseName|?[DELETETABLES][RECYCLE] 小提示:

在Visual FoxPro中,Open DataBase和Modify DataBase命令的区别在于:Open DataBase打开的只是数据库的工作环境,并不会进入数据库设计器;Modify DataBase是打开数据库设计器。4.2 建立数据库表

考点3 在数据库中建立表 在数据库中建立数据表,最直接的方法就是在数据库设计器中利用鼠标右键单击空白处,选择“新建表”命令,在弹出的表设计器中设置数据表结构。另外可以在命令窗口利用OPEN DATA命令先打开数据库,然后利用CREATE命令打开表设计器进行数据表设计,如图4-l所示。

图4-1 表设计器 1字段名

(l)自由表字段名最长为10个字符。(2)数据库表字段名最长为128个字符。(3)字段名必须以字母或汉字开头。

(4)字段名可以由字母、汉字、数字和下划线组成。(5)字段名中不能包含空格。2字段类型和宽度

(1)字符型:可以是字母、数字等各种字符型文本,如用户名称。(2)货币型:货币单位,如货物价格。(3)数值型:整数或小数,如订货数量。(3)浮点型:功能类似于“数值型”,其长度在表中最长可达20位。(4)日期型:由年、月、日构成的数据类型,如订货日期。

(5)日期时间型:由年、月、日、时、分、秒构成的数据类型,如员工上班的时间。(6)双精度型:双精度数慎类型,一般用于要求精度很高的数据。(7)整型:不带小数点的数值类型,如订单的行数。

(8)逻辑型:值为“真”(.T.)或假(.F.),如表示订单是否已执行完。

(9)备注型:不定长的字符型文本。在表中占4个字节,表备注型文件的扩展名为FPT。(10)通用型:用于标记电子表格、文档、图片等OLE对象,在表中占4个字节。(11)字符型(二进制)。(12)备注型(二进制)。3空值

一个字段是否允许为空值与实际应用有关,比如作为关键字的字段是不允许为空值的,而那些在插入记录时允许暂缺的字段值往往允许为空值。4字段有效性组框

在字段有效性组框中可以定义字段的有效性规则、违反规则时的提示信息和字段的默认值。5显示组框

在显示组框下可以定义字段显示的格式、输入的掩码和字段的标题。输入掩码是字段的一种属性,用限制或控制用户输入的格式。标题用于字段显示时的标题,如果不指定标题则显示字段名。当字段名是英文或缩写时,则通过指定标题可以使界面更友好。6字段注释

可以为每个字段添加注释,便于日后或其他人对数据库进行维护。考点4 修改表结构 在Visual FoxPro中可以对表结构任意修改,修改表结构和建立表结构时,表设计器界面完全一样。修改数据表结构时,首先应该用USE命令打开要修改的数据表,然后利用MODIFY STRUCTURE打开表设计器进行修改,具体操作有以下几种。(1)修改已有字段。(2)添加新字段。(3)删除不用的字段。4.3 表的基本操作

考点5 使用浏览器操作表

在交互式工作方式下,最简单、方便的方法就是使用BROWSE浏览器浏览表,打开浏览器的方法有多种。在项目管理器中将数据库展开至表,然后单击“浏览”按钮,或直接在窗口中输入BROWSE命令(首先应该打开表文件)。1浏览器操作

(1)下一记录(下箭头键)。(2)前一记录(上箭头键)。(3)下一页(PageDown键)。(4)上一页(PageUp键)。(5)下一字段(Tab键)。

(6)前一字段(Shift+Tab键)。2修改记录

只需将光标定位到要修改的记录和字段上,就可以进行修改了。3删除记录 Visual FoxPro中删除记录有逻辑删除和物理删除两种,逻辑删除只在记录旁做删除标记(如图4-2所示),必要时可以进行恢复物理删除是在逻辑删除的基础上真正地将记录从表中删除。要在浏览器中删除有删除标记的记录,可选择“表/彻底删除”菜单命令。

图4-2 增加和删除记录

考点6 增加、删除、修改和显示记录的命令 1增加记录

APPEND命令是在表的尾部增加记录,格式有如下两种。格式1:APPEND 格式2:APPEND BLANK 2插入记录

格式:INSERT [BEFORE][BLANK] 3删除记录

删除记录有物理删除和逻辑删除两种,Visual FoxPro用来删除记录的命令如下。(1)设置删除标记的命令

格式:DELETE [FOR lExpressionl] 说明:如果不使用FOR短语指定逻辑条件,则只删除当前记录,否则逻辑删除满足条件的所有记录。

(2)恢复记录的命令。

格式:RECALL [FOR lExpressionl] 说明:使用该命令恢复表中逻辑删除的记录,短语FOR的功能同上。(3)物理删除有删除标记的记录 格式:PACK 说明:此命令用来物理删除当前表中所有带删除标记的记录。(4)物理删除表中的全部记录 格式:ZAP 说明:不管表中记录是否带有删除标记,此命令可以一次性将当前表中的记录全部物理删除,但表结构仍保留使用此命令相当于DELETE ALL与 PACK的连用。4修改记录

在Visual FoxPro中可以交互修改记录,也可以用指定值直接修改记录。(1)用EDIT或CHANGE命令交互式修改。(2)用REPLACE命令直接修改。5显示记录

格式:LIST/DISPLAY [[FIELDS]FieldList][FOR LExpressionl][OFF] [TO PRINTER[PROMPT]|TO FILE FileName] 考点7 查询定位的命令(1)用GOTO命令直接定位(2)SKIP命令

(3)用LOCATE命令定位。

LOCATE命令是按条件定位记录位置,格式为: LOCATE FOR IExpressionl LOCATE命令常用结构如下。LOCATE FOR IExpression1 DO WHILE FOUND()****处理数据*** CONTINUE ENDDO 小提示:

连续使用DELETE ALL和PACK命令,其操作结果与ZAP命令一样,都可以将表中的所有记录一次性物理删除。4.4 索引与排序

考点8 索引的基本概念

索引是对表中的记录按照某种逻辑顺序重新排列。

(l)主索引:在指定的字段或表达式中不允许出现重复值的索引,且一个表只能创建一个主索引。

(2)候选索引:具有与主索引相同的性质和功能,但一个表中可以创建多个候选索引,其指定的字段或表达式中也不允许出现重复值。

(3)唯一索引:它的“唯一性”是指索引项的唯一,而不是字段值的唯一。但在使用该索引时,重复的索引段值只有唯一一个值出现在索引项中。

(4)普通索引:不仅允许字段中出现重复值,并且索引项中也允许出现重复值。考点9 索引的建立 1单项索引

在表设计器界面中有“字段”、“索引”和“表“3个选项卡,在“字段”选项卡中定义字段时就可以直接指定某些字段是否为索引项,用鼠标单击定义索引的下拉列表框可以看到3个选项:无、升序和降序(默认是无)。如果选定升序或降序,则在对应的字段上建立一个普通索引,索引名与字段名同名,索引表达式就是对应的字段。2复合字段索引

(1)在“索引”选项卡中的索引名栏目中输入索引名。(2)在索引类型的下拉框中选择索引类型。

(3)单击表达式栏右侧的按钮,打开表达式生成器。

(4)在“表达式”文本框中输入索引表达式(如图4-3所示),最后单击“确定”按钮。

图4-3 表达式生成器界面

3使用命令建立索引

格式:INDEX ON eExpression TO IDXFileName | TAG TagName[OF CDXFileName] [FOR lExpression][COMPACT] [ASCENDING | DESCENDING] [UNIQUE | CANDIDATE] [ADDITIVE] 从索引的组织方式来讲,索引共有3种类型。(1)单独的IDX索引,是一种非结构索引。

(2)采用非默认名的CDX索引,也是一种非结构复合索引。(3)与表同名的CDX索引,是结构复合索引。结构复合索引文件可随表的打开而打开,在同一个索引文件中能包含多个索引方案或索引关键字,在添加、更改或删除记录时自动维护索引。考点10 索引的使用

(l)打开索引文件,格式为: SET INDEX TO Indexfilelist(2)设置当前索引,格式为:

SET ORDER TO[nIndexNumber |[TAG]TagName][ASCENDING|DESCENDING](3)使用索引快速定位,格式为:

SEEK eExpression[ORDER nIndexNumber|[TAG]TagName][ASCENDING| DESCENDING](4)删除索引,格式为:

DELETE TAG TagNamel

&&TagName1为索引名 要删除全部索引,可使用命令:DELETE TAG ALL 考点11 排序

索引可以使用户按照某种顺序浏览或查找表中的记录,这种顺序是逻辑的,如要对表中的记录按物理顺序重新排列,可使用SORT命令,格式为: SORT TO TableName ON FieldNainel[/A}/D][/C][,FieldName2[/A|/D][/C]„][ASCEND ING | DESCENDING][FOR lExpressionl][FIELDS FieldNameList] 小提示:

在数据库表中只能有一个主索引,且只能在表设计器中建立。其他3种索引可以建立多个,既能在表设计器中建立,也能以命令方式建立,但在自由表中不能为其创建主索引,只能创建后3种索引,同样也可以建立多个。4.5 数据完整性

考点12 实体完整性与主关键字

(1)实体完整性是保证表中记录唯一的特性,即在同一个表中不允许有重复的记录出现。在Visual Pro中通过主索引和候选索引来保证数据的实体完整性。

(2)如果一个字段的值或几个字段的值能够唯一标志表中的一条记录,则称这个字段为候选关键字。在Visual FoxPro中将主关键字称做主索引,将候选关键字称为候选索引。考点13 参照完整性与表之间的关联 1建立表之间的联系

参照完整性与表之间的联系有关,其含义大致是:当插入、删除或修改一个表中的数据时,通过参照引用相互关联的另一个表中的数据,检查对表的数据操作是否正确。

在数据库设计器中设计表之间的联系时,要在父表中建立主索引,在子表中建立普通索引,然后通过父表主索引和子表的普通索引建立起两个表之间的联系。2设置参照完整性约束

建立参照完整性之前,首先必须清理数据库,即物理删除表中被逻辑删除的记录,然后选择两个关联表之间的连线并选择“数据库”、“编辑参照完整性”菜单命令,打开如图4-4所示的“参照完整性生成器”对话框。

图4-4 “参照完整性生成器”对话框 小提示:

欲建立两表之间的联系,首先用鼠标选中一个表的主索引,按住鼠标左键不放,并拖动鼠标到另一个表的索引上,这时鼠标箭头变成小矩形状,最后释放鼠标。4.6 自由表

考点14 数据库表与自由表

自由表是不属于任何数据库的表。在没有打开数据库时,所建立的表就是自由表。数据库表与自由表之间可以相互转化。1建立自由表的方法

(1)在项目的“数据”选项卡中选择“自由表”,单击“新建”按钮。

(2)在没有打开数据库的情况下,通过“新建”对话框,选择“表”并单击“新建文件”按钮。

(3)在没有打开数据库的情况下,在命令窗口输入CREATE命令,新建自由表。2数据库表相对于自由表的特点

(l)数据库表可以使用长表名,在表中可以使用长字段名。(2)可以为数据库表中的字段指定标题和添加注释。(3)可以为数据库表中的字段指定默认值和输入掩码。(4)数据库表的字段有默认的控件类。

(5)可以为数据库表规定字段级规则和记录级规则。

(6)数据库表支持主关键字、参照完整性和表之间的联系。(7)支持INSERT,UPDATE和DELETE事件的触发器。考点15 将自由表添加到数据库中

(1)在数据库设计器中可利用“数据库”→“添加表”菜单命令,在“打开”对话框中选择自由表文件,将其添加到数据库中。

(2)直接用命令方式将自由表添加到当前数据库中,格式为: ADD TABLE TableName|?[NAME LongTableName] 考点16 从数据库中移出表

(1)直接利用命令移出数据库表,格式为:

REMOVE TABLE TableName |?[DELETE][RECYCLE](2)从项目管理器中移出数据库。(3)从数据库设计器中移出数据库。4.7 多个表的同时使用

在Visual FoxPro中,一次可以打开多个数据库,每个数据库都可以打开多个数据表。考点17 多工作区的概念

指定工作区的命令格式为SELECT nWorkArea | cTableAlias,每个表打开后都有两个默认别名,一个是表的自身名,另一个是工作区所对应的别名。在前10个工作区中指定的默认别名是工作区字母A~J,其后面的工作区所对应的别名为W11~W32767。

另外还可以在USE命令中通过ALIAS短语指定表别名。

例如:USE学生表IN 1 ALIAS student,为学生表指定了别名student。考点18 使用不同工作区的表

除了使用SELECT命令切换不同的工作区之外,也可以在一个工作区使用其他工作区的数据表。即通过短语:IN nWorkArea|cTableAlias。在表别名后加上“.”或“->”操作符,可在一个工作区中直接调用其他工作区中数据表的记录。例如当前工作区号为2,要调用1区上学生表中的班级号的相关字段,可使用命令:

学生表.班级号 或学生表->班级号或A.班级号或A->班级号 考点19 表之间的关联

使用SET RELATION命令建立表间记录指针的临时联系(关联)。

格式:SET RELATION TO eExpressionl INTO nWorkAreal I cTableAliasl。

说明:eExpressionl是指建立临时联系的索引关键字,一般是父表的主索引,子表的普通索引。用工作区号 nWorkAreal或表的别名cTableAlias I说明临时联系是由当前工作区的表到哪个表。利用SET RELATION TO命令将取消当前表到所有表的临时联系。4.1 SQL概述 5.1 SQL概述 考点1 概述 1概念

SQL是结构化查询语言Structured Query Language的缩写。它包括数据查询、数据定义、数据操纵和数据控制4部分。Visual FoxPro在SQL方面支持数据定义、数据查询和数据操纵功能。另外,由于Visual FoxPro自身在安全控制方面的缺陷,所以它没有提供数据控制功能。2 SQL语言的特点

(1)一种一体化的语言。

(2)一种高度非过程化的语言。(3)语言非常简洁。

(4)可以直接以命令方式交互使用,也可以以程序方式使用。5.2 查询功能

SQL的核心是查询,基本形式由SELECT-FROM-WHERE查询块组成,多个查询块可嵌套执行,如表5-1所示。

表5-1 SQL命令动词

考点2 简单查询 1简单查询

简单查询是由SELECT和FROM短语构成的无条件查询,或由SELECT,FROM和WHERE短语构成的条件查询。2简单的连接查询

连接是关系的基本操作之一,连接查询是一种基于多个关系的查询。3嵌套查询

嵌套查询所要求的结果出自一个关系,但关系的条件却涉及多个关系。其内层基本上也是一个SELECT-FROM-WHERE查询语句。这种简单嵌套查询,可使用谓词IN或NOT IN来判断在外层的查询条件中是否包含内层查询的结果。考点3 特殊运算符号 1 BETWEEN„AND„

含义:该查询的条件是在„„范围之内,相当于用AND连接的一个逻辑表达式。2 LIKE 含义:它是一个字符串匹配运算符,与之搭配使用的通配符包括“*”和“?”。考点4 排序

使用SQL SELECT可以将查询结果进行排序,排序的短语是ORDER BY。格式:ORDER BY Order_Item[ASCIDESC][,Order_Item[ASC|DESC]„] 说明:可以按升序(ASC)或降序(DESC)排序,允许按一列或多列排序。考点5 计算查询 1简单的计算查询

SQL不仅具有一般的检索能力,而且还有计算方式的检索,用于计算检索的函数有:COUNT(计数)、SUM(求和)、AVG(计算平均值)、MAX(求最大值)及MIN(求最小值)。2分组与计算查询

在SQL SELECT中可以利用GROUP BY子句进行分组计算查询。

格式:GROUP BY GroupColumn[,GroupColumn„][HAVING FilterCondition] 说明:可以按一列或多列分组,还可以用HAVING子句进一步限定分组的条件。它必须跟在GROUP BY子句之后,不可单独使用,与WHERE子句并不矛盾。考点6 别名和自连接查询

(1)SQL语句允许在二OM短语中为关系定义别名,格式为:一 <关系名><别名>(2)SQL不仅可以对多个关系进行连接操作,也可以将同一关系与其自身进行连接,这种连接就称为自连接。在关系的自连接操作中,别名是必不可少的。考点7 使用量词和谓词的查询

与嵌套查询或子查询有关的运算符,除了IN和NOT IN运算符外,还有两类与子查询有关的运算符,它们有以下两种格式。

(1)<表达式><比较运算符>[ANY I ALL | SOME](子查询)(2)[NOT]EXISTS(子查询)EXISTS是谓词,EXISTS或NOT EXISTS是用来检查在子查询中是否有结果返回,即存在元组或不存在元组。其本身并没有进行任何运算或比较,只用来返回子查询结果。考点8 超链接查询

(1)在新的SQL标准中支持两个新的关系连接运算符,这两个新的连接运算是左连接(*=)和右连接=*):首先保证一个表中满足条件的元组都在结果表中,然后将满足连接条件的元组与另一个表的元组进行连接,不满足连接条件的则应将来自另一个表的属性值置为空值。在一般SQL中超链接运算符是“*=”(左连接)和“=*”(右连接)。(2)在Visual FoxPro中不支持超链接运算符“*=”和“=*”,Visual FoxPro有专门的连接运算。下面拼出SQL中超链接的部分语句格式: SELECT…

FROM Table INNER|LEFT|RIGHT|FULL JOIN Table ON JoinCondition WHERE…

考点9 Visual FoxPro中SQL SELECT的几个特殊选项(l)显示部分结果,格式为: TOP nExpr[PERCENT](2)将查询结果存放到数组中,格式为: INTO ARRAY ArrayName(3)将查询结果存放到临时文件中,格式为: INTO CURSOR CursorName(4)将查询结果存放到永久表中,格式为: INTO DBF|TABLE TableName(5)将查询结果存放到文本文件中,格式为: TO FILE FileName[ADDITIVE](6)将查询结果直接输出到打印机,格式为: TO PRINTER[PROMPT] 5.3 操作功能 考点10 插入

Visual FoxPro支持两种SQL插入命令的格式,一种是标准格式,另一种是特殊格式。1标准格式

INSERT INTO dbf name[(frame 1[,fname2,„])] VALUES(eExpressionl[,eExpression2,„])2特殊格式

INSERT INTO dbf _name FROM ARRAY ArrayName|FROM MEMVAR 考点11 更新

SQL的数据更新命令格式如下: UPDATE TableName SET Column_Namel=eEpressionl[,Column_Name2=eExpression2„] WHERE Condition 说明:利用WHERE字句指定条件,以更新满足条件的一些记录的字段值,并巨一次可更新多个字段;如果不使用WHERE子句,则更新全部记录。考点12 删除

SQL从表中删除数据的命令格式如下:

DELETE FROM TableName[WHERE Condition] 说明:FROM指定从哪个表中删除记录,WHERE指定被删除的记录所满足的条件,如果不使用WHERE子句,则删除该表中的全部记录。小提示:

当一个表定义一个主索引或候选索引后,由于相应的字段具有关键字的特性,即不能为空,所以只能用此命令插入记录、)APPEND和INSERT都是插入一条空白记录再输入各字段的值,故不能用它们来插入记录。5.4 定义功能 考点13 表的定义

利用SQL命令建立的数据表同样可以完成在表设计器中设计表的所有功能。格式:CREATE TABLE I DBF TableNamel[NAME LongTableName][FREE](FieldNarnel FieldType[(nFieldWidth[,nPrecision])][NULL |NOT NULL] [CHECK IExpressionl [ERROR cMessageTextl]] [DEFAULT eExpressionl] [PRIMARY KEY I UNIQUE] [PEFERENCES TableName2[AG TagName1]] [NOCPTRANS] [,FieldName2„] [,PRIMARY KEY eEpression2 TAG TagName2|,UNIQUE eExpression3 TAG TagName3] [,FOREIGN KEY eExpression4 TagName4[NODUP] REFERENCES TableName3 [TAG TagName5]] [,CHECK lExpression2[ERROR cMessageText2]])|FROM ARRAY ArravNasne 说明:此命令除了建立表的基本功能外,还包括满足实体完整性的主关键字(主索引)PRIMARY KEY、定义域完整性的CHECK约束及出错提示信息ERROR、定义默认值DEFAULT等,另外还有描述表之间联系的FOREIGN KEY和REFERENCES等。考点14 表的删除

利用SQL命令删除表,可直接使用语句,格式为: DROP TABLE Table_name 说明:如果删除的是自由表,则应该将当前打开的数据库先关闭,才能进行删除。如果删除数据库表,则要先打开数据库,在数据库中进行操作二否则,即使删除了数据库表,但记录在数据库中的信息并没有被删除,此后会出现错误提示。考点15 表结构的修改

修改表结构的命令是ALTER TABLE,该命令有3种格式。

(1)ALTER TABLE TableNamel ADD| ALTER[COLUMN]FieldNamel FieldTvpe[(nFieldWidth[,nPrecision])][NULL |NOT NULL] [CHECK lExpressionl[ERROR cMessageTextl ]][DEFAULT eExpressionl] [PRIMARY KEY |UNIQUE] [REFERENCES TableName2[TAG TagNamel〕](2)ALTER TABLE TableNamel ALTER[COLUMN]FieldName2[NULL|NOT NULL] [SET EFAULTeExpression2][SET CHECK lExpression2[ERROR cMessageText2] [DROP DEFAULT][DROP CHECK](3)ALTER TABLE TableName1[DROP [COLUMN]FieldName3] [SET CHECK lExpression3[ERROR cMessageText3] [DROP CHECK] [ADD PRIMARY KEY eExpression3 TAG TagName2[FOR lExpression4]] [DROP PRIMARY KEY〕

[ADD UNIQUE eExpression4[TAG TagName3[FOR lExpression5]]] [DROP UNIQUE TAG TagName4] [ADD FOREIGN KEY[eExpression5] TAG TagName4[FOR lExpression6] REFERENCES TableName2[TAG TagName5]] [DROP FOREIGN KEY TAG TagName6[SAVE]] [RENAME COLUMN FieldName4 TO FieldName5] 考点16 视图的定义 1视图的概念及其定义(l)视图的概念。

Visual FoxPro中视图是一个虚拟的表,可以是本地的、远程的或带参数的。(2)视图的定义,格式为:

CREATE VIEW view name[(column_name[,column_name]„)] AS select_statement 2从单个表派生出来的视图

视图一经定义,就可以和基本表一样进行各种查询,也可以进行一些修改操作。对于最终用户来说,有时并不需要知道操作的是基本表还是视图。3从多个表派生出来的视图

视图一方面可以限定对数据的访问,另一方面又可以简化对数据的访问。4视图的删除

视图由于是从表派生出来的,所以不存在修改结构的问题,但是视图可以删除。格式:DROP VIEW<视图名> 5关于视图的说明

在关系数据库中,视图始终不真正含有数据,它总是原有表的一个窗口。所以,虽然视图可以像表一样进行各种查询,但是插入、更新和删除操作在视图上却有一定限制。在一般情况下,当一个视图是由单个表导出时可以进行插入和更新操作,但不能进行删除操作;当视图是从多个表导出时,插入、更新和删除操作都不允许进行。这种限制是很有必要的,它可以避免一些潜在问题的发生。5.1 查询与视图

考点1 查询设计器 1查询的概念

查询是从指定的表或视图中提取满足条件的记录,然后按照想得到的输出类型定向输出查询结果。查询以扩展名为QPR的文件保存在磁盘上的,这是一个文本文件,它的主体是SQL SELECT语句。2查询的建立

建立查询可以使用“查询设计器”,但它的基础是SQL SELECT语句。建立查询的方法有以下几个方面。

(l)可以利用CREATE QUERY命令打开查询设计器建立查询。(2)可以利用“新建”对话框打开查询设计器建立查询。

(3)可以在项目管理器的“数据”选项卡中打开查询设计器建立查询。(4)可直接编辑QPR文件建立查询。建立查询时,首先进入如图6-1所示的界面选择用于建立查询的表或视图,选择表或视图后,单击“添加”按钮。最后单击“关闭”按钮,进入如图6-2所示的查询设计器界面。

图6-1 为查询选择表或视图

查询设计器中的各选项卡和SQL SELECT语句的各短语是相对应的,对应关系如下。“字段”――SELECT短语,用于指定要查询的数据 “连接”――JOIN ON短语,用于编辑连接条件。“筛选”――WHERE短语,用于指定查询条件。

“排序依据”――ORDER BY短语,用于指定排序字段和排序方式。“分组依据”――GROUP BY短语和HAVING短语,用于分组。

图6-2 查询设计器 3查询的运行

运行查询有下列两种方法。

(1)可以在项口管理器的“数据”选项卡中,展开“查询”选项,然后选择要运行的查询文件,单击“运行”按钮,可查看查询结果。(2)在命令窗门执行命令DO QueryFile。

注意:此处的查询文件名是全名,包括扩展名QPR。4查询去向

设计查询的目的不只是完成一种查询功能,在查询设计器中可以根据需要为查询输出定位查询去向。通过“查询”菜单卜的“查询去向”,或在“查询设计器”工具栏中单击“查询去向”按钮。“查询去向”对话框如图6-3所示

图6-3 “查询去向”对话框 各去向的含义如下。

(1)浏览:在“浏览”(BROWSE)窗口中显示查询结果,这是默认的输出去向。(2)临时表:将查询结果存储于一个命名的临时只读表中。(3)表:将结果保存在一个命名的数据表文件中。(4)图形:查询结果可以用于Microsoft Graph。

(5)屏幕:在Visual FoxPro主窗口或当前活动输出窗口中显示查询结果。(6)报表:将结果输出到一个报表文件。(7)标签:将结果输出到一个标签文件。小提示:

在7种输出去向中,只有“浏览”和“屏幕”两种输出去向才能直接看到查询结果。6.2 视图

考点2 视图的概念与建立 1视图的概念

视图是操作表的一种手段,通过视图可以查询表,也可以更新表。视图是根据表定义的,因此视图基于表,而视图可以使应用更灵活,因此它又超越表。视图是数据库中的一个特有功能,只有在包含视图的数据库打开时才能使用。

视图兼有“表”和“查询”的特点,与查询相类似的地方是可以用来从一个或多个相关联的表中提取有用信息;与表类似的地方是可以用来更新其中的信息,并将结果永久性保存在磁盘上。

2视图的建立

(l)用CREATE VIEW命令打开视图设计器建立视图。(2)利用“新建”对话框打开视图设计器建立视图。

(3)在项目管理器的“数据”选项卡中打开视图设计器建立视图。(4)利用SQL命令CREATE VIEW...AS...建立视图。3视图设计象

视图设计器(如图6一所示)与查询设计器基本上一样,主要有以下几点不同。(1)视图的结果保存在数据库中,在磁盘上找不到类似的文件。

(2)视图可以用来更新数据,因此在设计器中多了一个“更新条件”选项卡。(3)在视图中没有“查询去向”的问题。

图6-4 视图设计器

考点3 远程视图与连接

为了建立远程视图,必须首先建立连接远程数据库的“连接”,“连接”是Visual FoxPro数据库中的一种对象。1定义数据源和连接

数据源一般是ODBC数据源,开放数据库互连ODBC是一种连接数据库的通用标准。为了定义ODBC数据源,必须首先安装ODBC驱动程序。2建立连接

建立连接的方法有以下几种。(1)用CREATE CONNECTION命令打开“连接设计器”,或完全用命令方式建立连接。(2)通过“新建”对话框建立连接。

(3)在项目管理器的“数据”选项卡中建立连接。3设计远程视图

利用数据源或连接建立的远程视图的SQL语法要符合远程数据库的语法,例如,SQL Server的语法和Visual FoxPro的语法就有所区别。考点4 视图与数据更新

视图是根据基本表派生出来的,所以把它叫做虚拟表为了通过视图能够更新基本表中的数据,需要在视图设计器的“更新条件”选项卡中的左下角选中“发送SQL更新”复选框。1指定可更新的表

如果视图是基于多个表的,默认可以更新“全部表”的相关字段,如果要指定只能更新某个表的数据,则可以通过“表”下拉列表框选择表 2指定可更新的字段

在“字段名”列表框中列出了与更新有关的字段,在字段名左侧有两列标志,“钥匙”表示关键字,“铅笔”表示更新通过单击相应列可以改变相关的状态,默认可以更新所有非关键字字段,并且通过基本表的关键字完成更新,即Visual FoxPro用这些关键字字段来唯一标识那些已在视图中修改过的基本表中的记录建议不要改变关键字的状态,不要试图通过视图来更新基本表中的关键字字段值,如有必要,可以指定更新非关键字字段值 3检查更新的合法性 如图6-1所示,“SQL WHERE子句包括”框中的选项决定哪些字段包含在UPDATE或DELETE语句的WHERE子句中,Visual FoxPro正是利用这些语句将在视图中修改或删除的记录发送到远程数据源或基本表中,WHERE子句就是用来检查自从提取记录用于视图中后,服务器上的数据是否已经改变。“SQL WHERE子句包括”框中各选项的含义如下。

(l)关键字段:当基本表中的关键字字段被改变时,更新失败。

(2)关键字和可更新字段:当基本表中任何标记为可更新的字段被改变时,更新失败。

(3)关键字和已修改字段:当在视图中改变的任一字段的值在基本表中已被改变时,更新失败。

(4)关键字和时间戳:当远程表上记录的时间戳在首次检索之后被改变时,更新失败。4使用更新方式

“使用更新”框的选项决定当向基本表发送SQL更新时的更新方式。

(1)SQL DELETE然后INSERT:先用SQL DELETE命令删除基本表中被更新的旧记录,再用SQL INSERT命令向基本表中插入更新后的记录。

(2)SQL UPDATE:使用SQL UPDATE命令更新基本表。考点5 使用视图

视图建立后,不但可以用它来显示和更新数据,而且可以通过调整它的属性来提高性能,它的使用类似于表。1视图操作

(1)在数据库中使用USE命令打开或关闭视图。(2)在“浏览器”窗口中显示或修改视图中的记录。(3)使用SQL语句操作视图。

(4)在文本框、表格控件、表单或报表中使用视图作为数据源。2使用视图

视图一经建立就基本可以像基本表一样使用,适用于基本表的命令基本都可以用于视图。比如在视图上也可以建立索引,此索引当然是临时的,视图一关闭,索引自动删除,多工作区时也可以建立联系等。但视图不可以用MODIFY STRUCTURE命令修改结构。因为视图毕竟不是独立存在的基本表,它是由基本表派生出来的,只能修改视图的定义。

小提示:

查询与视图的区别是:查询可以定义输出去向,可以将查询的结果灵活地应用于表单、报表、图形等各种场合,但是利用查询不可以修改数据;而利用视图可以修改数据,可以利用SQL将对视图的修改发送到基本表,特别是对于远程表的操作,利用视图是非常有效的。

6.1表单与控件 面向对象的概念 考点1 对象与类 1对象(Object)客观世界里的任何实体都可以被视为对象。对象可以是具体事物,也可以指某些概念二(1)属性:用来表示对象的状态。(2)方法:用来描述对象的行为。2类(Class)类是对一类相似对象性质的描述。同类对象具有相同的性质:相同的属性及方法。考点2 子类与继承 1继承

继承表达了一种从一般到特殊的进化过程。在面向对象的方法里,继承是指基于现有类的方法和属性。2类

我们把新类称为现有类的子类,而把现有类称为新类的父类。一个子类的成员一般包括以下两个方面。

(l)从其父类继承的成员,包括属性、方法。(2)由子类自己定义的成员,包括属性、方法。8.2 Visual FoxPro基类简介 考点3 Visual FoxPro基类

Visual FoxPro中所有基类共有的属性如表8-1所示。表8-1 Visual FoxPro基类的最小属性集

(l)在编程方式里,对象的生成通常使用CREATE OBJECT函数来完成,格式为: CREATE OBJECT(<类名>[,<参数1>,<参数2>,„])说明:函数基于指定的类生成一个对象,并返回对象的引用。(2)对象属性访问及对象方法调用的基本格式为: <对象引用>.<对象属性> <对象引用>.<对象方法>[(„)] 考点4 容器与控件

Visual FoxPro中的类一般可分为两种类型:容器类和控件类。相应地,可分别生成容器(对象)和控件(对象)。

(l)控件:是一个可以以图形化的方式显示出来并能与用户进行交互式的对象。(2)容器:可看成是一个特殊的控件,它能包容其他的控件或容器。(3)层次:容器内的包容关系形成r对象的嵌套层次关系。对象的层次概念与类的层次概念是两个完全不同的概念对象的层次关系指的是包容与被包容的关系,而类的层次指的是继承与被继承的关系。

在对象的嵌套层次关系中,要引用其中的某个对象,需要指明对象在嵌套层次中的位置。对象引用的几个属性或关键字如表8-2所示。表8-2 对象引用的几个属性或关键字

考点5 事件

事件是一种由系统预先定义而由用户或系统发出的动作。它作用于对象,对象识别事件并做出相应的反应。与方法集可以无限扩展不同的是,事件集是固定的。用户不能定义新的事件。表8-3列出了VisualFoxPro基类的最小事件集,不管哪个基类都包含这些事件。表8-3 Visual FoxPro基类的最小事件集

8.3 创建与管理表单

考点6 创建、修改及运行表单 1使用表单向导创建表单

调用表单向导的方法有多种,这里只做简单介绍。

(l)在“项目管理器”窗口中,选择“文档”选项卡,选择其中的“表单”图标。(2)单击“新建”按钮,系统弹出“新建表单”对话框。(3)单击“表单向导”图标按钮,打开“向导选取”对话框。(4)从列表框中选择要使用的向导,然后单击“确定”按钮。2使用表单设计器创建表单

可以使用以下3种方法中的任何一种调用表单设计器。(1)在项目管理器环境下调用。(2)菜单方式调用。(3)命令方式调用。3修改已有的表单

一个表单无论是通过任何途径创建的,都可以使用表单设计器进行编辑修改。我们可以通过项目或使用命令“MODIFY FORM<表单名>”来打开表单设计器。4运行表单

可以采用下列方法运行通过表单设计器创建的表单文件。

(1)在项目管理器窗口中,选择要运行的表单,然后单击窗口里的“运行”按钮。

(2)在表单设计器环境下,选择“表单”菜单中的“执行表单”命令,或单击标准工具栏上的“运行”按钮。

(3)选择“程序”菜单中的“运行”命令,打开“运行”对话框,然后在对话框中指定要运行的表单文件并单击“运行”按钮。(4)在命令窗口中输入命令,格式为:

DO FORM<表单文件名>[NAME<变量名>] WITH<实参>[,<实参>,„][LINKED][NOSHOW] 考点7 管理表单属性和方法

可以向表单添加任意数量的新属性和新方法,并像引用表单的其他属性和方法一样引用它们。Visual FoxPro中表单的属性大约有100个,但绝大多数很少用到。表8-4列出了常用的一些表单属性,这些属性规定了表单的外观和行为。表8-4 表单的常用属性

1创建新属性

向表单添加新属性的方法如F。

(l)选择“表单”菜单中的“新建属性”命令,打开“新建属性”对话框,如图8-1所示。(2)在“名称”文本框中输入新属性的名称。

(3)有选择地在“说明”列表框中输入新建属性的说明信息。

图8-1 “新建属性”对话框

2创建新方法

向表单添加新方法的步骤如下

(l)运行“表单”→“新建方法程序”命令,打开“新建方法程序”对话框,如图8-2所示。(2)在“名称”文本框中输入新方法名。

(3)有选择地在“说明”列表框中输入新建方法的说明信息。

图8-2 “新建方法程序”对话框

3编辑方法或事件代码

在表单设计器中,编辑方法或事件代码的步骤如下。

(1)选择“显示”菜单中的“代码”命令,打开代码编辑窗口,如图8-3所示。(2)从“对象”框中选择方法或事件所属的对象。(3)从“过程”框中指定需要编辑的方法或事件。(4)在编辑区输入或修改方法或事件的代码。

图8-3 代码编辑窗口

考点8 常用事件与方法

下面将以表的形式简单介绍一下表单及控件常用的一些事件和方法,如表8-5所示。表8-5 常用的一些属性和方法

8.4 表单设计器

考点9 表单设计器环境

表单设计器启动后,在Visual FoxPro的主窗口中出现“表单设计器”窗口、“属性”窗口、“表单控件”工具栏、“表单设计器”工具栏及“表单”菜单。1“表单设计器”窗口

用户可视化地添加和修改控件的窗口。2“属性”窗口

如图8-4所示,在“属性”窗口中包括对象框、属性设置框、方法和事件列表。用户可在此窗口中选择表取中的控件,并为表单设计属性、方法及事件。

对于表单及控件的绝大多数属性,其数据类型是固定的。一般来说,要为属性设置一个字符型数值,可以在设置框中直接输入,不需要加定界符。

“属性”窗口可以通过单击“表单设计器”工具栏中的“属性窗口”按钮或选择“显示”菜单中的“属性环境”命令打开或关闭。

图8-4 “属性”窗口

3“表单控件”工具栏

如图8-5所示,利用“表单控件”工具栏可以方便地向表单添加控件。

图8-5 “表单控件”工具栏

除了控件按钮外,“表单控件”工具栏还包含“选定对象”、“按钮锁定”、“生成器锁定”和“查看类”4个辅助按钮。4“表单设计器”工具栏

“表单设计器”工具栏如图8-6所示,它可以通过“显示”菜单中的“工具栏”命令打开或关闭。

图8-6 “表单设计器”工具栏

5“表单”菜单 “表单”菜单中的命令主要用于创建、编辑表单或表单集,如为表单增加新的属性和方法等。考点10 控件的操作与布局 1控件的基本操作

在表单设计器下,对表单上的控件可进行移动、改变大小、复制、删除等操作。(l)选定控件。(2)移动控件

(3)调整控件大小。(4)复制控件。(5)删除控件。2控件布局 利用“布局”工具栏中的按钮,可以方便地调整表单窗口中被选控件的相对大小或位置。“布局”工具栏丁以通过单击“表单设计器”工具栏上的“布局工具栏”按钮或选择“显示”菜单中的“布局工具栏”命令打开或关闭。3设置Tab键次序

当表单运行时,用户可以按Tab键选择表单中的控件,使焦点在控件间移动。控件的Tab键次序决定了选择控件的次序。Visual FoxPro提供了两种方式来设置Tab键次序:交互方式和列表方式。考点11 数据环境 1数据环境的常用属性

常用的两个数据环境是AutoOpenTables和AutoCloseTables,其功能如下。

(1)AutoOpenTables;表示当运行或打开表单时,是否打开数据环境中的表和视图,默认值为逻辑真.T.)。

(2)AutoCloseTables:表示当释放或关闭表单时,是否关闭由数据环境指定的表和视图,默认值为逻辑真(.T.)。

2打开数据环境设计器

可通过单击“表单设计器”工具栏中的“数据环境”按钮,也可以选择“显示”菜单中的“数据环境”命令打开或关闭“数据环境设计器”窗口。3向数据环境中添加表或视图

(1)选择“数据环境”菜单中的“添加”命令,或用鼠标右键单击“数据环境设计器”窗口,然后在弹出的快捷菜单中选择“添加”命令,打开“添加表或视图”对话框。

(2)选择要添加的表或视图并单击“添加”按钮。如果单击“其他”按钮,将调出“打开”对话框,用户可以从中选择需要的表。4从数据环境中移去表或视图

在数据环境设计器环境下,按下列方法从数据环境移去表或视图。(1)在“数据环境设计器”窗口中,单击选择要移去的表或视图。(2)选择“数据环境”菜单中的“移去”命令。

也可以用鼠标右键单击要移去的表或视图,然后在弹出的快捷菜单中选择“移去”命令。当表从数据环境中移去时,与这个表有关的所有关系也将随之消失。5在数据环境中设置关系

如果添加到数据环境的表之间具有在数据库中设置的永久关系,这些关系也会自动添加到数据环境中。如果表之间没有永久关系,可以根据需要在数据环境设计器下为这些表设置关系。6在数据环境中编辑关系

关系是数据环境中的对象,它有自己的属性、方法和事件。常用的关系属性如表8-6所示。

表8-6 常用的关系属性

7向表单添加字段

我们可以利用“表单控件”工具栏方便地将一个标准控件放置到表单上,也可以从“数据环境设计器”窗口、“项目管理器”窗口或“数据库设计器”窗口中直接将字段、表或视图拖入表单,系统将产生相应的控件并与字段相联系。8.5 常用表单控件

考点12 标签(Label)控件 标签的常用属性如下

(1)Caption属性:指定标签的标题文本很多类控件都具有Caption属性。用户可以利用该属性为所创建的对象指定标题文本。

(2)Alignment属性:指定标题文本在控件中的显示对齐方式。该属性包括三个属性值――0、1和2,分别代表左对齐、右对齐和中央对齐。考点13 命令按钮(CommandButton)控件 命令按钮的常用属性如下。

(1)Default属性:该属性默认值为.F.。当属性为.T.时,可称为“确定”按钮,一个表单中只能包含一个“确定”按钮;在Windows中,当焦点不在命令按钮上时,按Enter键,系统将自动执行该命令按钮的Click事件代码、(2)Cancel属性:该属性默认值为.F.。当属性为.T.时,可称为“取消”按钮,在表单中,可通过Esc键执行该命令按钮中的Click事件代码一个表单中可有多个命令按钮的Cancel属性值为.T.。(3)Enabled属性:指定表单或控件能否响应用户引发的事件。默认的属性值为.T.,即对象是有效的,当Enabled=.F.时,只是用来显示只读的信息。

(4)Visible属性:指定对象是可见还是隐藏。默认的属性值为.T.,即对象是可见的。考点14 命令组(CommandGroup)控件

命令组是包含一组命令按钮的容器控件,其常用属性如下。

(1)ButtonCount属性:指定命令组中命令按钮的个数,默认的属性值为2。(2)Buttons属性:用于存取命令组中各按钮的数组。用户可以利用该数组为命令组中的命令按钮设置属性或调用其方法,属性数组下标的取值范围应该在1到ButtonCount属性值之间。(3)Value属性:指定命令组当前的状态。该属性的类型可以是数值型,也可以是字符型。考点15 文本框(TextBox)控件 文本框的常用属性如下。

(1)ControlSource属性:可利用该属性为文本框指定一个字段或内存变量,运行时,文本框中首先显示该变量的内容

(2)Value属性:返回文本框的当前内容。该属性的默认值是空串。(3)PasswordChar属性:指定文本框控件内是显示用户输入的字符还是显示占位符。该属性的默认值是空串,此时没有占位符。当为属性指定一个占位符(例如*)后,文本框中只显示占位符。

(4)InputMask属性:指定在一个文本框中如何输入和显示数据。各种模式符的功能如表8-7所示。

表8-7 模式符及其功能

考点16 编辑框的常用属性如下。

(1)AllowTabs属性:指定编辑框中能否使用Tab键。该属性的默认值为.F.,当按Tab键时,焦点移出编辑框。

(2)HideSelection属性:指定当编辑框失去焦点时,编辑框中选定的文本是否仍显示为选定状态。该属性的默认值为.T.,即当编辑框失去焦点时,编辑框中选定的文本不显示为选定状态(3)ReadOnly属性:指定用户能否编辑编辑框中的内容。如果该属性的默认值为.F.,则叮以编辑编辑框中的内容;当属性值为.T.时,编辑框中的内容为只读。

(4)ScrollBars属性:指定编辑框是否具有滚动条。该属性包括“0-无” 和“2-垂直”两个属性值。

(5)SelStart属性:返回用户在编辑框中所选文本的起始位置或插入点位置。属性的有效取值范围在0与编辑区中的字符总数之间。

(6)SelLength属性:返回用户在控件的文本输入区中所选定字符的数目,或指定要选定的字符数目。

(7)SelText属性:返回用户编辑区内选定的文本。如果没有选定文本,将返回空串。考点17 复选框(CheckBox)控件 复选框的常用属性如下。

(1)Caption属性:用来指定显示在复选框旁边的文字。

(2)Value属性:用来指明复选框的当前状态,共有3种情况:0或.F.表示未被选中;1或.T.表示被选扣;2或.NULL.表示不确定,只在代码中有效。

(3)ControlSource属性:指明与复选框建立联系的数据源。作为数据源的字段变量或内存变量,其类型可以是逻辑型或数值型。考点18 选项组(OptionGroup)控件

选项组是包含若干个选项按钮的一种容器控件,其常用属性如下。(1)ButtonCount属性:指定选项组中选项按钮的数目,其默认值为2,(2)Value属性:用于指定选项组中哪个选项按钮被选中。该属性值的类型可为数值k1J或字符型。

(3)ControlSource属性:指明与选项组建立联系的数据源。作为数据源的字段变量或内存变量,其类型可以是字符型或数值型

(4)Buttons属性:用于存取选项组中每个按钮的数组,其含义与命令组的Buttons类似。考点19 列表框(ListBox)控件 列表框的常用属性如下

(1)RowSourceType属性与RowSource属性:RowSourceType属性指明列表框中的条目数据源的类型,RowSource属性指定列表框的条目数据源。RowSourceType属性共有10种取值范围:0-无(默认值)、1-值,2-别名、3-SQL语句,4-查询(.qpr),5-数组,6-字段,7-文件,8-结构,9-弹出式菜单。(2)List属性:用以存取列表框中数据条目的字符串数组。(3)ListCount属性:指明列表框中数据条目的数目。(4)ColumnCount属性:指定列表框的列数。

(5)Value属性:列表框中被选中的条目。该属性可以是数值型,也可以是字符型。

(6)ControlSource属性:该属性在列表框中的用法和在其他控件中的用法有所不同。用户可以通过该属性指定一个字段或变量用以保存用户从列表框中选择的结果。(7)Selected属性:指定列表框内的某个条目是否处于选定状态〕(8)MultiSelect属性:指定用户在列表框控件内进行多重选定。其中,0或.F.表示不允许多重选定,为系统默认值;1或.T.表示允许多重选定。考点20 组合框(ComboBox)控件

组合框与列表框类似,也是用于提供一组条目供用户从中选择,组合框的特点如下。(1)对于组合框来说,通常只有一个条目是可见的。(2)组合框不提供多重选定的功能。

(3)组合框可通过Style属性设置其形式,共有两种:0表示下拉组合框,2表示下拉列表框。考点21 表格(Gride)控件 表格是一种容器对象。一个表格对象由若十列对象组成,每个列对象包含一个标头对象和若干控件,它们都有自己的属性、事件和方法。1表格的常用属性

(l)RecordSourceType属性与RecordSource属性:RecordSourceType属性指明表格数据源类型,RecordSource属性指定表格数据源。其中数据类型共有5种取值范围:0-表、1-别名(默认值)、2-提示、3-查询(.qpr)、4-SQL语句。

(2)ColumnCount属性:指定表格的列数,即一个表格对象所包含的列对象数目。(3)LinkMaster属性:用于指定表格控件中所显示的子表的父表名称。(4)ChildOrder属性:用于指定建立一对多的关联关系,子表所要用到的索引。该属性类似于SET ORDER命令。

(5)RelationalExpr属性:确定基于主表字段的关联表达式。2常用的列属性

(1)ControlSource属性:指定要在列中显示的数据源,常见的是表中的一个字段。

(2)CurrentControl属性:指定列对象中的一个控件,该控件用以显示和接收列中活动单元格的数据。

(3)Sparse属性:用于确定CurrentControl属性是影响列中的所有单元格还是影响活动单元格。

3常用的标头(Header)属性

(1)Caption属性:指定标头对象的标题文本,显示于列顶部。(2)Alignment属性:指定标题文本在对象中显示的对齐方式。考点22 页框(PageFrame)控件

页框是包含页面(Page)的容器对象,其常用属性如下。

(1)PageCount属性:用于指明一个页框对象所包含的页对象的数量。最小值为0,最大值为99。

(2)Pages属性:该属性是一个数组,用于存取页框中的某个页对象。(3)Tabs属性:指定页框中是否显示页面标签栏。

(4)TabStretch属性:如果页面标题文本太长,可通过设置该属性利用多行显示。其中0表示多重行,1表示单行(默认值)。

(5)ActivePage属性:返回页框中活动页的页号,或使页框中的指定页 7.1菜单设计

9.1 Visual FoxPro系统菜单 考点1 菜单结构 Visual FoxPro支持两种类型的菜单:条形菜单和弹出式菜单。菜单项的名称显示于屏幕供用户识别,菜单及菜单项的内部名称或选项序号则用于在代码中引用。每一个菜单项都可以选择设置一个热键和一个快捷键。无论哪种类型的菜单,当选择某个选项时都会有一定的动作,这个动作可以是下列3种情况之一:执行一条命令、执行一个过程或激活另一个菜单。考点2 系统菜单 Visual FoxPro系统菜单是一个典型的菜单系统,其主菜单是一个条形菜单。条形菜单的内部名字为_MSYSMENU,也可看做是整个菜单系统的名字。

条形菜单中常见选项的名称及内部名字如表9-1所示,各弹出式菜单的内部名字如表9-2所示。表9-3的是“编辑”菜单中常用选项的选项名称和内部名字。表9-1 主菜单(MSYSMENU)常见选项

表9-2 弹出式菜单的内部名字

表9-3 “编辑”菜单(_MEDIT)常用选项

通过SET SYSMENU命令可以允许或禁止在程序执行时访问系统菜单,也可以重新配置系统菜单,格式如下。

SET SYSMENU ON|OFF AUTOMATIC |TO[<弹出式菜单名表>] |TO[<条形菜单项名表>] |TO[DEFAULT]|SAVE|NOSAVE 小提示:

如不带任何参数,直接SET SYSMENU TO命令,将屏蔽系统菜单,使系统菜单不可用。9.2 下拉式菜单设计

考点3 菜单设计的基本过程

用菜单设计器设计下拉式菜单的基本过程如下。(l)调用菜单设计器。

(2)在“菜单设计器”窗口中定义菜单,指定菜单的各项内容,定义完成后,通过菜单命令“保存”或直接使用快捷键Ctrl+W保存菜单。

(3)通过菜单命令“菜单”*“生成”命令,产生可执行的菜单程序文件(MPR)。

(4)在命令窗口中,使用DO命令执行菜单文件,此处的文件扩展名MPR不能默认。菜单设计的基本流程如图9-1所示。

图9-1 菜单设计的基本流程图 考点4 定义菜单

1“菜单设计器”窗口

“菜单设计器”窗口每页显示和定义一个菜单,可以是条形菜单(菜单栏),也可以是弹出式菜单(子菜单)。“菜单设计器”窗口打开时,首先显示和定义的是条形菜单,即主菜单名。窗口的左边是一个列表框,其中每一行定义当前菜单的一个菜单项,包括“菜单名称”、“结果”和“选项”3列内容(如图9-2所示)。(1)“菜单名称”列。(2)“结果”列。(3)“选项”列。2“显示”菜单

在菜单设计一器环境下,系统“显示”菜单会出现两条命令。(1)“常规选项”对话框。(2)“菜单选项”对话框。

图9-2 “菜单设计器”窗口 考点5 用编程方式定义菜单

无论是条形菜单还是弹出式菜单,都可以通过命令进行定义和设计。此处介绍几种有关菜单定义的简单命令。(1)条形菜单定义。(2)弹出式菜单定义。

考点6 为顶层表单添加菜单

为顶层表单添加下拉式菜单的方法和过程如下。(1)在“菜单设计器”窗口中设计好下拉式菜单。

(2)打开“常规选项”对话框,选中对话框右下角的“顶层表单”复选框。(3)将表单的ShowWindow属性设置为2,使之成为顶层表单。(4)在表单的Init事件中添加调用菜单的程序代码: DO<文件名>WITH This[,“<菜单名>”] 此处的<文件名>是指被调用的菜单程序文件(MPR),<菜单名>是为被添加的下拉式菜单的条形菜单指定的一个内部名字。

(5)在表单的Destroy事件中添加清除菜单的程序代码: RELEASE MENU<菜单名>[EXTENDED] 其中EXTENDED表示在清除条形菜单时一起清除其下属的所有子菜单。9.3 快捷菜单设计

考点7 快捷菜单的建立与执行

与下拉式菜单相比,快捷菜单没有条形菜单,只有弹出式菜单。建立快捷菜单的方法和过程如下。

(1)打开“新建”对话框二

(2)在“新建”对话框中选择“菜单”选项.单击“新建文件”按钮。

(3)在“新建菜单”对话框中选择“快捷菜单”选项,打开“快捷菜单设计器”窗口。

(4)用与设计下拉式菜单相似的方法,在“快捷菜单设计器”窗口中设计快捷菜单,生成菜单程序文件。

(5)在快捷菜单的“清理”代码中添加清除菜单的命令,使得在选择、执行菜单命令后能及时清除菜单,释放其所占用的内存空间,格式为: RELEASE POPUPS<快捷菜单名>[EXTENDED](6)在设计器环境下,选定需要添加快捷菜单的对象。

(7)在选定对象的RightClick事件代码中,添加调用快捷菜单程序的格式为: DO<快捷菜单程序文件名> 此处的文件扩展名MPR不能默认。

第三篇:全国计算机等级考试二级VF考点分析

全国计算机等级考试二级VF考点分析之VF基础(第一章)1.1 数据库基础知识 考点1 计算机数据管理的发展

1数据与数据处理

数据是指存储在某一种媒体上能够识别的物理符号。数据处理的中心问题是数据管理。

2计算机数据管理

(l)人工管理。

(2)文件系统。

(3)数据库系统。

(4)分布式数据库系统。

(5)面向对象数据库系统。

3数据库管理系统

为数据库的建立、使用和维护而配置的软件称为数据库管理系统DBMS(DataBase Management System)。

图1-1 数据库系统中数据与程序的关系 考点2 数据库系统

1有关数据库的概念

(1)数据库(DataBase):存储在计算机存储设备上、结构化的相关数据的集合。

(2)数据库应用系统(DBAS):是由系统开发人员利用数据库系统资源开发出来的,面向某一类实际应用的应用软件系统。

(3)数据库管理系统(DBMS):对数据实行专门管理,提供安全性和完整性等统一机制,可以对数据库的建立、使用和维护进行管理。

(4)数据库系统(DBS):是指引进数据库技术后的计算机系统,实现有组织地、动态地存储大量相关数据,提供数据处理和信息资源共享的便利手段。数据库系统由硬件系统、数据库、数据库管理系统及相关软件、数据库管理员和用户等部分组成。

2数据库系统的特点

(l)实现数据共享,减少数据冗余。

(2)采用特定的数据模型。

(3)具有较高的数据独立性。

(4)具有统一的数据控制功能。考点3 数据模型

1实体的描述

(1)实体。

(2)实体的属性。

(3)实体集和实体型。

2实体间联系及联系的种类

(1)一对一联系。

(2)一对多联系。

(3)多对多联系。

3数据模型简介

为了反映事物本身及事物之间的各种联系,数据库中的数据必须有一定的结构,这种结构用数据模型来表示,通常有以下3种。

(1)层次数据模型。

(2)网状数据模型。

(3)关系数据模型。小提示:

数据库DB、数据库系统DBS和数据库管理系统DBMS之间的关系是DBS包括DB和DBMS。1.2 关系模型

关系模型的用户界面非常简单,一个关系的逻辑结构就是一张二维表。这种用二维表的形式表示实体和实体间联系的数据模型称为关系数据模型。

1关系术语

(l)关系:一个关系就是一张二维表,每个关系有一个关系名。在Visual FoxPro中一个关系存储为一个文件,扩展名为DBF,称为“表”。

对关系的描述称为关系模式,一个关系模式对应一个关系的结构,格式为:

关系名(属性名1,属性名2,„,属性名n)

(2)元组:在一个二维表中,水平方向的行称为元组,每一行为一个元组。

(3)属性:将二维表中垂直方向的列称为属性,每一列都有一个属性名。

(4)域:属性的取值范围,即不同元组对同一个属性的取值所限定的范围。

(5)关键字:属性或属性的组合,其值能够唯一地标识一个元组。在Visual FoxPro中,主关键字和候选关键字就起唯一标志一个元组的作用。

(6)外部关键字:如果表中一个字段不是本表的主关键字或候选关键字,而是另一个表的主关键字或候选关键字,那么这个字段(属性)就称为外部关键字。

2关系的特点

(1)关系必须规范化。

(2)在同一个关系中不能出现同名属性,Visual FoxPro中表示为字段名的不同。

(3)关系中不允许有完全相同的元组,即冗余。

(4)在一个关系中元组的次序无关紧要。

(5)在一个关系中列的次序无关紧要。考点5 关系运算

对关系数据库进行查询时,需要找到用户感兴趣的数据,这就需要对关系进行一定的关系运算,关系的基本运算有两类:传统的集合运算和专门的关系运算。

1传统的集合运算

(1)并:两个相同结构关系的并是由属于这两个关系的全部元组组成的集合。

(2)差:两个相同结构关系的差是由属于前一个关系的元组而不属于后一个关系的元组组成的集合。例如,关系R和S的差结果是由属于R但不属于S的元组组成的集合。

(3)交:两个相同结构关系的交是由属于这两个关系所共有的元组组成的集合。

2专门的关系运算

(1)选择:从关系中找出满足给定条件的元组的操作。

(2)投影:从关系模式中指定若干个属性组成新的关系:

(3)连接:关系的横向结合,将两个关系模式拼接成一个更宽的关系模式。

(4)自然连接:在连接运算中,按照字段值对应相等为条件进行的连接操作称为等值连接。自然连接是去掉重复属性的等值连接。小提示:

选择和投影运算的操作对象只是一个表,相当于对一个二维表进行切割。连接运算则需要把两个表作为操作对象。如果两个表以上进行连接,应当两两进行连接。1.3 数据库设计基础 考点6 数据库设计步骤

1设计原则

(l)关系数据库的设计应遵从概念单一化“一事一地”的原则。

(2)避免在表之间出现重复字段。

(3)表中的字段必须是原始数据和基本数据元素。

(4)用外部关键字保证有关联的表之间的联系。

2设计步骤

利用Visual FoxPro来开发数据库应用系统,可以按照以下步骤来设计。

(1)需求分析。

(2)确定需求表C

(3)确定需求字段。

(4)确定联系。

(5)设计精确

1.4 Visual FoxPro系统概述 考点7 Visual FoxPro的特点

(l)增强项目与数据库管理。

(2)提高应用程序开发的生产率。

(3)互操作性与支持Internet。

(4)充分利用已有数据。

全国计算机等级考试二级VF考点分析之VF系统初步(第二章)2.1 Visual FoxPro的安装和启动 考点1 Visual FoxPro的系统要求

Visual FoxPro功能强大,但它对系统的要求并不高,个人计算机软硬件基本要求如下。

(1)处理器;486DX/66 MHz处理器,推荐使用Pentium或更高处理器的PC。

(2)内存:16MB以上的内存,推荐使用24MB内存。

(3)硬盘空间:典型安装需要85 MB硬盘空间,最大安装需要90MB硬盘空间。

(4)其他硬件:一个鼠标、一个光盘驱动器。推荐使用 VGA或更高分辨率的监视器。

(5)操作系统:由于Visual FoxPro是32位产品,需要在Windows 95/98(中文版)、Windows NT 4.0(中文版)或更高版本的操作系统上运行。小提示:

退出Windows中的应用程序或关闭窗口等操作,都可以利用快捷键Alt + F4来完成。2.2 Visual FoxPro的用户界面 考点2 Visual FoxPro的主界面

Visual FoxPro的主界面即其工作环境,启动 Visual FoxPro后,打开如图2一l所示的界面。

考点3 工具栏的使用

设置工具栏是微软公司流行软件的共同特点,利用各种工具栏比菜单要方便得多。其默认界面仅包括“常用”工具栏和“表单设计器”工具栏。除此之外,Visual FoxPro还提供其他10个工具栏,如表2-1所示。

小提示:

Visual FoxPro中有两种工作方式:交互操作方式和程序方式,命令方式和菜单方式都属于交互操作方式。2.3 项目管理器 考点4 使用项目管理器

(1)项目管理器窗口中共有6个选项长,其中“全部”选项卡用来集中显示该项目中的所有文件,“数据”、“文档”、“类”、“代码”和“其他“5个选项卡用来分类显示各种文件。

(2)项目管理器一是提供了简便的、可视化的方法来组织和处理表、数据库、表单、查询和其他一切文件,通过单击鼠标就能实现对文件的创建、修改、删除等操作;二是在项口管理器中可以将应用系统编译成一个扩展名为APP的应用文件或EXE的可执行文件。

(3)在Visual FoxPro中的不同文件类型及其扩展名,如表2-2所示。

表2-2 Visual FoxPro中的不同文件类型及其扩展名

考点5 定制项目管理器

(l)移动、缩放和折叠。

(2)拆分项目管理器。

(3)停放项目管理器 小提示:

要拆分选项卡使之单独使用,必须将选项卡折叠后才可以实现。2.4 Visual FoxPro向导、设计器、生成器 考点6 Visual FoxPro的向导

向导是一种交互式程序用户在一系列向导屏幕上回答问题或者选择选项后,向导会根据回答生成文件或者执行任务,帮助用户快速完成一般性的任务〔例如创建表单、编排报表的格式、建立查询、制作图表、生成数据透视表、生成交叉表报表及在Web上按HTML格式发布等。考点7 Visual FoxPro的设计器

Visual FoxPro的设计器是创建和修改应用系统各种组件的可视化工具:利用各种设计器使得创建表、表单、数据库、查询和报表及管理数据变得轻而易举,为初学者提供了方便。考点8 Visual FoxPro的生成器

生成器是带有选项卡的对话框,用于简化对表单、复杂控件及参照完整性代码的创建和修改过程。每个生成器显示一系列选项卡,用于设置选中对象的属性。可使用生成器在数据库表之间生成控件、表单、设置控件格式和创建参照完整性。

全国计算机等级考试二级VF考点分析之数据与数据运算(第三章)3.1 常量与变量 考点1 常量

常量用以表示一个具体的、不变的值。不同类型常量的书写格式不同。在Visual FoxPro中,常量主要包括以下几种类型。

1数值型常量

数值型常量即常数,用来表示一个数量的大小,由数字0~9小数点和正负号组成。

2货币型常量

货币型常量用来表示货币值,其书写格式与数值型常量类似,但要加上一个前置的符号($)。

3字符型常量

字符型常量也称为字符串,其表示方法是用半角单引号、双引号或方括号把字符串括起来。这里的单引号、双引号或方括号称为定界符许多常量都有定界符。定界符虽然不作为常量本身的内容,但它规定了常量的类型及常量的起始和终止界限。

4日期型常量

日期型常量的定界符是一对花括号。花括号内包括年、月、日3部分内容,各部分内容之间用分隔符分隔。

5日期时间型常量

日期时间型常量包括日期和时间两部分内容:{<日期>,<时间>}。<日期>部分与日期型常量相似,也有传统的和严格的两种格式。

6逻辑型常量

逻辑型数据只有逻辑真和逻辑假两个值。前后两个句点作为逻辑型常量的定界符是必不可少的,否则会被误认为变量名。逻辑型数据只占用1字节。考点2 变量

Visual FoxPro中变量分为字段变量和内存变量二其中字段变量就是表中的字段。内存变量是内存中的一块存储区域,变量值就是存放在这个存储区域里的数据,变量的类型取决于变量值的类型。内存变量的数据类型包括:字符型(C)、数值型(N)、货币型(Y)、日期型(D)、日期时间型(T)和逻辑型(L)。

1简单的内存变量

每一个变量都有一个名字,可以通过变量名访问变量。如果当前表中存在一个同名的字段变量,则在访问内存变量时,必须在变量名前加上前缀M.(或M->),否则系统将访问同名的字段变量。

2数组

与简单内存变量不同,数组在使用之前一般要用DIMENSION或DECLARE命令显示创建,规定数组是一维数组还是二维数组,数组名和数组大小。数组大小由下标值的上、下限决定,下限规定为1。在使用数组和数组元素时,应注意如下问题。

(1)在一切使用简单内存变量的地方,均可以使用数组元素。

(2)在赋值和输入语句中使用数组名时,表示将同一个值同时赋给该数组的全部数组元素。

(3)在同一个运行环境下,数组名不能与简单变量名重复。

(4)在赋值语句中的表达式位置不能出现数组名。

(5)可以用一维数组的形式访问二维数组。考点3 内存变量常用命令

1内存变量的赋值

格式1:<内存变量名>=<表达式>

格式2:STORE<表达式>TO<内存变量名表>

2表达式值的显示

格式1:?<表达式表>

格式2:??<表达式表>

3内存变量的显示

格式1:LIST MEMORY[LIKE<通配符>][TO PRINTER!TO FILE<文件名>]

格式2:DISPLAY MEMORY[LIKE<通配符>][TO PRINTER|TO FILE<文件名>]

4内存变量的清除

格式1:CLEAR MEMORY

格式2:RELEASE<内存变量名表>

格式3:RELEASE ALL[EXTENDED]

格式4:RELEASE ALL[LIKE<通配符>|EXCEPT<通配符>]

5表中数据与数组数据之间的交换

将表的当前记录复制到数组。

格式1:SCATTER[FIELDS<字段名表>][MEMO]TO<数组名>[BLANK]

格式2:SCATTER[FIELDS LIKE<通配符>|FIELDS EXCEPT<通配符>][MEMO]TO<数组名>[BLANK]

将数组数据复制到表的当前记录。

格式1:GATHER FROM<数组名>[FIELDS<字段名表>][MEMO]

格式2:GATHER FROM<数组名>[FIELDS LIKE<通配符>|FIELDS EXCE<通配符>][MEMO] 小提示:

如果当前表中存在一个同名的字段变量,则在访问内存变量时,必须在内存变量名前加上前缀M.(或M->),否则系统访问的将是同名的字段变量。3.2 表达式

考点4 数值、字符与日期时间表达式

1数值表达式

(1)算术运算优先级。数值表达式中的算术运算符有些与日常使用的运算符稍有Lx=别,算术运算符及其含义和优先级如表3-1所示。

表3-1 算术运算符及其优先级

(2)求余运算。求余运算%和取余函数MOD()的作用相同。余数的正负号与除数一致当表达式中出现*、/和%运算时,它们具有相同的优先级。

2字符表达式

由字符串运算符将字符型数据连接起来形成,其结果仍是字符型数据字符型数据只能进行两种运算(+、-),它们的优先级相同。

“+”首尾连接前后两个字符串形成一个新的字符串;“-”连接前后两个字符串,并将前字符串的尾部空格移到合并后的新字符串尾部 3日期时间表达式

日期时间表达式中可以使用的运算符也有“+”和“-”两个,其格式也有一定的限制,不能任意组合,如不能用运算符“+”将两个<日期>连接起来。考点5 关系表达式

1关系表达式

关系表达式通常也称为简单逻辑表达式,它是由关系运算符将两个运算对象连接起来而形成的,即:<表达式><关系运算符><表达式>。关系运算符及其含义如表3-2所示,它们的优先级相同。表3-2 关系运算符

2设置字符的排序次序

当比较两个字符串时,系统对两个字符串的字符自左向右逐个进行比较;一旦发现两个对应字符不同,就根据这两个字符的排序序列决定两个字符串的大小

3字符串精确比较与EXACT设置

在用双等号运算符==比较两个字符串时,只有当两个字符串完全相同(包括空格及各字符的位置)时,运算结果才会是逻辑真.T.,否则为逻辑假.F.。考点6 逻辑表达式

1逻辑表达式

逻辑运算符的运算规则如表3-3所示,其中各代表两个逻辑型常量。

表3-3 逻辑运算规则

2运算符优先级

.NOT.或!(逻辑非)、.AND.(逻辑与)、.OR.(逻辑或)依次降低。小提示:

表达式是指常量、变量、函数或由它们通过特定的运算符连接起来的式子。3.3 常用函数 考点7 数值函数

数值函数是指函数值为数值的一类函数,它们的自变量和返回值往往都是数值型数据。

1绝对值和符号函数

格式:ABS<数值表达式>)

SIGN(<数值表达式>)

功能:ABS()返回指定的数值表达式的绝对值。SIGN()返回指定数值表达式的符号。

2求平方根函数

格式:SQRT(<数值表达式>)

功能:返回指定表达式的平方根,表达式的值不能为负。

3圆周率函数

格式:PI()

功能:返回圆周率二,该函数没有自变量。

4求整数函数

格式:INT(<数值表达式>)CEILING(<数值表达式>)FLOOR(<数值表达式>)

功能:INT()返回指定数值表达式的整数部分。CEILING()返回大于或等于指定数值表达式的最小整数。FLOOR()返回小于或等于指定数值表达式的最大整数。5四舍五入函数

格式:ROUND(<数值表达式I>,<数值表达式2>)

功能:返回<数值表达式I>在指定位置四舍五入后的结果,<数值表达式2>指明四舍五入的位置。若<数值表达式2>大于等于0,表示的是要保留的小数位,若小于。,则表示整数部分的舍入位数。

6求余数函数

格式:MOD(<数值表达式1>,<数值表达式2>)

功能:返回两个数相除后的余数。余数的正、负号与除数相同。如果被除数与除数同号,则函数值为两数相除的余数;如果异号,则函数值为两数相除的余数再加上除数的值。

7求最大值和最小值函数

格式:MAX(<数值表达式1>,<数值表达式2>[,<数值表达式3>„])MIN(<数值表达式1>,<数值表达式2>[,<数值表达式3>„])

功能MAX()返回自变量中的最大值。MIN()返回自变量中的最小值。考点8 字符函数

1求字符串长度函数

格式:LEN(<字符表达式>)

功能:返回指定字符表达式值的长度,即字符个数。

2大小写转换函数

格式:LOWER(<字符表达式>)UPPER(<字符表达式>)

功能:LOWER()将指定表达式中的大写字母转换成小写字母,其他字符保持不变;UPPER()将指定表达式中的小写字母转换成大写字母,其他字符保持不变。

3空格字符串生成函数

格式:SAPCE(<数值表达式>)

功能:返回由指定数目的空格组成的字符串。

4侧除前后空格函数

格式:TRIM(<字符表达式>)LTRIM(<字符表达式>)ALLTRIM(<字符表达式>)

功能:TRIM()删除指定表达式尾部的空格。LTRIM()删除指定表达式前端的空格。ALLTRIM()删除指定字符串前端和尾部的空格。

5取子串函数

格式:LEFT(<字符表达式>,<长度>)RIGHT(<字符表达式>,<长度>)SUBSTR(<字符表达式>,<起始位置>[,<长度>])

功能:LEFT()从指定表达式左端截取一个指定长度的子串作为函数值。RIGHT()从指定表达式右端载取一个指定长度的子串作为函数值。SUBSTR()从指定表达式指定位置截取一个指定长度的子串作为函数值,若默认<长度>,则截取的子串表示从指定位置开始一直到字符串尾部。

6计算子串出现次数函数

格式:OCCURS(<字符表达式1>,<字符表达式2>)

功能:返回第一个字符串在第二个字符串中出现的次数。

7求子串位置函数

格式:AT(<字符表达式1>,<字符表达式2>[,<数值表达式>])ATC(<字符表达式1>,<字符表达式2>[,<数值表达式>])

功能:AT()返回第一个字符串的首字符在第_二个字符串中出现的位置。前提条件是第一个字符串必须是第二个字符串的子串,否则函数返回值为0。ATC()功能与AT()类似,但不区分字符串中字符的大小写。

8子串替换函数

格式:STUFF<字符表达式1>,<起始位置>,<长度>,<字符表达式2>)

功能:用<字符表达式2>的值替换<字符表达式I>中由<起始位置>和<长度>指定的一个子串。

9字符替换函数

格式CHRTRAN(<字符表达式1>,<字符表达式2>,<字符表达式3>)

功能:该函数的自变量是三个字符表达式。当第一个字符串中的一个或多个字符与第二个字符串中的某个字符相匹配时,应用第三个字符串中的对应字符(相同位置)替换这些字符如果第三个字符串包含的字符个数少于第二个字符串包含的字符个数,因为没有对应字符,那么第一个字符串中相匹配的各字符将被删除。如果第三个字符串包含的字符个数多于第二个字符串包含的字符个数,多余字符将被忽略。

10字符串匹配函数

格式:LIKE(<字符表达式I>,<字符表达式2>)

功能:比较两个字符串对应位置_L的字符。其中<字符表达式1>中可包含通配符*和?。*表示若干个任意字符,?表示任意一个字符。考点9 日期和时间函数

1系统日期和时间函数

格式:DATE()TIME()DATETIME()

功能:DATE()返回当前系统日期,函数值为日期TIME()以24小时制返回当前系统时间,函数值为字符型;DATETIME()返回肖前系统日期时间,函数值为日期时间型。

2求年份、月份和天数的函数

格式:YEAR(<日期表达式>|<日期时间表达式>)MONTH(<日期表达式>|<日期时间表达式>)DAY(<日期表达式>|<日期时间表达式>)

功能:YEAR()从指定的日期表达式或日期时间表达式中返回年份。MONTH()从指定的日期表达式或日期时间表达式中返回月份DAY()从指定的日期表达式或日期时间表达式中返回月份的天数。这3个函数的返回值均为数值型数据

3求时、分和秒的函数

格式:HOUR(<日期时间表达式>)MINUTE(<日期时间表达式>)SEC(<日期时间表达式>)

功能:HOUR()从指定的日期时间表达式中返回小时部分(24小时制)。MINUTE()从指定的日期时间表达式中返回分钟部分。SEC()从指定的日期时间表达式中返回秒钟部分。考点10 数据类型转换函数

数据类型转换函数的功能是将某一种类型的数据转换成另一种类型的数据。

1数值转换成字符串函数

格式:STR(<数值表达式>[,<长度>[,<小数位数>]])

功能:将<数值表达式>的值转换成字符串,转换时根据需要自动四舍五入。

2字符串转换成数值函数

格式:V AL(<字符表达式>)

功能:将由数字符号(包括符号、小数点)组成的字符型数据转换成相应的数值型数据。

3字替串转换成日期或日期时间函数

格式:CTOD(<字符表达式>)CTOT<字符表达式>)

功能:CTOD()将<字符表达式>转换成日期型数据CTOT()将<字符表达式>转换成日期时间型数据。

4日期或日期时间转换成字符串函数

格式:DTOC(<日期表达式>|<日期时间表达式>[,1])TTOC(<日期时间表达式>[,1])

功能:DTOC()将日期型数据或日期时间型数据的日期部分转换成字符串。TTOC()将日期时间型数据转换成字符串。

5宏替换函数

格式:&<字符型变量>[.]

功能:替换出字符型变量的内容,即&的值是变量中的字符串。如果该函数与其后面的字符无明显分界,则要用“.”作为函数结束标识宏替换可以嵌套使用。考点11 测试函数

1值域测试函数

格式:BETWEEN(<表达式1>,<表达式2>,<表达式3>)

功能:判断一个表达式的值是否介于其他两个表达式的值之间。

2空值(NULL)测试函数

格式:ISNULL(<表达式>)

功能:判断一个表达式的运算结果是否为NULL值。

3“空”值测试函数

格式:EMPTY(<表达式>)

功能:略。

4数据类型测试函数

格式:VARTYPE(<表达式>[,<逻辑表达式>])

功能:测试表达式的类型,返回一个大写字母,函数值为字符型。字母含义如表3-4所示。

表3-4 VARTYPE()测得的数据类型

5表文件尾测试函数

格式:EOF([<工作区号>|<表别名>])

功能:测试当前表文件(若默认自变量)或指定表文件中的记录指针是否指向文件尾,若是,则返回逻辑真(.T.),否则为逻辑假(.F.)。若在指定工作区上没有打开表文件,则函数返回逻辑假(.F.),若表文件中不包含任何记录,则函数返回逻辑真(.T.)。

6表文件首测试函数

格式:BOF([<工作区号>|<表别名>])

功能:测试当前表义件(若默认自变量)或指定表文件中的记录指针是否指向文件首,若是,则返回逻辑真(.T.),否则为逻辑假(.F.)(若在指定工作区上没有打开表文件,则函数返回逻辑假(.F.),若表文件中不包含任何记录,则函数返回逻辑真(.T.)。

7记录号测试函数

格式:RECNO([<工作区号>|<表别名>])

功能:返回当前表文件(若默认自变量)或指定表文件中当前记录的记录号。如果指定工作区上没有打开表文件,则函数值为0;如果记录指针指向文件尾,则函数值为表文件中的记录数加1;如果记录指针指向文件首,则函数值为表文件中第一条记录的记录号。

8记录个数测试函数

格式:RECCOUNT([<工作区号>|<表别名>])

功能:返回当前表文件(若默认自变量)或指定表文件中的记录个数。如果指定工作区上没有打开表文件,则函数值为0,RECCOUNT)函数不受删除标记及SET DELETED设置的影响,同样测试表中所有的记录个数。

9条件测试函数

格式:IIF(<逻辑表达式>,<表达式1>,<表达式2>)

功能:测试<逻辑表达式>的值,若为逻辑真(.T.),则函数返回<表达式1>的值,否则返回<表达式2>的值<表达式1>和<表达式2>的类型可以不相同。

10记录删除测试函数

格式:DELETED([<工作区号>|<表别名>])

功能:测试当前表文件(若默认自变量)或指定表文件中,记录指针所指的当前记录是否有删除标记“*”。若有,则为真,否则为假。

全国计算机等级考试二级VF考点分析之VF数据库及其操作(第四章)4.1 Visual FoxPro数据库及其建立 考点1 建立和使用数据库

1数据库的建立

(1)在项目管理器中建立数据库。

(2)通过“新建”对话框建立数据库。

(3)使用命令建立数据库,格式为:

CREATE DATABASE[DatabaseName |?]

2数据库的打开

(1)在项目管理器中打开。

(2)通过“打开”对话框打开数据库。

(3)使用命令打开数据库,格式为:

OPEN DATABASE[FileName |?][EXCLUSIVE I SHARED] [NOUPDATE] [VALIDATE] 考点2 修改和删除数据库

Visual FoxPro在建立数据库时建立了扩展名分别为dbc、dct和dcx的3个文件,用户不能直接修改这些文件。

Visual FoxPro中修改数据库实际是打开数据库设计器,完成数据库中各种对象的建立、修改和删除等操作。

可以有3种方法打开数据库设计器。

(1)从项目管理器中打开数据库设计器。

(2)从“打开”对话框中打开数据库设计器。

(3)使用命令打开数据库设计器,格式为: MODIFY DATABASE[DatabaseName|?]

在项目管理器中不管删除还是移去数据库文件,都不会删除其所包含的各个对象做口数据表)。如果要在删除数据库的同时删除其所包含的数据表,就必须使用命令,格式为: DELETE DATABASE DatabaseName|?[DELETETABLES][RECYCLE] 小提示:

在Visual FoxPro中,Open DataBase和Modify DataBase命令的区别在于:Open DataBase打开的只是数据库的工作环境,并不会进入数据库设计器;Modify DataBase是打开数据库设计器。

4.2 建立数据库表 考点3 在数据库中建立表

在数据库中建立数据表,最直接的方法就是在数据库设计器中利用鼠标右键单击空白处,选择“新建表”命令,在弹出的表设计器中设置数据表结构。另外可以在命令窗口利用OPEN DATA命令先打开数据库,然后利用CREATE命令打开表设计器进行数据表设计,如图4-l所示。

图4-1 表设计器

1字段名

(l)自由表字段名最长为10个字符。

(2)数据库表字段名最长为128个字符。

(3)字段名必须以字母或汉字开头。

(4)字段名可以由字母、汉字、数字和下划线组成。

(5)字段名中不能包含空格。

2字段类型和宽度

(1)字符型:可以是字母、数字等各种字符型文本,如用户名称。

(2)货币型:货币单位,如货物价格。

(3)数值型:整数或小数,如订货数量。

(3)浮点型:功能类似于“数值型”,其长度在表中最长可达20位。

(4)日期型:由年、月、日构成的数据类型,如订货日期。

(5)日期时间型:由年、月、日、时、分、秒构成的数据类型,如员工上班的时间。

(6)双精度型:双精度数慎类型,一般用于要求精度很高的数据。

(7)整型:不带小数点的数值类型,如订单的行数。

(8)逻辑型:值为“真”(.T.)或假(.F.),如表示订单是否已执行完。

(9)备注型:不定长的字符型文本。在表中占4个字节,表备注型文件的扩展名为FPT。

(10)通用型:用于标记电子表格、文档、图片等OLE对象,在表中占4个字节。

(11)字符型(二进制)。

(12)备注型(二进制)。

3空值

一个字段是否允许为空值与实际应用有关,比如作为关键字的字段是不允许为空值的,而那些在插入记录时允许暂缺的字段值往往允许为空值。

4字段有效性组框

在字段有效性组框中可以定义字段的有效性规则、违反规则时的提示信息和字段的默认值。

5显示组框

在显示组框下可以定义字段显示的格式、输入的掩码和字段的标题。输入掩码是字段的一种属性,用限制或控制用户输入的格式。标题用于字段显示时的标题,如果不指定标题则显示字段名。当字段名是英文或缩写时,则通过指定标题可以使界面更友好。

6字段注释

可以为每个字段添加注释,便于日后或其他人对数据库进行维护。考点4 修改表结构

在Visual FoxPro中可以对表结构任意修改,修改表结构和建立表结构时,表设计器界面完全一样。修改数据表结构时,首先应该用USE命令打开要修改的数据表,然后利用MODIFY STRUCTURE打开表设计器进行修改,具体操作有以下几种。

(1)修改已有字段。

(2)添加新字段。

(3)删除不用的字段。4.3 表的基本操作 考点5 使用浏览器操作表

在交互式工作方式下,最简单、方便的方法就是使用BROWSE浏览器浏览表,打开浏览器的方法有多种。在项目管理器中将数据库展开至表,然后单击“浏览”按钮,或直接在窗口中输入BROWSE命令(首先应该打开表文件)。

1浏览器操作

(1)下一记录(下箭头键)。

(2)前一记录(上箭头键)。

(3)下一页(PageDown键)。

(4)上一页(PageUp键)。

(5)下一字段(Tab键)。

(6)前一字段(Shift+Tab键)。

2修改记录

只需将光标定位到要修改的记录和字段上,就可以进行修改了。

3删除记录

Visual FoxPro中删除记录有逻辑删除和物理删除两种,逻辑删除只在记录旁做删除标记(如图4-2所示),必要时可以进行恢复物理删除是在逻辑删除的基础上真正地将记录从表中删除。要在浏览器中删除有删除标记的记录,可选择“表/彻底删除”菜单命令。

图4-2 增加和删除记录

考点6 增加、删除、修改和显示记录的命令

1增加记录

APPEND命令是在表的尾部增加记录,格式有如下两种。

格式1:APPEND

格式2:APPEND BLANK

2插入记录

格式:INSERT [BEFORE][BLANK]

3删除记录

删除记录有物理删除和逻辑删除两种,Visual FoxPro用来删除记录的命令如下。

(1)设置删除标记的命令

格式:DELETE [FOR lExpressionl]

说明:如果不使用FOR短语指定逻辑条件,则只删除当前记录,否则逻辑删除满足条件的所有记录。

(2)恢复记录的命令。

格式:RECALL [FOR lExpressionl]

说明:使用该命令恢复表中逻辑删除的记录,短语FOR的功能同上。

(3)物理删除有删除标记的记录

格式:PACK

说明:此命令用来物理删除当前表中所有带删除标记的记录。

(4)物理删除表中的全部记录

格式:ZAP

说明:不管表中记录是否带有删除标记,此命令可以一次性将当前表中的记录全部物理删除,但表结构仍保留使用此命令相当于DELETE ALL与 PACK的连用。

4修改记录

在Visual FoxPro中可以交互修改记录,也可以用指定值直接修改记录。

(1)用EDIT或CHANGE命令交互式修改。

(2)用REPLACE命令直接修改。

5显示记录

格式:LIST/DISPLAY [[FIELDS]FieldList][FOR LExpressionl][OFF] [TO PRINTER[PROMPT]|TO FILE FileName] 考点7 查询定位的命令

(1)用GOTO命令直接定位

(2)SKIP命令

(3)用LOCATE命令定位。

LOCATE命令是按条件定位记录位置,格式为: LOCATE FOR IExpressionl LOCATE命令常用结构如下。LOCATE FOR IExpression1 DO WHILE FOUND()****处理数据*** CONTINUE ENDDO 小提示:

连续使用DELETE ALL和PACK命令,其操作结果与ZAP命令一样,都可以将表中的所有记录一次性物理删除。4.4 索引与排序 考点8 索引的基本概念

索引是对表中的记录按照某种逻辑顺序重新排列。

(l)主索引:在指定的字段或表达式中不允许出现重复值的索引,且一个表只能创建一个主索引。

(2)候选索引:具有与主索引相同的性质和功能,但一个表中可以创建多个候选索引,其指定的字段或表达式中也不允许出现重复值。

(3)唯一索引:它的“唯一性”是指索引项的唯一,而不是字段值的唯一。但在使用该索引时,重复的索引段值只有唯一一个值出现在索引项中。

(4)普通索引:不仅允许字段中出现重复值,并且索引项中也允许出现重复值。考点9 索引的建立

1单项索引

在表设计器界面中有“字段”、“索引”和“表”3个选项卡,在“字段”选项卡中定义字段时就可以直接指定某些字段是否为索引项,用鼠标单击定义索引的下拉列表框可以看到3个选项:无、升序和降序(默认是无)。如果选定升序或降序,则在对应的字段上建立一个普通索引,索引名与字段名同名,索引表达式就是对应的字段。

2复合字段索引

(1)在“索引”选项卡中的索引名栏目中输入索引名。

(2)在索引类型的下拉框中选择索引类型。

(3)单击表达式栏右侧的按钮,打开表达式生成器。

(4)在“表达式”文本框中输入索引表达式(如图4-3所示),最后单击“确定”按钮。

图4-3 表达式生成器界面

3使用命令建立索引

格式:INDEX ON eExpression TO IDXFileName | TAG TagName[OF CDXFileName] [FOR lExpression][COMPACT] [ASCENDING | DESCENDING] [UNIQUE | CANDIDATE] [ADDITIVE]

从索引的组织方式来讲,索引共有3种类型。

(1)单独的IDX索引,是一种非结构索引。

(2)采用非默认名的CDX索引,也是一种非结构复合索引。

(3)与表同名的CDX索引,是结构复合索引。

结构复合索引文件可随表的打开而打开,在同一个索引文件中能包含多个索引方案或索引关键字,在添加、更改或删除记录时自动维护索引。考点10 索引的使用

(l)打开索引文件,格式为: SET INDEX TO Indexfilelist

(2)设置当前索引,格式为:

SET ORDER TO[nIndexNumber |[TAG]TagName][ASCENDING|DESCENDING]

(3)使用索引快速定位,格式为:

SEEK eExpression[ORDER nIndexNumber|[TAG]TagName][ASCENDING| DESCENDING]

(4)删除索引,格式为:

DELETE TAG TagNamel &&TagName1为索引名

要删除全部索引,可使用命令:DELETE TAG ALL 考点11 排序

索引可以使用户按照某种顺序浏览或查找表中的记录,这种顺序是逻辑的,如要对表中的记录按物理顺序重新排列,可使用SORT命令,格式为:

SORT TO TableName ON FieldNainel[/A}/D][/C][,FieldName2[/A|/D][/C]„][ASCEND ING | DESCENDING][FOR lExpressionl][FIELDS FieldNameList] 小提示:

在数据库表中只能有一个主索引,且只能在表设计器中建立。其他3种索引可以建立多个,既能在表设计器中建立,也能以命令方式建立,但在自由表中不能为其创建主索引,只能创建后3种索引,同样也可以建立多个。4.5 数据完整性

考点12 实体完整性与主关键字

(1)实体完整性是保证表中记录唯一的特性,即在同一个表中不允许有重复的记录出现。在Visual Pro中通过主索引和候选索引来保证数据的实体完整性。

(2)如果一个字段的值或几个字段的值能够唯一标志表中的一条记录,则称这个字段为候选关键字。在Visual FoxPro中将主关键字称做主索引,将候选关键字称为候选索引。考点13 参照完整性与表之间的关联

1建立表之间的联系

参照完整性与表之间的联系有关,其含义大致是:当插入、删除或修改一个表中的数据时,通过参照引用相互关联的另一个表中的数据,检查对表的数据操作是否正确。

在数据库设计器中设计表之间的联系时,要在父表中建立主索引,在子表中建立普通索引,然后通过父表主索引和子表的普通索引建立起两个表之间的联系。

2设置参照完整性约束

建立参照完整性之前,首先必须清理数据库,即物理删除表中被逻辑删除的记录,然后选择两个关联表之间的连线并选择“数据库”、“编辑参照完整性”菜单命令,打开如图4-4所示的“参照完整性生成器”对话框。

图4-4 “参照完整性生成器”对话框 小提示:

欲建立两表之间的联系,首先用鼠标选中一个表的主索引,按住鼠标左键不放,并拖动鼠标到另一个表的索引上,这时鼠标箭头变成小矩形状,最后释放鼠标。4.6 自由表

考点14 数据库表与自由表

自由表是不属于任何数据库的表。在没有打开数据库时,所建立的表就是自由表。数据库表与自由表之间可以相互转化。

1建立自由表的方法

(1)在项目的“数据”选项卡中选择“自由表”,单击“新建”按钮。

(2)在没有打开数据库的情况下,通过“新建”对话框,选择“表”并单击“新建文件”按钮。

(3)在没有打开数据库的情况下,在命令窗口输入CREATE命令,新建自由表。

2数据库表相对于自由表的特点

(l)数据库表可以使用长表名,在表中可以使用长字段名。

(2)可以为数据库表中的字段指定标题和添加注释。

(3)可以为数据库表中的字段指定默认值和输入掩码。

(4)数据库表的字段有默认的控件类。

(5)可以为数据库表规定字段级规则和记录级规则。

(6)数据库表支持主关键字、参照完整性和表之间的联系。

(7)支持INSERT,UPDATE和DELETE事件的触发器。考点15 将自由表添加到数据库中

(1)在数据库设计器中可利用“数据库”→“添加表”菜单命令,在“打开”对话框中选择自由表文件,将其添加到数据库中。

(2)直接用命令方式将自由表添加到当前数据库中,格式为: ADD TABLE TableName|?[NAME LongTableName] 考点16 从数据库中移出表

(1)直接利用命令移出数据库表,格式为:

REMOVE TABLE TableName |?[DELETE][RECYCLE]

(2)从项目管理器中移出数据库。

(3)从数据库设计器中移出数据库。4.7 多个表的同时使用

在Visual FoxPro中,一次可以打开多个数据库,每个数据库都可以打开多个数据表。考点17 多工作区的概念

指定工作区的命令格式为SELECT nWorkArea | cTableAlias,每个表打开后都有两个默认别名,一个是表的自身名,另一个是工作区所对应的别名。在前10个工作区中指定的默认别名是工作区字母A~J,其后面的工作区所对应的别名为W11~W32767。

另外还可以在USE命令中通过ALIAS短语指定表别名。

例如:USE学生表IN 1 ALIAS student,为学生表指定了别名student。考点18 使用不同工作区的表

除了使用SELECT命令切换不同的工作区之外,也可以在一个工作区使用其他工作区的数据表。即通过短语:IN nWorkArea|cTableAlias。在表别名后加上“.”或“->”操作符,可在一个工作区中直接调用其他工作区中数据表的记录。例如当前工作区号为2,要调用1区上学生表中的班级号的相关字段,可使用命令:

学生表.班级号 或学生表->班级号或A.班级号或A->班级号 考点19 表之间的关联

使用SET RELATION命令建立表间记录指针的临时联系(关联)。

格式:SET RELATION TO eExpressionl INTO nWorkAreal I cTableAliasl。

说明:eExpressionl是指建立临时联系的索引关键字,一般是父表的主索引,子表的普通索引。用工作区号 nWorkAreal或表的别名cTableAlias I说明临时联系是由当前工作区的表到哪个表。

利用SET RELATION TO命令将取消当前表到所有表的临时联系。

全国计算机等级考试二级VF考点分析之关系数据库标准语言SQL 5.1 SQL概述 考点1 概述

1概念

SQL是结构化查询语言Structured Query Language的缩写。它包括数据查询、数据定义、数据操纵和数据控制4部分。Visual FoxPro在SQL方面支持数据定义、数据查询和数据操纵功能。另外,由于Visual FoxPro自身在安全控制方面的缺陷,所以它没有提供数据控制功能。

SQL语言的特点

(1)一种一体化的语言。

(2)一种高度非过程化的语言。

(3)语言非常简洁。

(4)可以直接以命令方式交互使用,也可以以程序方式使用。5.2 查询功能

SQL的核心是查询,基本形式由SELECT-FROM-WHERE查询块组成,多个查询块可嵌套执行,如表5-1所示。

表5-1 SQL命令动词

考点2 简单查询

1简单查询

简单查询是由SELECT和FROM短语构成的无条件查询,或由SELECT,FROM和WHERE短语构成的条件查询。

2简单的连接查询

连接是关系的基本操作之一,连接查询是一种基于多个关系的查询。

3嵌套查询

嵌套查询所要求的结果出自一个关系,但关系的条件却涉及多个关系。其内层基本上也是一个SELECT-FROM-WHERE查询语句。这种简单嵌套查询,可使用谓词IN或NOT IN来判断在外层的查询条件中是否包含内层查询的结果。考点3 特殊运算符号

BETWEEN„AND„

含义:该查询的条件是在„„范围之内,相当于用AND连接的一个逻辑表达式。

LIKE

含义:它是一个字符串匹配运算符,与之搭配使用的通配符包括“*”和“?”。考点4 排序

使用SQL SELECT可以将查询结果进行排序,排序的短语是ORDER BY。

格式:ORDER BY Order_Item[ASCIDESC][,Order_Item[ASC|DESC]„]

说明:可以按升序(ASC)或降序(DESC)排序,允许按一列或多列排序。考点5 计算查询

1简单的计算查询

SQL不仅具有一般的检索能力,而且还有计算方式的检索,用于计算检索的函数有:COUNT(计数)、SUM(求和)、AVG(计算平均值)、MAX(求最大值)及MIN(求最小值)。

2分组与计算查询

在SQL SELECT中可以利用GROUP BY子句进行分组计算查询。

格式:GROUP BY GroupColumn[,GroupColumn„][HAVING FilterCondition]

说明:可以按一列或多列分组,还可以用HAVING子句进一步限定分组的条件。它必须跟在GROUP BY子句之后,不可单独使用,与WHERE子句并不矛盾。考点6 别名和自连接查询

(1)SQL语句允许在二OM短语中为关系定义别名,格式为:一 <关系名><别名>

(2)SQL不仅可以对多个关系进行连接操作,也可以将同一关系与其自身进行连接,这种连接就称为自连接。在关系的自连接操作中,别名是必不可少的。考点7 使用量词和谓词的查询

与嵌套查询或子查询有关的运算符,除了IN和NOT IN运算符外,还有两类与子查询有关的运算符,它们有以下两种格式。

(1)<表达式><比较运算符>[ANY I ALL | SOME](子查询)

(2)[NOT]EXISTS(子查询)

EXISTS是谓词,EXISTS或NOT EXISTS是用来检查在子查询中是否有结果返回,即存在元组或不存在元组。其本身并没有进行任何运算或比较,只用来返回子查询结果。考点8 超链接查询

(1)在新的SQL标准中支持两个新的关系连接运算符,这两个新的连接运算是左连接(*=)和右连接=*):首先保证一个表中满足条件的元组都在结果表中,然后将满足连接条件的元组与另一个表的元组进行连接,不满足连接条件的则应将来自另一个表的属性值置为空值。在一般SQL中超链接运算符是“*=”(左连接)和“=*”(右连接)。

(2)在Visual FoxPro中不支持超链接运算符“*=”和“=*”,Visual FoxPro有专门的连接运算。下面拼出SQL中超链接的部分语句格式:

SELECT„ FROM Table INNER|LEFT|RIGHT|FULL JOIN Table ON JoinCondition WHERE„

考点9 Visual FoxPro中SQL SELECT的几个特殊选项

(l)显示部分结果,格式为: TOP nExpr[PERCENT]

(2)将查询结果存放到数组中,格式为: INTO ARRAY ArrayName

(3)将查询结果存放到临时文件中,格式为: INTO CURSOR CursorName

(4)将查询结果存放到永久表中,格式为: INTO DBF|TABLE TableName

(5)将查询结果存放到文本文件中,格式为: TO FILE FileName[ADDITIVE]

(6)将查询结果直接输出到打印机,格式为: TO PRINTER[PROMPT] 5.3 操作功能 考点10 插入

Visual FoxPro支持两种SQL插入命令的格式,一种是标准格式,另一种是特殊格式。

1标准格式

INSERT INTO dbf name[(frame 1[,fname2,„])] VALUES(eExpressionl[,eExpression2,„])

2特殊格式

INSERT INTO dbf _name FROM ARRAY ArrayName|FROM MEMVAR 考点11 更新

SQL的数据更新命令格式如下: UPDATE TableName

SET Column_Namel=eEpressionl[,Column_Name2=eExpression2„] WHERE Condition

说明:利用WHERE字句指定条件,以更新满足条件的一些记录的字段值,并巨一次可更新多个字段;如果不使用WHERE子句,则更新全部记录。考点12 删除

SQL从表中删除数据的命令格式如下: DELETE FROM TableName[WHERE Condition]

说明:FROM指定从哪个表中删除记录,WHERE指定被删除的记录所满足的条件,如果不使用WHERE子句,则删除该表中的全部记录。小提示:

当一个表定义一个主索引或候选索引后,由于相应的字段具有关键字的特性,即不能为空,所以只能用此命令插入记录、)APPEND和INSERT都是插入一条空白记录再输入各字段的值,故不能用它们来插入记录。5.4 定义功能 考点13 表的定义

利用SQL命令建立的数据表同样可以完成在表设计器中设计表的所有功能。

格式:CREATE TABLE I DBF TableNamel[NAME LongTableName][FREE](FieldNarnel FieldType[(nFieldWidth[,nPrecision])][NULL |NOT NULL] [CHECK IExpressionl [ERROR cMessageTextl]] [DEFAULT eExpressionl] [PRIMARY KEY I UNIQUE] [PEFERENCES TableName2[AG TagName1]] [NOCPTRANS] [,FieldName2„]

[,PRIMARY KEY eEpression2 TAG TagName2|,UNIQUE eExpression3 TAG TagName3] [,FOREIGN KEY eExpression4 TagName4[NODUP] REFERENCES TableName3 [TAG TagName5]] [,CHECK lExpression2[ERROR cMessageText2]])|FROM ARRAY ArravNasne

说明:此命令除了建立表的基本功能外,还包括满足实体完整性的主关键字(主索引)PRIMARY KEY、定义域完整性的CHECK约束及出错提示信息ERROR、定义默认值DEFAULT等,另外还有描述表之间联系的FOREIGN KEY和REFERENCES等。考点14 表的删除

利用SQL命令删除表,可直接使用语句,格式为: DROP TABLE Table_name

说明:如果删除的是自由表,则应该将当前打开的数据库先关闭,才能进行删除。如果删除数据库表,则要先打开数据库,在数据库中进行操作二否则,即使删除了数据库表,但记录在数据库中的信息并没有被删除,此后会出现错误提示。考点15 表结构的修改

修改表结构的命令是ALTER TABLE,该命令有3种格式。

(1)ALTER TABLE TableNamel ADD| ALTER[COLUMN]FieldNamel FieldTvpe[(nFieldWidth[,nPrecision])][NULL |NOT NULL] [CHECK lExpressionl[ERROR cMessageTextl ]][DEFAULT eExpressionl] [PRIMARY KEY |UNIQUE] [REFERENCES TableName2[TAG TagNamel〕]

(2)ALTER TABLE TableNamel ALTER[COLUMN]FieldName2[NULL|NOT NULL] [SET EFAULTeExpression2][SET CHECK lExpression2[ERROR cMessageText2] [DROP DEFAULT][DROP CHECK]

(3)ALTER TABLE TableName1[DROP [COLUMN]FieldName3] [SET CHECK lExpression3[ERROR cMessageText3] [DROP CHECK] [ADD PRIMARY KEY eExpression3 TAG TagName2[FOR lExpression4]] [DROP PRIMARY KEY〕

[ADD UNIQUE eExpression4[TAG TagName3[FOR lExpression5]]] [DROP UNIQUE TAG TagName4] [ADD FOREIGN KEY[eExpression5] TAG TagName4[FOR lExpression6] REFERENCES TableName2[TAG TagName5]] [DROP FOREIGN KEY TAG TagName6[SAVE]] [RENAME COLUMN FieldName4 TO FieldName5] 考点16 视图的定义

1视图的概念及其定义

(l)视图的概念。

Visual FoxPro中视图是一个虚拟的表,可以是本地的、远程的或带参数的。

(2)视图的定义,格式为:

CREATE VIEW view name[(column_name[,column_name]„)] AS select_statement

2从单个表派生出来的视图

视图一经定义,就可以和基本表一样进行各种查询,也可以进行一些修改操作。对于最终用户来说,有时并不需要知道操作的是基本表还是视图。

3从多个表派生出来的视图

视图一方面可以限定对数据的访问,另一方面又可以简化对数据的访问。

4视图的删除

视图由于是从表派生出来的,所以不存在修改结构的问题,但是视图可以删除。

格式:DROP VIEW<视图名>

5关于视图的说明

在关系数据库中,视图始终不真正含有数据,它总是原有表的一个窗口。所以,虽然视图可以像表一样进行各种查询,但是插入、更新和删除操作在视图上却有一定限制。在一般情况下,当一个视图是由单个表导出时可以进行插入和更新操作,但不能进行删除操作;当视图是从多个表导出时,插入、更新和删除操作都不允许进行。这种限制是很有必要的,它可以避免一些潜在问题的发生。

全国计算机等级考试二级VF考点分析之查询与视图(第六章)

6.1 查询 考点1 查询设计器

1查询的概念

查询是从指定的表或视图中提取满足条件的记录,然后按照想得到的输出类型定向输出查询结果。查询以扩展名为QPR的文件保存在磁盘上的,这是一个文本文件,它的主体是SQL SELECT语句。

2查询的建立

建立查询可以使用“查询设计器”,但它的基础是SQL SELECT语句。建立查询的方法有以下几个方面。

(l)可以利用CREATE QUERY命令打开查询设计器建立查询。

(2)可以利用“新建”对话框打开查询设计器建立查询。

(3)可以在项目管理器的“数据”选项卡中打开查询设计器建立查询。

(4)可直接编辑QPR文件建立查询。

建立查询时,首先进入如图6-1所示的界面选择用于建立查询的表或视图,选择表或视图后,单击“添加”按钮。最后单击“关闭”按钮,进入如图6-2所示的查询设计器界面。

图6-1 为查询选择表或视图

查询设计器中的各选项卡和SQL SELECT语句的各短语是相对应的,对应关系如下。

“字段”――SELECT短语,用于指定要查询的数据

“连接”――JOIN ON短语,用于编辑连接条件。

“筛选”――WHERE短语,用于指定查询条件。

“排序依据”――ORDER BY短语,用于指定排序字段和排序方式。

“分组依据”――GROUP BY短语和HAVING短语,用于分组。

图6-2 查询设计器

3查询的运行

运行查询有下列两种方法。

(1)可以在项口管理器的“数据”选项卡中,展开“查询”选项,然后选择要运行的查询文件,单击“运行”按钮,可查看查询结果。

(2)在命令窗门执行命令DO QueryFile。

注意:此处的查询文件名是全名,包括扩展名QPR。

4查询去向

设计查询的目的不只是完成一种查询功能,在查询设计器中可以根据需要为查询输出定位查询去向。通过“查询”菜单卜的“查询去向”,或在“查询设计器”工具栏中单击“查询去向”按钮。“查询去向”对话框如图6-3所示

图6-3 “查询去向”对话框

各去向的含义如下。

(1)浏览:在“浏览"(BROWSE)窗口中显示查询结果,这是默认的输出去向。

(2)临时表:将查询结果存储于一个命名的临时只读表中。

(3)表:将结果保存在一个命名的数据表文件中。

(4)图形:查询结果可以用于Microsoft Graph。

(5)屏幕:在Visual FoxPro主窗口或当前活动输出窗口中显示查询结果。

(6)报表:将结果输出到一个报表文件。

(7)标签:将结果输出到一个标签文件。小提示:

在7种输出去向中,只有“浏览”和“屏幕”两种输出去向才能直接看到查询结果。6.2 视图

考点2 视图的概念与建立

1视图的概念

视图是操作表的一种手段,通过视图可以查询表,也可以更新表。视图是根据表定义的,因此视图基于表,而视图可以使应用更灵活,因此它又超越表。视图是数据库中的一个特有功能,只有在包含视图的数据库打开时才能使用。

视图兼有“表”和“查询”的特点,与查询相类似的地方是可以用来从一个或多个相关联的表中提取有用信息;与表类似的地方是可以用来更新其中的信息,并将结果永久性保存在磁盘上。

2视图的建立

(l)用CREATE VIEW命令打开视图设计器建立视图。

(2)利用“新建”对话框打开视图设计器建立视图。

(3)在项目管理器的“数据”选项卡中打开视图设计器建立视图。

(4)利用SQL命令CREATE VIEW...AS...建立视图。

3视图设计象

视图设计器(如图6一所示)与查询设计器基本上一样,主要有以下几点不同。

(1)视图的结果保存在数据库中,在磁盘上找不到类似的文件。

(2)视图可以用来更新数据,因此在设计器中多了一个“更新条件”选项卡。

(3)在视图中没有“查询去向”的问题。

图6-4 视图设计器 考点3 远程视图与连接

为了建立远程视图,必须首先建立连接远程数据库的“连接”,“连接”是Visual FoxPro数据库中的一种对象。

1定义数据源和连接

数据源一般是ODBC数据源,开放数据库互连ODBC是一种连接数据库的通用标准。为了定义ODBC数据源,必须首先安装ODBC驱动程序。

2建立连接

建立连接的方法有以下几种。

(1)用CREATE CONNECTION命令打开“连接设计器”,或完全用命令方式建立连接。

(2)通过“新建”对话框建立连接。

(3)在项目管理器的“数据”选项卡中建立连接。

3设计远程视图

利用数据源或连接建立的远程视图的SQL语法要符合远程数据库的语法,例如,SQL Server的语法和Visual FoxPro的语法就有所区别。考点4 视图与数据更新

视图是根据基本表派生出来的,所以把它叫做虚拟表为了通过视图能够更新基本表中的数据,需要在视图设计器的“更新条件”选项卡中的左下角选中“发送SQL更新”复选框。

1指定可更新的表

如果视图是基于多个表的,默认可以更新“全部表”的相关字段,如果要指定只能更新某个表的数据,则可以通过“表”下拉列表框选择表

2指定可更新的字段

在“字段名”列表框中列出了与更新有关的字段,在字段名左侧有两列标志,“钥匙”表示关键字,“铅笔”表示更新通过单击相应列可以改变相关的状态,默认可以更新所有非关键字字段,并且通过基本表的关键字完成更新,即Visual FoxPro用这些关键字字段来唯一标识那些已在视图中修改过的基本表中的记录建议不要改变关键字的状态,不要试图通过视图来更新基本表中的关键字字段值,如有必要,可以指定更新非关键字字段值

3检查更新的合法性

如图6-1所示,“SQL WHERE子句包括”框中的选项决定哪些字段包含在UPDATE或DELETE语句的WHERE子句中,Visual FoxPro正是利用这些语句将在视图中修改或删除的记录发送到远程数据源或基本表中,WHERE子句就是用来检查自从提取记录用于视图中后,服务器上的数据是否已经改变。

“SQL WHERE子句包括”框中各选项的含义如下。

(l)关键字段:当基本表中的关键字字段被改变时,更新失败。

(2)关键字和可更新字段:当基本表中任何标记为可更新的字段被改变时,更新失败。

(3)关键字和已修改字段:当在视图中改变的任一字段的值在基本表中已被改变时,更新失败。

(4)关键字和时间戳:当远程表上记录的时间戳在首次检索之后被改变时,更新失败。

4使用更新方式

“使用更新”框的选项决定当向基本表发送SQL更新时的更新方式。

(1)SQL DELETE然后INSERT:先用SQL DELETE命令删除基本表中被更新的旧记录,再用SQL INSERT命令向基本表中插入更新后的记录。

(2)SQL UPDATE:使用SQL UPDATE命令更新基本表。考点5 使用视图

视图建立后,不但可以用它来显示和更新数据,而且可以通过调整它的属性来提高性能,它的使用类似于表。

1视图操作

(1)在数据库中使用USE命令打开或关闭视图。

(2)在“浏览器”窗口中显示或修改视图中的记录。

(3)使用SQL语句操作视图。

(4)在文本框、表格控件、表单或报表中使用视图作为数据源。

2使用视图

视图一经建立就基本可以像基本表一样使用,适用于基本表的命令基本都可以用于视图。比如在视图上也可以建立索引,此索引当然是临时的,视图一关闭,索引自动删除,多工作区时也可以建立联系等。但视图不可以用MODIFY STRUCTURE命令修改结构。因为视图毕竟不是独立存在的基本表,它是由基本表派生出来的,只能修改视图的定义。

小提示:

查询与视图的区别是:查询可以定义输出去向,可以将查询的结果灵活地应用于表单、报表、图形等各种场合,但是利用查询不可以修改数据;而利用视图可以修改数据,可以利用SQL将对视图的修改发送到基本表,特别是对于远程表的操作,利用视图是非常有效的。

全国计算机等级考试二级VF考点分析之程序设计基础(第七章)7.l 程序与程序文件

考点1 程序的概念、建立与执行

1程序的概念

程序是能够完成一定任务的命令集合。这组命令被存放在称为程序文件或命令文件的文本文件中。当运行程序时,系统会按照一定的次序自动执行包含在程序文件中的命令。

2程序文件的建立与修改

程序文件的建立与修改一般是通过调用系统内置的文本编辑器来进行的。其建立步骤如下。

(l)打开文本编辑窗口。

(2)在文本编辑窗口中输入程序内容,此处所输入的程序命令不会马上被执行。

(3)编辑完成后,从“文件”菜单中选择“保存”命令或按快捷键Ctrl+W保存程序文件。

3打开或修改程序文件的方法

(1)从“文件”菜单中选择“打开”命令,弹出“打开”对话框。

(2)在“文件类型”列表框中选择“程序”。

(3)在文件列表框中选定要修改的文件,并单击“确定”按钮。

(4)编辑修改后,从“文件”菜单中选择“保存”命令或按快捷键Ctrl+W保存程序文件,若要放弃修改,可直接按Esc键,或从“文件”菜单中选择“还原”命令。

4程序文件的执行

程序文件建立后,可使用多种方式、多次执行它,常用的以下有两种方式。

(l)菜单方式。

(2)命令方式。考点2 简单的输入输出命令

程序一般都包含数据输入、数据处理和数据输出3个部分。

INPUT命令

格式:INPUT[<字符表达式>]TO<内存变量>

功能:该命令等待用户从键盘输入数据,当用户回车后,系统将表达式的值存入指定的内存变量。

注释:输入的数据可以是常量、变量,也可以是更为一般的表达式。但不能不输入任何内容直接按回车键输入字符串时必须加定界符,输入逻辑型常量时要用圆点定界(如.T.,.F.),则输入日期时间型常量时要用大括号(如{^2001-03-01})。

ACCEPT命令

格式:ACCEPT[<字符表达式>]TO<内存变量>

功能:该命令等待用户从键盘输入字符串,当用户回车后,系统将表达式的值存入指定的内存变量。

注释:该命令只能接收字符串。用户在输入字符串时不需要加定界符;否则,系统会把定界符作为字符串本身的一部分。如果不输入任何内容而直接按回车键,系统会把空串赋给指定的内存变量。

WAIT命令

格式:WAIT[<字符表达式>][TO<内存变量>][WINDOW[AT<行>,<列>]] [NOWAIT][CLEARINOCLEAR][TIMEOUT<数值表达式>]

功能:该命令显示字符表达式的值作为提示信息,暂停程序的执行,直到用户按任意键或单击鼠标时继续程序运行。

注释:<内存变量>用来保存用户输入的字符,其类型为字符型。若用户按的是Enter键或单击了鼠标,那么<内存变量>中保存的将是空串若不选TO <内存变量>短语,则输入的单字符不保留。小提示:

如果用DO命令执行查询文件、菜单文件,在文件名中必须要包括扩展名(QPR、MPR)。7.2 程序的基本结构

程序结构是指程序中命令或语句执行的流程结构,包括3种基本结构:顺序结构、选择结构和循环结构。考点3 顺序结构

顺序结构是最简单的程序结构,它是按命令在程序中出现的先后次序依次执行。考点4 选择结构

支持选择结构的语句包括条件语句和分支语句。

1条件语句

格式: IF<条件> <语句序列1> [ELSE> <语句序列2>] ENDIF

功能:该语句根据<条件>是否成立从两组代码中选择一组执行。

语句的执行流程图如图7-1和图7-2所示。

图7-1有ELSE的选择语句

图7-2无ELSE的选择语句

2分支语句

格式:DO CASE CASE<条件1> <语句序列1> CASE<条件2> <语句序列2> „„

CASE<条件n> <语句序列n> [OTHERWISE <语句序列>] ENDCASE

功能:语句执行时,依次判断CASE后面的条件是否成立。分支语句实现的是一种扩展的选择结构,可以根据条件从多组代码中选择一组执行。分支语句的流程如图7-3所示。

图7-3 多分支语句 考点5 循环结构

循环结构也称为重复结构,是指程序在执行的过程中,其中的某段代码被重复执行若一干珠。被重复执行的代码段,通常称为循环体。Visual FoxPro支持循环结构的语句包括:DO WHILE-ENDDO、FOR-ENDFOR和SCAN-ENDSCAN。

DO WHILEENDFOR语句 格式:

FOR<循环变量>=<初值>TO<终值>[STEP<步长>] <循环体> ENDFOR

功能:首先将初值赋给循环变量,然后判断循环条件是否成立(若步长为正值,则循环条件为<循环变量><=<终值>;若步长为负值,则循环条件为<循环变量>>=<终值>)。如果成立,则执行循环体,然后循环变量增加一个步长值,并再次判断循环条件,一直到条件为假时,退出循环体。该语句通常用于实现循环次数已知情况下的循环结构〕

SCAN-ENDSCAN语句

格式:

SCAN[<范围>][FOR<条件1>][WHERE<条件2>] <循环体> ENDSCAN

功能:该循环语句一般用于处理表中记录,语句可指明需要处理的记录范围及应满足的条件。执行该语句时,记录指针自动、依次地在当前表的指定范围内满足条件的记录上移动,对每一条记录执行循环体内的命令。

7.3 多模块程序

模块是一个相对独立的程序段,它可以被其他模块调用,也可以调用其他模块。通常,把被其他模块调用的模块称为子程序,把调用其他模块而没有被其他模块调用的模块称为主程序。应用程序一般都是多模块程序,包含多个程序模块。考点6 模块的定义和调用

1模块的定义

在Visual FoxPro中,模块可以是命令文件,也可以是过程。过程定义的语句格式为: PROCEDURE|FUNCTION<过程名> <命令序列> [RETURN[<表达式>]] [ENDPROCIENDFUNC]

功能说明如下。

(1)PROCEDURE|FUNCTION命令表示一个过程的开始,并命名过程。过程名必须以字母或下划线开头,可以包含数字、字母和下划线。

(2)当程序执行到RETURN命令时,控制将转回到调用处(或命令窗口),并返回表达式的值。若默认RETURN命令,系统将在过程结束处自动调用一条隐含的RETURN命令。

(3)ENDPROC|ENDFUNC命令表示一个过程的结束。如果默认此语句,那么过程结束于下一条PROCEDURE|FUNCTION命令或文件尾。

2模块的调用

模块调用的格式有两种。

(1)使用DO命令,格式如下。DO<文件名>|<过程名>

(2)在名字后加一对小括号,格式如下。<文件名>|<过程名>()

3打开过程文件

命令格式如下。

SET PROCEDURE TO[<过程文件1>[,<过程文件2>,„][ADDITIVE]

4关闭过程文件

命令格式如下。

RELEASE PROCEDURE<过程文件1>[,<过程文件2>,„] 考点7 参数传递

模块程序可以接收调用程序传递过来的参数。

(1)PARAMETERS<形参变量1>[,<形参变量2>,„]。

(2)LPARAMETERS<形参变量1>[,<形参变量2>,„]。

说明PARAMETERS声明的形参被看做是模块程序中建立的私有变量,LPARAMETERS声明的形参被看做是模块程序中建立的局部变量。除此之外,两条命令无其他区别。

不管是PARAMETERS或LPARAMETERS,都应该是模块程序的第一条可执行命令。

(1)调用参数调用模块程序参数的格式如下。

DO<文件名>|<过程名>WITH<实参1>[,<实参2>,„] <文件名>|<过程名>(<实参1>[,<实参2>,„])

说明:实参可以是常量、变量或一般表达式,调用模块程序时,形参的数目不能少于实参的数目,当形参数目多于实参数目时,多余的形参取初值逻辑假.F.。

(2)参数的传递。模块中参数的传递分为两种:按值传递(实参一般为常量和表达式)和引用传递(实参一般为变量)。参数的传递方式可以重新设置,格式如下。SET UDFPARMS TO VALUE|REFERENCE 考点8 变量的作用域

变量的一个重要属性是作用域。变量的作用域指的是变量在什么范围内是有效或能够被访问的。在Visual FoxPro中,可分为公共变量、私有变量和局部变量3类。

1.公共变量

在任何模块中都可使用的变量称为公共变量,公共变量必须先定义后使用,格式如下。PUBLIC<内存变量表>

说明:该命令是建立公共的内存变量,并赋以初值逻辑假.F.。建立好的公共变量一直有效,即使程序结束返回命令窗口也不会消失,只有执行CLEAR MEMORY,RELEASE或QUIT等命令后,才能被释放。

2私有变量

在程序中直接使用(没有预先声明),而由系统自动隐含建立的变量都是私有变量。

私有变量的作用域是建立它的模块及其下属的各层模块。

3局部变量

局部变量只能在建立它的模块中使用,不能在上层或下层模块中使用。程序结束时,自动释放局部变量。格式如下 LOCAL<内存变量表>

说明:该变量同样给建立的内存变量赋以初值逻辑假.F.,也必须先定义后使用。当子程序中定义的变量名与主程序中同名时,为避免子程序中的变量值改变主程序中的变量值,可在子程序中使用PRIVATE命令隐藏主程序中可能存在的变量,使这些变量在子程序中暂时无效。格式如下。

(1)PRIVATE<内存变量表>。

(2)PRIVATE ALL[LIKE<通配符>|EXCEPT<通配符>]。

说明:该命令并不建立内存变量,它只是隐藏指定的在上层模块中可能已经存在的内存变量,但是当模块程序返回到上层模块时,被隐藏的变量就自动恢复有效性,保持原值。7.4 程序调试 考点9 调试器环境

程序调试是指在发现程序有错误的情况下,确定出错位置并纠正错误。计算机一般能够发现程序的出错位置,但对于计算机不能发现的错误,只能由用户自己来查错。Visual FoxPro提供的功能强大的调试工具—调试器,可帮助我们进行这项工作。

调用调试器的方法一般有两种。

(l)选择“工具”菜单中的“调试器”命令。

(2)在命令窗口中输入DEBUG命令。考点10 设置断点

可以设置以下4种类型的断点。

(1)在定位处中断:可指定一行代码,当程序调试执行到该行时,中断程序运行。

(2)如果表达式值为真,则在定位处中断:指定一行代码及一个表达式,当程序调试执行到该行代码时,如果表达式值为真,就中断程序运行。

(3)当表达式值为真时中断:可以指定一个表达式,在程序调试执行过程中,当该表达式值为逻辑真.T.时,中断程序运行。

(4)当表达式值改变时中断:可以指定一个表达式,在程序调试执行过程中,当该表达式值改变时,中断程序运行。考点11 “调试”菜单

“调试”菜单包含执行程序、选择执行方式、终止程序执行、修改程序,以及调整程序执行速度等命令。各命令具体功能如下。

(1)运行:执行在跟踪窗口中打开的程序:

(2)继续执行:当程序被中断时,该命令可使程序在中断处继续往下执行。

(3)取消:终止程序的调试执行,并关闭程序。

(4)定位修改:终止程序的调试执行,然后在文本编辑窗口中打开调试程序。

(5)跳出:以连续方式而非单步方式继续执行被调用模块程序中的代码,然后在调用程序的调用语句的下一行处中断。

(6)单步:单步执行下一行代码。如果下一行代码调用了过程或者方法程序,那么该过程或者方法程序在后台执行。

(7)单步跟踪:单步执行下一行代码。

(8)运行到光标处:从当前位置执行代码直至光标处中断。

(9)调速:打开“调整运行速度”对话框,设置两代码行执行之间的延迟秒数。

(10)设置下一条语句:程序中断时选择该命令,可使光标所在行成为恢复执行后要执行的语句。

全国计算机等级考试二级VF考点分析之表单设计与应用(第八章)8.1 面向对象的概念 考点1 对象与类

1对象(Object)

客观世界里的任何实体都可以被视为对象。对象可以是具体事物,也可以指某些概念二

(1)属性:用来表示对象的状态。

(2)方法:用来描述对象的行为。

2类(Class)

类是对一类相似对象性质的描述。同类对象具有相同的性质:相同的属性及方法。考点2 子类与继承

第四篇:《全国计算机等级考试二级教程C语言程序设计》

《全国计算机等级考试二级教程——C语言程序设计》

课后题及参考答案

第一章 程序设计基本概念

1.1 在TRUBO C环境中用RUN命令运行一个C程序时,所运行的程序的后缀是______。答案:.exe 1.2 C语言源程序文件的后缀是_____,经过编译后,生成文件的后缀是_____,经过连接后,生成文件的后缀是_____。

答案:.c.obj.exe 1.3 结构化程序由_____、_____、_____三种基本结构组成。答案:顺序、选择、循环 第二章 C程序设计的初步知识

一、选择题

2.1 以下选项中正确的整型常量是

A)12.B)-20

C)1,000

D)4 5 6

答案:B 2.2 以下选项中正确的实型常量是

A)0

B)3.1415

C)0.329×10(2)(10的2次方)

D).871

答案:D 2.3 以下选项中不正确的实型常量是

A)2.607E-1

B)0.8103e 2

C)-77.77

D)456e-2

答案:B 2.4 以下选项中不合法的用户标识符是

A)abc.c

B)file

C)Main

D)PRINTF

答案:A 2.5 以下选项中不合法的用户标识符是

A)_123

B)printf

C)A$

D)Dim

答案:C 2.6 C语言中运算对象必需是整型的运算符是

A)%

B)/

C)!

D)**

答案:A 2.7 可在C程序中用作用户标识符的一组标识符是

A)void

define

WORD

B)as_b3

_123

If

C)For

-abc

case

D)2c

DO

SIG

答案:B 2.8 若变量已正确定义并赋值,符合C语言语法的表达式是

A)a=a+7;

B)a=7+b+c,a++

C)int(12.3%4)

D)a=a+7=c+b

答案:B 2.9 以下叙述中正确的是

A)a是实型变量,C允许进行以下赋值a=10,因此可以这样说:实型变量中允许存放整型值。

B)在赋值表达式中,赋值号右边既可以是变量也可以是任意表达式。

C)执行表达式a=b后,在内存中a和b存储单元中的原有值都将被改变,a的值已由原值改变为b的值,b的值由原值变为0。

D)已有a=3,b=5。当执行了表达式a=b,b=a之后,已使a中的值为5,b中的值为3。

答案:B 2.10 以下叙述中正确的是

A)在C程序中无论是整数还是实数,只要在允许的范围内都能准确无误的表示。

B)C程序由主函数组成。

C)C程序由函数组成。

D)C程序由函数和过程组成。

答案:C 2.11 TURBO C中int类型变量所占字节数是

A)1

B)2

C)3

D)4

答案:B 2.12 不合法的八进制数是

A)0

B)028

C)077

D)01

答案:B 2.13 不合法的十六进制数是

A)oxff

B)0Xabc

C)0x11

D)0x19

答案:A

二、填空题

2.14 若k为int整型变量且赋值11。请写出运算k++后表达式的值A)_____和变量的值B)_____。

答案:

11、12 2.15 若x为double型变量,请写出运算x=3.2,++x后表达式的值A)_____和变量的值B)_____。

答案:4.2、4.2 2.16 函数体由符号____开始,用符号____结束。函数体的前面是____部分,其后是____部分。

答案:{、}、定义、执行

2.17 C语言中的标识符可分为____、____、和预定义标识符三类。

答案:关键字、用户标识符

2.18 在C语言程序中,用关键字____定义基本整型量,用关键字____定义单精度实型变量,用关键字___定义双精度实型变量。

答案:int、float、double 2.19 把a1、a2定义成单精度实型变量,并赋初值1的定义语句是____。

答案:float a1=1.0,a2=1.0;

2.20 C程序中定义的变量,代表内存中的一个____。

答案:存储单元

2.21 表达式3.5+1/2的计算结果是____。

答案:3.5 2.22 对以下数学式,写出三个等价的C语言表达式____、____、____。

a×b

——

c

答案:a*b/c、a/c*b、b/c*a 2.23 表达式s=10应当读做“____”。

答案:将10赋给变量s 2.24 计算机中内存储器的最小存储单位称____,其中能容纳的数是____。

答案:位、0或1 2.25 通常一个字节包含____个二进制位。在一个字节中能存放的最大(十进制)整数是____,它的二进制数的形式是____;最小(十进制)整数是____,它的二进制数的形式是____。

答案:8、255、1111 1111、-128、1000 0000 2.26 当计算机用两个字节存放一个整数时,其中能存放的最大(十进制)整数是____、最小(十进制)整数是____,它的二进制数的形式是____。

答案:65535、-32768、1000 0000 0000 0000 2.27 在C语言中整数可用____进制数、____进制数和____进制数三种数制表示。

答案:十、八、十六

三、上机改错题

2.24 【分析与解答】

 第1行的错误:

(1)include是一个程序行,因此在此行的最后不应当有分号(;)。

(2)include程序行中后面的stdio.h是一个文件名,按规定,文件名应当放在一对双引号(″ ″)内,或放在一对尖括号(< >)内。 第2行的错误:

(1)main()是主函数的起始行,不是语句,因此最后不应当有分号(;)。

(2)在同一行上的/ * main function * / 显然是注释;C语言规定:注释由/*开头,由*/结束,但在*号和/之间不得插入任何空格,而在此处“/

*”和“/

*”之间存在空格,因此,/ * main function * /的写法式是错误的,而应写成:/* main function */。

第3行的错误:

(1)在主函数的起始行main()的后面是函数体,函数体由左花括号({)开始。但在函数体的第一行:float的前面缺少了左花括号({)。

(2)在同一行上的/* /*r is radius*/, /* s is area of circular*/ */ 显然是注释;C语言规定:注释由/*开头,由*/结束,并且开头的/*将去找最近的*/去配对,因此在/* /*r is radius*/中,第一个/*与最后的那个*/配上了对,结果紧跟在后面的那个逗号(,)落在了注释的外面,而构成了一个多余符号,为此,在编译时将报告“语法错”。

第6行的错误:

(1)printf(″%f \[KG-*3]n″,s)应当是一条输出语句,但在最后缺少了一个分号。

(2)printf(″%f \[KG-*3]n″,s);是程序的最后一条语句,程序应当结束;但缺少了程序体结束所需的右花括号(});此右花括号可以放在printf(″%f \[KG-*3]n″,s);的后面,也可以放在printf(″%f \[KG-*3]n″,s);的下一行上。

2.25 【分析与解答】

第1行的错误:在include行中的文件名应该是stdio.h,而不是stdio.a。 第2行的错误:在main的后面缺少一对圆括号。 第4行的错误:在c=40的后面缺少分号。

第6行的错误:在printf(″%f \〖KG-*3〗n″,v)的后面缺少分号。

第三章、顺序结构

一、选择题

3.1 若a、b、c、d都是int类型变量且初值为0,以下选项中不正确的赋值语句是

A)a=b=c=100;

B)d++;

C)c+b;

D)d=(c=22)-(b++);

答案:C 3.2 以下选项中不是C语句的是

A){int i;i++;printf(“%d”, i);}

B);

C)a=5,c=10

D){;}

答案:C 3.3 以下合法的C语言赋值语句是

A)A=B=58

B)k=int(a+b);

C)a=58,b=58

D)--i;

答案:D 3.4 以下程序的输出结果是

A)0

B)1

C)3

D)不确定的值

main()

{

int x=10,y=3;

printf(“%d”, y=x/y);

}

答案:C 3.5 若变量已正确说明为int类型,要给a、b、c输入数据,以下不正确的输入语句是

A)read(a,b,c);

B)scanf(“%d%d%d”,a,b,c);

C)scanf(“%D%D%D”,&a,&b,&c);

D)scanf(“%d%d%d”,&a,&b,&c);

答案:D 3.6 若变量已正确说明为float类型,要通过以下赋值语句给a赋予

10、b赋予

22、c赋予33,以下不正确的输入形式是

A)10 22 33

B)10.0,22.0,33.0

C)10.0 22.0 33.0

D)10 22 33

scanf(“%f %f %f”, &a, &b, &c);

答案:B 3.7 若变量以正确定义,要将a和b中的数进行交换,下面不正确的语句组是

A)a=a+b,b=a-b,a=a-b;

B)t=a,a=b,b=t;

C)a=t;t=b;b=a;

D)t=b;b=a;a=t;

答案:C 3.8 若变量已正确定义,以下程序段的输出结果是

A)输出格式说明与输出项不匹配,输出无定值

B)5.17000

C)5.168000

D)5.169000

x=5.16894;

printf(“%f”,(int)(x*1000+0.5)/(float)1000);

答案:D 3.9 若有以下程序段,c3中的值是

A)0

B)1/2

C)0.5

D)1

int c1=1,c2=2,c3;

c3=c1/c2;

答案:A 3.10 若有以下程序段,其输出结果是

A)0,0,-10

B)0,0,5

C)-10,3,-10

D)3,3,-10

int a=0,b=0,c=0;

c=(a-=a-5),(a=b,b+3);

printf(“%d,%d,%d”,a,b,c);

答案:B 3.11 当运行以下程序时,在键盘上从第一列开始输入9876543210(此处代表Enter),则程序的输出结果是

A)a=98,b=765,c=4321

B)a=10,b=432,c=8765

C)a=98,b=765.000000,c=4321.000000

D)a=98,b=765,c=4321.0

main(){

int a;float b,c;

scanf(“%2d%3f%4f”,&a,&b,&c);

printf(“a=%d,b=%f,c=%f”,a,b,c);}

答案:C 3.12 以下程序的输出结果是

A)a=%2,b=%5

B)a=2,b=5

C)a=%%d,b=%%d

D)a=%d,b=%d

main(){ int a=2,b=5;

printf(“a=%%d,b=%%d”,a,b);}

答案:D 3.13 若int类型占两个字节,则以下程序段的输出是

A)-1,-1

B)-1,32767

C)-1,32768

D)-1,65535

int a=-1;

printf(“%d,%u”,a,a);

答案:D 3.14 以下程序段的输出是

A)*496 *

B)* 496*

C)*000496* D)输出格式符不合法

int x=496;

printf(“*%-06d*”,x);

答案:A 3.15 以下程序段的输出是

A)|3.1415|

B)| 3.0|

C)|

3|

D)|

3.|

float a=3.1415;

printf(“|%6.0f|”,a);

答案:C 3.16 以下程序段的输出是

A)|2345.67800|

B)|12345.6780|

C)|12345.67800|

D)|12345.678|

printf(“|%10.5f|”,12345.678);

答案:C 3.17 以下程序段的输出是

A)*0000057.66*

B)*

57.66*

C)*0000057.67*

D)*

57.67*

float a=57.666;

printf(“*%010.2f*”,a);

答案:C 3.18 若从终端输入以下数据,要给变量C赋以283.19,则正确的输入语句是

A)scanf(“%f”,c);

B)scanf(“%8.4f”,&c);

C)scanf(“%6.2f”,&c);

D)scanf(“%8”,&c);

283.1900 表示Enter键

答案:由于印刷错误,本题没有正确答案。改正意见:

把选项A改为:scanf(“%f”,&c);或者把选项D改为:scanf(“%8f”,&c);则可分别选择A或者D为正确答案。

3.19 若变量已正确说明,要求用以下语句给a赋予3.12、给b赋予9.0,则正确的输入形式是(□代表空格)

A)3.12□□9.0

B)a=□□3.12b=□□□9

C)a=3.12,b=9

D)a=3.12□□,b=9□□□□

scanf(“a=%f,b=%f”,&a,&b);表示Enter键

答案:C 3.20 以下程序的输出结果是

A)9 8

B)8 9

C)6 6

D)以上三个都不对

#include “math.h” main(){ double a=-3.0, b=2;

printf(“%3.0f %3.0f”,pow(b,fabs(a)),pow(fabs(a),b));}

答案:B

二、填空题

3.21 若有以下定义,请写出以下程序段中输出语句执行后的输出结果。(1)____(2)____(3)____

int i=-200,j=2500;

printf(“(1)%d %d”,i,j);

printf(“(2)i=%d, j=%d”,i,j);

printf(“(3)i=%d j=%d”,i,j);

答案:

-200 2500

i=-200, j=2500

i=-200 j=2500 3.22 变量i、j、k已定义为int类型并有初值0,用以下语句进行输入时

scanf(“%d”,&i);scanf(“%d”,&j);scanf(“%d”,&k);当执行第一个输入语句,从键盘输入:

12.3 表示Enter键

则变量i、j、k的值分别是____、____、____。

答案:12、0、0 3.23 复合语句在语法上被认为是____。空语句的形式是____。

答案:一条语句、; 3.24 C语句的最后用____结束。

答案:;

3.25 以下程序段,要求通过scanf语句给变量赋值,然后输出变量的值。写出运行时给k输入100,给a输入25.81,给x输入1.89234时的三种可能的输入形式____、_____、____。

int k;float a;double x;

scanf(“%d%f%lf”,&k,&a,&x);

printf(“k=%d,a=%f,x=%f”,k,a,x);

答案:

(1)100 25.81 1.89234

(2)100 25.811.89234

(3)100 25.81 1.89234 3.26 以下程序段的输出结果是____。

int x=0177;

printf(“x=%3d,x=%6d,x=$%6o,x=%6x,x=%6u”,x,x,x,x,x);

答案:x=127,x= 127,x= 177,x=

7f,x= 127 3.27 以下程序段的输出结果是____。

int x=0177;

printf(“x=%-3d,x=%-6d,x=$%-06d,x=$%06d,x=%%06d”,x,x,x,x,x);

答案:

27、x=127,x=127,x=$127,x=$000127,x=%06d 3.28 以下程序段的输出结果是____。

double a=513.789215;

printf(“a=%8.6f,a=%8.2f,a=%14.8f,a=%14.8lf”,a,a,a,a);答案:a=513.789215,a= 513.79,a= 513.78921500,a= 513.78921500

三、编程题和改错题

3.16 【分析与解答】

(1)主函数名main后应有一对圆括号。(2)变量定义语句中,v的前面缺逗号。

(3)第三行的printf语句用以提示输入,但是原样输出的字符串没有用双引号括起来;另外,从输入的形式看,输入的数据紧跟在提示之后,因此,printf格式串中最后不应该有换行符——\n。

(4)因为输入项a、b、c从定义和计算结果来看都是double类型,因此,第四行scanf语句格式串中的格式说明不应当用%d而应当用%lf;且每一个变量之前应该加地址运算符&。

(5)第七行的printf语句中应当把%d都改成%lf或%f;按输出要求在格式串中应添加相应的原样输出的字符;因为下一个printf的输出从新的一行开始,因此在本输出语句的格式串的最后应当加换行符——\n。

(6)第八行的printf语句中应当把格式串整理合并放在输出项的前面,输出项放在后面,%d都改成%lf或%f;中间的\n删去。

(7)请读者自己写出修改后的程序,并上机调试。

3.17【分析与解答】

(1)分析:可用算术式560÷60把分钟换算成小时和分钟,商数就是小时数,余数就是分钟数。

(2)确定变量的名字和定义变量的类型:在程序中把小时数放在变量h中,把分钟数放在变量m中。这两个变量的类型可以是整型(本题中采用整型),也可以是实型。

(3)确定所用算法:求〖SX()560〖〗60〖SX〗〗的商数,在C语言中可以用整除的算法,语句是h=560/60。求余数可用求余运算符 %:560%60,其值放入变量m中的语句是:m=560%60。(4)设计输出格式。若输出的形式定为:小时:分钟,则按此形式设计输出语句。(5)把以上内容放在主函数的一对花括号中。(6)编写程序如下:

main() {

int h, m;

h=560/60;

m=560%60;

printf(″The result: %3d : %3d\n″, h,m);

 } 

运行结果是:

The result:

: 20

3.18 【分析与解答】

(1)确定变量的名字和定义变量的类型。若用a存放1500,用b存放350;用q存放商数,用r存放余数,所有变量应定义成int类型。

(2)设计输入语句从终端输入1500和350;在输入语句之前,应当设计一个输出语句,用以提示输入。(3)可用整除求商数,结果放在变量q中。可用求余运算符%求两数之余数,结果放在变量r中。(4)设计输出语句。输出a、b、q、r。

(5)把以上内容放在主函数的一对花括号中。

本题的程序与3.30相似,请读者参考上题并根据本题的解释自己编程,并上机调试。

3.19 【分析与解答】

(1)定义4个双精度变量a、b、c和ave,变量a、b、c分别存放读入的3个双精度数,ave存放它们的平均值。

(2)设计输入语句,以及在此之前用于提示输入的(printf)语句。(3)设计求平均值的算法,把所求得的平均值放入变量ave中。

(4)设计把变量ave中的数,从小数点后第二位数进行四舍五入的算法。现举例说明:若ave中的数为123.4644,为了保留此值小数点后一位,可用表达式:(int)(123.4644*10)/10.0;依次推算,为了保留此值小数点后二位,可用表达式:(int)(123.4644*100)/100.0;其他依此类推。

(5)若要求对小数点后第二位数进行四舍五入,则可对原数加0.05后再进行以上运算。如要求保留123.4644小数点后一位且对第二位数进行四舍五入,可用表达式:(int)((123.467+0.05)*10)/10.0。注意:分母一定要用实数10.0而不能用整数10,否则就变成整除了;若要求保留123.4644小数点后两位且对第三位数进行四舍五入,可用表达式:(int)((123.467+0.005)*100)/100.0;其他依此类推。(6)设计输出语句。输出a、b、c和ave。(7)把以上内容放在主函数的一对花括号中。(8)编写程序如下: main()

{

double a,b,c,ave; printf(″Enter a ,b ,c : ″);

scanf(″%lf%lf%lf″, &a, &b, &c); ave=(a+b+c)/3; printf(″ave=%f\n″, ave);

/*用以比较四舍五入前后的数据*/ ave=(int)((ave+0.05)*10)/10.0;

printf(″a=%f, b=%f, c=%f, ave=%f\n″, a,b,c,ave);

 } 

3.20 【分析与解答】

(1)关于对变量中的数进行交换的算法请参考3.7题中的解释和《教程》中有关的例题。

(2)定义4个整型变量a、b、c和t,变量a、b、c分别存放读入的3个整数,t用作临时存储单元。(3)设计输入语句,以及在此之前用于提示输入的(printf)语句。(4)输出a、b、c中的值,以便于比较。(5)交换的步骤如下: ① 把c中的值赋给t。 ② 把b中的值赋给c。 ③ 把a中的值赋给b。 ④ 把t中的值赋给a。

经过以上步骤,已按要求进行了交换。(6)输出a、b、c中的值。(7)编写程序如下: main()

{

int a, b, c, t;

printf(″Enter a, b, c :\n″); scanf(″%d%d%d″,&a,&b,&c);

printf(″(1)a=%d,b=%d,c=%d\n″,a,b ,c); t=c;c=b;b=a;a=t;

printf(″(2)a=%d,b=%d,c=%d\n″,a,b,c);

 } 

第四章、选择结构

一、选择题

4.1 下列运算符中优先级最高的运算符是

A)!

B)%

C)-=

D)&&

答案:A 4.2 下列运算符中优先级最低的运算符是

A)||

B)!=

C)<=

D)+

答案:A 4.3 为表示关系x≥y≥z,应使用的C语言表达式是

A)(x>=y)&&(y>=z)

B)(x>=y)AND(y>=z)

C)(x>=y>=z)

D)(x>=y)&(y>=z)

答案:A 4.4 设a、b和c都是int型变量,且a=3,b=4,c=5;则以下的表达式中,值为0的表达式是

A)a&&b

B)a<=b

C)a||b+c&&b-c

|1)

答案:D 4.5 以下程序的输出结果是

A)0

B)1

C)2

D)3

main()

{ int a=2,b=-1,c=2;

if(a

if(b<0)c=0;

else c+=1;

printf(“%d”,c);

}

D)!((a

答案:C 4.6 以下程序的输出结果是

A)1

B)2

C)3

D)4

main(){ int w=4,x=3,y=2,z=1;

printf(“%d”,(w

答案:A 4.7 若执行以下程序时从键盘上输入3和4,则输出结果是

A)14

B)16

C)18

D)20

main(){ int a,b,s;

scanf(“%d%d”,&a,&b);

s=a;

if(a

s*=s;

printf(“%d”,s);}

答案:B 4.8 下面的程序片段所表示的数学函数关系是

-1(x<0)A)y= 0(x=0)

1(x>0)

1(x<0)B)y=-1(x=0)

0(x>0)

0(x<0)C)y=-1(x=0)

1(x>0)

-1(x<0)D)y= 1(x=0)

0(x>0)

y=-1;if(x!=0)y=1;

if(x>0)y=1;else y=0;答案:A 4.9 运行以下程序后,输出

A)****

B)&&&&

C)####&&&&

D)有语法错误不能通过编译

main(){ int k=-3;

if(k<=0)printf(“****”)

else printf(“&&&&”);}

答案:D 4.10 若a和b均是正整型变量,以下正确的switch语句是 A)switch(pow(a,2)+pow(b,2))

{ case 1: case 3: y=a+b;break;

case 0: case 5: y=a-b;

} B)switch(a*a+b*b);

{ case 3:

case 1: y=a+b;break;

case 0: y=b-a;break;

} C)switch a

{ default: x=a+b;

case 10: y=a-b;break;

case 11: x=a*d;break;

} D)switch(a+b)

{ case10 : x=a+b;break;

case11 : y=a-b;break;

}

答案:没有正确答案。如果C选项改为: switch(a){ default: x=a+b;

case 10: y=a-b;break;

case 11: x=a*b;break;} 则答案可以选择C

二、填空题

4.11 C语言中用____表示逻辑值“真”,用____表示逻辑值“假”。

答案:非0、0 4.12 C语言中的关系运算符按优先级别是____、____、____、____。

答案:>、<、>=、<=、==、!= 4.13 C语言中的逻辑运算符按优先级别是____、____、____。

答案:!、&&、|| 4.14 C语言中的关系运算符和逻辑运算符的优先级别是____、____、____、____、____、____、____。

答案:!、<、>、==、!=、&&、|| 4.15 C语言中逻辑运算符____的优先级高于算术运算符。

答案:!

4.16 将下列数学式改写成C语言的关系表达式或逻辑表达式A)____B)____。

A)a=b或a

B)|x|>4

答案:A)a==b||a4||x<-4 4.17 请写出以下程序的 输出结果____。

main(){ int a=100;

if(a>100)printf(“%d”,a>100);

else

printf(“%d”,a<=100);}

答案:1 4.18 请写出与以下表达式等价的表达式A)____B)____。A)!(x>0)

B)!0

答案:A)x<=0 B)1 4.19 当a=1,b=2,c=3时,以下if语句执行后,a、b、c中的值分别为____、____、____。

if(a>c)

b=a;a=c;c=b;

答案:3、2、2 4.20 若变量已正确定义,以下语句段的输出结果是____。

x=0;y=2;z=3;

switch(x)

{ case 0: switch(y==2)

{ case 1: printf(“*”);break;

case 2: printf(“%”);break;

}

case 1: switch(z)

{ case

1: printf(“$”);

case

2: printf(“*”);break;

default : printf(“#”);

}

} 答案:*#

三、编程题

4.21 【分析与解答】

相关内容请参考《教程》4.2节和4.4节。(1)改写如下: switch(a/10)

{ default : m=5;break;

case 0 : case 1 : case 2 : m=1;break; case 3 : m=2;break; case 4 : m=3;break; case 5 : m=4;break; };

(2)本题中对a的判断条件有一定的规律可寻;关键是,在switch语句后的表达式中利用了a/10,从而简化了case标号。

4.22 【分析与解答】

编写本题的程序,首先要解决如何计算学生当前的年龄(设存放实足年龄的变量是age)。(1)如果当前的月份大于生日的月份,则学生的实足年龄age=y1-y0。

(2)如果当前的月份等于生日的月份,就要看日数,当前的日数大于或等于生日的日数,则学生的实足年龄age=y1-y0。

(3)如果不满足以上的条件,就可断定当前的日期没有超过生日日期,就是说学生的年龄应当是age=y1-y0-1。 以上3条,用C语言可以描述如下:

if((m1>m0)[JB>1|][JB>1|](m1==m0&&d1>=d0))age=y1-y0;

else age=y1-y0-1;

读者可以参考以上语句写出程序,也可以根据分析写出与此形式不同的语句和程序。 4.23【分析与解答】

(1)若输入的整数a是奇数,输出 dd number,是偶数输出:even number。

(2)若一个a是偶数,它就能被2除尽,即a%2==0,输出even number;若是奇数,它就不能被2除尽,即a%2!〖KG-*2〗=0,输出odd number。

读者可以参考以上给出的算法,写出相应的C语句,并编写出完整的程序。 4.24 【分析与解答】

本题的主要算法是从3个数中找出最大的那个数。假定始终把最大的数放在变量max中。(1)假定a中的数最大,把a赋给max。

(2)用b去和max比较,若b大于max,则把b赋给max;若不大于max,则什么也不做。(3)用c去和max比较,若c大于max,则把c赋给max;若不大于max,则什么也不做。(4)经过以上操作,max中已放入了a、b、c三个数中的最大数,输出max即可。 读者可以参考以上给出的算法,写出相应的C语句,并编写出完整的程序。 4.25 【分析与解答】

(1)本题已给出了非常明确的条件,只要写出正确的条件判断语句就可基本完成程序的编写。

(2)由给出的函数可知,只有x的值在规定的范围内时,才求出y的值,因此程序应当对输入的x进行判断,若超过范围就不求y的值。

(3)现以使用if[CD#*2]else语句为例写出程序供参考。

main() {

int x,y;printf(″Enter x : ″);scanf(″%d″, &x); if(x>-5&&x<10)

{

if(x==0)y=x-1;

else if(x<10 && x>0)y=x+1; else if(x<0 && x>-5)y=x;

printf(″x=%d y=%d\n″, x,y);

 }

printf(″***END***\n\n″);

 } 

第五章、循环结构

一、选择题

5.1 以下程序段的输出结果是

A)9

B)1

C)11

int k,j,s;

for(k=2;k<6;k++,k++)

{ s=1;

for(j=k;j<6;j++)s+=j;

}

printf(“%d”, s);

答案:D 5.2 以下程序段的输出结果是

A)12

B)15

C)20

int i,j,m=0;

for(i=1;i<=15;i+=4)

for(j=3;j<=19;j+=4)m++;

printf(“%d”, m);

答案:C 5.3 以下程序段的输出结果是

A)10

B)9

C)10

D)9

D)10 D)25

int n=10;

while(n>7)

{ n--;

printf(“%d”, n);

}

答案:B 5.4 以下程序段的输出结果是

A)1

B)3 0

C)1-2

int x=3;

do

{ printf(“%3d”,x-=2);}

while(!(--x));

答案:C 5.5 以下程序段的输出结果是

A)15

B)14

C)不确定

main()

{ int i,sum;

for(i=1;i<6;i++)sum+=sum;

printf(“%d”,sum);

}

答案:C 5.6 以下程序段的输出结果是

A)741

B)852

C)963

main()

{ int y=10;

for(;y>0;y--)

if(y%3==0)

{ printf(“%d”,--y);continue;

}

答案:B 5.7 若x是int型变量,以下程序段的输出结果是

A)**3

##4

**5

B)##3

**4

##5

C)##3

**4##5

D)**3##4

**5

for(x=3;x<6;x++)

printf((x%2)?(“**%d”):(##%d“),x);

D)死循环

D)0 D)875421 }

答案:D 5.8 以下程序的输出结果是

A)*#*#*#$

B)#*#*#*$

C)*#*#$

D)#*#*$

main(){ int i;

for(i=1;i<=5;i++)

{ if(i%2)printf(”*“);

else

contionue;

printf(”#“);

}

printf(”$“);}

答案:A 5.9 以下叙述正确的是

A)do_while语句构成的循环不能用其它语句构成的循环来代替。

B)do_while语句构成的循环只能用break语句退出。

C)用do_while语句构成循环时,只有在while后的表达式为非零时结束循环。

D)用do_while语句构成循环时,只有在while后的表达式为零时结束循环。

答案:D 5.10 以下程序的输出结果是

A)39 81

B)42 84

C)26 68

D)28 70

main(){ int x,i;

for(i=1;i<=100;i++)

{ x=i;

if(++x%2==0)

if(++x%3==0)

if(++x%7==0)

printf(”%d “, x);

}

printf(”“);}

答案:D

二、填空题

5.11 当执行以下程序段后,i的值是____、j的值是____、k的值是____。

int a,b,c,d,i,j,k;a=10;b=c=d=5;i=j=k=0;for(;a>b;++b)i++;while(a>++c)j++;do k++;while(a>d++);

答案:5、4、6 5.12 以下程序段的输出结果是____。

int k,n,m;n=10;m=1;k=1;while(k<=n)m*=2;printf(”%d“,m);

答案:死循环

5.13 以下程序的输出结果是____。

main(){ int x=2;

while(x--);

printf(”%d“,x);}

答案:-1 5.14 以下程序段的输出结果是____。

int i=0,sum=1;

do { sum+=i++;}while(i<5);

printf(”%d“,sum);

答案:11 5.15 有以下程序段:

s=1.0;

for(k=1;k<=n;k++)s=s+1.0/(k*(k+1));

printf(”%f“,s);请填空,使下面的程序段的功能完全与之等同。

s=0.0;

____;

k=0;

do

{ s=s+d;

____;

d=1.0/(k*(k+1));

}

while(____);

printf(”%f“,s);

答案:d=1.0、k++、k<=n 5.16 以下程序的功能是:从键盘上输入若干个学生的成绩,统计并输出最高成绩和最低成绩,当输入负数时结束输入。请填空。

main()

{ float x,amax,amin;

scanf(”%f“,&x);

amax=x;amin=x;

while(____)

{ if(x>amax)

amax=x;

if(____)

amin=x;

scanf(”%f“,&x);

}

printf(”amax=%famin=%f“,amax,amin);

}

答案:x>=0、x

三、编程题

5.17【分析与解答】

(1)本题的基本算法是求累加值。累加项的值有规律的递增,每一项的绝对值比前一项增2,因此可以利用循环的控制变量的递增来得到累加项的绝对值。例如:

for(i=1;i<=101;i+=2)„

(2)按所给的算式可以看到,累加项的符号是在交叉改变的,为此应当在循环体内设

置一个变量,使它的符号按此规律交叉改变,这可用:s=-s;来实现,s的初值为1;当s的值为1时,赋值后s中新的值为-1,当s的值为-1时,赋值后s中新的值为1。用s去乘累加项,将使累加项的符号也随之有规律地改变。(3)若累加和放在变量sum中,累加项放在变量t中,按照以上叙述,for循环体内的语句可以设计如下:

s=-s;t=s*i;sum=sum+t;(4)sum的值是51。

(5)请读者自己对变量做出正确的定义并赋初值,设计输出语句,完善程序。

5.18 【分析与解答】

(1)本题的基本算法是求累加值。累加项的分子部分都是1;分母的值有规律的递增,依次为1!、2!、„、n!,即,若第i-1项的累加项为

t(i-1),则第i项的累加项是 t(i-1)*i,在程序中可用表达式:t=t/i(i从1变化到n)来表示。(2)根据以上分析,若用变量t来存放累加项,当i的值从1变化到n时,可用以下语句来实现累加:

t=t/i;e+=t;

(3)为了实现累加过程,以上语句应当放在循环内,循环控制变量从1变化到n。

(4)若用for循环,按题目要求已指定n的值是50。若用while循环,并没有指定n的值,但已指定了循环结束的条件,当t的值小于10-4结束循环。(5)现例示用while循环来求e值的部分程序: i=1;e=1.0;t=1.0; while(t>=1e-4) {

t=t/i; e+=t; i++; } 

(6)请读者自己对变量做出正确的定义,设计输出语句,完善程序;也可以参考此程序段,按照自己的思路独立地完成程序。(7)e的值应当是:2.71828。

(8)根据以上分析,读者已不难用for循环来实现求e值的计算。

(9)注意:在完成此程序时,不要对分母中的阶乘值进行单独计算,因为17!的值已超过long类型的最大值,更无法求到50!。

5.19【分析与解答】

(1)从1880年至2000年的年数可用一个for循环来取得。

(2)对每一年,用以上指定的条件来进行判断,若满足条件即为闰年,进行输出。

(3)按输出的要求,需要设一个变量用于统计一行中输出的个数,若在一行上已连续输出了5个年数,就需输出一个换行符,使下一个输出项在新的一行上开始;若用变量n来做此统计,则当表达式n%5==0时就应输出一个换行符,同时使n重新置0值。

(4)若变量y代表年数,if语句的逻辑表达式可以写成如下:

(y%4==0 && y%100!=0[JB>1|][JB>1|]y%400==0)(5)以下程序段供参考:

for(y=1880;y<=2000;y++)

if(y%4==0 && y%100![KG-*2]=0[JB>1|][JB>1|]y%400==0) {

printf(″%d ″,y); n++;

if(n%5==0)

{ printf(″\n″);n=0;} }

(6)请读者自己对变量做出正确的定义并赋初值,完善程序;也可以参考此程序段,按照自己的思路独立地完成程序。从1880年至2000年有30个闰年。

5.20 【分析与解答】

(1)不难理解利用以下的for循环可以在一行上连续输出n个*号:

for(i=1;i<=n;i++)printf(″*″);

printf(″\n″);

若n的值是6,则连续输出6个*号。

(2)以上图形是在各行上输出数目不等的*号,只是*号的数目依次有规律地变化。在上半部分各行依次是1、3、5、7个,因此可以用以下的程序段来实现这样的输出:

for(k=1;k<=7;k++,k++)

{

for(i=1;i<=k;i++)printf(″*″); printf(″\n″);

 } 

在下半部依次是5、3、1个;因此可以用以下的程序段来实现这样的输出:

for(k=5;k>=1;k--,k--)

{

for(i=1;i<=k;i++)printf(″*″); printf(″\n″);

 } 

以上程序段从第一列起输出的结果如下: * *** ***** ******* ***** *** * 

现在我们已完成了在每行输出指定数目的*号。

(3)输出结果与题目要求不同,它们的区别是:按题目每一行之前有不同的空格,而这里则是所有的行都在第一列上开始输出*号;所以接着就应当解决这一问题。(4)分析题目要求,每行第一个*号位置的缩进是有规律的,假定中间这一行第一个*号位置是在第一列,则可看出,第一至第三行的缩进分别是3、2、1个空格;而图形下半部的缩进数则刚好相反。这可在以上循环中添加输出连续空格的for循环来实现,对于上半部程序如下:

b=3; for(k=1;k<=7;k++,k++)

{

for(j=1;j<=b;j++)printf(″ ″);b--;

for(i=1;i<=k;i++)printf(″*″); printf(″\n″);

 } 

(5)请读者在理解以上给出的示例的基础上,自己添加下半部空格的输出。

第六章、字符型数据

一、选择题

6.1 C语言中的简单数据类型有

A)整型、实型、逻辑型

B)整型、实型、字符型

C)整型、字符型、逻辑型

D)整型、实型、逻辑型、字符型

答案:B 6.2 C语言中,字符(char)型数据在微机内存中的存储形式是

A)反码

B)补码

C)EBCDIC码

D)ASCII码

答案:D 6.3 设有语句char a=''72'';,则变量a

A)包含1个字符

B)包含2个字符

C)包含3个字符

D)说明不合法

答案:A 6.4 C语言中不合法的字符常量是

A)''xff''

B)''65''

C)''&''

D)''28''

答案:本题A)和D)选项都是不合法的字符常量。若A)选项改为''ÿ'',则正确。6.5 C语言中不合法的字符串常量是

A)”121“

B)''y=''

C)” “

D)”ABCDm“

答案:B 6.6 判断char型变量c是否为大写字母的最简单且正确的表达式是

A)''A''<=c<=''Z''

B)(c>=''A'')&(c<=''Z'')

C)(''A''<=c)AND(''Z''>=c)

D)(c>=''A'')&&(c<=''Z'')

答案:D 6.7 以下程序的输出结果是

A)因输出格式不合法,无正确输出

B)65,90

C)A,Y

D)65,89

main(){ char c1=''A'',c2=''Y'';

printf(”%d,%d“,c1,c2);}

答案:D 6.8 以下程序段的输出结果是

A)A

B)a

C)Z

D)z

main(){ char x=''A'';

x=(x>=''A''&&x<=''Z'')?(x+32):x;

printf(”%c“,x);}

答案:B 6.9 以下程序的输出结果是

A)67,C

B)B,C

C)C,D

D)不确定的值

main(){ char ch1,ch2;

ch1=''A''+''5''-''3'';

ch2=''A''+''5''-''3'';

printf(”%d,%c“,ch1,ch2);}

答案:A 6.10 对以下程序,从第一列开始输入数据:2473代表Enter。程序的输出结果是

A)668977

B)668966

C)66778777

D)6688766

#include ”stdio.h“ main(){ int c;

while((c=getchar())!='''')

{ switch(c-''2'')

{ case 0 :

case 1 : putchar(c+4);

case 2 : putchar(c+4);break;

case 3 : putchar(c+3);

default : putchar(c+2);break;

}

printf(”“);

} }

答案:A 6.11 若变量已正确说明,要求用以下语句给c1赋予字符%、给c2赋予字符#、给a赋予2.0、给b赋予4.0,则正确的输入形式是(□代表空格)

A)2.0□%□4.0□#

B)2.0%4.0#

C)2%□□4#

D)2□%□4□

scanf(”%f%c%f%c“,&a,&c1,&b,&c2);

代表Enter键)

答案:B

二、填空题

6.12 EOF的十进制值是____。

答案:-1 6.13 C语言中,字符占内存____个字节。

答案:1 6.14 调用C语言对字符处理的库函数时,在#include命令行中应包括的头文件是____。

答案:string.h 6.15 若输入字符A,在以下while语句执行后ch的值是____。

while(ch=getchar()==''A'');

答案:1 6.16 若要通过以下语句给a、b、c、d分别输入字符A、B、C、D,给w、x、y、z分别输入10、20、30、40,正确的输入形式是____,请用代表Enter键。

scanf(”%d%c%d%c%d%c%d%c“,&w,&a,&x,&b,&y,&c,&z,&d);

答案:10A20B30C40D 6.17 若有以下说明和输入语句,要求给c1、c2输入字符A和B,给a1、a2输入7.29和101.298,从键盘正确输入数据的形式是____。

char c1,c2;

float a1,a2;

scanf(”%f%f“,&a1,&a2);

scanf(”%c%c“,&c1,&c2);

答案:7.29101.298AB 6.18 若有以下说明和输入语句,要求给c1、c2输入字符A和B,给a1、a2输入7.29和101.298,从键盘正确输入数据的形式是____。

char c1,c2;

float a1,a2;

scanf(”%c%f%c%f“,&c1,&a1,&c2,&a2);

答案:A7.29B101.298 6.19 若有以下说明和输入语句,要求给c1、c2、c3输入字符A、B和C,请写出各种从键盘正确输入数据的形式。

char c1,c2,c;

scanf(”%4c“,&c1);

scanf(”%4c“,&c2);

scanf(”%4c“,&c3);答案:A□□□B□□□C□□□

三、编程题

6.20【分析与解答】

(1)在进行字符输入时,即使一次输入了一行字符(最后用回车结束输入),字符也只能一个一个地读入。若ch已定义为char型变量,可以用以下的程序段来完成操作:

ch=getchar(); while(ch![KG-*2]=′\n′) {

„„ ch=getchar(); } 

当读入的是一个回车符时,循环就结束。循环体内的“„„”符号表示需要在循环体内完成的其他操作。

(2)在循环内要求进行的操作之一是:输出每个字符以及与之对应的ASCII代码值。因此可用以下语句来实现。 printf(″%c : %d ″,ch,ch);

(3)在循环内要求进行的另一个操作是:每行只能输出3对字符和与之对应的ASCII代码值。若n已定义为int型变量,则可用来作计数器;使n的初值为0,每输出一次,n的值增1,当n的值为3的整数倍时,额外输出一个换行符。例如: n++;

if(n%3==0)putchar(′\n′);

(4)把(2)和(3)中给出的语句放在循环体内,并按要求给出正确的定义和初值,就可完成题目所要求的操作。(5)也可以在while后的一对括号中来完成字符的读入,如while((ch=getchar())![KG-*2]=′\n′)。这时,循环内、外的“ch=getchar();”语句应当去掉。

6.21【分析与解答】

(1)一行字符的读入,请参照题6.20(1)和(5)中的解释。循环体内的“„„”符号表示需要在循环体内完成的其他操作。

ch=getchar(); while(ch![KG-*2]=′\n′) {

„„ ch=getchar(); } 

(2)在本题中循环体内需要把读入的所有数字字符转换成一个整数。若用变量n来存放这个整数,为了保证有效的存放,应当把它定义成long类型。

(3)要把输入的一串数字字符转换成一个整数,首先需要判断当前读入的字符是否是数字字符,若不是则什么也不做;若是,则进行以下操作:

① 把当前读入的一个字符转换成一个一位整数,这可由语句“d=ch-′0′;”来实现,在这里d是一个整型变量; ② 把d中的一位数归并到n的低位中,这可用语句“n=n*10+d;”来实现。这里所述的操作可由以下语句来完成:

if(ch>=′0′&&ch<=′9′){ d=ch-′0′;n=n*10+d;} if语句后一对括号中的判断表达式可以调用字符函数isdigit来实现:

if(isdigit(ch)){ d=ch-′0′;n=n*10+d;} if子句的两个语句可以合并成:n=n*10+ch-′0′。(4)把(3)中的语句放入循环中: ch=getchar();

while(ch![KG-*2]=′\n′)

{

if(ch>=′0′&&ch<=′9′)n=n*10+ ch-′0′; ch=getchar(); } 

(5)请自己写出定义语句并赋初值。注意,最后输出n时,应当使用格式说明%ld,而不能使用%d。

6.22【分析与解答】

(1)行数的统计可通过统计输入的′\n′符的个数来完成。

(2)统计的过程应当放在一个while循环体中;判断循环是否进行的条件可以用:((ch=getchar())==EOF)。若用整型变量n作为计数器对′\n′符进行统计,只要读入的字符是′\n′,则n增1。如:

while((ch=getchar())![KG-*2]=EOF) if(ch==′\n′)n++;

(3)EOF是在stdio.h中预定义了的标识符,在TURBO C的环境下,键入Ctrl+Z(即按住键盘上的Ctrl键,同时按字母Z键)后,敲Enter键,即输入了EOF。

6.23【分析与解答】

(1)本题要求的操作同样可在while循环中完成:

while((ch=getchar())!=′\n′)

{

„„

}

(2)若用整型变量n作为计数器对小写字母进行统计,只要读入的字符是小写字母,则n增1。如:

if(ch>=′a′ && ch<=′z′)n++;(3)在退出循环后,输出n的值。(4)请自己完善程序。

6.24【分析与解答】

(1)若图案的行数输入到变量L中。

(2)按要求L决定了图形的行数,因此可通过循环来实现L行的输出:

for(i=1;i<=L;i++)

{ „„ }

循环体中的“„„”号,代表输出L行的操作。

(3)假定ch中存放了一个字符,我们知道,通过以下循环可以在一行上输出n个字符:

for(j=1;j<=n;j++)putchar(ch);

putchar(′\n′);

注意,在循环后putchar(′\n′);语句不可少,它用以换行。

(4)现在应当解决如何按要求给出每行输出的字符。由图分析,行数(或行号)为1时输出字符A,行数为2时输出字母B„„若输出的字母放在变量ch中,行号取决于外循环的控制变量i,则输出的字母和行号的关系可用表达式:ch=′A′+i-1来表示。当i为1时ch中被赋予字母A,当i为2时ch中被赋予了字母B,其他依此类推。因此,在此表达式后,利用(3)中的循环就解决了各行上输出的字母。(5)按要求每行输出的字母的个数不同,第二行输出3个字母,第三行输出5个字母,第四行输出7个字母„„(3)中for循环体的执行次数取决于n的值,也就是说n的值决定了每行输出字母的个数。其实,n的值与行号有着密切的关系:n=2*i-1,当i为1时n的值是

1、当i的2时n的值是

3、当i的3时n的值是

5、当i的4时n的值是7。因此在(3)中for循环之前可用此表达式求出n的值。(6)总结以上分析,我们可得到以下的程序段: for(i=1;i<=L;i++) {

ch=′A′+i-1; n=2*i-1;

for(j=1;j<=n;j++)putchar(ch); putchar(′\n′);

 } 

若所用的变量都已正确定义,通过输入L的值为5,则程序段在第一列起有以下的输出结果: 

A

BBB

CCCCC

DDDDDDD

EEEEEEEEE

和题目的要求比较已趋接近,不同的是在每行没有适当的缩进。

(7)现在来解决每行的缩进问题。由题中给出的图形可知,若指定输出5行,第一行缩进5个空格,第二行则缩进4个空格,第三行则缩进3个空格,第四行则缩进2个空格,第五行则缩进1个空格。这同样可以由以下的for循环来实现:

for(k=L;k>=i;k--)putchar(′ ′);

把此循环放在i控制的循环体内、输出每行字符的循环之前即可。

(8)请读者自己补充有关的include行、语句和变量的定义,以完成整个程序。注意,如果有能力可在某些地方作些简化。

第七章、函数

一、选择题

7.1 以下说法中正确的是

A)C语言程序总是从第一个定义的函数开始执行

B)在C语言程序中,要调用的函数必须在main函数中定义

C)C语言程序总是从main函数开始执行

D)C语言程序中的main函数必须放在程序的开始部分

答案:C 7.2 以下函数的类型是

A)与参数x的类型相同

B)void类型

C)int类型

D)无法确定

fff(float x)

{ printf(”%d“,x*x);}

答案:C 7.3 以下函数调用语句中,含有的实参个数是

A)1

B)2

C)4

D)5

func((exp1,exp2),(exp3,exp4,exp5));

答案:B 7.4 以下程序的输出结果是

A)11

B)20

C)21

D)31

fun(int a,int b){ int c;

c=a+b;

return c;

} main(){ int x=6,y=7,z=8,r;

r=func((x--,y++,x+y),z--);

printf(”%d“,r);}

答案:C 7.5 以下程序的输出结果是

A)-1

B)0

C)1

D)2

main(){ int i=2,p;

p=f(i,i+1);

printf(”%d“,p);} int f(int a, int b){ int c;

c=a;

if(a>b)c=1;

else if(a==b)c=0;

else c=-1;

return(c);}

答案:A 7.6 以下程序的输出结果是

A)0

B)1

C)6

D)无定值

fun(int a,int b,int c){ c=a*b;

} main(){ int c;

fun(2,3,c);

printf(”%d“,c);}

答案:D 7.7 以下程序的输出结果是

A)5.500000

B)3.000000

C)4.000000 D)8.25

double f(int n){ int i;

double s;

s=1.0;

for(i=1;i<=n;i++)s+=1.0/i;

return s;} main(){ int i,m=3;float a=0.0;

for(i=0;i

printf(”%f“,a);}

答案:A

二、填空题

7.8 以下程序的输出结果是____。

unsigned fun6(unsigned num){ unsigned k=1;

do

{ k*=num%10;

num/=10;}

while(num);

return k;} main(){ unsigned n=26;

printf(”%d“,fun6(n);}

答案:12 7.9 以下程序的输出结果是____。

double sub(double x,double y,double z){ y-=1.0;

z=z+x;

return z;} main(){ double a=2.5,b=9.0;

printf(”%f“,sub(b-a,a,a));}

答案:9.000000 7.10 以下程序的输出结果是____。

fun1(int a,int b){ int c;

a+=a;b+=b;

c=fun2(a,b);

return c*c;} fun2(int a,int b){ int c;

c=a*b%3;

return c;} main(){ int x=11,y=19;

printf(”%d“,fun1(x,y));}

答案:4 7.11 下面pi函数的功能是,根据以下公式返回满足精度ε要求的π的值。请填空。

π/2 = 1 + 1/3 +(1/3)*(2/5)+(1/3)*(2/5)*(3/7)+(1/3)*(2/5)*(3/7)*(4/9)+...double pi(double eps){ double s=0.0,t=1.0;

int n;

for(_____;t>eps;n++)

{ s+=t;

t=n*t/(2*n+1);

}

return(2.0*_____);}

答案:n=

1、s 7.12 以下函数用以求x的y次方。请填空。

double fun(double x, int y){ int i;double z;

for(i=1;i_____;i++)

z=_____;

return z;}

答案:<=y、z*x 7.13 以下程序的功能是计算s=0!+1!+2!+3!+...+n!。请填空。

long f(int n){ int i;long s;

s=_____;

for(i=1;i<=n;i++)s=_____;

return s;} main(){ long s;int k,n;

scanf(”%d“,&n);

s=_____;

for(k=0;k<=n;k++)s=s+_____;

printf(”%ld“, s);}

答案:1L、s*i、0、f(k)

三、程序调试和编程题

7.14 【分析与解答】

(1)fun函数判断传给形参n的数是否为素数,若是函数返回1,否则返回0。

(2)函数的原意是用变量yes作为判断n是否为素数的标志,是素数,其值为1,否则为0。而所给函数的实际流程却不能实现这一功能,例如,若n的值为15(明显不是素数)时,在for循环中,当k的值为3时,就会执行if子句,yes得0,但for循环并没有终止,接着k为4时就会执行else子句,又使yes得1,由此可见此程序段并不能准确地判断一个数是否为素数;最后确定yes为何值的是for循环的终止值n/2,当n为15时,k的值为n/2等于7,在循环体内将又一次执行else子句,使yes得1,这时循环结束,函数返回1。由此可见所给fun函数不能起到预想的作用。

(3)由上分析可知,对于n的值为15时而言,问题是在一旦yes的值为0,已判断n中的值不是素数时,没有及时退出循环,返回0;因此,若在if子句中添加一条语句:break;就能解决这一问题,把if语句改写如下:

if(n%k==0){ yes=0;break;}

else yes=1;

(4)在所给fun函数中,当n的值为2、3时(都是素数),因为n/2的值为1(大于k中的2),所以不会进入for循环,而直接执行return语句,细心的读者应该可以发现,这时yes没有赋过值,也就是说,返回的是一个不确定的值,这将会导致错误;因此,应当在定义语句中给yes赋初值1:

int k,yes=1; 至此fun函数能正确运行。

(5)总结:因为一旦if语句中的表达式:n%k==0的值为1(即可被某数整除),则可以确定n不是素数,因此即可返回,不必再执行函数其他部分,if子句可改成:

if(n%k==0){ yes=0;return yes;}

else yes=1; 也可简化成:

if(n%k==0)return 0;

else yes=1;

又可进一步不用变量yes,并去掉else,简化成(请参考例7.4):

for(k=2;k<=n/2;k++) if(n%k==0)return 0;

return 1;

7.15【分析与解答】

(1)若用整型变量c存放余数,则求a被b除后的余数可用表达式:

c=a%b。

(2)本题要求编写函数mymod用以求a被b除后的余数即:

c=mymod(a,b);

(3)只要把a%b作为函数值返回即可完成操作(请参考例7.1):

int mymod(int a, int b)

{ return a%b;}

(4)总结:本题在算法上十分简单,只是要求读者能够掌握编写函数的基本知识。

7.16【分析与解答】

(1)本题所要采用的算法是累加。分析可见,所有累加项的分子都是1,而分母部分逐项增1;只是累加项的符号交叉变化。因此处理好符号的变化是完成操作的关键之一。

(2)若函数名为funa,传送到函数的参数是整型值,假定形参命名为n;函数的返回值应当是浮点型,为此函数的首部可以是:

double funa(int n)

(3)接着写函数体。累加放在一个for循环中来完成,若循环控制变量为k,可利用循环控制变量作为累加项t的分母,累加值放在add中:

for(k=1;k<=n;k++) {

„„

 t=s*1.0/k; add=add+t; } 

此处,s用作符号变量,在1和-1之间交叉变化,乘以1.0/k后,t的值也将按要求变化符号。注意,表达式1.0/k不可以写成1/k,因为每一项的绝对值必定是小于1的小数。

(4)现在需要确定s的值。最简单的可用表达式:s=-s来实现(请参考例5.2),若赋

值号右边s中的值为-1,则赋值号左边s中的值就得1;若赋值号右边s中的值为1,则赋值号左边s中的值就会得-1;则每循环一次就使s改变了一次符号。当然还可有多种方法。把以上表达式添加到循环体中:

for(k=1;k<=n;k++) {

s=-s; t=s*1.0/k; add=add+t; } 

(5)最后注意应当给各变量赋以适当的初值,并返回函数值。

(6)请编写主函数。当传给形参的值为10时,函数的返回值应当是:0.645635。

(7)总结:本题的算法并不复杂,但是需要读者掌握编写函数的基本知识。掌握需要传入函。

数的参数及其类型,掌握需要返回的值及其类型。在此基础上,其他方面与先前在主函数中编写的程序没有什么区别。

7.17 【分析与解答】

(1)此题与7.18相似。函数的返回值为浮点型,函数只有一个形参,为整型。

(2)函数的基本算法是累加,只是除第一项外其余各项都用减法;每一项的分子都是1,分母部分为k2,k的值逐项增1,由2变化到m。因此,算法可以用一个循环来实现。(3)当m的值为12时,函数值应是:0.435023。

7.18【分析与解答】

(1)若函数取名为fun,按题意,x作为形参,由调用函数传入,其类型不应当用整型;表达式x2-5x+4的值作为函数值返回,函数值的类型应为浮点型。因此,很容易写出函数:

double fun(double x)

{ return x*x-5*x+4;}

(2)若在调用函数时,x和y2已正确定义,且x已有确定的值,则可用以下函数调用语句得到y2的值:

y2=fun(x+15);

(3)同样,若在调用函数时,x和y3已正确定义,且x已有确定的值,则可用以下函数调用语句得到y3的值:

y3=fun(sin(x)); 注意,因为在程序中调用了C语言提供的库函数sin,因此应当在程序的最前面包含以下命令行:

#i nclude

″math.h″

(4)参考(2)和(3)应不难写出求y1的语句,请读者自己完成。

(5)y1的值应是:-2.0。当x的值为5时,y2的值应是:304.0。当x的值为0.5时,y3的值应是:1.832721。

(6)总结:

① 本题已给出了函数需要求值的表达式,读者只需确定函数的类型和形参的类型,就可以写出函数,就像例7.1中求两数之和的函数一样简单。

② 在给定了函数之后,调用函数时,函数的实参应当是一个与形参类型一致的任意合法的

表达式。例如,可以是常量、算术表达式,也可以是函数等。就像例7.1中求两数之和的add函数一样,可以用add(3,4);来求3+4;当x、y有确定值时,可以用add(x*x,y*y);来求x2+y2;当x、y有确定值时,可以用add(sin(x+y),cos(x+y));来求sin(x+y)+cos(x+y),这同样可以通过add(sin(add(x,y)),cos((add(x,y)));来求得。

第八章

指针

一、选择题

8.1 若有定义:int x,*pb;则以下正确的赋值表达式是

A)pb=&x

B)pb=x

C)*pb=&x

答案: A

8.2 以下程序的输出结果是

A)因变量无定义输出不定值

B)0

C)-1

#include

main()

{ printf(”%d“,NULL);

}

答案: B

8.3 以下程序的输出结果是

A)5,2,3

B)-5,-12,-7

C)-5,-12,-17

void sub(int x,int y,int *z)

{ *z=y-x;

}

main()

{ int a,b,c;sub(10,5,&a);sub(7,a,&b);sub(a,b,&c);printf(”%d,%d,%d“,a,b,c);

}

答案: B

8.4 以下程序的输出结果是

A)4

B)6

C)8

D)10

main()

{ int k=2,m=4,n=6;int *pb=&k,*pm=&m,*p;*(p=&n)=*pk*(*pm);

D)*pb=*x

D)1

D)5,-2,-7 printf(”%d“,n);

}

答案: C

8.5 已知指针p的指向如图8.5所示,则执行语句*p++;后,*p的值是

A)20

B)30

C)21

D)31

答案: B

8.6 已知指针p的指向如图8.5所示,则表达式*++p的值是

A)20

B)30

C)21

答案: B 8.7 已知指针p的指向如图8.5所示,则表达式++*p的值是

A)20

B)30

C)21

答案: C

8.8 以下程序的输出结果是

A)23

B)24

C)25

D)26

void prtv(int *x)

{ printf(”%d“,++*x);

}

main()

{ int a=25;prtv(&a);

}

答案: D

8.9 以下程序的输出结果是

A)运行出错

B)100

C)a的地址

main()

{ int **k, *a b=100;a=&b;k=&a;printf(”%d“,**k);

}

答案: B

8.10 以下程序的输出结果是

A)4,3

B)2,3

C)3,4

D)3,2

void fun(float *a,float *b)

{ float w;*a=*a+*a;w=*a;*a=*b;

D)31

D)31 D)b的地址

*b=w;

}

main()

{ float x=2.0,y=3.0;float *px=&x,*py=&y;fun(px,py);printf(”%2.0f,%2.0f“,x,y);

}

答案: C

8.11 以下程序的输出结果是

A)9.000000

B)1.500000

10.500000

void sub(float x,float *y,float *z)

{ *y=*y-1.0;*z=*z+x;

}

main()

{ float a=2.5,b=9.0,*pa,*pb;pa=&a,pb=&b;sub(b-a,pa,pa);printf(”%f“,a);

}

答案: C

8.12 以下四个程序中不能对两个整形值进行交换的是

A)main(){ int a=10,b=20;

swap(&a,&b);

printf(”%d%d“,a,b);} swap(int *p, int *q){ int *t,a;

t=&a;

*t=*p;*p=*q;*q=*t;}

B)main(){ int a=10,b=20;

swap(&a,&b);

printf(”%d%d“,a,b);} swap(int *p, int *q){ int t;

t=*p;*p=*q;*q=t;

C)8.000000

D)

}

C)main(){ int *a,*b;

*a=10,*b=20;

swap(a,b);

printf(”%d%d“,*a,*b);} swap(int *p, int *q){ int t;

t=*p;*p=*q;*q=t;}

D)main(){ int a=10,b=20;

int *x=&a,*y=&b;

swap(x,y);

printf(”%d%d“,a,b);} swap(int *p, int *q){ int t;

t=*p;*p=*q;*q=st;}

答案:C

二、填空题

8.13 以下程序段的输出结果是_____。

int *var,ab;

ab=100;

var=&ab;

printf(”%d“,*var);答案:100

8.14 以下程序的输出结果是_____。

int ast(int x,int y,int *cp,int *dp)

{ *cp=x+y;*dp=x-y;

}

main()

{ int a,b,c,d;a=4;b=3;ast(a,b,&c,&d);

printf(”%d %d“,c,d);

}

答案:7 1 8.15 若有定义:char ch;

ab=*var+10;

(1)使指针p可以指向变量ch的定义语句是_____。

答案:char *p=&ch;

(2)使指针p可以指向变量ch的赋值语句是_____。

答案:p=&ch;

(3)通过指针p给变量ch读入字符scanf函数调用语句是_____。

答案:scanf(”%c“,*p);

(4)通过指针p给变量ch的赋字符的语句是_____。

答案:ch=*p;

5)通过指针p输出ch中字符的语句是_____。

答案: printf(”%c“,*p);

8.16 若有如图8.5所示五个连续的int类型的存储单元并赋值如图,且p和s的基类型皆为int,p已指向存储单元a[1]。

(1)通过指针p,给s赋值,使其指向最后一个存储单元a[4]的语句是____。

答案: s=p+3;

(2)用以移动指针s,使之指向中间的存储单元a[2]的表达式是____。

答案: s=s-2;

(3)已知k=2,指针s已指向存储单元a[2],表达式*(s+k)的值是____。

答案: 50

(4)指针s已指向存储单元a[2],不移动指针s,通过s引用存储单元a[3]的表达式是____。

答案: *(a+1)

5)指针s已指向存储单元a[2],p指向存储单元a[0],表达式s-p的值是____。

答案: 2

6)若p指向存储单元a[0],则以下语句的输出结果是____。

for(i=0;i<5;i++)printf(”%d “,*(p+i));

printf(”“);

答案:10 20 30 40 50

三、编程题

8.17【分析与解答】

(1)若函数名为fun,按题意,函数不返回函数值;函数的形参需要接受传送过来的两个浮点数,因此需要有两个double类型的形参;另外要把它们的和值与差值,通过形参传送回去,这就要求有两个double类型的形参指针,接受传送过来的地址,以便通过指针把和值与差值传送给所指的主函数中的变量。因此函数的首部应当是:

void fun(double a, double b, double *p1, double *p2) 这里,a、b、p1、p2是自己取的名。

(2)假设把a、b的和值传送给p1所指的存储单元,可用语句:*p1=a+b;把a、b的差值传送给p2所指的存储单元,可用语句:*p2=a-b。(3)因此函数可写成:

void fun(double a,double b,double *p1,double *p2)

{ *p1=a+b;*p2=a-b;}

(4)在主函数中,若有定义语句:double x,y,z1,z2;,且x、y已赋值,则调用fun函数的语句可以是:fun(x,y,&z1,&z2)。

(5)总结:本题所要求的算法极简单,但它要求有两个值返回,用return语句就不可能返回两个函数值。要求读者能利用形参指针把要求的值间接地传回调用函数。

8.18【参考答案】

(1)若函数名为maxandmin,按题意,函数不返回函数值;函数将接受3个数(假定为int类型),并需要通过指针指向主函数中的两个int型变量,以便把最大值和最小值放入指针所指的存储单元中。因此函数的首部应当是:

void maxandmin(int a,int b,int c,int *pmax,int *pmin)

(2)函数体中需要实现求3个数的最大值和最小值的算法,此算法应当在学习第四章时已经掌握(可参考例4.2和习题4.24)。如果把a、b、c中的最大值暂时放在max中,把最小值放在min中,可用以下算法找到最大值: ① 假定a中的数最大,把a赋给max。

② 用b去和max比较,若b大于max,则把b赋给max;若不大于max,则什么也不做。 ③ 用c去和max比较,若c大于max,则把c赋给max;若不大于max,则什么也不做。 ④ 经过以上操作,max中已放入了a、b、c三个数中的最大数。 ⑤ 可模仿以上算法找到最小值:

min=a; if(b

(3)若最大值已放入max中,最小值已放入min中,则可用以下语句把最大和最小值放入指针pmax和pmin所指的存储单元中:

*pmax=max;*pmin=min;

(4)若主函数中已把3个数放入x、y、z中,要求把最大值放入m中,把最小值放在n中,则调用语句应当是:

maxandmin(x,y,x,&m,&n);

(5)总结:本题要求的算法在第四章应当已掌握,本题的主要目的是要求读者掌握如何通过指针把函数中的多个结果传回主函数。

第九章 数组

一、选择题 9.1 若已定义:

int a[ ]={0,1,2,3,4,5,6,7,8,9},*p=a,i;

其中0≤i≤9,则对a数组元素的引用不正确的是

A)a[p-a]

B)*(&a[i])C)p[i]

D)*(*(a+i))

答案:D

9.2 以下程序段给数组所有元素输入数据,应在下划线处填入的是

A)a+(i++)B)&a(i+1)

C)a+i

D)&a[++i]

main()

{ int a[10],i=0;while(i<10)scanf(”%d“,_________);

...}

答案:D 9.3 以下程序的输出结果是

A)3

B)4

C)1

D)2

main()

{ int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;printf(”%d“,*(p+2));

}

答案:A

9.4、以下程序的输出结果是

A)不确定的值 B)3

C)2

D)1

main()

{ int n[2]={0},i,j,k=2;for(i=0;i

for(j=0;j

}

答案: A

9.5 以下程序的输出结果是

A)17

B)18

C)19

D)20

main()

{ int a[ ]={2,4,6,8,10},y=1,x,*p;p=&a[1];for(x=0;x<3;x++)y+=*(p+x);printf(”%d“,y);

}

答案: C 9.6 以下程序的输出结果是

A)6

B)8

C)4

D)2

main()

{ int a[10]={2,4,6,8},*p=a,i;for(i=0;i<4;i++)a[i]=*p++;printf(”%d“,a[2]);

}

答案:A 9.7 以下程序的输出结果是

A)720

B)120

C)24

D)6

f(int b[ ],int n)

{ int i,r=1;for(i=0;i<=n;i++)r=r*b[i];return r;

}

main()

{ int x,a[]={2,3,4,5,6,7,8,9};x=f(a,3);printf(”%d“,x);

}

答案:B 9.8 以下程序中若第一个printf语句输出的是194,则第二个printf语句的输出结果是

A)212

B)204

C)1a4

D)1a6

main()

{ int a[]={1,2,3,4,5,6,7,8,9,0},*p;p=a;printf(”%x“,p);printf(”%x“,p+9);

}

答案:D 9.9 以下程序的输出结果是

A)0987654321

B)4321098765 C)5678901234 D)0987651234

fun(int *s,int n1,int n2)

{ int i,j,t;i=n1;j=n2;while(i

t=*(s+i);*(s+i)=*(s+j);*(s+j)=t;

i++;j--;}

}

main()

{ int a[10]={1,2,3,4,5,6,7,8,9,0},*p=a,i;fun(p,0,3);fun(p,4,9);fun(p,0,9);for(i=0;i<10;i++)printf(”%d“,*(a+i));

}

答案: C 9.10 以下程序的输出结果是

A)4 4

B)2 2

C)2 4

D)4 6

main()

{ int a[5]={2,4,6,8,10},*p,**k;p=a;

k=&p;printf(”%d “,*(p++));printf(”%d“,**k);

}

答案: C 9.11 当运行以下程序时输入三行,每行都是在第一列上开始,代表Enter键:

a

b

cdef

则程序的输出结果是

A)abcdef

B)a

C)a

D)a

b

b

b

c

cd

cdef

d

e

f

#include ”stdio.h“

#define N 6

main()

{ char c[N];

int i=0;for(i=0;i

}

答案: C 9.12 若有定义和语句:

int c[4][5],(*cp)[5];

cp=c;

则对c数组元素的引用正确的是

A)cp+1

B)*(cp+3)

C)*(cp+1)+3

D)*(cp+2)

答案: D 9.13 若已定义:

int a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12},(*prt)[3]=a,*p=a[0];

则能正确表示数组元素a[1][2]的表达式是

A)*((*prt+1)[2] B)*(*(p+5))C)(*prt+1)+2 D)*(*(a+1)+2)

答案: D 9.14 若有定义和语句:

int a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12},(*prt)[3]=a,*p[4],i;

for(i=0;i<4;i++)p[i]=a[i];

则不能够正确表示a数组元素的表达式是

A)a[4][3]

B)p[0][0]

C)prt[2][2]

D)(*(p+1))[1]

答案: A 9.15 以下程序的输出结果是

A)23

B)26

C)33

D)36

main()

{ int aa[3][3]={{2},{4},{6}},i,*p=&aa[0][0];for(i=0;i<2;i++){ if(i==0)

aa[i][i+1]=*p+1;

else ++p;

printf(”%d“,*p);} printf(”“);

}

答案: A 9.16 以下程序的输出结果是

A)60

B)68

C)99

D)108

main()

{ int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};int(*p)[4]=a,i,j,k=0;for(i=0;i<3;i++)

for(j=0;j<2;j++)

k+=*(*(p+i)+j);printf(”%d“,k);

}

答案: A 9.17 以下程序的输出结果是

A)1,5,9,B)1,4,7,C)3,5,7,D)3,6,9,main()

{ int i,x[3][3]={1,2,3,4,5,6,7,8,9};for(i=0;i<3;i++)printf(”%d,“,x[i][2-i]);

}

答案: C 9.18 若有定义语句 int(*p)[M];其中的标识符p是

A)M个指向整型变量的指针

B)指向M个整型变量的函数指针

C)一个指向具有M个整型元素的一维数组指针

D)具有M个指针元素的一维指针数组,每个元素都只能指向整型量

答案: C

二、填空题

9.19 若有以下定义:

double w[10];

则w数组元素下标的上限是____,下限是____。

答案: 9 0

9.20 以下程序的输出结果是____。

main()

{ int a[]={2,4,6},*prt=&a[0],x=8,y,z;for(y=0;y<3;y++)

z=(*(prt+y)

}

答案:6 9.21 以下程序的输出结果是____。

main()

{ int arr[10],i,k=0;for(i=0;i<10;i++)arr[i]=i;for(i=0;i<4;i++)k+=arr[i]+i;printf(”%d“,k);

}

答案:12

9.22 以下程序的输出结果是____。

#define N 5

fun(char *s,char a,int n)

{ int j;*s=a;j=n;while(a

}

main()

{ char s[N+1];int k,p;for(k=1;k<=N;k++)s[k]=''''A''''+k+1;printf(”%d“,fun(s,''''E'''',N));

}

答案:3 9.23 若输入3个整数3,2,1,则以下程序的输出结果是____.void sub(int n,int uu[])

{ int t;t=uu[n--];t+=3*uu[n];n++;if(t>=10){ uu[n++]=t/10;uu[n]=t%10;} else uu[n]=t;

}

main()

{ int i,n,aa[10]={0};scanf(”%d%d%d“,&n,&aa[0],&aa[1]);for(i=1;i

}

答案: 2721

9.24 以下程序的输出结果是____.main()

{ int i,j,row,col,m;int arr[3][3]={{100,200,300},{28,72,-30},{-850,2,6}};m=arr[0][0];for(i=0;i<3;i++)

for(j=0;j<3;j++)

if(arr[i][j]

{ m=arr[i][j];row=i;col=j;} printf(”%d,%d,%d“,m,row,col);

}

答案:-850,2,0 9.25 以下findmax返回数组s中最大元素的下标,数组中元素的个数由t传入,请填空。

findmax(int s[],int t)

{ int k,p;for(p=0,k=p;p

if(s[p]>s[k])____;return ____;

}

答案: k=p k

9.26 以下程序统计从终端输入的字符中每个大写字母的个数,num[0]中统计字母A的个数, 其它依次类推.用#号结束输入,请填空.#include

”stdio.h“

#include

”ctype.h“

main()

{ int num[26]={0},i;char c;while(____!=''''#'''')

if(isupper(c))

num[___]+=1;for(i=0;i<26;i++)

if(num[i])printf(”%c: %d“,i+''''A'''',num[i]);

}

答案:(c=getchar())c-''''A'''

三、上机题

9.27【分析与解答】

(1)对于字符的输入可参考教材例6.3和习题9.26中的while循环,只是要注意,循环的终止条件是:等于′\[KG-*3]n′。

(2)在while循环体中,用if条件来判断是否为数字字符,若是,就使对应的元素增1;if中的条件表达式可用C的库函数:isdigit(ch),这时要在程序前加:#i nclude 行;也可用:ch>[KG-*3]=′0′&&ch<[KG-*3]=′9′。

(3)若用num数组元素来进行统计,当ch中是数字“0”时,使num[0]增

1、当ch中是数字 “1”时,使num[1]增1„„num的下标表达式可用:ch-′0′。

(4)注意,在定义数组时,数组的大小应符合使用的要求。在利用数组元素作为计数器时,不要忘记首先应该给数组元素赋0值。

(5)总结:通过本题的编程,要求掌握利用数组元素作为计数器的基本算法。

9.28【分析与解答】

本题的编程请参考例9.8。(1)若有以下10个整数:

0 1 2 3 4 5 6 7 8 9 要求从第5个元素依次向前移,则移动之后的数列应该是:

0 1 2 4 5 6 7 8 9

第5个元素不是指下标为5的元素,而是指排列的顺序,对此数列而言是指数值为4的那个。(2)完成移动后,数列中的数据个数减1。

(3)若进行指定操作的函数名为moves,则函数的首部可如下:

void moves(int *a,int n,int *m) 这里a用以指向一维数组的首地址,n接受开始移动的元素的位置,m指向主函数中存放元素个数的变量,因为没有函数值返回,因此函数的类型定义为void。(4)可用以下for循环完成指定的移动:

for(i=n-1;i<*m;i[KG-*3]+[KG-*3]+)a[i-1]=a[i];

注意,应当先把第n个元素(下标为n-1)移到第n-1个元素(下标为n-2)的位置上,依次葱馨到后向前移动。(5)完成移动之后,应使m所指变量中的值减1,表示数列中的数据少了一个;这可由于句: *m=*m-1;来完成。

(6)可设计一个输出函数,在移动前、后调用此函数输出数组中的数据,以便验证操作是否正确。若输出函数名为:outarr,则函数首部可写成:

void outarr(int a[], int num)

形参a指向待输出的数组,num接受数组中元素的个数。输出操作可由一个for循环来完成:

for(i=0;i

printf(″\[KG-*3]n\[KG-*3]n″); 退出循环后的printf语句使上面的输出行结束。

(7)在主函数中定义所需的数组和变量。数组中的值可以在主函数中输入,也可定义一个函数用于输入数据。n的值在主函数中输入,然后调用以上函数。需要注意的是,给n输入的值不能是1,因为第一个元素(下标为0)再向前移,下标就越界了,同时,n的值也不可大于10,因为已指定只有10个元素。(8)总结:

① 对于需要进行多次的操作,如本程序中输出数组元素中的值,应当编写一个独立的函数多次调用,而不应重复地编写代码。虽然该函数中只是一个for循环,似乎在主函数中书写两次也不麻烦,但养成良好的模块化程序设计的风格却是十分重要的。

② 分析以上例子可见,所规定的操作,实际上删除了数列中的第n-1个元素,因此可见删除操作是由移动操作来完成的。

9.29【分析与解答】

(1)程序要求定义两个数组以便存放原始数据和从中选出的所有奇数。(2)若把函数命名为oods,则函数首部可写成:

void odds(int *a,int an,int *b,int *bn)

形参a指向存放原始数据的数组,an存放此数组中数据的个数;b指向另一个数组,此数组中将存放将选出的所有奇数,指针bn指向存放奇数个数的存储单元,因为将通过此指针,把奇数的个数传回主函数。(3)在odds函数中,可通过一个for循环选出所有的奇数:

for(i=0;i

if(a[i]%2){ b[j]=a[i];j[KG-*3]+[KG-*3]+;}

在for循环中逐个引用原始的数组元素,若元素中的值不能被2除尽(不为0),则把它放入b所指的数组中;j用作b的下标,每放入一个奇数后,j的值加1;注意,j的初值应该置0。

(4)当完成以上操作退出循环时,因为在循环内最后进行了一次j[KG-*3]+[KG-*3]+的操作,所以j的值就是奇数的个数,最后应当把它赋给*bn,以便通过指针bn把奇数的个数传回主函数。

(5)程序需要两次输出数组中元素的值,一次是输出原始数组中的值,一次是输出奇数数组中的值。因此可以使用题9.28中的outarr函数,进行两次调用。

(6)在主函数中应当定义所需的数组和变量,可以在主函数中给数组元素输入数据。

(7)总结:本题的算法很简单,要求读者能够编写独立的模块,并在函数之间熟练地传送数据。

9.30【分析与解答】

(1)例9.9完成了对整数由小到大的排序,而本题是对字符数组中的元素进行由大到小的排序;两者之间并无大的区别,只是数组的类型不同,字符数组中每个元素存放一个字符,字符的大小依据每个字符的ASCII码值的大小。

(2)若函数形参a指向主函数中待排序的数组,由大到小的排序只需改变内循环中if语句的条件表达式即可:

if(a[p]

(3)排序前后可以调用一个输出函数,输出原始数据和排序后的数据,可参考习题9.28的outarr函数,但注意,这里是对字符数组进行输出。

(4)总结:读者可以参考例9.9,程序基本相同,但在掌握排序算法的基础上,必须独立完成此程序,不要照抄。

9.31【分析与解答】

(1)我们把插入操作命名为函数insert,若待插入的数据放在形参x中,指针a指向主函数中的数组,指针n指向存放数组中元素的个数变量,因为插入后,数组中的数据会增加。函数的首部如下:

void insert(int *a,int x,int *n)(2)若数组中原有的有序数列按由小到大排列如下,共12个数:

14 17 18 19 20 22 24 26 29 30 33

若x中的数为21,我们立刻知道应插在何处,插入后数列如下,则插入后变成有13个数:

14 17 18 19 20 21 22 24 26 29 30 33 因此,对于程序来说应当做以下4件事:

① 能根据待插的数据,按“仍然有序的要求”判断出插入的位置。 ② 把位置腾出来,以便放入插入的数据,但原有的数据不能缺少。 ③ 把x中的数放入腾出来的位置中。 ④ 使原有数组中的数据个数增1。

(3)现在来做第一个步骤:确定插入的位置。用变量j来放置该位置在数组中的下标,以下while循环将完成此任务:

j=0;

while(j<*n && a[j]

因为已经假定数列按由小到大排列,当x的值大于当前的元素a[j]时,应当接着与下一个元素比较(执行j[KG-*3]+[KG-*3]+),直到x的值小于或等于当前的元素a[j]时,x就应当插入到下标为j的元素中,在此之前的所有值都比x小。当x的值小于a[0]时,不进入while循环,j的值为0。x就应当插入到下标为0的元素中。当x的值大于数组中所有的元素时,由条件:j<*n 可知,这时j的值将等于*n并退出循环。x就应当插入到下标为j的元素中。

(4)第二个步骤是要把下标为j的元素后原有的数据移走,但不能改变原来的顺序。那么只能把下标为j至下标为*n-1中的数据依次向后平移;这种平移,应当先把最后的、下标为*n-1的元素中的数据移到下标为*n的元素中,其他依次后移一个单元,直到把a[j]中的值放入a[j+1]中。这可由以下for循环来完成:

for(i=*n-1;i>[KG-*3]=j;i--)a[i+1]=a[i];(5)第三个步骤是把x放入a[j]中:a[j]=x;

(6)第四步是使存放数据个数的变量中的数增1:*n=*n+1;插入过程到此结束。

(7)可利用习题9.28中的outarr函数,在插入前和插入后两次输出数组元素,以判断操作是否正确。(8)请编写主函数,定义所需的数组和变量,给数组输入一组有序数,正确调用函数。(9)请按题目要求至少对程序运行3次,判断程序是否在各种情况下都能得到正确的结果。

(10)总结:插入算法是程序设计中的一种最基本的算法,希望读者在理解的基础上编写程序。

9.32【分析与解答】

(1)若函数名为change,函数首部如下: 

void change(int x,int *a, int *n)

形参x中存放一个待转换的十进制数,指针a指向一个一维数组,数组中每一个元素中存放一个0或1代表一位二进制数,指针变量n指向一个整型变量,其中存放在一维数组中二进制位的个数。

(2)函数中定义一个指针变量s,并把a所指的数组的首地址赋给它以便保留。把x每次被2除后的余数放在a当前所指的数组元素中,然后移动指针a指向下一个元素,并使x的值除2;重复此过程,直到x的值为0。可用以下的while循环来进行转换:

s=a;

while(x)

{ *a=x%2;a+[KG-*3]+;x=x/2;}

退出循环时,已把转换后的二进制数的每一位上的数放入主函数的数组元素中,但是应当注意,在a[0]中放的是二进制数的最低位,最后放入的是最高位。例如,整数8转换成的二进制数为100,则在a[0]、a[1]中存放的是0,而a[2]中存放的是1。

(3)函数中最后用:*n=a-s;把存放在一维数组中二进制位的个数放入n所指的变量中。因为s已指向主函数中数组的第一个元素(下标为0);在循环中,指针a不断后移,最后指向存放二进制数最高位的元素;所以a-s的值就是已存入数据的元素的个数。

(4)在主函数中输入待转换的十进制数,调用change函数后输出数组元素中的值,注意,因为在a[0]中放的是二进制数的最低位,因此输出的顺序应该从a[n]到a[0]。

9.33【分析与解答】

(1)若函数名为getone,形参指针a指向主函数中存放指定数据的数组。函数的首部如下:

void getone(int a[])

(2)函数中变量x用来存放得到的一个随机数,变量n用来存放数组中已放入的不同的随机数的个数,变量i用作下标变量。

(3)所有的工作在一个while循环中完成:

while(n<15){„„}

当不同的随机数的个数n的值等于15时退出循环。(4)在以上while循环中需要进行以下4项步骤: ① x=rand()%20;得到一个小于20的随机整数。

② i=0;准备从下标为0的元素开始去查找数组中是否有与x相同的数,若没有,就把x中的数加入到数组中(放在最后),若有,就什么也不做。

③ 用以下while循环从头到尾去检查数组中是否有与x值相同的元素:

while(i

a.当x不等于a[i]时,i[KG-*3]+[KG-*3]+,x再去与下一个元素进行比较,当遇到x等于a[i]时,说明在数组中已经有此数,因此不必再去比较,应当退出循环。

b.当x不等于a[i]时,i的值不断增1;当i的值等于n时,说明x已与数组中所有元素都比较过且都不相同,这时也应退出循环。

④ 如果i的值等于n时,数组中没有与x相同的元素,因此需要把新的值放入数组中,可用以下语句来实现:

if(i==n){ a[n]=x;n[KG-*3]+[KG-*3]+;}

因为已有的数据放在下标为0到n-1的元素中,因此新的数放在a[n]中,然后n[KG-*3]+[ KG-*3]+;即数组中不同数据的个数增1。

(5)接着重新循环,再去产生一个新的随机数,重复以上过程,直到n的值等于15时退出外循环。这时在数组中已放入了15个不同的随机整数。

(6)请在主函数中定义所需的数组和变量。调用getone函数后,可在主函数中输出所得的数据。(7)总结:

① getone函数的主要部分是查找,没有找到才进行下一步操作。

② C语言提供的库函数rand()每调用一次产生一个0到32767的随机整数,因此ran 9.34【分析与解答】

(1)本题可参考例9.11。

(2)本题可用define命令行定义N来代表一个常量(参考2.2.3节)。可定义4个独立的函数来实现所要求的操作。

第一个函数:

void getm(int(*[KG-*3]p)[N])

用于给二维数组元素赋随机数。形参p是一个行指针,N是二维数组的列数。 第二个函数:

void sum(int a[][N],int *rows,int *[KG-*3]cols)

用于求出二维数组每一行元素的和值放在形参指针rows所指的一维数组中,求出二维数组每一列元素的和值放在形参指针cols所指的一维数组中。形参a是一个行指针,N是二维数组的列数。 第三个函数:

void diagsum(int a[][N],int *dg1, int *dg2)

用于求出方阵的两个对角线上元素的和值,分别放在形参指针dg1和dg2所指的变量中。形参a是一个行指针,N是二维数组的列数。

第四个函数用于必要的输出,请读者自己设计。

(3)在getm函数中,利用一个双重循环,调用rand函数给二维数组赋值:

for(i=0;i

(4)在sum函数中,利用一个双重循环,分别求出每行的和值放入rows所指数组中,每列的和值放入cols所指数组中:

for(i=0;i

{ rows[i]+[KG-*3]=a[i][j];cols[i]+[KG-*3]=a[j][i];}

当i=0时,rows[i]+[KG-*3]=a[i][j];通过内循环控制变量j从0到N-1的变化,把下标为0行上的每一个元素的值累加,放入rows所指的、下标为0的数组元素中;而cols[i]+[KG-*3] =a[j][i];通过内循环控制变量j从0到N-1的变化,把下标为0列上的每一个元素的值累加,放入cols所指的、下标为0的数组元素中。其他依次类推。

因为进行累加运算,注意要给每个一维数组置初值0。

(5)在diagsum函数中,通过一个for循环来求得两对角线上元素之和:

for(i=0;i

在主对角线上的元素行下标和列下标相同。而在从右到左对角线上的元素,行下标从0变化到N-1;对于列下标,当行下标为0时,列下标为N-i-1,当行下标为1时,列下标也可用表达式N-i-1求得,其他依此类推。(6)请参考例9.11的outdata函数对二维数组和有关数据的输出。

(7)总结:对二维数组的操作,一般可利用一个双重循环来进行。本题虽然有多个任务,但可用函数,每个函数完成一个任务,每个函数都很简单,且都很容易读懂;一定要避免把所有的任务混在一起。 9.35【分析与解答】

(1)要进行相加的两个矩阵(假定为a和b)的行数应当相等,列数应当相等。两个矩阵相加就是把两个矩阵中下标相同的两个元素相加,相加的和值放在第三个矩阵(假定为c)、相同下标的元素中。即:c[i][j]=a[i][j]+b[i][j]。

(2)可以定义一个函数getms(参考题9.34),利用rand()函数给两个矩阵赋值。(3)定义addm函数,对两个矩阵相加:

void addm(int(*a)[M], int(*b)[M], int(*[KG-*3]c)[M])

这里a、b、c是行指针,分别指向三个二维数组(N行M列),要求这三个数组的行和列数相同。和值放在c所指数组中。矩阵相加的操作放在一个双重循环中:

for(i=0;i

void output(int(*a)[M]) 用双重循环来实现

for(i=0;i

{ for(j=0;j

可调用三次分别输出a、b、c三个矩阵。

(5)请在主函数中定义数组和所需的变量。调用getms函数得到原始数据,调用addm函数实现矩阵相加,调用输出函数输出三个矩阵。

9.36【分析与解答】

(1)为了输出以上表格,需要定义一个9×9的二维数组。在其中存入九九表中的数据。(2)定义函数gettab,在二维数组中存入九九表中的数据:

void gettab(int a[][N]) 形参a是一个指向9×9二维数组的行指针。

(3)在gettab函数中,可用以下for循环把九九表中的数据放入数组中:

for(i=0;i

for(j=0;j

(4)请读者参照前面的习题,设计output函数,输出九九表。表格的第二行:

(1)(2)(3)(4)(5)(6)(7)(8)(9) 可用以下语句输出:

for(i=1;i<[KG-*3]=9;i[KG-*3]+[KG-*3]+)printf(″(%d)″,i);

printf(″\[KG-*3]n″); 在二维数组每一行输出前(即内循环之前)加语句:printf(″(%d)″,i+1);就可得到每一行最前面的(1)、(2)、„、(9)。

(5)输出的格式不可能在第一次调试时就合适,一般需运行几次进行调整。(6)请读者自己完成主函数,定义所需的数组和变量,调用以上的函数。(7)总结:本题的算法很简单,只包含给二维数组的赋值和表格的输出,对于表格的格式,可以通过对程序的运行,逐步进行调整。

9.37【分析与解答】

(1)假定程序定义了M行N列的二维数组。可用define命令行定义N和M来分别代表两个常量(参考2.2.3节)。

(2)程序的功能可由几个独立的函数来实现。

① void getm(int(*[KG-*3]p)[N])形参p是一个行指针,指向M×N的数组首地址。getm函数的功能是通过调用rand函数给二维数组赋值。请参考习题9.34中的同名函数。

② void suml(int a[][N],int *rows)形参a是一个行指针,指向M×N的数组首地址,指针rows指向一个一维数组,在此数组元素中将存放每行元素之和。suml函数的功能是求出a所指二维数组中每一行元素之和并依次放在rows所指数组中。请参考习题9.34中的sum函数。

③ int getmax(int *rows)形参指针rows指向存放每行元素之和的一维数组,在此函数中将求出最大值所在的下标作为函数值返回。请参考习题9.25。

④ void change(int a[][N],int k)形参行指针a,指向M×N的数组首地址,k接受一维数组中最大值所在的下标。此函数的功能是把二维数组中下标为k的那一行、与下标为0的行的所有元素进行对调。对调可用一个for循环来实现:

for(i=0;i

{ t=a[0][i];a[0][i]=a[k][i];a[k][i]=t;}

⑤ void output(int a[][N])此函数的功能是输出a所指的二维数组。可在数组改变前后分别调用它,以判断程序的操作是否正确。请参考习题9.35中的同名函数。

(4)请在主函数中定义所需的数据结构:如数组、变量,并调用各函数。

(5)总结:交换数据的算法应当已很熟悉,本题只是交换两行中的数据,这时被交换的两个元素的行下标不同,而列下标相同。读者不妨对两列中的数据进行交换。本题中,除对二维数组中的两行进行对调外,其他的算法在此之前都已介绍过,由此可知,应当积累一些基本的算法知识,程序的完成都是由一些基本算法来实现的。 9.38【分析与解答】

(1)在定义数组时应该注意,进行逆置操作的矩阵必须是一个方阵,行、列数相同。

(2)在本题中给二维数组置数以及对二维数组进行输出,请参考习题9.37,在此不再重复。(3)对矩阵进行逆置的操作可由以下函数完成:

void transpose(int p[][N])

形参p指向一个二维数组。逆置的过程可由双重循环来完成:

for(i=0;i

{ t=p[i][j];p[i][j]=p[j][i];p[j][i]=t;}

内循环的控制变量j的变化范围从0到i,以对角线为界,把对称位置上的元素值进行对调。(4)请编写主函数,定义所需的数据结构,并调用函数来实现规定的操作。(5)总结:本题主要的算法也是交换算法,关键是需要正确确定交换的范围。

第十章 字符串

一、选择题

10.1 以下能正确进行字符串赋值,赋初值的语句是

A)char s[5]={''a'',''e'',''i'',''o'',''u''};

B)char *s;s=”good!“;

C)char s[5]=”good!“;

D)char s[5];s=”good!“;

答案: B

10.2 以下程序段的输出结果是

A)68

B)0

C)字符D的地址

D)不确定的值

char str[]=”ABCD“,*p=str;

printf(”%d“,*(p+4));

答案: B

10.3 以下程序段的输出结果是

A)11

B)10

C)9

D)8

printf(”%d“,strlen(”ATS0121“));

答案: C

10.4 当运行以下程序时输入OPEN T H E DOOR(此处代表Enter键),则输出结果是

A)oPEN tHE dOOR

B)open the door

C)OPEN T H E DOOR D)Open The Door

#include ”stdio.h“

char fun(char *c)

{ if(*c<=''Z''&&*c>=''A'')*c-=''A''-''a'';return *c;

}

main()

{ char s[81],*p=s;gets(s);while(*p){ *p=fun(p);putchar(*p);p++;} putchar('''');

}

答案: B

10.5 以下程序的输出结果是

A)GFEDCBA

B)AGADAGA

C)AGAAGAG

D)GAGGAGA

#include ”stdio.h“

#include ”string.h“

void fun(char *w,int m)

{ char s,*p1,*p2;p1=w;p2=w+m-1;while(p1

}

main()

{ char a[]=”ABCDEFG“;fun(a,strlen(a));puts(a);

}

答案: C

10.6 以下程序的输出结果是

A)ABCD

B)A

C)D

D)ABCD

BCD

B

C

ABC

CD

C

B

AB

D

D

A

A

main()

{ char s[]=”ABCD“,*p;for(p=s;p

}

答案: A 10.7 设有如下定义:

char *aa[2]={”abcd“,”ABCD“};

则以下说法中正确的是

A)aa数组元素的值分别是”abcd“和”ABCD“

B)aa是指针变量,它指向含有两个数组元素的字符型一维数组

C)aa数组的两个元素分别存放的是含有四个字符的一维数组的首地址

D)aa数组的两个元素中各自存放了字符''a''和''A''的地址

答案: C

10.8 以下程序的输出结果是

A)6385

B)69825

C)63825

D)693825

main()

{ char ch[2][5]={”6937“,”8254“},*p[2];int i,j,s=0;for(i=0;i<2;i++)p[i]=ch[i];for(i=0;i<2;i++)

for(j=0;p[i][j]>''''&&p[i][j]<=''9'';j+=2)

s=10*s+p[i][j]-''0'';printf(”%d“,s);

}

答案: A

10.9 以下程序的输出结果是

A)ABCDEFGHIJKL B)ABCD C)ABCDEFGHIJKLMNOP D)AELM

main()

{ char *alpha[6]={”ABCD“,”EFGH“,”IJKL“,”MNOP“,”QRST“,”UVWX“};char **p;int i;p=alpha;for(i=0;i<4;i++)printf(”%s“,p[i]);printf(”“);

}

答案: C

10.10 库函数strcpy用以复制字符串。若有以下定义和语句:

char str1[]=”string“,str2[8],*str3,*str4=”string“;

则对库函数strcpy的不正确调用是

A)strcpy(str1,”HELLO1“);

B)strcpy(str2,”HELLO2“);

C)strcpy(str3,”HELLO3“);

D)strcpy(str4,”HELLO4“);

答案: C

二、填空题

10.11 以下程序的输出结果是____。

#include ”stdio.h“

main()

{ char b[]=”ABCDEFG“,*chp=&b[7];while(--chp>&b[0])putchar(*chp);putchar('''');

}

答案:

GFEDCB

10.12 以下程序的输出结果是_____。

#include ”stdio.h“

void fun(char *a1,char *a2,int n)

{ int k;for(k=0;k

a2[k]=(a1[k]-''A''-3+26)%26+''A'';a2[n]='''';

}

main()

{ char s1[5]=”ABCD“,s2[5];fun(s1,s2,4);puts(s2);

}

答案:XYZA 10.13 以下程序的输出结果是____。

main()

{ char *p[]={”BOOL“,”OPK“,”H“,”SP“};int i;for(i=3;i>0;i--,i--)printf(”%c“,*p[i]);printf(”“);

}

答案:SO

10.14 当运行以下程序时从键盘输入字符串qwerty和abcd,则程序的输出结果是____。

#include ”string.h“

#include ”stdio.h“

strle(char a[],char b[])

{ int num=0,n=0;while(*(a+num)!='''')num++;while(b[n]){ *(a+num)=b[n];num++;n++;} return(num);

}

main()

{ char str1[81],str2[81],*p1=str1,*p2=str2;gets(p1);gets(p2);printf(”%d“,strle(p1,p2));

}

答案:10 10.15 以下程序的输出结果是____。

#include ”string.h“

#include ”ctype.h“

void fun(char str[])

{ int i,j;for(i=0,j=0;str[i];i++)

if(isalpha(str[i]))str[j++]=str[i];str[j]='''';

}

main()

{ char ss[80]=”It is!“;fun(ss);printf(”%s“,ss);

}

答案:Itiss!

10.16 以下fun函数的功能是将一个字符串的内容颠倒过来,请填空。

#include ”string.h“

void fun(char str[])

{ int i,j,k;for(i=0,j=____;i

}

答案:strlen(str)-1

j--10.17 以下程序段的输出结果是_____。

printf(”%d“,strlen(”s160end“));

答案:3

10.18 以下程序段的输出结果是_____。

char s[20]=”goodgood!“,*sp=s;

sp=sp+2;

sp=”to“;

puts(s);

答案:goodgood!

三、编程题

10.19【分析与解答】

(1)已知gets函数的调用形式为:gets(str),str是存放所读入字符串的起始地址,可以是字符数组名、已指向一串固定存储单元的字符指针或数组元素的地址。gets函数从终端读入一串字符,直到读入一个回车换行符为止,字符串中不包括回车换行符,并在最后自动添加′\0′。现在,在mygets函数中规定用getchar函数进行字符的读入,在此前,我们已多次使用过此函数,并以回车换行符作为结束输入的条件。函数的首部如下:

mygets(char *s) 输入过程如下:

while((*s=getchar())!=′\n′)

s+ +;这里把读入的字符存入s所指的存储单元中,然后移动s,使它指向下一个存储单元。最后当读入′\n′后,结束输入;这时,s指向存放′\n′的存储单元,不要忘记在此单元中放入字符串结束标志来替换′\n′:*s=0。

(2)puts函数的调用形式为:puts(str),str是输出字符串的起始地址。puts函数输出从str地址开始的字符串,最后自动输出一个换行符。myputs函数的首部如下:

myputs(char *s)

用以下循环输出字符串中的每一个字符直到遇到字符串结束标志:

while(*s){ putchar(*s);s+[KG-*3]+;}

当s所指存储单元中是字符串结束标志时退出循环,然后输出一个换行符:putchar(′\[KG-*3]n′)。

(3)请编写主函数分别调用这两个函数,并分别与gets和puts函数比较。

(4)总结:在mygets函数中利用while循环输入字符的操作在第六章中已多次用到,应当已经熟练掌握;而在myputs函数中利用指针的移动来输出所指存储单元的数据也是应熟练掌握的算法。10.20【分析与解答】

(1)函数首部如下:

int fun(char *s) 字符指针形参s指向待查字符串。

(2)定义变量i和j,使其初值分别为0和最后一个字符所在的下标,j的值可通过库函数求得:

i=0;j=strlen(s)-1;(3)利用循环,通过i++和j--,使i和j不断分别向后和向前移动,以便引用对称的元素进行比较,若s[i]等于s[j],则当前符合回文条件,i和j的移动继续,否则退出循环;当i大于等于j时,说明对称位置中的字符都已经比较过且符合回文条件,因此也应退出循环:

while(i

if(i

else return 1;

(5)请编写主函数,定义所需数据结构,输入不同字符串,调用函数并输出函数值,以判断函数是否正确。(6)总结:本题的算法与逆置算法相似,只是没有对应位置中数据的移动,而是进行比较。

10.21【分析与解答】

(1)本题的算法可参考习题9.28。

(2)若函数名为delc,则函数首部可写成:

char delc(char *s, int pos)

因为删除成功要求返回被删的字符,因此函数值的类型应是char。形参字符指针s指向被删字符串的开始,形参pos存放指定的删除位置,注意被删字符的下标就是pos-1。

(3)删除操作实际上是从指定位置开始把字符串中的字符逐个前移,直到遇到字符串结束标志。这一过程可用for循环来完成。先把下标为pos中的字符前移到下标为pos-1的元素中,其他依次前移:

for(i=pos;s[i];i[KG-*3]+[KG-*3]+)s[i-1]=s[i];

退出循环时s[i]中已是字符串结束标志,不要忘记:s[i-1]=s[i];使结束标志也向前移一位。(4)在进行删除操作前,需要检查指定删除位置pos的值是否合理,若不合理就立即返回空值:

if(pos>strlen(s)||pos<[KG-*3]=0)return 0;

(5)在删除操作前,应该纪录下被删的那个字符,以便作为函数值返回:c=s[pos-1]。

(6)请编写主函数,定义所需的数组和变量,输入字符串和输入删除的位置,调用函数后输出删除后的字符串,并对各种情况进行测试,以检查程序是否正确。

(7)总结:删除算法是程序设计中的基本算法,虽然,在细节的要求上可能有所不同,例如对于一维数组中的数据,需要变动数据的个数,而字符串则要求重新设置字符串结束标志。

10.22【分析与解答】

(1)若函数名为dels,函数首部如下:

void dels(char *s) 形参s是一个指向字符串的指针变量。

(2)函数中先完成删除字符串中最后的所有空格。这只要在最后一个非空格字符的后面加上字符串结束标志(′\0′),就使得最后所有的空格都被删除了。但完成这一操作需要通过三个步骤:第一,找到字符串的最后一个空格的位置;第二,往回找到字符串的最后一个非空格的位置;第三,在最后一个非空格的位置的后面加上字符串结束标志。

① 找到字符串的最后一个空格的位置可用以下语句来完成,函数中另定义一个指针变量p,并把s的值赋给它,使它指向字符串的开始。以下while循环和语句使p指向最后的一个字符(′\0′的前面)。

while(*p)p++;

p--;

也可以调用求字符串长度的库函数:p=s+strlen(s)-1;使p指向最后的一个字符。 ② 往回找到字符串的最后一个非空格的位置可用以下语句来完成:

while(*p==′ ′)p--;

以上while循环中,只要p所指存储单元中是空格,就使p移动指向前一个字符,当p所指存储单元中不是空格时立刻退出循环;这时p指向字符串中最后一个非空格字符。

③ 请读者自己把字符串结束标志放在最后一个非空格的位置的后面。

(3)函数接着删除字符串中的前导空格。这只要把前导空格后的第一个非空格字符移到字符串的开头,其后的字符依次前移即可。完成这一操作,首先需要知道第一个非空格字符的位置(下标);然后把其后的字符串移到字符数组的开头。若用变量i来表示第一个非空格字符的下标,i的初值为0,以下循环可以完成此操作:

while(s[i]==′ ′)i++;

只要s[i]是空格,就使i增1,直到遇到第一个非空格字符。以下循环把前导空格后的第一个非空格字符移到数组的开头,其后的字符依次前移,直到遇到字符串结束标志。变量j的初值为0,移动完成后,j就是最后一个字符后面元素的下标。请读者自己把字符串结束标志放在其中。

while(s[i]){s[j]=s[i];j++;i++;}

(4)请自己编写主函数,给出定义语句。在调用dels函数之后,建议用以下语句输出结果:

printf(″\nThe result :\n%s″,str);printf(″****END″); 最后的****END紧跟在字符串之后进行输出,以便观察字符串最后的空格是否已删除。(5)总结:在dels函数中用了移动指针和改变下标两种方法,来引用字符串中的元素。无论是删最后的空格或删前导空格,都可用这两种引用的方法。

第十一章

一、选择题

11.1 以下叙述不正确的是

A)C程序的main函数可以没有参数。

B)C程序的main函数可以有参数。

C)C程序的main函数若有参数时,第一个参数的值最少是1。

D)main函数的第一个参数必须是整型,其名字必须是argv,第二个参数可以定义成:char *argv[],名字必须是argv。

答案:D

11.2 若有以下定义和说明,则对fun函数的正确调用语句是

A)a=fun;a(w);

B)a=fun;(*a)(&c);

C)b=fun;*b(w);

D)fun(b);

main()

{ int(*a)(int *),*b(),w[10],c;

...}

fun(int *c){...}

答案:B

11.3 以下叙述正确的是

A)C程序中各函数之间既允许直接递归调用也允许间接递归调用

B)C程序中各函数之间不允许直接递归调用也不允许间接递归调用

C)C程序中各函数之间允许直接递归调用不允许间接递归调用

D)C程序中各函数之间不允许直接递归调用允许间接递归调用

答案:A

11.4 以下程序的输出结果是

A)8

B)30

C)16

D)2

long fib(int n)

{ if(n>2)return(fib(n-1)+fib(n-2));else return(2);

}

main()

{ printf(”%ld“,fib(6));}

答案:C

二、填空题

11.5 假定以下程序经编译和连接后生成可执行文件PROG.EXE,如果在DOS提示符下键入

PROG ABCD EFGH IJKL(此处代表Enter键)

则输出结果为_____。

main(int argc, char *argv[])

{ while(--argc>0)printf(”%s“,argv[argc]);printf(”“);

}

答案:IJKLEFGHABCD

11.6 以下程序的输出结果是_____。

fun(int x)

{ int p;if(x==0||x==1)return(3);p=x-fun(x-2);return p;

}

main()

{ printf(”%d“,fun(9));}

答案:7 11.7 以下程序的输出结果是_____。

fun(int n,int *s)

{ int f1,f2;if(n==1||n==2)*s=1;else { fun(n-1,&f1);

fun(n-2,&f2);

*s=f1+f2;}

}

main()

{ int x;

fun(6,&x);printf(”%d“,x);

}

答案:8

11.8 以下程序调用invert函数按逆序重新放置a数组中元素的值,a数组中的值在main函数中读入。请填空。

#define N 10

void invert(int *s,int i, int j)

{ int t;if(i

invert(s,_____,j-1);}

}

main()

{ int a[N],i;for(i=0;i

}

答案:*(s+j)i+1 i 11.9 以下程序的输出结果是_____。

funa(int a,int b)

{ return a+b;}

funb(int a,int b)

{ return a-b;}

sub(int(*t)(),int x,int y)

{ return(*t)(x,y);}

main()

{ int x,(*p)(int ,int);p=funa;x=sub(p,9,3);x+=sub(funb,8,3);printf(”%d“,x);

}

答案:17

11.10 以下程序中的trap函数是一个用梯形法求定积分的通用函数,梯形法求定积分s的公式为:

n-1

x=((f(a)+f(b))/2+∑ f(a+i*h)*h, h=│(a-b)/n│

i=1

其中,n为积分小区间数,以下程序调用trap函数求积分,被积函数是:

f(x)=x*x+3*x+2,且 n=1000,a=0,b=4。

#include ”math.h“

double trap(double _____,double a,double b)

{

double t,h;

int i,n=1000;t=0.5*((*fun)(a)+(*fun)(b));h=fabs(a-b)/(double)(n);for(i=1;i<=n-1;i++)t=t+_____;t=t*h;return(t);

}

double mypoly(double x)

{

return(x*x+3.0*x+2.0);

}

main()

{

double y,(*pf)(double);pf=_____;y=trap(pf,0.0,4.0);printf(”%f",y);

} 答案:(*fun)(double)(*fun)(a+i*h)mypoly

三、编程题

11.11 【分析与解答】

(1)无论命令行的内容是什么,总是要求程序需要输出字符串中的一部分连续的字符,因此可将这一部分的功能放在output函数中完成。函数的首部如下:

output(char *s, int b,int e)

其中,s指向字符串,b为从s中开始输出的字符的下标,e为结束输出的字符的下标。只要确定了开始输出的字符的下标和结束输出的字符的下标,在一个for循环中就可以完成输出。请自己完成此函数体。

(2)在主函数中读入一行字符串放在s数组中,求出s串的长度放在len变量中。另外用变量n存放要输出的字符的个数。

(3)主函数的首部写成:

main(int a, char *[KG-*3]c[])

其中的第一个参数a将存入命令行中的字符串的个数,当命令行中没有其他参数时,a的值为1;因此按题目要求,此时输出字符的个数n应等于10。

(4)主函数中的第二个参数是一个指向字符串的指针数组。当命令行为:

outch-2

这时,c[0]中存放了字符串outch的首地址,c[1]中存放了字符串-2的首地址。存储单元*[KG-*3]c[1](即*(c[1]+0)或c[1][0])中是字符-;存储单元*(c[1]+1)(或c[1][1])中是字符2。同理,当命令行为:

outch +6

这时,c[1]中存放了字符串+6的首地址。存储单元*[KG-*3]c[1](即*(c[1]+0))中是字符+;存储单元*(c[1]+1)中是字符6。

(5)根据以上分析,可用以下语句来得到待输出的字符个数放在n中:

if(a>1)n=*(c[1]+1)-′0′;

else n=10;

(6)按题目规定,如果a的值为1或者*[KG-*3]c[1]中的字符是′-′号时,输出s字符串的最后若干字符,这时调用output函数,把s数组的地址传给形参指针s,把开始输出的元素的下标len-n传给形参b,把最后一个输出的元素下标len-1传给形参e。可用以下语句来实现:

if(a==1 || *[KG-*3]c[1]==′-′)output(s,len-n,len-1);

(7)如果*[KG-*3]c[1]中的字符是′+′号时,将从字符串s的最前面开始输出,除了把s数组的地址传给output函数的形参指针s外,把开始输出的元素的下标0传给形参b,把最后一个输出的元素下标n-1传给形参e。

if(*[KG-*3]c[1]==′+′)output(s,1,n-1);

(8)总结:读者按以上所述写出相应的代码,存入OUTCH.C文件。在Turbo C 的环境下进行编译调试、运行,生成一个OUTCH.EXE文件。最后退出Turbo C,在OUTCH.EXE文件所在目录下,打入如题所示的命令行,在程序运行时输入一字符串,观察运行结果是否正确,如果不正确,则需回到Turbo C中进行修改。

11.12 【分析与解答】

习题9.32已经给出了把一个整数转换为二进制数的算法,这是一个把十进制整数不断被2除的过程,每次被2除的余数即是一个二进制位上的数(1或0)。转换的方法是一样的,只是每次转换的数被2除,这可用递归来完成,递归函数的部分内容可表示如下:

outbinary(int a)

第五篇:全国计算机等级考试二级Visual FoxPro最新版大纲

全国计算机等级考试二级Visual FoxPro最新版大纲

二级公共基础知识

1.基本要求

①掌握算法的基本概念。

②掌握基本数据结构及其操作。

③掌握基本排序和查找算法。

④掌握逐步求精的结构化程序设计方法。

⑤掌握软件工程的基本方法,具有初步应用相关技术进行软件开发的能力。⑥掌握数据库的基本知识,了解关系数据库的设计。

2.考试内容

(1)基本数据结构与算法

① 算法的基本概念:算法复杂度的概念和意义(时间复杂度与空间复杂度)。② 数据结构的定义:数据的逻辑结构与存储结构;数据结构的图形表示;线性结构与非线性结构的概念。

③ 线性表的定义:线性表的顺序存储结构及其插入与删除运算。④ 栈和队列的定义:栈和队列的顺序存储结构及其基本运算。⑤ 线性单链表、双向链表与循环链表的结构及其基本运算。

⑥ 树的基本概念:二叉树的定义及其存储结构;二叉树的前序、中序和后序遍历。

⑦ 顺序查找与二分法查找算法:基本排序算法(交换类排序,选择类排序,插入类排序)。

(2)程序设计基础

① 程序设计方法与风格。

② 结构化程序设计。

③ 面向对象的程序设计方法,对象、方法、属性及继承与多态性。

(3)软件工程基础

① 软件工程基本概念,软件生命周期概念,软件工具与软件开发环境。② 结构化分析方法,数据流图,数据字典,软件需求规格说明书。③ 结构化设计方法,总体设计与详细设计。

④ 软件测试的方法,白盒测试与黑盒测试,测试用例设计,软件测试的实施,单元测试、集成测试和系统测试。

⑤ 程序的调试,静态调试与动态调试。

(4)数据库设计基础

① 数据库的基本概念:数据库,数据库管理系统,数据库系统。② 数据模型:实体联系模型及E-R图,从E-R图导出关系数据模型。

③ 关系代数运算:包括集合运算及选择、投影、连接运算,数据库规范化理论。

④ 数据库设计方法和步骤:需求分析、概念设计、逻辑设计和物理设计的相关策略。

3.考试方式

① 公共基础知识的考试方式为笔试,与Visual FoxPro数据库程序设计(C语言程序设计、C++语言程序设计、Java语言程序设计、Visual Basic语言程序设计、Access数据库程序设计或Delphi语言程序设计)的笔试部分合为一张试卷。公共基础知识部分占全卷的30分。

② 公共基础知识有10道选择题和5道填空题。

二级Visual FoxPro

1.基本要求

① 具有数据库系统的基本知识。

② 基本了解面向对象的概念。

③ 掌握关系数据库的基本原理。

④ 掌握数据库程序设计方法。

⑤ 能够使用Visual FoxPro建立一个小型数据库应用系统。

2.考试内容

(1)Visual FoxPro基础知识

① 基本概念:

 数据库,数据模型,数据库管理系统,类和对象,事件,方法。

② 关系数据库:

 关系数据库:关系模型,关系模式,关系,元组,属性,域,主关键字和外部关键字。

 关系运算:选择,投影,连接。

 数据的一致性和完整性:实体完整性,域完整性,参照完整性。

③ Visual FoxPro系统特点与工作方式:

 Windows版本数据库的特点。

 数据类型和主要文件类型。

 各种设计器和向导。

 工作方式:交互方式(命令方式,可视化操作)和程序运行方式。④ Visual FoxPro的基本数据元素:

 常量,变量,表达式。

 常用函数:字符处理函数,数值计算函数,日期时间函数,数据类型转换函数,测试函数。

(2)Visual FoxPro数据库的基本操作

① 数据库和表的建立、修改与有效性检验:

 表结构的建立与修改。

 表记录的浏览、增加、删除与修改。

 创建数据库,向数据库添加或移出表。

 设定字段级规则和记录级规则。

 表的索引:主索引,候选索引,普通索引,惟一索引。

② 多表操作:

 选择工作区。

 建立表之间的关联,一对一的关联,一对多的关联。

 设置参照完整性。

 建立表间临时关联。

③ 建立视图与数据查询:

 查询文件的建立、执行与修改。

 视图文件的建立、查看与修改。

 建立多表查询。

 建立多表视图。

(3)关系数据库标准语言SQL

① SQL的数据定义功能:

 CREATE TABLE-SQL。

 ALTER TABLE-SQL。

② SQL的数据修改功能:

 DELETE-SQL。

 INSERT-SQL。

 UPDATE-SQL。

③ SQL的数据查询功能:

 简单查询。

 嵌套查询。

 连接查询。

内连接

外连接:左连接,右连接,完全连接

④ 分组与计算查询。

⑤ 集合的并运算。

(4)项目管理器、设计器和向导的使用

① 使用项目管理器:

 使用“数据”选项卡。

 使用“文档”选项卡。

② 使用表单设计器:

 在表单中加入和修改控件对象。

 设定数据环境。

③ 使用菜单设计器:

 建立主选项。

 设计子菜单。

 设定菜单选项程序代码。

④ 使用报表设计器:

 生成快速报表。

 修改报表布局。

 设计分组报表。

 设计多栏报表。

⑤ 使用应用程序向导。

⑥ 应用程序生成器与连编应用程序。

(5)Visual FoxPro程序设计

① 命令文件的建立与运行:

 程序文件的建立。

 简单的交互式输入、输出命令。

 应用程序的调试与执行。

② 结构化程序设计:

 顺序结构程序设计。

 选择结构程序设计。

 循环结构程序设计。

③ 过程与过程调用:

 子程序设计与调用。

 过程与过程文件。

 局部变量和全局变量,过程调用中的参数传递。

④ 用户定义对话框(MESSAGEBOX)的使用。

3.考试方式

(1)笔试:90分钟,满分100分,其中含公共基础知识部分的30分。

(2)上机操作:90分钟,满分100分。

①基本操作题。(共4小题,第1、2小题各7分,第3、4小题各8分,计30分)

②简单应用题。(共2小题,每题20分,计40分)

③综合应用题。(共1小题,计30分)

下载全国计算机等级考试二级word格式文档
下载全国计算机等级考试二级.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    全国计算机等级考试总结

    全国计算机等级考试淮阴工学院考点 工作总结 自全国计算机等级考试在我考点开考以来,总共有73701名考生在本考点参加了考试。十多年来,从最初的每次只有200多名考生,到如今的每......

    全国计算机等级考试总结

    全国计算机等级考试总结 禅城区南庄高中 胡永华 我校参加全国计算机一级考证已有近四年,每年两次都参加,在所有的考试中,我校的通过率相对来讲还是比较高的,对于取得这样的成绩,......

    全国计算机等级考试介绍

    全国计算机等级考试简介全国计算机等级考试(National Computer Rank Examination,简称NCRE),是经原国家教育委员会(现教育部)批准,由教育部考试中心主办,面向社会,用于考查应试人员计......

    全国计算机等级考试实施办法

    全国计算机等级考试实施办法 ------------------ 第一章 总则 第一条 全国计算机等级考试是经国家教育部批准由国家教育部考试中心主办,测试应试者计算机应用知识与能力的等......

    全国计算机等级考试一、二级单项选择题(2018年3月)

    全国计算机等级考试一、二级单项选择题汇编(2018年3月) # 1.2017年阿斯塔纳世博会网上订票系统采用的管理方式是( A )。 A、数据库管理方式 B、文件管理方式 C、人工管理方式......

    2009年3月全国计算机等级考试二级VFP笔试卷

    2009年3月全国计算机等级考试二级VFP笔试卷+答案 (考试时间90分钟,满分100分) 选择题 (1)下列叙述中正确的是 A) 栈是“先进先出”的线性表 B) 队列是“先进先出”的线性表 C) 循环......

    全国计算机等级考试二级VB考点分析之过程

    全国计算机等级考试二级VB考点分析之过程 6.1 Sub过程 考点1 建立Sub过程 通用Sub过程的结构与前面多次见过的事件过程的结构类似。一般格式如下:[Static][Private][Public]......

    2007年9月全国计算机等级考试二级VF笔试试题

    第二部分 物业管理基础(51~150题,共100道题) 一、单项选择题(51~110题,每题1分,共60分。每小题只有一个最恰当的答案,请在答题卡上将所选答的相应字母涂黑) 51、以下关于各项物......