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