例1:德国数学家:【哥德巴赫猜想】的验证。
任一大于或等于6的偶数,总可分解为两个素数(质数)之和。
要求键盘输入一个不小于6的偶数N,然后输出6--N之间的这些哥德巴赫关系式:6=3+3,8=3+5,.....(每行输出一个式子)。
素数=质数,判断素数的方法:用3与该数的平方根之间的所有奇数去除这个数,均不能被整除者,即为素数。
SET TALK OFF
CLEAR
N=6
@3,5 SAY 'N=?' GET N VALID N>=6.AND.MOD(N,2)=0
READ
I=6
DO WHILE I<=N
A=3
DO WHILE A<I
B=3
TA=.T.
DO WHILE B<=SQRT(A)
IF MOD(A,B)=0
TA=.F.
EXIT
ENDIF
B=B+2
ENDDO
IF TA
C=I-A
D=3
TC=.T.
DO WHILE D<=SQRT(C)
IF MOD(C,D)=0
TC=.F.
EXIT
ENDIF
D=D+2
ENDDO
IF TC
?LTRIM(STR(I))+"="+LTRIM(STR(A))+"+"+LTRIM(STR(C))
EXIT
ENDIF
ENDIF
A=A+2
ENDDO
I=I+2
ENDDO
SET TALK OFF
RETURN
例2:把一个两位的素数接到另外一个两位的素数后,得到一个四位数,而这个四位数可以被这两个素数之和的一半整除,求出所有这样的素数对。(两个素数不应相同). 运行结果:53,13,47,19,43,23,37,29
SET TALK OFF
I=9
DO WHILE I<99
I=I+2
TI=.F.
L=3
DO WHILE L<=SQRT(I)
IF MOD(I,L)=0
TI=.T.
EXIT
ENDIF
L=L+2
ENDDO
IF TI
LOOP
ENDIF
J=11
DO WHILE J<99
J=J+2
IF J=I.OR.I-J>0 && 过滤相同数或对称的反序数对
LOOP
ENDIF
TJ=.F.
L=3
DO WHILE L<=SQRT(J)
IF MOD(J,L)=0
TJ=.T.
EXIT
ENDIF
L=L+2
ENDDO
IF TJ
LOOP
ENDIF
S4=J*100+I
IF MOD(S4,(I+J)/2)=0
?I,J
ENDIF
ENDDO
ENDDO
SET TALK ON
RETURN
例3: (1)一框鸡蛋,每次取2、3、4、5、6个时分别剩下一个,每次取7个时不剩。问这框鸡蛋至少有多少个?
(2)一座七层宝塔,自上而下,每一层的灯都是上面一层灯的2倍,共有381盏灯。问每一层各有多少盏灯?
SET TALK OFF
SET DECI TO 0
clear
I=7
DO WHILE .T.
IF MOD(I,2)=1.AND.MOD(I,3)=1.AND.MOD(I,4)=1
IF MOD(I,5)=1.AND.MOD(I,6)=1.AND.MOD(I,7)=0
? "这框鸡蛋个数至少为:",I
EXIT
ENDIF
ENDIF
I=I+1
ENDDO
?
DIMENSION B(7)
I=1
DO WHILE .T.
S=0
J=1
DO WHILE J<=7
B(J)=I*2^(J-1)
S=S+B(J)
J=J+1
ENDDO
IF S=381
EXIT
ENDIF
I=I+1
ENDDO
?"这个宝塔各层的灯盏数分别为:"
J=1
DO WHILE J<=7
?B(J)
J=J+1
ENDDO
SET DECI TO 2
SET TALK ON
RETURN
例4: 从小到大找出5个素数,使后面的数都比前面的数大12。
SET TALK OFF
I=1
DO WHILE .T.
I=I+2 && 从3开始产生奇数
L=3
TI=.F.
DO WHILE L<=SQRT(I)
IF MOD(I,L)=0
TI=.T.
EXIT
ENDIF
L=L+2
ENDDO 检验当前的I是否为素数
IF TI
LOOP
ENDIF
K=I && 这个I已是素数
J=1
DO WHILE J<=4
K=K+12 && 检验后面4个数是否为素数
L=3
TK=.F.
DO WHILE L<=SQRT(K)
IF MOD(K,L)=0
TK=.T.
EXIT
ENDIF
L=L+2
ENDDO
IF TK
EXIT
ENDIF
J=J+1
ENDDO
IF J>4 &&若J<=4,则必是中途退出循环的,不符合题意
? I,I+12,I+12*2,I+12*3,I+12*4
**** 这5个素数后比前均相差12 ***
EXIT
ENDIF
ENDDO
SET TALK ON
RETURN
例5: XT1.PRG 字符塔
本题要求从屏幕顶部中间往下以▲画字符塔(字符填充),由键盘输入确定塔的层数(字符▲个数),第1个▲画2层,往下层数递增,塔限23层,另外要求每个▲自顶向下每层分别以 A,B,C...字符填充。
请分别用两种方法编程运行(必须有递归调用法)。注: ASC("A")=65。颜色方面要求:各层塔颜色不同。
如第一层: A
BBB
SET TALK OFF
SET SCOR OFF
SET STAT OFF
SET PROC TO XT1
SET COLOR TO W+/GB+
CLEAR
N=1
@3,10 SAY '字符塔层数(≤23)=' GET N PICT '99' RANGE 1,23
READ
CLEAR
DO XX WITH N
WAIT ''
CLOSE PROCEDURE
SET COLOR TO
SET SCOR ON
SET STAT ON
SET TALK ON
RETURN
PROCEDURE XX
PARAMETERS N
IF N>1
DO XX WITH N-1 && 递归调用
ENDIF
C=STR(N+3,2)
SET COLOR TO &C./GB+
I=1
DO WHILE I<=N+1
? SPACE(40-I)+REPL(CHR(64+I),2*I-1)
I=I+1
ENDDO
RETURN
例6: 计算各代数式的值。
a. 2+(2+4)+(2+4+6)+……(2+4+……+100)=?
b. 1!+(1!+3!)+(1!+3!+5!)+……(1!+3!+……9!)=?
c. e≈1+1/1!+1/2!+1/3!+……1/N!+……(精确到1/N!<0.00001为止,近似到小数点后第4位)
3·1! 32·2! 33·3! 310·10!
d.───+ ──── + ──── +…… ────────
1 1·3 1·3·5 1·3·5……·19
e. 3+33+333+……+33333333=?
*XT3.PRG
SET TALK OFF
CLEAR
STORE 0 TO X,S
N=2
DO WHILE N<=100
X=X+N
S=S+X
N=N+2
ENDDO
?"A. 2+(2+4)+(2+4+6)+...+(2+4+..+100)=",S
STORE 0 TO X,S
N=1
DO WHILE N<=9
STORE 1 TO M,L
DO WHILE L<=N
M=M*L
L=L+1
ENDDO && 求: N!
X=X+M
S=S+X
N=N+2
ENDDO
?"B. 1!+(1!+3!)+...+(1!+3!+5!+...+9!)=",S
E=2
STORE 1 TO M,N
DO WHILE .T.
N=N+1
M=M*N
E=E+1/M
IF 1/M<0.00001
EXIT
ENDIF
ENDDO
?"C. e≈"+STR(E,6,4)
STORE 1 TO I,J,M
S=0
DO WHILE I<=10
M=M*I && 求N!
J=J*(2*I-1) && 求分母积
S=S+3^I*M/J && 求单项式和
I=I+1
ENDDO
?"D. S=",S
S=0
M="3"
I=1
DO WHILE I<=8
S=S+VAL(M)
M=M+"3"
I=I+1
ENDDO
?"E. 3+33+333+...+33333333=",INT(S)
SET TALK ON
RETURN
例7:ZD.DBF
(库名称:C/12,
FIELD_NAME:C/10,FIELD_TYPE:C/1,FIELD_LEN:N/3,
FIELD_DEC:N/3)
ZG.DBF(职工号C/6,,姓名C/8,基本工资N/6.2,奖金N/6.2,津贴N/6.2,实发工资N/6.2)
bsh.dbf(考号C/6,笔试N/3)
shj.dbf(考号C/6,上机N/3)
系统中已有三个库文件zg.dbf、bsh.dbf、shj.dbf,另有数据字典库zd.dbf,请编写程序PROG1.PRG,在程序中先用ZAP命令把字典库记录删除,然后提示并接受用户输入数据库名,将库文件的全名及所有字段描述存放在数据字典库中。(注:可通过结构文件完成)
*PROG1.PRG
SET TALK OFF
SET SAFE OFF
SELECT 1
USE ZD
ZAP
CLEAR
I=1
DO WHILE I<=3
ACCEPT '输入库文件名:' TO NAME
NAME=UPPER(NAME)
NAME=IIF('.DBF'$NAME,NAME,NAME+'.DBF')
SELECT 2
USE &NAME
COPY TO AAA STRUCTURE EXTENDED
SELECT 1
APPEND FROM AAA
REPLACE 库名称 WITH NAME FOR 库名称=SPACE(12)
I=I+1
ENDDO
SELECT 1
DISPLAY ALL
CLOSE DATABASE
SET TALK ON
SET SAFE ON
RETURN
例8: XT5.PRG
a.一个四位数,已知它的个位数比十位数大1,百位数比十位数小2, 把这四位数各位上的数字前后次序颠倒, 所得到的新四位数与原四位数相加的和为10109,求原数。
b.有甲、乙两堆棋子,甲堆比乙堆多。 从甲堆取出与乙堆中一样多的模子放入乙堆中,然后从乙堆中取出与甲堆中所剩的棋子一样多的棋子放入甲堆中,这时甲堆有18个棋子,乙堆中有24个棋子,问甲、乙两堆原有多少个棋子?
c.一百个连续正整数相加,其和小于10100,求这些连续正整数之和中最大的一个,并打印出一百个数中的前四个数个最后一个数。
d.我国工业产值分别以6%、8%、10%、12%的增长率递增,翻两番需要多少年?
e.通过键盘输入若干个数,将其最大的最小的数打印出来。
f.打印出斐波纳契列前20个数,并计算它们的和。这个数列的特点是:第一个数为0,第二个数为1,第三个数是前二个数之和,以后的每个数都是它前面两个数之和,即:0,1,1,2,3,5,8,13……。
* XT5.PRG
SET TALK OFF
?"A 题:"
A=1
DO WHILE A<=9 && 千位数
B=0
DO WHILE B<=6
C=B+2
D=C+1
IF (A*1000+B*100+C*10+D)+(D*1000+C*100+B*10+A)=10109
?"这个数=",A*1000+B*100+C*10+D
ENDIF
B=B+1
ENDDO
A=A+1
ENDDO
?
WAIT
?
CLEAR ALL
?"B题:"
X=41
Y=1
DO WHILE X>Y
Y=42-X
MX=X-Y
MY=Y+Y
MY=MY-MX
MX=MX+MX
MX=MX-MY
MY=MY+MY
IF MX=14.AND.MY=28.AND.X+Y=42
?"甲堆有棋子数=",X
?"乙堆有棋子数=",Y
ENDIF
X=X-1
ENDDO
?
WAIT
?
CLEAR ALL
?"C题:"
STORE 0 TO S,I
DO WHILE I<=10000
I=I+1
S=0
J=I
DO WHILE J<I+100
S=S+J
J=J+1
ENDDO
IF S>=10100
EXIT
ENDIF
ENDDO
I=I-1
?"这100个数中前4个数是:",I,I+1,I+2,I+3
?"最后一个数是:",I+99
CLEAR ALL
?
WAIT
?
?"D题:"
S=1
N=0.06
I=0
DO WHILE S<=2
S=S*(1+N)
N=N+0.02
I=I+1
ENDDO
?"翻两翻需要年数为:",STR(I,2)
CLEAR ALL
?
WAIT
?
?"E题:"
I=1
DO WHILE .T.
CLEAR
N=0
@5,1 SAY "请输入第"+STR(I,2)+"个数:" GET N
READ
IF I<10
D=STR(I,1)
ELSE
D=STR(I,2)
ENDIF
X&D=N && 构造数组X(n)
IF I>=2
WAIT "继续输入下一个数吗(Y/N)?" TO YN
IF UPPER(YN)<>"Y"
EXIT
ENDIF
ENDIF
I=I+1
ENDDO
MAX=X1 && 假定最大数
MIN=X2 && 假定最小数
J=1
CLEAR
?"你输入的"+STR(I,2)+"个数是:"
DO WHILE J<=I
IF J<10
D=STR(J,1)
ELSE
D=STR(J,2)
ENDIF
?? X&D
IF X&D>MAX
MAX=X&D
ENDIF
IF X&D<MIN
MIN=X&D
ENDIF
J=J+1
ENDDO
?
?"最大数:",MAX,"最小数:",MIN
CLEAR ALL
?
WAIT
?
?"F题:“斐波纳契数列”问题"
?
STORE 0 TO A1,S
A2=1
??"这20个数是:",A1,A2
S=A1+A2
I=3
DO WHILE I<=20
A3=A1+A2
?? A3
S=S+A3
A1=A2
A2=A3
I=I+1
ENDDO
?
?"其和是:",S
SET TALK ON
RETURN
例9: 设有如下数据库文件:
仓库(仓库号C(4),城市C(8),面积N(4))
职工(仓库号C(4),职工号C(4),工资N(4))
PJGZ.DBF 城市(C/8),平均工资(N/7.2),平均面积(N/7.2)
请编写程序PROG1.PRG文件,计算出每个城市职工的平均工资,每个城市仓库的平均面积,并按城市的升序排列追加在PJGZ.DBF 库中, PJGZ.DBF中每个城市只有一条记录。
*02FOX1.PRG 这里提供两种解法供参考.
SET TALK OFF
SET SAFE OFF
clear
@5,5
wait '请选择:1、解法1 2、解法2: ' to ll
?
do case
case ll<>'2' && 第一种解法
SELECT 3
USE PJGZ
ZAP
SELECT 2
USE 仓库
INDEX ON 城市 TO CSH UNIQUE && 按城市唯一索引
CSF=''
N=0
DO WHILE .NOT.EOF()
N=N+1
CSF=CSF+城市
SKIP
ENDDO 统计城市个数
INDEX ON 仓库号 TO CKH
SELECT 1
USE 职工
SET RELATION TO 仓库号 INTO B
I=1
DO WHILE I<=N
CC=SUBSTR(CSF,4*I-3,4)
AVERAGE 工资 TO PJ FOR B->城市=CC
SELECT 2
AVERAGE 面积 TO S FOR 城市=CC
SELECT 3
APPEND BLANK
REPLACE 城市 WITH CC,平均工资 WITH PJ,平均面积 WITH S
I=I+1
SELECT 1
ENDDO
SELECT 3
case ll='2'&& 第二种解法
SELECT 4
USE PJGZ
ZAP
SELECT 1
USE 仓库
INDEX ON 城市 TO CSH
TOTAL ON 城市 TO CK && 按城市名汇总
INDEX ON 仓库号 TO CKH
SELECT 2
USE 职工
SET RELATION TO 仓库号 INTO A && 按仓库号建立关联-逻辑连接
SELECT 3
USE CK
DO WHILE .NOT.EOF()
SELECT 2
AVERAGE 工资 TO PJ FOR A->城市=C->城市
SELECT 1
AVERAGE 面积 TO S FOR 城市=C->城市
SELECT 4
APPEND BLANK
REPLACE 城市 WITH C->城市,平均工资 WITH PJ,平均面积 WITH S
SELECT 3
SKIP
ENDDO
SELECT 4
endcase
LIST
CLOSE DATABASE
SET SAFE ON
SET TALK ON
RETURN
例10: XT2.PRG 字符山
本题要求从18行左边起往右以▲画字符山,▲的个数由键盘输入确定,第一个▲画2层,往后层数递增,限8座山。各个▲在同一水平线上. 另外要求每个▲自上而下每层分别以 A,B,C...字符填充。ASC("A")=65
* XT2.PRG
SET TALK OFF
SET COLOR TO W+/BG+
CLEAR
N=1
@5,5 SAY '▲个数=?(1--8)' GET N PICT '9' RANGE 1,8
READ
CLEAR
L=1
DO WHILE L<=N
C=STR(L,2)
SET COLOR TO &C./BG+
I=1
DO WHILE I<=L+1
J=1
DO WHILE J<=2*I-1
@17-L+I,(L*L+(L-1)-I)+J SAY CHR(64+I)
J=J+1
ENDDO
I=I+1
ENDDO
例11:现有医院管理数据库系统,包括三个dbf文件:
YISHENG.DBF(医生)具体记录请打开观察(下同)
职工号(N/4),姓名(C/8),职称(C/8),部门(C/6),年龄(N/2)
YAO.DBF(药品)
药编号(N/4),药名(C/10),单位(C/2),单价(N/5,1),生产厂(C/10)
CHUFANG.DBF(处方)
药编号(N/4),数量(N/2),日期(D),职工号(N/4),处方号(N/4)
请编写符合下列要求的应用程序PROG1.PRG文件:
查询职称为"主任医师"的姓名、职称,所开处方的处方号、药名、单价、生产厂,并统计他们用药的种类,然后把查询结果按处方号升序排序存入JG1数据库中。
JG1的结构为:姓名,职称,处方号,药名,单价,生产厂。
再在JG1中增加一条记录,把统计出的用药种类填入该记录的药名字段中(注意:统计的结果与药名的数据类型不同;统计数不包括重复药名。如果使用唯一索引做统计,结果中应恢复原有记录)。
*PROG1.PRG
SET TALK OFF
SET SAFE OFF
SELE 4
USE JG1
ZAP
COPY TO AAA
USE AAA
SELE 1
USE YISHENG
SELECT 2
USE CHUFANG
SELECT 3
USE YAO
INDEX ON 药编号 TO YAOBH
SELECT 2
SET RELA TO 药编号 INTO C
SELECT 1
LOCATE ALL FOR 职称='主任医师'
DO WHILE .NOT.EOF()
SELECT 2
LOCATE ALL FOR 职工号= A->职工号
DO WHILE .NOT.EOF()
SELECT 4
APPEND BLANK
REPL 姓名 WITH A->姓名,职称 WITH A->职称,处方号 WITH B->处方号
REPL 药名 WITH C->药名,单价 WITH C->单价,生产厂 WITH C->生产厂
SELE 2
CONTINUE
ENDDO
SELECT 1
CONTINUE
ENDDO
SELECT 4
SORT ON 处方号/A TO JG1
USE JG1
INDEX ON 药名 TO YM UNIQUE
COUNT TO N
SET INDEX TO
APPEND BLANK
REPL 药名 WITH STR(N,4),姓名 WITH '药名种数'
LIST
CLOSE DATABASE
SET TALK ON
SET SAFE ON
RETURN
例12: (数据库同例11)
请编写符合下列要求的应用程序PROG2.PRG
查询由部门为"内科"的医生姓名、部门及他们所开处方的处方号、药名、单价、数量,并计算所有处方的总价格,并把结果按处方号的升序排序存入JG2数据库中,JG2的结构为:(姓名,部门,处方号,药名,单价,数量)。再在JG2中增加一条记录,把计算出的总价格填入该记录的单价字段中。
* PROG2.PRG
set talk off
set safe off
select 4
use jg2
zap
copy to aaa
use aaa
select 1
use yisheng
select 2
use yao
index on 药编号 to ybh
select 3
use chufang
set rela to 药编号 into b
select 1
locate for 部门='内科'
do while found()
select 3
locate for 职工号=A->职工号
do while found()
select 4
append blank
replace 姓名 with A->姓名,部门 WITH A->部门
REPLACE 处方号 WITH C->处方号,药名 WITH B->药名
REPLACE 单价 WITH B->单价,数量 WITH C->数量
select 3
continue
enddo
select 1
continue
enddo
select 4
sort on 处方号/A to jg2
use jg2
sum 单价*数量 TO X
append blank
replace 单价 WITH X,姓名 WITH "总价格"
list
close database
set talk on
set safe on
例13: (数据库同例11)
请编写符合下列要求的应用程序PROG3.PRG:
查询由年龄小于35岁医生的姓名、年龄,及他们所开处方的处方号、药名、单价、生产厂,并统计他们使用了几个制药厂的药品,并把查询结果按处方号升序排序存入JG3数据库中,JG3的结构为:姓名,年龄,处方号,药名,单价,生产厂。
再在JG3中增加一条记录,把统计出的制药厂个数填入该记录的生产厂字段中(注意:统计结果与生产厂字段的数据类型不同;统计数不包括重复厂名。如果使用唯一索引做统计,结果中应恢复原有记录)。
*PROG3.PRG
SET TALK OFF
SET SAFE OFF
SELE 4
USE JG3
ZAP
COPY TO AAA
USE AAA
SELE 1
USE YISHENG
SELECT 2
USE CHUFANG
SELECT 3
USE YAO
INDEX ON 药编号 TO YAOBH
SELECT 2
SET RELA TO 药编号 INTO C
SELECT 1
LOCATE ALL FOR 年龄<35
DO WHILE .NOT.EOF()
SELECT 2
LOCATE ALL FOR 职工号= A->职工号
DO WHILE .NOT.EOF()
SELECT 4
APPEND BLANK
REPL 姓名 WITH A->姓名,年龄 WITH A->年龄,处方号 WITH B->处方号
REPL 药名 WITH C->药名,单价 WITH C->单价,生产厂 WITH C->生产厂
SELE 2
CONTINUE
ENDDO
SELECT 1
CONTINUE
ENDDO
SELECT 4
SORT ON 处方号/A TO JG3
USE JG3
INDEX ON 生产厂 TO SCC UNIQUE
COUNT TO N
SET INDEX TO
APPEND BLANK
REPL 生产厂 WITH STR(N,4),姓名 WITH '生产厂数'
LIST
CLOSE DATABASE
SET TALK ON
SET SAFE ON
RETURN
例14: (数据库同例11)
请编写符合下列要求的应用程序PROG4.PRG文件:
查询所开处方中包含同仁堂生产的药品的医生姓名、职称、所在部门、处方号、药名和生产厂,并把查询结果按处方号升序排序存入JG4数据库中,JG4的结构为:(姓名,职称,部门,处方号,药名,生产厂)。统计有几位医生使用了同仁堂生产的药品,再在JG4中增加一条记录,把统计出的使用了同仁堂生产的药品的医生数填入该记录的姓名字段中(注意:医生数与姓名字段的数据类型不同;统计数不包括重复姓名。如果使用唯一索引做统计,结果中应恢复原有记录)。
*PROG4.PRG
SET TALK OFF
SET SAFE OFF
SELE 4
USE JG4
ZAP
COPY TO AAA
USE AAA
SELE 1
USE YAO
SELECT 2
USE CHUFANG
SELECT 3
USE YISHENG
INDEX ON 职工号 TO ZGH
SELE 2
SET RELA TO 职工号 INTO C
SELECT 1
LOCATE ALL FOR 生产厂='同仁堂'
DO WHILE .NOT.EOF()
SELECT 2
LOCATE ALL FOR 药编号= A->药编号
DO WHILE .NOT.EOF()
SELECT 4
APPEND BLANK
REPL 姓名 WITH C->姓名,职称 WITH C->职称,处方号 WITH B->处方号
REPL 药名 WITH A->药名,部门 WITH C->部门,生产厂 WITH A->生产厂
SELE 2
CONTINUE
ENDDO
SELECT 1
CONTINUE
ENDDO
SELECT 4
SORT ON 处方号/A TO JG4
USE JG4
INDEX ON 姓名 TO XM UNIQUE
COUNT TO N
SET INDEX TO
APPEND BLANK
REPL 姓名 WITH STR(N,6)
LIST
CLOSE DATABASE
SET TALK ON
SET SAFE ON
RETURN
例15: (数据库同例11)
编写符合下列要求的应用程序PROG5.PRG文件:
查询在99年5月1日以前开出处方的医生姓名和他们所在的部门、处方号、以及处方中所包含的药名及药品的单价和数量,并计算所有处方的总价格,把结果按处方号升序排序存入JG5数据库中,JG5的结构为:(姓名,部门,处方号,药名,单价,数量)。再在JG5中增加一条记录,把计算出的总价格填入该记录的单价字段中。
*PROG5.PRG
SET TALK OFF
SET SAFE OFF
SELECT 4
USE JG5
ZAP
COPY TO AAA
USE AAA
SELECT 1
USE CHUFANG
SELECT 2
USE YISHENG
SELECT 3
USE YAO
INDEX ON 药编号 TO YAOBH
SELECT 1
SET RELA TO 药编号 INTO C
LOCATE ALL FOR 日期<CTOD('05/01/99')
DO WHILE .NOT.EOF()
SELECT 2
LOCATE ALL FOR 职工号=A->职工号
DO WHILE .NOT.EOF()
SELECT 4
APPEND BLANK
REPL 姓名 WITH B->姓名,部门 WITH B->部门,处方号 WITH A->处方号
REPL 药名 WITH C->药名,单价 WITH C->单价,数量 WITH A->数量
SELECT 2
CONT
ENDDO
SELECT 1
CONT
ENDDO
SELECT 4
SORT ON 处方号/A TO JG5
USE JG5
SUM 数量*单价 TO N
APPEND BLANK
REPL 单价 WITH N,姓名 WITH '总价格'
LIST
CLOSE DATABASE
SET TALK ON
SET SAFE ON
RETURN
例16: STD.DBF(学号C/4,姓名C/6,性别C/2,生日D/8,民族C/6,政治面目C/4,优秀毕业生L/1,来源地区C/8,数学N/3,英语N/3,政治N/3,总分N/3)
BJ.DBF(班级号C/8,班号N/2,学生数N/3)
有两个库文件:学生库STD.DBF、班级库BJ.DBF,班级库开始时学生数字段值为0。每个学生学号的前两位是所在班级号。请编写程序PROG1.PRG,统计每个班级的学生数,存数,存放到班级数据库BJ.DBF的相应记录中。
*PROG1.PRG
SET TALK OFF
SET SAFE OFF
SELECT 1
USE BJ
COUNT TO BS
SELECT 2
USE STD
I=1
DO WHILE I<=BS
COUNT TO RS FOR VAL(SUBSTR(学号,1,2))=I
SELECT 1
LOCATE ALL FOR 班号=I
REPLACE 学生数 WITH RS
SELECT 2
I=I+1
ENDDO
SELECT 1
DISPLAY ALL
CLOSE DATA
SET TALK ON
SET SAFE ON
RETURN
例17: STD1~3.DBF(学号C/4,姓名C/6,性别C/2,生日D/8,民族C/6,政治面目C/4,优秀毕业生L/1,来源地区C/8,数学N/3,英语N/3,政治N/3,总分N/3)
有结构相同的三个班的学生数据库STD1.DBF、STD2.DBF、STD3.DBF,其中学号字段的前两位是所在班级号,后两位是顺序号。请先建立一个比赛库BS.DBF,其结构包括三个字段:编号(N,4.0)、学号(N,4.0)、姓名(C,6)。再编写程序PROG1.PRG,其功能是按学号后两位为1,9,17,25,...的规律在三个班中抽取学生参加计算机操作比赛,并按班级顺序将选取参加比赛学生的学号和姓名存放到比赛库中。
"编号"字段的前两位是班级号,后两位是按班级分别从1开始的顺序号。
*PROG1.PRG
SET TALK OFF
SET SAFE OFF
SELECT 1
USE BS
ZAP
I=1
DO WHILE I<=3
SELECT 2
NAME='STD'+STR(I,1)
USE &NAME
J=1
DO WHILE .NOT.EOF()
IF MOD(VAL(SUBSTR(学号,3,4)),8)=1
SELECT 1
APPEND BLANK
REPLACE 编号 WITH I*100+J,学号 WITH VAL(B->学号),姓名 WITH B->姓名
J=J+1
ENDIF
SELECT 2
SKIP
ENDDO
I=I+1
ENDDO
SELECT 1
DISPLAY ALL
SET TALK ON
SET SAFE ON
RETURN
例18: 现有结构相同的两个数据库,计算机小组JSJ.DBF和文艺小组WY.DBF数据库,它们的主关键字都是学号字段。根据学校规定,一个学生不能同时参加两个课外活动小组,但参加计算机小组的优先。请编写程序PROG1.PRG,其功能是将同时参加两个小组的学生记录从文艺小组库中删除。最后将被删除的记录转到相同结构的数据库CF.DBF中。
*F98FOX4.PRG
SET TALK OFF
SET SAFE OFF
SELECT 1
USE WY
COPY TO WY2
USE WY2
SELECT 2
USE JSJ
DO WHILE .NOT.EOF()
SELECT 1
LOCATE ALL FOR 学号=B->学号
IF FOUND()
DELETE
ENDIF
SELECT 2
SKIP
ENDDO
SELECT 1
COPY TO CF FOR DELETE()
PACK
USE CF
RECALL ALL
?'文艺组已被删除了的记录:'
LIST
CLOSE DATA
SET TALK ON
SET SAFE ON
RETURN
例19: GZ.DBF(职工号C/6,姓名C/8,基本工资N/6.2,奖金N/6.2, 津贴N/6.2,房租N/6.2,水电费N/6.2,实发工资N/6.2)
已有某单位的工资数据库gz.dbf,其中职工号的前四位是部门编码(1001-1005,共5个部门)。请编写程序PROG1.PRG,其功能是找出各个部门中实发工资最高的记录,将它们按部门编码顺序存放到与工资库gz.dbf具有相同结构的数据库ggz.dbf中。
*PROG1.PRG
SET TALK OFF
SET SAFE OFF
SELECT 1
USE GGZ
ZAP
SELECT 2
USE GZ
I=1
DO WHILE I<=5
BM='100'+STR(I,1)
COPY TO AAA FOR SUBSTR(职工号,1,4)=BM
SELECT 3
USE AAA
INDEX ON -实发工资 TO SFGZ
GO TOP
SCATTER TO SZ
USE && 本题在这里必须关闭!
SELECT 1
APPEND BLANK
GATHER FROM SZ
SELECT 2
I=I+1
ENDDO
SELECT 1
DISPLAY ALL
CLOSE DATABASE
SET TALK ON
SET SAFE ON
RETURN
例20: AA.DBF(AB:C/2,CD:C/2,EF:C/3,GH:N/5.2,IJ:N/3)
BB.DBF(AB:C/2,CD:C/2,EF:C/3,GH:N/5.2,IJ:N/3)
在传统的集合运算中,两个关系的交运算是取出两个关系中相同的元组存放到新关系中。现有结构相同的数据库AA.DBF和BB.DBF,它们的主关键字都是AB字段。请编写程序PROG1.PRG,程序功能是根据主关键字将AA.DBF和BB.DBF中的相同记录存到结构相同的数据库CC.DBF中,原数据库保持不变。(提示:可以使用逻辑删除,然后恢复)
*PROG1.PRG
SET TALK OFF
SET SAFE OFF
SELECT 3
USE CC
ZAP
SELECT 1
USE AA
SELECT 2
USE BB
DO WHILE .NOT.EOF()
SELECT 1
LOCATE ALL FOR AB=B->AB
DO WHILE .NOT.EOF()
SCATTER TO SZ
SELECT 3
APPEND BLANK
GATHER FROM SZ
SELECT 1
CONTINUE
ENDDO
SELECT 2
SKIP
ENDDO
SELECT 3
DISPLAY ALL
CLOSE DATA
SET TALK ON
SET SAFE ON
RETURN
例21:ZG.DBF(职工号C/6,姓名C/8,职称C/6,基本工资N/6.2,奖金N/6.2,津贴N/6.2,*实发工资N/6.2),有教职工数据库ZG.DBF,其中职工号的前四位是部门编码(1001~1005,共5个部门)。请先建立一个统计数据库TJK.DBF,其中包括6个字段:部门编码(C,4)、教授、副教授、讲师、助教和其它,后5个字段均为数值型(N,3.0)。请编写程序PROG1.PRG,程序功能是分部门统计各类职称的人数,存入统计数据库中,并要求按部门编码顺序排列。
*PROG1.PRG
SET TALK OFF
SET SAFE OFF
SELECT 1
USE TJK
ZAP
SELECT 2
USE ZG
I=1
DO WHILE I<=5
BM='100'+STR(I,1)
COPY TO AAA FOR SUBSTR(职工号,1,4)=BM
SELECT 3
USE AAA
COUNT TO N1 FOR 职称='教授'
COUNT TO N2 FOR 职称='副教授'
COUNT TO N3 FOR 职称='讲师'
COUNT TO N4 FOR 职称='助教'
COUNT TO N5 FOR 职称='其它'
USE && 本题在这里必须关闭!
SELECT 1
APPEND BLANK
REPLACE 部门编码 WITH BM,教授 WITH N1,副教授 WITH N2
REPLACE 讲师 WITH N3,助教 WITH N4,其它 WITH N5
SELECT 2
I=I+1
ENDDO
SELECT 1
DISPLAY ALL
CLOSE DATA
SET SAFE ON
SET TALK ON
RETURN
例22: GZZ.DBF(职工号C/6,姓名C/8,基本工资N/6.2,奖金N/6.2,津贴N/6.2,房租N/6.2,水电费N/6.2,实发工资N/6.2)
有某单位的工资数据库GZZ.DBF。其中职工号的前四位是部门编码(1001~1005,共5个部门)。先建立一个统计数据库GZTJ.DBF,包括三个字段:部门编码(C,4)、职工号(C,6)、增资额(N,7.2。请编写程序PROG1.PRG,在程序中首先由工资数据库拷贝生成GZ.DBF,然后再修改GZ.DBF,把实发工资等于或低于本部门平均工资的职工的实发工资提高百分之三十;并计算出每人的增资额,把有关数据存放到GZTJ.DBF中。
*98FOX8.PRG
SET TALK OFF
SET SAFE OFF
SELECT 1
USE GZTJ
ZAP
SELECT 2
USE GZZ
COPY TO GZ
USE GZ
REPLACE ALL 实发工资 WITH 基本工资+奖金+津贴-房租-水电费
I=1
DO WHILE I<=5
BM='100'+STR(I,1)
COPY TO AAA FOR SUBSTR(职工号,1,4)=BM
SELECT 3
USE AAA
AVERAGE 实发工资 TO PJ
GO TOP
DO WHILE .NOT.EOF()
IF 实发工资<=PJ
ZZE=实发工资*0.3
REPLACE 实发工资 WITH 实发工资+ZZE
SELECT 1
APPEND BLANK
REPLACE 部门编码 WITH BM,职工号 WITH C->职工号,增资额 WITH ZZE
ENDIF
SELECT 3
SKIP
ENDDO
USE && 本题在这里必须关闭!
SELECT 2
I=I+1
ENDDO
SELECT 1
DISPLAY ALL
CLOSE DATA
SET TALK ON
SET SAFE ON
RETURN
例23: BSH1.DBF(考号C/6,成绩N/3)
SHJ1.DBF(考号C/6,成绩N/3)
有存放计算机等级考试笔试成绩的数据库BSH1.DBF和上机成绩数据库SHJ1.DBF。请先建立数据库TJ1.DBF用于存放统计数据,该库文件有5个字段:类别(C,4)、优秀、良好、及格和不及格,后4个字段均为数值型,宽度2,小数位0。请考生编写程序PROG1.PRG,程序的功能是:分别将笔试成绩和上机成绩按等级
*进行统计:优秀(85以上)、良好(70-84)、及格(60-69)、60分以下为不及格。将相应人数分别存放到tj1.dbf中的类别为"笔试"的"上机"两条记录的相应字段中。
*98FOX9.PRG
SET TALK OFF
SET SAFE OFF
SELECT 1
USE TJ1
ZAP
I=1
DO WHILE I<=2
SELECT 2
DBM=IIF(I=1,'BSH1','SHJ1')
LB=IIF(I=1,'笔试','上机')
USE &DBM
COUNT TO N1 FOR 成绩>=85
COUNT TO N2 FOR 成绩>=70.AND.成绩<=84
COUNT TO N3 FOR 成绩>=60.AND.成绩<=69
COUNT TO N4 FOR 成绩<60
SELECT 1
APPEND BLANK
REPLACE 类别 WITH LB,优秀 WITH N1,良好 WITH N2
REPLACE 及格 WITH N3,不及格 WITH N4
I=I+1
ENDDO
SELECT 1
LIST
CLOSE DATABASE
SET TALK ON
SET SAFE ON
RETURN
例24: GZ.DBF(职工号C/6,姓名C/8,基本工资N/6.2,奖金N/6.2,津贴N/6.2,房租N/6.2,水电费N/6.2,实发工资N/6.2),已有某单位的工资数据库GZ.DBF。其中职工号的前四位是部门编码(1001~1005,共5个部门)。请先建立一个统计数据库TJGZ.DBF,包括四个字段:部门编码(C,4)、最高工资、最低工资、平均工资,均为(N,7.2)。请编写程序PROG1.PRG,程序的功能是按实发工资计算出各部门的最高、最低和平均工 资,存入统计数据库中。
*PROG1.PRG
SET TALK OFF
SET SAFE OFF
SELECT 1
USE TJGZ
ZAP
SELECT 2
USE GZ
REPLACE ALL 实发工资 with 基本工资+奖金+津贴-房租-水电费
I=1
DO WHILE I<=5
MZ='100'+STR(I,1)
COPY TO AAA FOR SUBSTR(职工号,1,4)=MZ
SELECT 3
USE AAA
INDEX ON 实发工资 TO SFGZ
GO TOP
ZD=实发工资
GO BOTTOM
ZG=实发工资
AVERAGE 实发工资 TO PJ
USE && 本题在这里必须关闭!
SELECT 1
APPEND BLANK
REPLACE 部门编码 WITH MZ,最高工资 WITH ZG,最低工资 WITH ZD,平均工资 WITH PJ
SELECT 2
I=I+1
ENDDO
SELECT 1
DISPLAY ALL
CLOSE DATABASE
SET SAFE ON
SET TALK ON
RETURN
例25: 设有如下数据库文件:
*职工(仓库号C(4),职工号C(4),工资N(4))
*订购单:职工号C(4),供应商号C(4),订购单号C(4),订购日期D,总金额N(10)
*供应商:供应商号C(4),供应商名C(16),地址C(10)
*请编写程序PROG1.PRG文件,检索出与工资在1300元以上的职工没有联系的供应商的信息,将结果存放在sup1文件(和供应商文件具有同样的结构)中,并按供应商号升序排序。
*99FOX10.PRG
SET TALK OFF
SET SAFE OFF
SELECT 4
USE SUP1
ZAP
SELECT 1
USE 职工
INDEX ON 职工号 TO ZGH
SELECT 2
USE 订购单
SET RELATION TO 职工号 INTO A
SELECT 3
USE 供应商
INDEX ON 供应商号 TO GYSH
GO TOP
DO WHILE .NOT.EOF()
SCATTER TO SZ
SELECT 2
TF=.T.
LOCATE FOR 供应商号=C->供应商号
DO WHILE FOUND()
IF A->工资>1300
TF=.F.
EXIT
ENDIF
CONTINUE
ENDDO
IF TF
SELECT 4
APPEND BLANK
GATHER FROM SZ
ENDIF
SELECT 3
SKIP
ENDDO
SELECT 4
LIST
CLOSE DATABASE
SET SAFE ON
SET TALK ON
RETURN
例26: 已有库文件djks.dbf,再由考生建立库文件tt.dbf的结构,共有kh(考号)、xm(姓名)、bs(笔试)和sj(上机)共四个字段,字段类型和宽度参照djks.dbf。然后编写程序PROG1.PRG,按笔试上机两项考试成绩总和的降序把成绩最高的十名考生的考号、姓名、笔试及上机四个字段的数据,添加到库文件tt.dbf的相应字段中。
SET TALK OFF
SET SAFE OFF
SELECT 2
USE TT
ZAP
SELECT 1
USE DJKS
INDEX ON 200-(笔试+上机) TO CJ
GO TOP
I=1
DO WHILE I<=10
SELECT 2
APPEND BLANK
REPLACE KH WITH A->考号,XM WITH A->姓名,BS WITH A->笔试,SJ WITH A->上机
SELECT 1
SKIP
I=I+1
ENDDO
SELECT 2
DISPLAY ALL
CLOSE DATA
SET SAFE ON
SET TALK ON
RETURN
例27: djks.dbf(考号C(6),姓名C(6),性别C(2),年龄N(2),考场C(3),笔试N(3),上机N(3),结论C(6))
已有库文件djks.dbf。请编写程序PROG1.PRG,在程序中首先通过结构复制生成一个具有考号、姓名、笔试、上机及结论五个字段的数据库文件kkk.dbf,然后把djks.dbf库文件中笔试和上机考试成绩中有一次不及格考生的相应字段数据添加于该数据库中,并把"补考"填入结论字段中。
注意:要求按多工作区操作,以DO WHILE-ENDDO循环结构完成,不得使用APPEND FROM命令。
set talk off
set safe off
select 1
use djks
copy stru to kkk fields 考号,姓名,笔试,上机,结论
select 2
use kkk
select 1
go top
do while .not.eof()
if 笔试<60.and.上机>=60.or.笔试>=60.and.上机<60
select 2
append blank
replace 考号 WITH A->考号,姓名 WITH A->姓名,笔试 WITH A->笔试
REPLACE 上机 WITH A->上机,结论 WITH '补考'
endif
select 1
skip
enddo
select 2
list
close database
set safe on
set talk on
return
例28: 设有如下数据库文件:
仓库(仓库号C(4),城市C(8),面积N(4))
职工(仓库号C(4),职工号C(4),工资N(4))
订购单(职工号C(4),供应商号C(4),订购单号C(4),订购日期D,总金额N(10))
请编写程序PROG1.PRG文件,检索出在北京工作并且向S4供应商发出了订购单的职工信息,并将结果存放在emp1文件(和职工文件具有相同的结构)中。
SET TALK OFF
SET SAFE OFF
SELECT 4
USE EMP1
ZAP
SELECT 1
USE 仓库
index on 仓库号 to ckh
select 2
use 职工
set relation to 仓库号 INTO a
select 3
use 订购单
select 2
locate for A->城市='北京'
do while found()
scatter to sz
select 3
locate for 职工号=B->职工号.and.供应商号='S4'
if found()
select 4
append blank
gather from sz
endif
select 2
continue
enddo
select 4
list
CLOSE DATABASE
SET SAFE ON
SET TALK ON
RETURN
例29: 已有库文件djks.dbf。请编写程序PROG1.PRG,在程序中首先通过结构复制生成一个具有考号、姓名、笔试、上机、结论五个字段的数据库文件kkk.dbf,然后把djks.dbf库文件中笔试和上机考试成绩中均不及格考生的相应字段数据添加于该数据库中,并把“未通过”填入结论字段中。
SET TALK OFF
SET SAFE OFF
SELECT 1
USE DJKS
COPY STRU TO KKK FIELDS 考号,姓名,笔试,上机,结论
SELECT 2
USE KKK
SELECT 1
DO WHILE .NOT.EOF()
IF 笔试<60.AND.上机<60
SELECT 2
APPEND BLANK
REPLACE 考号 WITH A->考号,姓名 WITH A->姓名,笔试 WITH A->笔试,上机 WITH A->上机
REPLACE 结论 WITH "未通过"
SELECT 1
ENDIF
SKIP
ENDDO
SELECT 2
DISPLAY ALL
CLOSE DATABASE
SET TALK ON
SET SAFE ON
RETURN
例30: 设有如下数据库文件:
职工(仓库号C(4),职工号C(4),工资N(4))
订购单(职工号C(4),供应商号C(4),订购单号C(4),订购日期D,*总金额N(10))。首先由考生建立数据库:工资(职工号C(4),工资N(4)),然后编程序PROG1.PRG文件,检索出与供应商S7、S4和S6都有业务联系的职工的职工号和工资,并存放到所建立的工资文件中。
*99FOX6.PR
set talk off
set safe off
select 3
use 工资
zap
select 1
use 订购单
select 2
use 职工
do while .not.eof()
select 1
locate for 职工号=B->职工号.and.供应商号='S7'
IF FOUND()
LOCATE FOR 职工号=B->职工号.and.供应商号='S4'
IF FOUND()
locate for 职工号=B->职工号.and.供应商号='S6'
IF FOUND()
SELECT 3
APPEND BLANK
REPLACE 职工号 WITH B->职工号,工资 WITH B->工资
ENDIF
ENDIF
ENDIF
SELECT 2
SKIP
ENDDO
SELECT 3
LIST
SET SAFE ON
SET TALK ON
RETURN
?