365网友提供计算机信息管理试题
来源:本站整理 时间:2020-02-13 15:59:42
03年管信的考试题目上机练习
(一)创建数据库
1.按下列要求建立数据库ST1.DBF .
XH(C,6)?XM(C,8)?XB(C,2)?CS(D,8)?SJK(N,3)?GLXX(N,3)
200101?安潜光?男?82-08-25?70?90
200114?毛?皓?男?83-06-08?65?70
200118?冯岳阳?女?80-08-15?82?95
200205?戴晓霞?女?81-07-18?60?65
200218?闫安雪?男?83-05-08?80?88
(XH、XM、XB、CS、SJK、GLXX分别表示:学号、姓名、性别、出生日期、数据库、管理信息)
2.按下列要求编写命令文件P1.PRG .
①复制数据库ST1的结构,生成数据库ST2.
②复制数据库ST1的结构,生成数据库ST3,其中只含字段XM、GLXX及SJK.
③将数据库ST1复制成ST4.
④将数据库ST1中,满足80≤GLXX≤90的XM及GLXX复制成数据库ST5.
⑤将数据库ST1中1983年出生的男学生的记录复制成数据库ST6.
⑥将数据库ST1中学号最后二位为‘18’的记录复制成数据库ST7.
⑦将数据库ST1中姓名含有‘安’字的记录复制成数据库ST8.
「解答」
在COMMAND窗口中,输入命令:?MODIFY?COMMMAND?P1
然后,在编辑窗口中输入下列命令组。
USE ST1
COPY STRUCTURE TO ST2
COPY STRUCTURE TO ST3 FIELDS XM, GLXX, SJK
COPY TO ST4
COPY TO ST5 FIELDS XM, GLXX FOR GLXX =80 .AND. GLXX =90
COPY TO ST6 FOR SUBSTR(DTOC(CS),1,2)=‘83’。AND. XB=‘男’
COPY TO ST7 FOR SUBSTR(XH,5,2)=‘18’
COPY TO ST8 FOR‘安’$ XM
RETURN
最后,按Ctrl+W保存退出。
如果在COMMAND窗口中,先输入命令:
SET DE**UAL TO A:
设置当前驱动器为A .即可在A驱动器中建立文件P1.PRG.
如果数据库文件没有打开,要使用命令
COPY?FILE? 源文件名 ?TO? 目标文件名 来复制文件。
(二)窗口设计
1.按下列要求编制窗口设计模块程序文件P2.PRG .
①在位置(10,15)到(20,65)建立一个名为WINA,标题为‘显示记录’的窗口。
②在该窗口中,按下图所示的格式,逐条显示数据库ST1.DBF的记录信息。
(10,15)
显示记录?姓名:XXX?学?号:XXXXXX?性别:X?出生日期:XX-XX-XX
(20,65)
「解答」
用命令MODIFY COMMAND P2?来建立程序文件P2.PRG
先定义窗口的名字、大小、标题等,使用时要激活窗口,结束要释放窗口。
使用数据库先要打开,最后要关闭。
在窗口中按要求格式显示一条记录后,要用WAIT命令暂停一下,否则,后一条记录会覆盖
前一条记录。
参考程序如下:
SET TALK OFF
CLEAR
DEFINE WINDOW WINA FROM 10,15 TO 20,65 FONT 'T黑体',11 TITLE‘显示记录’
ACTIVATE WINDOW WINA
USE ST1
DO WHILE .NOT. EOF()
@2,2 SAY‘姓名:’+XM
@2,25 SAY‘学?号:’+XH
@4,2 SAY‘性别:’+XB
@4,25 SAY‘出生日期:’+DTOC(CS)
WAIT
SKIP
ENDDO
USE
RELEASE WINDOW WINA
SET TALK ON
RETURN
2.按下列要求编制程序文件P3.PRG .
①在位置(10,15)到(20,65)建立一个名为WINB,标题为‘姓名查询’的窗口。
②对数据库ST1.DBF的记录进行查看:先输入学号查找,若无此学号,再输入姓名查找记录。
找到了,则在窗口中按下图所示的格式显示该记录信息,否则显示‘查无此学生’。
(10,15)
姓名查询?姓?名:XXX?出生日期:XX-XX-XX?数据库:XX?管理信息:XX
(20,65)
「解答」
用命令MODIFY COMMAND P3?来建立程序文件P3.PRG.
查找是从大量记录中找出满足条件的记录,把记录指针定位在要查找的记录上。
查找有两种方式:顺序查询和索引查询。
题中按学号查找是采用顺序查询,命令为?LOCATE.?
按姓名查找是采用索引查询,它必须在姓名XM为关键字段进行索引的基础上进行,程序中
使用了命令:
FIND? STXM?
或?SEEK?STXM .?
可以通过FOUND()或EOF()函数来判断是否查到记录。
查到时,记录指针总是指向第一个满足条件的记录,此时FOUND()函数为真, EOF()函数为假。
未找到,记录指针指向库文件尾部, FOUND()函数为假, EOF()函数为真。
参考程序如下:
SET TALK OFF
CLEAR
DEFINE WINDOW WINB FROM 10,15 TO 20,65 FONT 'T黑体',11 TITLE‘姓名查询’
ACTIVATE WINDOW WINB
USE ST1
ACCEPT‘请输入学号’TO STXH
LOCATE FOR XH=STXH
IF .NOT. EOF()
CLEAR
@2,2 SAY‘姓?名:’+XM
@2,25 SAY‘出生日期:’+DTOC(CS)
@4,2 SAY‘数据库:’+STR(SJK,3)
@4,25 SAY‘管理信息:’+STR(GLXX,3)
ELSE
?‘无此学号’
ACCEPT‘请输入姓名’TO STXM
INDEX ON XM TO STID
FIND STXM
IF .NOT. EOF()
CLEAR
@2,2 SAY‘姓?名:’+XM
@2,25 SAY‘出生日期:’+DTOC(CS)
@4,2 SAY‘数据库:’+STR(SJK,3)
@4,25 SAY‘管理信息:’+STR(GLXX,3)
ELSE
?‘查无此学生’
ENDIF
ENDIF
?
WAIT
USE
RELEASE WINDOW WINB
SET TALK ON
RETURN
(三)屏幕设计
1.利用屏幕生成器,设计一个如下图所示的屏幕文件P4.SPR .
屏幕要求:标题——‘欢迎’
文本‘欢迎你参加自学考试’——字体为隶书,字号为22,颜色为红色
进入按钮——功能设定为执行命令:?WAIT WINDOW?‘该功能进入系统’
退出按钮——功能设定为退至FOXPRO主窗口?
「解答」
操作要点如下:
①打开屏幕设计窗口
用命令CREATE SCREEN P4,或系统菜单File / New / Screen,单击New,打开屏幕生成器窗口。
②设计屏幕
单击文本工具?创建文本对象?‘欢迎你参加自学考试’
Object / Font?设置字体,字号
Object / Pen Color?设置颜色
Screen / Layout / Title?设置标题?欢迎
单击命令按钮工具?设置‘进入’按钮
Push button Prompts:?进入
Variable…?JR
Valid…?WAIT WINDOW?‘该功能进入系统’
单击命令按钮工具?设置‘退出’按钮
Push button Prompts:?退出
Variable…?TC
Options:?选Terminate READ On Selection
③保存
File / Save?
保存,生成屏幕信息的数据库文件P4.SCX及屏幕信息的备注文件P4.SCT.
④生成屏幕程序
Program / Generate
在弹出的对话框中,选Options…,可以设置设计者的注释信息,如姓名、单位、地址、邮编等,
它们自动产生在屏幕程序的开头。最后,单击Generate ,生成屏幕程序文件P4.SPR.
⑤运行屏幕程序
DO P4.SPR?显示出题意所要求的屏幕程序文件P4.SPR.
2.利用屏幕生成器,设计一个如下图所示的逐条显示数据库ST1记录的屏幕文件P5.SPR .
屏幕要求:标?题——‘显示记录’
上一条按钮——功能为显示上一条记录
下一条按钮——功能为显示下一条记录
退出按钮——功能为退至FOXPRO主窗口
「解答」
操作要点如下:
①打开屏幕设计窗口
用命令CREATE SCREEN P5 ;或用系统菜单File / New / Screen,单击New,打开屏幕生成器窗口。
②设计屏幕
Screen / Layout / Title?设置标题?显示记录
单击文本工具?创建文本对象?姓名?
单击字段工具?设置字段对象?XM
Input…?ST1.XM
类似方法可设置文本对象:学号、管理信息、数据库;?字段对象XH、GLXX、SJK
单击画矩形工具?将上述对象围绕在矩形框内
单击命令按钮工具?设置上一条按钮
Push button Prompts:?上一条
Variable…?SYT
Valid…?输入下列代码:
IF .NOT. BOF()
SKIP–1
ELSE
GO BOTTOM
ENDIF
SHOW GETS
RETURN?
单击命令按钮工具?设置下一条按钮
Push button Prompts:?下一条
Variable…?XYT
Valid…?输入下列代码:
IF .NOT. EOF()
SKIP?
ELSE
GO TOP
ENDIF
SHOW GETS
RETURN?
(退出按钮的设置?同上机练习题(三) 1. )
③保存
File / Save?
保存,生成屏幕信息的数据库文件P5.SCX及屏幕信息的备注文件P5.SCT.
④生成屏幕程序
Program / Generate / Generate?
生成屏幕程序文件P5.SPR……
⑤运行屏幕程序
DO P5.SPR?
在窗口中按上(或下)一条按钮,可以向上(或下)逐条显示记录。
3.利用屏幕生成器,设计一个如下图所示的按出生日期查询数据库ST1记录的屏幕文件P6.SPR .
屏幕要求:标?题——‘按日期查询’
查询按钮——输入出生日期,查到了在屏幕中显示记录,否则显示白空
(类似地可以设计按姓名查询或按数据库分数查询的屏幕文件)
「解答」
操作要点如下:
①打开屏幕设计窗口
用命令CREATE SCREEN P6,或系统菜单File / New / Screen,单击New,打开屏幕生成器窗口。
②设计屏幕
Screen / Layout / Title?设置标题?按日期查询
单击文本工具?创建文本对象?姓名、学号、数据库、管理信息?
单击字段工具?设置字段对象?XM、XH、SJK、?GLXX
(设置方法同上机练习题(三) 2. )
单击画矩形工具?将上述对象围绕在矩形框内
单击文本工具?创建文本对象?输入出生日期
单击字段工具?在弹出的对话框中,设置一个日期型内存变量MCS
Input…?MCS
Format…?选取Date
(若按姓名查询,应选取Character )
(若按分数查询,应选取Numeric )
单击命令按钮工具?设置查询按钮
Push button Prompts:?查询
Variable…?CXCS
Valid…?输入下列代码
LOCATE FOR CS=MCS
SHOW GETS
RETURN
③保存?File / Save?
保存,生成屏幕信息的数据库文件P6.SCX及屏幕信息的备注文件P6.SCT.
④生成屏幕程序
Program / Generate / Generate?生成屏幕程序文件P6.SPR……
⑤运行屏幕程序?DO P6.SPR
在输入出生日期框中,输入欲查找的日期,单击查询按钮,显示查询结果。
(四)菜单设计
有一个学生信息管理系统,它的菜单选项及对应的模块程序(假设已存在)如下表所示:
菜单栏菜?单?项程序文件名
数据编辑追加记录ZJ.SPR
浏览记录LL.SPR
数据查询学号查询XH.SPR
姓名查询XM.SPR
退出系统返回到FOXPRO
返回到WINDOWS桌面
使用菜单生成器,生成学生信息管理系统的主菜单程序文件P7.MPR .
「解答」
操作要点如下:
①打开菜单设计窗口
用命令CREATE MENU P7 ;或系统菜单File / New / Menu,单击New,?打开菜单生成
器窗口。
②设计主菜单选项
在上图中, Menu Level框处显示Menu Bar,在此状态下设计主菜单选项。
Prompt框中依次输入主菜单选项‘数据编辑’、‘数据查询’和‘退出系统’
Result下拉列表框中依次选择Submenu?
③设计子菜单选项
在上图中,选中‘数据编辑’项,单击Create ,?此时, Menu Level框处显示‘数据编辑’,
在此状态下,设计‘数据编辑’菜单项的子菜单。
Prompt框中依次输入子菜单选项‘追加记录’及‘浏览记录’
Result?下拉列表框中依次选择Command
对‘追加记录’项,输入命令do ZJ.SPR,表示调用‘追加记录’的屏幕文件。
对‘浏览记录’项,输入命令do LL.SPR,表示调用‘浏览记录’的屏幕文件。
单击Menu Level的下拉列表,选择Menu Bar,返回上一层菜单,用同样方法可以设计‘数据
查询‘和’退出系统‘的子菜单选项。
子菜单选项‘返回到FOXPRO’, Result框中选择Procedure,单击Create,在对话框中输入命令:
CLEAR
MODIFY WINDOW SCREEN
SET SYSMENU TO DE**ULT
ACTIVATE WINDOW COMMAND
RETURN
子菜单选项‘返回到WINDOWS桌面’, Result框中选择Command,输入命令:
QUIT
④保存?File / Save
生成菜单信息的数据库文件P7.MNX及菜单信息的备注文件P7.MNT.
⑤生成菜单程序文件?Program / Generate?
在弹出的对话框中,?选择Comment Options…,?可以设置设计者的注释信息,如姓名、
单位、地址、邮编等,它们自动产生在菜单程序的开头。?最后,单击Generate ,生成菜单程序
文件P7.SPR.
⑥显示主菜单窗口?Do?P7.MPR
主菜单显示如下:
(五)数据管理模块程序设计
1.按下列要求编制模块程序文件P8.PRG .
①该模块的功能是在窗口中对数据库ST1统计数据。
②窗口位置为(5,10)到(12,60),窗口名为WIN ,标题为“统计记录”。
③将管理信息GLXX的成绩分为四档:
优秀(GLXX≥85)?良好(70≤GLXX 85)?及格(60≤GLXX 70)?不及格(GLXX 60)
统计各档成绩的人数,并在窗口中显示统计结果。
「解答」
在程序中用命令DIMENSION S(4)来定义一数组,存放统计GLXX四档成绩的人数。
用命令MODIFY COMMAND P8?来建立程序文件P8.PRG .
参考程序如下:
SET TALK OFF
CLEAR
DEFINE WINDOW WIN FROM 5,10 TO 12,60 FONT 'T黑体',11 TITLE '统计记录'
DIMENSION S(4)
STORE 0 TO S
USE ST1
DO WHILE .NOT.EOF()
DO CASE
CASE GLXX =85
S(1)=S(1)+1
CASE GLXX =70 .AND. GLXX 85
S(2)=S(2)+1
CASE GLXX =60 .AND. GLXX 70
S(3)=S(3)+1
CASE GLXX 60
S(4)=S(4)+1
ENDCASE
SKIP
ENDDO
ACTIVATE WINDOW WIN
@2,2 SAY '优秀:'+STR(S(1),3)+'人'
@2,25 SAY '良好:'+STR(S(2),3)+'人'
@4,2 SAY '及格:'+STR(S(3),3)+'人'
@4,25 SAY '不及格:'+STR(S(4),3)+'人'
WAIT WINDOW
USE
RELEASE WINDOW WIN
SET TALK ON
RETURN
2.按下列要求编写程序文件P9.PRG .
①屏幕提示“请输入密码”,输入时密码不显示,密码设为大写“GLXX”。
②若密码正确,执行打开数据库ST1,显示记录命令。
若密码不正确,显示“第几次密码错,请重新输入!”。
③如果密码已连续错三次,第四次输入再错,则退至WINDOWS桌面。
「解答」
首先,定义一个名为MMW的窗口,标题为‘密码窗口’,然后激活它。在输入密码之前,用命令
SET CONSOLE OFF
来屏蔽显示,起到保密效果。?输入密码之后,再恢复屏蔽显示。
密码保存在变量PSW中,函数UPPER(ALLTRIM(PSW))的作用,是将输入的密码,除去前后
空格后转换成大写字符。
输入密码的次数保存在变量N中。
用命令MODIFY COMMAND P9?来建立程序文件P9.PRG .
参考程序如下:
SET TALK OFF
CLEAR
CLEAR ALL
DEFINE WINDOW MMW FROM 10,5 TO 28,75 FONT 'T黑体',11 TITLE '密码窗口'
N=1
DO WHILE .T.
ACTIVATE WINDOW MMW
@2,5 SAY '请输入密码******'
SET CONSOLE OFF
ACCEPT TO PSW
SET CONSOLE ON
IF UPPER(ALLTRIM(PSW))=='GLXX'
CLEAR
USE ST1
LIST
WAIT WIND
USE
EXIT
ELSE
IF N =4
CLEAR
?'密码错误,退出!'
WAIT WIND
QUIT
ELSE
?
?'第'+STR(N,1)+'次密码错,请重新输入!'
WAIT WIND
N=N+1
ENDIF
ENDIF
ENDDO
RELEASE WINDOW MMW
SET TALK ON
RETURN
3.现已有(假设已存在)通讯信息数据库TX.DBF,其字段有:
XM (姓名,字符型) ,?DH (电话,字符型) ,?DZ (地址,字符型)
按下列要求编写程序文件P10.PRG .
①用格式化输入语句接收一个用户姓名,在TX中进行查找记录。
②若找到,则显示该用户记录,?找不到,则显示“查无此用户”。
③重复上述过程,直到接收的字符为“8888”时,结束程序的运行。
「解答」
现在假设数据库TX.DBF已经存在的前提之下来编写程序,在调试程序时,可以创建数据库,
并模拟输入一些记录来进行调试
程序中使用循环语句DO WHILE来实现连续查找,逻辑变量FL作为循环的条件,其初值为。T. ,
一旦输入字符为‘8888’时,则将变量FL置为。F. ,或者用命令EXIT退出循环,结束程序的运行。
用命令MODIFY COMMAND P10?来建立程序文件P10.PRG ,参考程序如下:
SET TALK OFF
CLEAR
CLEAR ALL
USE TX
FL=.T.
DO WHILE FL
CLEAR
MXM=SPACE(6)
@10,10 SAY '请输入姓名' GET MXM
READ
IF FL=(ALLTRIM(MXM)='8888')
EXIT
ENDIF
LOCATE FOR XM=MXM
IF FOUND()=.T.
DISPLAY
ELSE
? '查无此人'
ENDIF
WAIT
ENDDO
USE
SET TALK ON
RETURN
4.现已有商品信息数据库SP.DBF,其字段有:
SH (商品代号,字符型) ,?SM (商品名称,字符型) ,?GG (规格,字符型)
按下列要求编写程序文件P11.PRG ,?其功能是查找显示出同一商品名称有两种以上规格
的SM.
「解答」
设置变量TJSM为同一商品名称的不同规格的种类数。
先对商品名称字段SM进行索引,将商品名称按不相同的分类集中在一起,?然后再统计每
一类商品名称有多少种规格。
在统计中,先将每类的商品名称SM赋给内存变量MSM,暂时保存,利用命令
COUNT TO TJSM WHILE SM=MSM
统计该类中各种规格数,并赋给变量TJSM.?当TJSM =2时,即题意中所要查找的商品名称。
条件子句WHILE SM=MSM的作用是:从当前记录开始,直到不满足条件的记录为止,对所
有已满足条件的记录进行统计,实质上就是起到统计每一类商品名称的各种规格数的条件。
用命令MODIFY COMMAND P11?来建立程序文件P11.PRG ,参考程序如下:
SET TALK OFF
CLEAR
CLEAR ALL
TJSM=0
USE SP
INDEX ON SM TO SPID
DO WHILE NOT EOF()
MSM=SM
COUNT TO TJSM WHILE SM=MSM
IF TJSM =2
? '两种以上规格的商品名称有: '+ MSM
ENDIF
ENDDO
USE
SET TALK ON
RETURN
5.现已存在两个数据库,学生信息数据库ST.DBF,其字段有:
XH (学号,字符型) ,?XM (姓名,字符型) ,?ZL (专业,字符型)
成绩数据库KCCJ.DBF,其字段有:
XH (学号,字符型) ,?KCM (课程名,字符型) ,?CJ (成绩,数值型)
按下列要求编写程序文件P12.PRG ,其功能是统计每个学生各门课程的平均成绩PCJ,
并在屏幕中按下列格式输出:
学号?姓名?平均成绩
XXXX?XXX?XX.X
「解答」
该题涉及到两个数据库之间的操作,一般情况下,要进行关联操作。其目的是将两个在不同工作
区中打开的库文件联系起来,以便当一个关联库文件的记录指针移动时,与之被关联库文件的记录
指针也随之相应移动。
建立关联的方式可以通过索引关键字。
建立关联的条件是两个数据库需在不同工作区中打开,?且被关联库文件需要按关联字段进行
索引。
关联的命令为
SET?RELATION?TO?关联字段名?INTO?被关联库名
在程序中, 1号工作区中打开关联库文件ST , 2号工作区中打开被关联库文件KCCJ,按关联
字段XH建立关联。
每个学号XH所对应的学生,?可以选读多门课程。?从ST的第一个记录的XH数值开始,
在KCCJ中统计出该XH所对应的各门课程的平均成绩PCJ,并按照要求格式输出。
依次循环,即可统计出每个学生各门课程的平均成绩。
由于该题在多库之间的操作,从当前工作区访问其它工作区打开的库文件中的某个字段时,
要在该字段名前加上前缀,?即:
别名- 字段名
或?别名。字段名
打开数据库时,若没有指定别名,则别名与库文件同名。?因此,如果当前2号工作区中打开的
是KCCJ,则XH是库KCCJ中的学号,而ST- XH是另一工作区库ST中的学号。
用命令MODIFY COMMAND P12?来建立程序文件P12.PRG ,参考程序如下:
SET TALK OFF
CLEAR
CLEAR ALL
SELECT B
PCJ=0
USE KCCJ
INDEX ON XH TO KCCJID
SELECT A
USE ST
? '学号'+SPACE(4)+'姓名'+SPACE(4)+'平均成绩'
SET RELATION TO XH INTO KCCJ
SCAN
SELECT KCCJ
AVERAGE CJ TO PCJ WHILE XH=ST- XH
SELECT ST
? XH+SPACE(4)+XM+SPACE(4)+STR(PCJ,3)
ENDSCAN
SET RELATION TO
CLOSE ALL
SET TALK ON
RETURN
6.现已存在两个数据库,学生信息数据库ST.DBF,其字段有:
XH (学号,字符型) ,?XM (姓名,字符型) ,?DZ (地址,字符型)
成绩数据库CJ.DBF,其字段有:
XH (学号,字符型) , SJK (数据库,数值型) , GLXX (管理信息,数值型)
按下列要求编写程序文件P13.PRG ,?其功能是从键盘输入一姓名,?在ST.DBF和CJ.DBF
中查找该学生的成绩,
若找不到,则显示“查无此学生”。
若查找到,则在屏幕中按下列格式显示该学生的成绩:
学号?姓名?数据库?管理信息
XXXX?XXX?XX?XX
「解答」
将库ST作为当前库,学号XH作为主键,输入被查找的学生姓名,保存在变量MXM中。
在库ST中进行查找,当找到时,将用该学生的学号XH再次作为查找对象,在库CJ中,
对外部键XH查找所对应的记录,这样就可以在库CJ中查到了该学生的SJK及GLXX成绩。
用命令MODIFY COMMAND P13?来建立程序文件P13.PRG ,参考程序如下:
SET TALK OFF
CLEAR
CLEAR ALL
SELECT A
USE ST
ACCEPT '请输入姓名' TO MXM
LOCATE FOR XM=ALLTRIM(MXM)
IF FOUND()
SELECT B
USE CJ
LOCATE FOR XH=ST- XH
SELECT A
? '学号'+SPACE(4)+'姓名'+SPACE(4)+'数据库'+SPACE(4)+'管理信息'
? XH+SPACE(4)+XM+SPACE(4)+STR(CJ- SJK,3)+SPACE(4)+STR(CJ- GLXX,3)
ELSE
? '查无此人'
ENDIF
CLOSE ALL
SET TALK ON
RETURN
当然,如果按主键XH将ST与CJ进行关联,只需将上述程序修改一下即可,参考程序如下:
SET TALK OFF
CLEAR
CLEAR ALL
SELECT B
USE CJ
INDEX ON XH TO CJID
SELECT A
USE ST
SET RELATION TO XH INTO CJ
ACCEPT '请输入姓名' TO MXM
LOCATE FOR XM=ALLTRIM(MXM)
IF FOUND()
? '学号'+SPACE(4)+'姓名'+SPACE(4)+'数据库'+SPACE(4)+'管理信息'
? XH+SPACE(4)+XM+SPACE(4)+STR(CJ- SJK,3)+SPACE(4)+STR(CJ- GLXX,3)
ELSE
? '查无此人'
ENDIF
SET RELATION TO
CLOSE ALL
SET TALK ON
RETURN
7.现已存在两个课程数据库KC1.DBF和KC2.DBF?(内容不完全相同) ,它们具有相同的结构,
其字段有:?KCM (课程名,字符型) ,?XS (学时数,数值型) ,?ZL (专业,字符型)
按下列要求编写程序文件P14.PRG,其功能为查找并显示同时出现在库KC1和库KC2中
的课程名KCM .
「解答」
将库KC1作为当前库,把库KC2的全部记录添加到KC1的尾部,再按课程名KCM进行索引,
这样可以按课程名不相同的分类集中在一起。?然后,再统计每一类课程名的数量TJ .
若TJ=2 ,则说明了该类课程名是同时出现在两个数据库中。
用命令MODIFY COMMAND P14?来建立程序文件P14.PRG ,参考程序如下:
SET TALK OFF
CLEAR
CLEAR ALL
USE KC1
APPEND FROM KC2
INDEX ON KCM TO KCMID
DO WHILE NOT EOF()
MKCM=KCM
COUNT TO TJ WHILE KCM=MKCM
IF TJ=2
?‘同时出现在KC1和KC2中的课程名有:’+ MKCM
ENDIF
ENDDO
USE
SET TALK ON
RETURN
8.现已存在两个数据库,职工收入数据库ZGR.DBF,其字段有:
GH (工号,字符型) ,?XM (姓名,字符型) ,?SR (收入,数值型)
纳税记录数据库ZGS.DBF,其字段有:
GH (工号,字符型) ,?SE (税额,数值型) ,?SJSR (实际净收入,数值型)
若征税标准规定如下:
SR≤1000?征税0 %
1000 SR≤2000?征税5 %
2000 SR≤3000?征税10 %
SR 3000?征税20 %
按下列要求编写程序文件P15.PRG ,?其功能是根据ZGR.DBF中收入SR及征税标准,
计算每个职工的税额SE和实际净收入SJSR ,然后相应填入ZGS.DBF中的SE和SJSR.
「解答」
在1号工作区中打开ZGR,根据征税标准,先计算出征税税率TAX.
在2号工作区中打开ZGS,?求出税额?SE=收入SR×税率TAX
净收入SJSR=收入SR-税额SE
由于该题在多库之间的操作,从当前工作区访问其它工作区打开的库文件中的某个字段时,要在
该字段名前加上前缀,?即:
别名- 字段名
因而
SE=ZGR- SR*TAX
SJSR=ZGR- SR-SE
在计算过程中,若库ZGR中记录在库ZGS中没有,则要添加。?若库ZGS中的记录在库ZGR
中没有,则SE和SJSR均为0.
用命令MODIFY COMMAND P15?来建立程序文件P15.PRG ,参考程序如下:
SET TALK OFF
CLEAR
SELECT B
USE ZGS
REPLACE ALL SE WITH 0
REPLACE ALL SJSR WITH 0
SELECT A
USE ZGR
DO WHILE NOT EOF()
DO CASE
CASE SR 3000
TAX=0.2
CASE SR 2000 AND SR =3000
TAX=0.1
CASE SR 1000 AND SR =2000
TAX=0.05
OTHERWISE
TAX=0
ENDCASE
SELECT B
LOCATE FOR GH=ZGR- GH
IF NOT FOUND()
APPEND BLANK
REPLACE GH WITH ZGR- GH
ENDIF
REPLACE SE WITH ZGR- SR*TAX
REPLACE SJSR WITH ZGR- SR-SE
SELECT A
SKIP
ENDDO
SELECT B
LIST
CLOSE ALL
SET TALK ON
RETURN
(一)创建数据库
1.按下列要求建立数据库ST1.DBF .
XH(C,6)?XM(C,8)?XB(C,2)?CS(D,8)?SJK(N,3)?GLXX(N,3)
200101?安潜光?男?82-08-25?70?90
200114?毛?皓?男?83-06-08?65?70
200118?冯岳阳?女?80-08-15?82?95
200205?戴晓霞?女?81-07-18?60?65
200218?闫安雪?男?83-05-08?80?88
(XH、XM、XB、CS、SJK、GLXX分别表示:学号、姓名、性别、出生日期、数据库、管理信息)
2.按下列要求编写命令文件P1.PRG .
①复制数据库ST1的结构,生成数据库ST2.
②复制数据库ST1的结构,生成数据库ST3,其中只含字段XM、GLXX及SJK.
③将数据库ST1复制成ST4.
④将数据库ST1中,满足80≤GLXX≤90的XM及GLXX复制成数据库ST5.
⑤将数据库ST1中1983年出生的男学生的记录复制成数据库ST6.
⑥将数据库ST1中学号最后二位为‘18’的记录复制成数据库ST7.
⑦将数据库ST1中姓名含有‘安’字的记录复制成数据库ST8.
「解答」
在COMMAND窗口中,输入命令:?MODIFY?COMMMAND?P1
然后,在编辑窗口中输入下列命令组。
USE ST1
COPY STRUCTURE TO ST2
COPY STRUCTURE TO ST3 FIELDS XM, GLXX, SJK
COPY TO ST4
COPY TO ST5 FIELDS XM, GLXX FOR GLXX =80 .AND. GLXX =90
COPY TO ST6 FOR SUBSTR(DTOC(CS),1,2)=‘83’。AND. XB=‘男’
COPY TO ST7 FOR SUBSTR(XH,5,2)=‘18’
COPY TO ST8 FOR‘安’$ XM
RETURN
最后,按Ctrl+W保存退出。
如果在COMMAND窗口中,先输入命令:
SET DE**UAL TO A:
设置当前驱动器为A .即可在A驱动器中建立文件P1.PRG.
如果数据库文件没有打开,要使用命令
COPY?FILE? 源文件名 ?TO? 目标文件名 来复制文件。
(二)窗口设计
1.按下列要求编制窗口设计模块程序文件P2.PRG .
①在位置(10,15)到(20,65)建立一个名为WINA,标题为‘显示记录’的窗口。
②在该窗口中,按下图所示的格式,逐条显示数据库ST1.DBF的记录信息。
(10,15)
显示记录?姓名:XXX?学?号:XXXXXX?性别:X?出生日期:XX-XX-XX
(20,65)
「解答」
用命令MODIFY COMMAND P2?来建立程序文件P2.PRG
先定义窗口的名字、大小、标题等,使用时要激活窗口,结束要释放窗口。
使用数据库先要打开,最后要关闭。
在窗口中按要求格式显示一条记录后,要用WAIT命令暂停一下,否则,后一条记录会覆盖
前一条记录。
参考程序如下:
SET TALK OFF
CLEAR
DEFINE WINDOW WINA FROM 10,15 TO 20,65 FONT 'T黑体',11 TITLE‘显示记录’
ACTIVATE WINDOW WINA
USE ST1
DO WHILE .NOT. EOF()
@2,2 SAY‘姓名:’+XM
@2,25 SAY‘学?号:’+XH
@4,2 SAY‘性别:’+XB
@4,25 SAY‘出生日期:’+DTOC(CS)
WAIT
SKIP
ENDDO
USE
RELEASE WINDOW WINA
SET TALK ON
RETURN
2.按下列要求编制程序文件P3.PRG .
①在位置(10,15)到(20,65)建立一个名为WINB,标题为‘姓名查询’的窗口。
②对数据库ST1.DBF的记录进行查看:先输入学号查找,若无此学号,再输入姓名查找记录。
找到了,则在窗口中按下图所示的格式显示该记录信息,否则显示‘查无此学生’。
(10,15)
姓名查询?姓?名:XXX?出生日期:XX-XX-XX?数据库:XX?管理信息:XX
(20,65)
「解答」
用命令MODIFY COMMAND P3?来建立程序文件P3.PRG.
查找是从大量记录中找出满足条件的记录,把记录指针定位在要查找的记录上。
查找有两种方式:顺序查询和索引查询。
题中按学号查找是采用顺序查询,命令为?LOCATE.?
按姓名查找是采用索引查询,它必须在姓名XM为关键字段进行索引的基础上进行,程序中
使用了命令:
FIND? STXM?
或?SEEK?STXM .?
可以通过FOUND()或EOF()函数来判断是否查到记录。
查到时,记录指针总是指向第一个满足条件的记录,此时FOUND()函数为真, EOF()函数为假。
未找到,记录指针指向库文件尾部, FOUND()函数为假, EOF()函数为真。
参考程序如下:
SET TALK OFF
CLEAR
DEFINE WINDOW WINB FROM 10,15 TO 20,65 FONT 'T黑体',11 TITLE‘姓名查询’
ACTIVATE WINDOW WINB
USE ST1
ACCEPT‘请输入学号’TO STXH
LOCATE FOR XH=STXH
IF .NOT. EOF()
CLEAR
@2,2 SAY‘姓?名:’+XM
@2,25 SAY‘出生日期:’+DTOC(CS)
@4,2 SAY‘数据库:’+STR(SJK,3)
@4,25 SAY‘管理信息:’+STR(GLXX,3)
ELSE
?‘无此学号’
ACCEPT‘请输入姓名’TO STXM
INDEX ON XM TO STID
FIND STXM
IF .NOT. EOF()
CLEAR
@2,2 SAY‘姓?名:’+XM
@2,25 SAY‘出生日期:’+DTOC(CS)
@4,2 SAY‘数据库:’+STR(SJK,3)
@4,25 SAY‘管理信息:’+STR(GLXX,3)
ELSE
?‘查无此学生’
ENDIF
ENDIF
?
WAIT
USE
RELEASE WINDOW WINB
SET TALK ON
RETURN
(三)屏幕设计
1.利用屏幕生成器,设计一个如下图所示的屏幕文件P4.SPR .
屏幕要求:标题——‘欢迎’
文本‘欢迎你参加自学考试’——字体为隶书,字号为22,颜色为红色
进入按钮——功能设定为执行命令:?WAIT WINDOW?‘该功能进入系统’
退出按钮——功能设定为退至FOXPRO主窗口?
「解答」
操作要点如下:
①打开屏幕设计窗口
用命令CREATE SCREEN P4,或系统菜单File / New / Screen,单击New,打开屏幕生成器窗口。
②设计屏幕
单击文本工具?创建文本对象?‘欢迎你参加自学考试’
Object / Font?设置字体,字号
Object / Pen Color?设置颜色
Screen / Layout / Title?设置标题?欢迎
单击命令按钮工具?设置‘进入’按钮
Push button Prompts:?进入
Variable…?JR
Valid…?WAIT WINDOW?‘该功能进入系统’
单击命令按钮工具?设置‘退出’按钮
Push button Prompts:?退出
Variable…?TC
Options:?选Terminate READ On Selection
③保存
File / Save?
保存,生成屏幕信息的数据库文件P4.SCX及屏幕信息的备注文件P4.SCT.
④生成屏幕程序
Program / Generate
在弹出的对话框中,选Options…,可以设置设计者的注释信息,如姓名、单位、地址、邮编等,
它们自动产生在屏幕程序的开头。最后,单击Generate ,生成屏幕程序文件P4.SPR.
⑤运行屏幕程序
DO P4.SPR?显示出题意所要求的屏幕程序文件P4.SPR.
2.利用屏幕生成器,设计一个如下图所示的逐条显示数据库ST1记录的屏幕文件P5.SPR .
屏幕要求:标?题——‘显示记录’
上一条按钮——功能为显示上一条记录
下一条按钮——功能为显示下一条记录
退出按钮——功能为退至FOXPRO主窗口
「解答」
操作要点如下:
①打开屏幕设计窗口
用命令CREATE SCREEN P5 ;或用系统菜单File / New / Screen,单击New,打开屏幕生成器窗口。
②设计屏幕
Screen / Layout / Title?设置标题?显示记录
单击文本工具?创建文本对象?姓名?
单击字段工具?设置字段对象?XM
Input…?ST1.XM
类似方法可设置文本对象:学号、管理信息、数据库;?字段对象XH、GLXX、SJK
单击画矩形工具?将上述对象围绕在矩形框内
单击命令按钮工具?设置上一条按钮
Push button Prompts:?上一条
Variable…?SYT
Valid…?输入下列代码:
IF .NOT. BOF()
SKIP–1
ELSE
GO BOTTOM
ENDIF
SHOW GETS
RETURN?
单击命令按钮工具?设置下一条按钮
Push button Prompts:?下一条
Variable…?XYT
Valid…?输入下列代码:
IF .NOT. EOF()
SKIP?
ELSE
GO TOP
ENDIF
SHOW GETS
RETURN?
(退出按钮的设置?同上机练习题(三) 1. )
③保存
File / Save?
保存,生成屏幕信息的数据库文件P5.SCX及屏幕信息的备注文件P5.SCT.
④生成屏幕程序
Program / Generate / Generate?
生成屏幕程序文件P5.SPR……
⑤运行屏幕程序
DO P5.SPR?
在窗口中按上(或下)一条按钮,可以向上(或下)逐条显示记录。
3.利用屏幕生成器,设计一个如下图所示的按出生日期查询数据库ST1记录的屏幕文件P6.SPR .
屏幕要求:标?题——‘按日期查询’
查询按钮——输入出生日期,查到了在屏幕中显示记录,否则显示白空
(类似地可以设计按姓名查询或按数据库分数查询的屏幕文件)
「解答」
操作要点如下:
①打开屏幕设计窗口
用命令CREATE SCREEN P6,或系统菜单File / New / Screen,单击New,打开屏幕生成器窗口。
②设计屏幕
Screen / Layout / Title?设置标题?按日期查询
单击文本工具?创建文本对象?姓名、学号、数据库、管理信息?
单击字段工具?设置字段对象?XM、XH、SJK、?GLXX
(设置方法同上机练习题(三) 2. )
单击画矩形工具?将上述对象围绕在矩形框内
单击文本工具?创建文本对象?输入出生日期
单击字段工具?在弹出的对话框中,设置一个日期型内存变量MCS
Input…?MCS
Format…?选取Date
(若按姓名查询,应选取Character )
(若按分数查询,应选取Numeric )
单击命令按钮工具?设置查询按钮
Push button Prompts:?查询
Variable…?CXCS
Valid…?输入下列代码
LOCATE FOR CS=MCS
SHOW GETS
RETURN
③保存?File / Save?
保存,生成屏幕信息的数据库文件P6.SCX及屏幕信息的备注文件P6.SCT.
④生成屏幕程序
Program / Generate / Generate?生成屏幕程序文件P6.SPR……
⑤运行屏幕程序?DO P6.SPR
在输入出生日期框中,输入欲查找的日期,单击查询按钮,显示查询结果。
(四)菜单设计
有一个学生信息管理系统,它的菜单选项及对应的模块程序(假设已存在)如下表所示:
菜单栏菜?单?项程序文件名
数据编辑追加记录ZJ.SPR
浏览记录LL.SPR
数据查询学号查询XH.SPR
姓名查询XM.SPR
退出系统返回到FOXPRO
返回到WINDOWS桌面
使用菜单生成器,生成学生信息管理系统的主菜单程序文件P7.MPR .
「解答」
操作要点如下:
①打开菜单设计窗口
用命令CREATE MENU P7 ;或系统菜单File / New / Menu,单击New,?打开菜单生成
器窗口。
②设计主菜单选项
在上图中, Menu Level框处显示Menu Bar,在此状态下设计主菜单选项。
Prompt框中依次输入主菜单选项‘数据编辑’、‘数据查询’和‘退出系统’
Result下拉列表框中依次选择Submenu?
③设计子菜单选项
在上图中,选中‘数据编辑’项,单击Create ,?此时, Menu Level框处显示‘数据编辑’,
在此状态下,设计‘数据编辑’菜单项的子菜单。
Prompt框中依次输入子菜单选项‘追加记录’及‘浏览记录’
Result?下拉列表框中依次选择Command
对‘追加记录’项,输入命令do ZJ.SPR,表示调用‘追加记录’的屏幕文件。
对‘浏览记录’项,输入命令do LL.SPR,表示调用‘浏览记录’的屏幕文件。
单击Menu Level的下拉列表,选择Menu Bar,返回上一层菜单,用同样方法可以设计‘数据
查询‘和’退出系统‘的子菜单选项。
子菜单选项‘返回到FOXPRO’, Result框中选择Procedure,单击Create,在对话框中输入命令:
CLEAR
MODIFY WINDOW SCREEN
SET SYSMENU TO DE**ULT
ACTIVATE WINDOW COMMAND
RETURN
子菜单选项‘返回到WINDOWS桌面’, Result框中选择Command,输入命令:
QUIT
④保存?File / Save
生成菜单信息的数据库文件P7.MNX及菜单信息的备注文件P7.MNT.
⑤生成菜单程序文件?Program / Generate?
在弹出的对话框中,?选择Comment Options…,?可以设置设计者的注释信息,如姓名、
单位、地址、邮编等,它们自动产生在菜单程序的开头。?最后,单击Generate ,生成菜单程序
文件P7.SPR.
⑥显示主菜单窗口?Do?P7.MPR
主菜单显示如下:
(五)数据管理模块程序设计
1.按下列要求编制模块程序文件P8.PRG .
①该模块的功能是在窗口中对数据库ST1统计数据。
②窗口位置为(5,10)到(12,60),窗口名为WIN ,标题为“统计记录”。
③将管理信息GLXX的成绩分为四档:
优秀(GLXX≥85)?良好(70≤GLXX 85)?及格(60≤GLXX 70)?不及格(GLXX 60)
统计各档成绩的人数,并在窗口中显示统计结果。
「解答」
在程序中用命令DIMENSION S(4)来定义一数组,存放统计GLXX四档成绩的人数。
用命令MODIFY COMMAND P8?来建立程序文件P8.PRG .
参考程序如下:
SET TALK OFF
CLEAR
DEFINE WINDOW WIN FROM 5,10 TO 12,60 FONT 'T黑体',11 TITLE '统计记录'
DIMENSION S(4)
STORE 0 TO S
USE ST1
DO WHILE .NOT.EOF()
DO CASE
CASE GLXX =85
S(1)=S(1)+1
CASE GLXX =70 .AND. GLXX 85
S(2)=S(2)+1
CASE GLXX =60 .AND. GLXX 70
S(3)=S(3)+1
CASE GLXX 60
S(4)=S(4)+1
ENDCASE
SKIP
ENDDO
ACTIVATE WINDOW WIN
@2,2 SAY '优秀:'+STR(S(1),3)+'人'
@2,25 SAY '良好:'+STR(S(2),3)+'人'
@4,2 SAY '及格:'+STR(S(3),3)+'人'
@4,25 SAY '不及格:'+STR(S(4),3)+'人'
WAIT WINDOW
USE
RELEASE WINDOW WIN
SET TALK ON
RETURN
2.按下列要求编写程序文件P9.PRG .
①屏幕提示“请输入密码”,输入时密码不显示,密码设为大写“GLXX”。
②若密码正确,执行打开数据库ST1,显示记录命令。
若密码不正确,显示“第几次密码错,请重新输入!”。
③如果密码已连续错三次,第四次输入再错,则退至WINDOWS桌面。
「解答」
首先,定义一个名为MMW的窗口,标题为‘密码窗口’,然后激活它。在输入密码之前,用命令
SET CONSOLE OFF
来屏蔽显示,起到保密效果。?输入密码之后,再恢复屏蔽显示。
密码保存在变量PSW中,函数UPPER(ALLTRIM(PSW))的作用,是将输入的密码,除去前后
空格后转换成大写字符。
输入密码的次数保存在变量N中。
用命令MODIFY COMMAND P9?来建立程序文件P9.PRG .
参考程序如下:
SET TALK OFF
CLEAR
CLEAR ALL
DEFINE WINDOW MMW FROM 10,5 TO 28,75 FONT 'T黑体',11 TITLE '密码窗口'
N=1
DO WHILE .T.
ACTIVATE WINDOW MMW
@2,5 SAY '请输入密码******'
SET CONSOLE OFF
ACCEPT TO PSW
SET CONSOLE ON
IF UPPER(ALLTRIM(PSW))=='GLXX'
CLEAR
USE ST1
LIST
WAIT WIND
USE
EXIT
ELSE
IF N =4
CLEAR
?'密码错误,退出!'
WAIT WIND
QUIT
ELSE
?
?'第'+STR(N,1)+'次密码错,请重新输入!'
WAIT WIND
N=N+1
ENDIF
ENDIF
ENDDO
RELEASE WINDOW MMW
SET TALK ON
RETURN
3.现已有(假设已存在)通讯信息数据库TX.DBF,其字段有:
XM (姓名,字符型) ,?DH (电话,字符型) ,?DZ (地址,字符型)
按下列要求编写程序文件P10.PRG .
①用格式化输入语句接收一个用户姓名,在TX中进行查找记录。
②若找到,则显示该用户记录,?找不到,则显示“查无此用户”。
③重复上述过程,直到接收的字符为“8888”时,结束程序的运行。
「解答」
现在假设数据库TX.DBF已经存在的前提之下来编写程序,在调试程序时,可以创建数据库,
并模拟输入一些记录来进行调试
程序中使用循环语句DO WHILE来实现连续查找,逻辑变量FL作为循环的条件,其初值为。T. ,
一旦输入字符为‘8888’时,则将变量FL置为。F. ,或者用命令EXIT退出循环,结束程序的运行。
用命令MODIFY COMMAND P10?来建立程序文件P10.PRG ,参考程序如下:
SET TALK OFF
CLEAR
CLEAR ALL
USE TX
FL=.T.
DO WHILE FL
CLEAR
MXM=SPACE(6)
@10,10 SAY '请输入姓名' GET MXM
READ
IF FL=(ALLTRIM(MXM)='8888')
EXIT
ENDIF
LOCATE FOR XM=MXM
IF FOUND()=.T.
DISPLAY
ELSE
? '查无此人'
ENDIF
WAIT
ENDDO
USE
SET TALK ON
RETURN
4.现已有商品信息数据库SP.DBF,其字段有:
SH (商品代号,字符型) ,?SM (商品名称,字符型) ,?GG (规格,字符型)
按下列要求编写程序文件P11.PRG ,?其功能是查找显示出同一商品名称有两种以上规格
的SM.
「解答」
设置变量TJSM为同一商品名称的不同规格的种类数。
先对商品名称字段SM进行索引,将商品名称按不相同的分类集中在一起,?然后再统计每
一类商品名称有多少种规格。
在统计中,先将每类的商品名称SM赋给内存变量MSM,暂时保存,利用命令
COUNT TO TJSM WHILE SM=MSM
统计该类中各种规格数,并赋给变量TJSM.?当TJSM =2时,即题意中所要查找的商品名称。
条件子句WHILE SM=MSM的作用是:从当前记录开始,直到不满足条件的记录为止,对所
有已满足条件的记录进行统计,实质上就是起到统计每一类商品名称的各种规格数的条件。
用命令MODIFY COMMAND P11?来建立程序文件P11.PRG ,参考程序如下:
SET TALK OFF
CLEAR
CLEAR ALL
TJSM=0
USE SP
INDEX ON SM TO SPID
DO WHILE NOT EOF()
MSM=SM
COUNT TO TJSM WHILE SM=MSM
IF TJSM =2
? '两种以上规格的商品名称有: '+ MSM
ENDIF
ENDDO
USE
SET TALK ON
RETURN
5.现已存在两个数据库,学生信息数据库ST.DBF,其字段有:
XH (学号,字符型) ,?XM (姓名,字符型) ,?ZL (专业,字符型)
成绩数据库KCCJ.DBF,其字段有:
XH (学号,字符型) ,?KCM (课程名,字符型) ,?CJ (成绩,数值型)
按下列要求编写程序文件P12.PRG ,其功能是统计每个学生各门课程的平均成绩PCJ,
并在屏幕中按下列格式输出:
学号?姓名?平均成绩
XXXX?XXX?XX.X
「解答」
该题涉及到两个数据库之间的操作,一般情况下,要进行关联操作。其目的是将两个在不同工作
区中打开的库文件联系起来,以便当一个关联库文件的记录指针移动时,与之被关联库文件的记录
指针也随之相应移动。
建立关联的方式可以通过索引关键字。
建立关联的条件是两个数据库需在不同工作区中打开,?且被关联库文件需要按关联字段进行
索引。
关联的命令为
SET?RELATION?TO?关联字段名?INTO?被关联库名
在程序中, 1号工作区中打开关联库文件ST , 2号工作区中打开被关联库文件KCCJ,按关联
字段XH建立关联。
每个学号XH所对应的学生,?可以选读多门课程。?从ST的第一个记录的XH数值开始,
在KCCJ中统计出该XH所对应的各门课程的平均成绩PCJ,并按照要求格式输出。
依次循环,即可统计出每个学生各门课程的平均成绩。
由于该题在多库之间的操作,从当前工作区访问其它工作区打开的库文件中的某个字段时,
要在该字段名前加上前缀,?即:
别名- 字段名
或?别名。字段名
打开数据库时,若没有指定别名,则别名与库文件同名。?因此,如果当前2号工作区中打开的
是KCCJ,则XH是库KCCJ中的学号,而ST- XH是另一工作区库ST中的学号。
用命令MODIFY COMMAND P12?来建立程序文件P12.PRG ,参考程序如下:
SET TALK OFF
CLEAR
CLEAR ALL
SELECT B
PCJ=0
USE KCCJ
INDEX ON XH TO KCCJID
SELECT A
USE ST
? '学号'+SPACE(4)+'姓名'+SPACE(4)+'平均成绩'
SET RELATION TO XH INTO KCCJ
SCAN
SELECT KCCJ
AVERAGE CJ TO PCJ WHILE XH=ST- XH
SELECT ST
? XH+SPACE(4)+XM+SPACE(4)+STR(PCJ,3)
ENDSCAN
SET RELATION TO
CLOSE ALL
SET TALK ON
RETURN
6.现已存在两个数据库,学生信息数据库ST.DBF,其字段有:
XH (学号,字符型) ,?XM (姓名,字符型) ,?DZ (地址,字符型)
成绩数据库CJ.DBF,其字段有:
XH (学号,字符型) , SJK (数据库,数值型) , GLXX (管理信息,数值型)
按下列要求编写程序文件P13.PRG ,?其功能是从键盘输入一姓名,?在ST.DBF和CJ.DBF
中查找该学生的成绩,
若找不到,则显示“查无此学生”。
若查找到,则在屏幕中按下列格式显示该学生的成绩:
学号?姓名?数据库?管理信息
XXXX?XXX?XX?XX
「解答」
将库ST作为当前库,学号XH作为主键,输入被查找的学生姓名,保存在变量MXM中。
在库ST中进行查找,当找到时,将用该学生的学号XH再次作为查找对象,在库CJ中,
对外部键XH查找所对应的记录,这样就可以在库CJ中查到了该学生的SJK及GLXX成绩。
用命令MODIFY COMMAND P13?来建立程序文件P13.PRG ,参考程序如下:
SET TALK OFF
CLEAR
CLEAR ALL
SELECT A
USE ST
ACCEPT '请输入姓名' TO MXM
LOCATE FOR XM=ALLTRIM(MXM)
IF FOUND()
SELECT B
USE CJ
LOCATE FOR XH=ST- XH
SELECT A
? '学号'+SPACE(4)+'姓名'+SPACE(4)+'数据库'+SPACE(4)+'管理信息'
? XH+SPACE(4)+XM+SPACE(4)+STR(CJ- SJK,3)+SPACE(4)+STR(CJ- GLXX,3)
ELSE
? '查无此人'
ENDIF
CLOSE ALL
SET TALK ON
RETURN
当然,如果按主键XH将ST与CJ进行关联,只需将上述程序修改一下即可,参考程序如下:
SET TALK OFF
CLEAR
CLEAR ALL
SELECT B
USE CJ
INDEX ON XH TO CJID
SELECT A
USE ST
SET RELATION TO XH INTO CJ
ACCEPT '请输入姓名' TO MXM
LOCATE FOR XM=ALLTRIM(MXM)
IF FOUND()
? '学号'+SPACE(4)+'姓名'+SPACE(4)+'数据库'+SPACE(4)+'管理信息'
? XH+SPACE(4)+XM+SPACE(4)+STR(CJ- SJK,3)+SPACE(4)+STR(CJ- GLXX,3)
ELSE
? '查无此人'
ENDIF
SET RELATION TO
CLOSE ALL
SET TALK ON
RETURN
7.现已存在两个课程数据库KC1.DBF和KC2.DBF?(内容不完全相同) ,它们具有相同的结构,
其字段有:?KCM (课程名,字符型) ,?XS (学时数,数值型) ,?ZL (专业,字符型)
按下列要求编写程序文件P14.PRG,其功能为查找并显示同时出现在库KC1和库KC2中
的课程名KCM .
「解答」
将库KC1作为当前库,把库KC2的全部记录添加到KC1的尾部,再按课程名KCM进行索引,
这样可以按课程名不相同的分类集中在一起。?然后,再统计每一类课程名的数量TJ .
若TJ=2 ,则说明了该类课程名是同时出现在两个数据库中。
用命令MODIFY COMMAND P14?来建立程序文件P14.PRG ,参考程序如下:
SET TALK OFF
CLEAR
CLEAR ALL
USE KC1
APPEND FROM KC2
INDEX ON KCM TO KCMID
DO WHILE NOT EOF()
MKCM=KCM
COUNT TO TJ WHILE KCM=MKCM
IF TJ=2
?‘同时出现在KC1和KC2中的课程名有:’+ MKCM
ENDIF
ENDDO
USE
SET TALK ON
RETURN
8.现已存在两个数据库,职工收入数据库ZGR.DBF,其字段有:
GH (工号,字符型) ,?XM (姓名,字符型) ,?SR (收入,数值型)
纳税记录数据库ZGS.DBF,其字段有:
GH (工号,字符型) ,?SE (税额,数值型) ,?SJSR (实际净收入,数值型)
若征税标准规定如下:
SR≤1000?征税0 %
1000 SR≤2000?征税5 %
2000 SR≤3000?征税10 %
SR 3000?征税20 %
按下列要求编写程序文件P15.PRG ,?其功能是根据ZGR.DBF中收入SR及征税标准,
计算每个职工的税额SE和实际净收入SJSR ,然后相应填入ZGS.DBF中的SE和SJSR.
「解答」
在1号工作区中打开ZGR,根据征税标准,先计算出征税税率TAX.
在2号工作区中打开ZGS,?求出税额?SE=收入SR×税率TAX
净收入SJSR=收入SR-税额SE
由于该题在多库之间的操作,从当前工作区访问其它工作区打开的库文件中的某个字段时,要在
该字段名前加上前缀,?即:
别名- 字段名
因而
SE=ZGR- SR*TAX
SJSR=ZGR- SR-SE
在计算过程中,若库ZGR中记录在库ZGS中没有,则要添加。?若库ZGS中的记录在库ZGR
中没有,则SE和SJSR均为0.
用命令MODIFY COMMAND P15?来建立程序文件P15.PRG ,参考程序如下:
SET TALK OFF
CLEAR
SELECT B
USE ZGS
REPLACE ALL SE WITH 0
REPLACE ALL SJSR WITH 0
SELECT A
USE ZGR
DO WHILE NOT EOF()
DO CASE
CASE SR 3000
TAX=0.2
CASE SR 2000 AND SR =3000
TAX=0.1
CASE SR 1000 AND SR =2000
TAX=0.05
OTHERWISE
TAX=0
ENDCASE
SELECT B
LOCATE FOR GH=ZGR- GH
IF NOT FOUND()
APPEND BLANK
REPLACE GH WITH ZGR- GH
ENDIF
REPLACE SE WITH ZGR- SR*TAX
REPLACE SJSR WITH ZGR- SR-SE
SELECT A
SKIP
ENDDO
SELECT B
LIST
CLOSE ALL
SET TALK ON
RETURN