您的当前位置:首页正文

vfp实验7-16参考答案

2023-01-29 来源:我们爱旅游


VF实验7-16参考答案

实验7

 检索所有供应商的全部信息。

select*from 供应商号  检索所有员工的工号和姓名信息。

select 职工号,姓名 from 职工  查询目前哪几个仓库目前有员工分配(使用单表查询)。 Select distinct仓库号 from 职工  检索工资最高的前两名员工姓名。

Select top 2姓名 from 职工 order by 工资 desc  检索工资大于1230元的员工姓名。

select 姓名 from 职工 where 工资>1230  检索不在WH1仓库工作的员工姓名和工资。

SELECT 姓名,工资 from 职工 where 仓库号=!\"WH1\" && <>,#也可表不等于  检索生成于2001年7月的所有订单信息。

SELECT*from 订购单 where 订购日期 BETWEEN{^2010-07-01} AND {^2010-07-31} 检索2001年7月发给供应商S4的订单信息。

SELECT * from 订购单 where 供应商号=\"S4\" AND 订购日期 BETWEEN{^2010-07-01} AND {^2010-07-31}

实验8

 检索所有“周”姓员工的信息。

Select * from 职工 where 姓名 like \"周%\"  检索所有订购单信息并将其按照订购日期升序排序。

Select * from 订购单 order by 订购日期 && asc 升序 desc 降序  检索所有订购单信息并将其按照订购日期降序排序。 Select * from 订购单 order by 订购日期 desc  检索工资最高的前三名员工姓名。

Select top 3 姓名 from 职工 order by 工资 desc  检索工资水平在所有员工中排名前50%的员工姓名。

Select top 50 percent 姓名 from 职工 order by 工资 desc

 检索职工信息并将其按所在仓库号降序排序,同一仓库的员工按工资升序排序。 Select * from 职工 order by 仓库号 desc,工资 asc  检索订购单中供应商号不为空值的订单号。

Select 订购单号 from 订购单 where 供应商号 is not null  检索订购单中供应商号和订购日期均为空值的订单号。

Select 订购单号 from 订购单 where 供应商号 is null and 订购日期 is null  检索在WH1仓库工作的员工总数。

Select count(职工号 )from 职工 where 仓库号= \"WH1\"  检索每月支付给员工的工资总数。

Select sum(工资) from 职工  检索“周”姓员工工资的平均值。

Select avg(工资) from 职工 where 姓名 like \"周%\"  检索所有员工的最高工资。

Select max(工资) from 职工  检索WH2仓库员工的最低工资。

Select min(工资) from 职工 where 仓库号= \"WH2\"  统计各仓库员工的人数,以实现以下结果:

select 仓库号 ,count(*) as 人数 from 职工 group by 仓库号  统计各仓库员工的最高工资。

select 仓库号 ,max(工资) from 职工 group by 仓库号  统计有职工2人或2人以上的仓库的平均工资。

select 仓库号 ,avg(工资) from 职工 group by 仓库号 having count(*)>=2

实验9

 统计各员工所在的城市(分别采用INNER JOIN和WHERE两种形式实现内连接)。

select 姓名,城市 FROM 职工 inner JOIN 仓库 ON 职工.仓库号=仓库.仓库号 select 姓名,城市 FROM 职工 , 仓库 where 职工.仓库号=仓库.仓库号 &&如果没有检索答案,请用命令 reindex 重建索引后再检索  统计各订购单所对应的供应商名,若无供应商名则留空。

select 订购单号,供应商名 FROM 订购单 left Join 供应商 on 订购单.供应商号=供应商.供应商号  列出员工的上下级隶属关系(自连接),以实现以下结果:

select S.姓名 上级 , P.姓名 下级 from 职工 S,职工 P WHERE S.职工号=P.上级主管  以连接和嵌套两种查询方式检索在北京工作的员工信息。

select * FROM 职工 Join 仓库 on 职工.仓库号=仓库.仓库号 and 城市=\"北京\" select * FROM 职工 ,仓库 WHERE 职工.仓库号=仓库.仓库号 and 城市=\"北京\" Select * from 职工 WHERE 仓库号 in (select 仓库号 from 仓库 where 城市=\"北京\")  以连接和嵌套两种查询方式检索01年6月后有接到订单的供应商信息。

SELECT * FROM 供应商 Join 订购单 on 订购单.供应商号=供应商.供应商号 and 订购日期>{^2001-6-30}

SELECT * FROM 供应商 ,订购单 where 订购单.供应商号=供应商.供应商号 and 订购日期>{^2001-6-30}

 检索工作的仓库面积小于300平米的员工信息(分别利用in、any、exists三种形式查

询)。

select * from 职工 where 仓库号 in (select 仓库号 from 仓库 where 职工.仓库号=仓库.仓库号 and 面积<300)

select * from 职工 where 仓库号 = any (select 仓库号 from 仓库 where 职工.仓库号=仓库.仓库号 and 面积<300) select * from 职工 where exists (select *from 仓库 where 职工.仓库号=仓库.仓库号 and 面积<300) 检索各供应商所接到的最新订单信息(如下图,利用嵌套查询)

select * from 订购单 S where 订购日期 =(select max(订购日期)from 订购单 P where S.供应商号=P.供应商号)

实验10

使用SQL语言复制”仓库”表到名为”tmp”的临时表。

select * from 仓库 into cursor temp 

将订购单信息按订购日期排序并输出至“output”表。

select * from 订购单 into cursor output order by 订购日期 && order by 订购日期 into table output 

统计各供应商分别接到的订单数量并输出至文件D:\\1.txt中。

select 供应商号, coun(订购单号) from 订购单 grou by 供应商号 To FILE D:\\1.txt  用UNION语句检索哪些城市设有该公司的供应商或仓库。

select 城市 FROM 仓库 UNION SELECT 地址 from 供应商 

使用INSERT语句的两种形式,分别在职工表中添加名为”张三”和”李四”的两条记录,其工号为E9和E10,其余信息设为空值。

Insert into 职工 values (\"E9\张三\ Insert into 职工(职工号,姓名,仓库号,工资,上级主管) values (\"E10\李四\

将所有职工的工资增加500元。

Update 职工 set 工资=工资+500 

将订单’OR91’的订购日期改为空值。

Update 订购单 set 订购日期=null where 订购单号=”OR91” 

将职工刘勇所工作的仓库面积修改为300平方米。

UPDATE 仓库 set 面积=300 where 仓库号=(select 仓库号 from 职工 where 姓名=\"刘勇\" ) 

删除北京仓库中姓”刘”的员工。

Delete from 职工 where姓名 like \"刘%”\"and 仓库号=(select 仓库号 from 仓库 where 城市=\"北京\")

 清空供应商表的所有记录。

Delete from 供应商

 删除订购单表和供应商表。

Drop table 订购单

Drop table 供应商 

使用Create命令创建订购单表和供应商表结构和相关联系(如下图),无需输入数据。

create table 供应商 ( 供应商号 C(5) PRIMARY key ,供应商名C(20) ,地址 C(20)) create table 订购单 (订购单号 N(8),职工号 N(8),供应商号 N(8) PRIMARY key,订购日期 D ,;

FOREIGN KEY 职工号 tag 职工号 reference 职工,;

FOREIGN KEY 供应商号 tag 供应商号 reference 供应商)

实验11

找出借书超过2本的读者,输出读者姓名及所借图书册数。

select 姓名 ,coun(书号) from 借书卡,借书记录 where 借书卡.卡号=借书记录.借书卡号 grou by 卡号 having coun(书号)>2 

查询借阅了书号为9787020081639这本书的读者,输出姓名及班级。

Select 姓名,班级 from 借书卡 where 卡号 in (select 借书卡号 from 借书记录 where 书号 =9787020081639) 

查询借阅了书名为《工业革命》这本书的读者,输出姓名及班级。

Select 姓名,班级 from 借书卡 Join 借书记录 on 借书卡.卡号=借书记录.借书卡号

Join 图书 on 借书记录.书号=图书.书号 and 书名=”工业革命” 

查询书名包括\"觉醒\"关键词的图书,输出书号、书名、作者。

Select 书号,书名,作者 from 图书 where 书名 like “%觉醒%” 

查询现有图书中价格最高的图书,输出书名及作者。

Select top 1 书名,作者 from 图书 order by 单价 desc 

查询当前借了《工业革命》但没有借《猜火车》的读者,输出其借书卡号,并按卡号降序排序输出。 

Select 借书卡号 from 借书记录 where 书号 in (select 书号 from 图书 where 书名=\"工业革命\" and 书名!=\"猜火车\") order by 借书卡号 desc 

将\"法01\"班同学所借图书的还期都延长一周。

Update 借书记录 set 还书日期=还书日期+7 where 借书卡号 in (select 卡号 from 借书卡 where 班级 =”法01”) 

从图书表中删除当前无人借阅的图书记录。

Delete from 图书 where 图书.书号 not in (select 书号 from 借书记录 ) ; pack 

新增一条借书卡记录,卡号为A090112,姓名为刘烨,班级取空值。

Insert into 借书卡 (卡号,姓名,班级)values (A090112,刘烨,.null.) 

若需要追加一个”书库”表(包含书库号、书库名、负责人三个字段,并与图书表存在联系),请写出建表SQL语句。

Create table 书库 (书库号 C(10) PRIMARY KEY

,书库名C(10),负责人 C(8) ); Alter table 图书 add FOREIGN KEY 所在书库 TAG 所在书库 REFERENCES 书库 

使用ALTER语句为借书卡表新增一个字段”所属学院”,该字段允许取空值。

Alter table 借书卡 add 所属学院 null 

使用ALTER语句为图书的库存册数字段加入域完整性约束,册数必须介于0-100否则报错。

Alter table 图书 alter 库存册数 set check ( 库存册数>=0 and 库存册数<=100 ) error \"库存册数不符!\" 

使用ALTER语句删除借书卡的班级字段。

Alter table 借书卡 drop column 班级 

使用ALTER语句重命名”借书卡”表的姓名字段为”读者姓名”。

Alter table 借书卡 drop column 班级 

使用ALTER语句为当前数据库中的各表创建索引及其各表间的联系。【先运行“清理数据库”】

1: Alter table 借书记录 alter 借书卡号 C(10) references 借书卡

2: Alter table 借书记录 add FOREIGN KEY 借书卡号 TAG 借书卡号 REFERENCES 借书卡

3: Alter table 借书记录 alter 书号 N(15) references 图书 tag 书号

实验13

2、根据要求利用相应的系统函数写出命令,并在VFP中测试运行结果是否正确。 

若系统中已有变量r=5,需要输出以r为半径的圆面积,

应使用 ?PI()*R*R 命令。 

若系统中已有变量t= 345.678,希望输出其保留两位小数的四舍五入值,

应使用 ?ROUND(t,2) 命令。 

若需要让计算机输出2010年2月2日、2007年3月3日和1999年4月4日三个日期

的最大值,应使用 ?MAX({^2010-02-02},{^2007-03-03},{^1999-04-04}) 命令。 

系统中已有变量a=” select * from db”,若需要将变量a的字母全部转换为大写并输出,

应使用 ?UPPER(a) 命令。 

输入:A=”天行健,君子以自强不息” ,从 A中取出子串”自强不息”并输出,

应使用 ?RIGHT(A,8) 命令或 ?SUBSTR(A,15,8) 命令。 

输入:A=”My E-Mail地址”,从 A中取出子串”E-M”并输出,

应使用 ?SUBSTR(A,4,3) 命令。 

若需要输出字母”o”在字符串”Visual Foxpro”中第二次出现的字符位置,

应使用 ? AT(\"o\命令。 

若需要使用函数将字符串” Visual Basic”中的”Basic”替换为”C++”并将结果输出,

应使用 ?STUFF(\"Visual Foxpro\命令。 

若需要使用函数在字符串”Foxpro”前插入”Visual ” 并将结果输出,

应使用 ?STUFF(\"Foxpro\命令。     

输出当前的系统时间,可使用 ?TIME() 命令。

输出今天系统日期中的月份数字,可使用 ?MONTH(DATE()) 命令。 输出当前系统日期中的小时数字,可使用 ?HOUR(DATETIME()) 命令。 若需要让计算机输出明年的年份,可使用 ?YEAR(DATE())+1 命令。 若需要将当前时间输出为 小时:分钟 的形式,忽略秒数(如12:30),

可使用 ?left (time(),5) 命令。

 有一存储学生成绩的变量s,若希望成绩小于60时输出“不合格”,成绩60-90时输

出“合格”,成绩大于90分时输出“优秀”,可使用?iif(s<60,\"不合格\优秀\合格\")) 命令(利用IIF函数)。

实验14

根据用户输入的圆半径求出圆面积。

提示:1)清屏 2)使用INPUT接收用户输入的圆半径 3)计算圆半径并保存到一个变量 4)输出提示信息和该变量值。 clear

input \"请输入圆的半径 \" to r m=pi()*r^2

?\"圆的面积是: \"+str(m) 

根据用户输入的教师出生日期查找并输出相应的教师信息。

提示:1)清屏 2)打开教师表 3)使用INPUT接收用户输入的日期值 4)使用LOCATE定位指针到指定记录 5)使用DISPLAY输出指针记录信息 clear use 教师

input \"请输入出生日期: \" to d

locate for 出生日期=d display

 根据用户输入的学生姓名查找并输出相应的学生信息。

提示:1)清屏 2)打开学生表 3)使用ACCEPT接收用户输入文本 4)使用LOCATE定位指针到指定记录 5)使用DISPLAY输出指针记录信息 clear use 学生

accept \"请输入学生姓名: \" to n locate for 姓名=n display

 根据用户输入的年份判断该年份是否为闰年。

提示:1)清屏 2)使用INPUT接收用户输入的年份数值 3)使用IF单语句判断该数值是否符合闰年的条件(可被400整除,或是可被4整除但不能被100整除),如果符合输出提示信息。 clear

input \"请输入年份: \" to y

if y%400==0 or (y%4==0 and y%100!=0) ?\"该年是闰年\" else

?\"该年是平年\" endif

 根据用户输入的学生分数,判断该学生是不合格(<60分)、合格(60-90分)还是优秀(>90分)。(分别采用IF和CASE两种形式编写) clear

input \"请输入学生分数: \" to g if g<60

?\"该学生成绩不合格\" else

if g>90

?\"该学生成绩优秀\" else

?\"该学生成绩合格\" endif endif 方法二 clear

input \"请输入学生分数: \" to g do case case g<60

?\"该学生成绩不合格\" case g>90

?\"该学生成绩优秀\" otherwise

?\"该学生成绩合格\" endcase

 根据用户输入的学生姓名,输出该学生的性别,若学生表中不存在该姓名的学生则显示“查无此人”。

提示:1)清屏 2)打开学生表 3)使用ACCEPT接收用户输入的学生姓名 4)使用LOCATE定位指针到符合条件的记录 5)使用FOUND()函数判断是否有找到记录,若无记录输出“查无此人”,若有记录则判断性别是否等于’男’,并输出判断结果。 clear use 学生

accept \"请输入学生姓名: \" to n locate for 姓名=n if found()

if 性别='男' ?\"该生是男生\" else

?\"该生是女生\" endif else

?\"查无此人\" endif

 计算自然数1-100中的偶数总和并输出(分别使用WHILE和FOR两种循环形式)。 提示:参考课本P78例子。 clear sum=0 i=0

do while i<=100 sum=sum+i

i=i+2 enddo

?\"自然数1-100中的偶数总和为:\"+str(sum) 方法二 clear sum=0

for i=0 to 100 step 2 sum=sum+i endfor

?\"自然数1-100中的偶数总和为:\"+str(sum) 

从键盘接收用户输入的5个数,输出其中的最大值。 提示:参考课本P81例子。 clear

input \"请输入一个数: \" to a store a to ma,mi

for i=2 to 5

input \"请再输入一个数: \" to a if maa mi=a endif endfor

?\"最大值为:\" +str(ma)

 建立一个包含20个元素的数组,令数据各元素的值为该元素下标的平方,并将该数组各元素值输出。

提示:建立数组的命令DECLARE a(20) clear

declare a(20) for i=1 to 20

a(i)=i^2

?\"a(\"+ltrim(str(i))+\")\"+\"=\"+ltrim(str(a(i))) endfor

 输出1号院系所有男生的姓名(尝试分别使用WHILE、FOR和SCAN三种循环形式) 提示:

使用WHILE循环时,首先使用LOCATE定位指针到第一条符合条件的记录,循环条件为DO WHILE FOUND(),若有找到记录则输出姓名字段值,并使用Continue改变循环条件。

使用FOR循环时,循环条件为FOR i=1 to RECCOUNT(),依次判断每条记录的所属院系是否为1且性别是否为男,若结果为真则输出姓名字段值。

使用SCAN循环时,循环条件为SCAN ALL FOR 所属院系=1 and 性别=’男’,每次循环输出当前指针所在的姓名字段值。 方法一 clear

use 学生

locate for 所属院系=1 and 性别=\"男\"

do while found() ?姓名 continue enddo 方法二 clear

use 学生

for i=1 to RECCOUNT() goto i

if 所属院系=1 and 性别='男' ? 姓名 endif endfor 方法三 clear

use 学生

scan ALL FOR 所属院系=1 and 性别='男' ? 姓名 endscan

实验15

学生表中学生的所属院系为1-4,请根据用户输入的院系ID号,输出该院系的学生总数。

思路:1)清屏 2)打开学生表 3)使用Input命令接受用户输入的ID号 4)设置一个计算器变量 5)并使用循环语句循环符合该ID号的学生记录,每次循环使计数器值+1 6)循环结束后输出计数器值,即为学生总数。

clear use 学生

input \"请输入院系ID号:\" to ID s=0

for i=1 to reccount() goto i

if 所属院系=ID s=s+1 endif endfor

?\"学生总数为:\

 根据用户输入的院系名称(非院系ID),输出该院系中所有教师的姓名。

思路:1)清屏 2)使用Accept命令接收用户输入的院系名称 3)使用SQL连接或嵌套查询语句检索该院系名对应的院系教师,并将结果存入名为tmp的临时表 4)使用SELECT tmp选择该临时表工作区 5)循环输出tmp表中的姓名值。

clear

accept \"请输入院系名称:\" to a

select 姓名 from 教师,院系 where 所属院系=院系id and 院系名=a into cursor tmp select tmp

do while not eof() ?姓名 skip Enddo

实验16

设计一个命令行菜单,当用户点击键盘上的1-4数字键,分别输出信息工程系、信息管理系、电脑艺术系或影视动漫系中教师的信息清单(输出工号、姓名、性别、婚否、职称5列信息,其中婚否输出“已婚”或“未婚”)。 效果图如下:

提示:

1)接收单个字符可用WAIT命令。

2)使用DO CASE命令对用户输入进行分支判断,可以设置一个过程用来输出信息,例如用户输入1,则执行listTeacher(1)。

2)若希望多列输出排列整齐,可使用? \"工号\" at 1,\"姓名\" at 11 „的形式。 3)原始数据中的婚否字段为逻辑型,可用if语句转换为字符“已婚”或“未婚”。 clear

USE 教师

?\"1.信息工程系教师清单\" ?\"2.信息管理系教师清单\" ?\"3.电脑艺术系教师清单\" ?\"4.演视动漫系教师清单\" WAIT \"请选择(1-4):\" TO A A=VAL(A) DO CASE CASE A=1 LISTTEACHER(1) CASE A=2 LISTTEACHER(2) CASE A=3 LISTTEACHER(3) CASE A=4

LISTTEACHER(4) endcase

PROCEDURE LISTTEACHER PARAMETERS A

LOCATE FOR 所属院系=A DO WHILE FOUND()

?\"姓名\工号\性别\职称\" ?姓名,工号,性别,职称 continue enddo endproc

设计一个命令行菜单,当用户选择命令1时,查询指定学号的学生记录;当用户选择命令2时,删除指定学号的学生记录(执行后提示删除是否成功);当用户选择命令3时退出程序。 效果图如下:

提示:

1)可设置多个模块来执行不同命令,使用DO CASE判断用户输入1时执行模块1,输入2时执行模块2„„使程序结构清晰。 2)删除记录可以使用SQL的DELETE命令或VFP的DELETE命令,注意两者形式的区别,逻辑删除完成后还应执行PACK物理删除。 3)可以使用RECCOUNT()函数判断删除前后记录时是否有减少,有减少则输出删除成功,否则删除失败。

clear use 学生

?\"请输入要执行的操作\" ?\"1.查询新生记录\" ?\"2.删除学生记录\"

?\"3.退出\"

wait \"请选择(1-3):\" to a a=val(a) do case

case a=(1)

input \"请输入要查询的学生学号:\" to b

student1(b) case a=(2)

input \"请输入要删除的学生学号\" to c student2(c) case a=(3) quit

endcase

procedure student1 parameters b locate for 学号=b

?学号,姓名,性别,身份证号,所属院系 endproc

procedure student2 parameters c t=reccount()

delete for 学号=c pack

if reccount()?\"删除不成功\" endif endproc

使用循环语句打印出如下图案(菱形)

提示:

1)使用FOR循环嵌套。

2)VFP中输出换行符使用函数CHR(10)。

clear

for i=1 to 7 step 2 for s=1 to i ??\"*\" endfor ??chr(10)

endfor chr(10)

for t=5 to 1 step -2 for m=1 to t ??\"*\" endfor ??chr(10) endfor 

如果一个数的各位数的立方和等于它本身,则这样的数称为水仙花数。求100-999中所有的水仙花数。

提示:参考教材P80例子。

clear

for i = 100 to 999 a = int(i/100)

b = int((i-100*a)/10) c = i-int(i/10)*10 if i = a^3+b^3+c^3 ? i endif endfor return 

由用户输入任意一个三位数,将其各位数字反序输出(例如输入123,输出321) 提示:参考上题思路。

clear

input \"请输入任意三位数:\" to i a=int(i/100)

b=int((i-a*100)/10) c=i-int(i/10)*10

?str(c)+str(b)+str(a) 

输出Fibonacc数列前30项数字。(Fibonacc数列前两项分别是0和1,以后各项是其前两项的和,即0,1,1,2,3,5,8,„)

clear a=0 b=1 s=1 ? a ? b ? s

for i= 1 to 27 x=s

s=s+b b=x ? s endfor return

注:实验12的答案自己运行一下就可以,没有在此列出。答案不唯一,并且可能有点小错误,希望大家根据自己的试验进行修改,在此感谢提供材料的同学并祝大家取的好成绩!