1、国家二级 VF 机试-试卷 54 及答案解析(总分:12.00,做题时间:90 分钟)一、基本操作题(总题数:2,分数:4.00)1.基本操作题()(分数:2.00)_2.在考生文件夹下,有一个学生数据库 sdb,打开该数据库,完成如下操作: (1)为学生表 student 的“性别”字段增加约束:性别$“男女“,出错提示信息为“性别必须是男或女”,默认值为“女”。 (2)为学生表 student 创建一个主索引,主索引的索引名为 sid,索引表达式为学号。为课程表 course 创建一个主索引,主索引的索引名为 cid,索引表达式为课程号。为选课表 sc 创建一个主索引和两个普通索引(升序)
2、,主索引的索引名为 scid,索引表达式为“学号+课程号”;一个普通索引的索引名为 sid,索引表达式为学号;另一个普通索引的索引名为 cid,索引表达式为课程号。 (3)通过“学号”字段建立选课表 sc 和学生表 student 表间的永久联系。通过“课程号”字段建立选课表 sc 与课程表 course 间的永久联系。并为以上建立的联系设置参照完整性约束:更新规则为“级联”;删除规则为“限制”;插入规则为“限制”。 (4)使用报表向导建立一个简单报表。要求选择学生表 student 表中所有字段;记录不分组;报表样式为“随意式”;列数为“1”,字段布局为“列”,方向为“纵向”;排序字段为“学
3、号”。升序;报表标题为“学生基本情况一览表”;报表文件名为 onefrx。(分数:2.00)_二、简单应用题(总题数:2,分数:4.00)3.简单应用题()(分数:2.00)_4.(1)打开程序文件 cylinderprg,请按要求修改程序并运行程序。 (2)以表 employeedbf 和ordersdbf 中数据为基础,使用 SQL 命令检索订单数最多的前 3 名职工的职工号、姓名和订单数,检索结果按订单数降序排序存入表 newcoundbf,同时将所用 SQL 命令存入文件 newtxt 中。(分数:2.00)_三、综合应用题(总题数:2,分数:4.00)5.综合应用题()(分数:2.0
4、0)_6.建立一个表单,表单文件名和表单控件名均为 myform_b,表单标题为“订单管理”,表单其他功能如下: 表单中含有一个页框控件(PageFrame1)和一个“退出”命令按钮(Command1),单击“退出”命令按钮关闭并释放表单。 页框控件(PageFrame1)中含有 3 个页面,每个页面都通过一个表格控件显示有关信息: 第一个页面 Page1 上的标题为“职工”,其上的表格控件名为 grdEmployee,显示表 employee中的内容。 第二个页面 Page2 上的标题为“订单”,其上的表格控件名为 grdOrders,显示表 orders 中的内容。 第三个页面 Page3
5、 上的标题为“职工订单金额”,其上的表格控件名为 Grid1,该表格中显示每个职工的职工号、姓名及其所经手的订单总金额(注:表格只有 3 列,第 1 列为“职工号”,第 2 列为“姓名”,第 3 列为“总金额”)。(分数:2.00)_国家二级 VF 机试-试卷 54 答案解析(总分:12.00,做题时间:90 分钟)一、基本操作题(总题数:2,分数:4.00)1.基本操作题()(分数:2.00)_解析:2.在考生文件夹下,有一个学生数据库 sdb,打开该数据库,完成如下操作: (1)为学生表 student 的“性别”字段增加约束:性别$“男女“,出错提示信息为“性别必须是男或女”,默认值为“
6、女”。 (2)为学生表 student 创建一个主索引,主索引的索引名为 sid,索引表达式为学号。为课程表 course 创建一个主索引,主索引的索引名为 cid,索引表达式为课程号。为选课表 sc 创建一个主索引和两个普通索引(升序),主索引的索引名为 scid,索引表达式为“学号+课程号”;一个普通索引的索引名为 sid,索引表达式为学号;另一个普通索引的索引名为 cid,索引表达式为课程号。 (3)通过“学号”字段建立选课表 sc 和学生表 student 表间的永久联系。通过“课程号”字段建立选课表 sc 与课程表 course 间的永久联系。并为以上建立的联系设置参照完整性约束:更
7、新规则为“级联”;删除规则为“限制”;插入规则为“限制”。 (4)使用报表向导建立一个简单报表。要求选择学生表 student 表中所有字段;记录不分组;报表样式为“随意式”;列数为“1”,字段布局为“列”,方向为“纵向”;排序字段为“学号”。升序;报表标题为“学生基本情况一览表”;报表文件名为 onefrx。(分数:2.00)_正确答案:(正确答案:(1)在命令窗口执行命令: MODIFY DATABASE sdb ,打开数据库设计器。 在数据库设计器中,右击 student 表,选择【修改】快捷菜单命令,打开 student 表设计器,在“字段”选项卡中选中“性别”,在“字段有效性”的“规
8、则”文本框中输入:性别$“男女“,在“信息”框中输入:”性别必须是男或女”,在“默认值”文本框中输入:“女“。 (2)接上题,在 student 表设计器中,在“字段”选项卡中选中“学号”,在“索引”列中选择“升序”,然后在“索引”选项卡中修改“索引名”为“sid”,修改“类型”为“主索引”,单击“确定”按钮保存表结构修改。 在数据库设计器中,右击 course 表,选择【修改】快捷菜单命令,打开 course 表设计器,在“字段”选项卡中选中“课程号”,在“索引”列中选择“升序”,然后在“索引”选项卡中修改“索引名”为“cid”,修改“类型”为“主索引”,单击“确定”按钮保存表结构修改。 在
9、数据库设计器中,右击 sc 表,选择【修改】快捷菜单命令,打开 sc 表设计器,选中“索引”选项卡,在“索引名”下方的文本框中输入“scid”,在“索引”选项卡中将“类型”选择为“主索引”,在“表达式”下方的文本框中输入“学号+课程号”,建立主索引。如图 2-39 所示。 接第步,在 SC 表设计器的“索引”选项卡中,在第二行的“索引名”文本框中输入“sid”,将“类型”选择为“普通索引”,在“表达式”下方的文本框中输入“学号”,建立一个普通索引;然后在第三行的“索引名”文本框中输入“cid”,将“类型”选择为“普通索引”,在“表达式”下方的文本框中输入“课程号”,建立一个普通索引,单击“确定
10、”按钮保存表结构修改。如图 2-39 所示。 (3)在数据库设计器中,拖动 student 表“索引”下方的主索引“sid”到 sc表中“索引”下方的普通索引“sid”上,为两个表建立联系。 拖动 course 表“索引”下方的主索引“scid”到 sc 表中“索引”下方的普通索引“cid”上。为两个表建立联系。 选中 student 和 sc 两个表之间的关联线(被选中的线会变粗),首先执行【数据库】【清理数据库】菜单命令,清空数据库表中带有删除标记的记录,然后执行【数据库】【编辑参照完整性】菜单命令。在打开的“参照完整性”对话框的表格中,将其中的两对关系均做如下操作:选择“更新”下的单元格
11、内容为“级联”;“删除”下的单元格内容为“限制”;“插入”下的单元格内容为“限制”。单击“确定”按钮保存参照完整性的修改。如图 2-40 所示。 )解析:解析:本大题考查字段有效性规则的建立;表索引的建立;数据库表间永久联系的建立和参照完整性约束的设置;报表向导的使用。 对表中字段建立有效性规则和设置默认值是在表设计器中操作的,在探作时要注意先选中需要建立有效性规则的字段。为数据库表建立索引也可以在表设计器中进行,在表设计器的“字段”选项卡中,可以通过选择“排序”下拉框中的“升序”或“降序”为指定的字段建立一个索引名与索引表达式相同的普通索引,如果要改变索引名或索引类型,则需要在“索引”选项卡
12、中进行修改。 参照完整性是针对两个表进行设置的,在建立参照完整性前要先建立两个表的关联,且有一个表中必须建立关联字段的主索引(或候选索引),另一个表要建立普通索引,建立两个表联系后要先清理数据库,然后再设置参照完整性。 利用报表向导制作报表属于比较简单的操作,可以通过“新建”对话框打开报表后,根据向导提示一步步完成即可。二、简单应用题(总题数:2,分数:4.00)3.简单应用题()(分数:2.00)_解析:4.(1)打开程序文件 cylinderprg,请按要求修改程序并运行程序。 (2)以表 employeedbf 和ordersdbf 中数据为基础,使用 SQL 命令检索订单数最多的前 3
13、 名职工的职工号、姓名和订单数,检索结果按订单数降序排序存入表 newcoundbf,同时将所用 SQL 命令存入文件 newtxt 中。(分数:2.00)_正确答案:(正确答案:(1)步骤 1:在命令窗口执行命令: MODIFY COMMANDcylinder ,打开cylinderprg 程序,代码如下: *本程序的功能为输入圆柱体的半径和高,计算圆柱体表面积。 *请将程序修改为函数调用方式(注意不得增删语句行)。 SET TALK OFF CLEAR LOCAL carea INPUT “请输入圆柱体的半径“ TO r INPUT “请输入圆柱体的高“ TO h DO cya WITH
14、r,h,carea ?“圆柱体的表面积为:“,carea RETURN PROCEDURE cya PARAMETERS a,b,C LOCAL pai pai=314159 c=2*(pai*a2)+2*pai*a*b RETURN ENDPROC 修改程序中的错误行,修改后的程序如下: SET TALK OFF CLEAR LOCAL carea &定义局部变量 local INPUT “输入圆柱体的半径:“ TO r &从键盘输入一个半径值 INPUT “输入圆柱体的高:“ TO h &从键盘输入一个高值 carea=cya(r,h) &调用模块程序,转到 PROCEDURE 命令行执行
15、程序,按值方式传递参数 ?“圆柱体的表面积是:“,carea RETURN PROCEDURE cya &过程的开始,并命名过程名为 cya PARAMETERS a,b,c &声明的行参变量被看作是模块程序中的私有变量 LOCAL pai pai=314159 c=2*(pai*a2)+2*pai*a*b &计算圆柱体表面积的表达式 RETURN c &将计算的表达式值返回上级模块 ENDPROC 步骤 2:保存文件修改,在命令窗口执行命令: DO YZTPRG ,执行程序文件。 (2)步骤 1:在命令窗口执行命令: MODIFY FILE new ,打开文本编辑器编写 SQL 命令。 步骤
16、 2:在编辑器中输入如下程序代码(以下程序是通过查询设计器生成): SELECT TOP 3 Employee职工号,Employee姓名,COUNT(*)订单数; FROM employee INNER JOIN orders; ON Employee职工号=Orders职工号; GROUP BY Employee职工号; ORDER BY 3 DESC; INTO TABLE newcoundbf 步骤3:在命令窗口执行命令:DO NEWTXT,执行文件(注意:执行文件时,文件后缀名僦不能缺省)。)解析:解析:(1)本题主要考查的是模块的定义和调用。模块是一个相对独立的程序段,它可以被其他
17、模块所调用,也可以去调用其他的模块。通常,把被其他模块调用的模块称为子程序,把调用其他模块而没有被其他模块调用的模块称为主程序。题中给出了两个模块,其中,上面的一部分,即第一个“RETURN”前面的代码是主程序,下面的模块 cya 作为子程序被主程序调用。模块调用的格式有两种:一种是使用DO 命令:DO过程名WITH实参 1,实参 2,.,本题中使用的就是这种方法:“DO cya WITH r,h,carea”,其中 cya 是调用的子程序名,r、h、carea 是传递给子程序的实参,分别代表半径、高和表面积;而在子程序 cya 中则定义了 a、b、c 三个变量作为行参对应接收主程序传递过来的
18、实参,并计算出表面积的值 c。在这种方法调用中,当实参为变量时,将按址传递,即不是将实参的值传递给形参,而是将存放实参的内存中的存储单元的地址传递给形参,因此形参和实参具有相同的存储单元地址,也就是说,形参和实参共用同一存储单元,实际上是同一个变量,这时,在调用子程序时,如果形参的值发生了改变,那么对应的实参的值也将随着改变。故在本题中,当子程序结束时,求出的 c 的值即是主程序中carea 的值。另一种调用方法是函数调用的方法,格式为:过程名(实参 1,实参 2,)。在这种调用方式中,默认情况下都是按值传递,即系统计算出实参的值,并把它们赋值给相应的行参变量。这样,当子程序结束时,行参变量被
19、释放,计算的结果将会随行参的消失而消失,而不能将运算后形参的值再传递给实参,实参的值并不会改变。所以,在本题中,当用函数调用方式时,要想在主程序中输出carea 的值,应该在子程序的最后返回计算的表面积值 C。而在主程序中,应当将调用函数返回的值赋值给 carea 变量,即“carea=area(r,h)”这时,实参就变成了两个:r、h,而子程序的行参有三个:a、b、c。这样是可以的。我们说在调用模块时,系统会自动把实参一一传递给对应的行参,行参的数目不能少于实参的数目,因为传递过来的每一个实参都要有对应的行参接收,如果行参的数目比实找不到地址的信件一样,不知该送去哪里,这时系统就会产生运行时
20、错误。但是,行参的数目可以多于实参的数目,这时,多余的行参变量取初值逻辑假(F)。 (2)本题要求利用 SQL 语句进行查询,用到了 employ 和order 两张表,可以使用联接查询。因为要查找订单数最多的前两名职工,应该按职工号分组,并求出每一组中记录的个数,即是每个职工的订单数,要分别使用 group by 短语和 count()计数函数;另外,因为只查找最多的前两名,应该按降序排序,并使用 top 短语;将查询结果保存在永久表中,应使用 INTO TABLE 短语。三、综合应用题(总题数:2,分数:4.00)5.综合应用题()(分数:2.00)_解析:6.建立一个表单,表单文件名和表
21、单控件名均为 myform_b,表单标题为“订单管理”,表单其他功能如下: 表单中含有一个页框控件(PageFrame1)和一个“退出”命令按钮(Command1),单击“退出”命令按钮关闭并释放表单。 页框控件(PageFrame1)中含有 3 个页面,每个页面都通过一个表格控件显示有关信息: 第一个页面 Page1 上的标题为“职工”,其上的表格控件名为 grdEmployee,显示表 employee中的内容。 第二个页面 Page2 上的标题为“订单”,其上的表格控件名为 grdOrders,显示表 orders 中的内容。 第三个页面 Page3 上的标题为“职工订单金额”,其上的表
22、格控件名为 Grid1,该表格中显示每个职工的职工号、姓名及其所经手的订单总金额(注:表格只有 3 列,第 1 列为“职工号”,第 2 列为“姓名”,第 3 列为“总金额”)。(分数:2.00)_正确答案:(正确答案:步骤 1:在命令窗口执行命令: OPEN DATABASE orders_manage ,打开“orders_manage”数据库。 步骤 2:在命令窗口执行命令: CREATE FORM myform_b ,打开表单设计器新建表单。 步骤 3:从“表单工具栏”中依次向表单添加一个命令按钮和一个页框控件。在“属性”面板的下拉框中选择表单对象,在“全部”选项卡中修改对象属性值,见表
23、 2-9。 步骤 4:右击表单选择【数据环境】快捷菜单命令打开表单数据环境,继续在表单数据环境中单击右键选择【添加】快捷菜单命令,在“添加表或视图”对话框中依次双击 employee 表和 orders 表,将其添加到数据环境中,两者之间的关联也会自动添加其中,选中两个表之间的关联线(被选中的线会变粗),然后按 Delete 键,删除该关联。 步骤 5:右击“页框”控件,选择【编辑】快捷菜单命令,让页框处于编辑状态,再将数据环境中的 employee 表和 orders 表分别拖到“职工”和“订单”页面中(注意:操作过程中,当独立的页面被选中时,页框处于编辑状态,在页框四周会出现蓝色边框,如图
24、 2-29 所示;另外,表单设计器窗口应为“还原”状态,而非最大化窗口,否则将遮盖表单数据环境内容,无法将表拖到页面中)。这时,在“职工”和“订单”页面中会分别自动生成表格 grdEmployee 和 grdOrders。 )解析:解析:本题主要考查了表单及控件的常用属性的设置;SQL 分组计算查询;表单数据环境。 通过拖放表单数据环境中的表到表单中,可快速建立表格及表格与数据表的联系,要注意的是在向每个页面中添加表格数据对象时,一定要注意页面处于编辑状态下(每个页面都可单独选定,将表从数据环境中拖放到要求的页面中),否则添加的表格对象只是停留在页框上方,该表格实际是包含在表单中而非添加到页框
25、的页面中。控制页框中页面数的属性为 PageCount。 本题要注意的是,由于在数据库中 employee 表和orders 表已经建立了永久联系,所以当将这两张表添加到数据环境中时,二者之间会自动产生一个相应的关联(临时联系),这样,当运行表单后,orders 表中的记录就会随着 employee 表中当前记录的改变而改变,即 orders 表中始终显示的不是整个 orders 表的内容,而只是显示 employee 表中当前记录在orders 表中对应的记录。而题中要求在“订单”页面显示 orders 表的内容,故应该在数据环境中将两张表的关联删除。 第三个页面的表格中显示的内容需要用 SQL 查询语句完成,可以将表格 grid1 的表格数据来源属性 RecordSourceType 设置为“4-SQL”,而对应的数据来源 RecordSource 可以在表单的 Init 事件中通过 SQL 语句来指定。