1、Visual Foxpro 6.0,程序设计基础,重庆工商大学计算机学院计算机基础教研室,作业中的问题,、建立关联的步骤 、上机成绩=“缺考” or “不及格” 、replace all成绩合格否 with “T”;for 笔试成绩=60 and 上机成绩=优秀 or 上机成绩=及格,第十一讲 多表程序及表的多重循环,多表程序 表的多重循环,内容提要,多表程序,例(实验指导书P35):根据如下两个数据表,分别设计程序完成以下功能。,输入课程名,查询该课程授课教师姓名和职称; 统计每位教师总的课时费。,kc.dbf,js.dbf,方法一: clear accept“请输入查询课程名称:“ to
2、kcm ?“课程名:“+kcm select 姓名 as 教师姓名,职称 from js,kc ;where 职工号=授课教师 and 课程名=kcm to screen return,方法二: clear set safety off sele 1 use js index on 职工号 tag zgh sele 2 use kc set rela to 授课教师 into js accept“请输入查询课程名称:“ to kcm ?“课程名:“+kcm ?“教师姓名 职称“ scan for 课程名=kcm?a.姓名,space(4),a.职称 endscan close all set
3、safety on return, 方法一: clear sele 姓名 as 教师姓名,sum(学时数)*单位课时费 as 课时费 ;from js inner join kc on 职工号=授课教师;group by 授课教师 return,方法二: clear set safety off sele 1 use kc index on 授课教师 tag skjs total on 授课教师 to zks use zks index on 授课教师 to skjs sele 2 use js set rela to 职工号 into a ?“教师姓名 课时费“ scan ?姓名,a.学时数
4、*单位课时费 endscan close all set safety on return,例:有一职工代码表(ZD.DBF),人事信息表(RS.DBF),ZD.DBF 代码 职称 013 助理工程师 015 技术工人 002 工程师 001 高工,RS.DBF编号 姓名 性别 职称 基本工资 工龄工资 扣款 实发工资1041 赵娟 女 013 113.00 13.00 25.705101 骆艺 男 002 150.00 21.00 31.511030 沈峥 女 015 87.00 5.00 11.004103 刘芳 女 001 180.00 25.00 45.605130 杨山 男 002
5、150.00 15.00 24.001025 刘柳 男 013 113.00 8.00 15.00,编一个程序,完成以下任务: 计算实发工资(实发工资=基本工资+工龄工资-扣款)并填入RS.DBF中。 统计各类职称的基本工资,工龄工资,扣款,实发工资总数。 显示统计结果,其中统计表中“高工,工程师,助理工程师,技术工人”等职称名字必须通过职工代码表得到,并以代码的索引顺序显示,其格式如下:基本工资 工龄工资 扣款 实发工资高工 . .工程师 . . . .合计 . .,clea clea all set talk off set safe off sele 1 use rs replace a
6、ll 实发工资 with 基本工资+工龄工资-扣款 inde on 职称 tag zcdm total on 职称 to hz use hz inde on 职称 tag zcdm sele 2 use zd set rela to 代码 into hz,该程序涉及到几个表,?,RS.DBF HZ.DBF ZD.DBF,一对一关系,汇总,?“ 基本工资 工龄工资 扣款 实发工资“ scan?职称,hz.基本工资,hz.工龄工资,hz.扣款,hz.实发工资 endscan?“合计“,jb,gl,kk,sf clos all set talk on set safe on retu,store 0
7、 to jb,gl,kk,sf,sum hz.基本工资,hz.工龄工资,hz.扣款,hz. 实发工资 to jb,gl,kk,sf,jb=jb+ hz.基本工资 gl=gl+ hz.工龄工资 kk=kk+ hz.扣款 sf=sf+ hz.实发工资,inde on 代码 tag dm &按代码升序排列,例:设有学生档案表、成绩表和学生课程表的表结构如下: 学生档案表(xsda.dbf):学号(C,10),姓名(C,8),性别(C,2),入学总分(N(5,1)。 学生成绩表(xscj.dbf):学号(C,10)(有重复值),课程号(C,5)(有重复值),学期(C,1),考试成绩(N(5,1)。 学
8、生课程表(xskc.dbf):课程号(C,5),课程名(C,14)。 按如下要求编写一个程序:,根据以上3个表,显示所有学生各门课程的学号、姓名、课程名、考试成绩。 通过键盘任意输入一个课程号和学期,计算并显示该门课程该学期的平均分、最高分和最低分,显示该门课程该学期所有需要参加补考的学生的补考通知单,其格式如下:补考通知单XXX同学:第X学期你的XXXXXX课程考试不及格,请利用假期看书复习,作好补考准备。 注意:补考通知单中的“X”需用数据表中的相应数据填充。,clear clear all set safe off set talk off select 1 use xsda inde
9、on 学号 tag xh select 2 use xskc inde on 课程号 tag kch select 3 use xscj set relation to 学号 into xsda set relation to 课程号 into xskc additive,?“学号 姓名 课程名 考试成绩“ scan ?学号,xsda.姓名,xskc.课程名,考试成绩 endscan accept “请输入课程号:“ to kch accept “请输入学期:“ to xq?“该门课程该学期的平均分为:“,pjf ?“该门课程该学期的最高分为:“,zgf ?“该门课程该学期的最低分为:“,zd
10、f,calculate avg(考试成绩),max(考试成绩), min(考试成绩) to pjf,zgf,zdf for 课程号=kch and 学期=xq,scan for 成绩60 and 课程号=kch and 学期=xq?“ 补考通知单“?xsda.姓名+“同学:“?“ 第“+学期+“学期你的“+xskc.课程名+“课程考试不及格,请利用假“?“期看书复习,作好补考准备。“ endscan close all set talk on set safe on return,表的双重循环,例:利用学生.dbf和选课.dbf,通过反复输入学生的学号(输入回车键退出),查询学生的姓名、籍贯、
11、课程号以及成绩情况。,方法1: set safety off sele 1 use 学生 alias xs index on 学号 tag xh sele 2 use 选课 set relation to 学号 into xs,do while .t. &外循环accept “请输入学生的学号:“ to xh? “姓名 专业班级 课程号 成绩“scan for 学号=xh &内循环?xs.姓名,xs.籍贯,课程号,成绩endscan enddo close all set safety on return,if len(alltrim(xh)=0exit endif,If alltrim(xh
12、)=“#”,方法2: clear all do while .t.accept “请输入学生的学号:“ to xhif len(alltrim(xh)=0exitendif select 姓名,籍贯,课程号,成绩 from 选课 xk,学生 xs where xs.学号=xh and xk.学号=xs.学号 to screen enddo ,学生情况表ST.DBF学号 姓名 性别 总成绩KI01 王子仪 女 409KI02 李丽萍 女 512KI03 张雨 男 390KI04 马思成 男 400KI05 陈艳 女 395,家庭情况表FAM.DBF学号 亲属姓名 关系 部门KI01 王松 父亲
13、DE3KI01 刘利 母亲 DE1KI02 李永 父亲 DE1KI03 张永强 父亲 DE5KI03 赵雯 母亲 DE7KI03 张明 哥哥 DE3KI04 李翠花 母亲 DE3KI05 陈兴平 父亲 DE5KI05 陈大伟 爷爷 DE2,例(实验指导书P40) :现有两个表文件,表结构及部分记录如下,编写程序,反复输入部门,查询亲属在该部门工作的学生名单(即按亲属工作部门查询学生)。要求输出式如下(假设输入的部门为DE3):DE3 部 门学生姓名 亲属关系 亲属姓名王子仪 父亲 王松张明 哥哥 张明马思成 母亲 李翠花,方法一: clear set talk off sele 1 use s
14、t inde on 学号 tag xh sele 2 use fam set rela to 学号 into a,yn=“y“ do while uppe(yn)=“Y“ accept “请输入部门:“ to bmclea?space(15)+bm+“部门“?“学生姓名 亲属关系 亲属名单“scan for 部门=bm?a.姓名+“ “+关系+“ “+亲属姓名endswait “是否还要继续?(y/n)“ to yn enddo close all set talk on return,方法二: CLEAR yn=“y“ do while upper(yn)=“Y“accept “请输入部门:
15、“ to bmclea?space(15)+bm+“部门“select stu.姓名 as 学生姓名,关系 as 亲属关系,亲属姓名 as 亲属名单 from stu,fam ; where stu.学号=fam.学号 and 部门=bm to screenwait “是否还要继续?(y/n)“ to yn enddo retu,(0801)设有一学生成绩表STU.DBF对“编号”已经建立复合索引。其内容如下: 记录号 编号 高数 外语 计算机 1 0701120 90 98 78 2 0701128 85 76 81 3 0702003 77 87 67 4 0702010 50 60 87
16、 5 0710010 65 73 55 6 0713108 76 80 90 学生编号的含义是:1-2位代表年级,3-4位代表专业,最后3位代表一个专业全部同学的顺序号。以下程序的功能是分组汇总各专业同学各门功课的总成绩和三门课程的总成绩,按顺序输出它们。请填空完成。,SET TALK OFF USE STU SET ORDER TO ? “专业编号 高数 外语 计算机 总分“ DO WHILE not eof() STORE 0 TO K1,K2,K3 BH=substr(编号,3,2) DO WHILE substr(编号,3,2)=BH AND K1=K1+高数K2=K2+外语K3=K3
17、+计算机SKIP ENDDO ? ENDDO USE,tag 编号,BH,K1,K2,K3,K1+K2+K3,not eof(),(0802)设有职工表和奖金表的表结构如下: 职工表(zg.dbf):职工号(C,7)(无重复值),姓名(C,6),工作日期(D)。 奖金表(jj.dbf):职工号(C,7)(无重复值),部门号(C,4)(有重复值),奖金(N,5,1)。 按如下要求编写一个程序: 根据以上两个表,可以通过键盘任意输入一个部门号(按回车键结束),按奖金从高到低显示该部门的职工姓名、工作年限(=系统当前日期的年份值-工作日期的年份值)及奖金,显示格式如下:职工姓名 工作年限 奖金 ,解
18、法一: clear clear all set safe off select 1 use zg inde on 职工号 tag xh (2分) select 2 use jj set relation to 职工号 into zg inde on 奖金 tag jj desc (1分) do while .t. accept “输入部门号:“ to bmh if len(allt(bmh)=0 (3分)exitendif ?“ 职工姓名 工作年限 奖金“,Scan for 部门号=bmh (4分)?zg.姓名, year(date()-year(zg.工作日期),奖金 Endscan End
19、do close all set safe on return,解法二: clear do while .t. accept “输入部门号:“ to bmh (3分)if len(allt(bmh)=0 exitendif select 姓名,year(date()-year(zg.工作日期) as工作年限,奖金 from zg,jj; (3分)where zg.职工号=jj.职工号 and 部门号=bmh; (5分) order by 奖金 desc (7分) Enddo,(0702)已知两个数据表:学生档案表XSDA.dbf,有学号、姓名、专业班级(均为字符型)等字段和学生成绩表XSCJ.
20、dbf,有学号(有重复值)、课程名、成绩(数值型)等字段。 编写一程序,通过反复输入学生的学号(输入回车键退出),查询学生的姓名,专业班级,课程名以及成绩情况。,方法1:利用VFP语言实现 clear set safety off clear all sele 1 use XSDA index on 学号 tag xh sele 2 use XSCJ set relation to 学号 into xsda,do while .T. accept “请输入学生的学号:“ to xhif len(alltrim(xh)=0exitendif?“姓名 专业班级 课程名 成绩“scan for 学号
21、=xh ?xsda.姓名,xsda.专业班级,课程名,成绩endscan enddo close all set safety on return,方法2:利用select-sql语言实现 Close all clear Do while .T. accept “请输入学生的学号:“ to xhif len(alltrim(xh)=0exitendif Select 姓名,专业班级,课程名,成绩; from xscj,xsda where xsda.学号=xh and xscj.学号=xsda.学号 to screen enddo,(0701)、有营业员数据表文件YYY.DBF和日销售数据表文
22、件RXS.DBF*YYY.DBF 营业员代码 姓名 性别 101 天涯 女 102 海角 男 103 风声 男 水起 女 *RXS.DBF 营业员代码 品名 数量 单价 营业额101 电视 3 1230.40 0000.00102 电话 4 223.00 0000.00101 电扇 5 334.00 0000.00103 电话 3 223.00 0000.00102 电视 1 1230.40 0000.00,编程要求:(1)计算出RXS.DBF中的营业额字段的值。注:营业额=数量*单价(2)根据用户输入的营业员代码查询某个营业员的全天营业额,按如下格式显示:代码:101姓名:天涯 性别: 女品
23、名 营业额电视 3691.20电扇 1670.00营业额: 5361.20,clear select 1 use rxs replace all 营业额 with 数量*单价 select 2 use yyy index on 营业员代码 tag dm select rxs set relation to 营业员代码 into yyy accept “输入营业员代码:” to dm ?”代码:”+dm locate for 营业员代码=dm ?“姓名:”+yyy.姓名+“ 性别:”+ yyy.性别 List 品名,营业额 for 营业员代码=dm off sum 营业额 to x1 for 营业员代码=dm ?” 营业额:”,x1 Close all return,第11次上机 准备,熟悉vfp环境,默认路径的设置 实验15 任务1(1)(2)(3)(下周周末提交) 实验15 任务2(课外自己完成,老师给参考程序),