第七章编程题答案Word文档格式.docx
《第七章编程题答案Word文档格式.docx》由会员分享,可在线阅读,更多相关《第七章编程题答案Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
COURSE(课程号,课程名,先修课程号,学分)
在考生文件夹下有一个程序test.prg,该程序的功能是检索选修课程门数等于3门或3门以上,每门课程成绩大于或等于70分的每个学生的学号、姓名、性别、平均成绩、最低分和选课门数,并将结果存放到表new_test中。
考生不得增加或删减程序行。
OPENDATABASESDB
SELECTSTUDENT.学号,姓名,性别,AVG(成绩)平均成绩,MIN(成绩)最低分,;
COUNT(*)选课门数;
FROMSTUDENT,SC;
whereSTUDENT.学号=SC.学号AND成绩>
=70;
&
********Error********
GROUPBYSTUDENT.学号HAVINGcount(课程号)>
=3;
********Error*******
intotableNEW_TEST&
**********Error**********
CLOSEALL
03
1、在考生文件夹中有一个数据库SDB,其中有数据库表STUDENT、SC和COURSE表结构如下:
在考生文件夹下有一个程序DBTEST61.PRG,该程序的功能是检索同时选修了课程号C1和C2的学生的学号。
SELECT学号;
FROMSC;
WHERE课程号='
c1'
AND学号=any;
******Error******
(SELECT学号FROMSC;
*********Error*********
WHERE课程号='
c2'
)&
04
1、在考生文件夹中有数据库STSC,其中有数据库表STUDENT、SCORE和COURSE。
STUDENT(学号,姓名,性别,院系,出生日期)
SCORE(学号,课程编号,成绩)
COURSE(课程编号,课程名称,开课院系,开课学期)
在考生文件夹下有一个程序dbtest4.prg,该程序的功能是检索选课门数是3门以上的(包括3门)每个学生的学号、姓名、平均成绩、最低分、选课门数和院系,并按平均成绩降序排序,同时将结果存放到表TEST1中,请修改程序中的错误,并调试该程序,使之正确运行。
SELECTSTUDENT.学号,姓名,AVG(成绩)平均成绩,MIN(成绩)最低分,;
COUNT(*)选课门数,院系院系;
FROMSTUDENT,SCORE;
WHERESTUDENT.学号=SCORE.学号;
GROUPBYSTUDENT.学号HAVINGcount(课程编号)>
****Error****
ORDERBY平均成绩desc;
*******Error*********
INTOtableTEST1SDF&
05
三、综合应用(1小题,计30分)
当order_detail表中的单价修改后,应该根据该表的"
单价"
和"
数量"
字段修改order_list表的总金额字段,现在编写程序实现此功能,具体要求和注意事项如下:
(1)根据order_detail表中的记录重新计算order_list表的总金额字段的值;
(2)一条order_list记录可以对应几条order_detail记录;
(3)最后将order_list表中的记录按总金额降序排序存储到od_new表中(表结构与order_list表完全相同);
(4)将程序保存为prog1.prg文件。
USEorder_list
SCAN
ddh=订单号
SELECTsum(单价*数量)fromorder_detailwhere订单号=ddhintoarrayje
REPLACE总金额withje
ENDSCAN
USE
SELECT*fromorder_listorderby总金额descintotableod_new
或:
SELECT订单号,sum(单价*数量)asjefromorder_detailgroupby订单号;
intotablels
SCAN
UPDATEorder_listset总金额=ls.jewhere订单号=ls.订单号
CLOSEall
06
字段修改order_list表的总金额字段,现在有部分order_list记录的总金额字段值不正确,请编写程序挑出这些记录,并将这些记录存放到一个名为od_mod的表中(与order_list表结构相同,自己建立),然后根据order_detail表的"
字段修改od_mod表的总金额字段(注意一个od_mod记录可能对应几条order_detail记录),最后od_mod表的结果要求按总金额升序排序,编写的程序最后保存为prog1.prg。
COPYSTRUCTUREtood_mod1
IF总金额<
>
je
khh=客户号
dgrq=订购日期
INSERTintood_mod1values(khh,ddh,dgrq,je)
ENDIF
ENDSCAN
SELECT*fromod_mod1orderby总金额intotableod_mod
SELECT订单号,sum(单价*数量)as金额fromorder_detailgroupby订单号intotableorder_ls
SELECTa.*fromorder_lista,order_lsbwherea.订单号=b.订单号and总金额#金额intotableod_mod1
selectorder_ls
UPDATEod_mod1set总金额=order_ls.金额whereorder_ls.订单号=订单号
07
首先为order_detail表增加一个新字段:
新单价(类型与原来的单价字段相同),然后编写满足如下要求的程序:
根据order_list表中的"
订购日期"
字段值确定order_detail表的"
新单价"
字段的值,原则是:
订购日期为2001年的"
字段的值为原单价的90%,订购日期为2002年的"
字段的值为原单价的110%(注意:
在修改操作过程中不要改变order_detail表记录的顺序),将order_detail表中的记录存储到od_new表中(表结构与order_detail表完全相同);
最后将程序保存为prog1.prg,并执行该程序。
USEorder_detail
SELECT订购日期fromorder_listwhere订单号=ddhintoarraydgrq
IFYEAR(dgrq)=2001
REPLACE新单价with单价*0.9
ENDIF
IFYEAR(dgrq)=2002
REPLACE新单价with单价*1.1
SELECT*fromorder_detailintotableod_new
UPDATEorder_detailset新单价=单价*0.9where订单号=order_list.订单号andYEAR(order_list.订购日期)=2001
UPDATEorder_detailset新单价=单价*101where订单号=order_list.订单号andYEAR(order_list.订购日期)=2002
Select*fromorder_detailintotableod_new
Closeall
08
首先将order_detail表全部内容复制到od_bak表,然后对od_bak表编写完成如下功能的程序:
1.把"
订单号"
尾部字母相同并且订货相同("
器件号"
相同)的订单合并为一张订单,新的"
就取原来的尾部字母,"
取最低价,"
取合计;
2.结果先按新的"
升序排序,再按"
升序排序;
3.最终记录的处理结果保存在od_new表中;
4.最后将程序保存为prog1.prg,并执行该程序。
USEod_bak
COPYSTRUCTUREtotemp
SELECTdistinctRIGHT(订单号,1)订单号,器件号,器件名fromod_bakintotableod_temp
SELECTod_temp
ddh=订单号
qjh=器件号
qjm=器件名
SELECTMIN(单价),sum(数量)fromod_bakwhereRIGHT(订单号,1)=ddhand器件号=qjhintoarrayjg
INSERTintotempvalues(ddh,qjh,qjm,jg
(1),jg
(2))
SELECT*fromtemporderby订单号,器件号intotableod_new
CLOSETABLESall
SELECTdistinctRIGHT(订单号,1)订单号,器件号,器件名fromod_bakintotablels
SELECTls
SELECTMIN(单价),sum(数量)fromod_bakwhereRIGHT(订单号,1)=ls.订单号and器件号=ls.器件号intoarrayjg
INSERTintotempvalues(ls.订单号,ls.器件号,ls.器件名,jg
(1),jg
(2))
SELECT*fromtemporderby订单号,器件号intotableod_new1
09
1.请编写名称为change_c的程序并执行;
该程序实现下面的功能:
将雇员工资表salarys进行备份,备份文件名为baksals.dbf;
利用"
人事部"
向"
财务部"
提供的雇员工资调整表c_salary1的"
工资"
,对salarys表的"
进行调整(请注意:
按"
雇员号"
相同进行调整,并且只是部分雇员的工资进行了调整,其他雇员的工资不动);
最后将salarys表、中的记录存储到od_new表中(表结构与salarys表完全相同)
SELECT*fromsalarysintotablebaksals
USEc_salary1
gyh=雇员号
gz=工资
UPDATEsalarysset工资=gzwhere雇员号=gyh
SELECT*fromsalarysintotableod_new
Select*fromsalarysintotablebaksals
Usec_salary1
Scan
Updatesalarysset工资=c_salaty1.工资where雇员号=c_salaty1.雇员号
Endscan
Select*fromsalarysintotableod_new
010
在考生文件夹下,对"
商品销售"
数据库完成如下综合应用:
1.请编写名称为change_c的命令程序并执行,该程序实现下面的功能:
将"
商品表"
进行备份,备份文件名为"
SPBAK.dbf"
;
中"
商品号"
前两位编号为"
10"
的商品的"
修改为出厂单价提高10%;
使用"
单价调整表"
对商品表的部分商品出厂单价进行修改(按"
相同)。
SELECT*from商品表intotablespbak
UPDATE商品表set单价=出厂单价*1.1whereLEFT(商品号,2)="
USE单价调整表
UPDATE商品表set出厂单价=单价调整表.出厂单价where商品号=单价调整表.商品号and商品名=单价调整表.商品名
CLOSEall
sph=商品号
ccdj=出厂单价
spm=商品名
UPDATE商品表set出厂单价=ccdjwhere商品号=sphand商品名=spm
011
在考生文件夹下完成如下简单应用:
1.rate_pro.prg中的程序功能是计算出"
林诗因"
所持有的全部外币相当于人民币的价值数量,summ中存放的是结果。
注意:
某种外币相当于人民币数量的计算公式:
人民币价值数量=该种外币的"
现钞买入价"
*该种外币"
持有数量"
。
请在指定位置修改程序的语句,不得增加或删除程序行,请保存所做的修改。
usecurrency_sl
***********Error*****************
locatefor姓名="
summ=0
DOwhilenoteof()
select现钞买入价fromrate_exchange,currency_sl;
whererate_exchange.外币代码=currency_sl.外币代码intoarraya
summ=summ+a[1]*currency_sl.持有数量
continue
enddo
?
summ
012
2.在考生文件夹下打开命令文件ONE.PRG,该命令文件用来建立一个名称为S_VIEW的视图,视图查询学生的班级号、班级名、姓名、性别和班主任名(来自TEACHER表的教师名)。
命令文件只包含两条语句,第1条语句有一个错误,第2条语句有两个错误,请修改之,并运行。
注意,修改时不可改变SQL语句的结构和短语的顺序,不允许增加或合并行。
OPENDATABASEsdb
CREATEVIEWs_viewas;
SELECTClass.班级号,班级名,姓名,性别,教师名AS班主任名;
FROMStudent,Class,Teacher;
WHEREStudent.班级号=Class.班级号andTeacher.教师号=Class.班主任号
013
在考生文件夹下,打开公司销售数据库SELLDB,完成如下简单应用:
2.在考生文件夹下打开命令文件TWO.PRG,该命令文件用来查询各部门的分年度的部门号、部门名、年度、全年销售额、全年利润和利润率(全年利润/全年销售额),查询结果先按年度升序、再按利润率降序排序,并存储到S_SUM表中。
注意,程序在第5行、第6行、第8行和第9行有错误,请直接在错误处修改。
修改时,不可改变SQL语句的结构和短语的顺序,不允许增加或合并行。
OPENDATABASESELLDB
SELECTS_T.部门号,部门名,年度,;
一季度销售额+二季度销售额+三季度销售额+四季度销售额AS全年销售额,;
一季度利润+二季度利润+三季度利润+四季度利润AS全年利润,;
(一季度利润+二季度利润+三季度利润+四季度利润)/(一季度销售额+二季度销售额+三季度销售额+四季度销售额)AS利润率;
FROMS_T,DEPT;
WHERES_T.部门号=DEPT.部门号;
OrderBY年度,利润率DESC;
INTOtableS_SUM
014
1.用SQL语句新建一个表rate,其中包含4个字段"
币种1代码"
C
(2)、"
币种2代码"
C
(2)、"
买入价"
N(8,4)、"
卖出价"
N(8,4),请将SQL语句存储于two.txt中。
3.编写程序three.prg完成下列操作:
根据"
外汇汇率"
表中的数据产生rate自由表中的数据。
要求:
将所有"
表中的数据插入rate表中并且顺序不变,由于"
中的币种1和币种2存放的是外币名称,而rate表中的币种1代码和币种2代码应该存放外币代码,所以插入时要做相应的改动,外币名称与外币代码的对应关系存储在"
外汇代码"
表中。
程序必须执行一次,保证rate表中有正确的结果。
1.Two.txt文件内容:
CREATETABLErate(币种1代码c
(2),币种2代码c
(2),买入价n(8,4),卖出价n(8,4))
3.程序three.prg
USE外汇汇率
SELECT外币代码from外汇代码where外汇汇率.币种1=外币名称intoarraydm1
SELECT外币代码from外汇代码where外汇汇率.币种2=外币名称intoarraydm2
INSERTintoratevalues(dm1,dm2,外汇汇率.买入价,外汇汇率.卖出价)
bz1mc=币种1
bz2mc=币种2
mrj=买入价
mcj=卖出价
SELECT外币代码from外汇代码where外币名称=bz1mcintoarraybz1dm
SELECT外币代码from外汇代码where外币名称=bz2mcintoarraybz2dm
INSERTintoratevalues(bz1dm,bz2dm,mrj,mcj)
015
1.改错题
student是一个"
学生"
表,其中包含学号(C8)、姓名(C8)、性别(C2)、政治面目(C4)、班级(C5)等字段。
考生目录下的modi1.prg程序文件的功能是显示输出所有政治面目为"
群众"
的"
男"
生的姓名和班级,每行输出一个学生的信息;
程序中有三处错误,请加以改正。
说明:
程序中******ERRORFOUND******的下一行即为错误所在行。
请用改正后的程序行覆盖错误所在行,不要插入或删除任何程序行。
2.建立命令文件sprog.prg,该命令文件包含如下两条语句:
●第一条语句使用SQLUPDATE命令计算和更新student表的年龄字段值(计算年龄的表达式是year(date())-year(出生日期));
●第二条语句使用SQLSELECT命令查询各种"
政治面目"
的学生人数和平均年龄,并将结果存储于表sqlresults(字段名是政治面目、人数和平均年龄)。
以上命令文件必须执行,并产生所要求的结果。
US