FoxPro For Windows http://cc.synu.edu.cn 1
编程练习 (1)
FoxPro For Windows http://cc.synu.edu.cn 2
【 编程 1】 统计 CJK库中, 总分, ( N型字段)分数最高的人
数。
SET TALK OFF
USE CJK
INDEX ON 总分 TO ZF
GO BOTTOM
JG=总分
COUNT TO ABC FOR 总分 =JG
?“总分最高的人数是:”,ABC
USE
SET TALK ON
总分 记录号
456 4
……
478 24
……
488 13
488 28
488 40
Zf.idx
FoxPro For Windows http://cc.synu.edu.cn 3
【 编程 2】 统计数据库文件 xsk.dbf中所有英语通过的人数,
并依次输出这些学生的记录, 其中, 英语通过, 字段为逻辑
型 。 SET TALK OFF
USE xsk
i=0
SCAN FOR 英语通过
i=i+1
DISP
ENDSCAN
i
USE
SET TALK ON
逻辑型字段引用
为真 <字段名 >
为假,not,<字段名 >
FoxPro For Windows http://cc.synu.edu.cn 4
【 编程 3】 统计并显示 student数据库中男生人数, 库中有字
段 sno(c,6),sex(c,2)。
SET TALK OFF
USE student
n=0
DO WHILE,NOT.EOF()
IF sex=“男 "
DISP
n=n+1
ENDIF
SKIP
ENDDO
n
USE
RETURN
SET TALK OFF
USE student
i=0
SCAN FOR SEX=?男 ’
i=i+1
DISP
ENDSCAN
i
USE
SET TALK ON
FoxPro For Windows http://cc.synu.edu.cn 5
【 编程 4】 利用循环和分支结构实现按编号删除 student
库中记录。库中有字段:编号 (c,6),姓名 (c,8)。
SET TALK OFF
USE STUDENT
INDE ON 编号 TO bh
DO WHILE,T.
ACCEPT "请输入要删除记录的编号," TO bh
SEEK bh
IF FOUND()
DELE
ELSE
"查无此人 ! "
ENDIF
WAIT " 是否继续删除 (Y/N)? " TO k
IF UPPER(k)="N"
EXIT
ENDIF
ENDDO
PACK
SET TALK ON
FoxPro For Windows http://cc.synu.edu.cn 6
SET TALK OFF
USE student INDE name
CLEA
ACCEPT“请输入姓名," to xm
SEEK xm
IF,NOT,EOF()
@4,10 SAY "姓名,"+name
@4,30 SAY "出生日期,"+DTOC(birthday)
@5,10 SAY "成绩," GET score
@5,30 SAY "奖学金," GET schoship
READ
ELSE
"查无此人 ! "
ENDIF
USE
RETURN
【 编程 5】 用格式输入输出命令对 student.dbf数据库编写按姓名查询程
序,使其奖学金和成绩字段可以修改。库中有字段,name(c,8),
birthday(d,8),score(n,3),schoship(n,3)。
思考:
1、将 SEEK xm 改为 FIND xm 可以吗?
2、将 IF,NOT,EOF()改为 IF FOUND()可以吗?
3、所有字段都可以修改或都不可以修改如何改?
FoxPro For Windows http://cc.synu.edu.cn 7
【 编程 6】 求 1~100之间能被 11整除的偶数个数以及它们之和。
SET TALK OFF
STORE 0 TO s,n
FOR i=1 TO 100
IF MOD(i,11)=0,AND,MOD(i,2)=0
n=n+1
s=s+i
ENDIF
ENDFOR
" s=",s," n=",n
SET TALK ON
RETURN
INT(i/11)=i/11,AND,INT(i/2)=i/2
FoxPro For Windows http://cc.synu.edu.cn 8
【 编程 7】 输入 n个数,求其中能被 3整除的数之和。
SET TALK OFF
INPUT "n=" TO n
s=0
FOR i=1 TO n
INPUT,m=" TO m
IF INT( m/3)=m/3 MOD(m,3)=0
s=s+m
ENDIF
ENDFOR
"s=",s
SET TALK ON
FoxPro For Windows http://cc.synu.edu.cn 9
【 编程 8】 统计键盘输入字符串其中含有几个大写字母。
SET TALK OFF
m=0
ACCEPT "请输入一串字符," TO x
n=LEN(x)
FOR i=1 TO n
IF UPPER(SUBSTR(x,i,1))= SUBSTR(x,i,1)
m=m+1
ENDIF
ENDFOR
m
SET TALK ON
FoxPro For Windows http://cc.synu.edu.cn 10
【 编程 9】 输入若干个非零任意数,统计其中正负数的个数。
SET TALK OFF
STORE 0 TO a,b
DO WHILE,T.
INPUT "请输入一个数 ( 0-结束 ), " TO n
DO CASE
CASE n=0
EXIT
CASE n>0
a=a+1
CASE n<0
b=b+1
ENDCASE
ENDDO
"正数个数为,",a,"负数个数为,",b
SET TALK ON
FoxPro For Windows http://cc.synu.edu.cn 11
【 编程 10】 编写对任意一个数据库文件都有追加记录功能程序。SET TALK OFF
ACCEPT "请输入库名," TO fm
USE &fm
DO WHILE,T.
"1,追加记录 "
"2,退出 "
INPUT "请选择 ( 1或 2), " TO n
IF n=1
APPEND
ELSE
EXIT
ENDIF
ENDDO
USE
SET TALK ON
FoxPro For Windows http://cc.synu.edu.cn 12
SET TALK OFF
A=.T.
B=0
DO WHIL A
B=B+1 1,2,3……
IF B/3<>INT(B/3)
LOOP
ELSE
B
ENDI
IF B>6
A=.F.
ENDI
ENDDO
SET TALK ON
RETURN
(若把 IF B>6改为 IF B>=6,程序结果如何? )
【 编程 11】 写出程序的运行结果
3 6 9
FoxPro For Windows http://cc.synu.edu.cn 13
查询 TEACHER库中指定记录 。
(1)SET TALK OFF
(2)USE TEACHER
(3)XM=“李群,
(4)LOCATE FOR XM=姓名
(5)IF FOUND()
(6)? 姓名,性别,年龄
(7)ENDIF
(6)USE
(7)SET TALK ON
【 编程 12】 改正程序中的错误
(4)
LOCATE FOR 姓名 = XM
FoxPro For Windows http://cc.synu.edu.cn 14
【 编程 12】 完善程序
下面程序显示标准工资最高者 。
SET TALK OFF
USE GZ
INDEX _____TO GZ 题意应为工资的降序索引
GO TOP
DISPLAY
USE
SET TALK ON
答案,ON -标准工资
注意:索引默认为按关键字升序, 若关键字为数值型, 可用本
题的方法实现降序排列 。
FoxPro For Windows http://cc.synu.edu.cn 15
编程练习 (2)
FoxPro For Windows http://cc.synu.edu.cn 16
【 编程 1】 在数据库中按编号查询记录,并显示其 sno,name,math、
english字段。学生库 student.dbf有字段 sno(c,6),name(c,8),
sex(c,2);成绩库 score.dbf有字段 sno(c,6),math(n,3),
english(n,3)。 set talk off
sele 2
use score
index on sno to sno
sele 1
use student
set relation to sno into b
accept "请输入待查询的编号," to bh
locate for sno=bh
disp sno,name,b->math,b->english
use
set talk on
FoxPro For Windows http://cc.synu.edu.cn 17
【 编程 2】 打印一个 10行 10列的矩阵,其中对角线
的位置为 0,其余位置为 1。
SET TALK OFF
FOR i=1 TO 10
FOR j=1 TO 10
IF i=j,OR,i+j=11
Str(0,2) &&?0?
ELSE
Str(1,2) && ?1?
ENDIF
ENDFOR
ENDFOR
SET TALK ON
0111111111010111111101
1101111101111101110111
1111010111111111011111
1111010111111101110111
1101111101110111111101
01111111110
FoxPro For Windows http://cc.synu.edu.cn 18
【 编程 3】 打印九九乘法表 。
SET TALK OFF
FOR I=1 TO 9
FOR J=1 TO I
K=I*J
SPACE(1)+STR(I,1)+"*"+STR(J,1)+"="+STR(K,2)
ENDFOR
ENDFOR
SET TALK ON
1*1=1
2*1=2 2*2=4
3*1=1 3*2=6 3*3=9
………..
FoxPro For Windows http://cc.synu.edu.cn 19
【 编程 4】 输入 10个数, 找出其中的最大值和最小值并输出 。
SET TALK OFF
DIME x(10)
FOR i=1 TO 10
INPUT ?请输入 10个数 ’ to x(i)
ENDFOR
STORE x(1) TO min,max
FOR i=2 TO 10
IF min>x(i)
min=x(i)
ENDIF
IF max<x(i)
max=x(i)
ENDIF
ENDFOR
"min=",min,"max=",max
SET TALK ON
FoxPro For Windows http://cc.synu.edu.cn 20
【 编程 5】 利用自定义函数 AREA(L,W),对任意输入的长和宽
求矩形的面积。
****main.prg
SET TALK OFF
INPUT"请输入矩形的长," TO L
INPUT"请输入矩形的宽," TO W
"矩形的面积为,",AREA(L,W)
SET TALK ON
****area.prg
PARA c,k
s=0
s=c*k
return s
FoxPro For Windows http://cc.synu.edu.cn 21
【 编程 6】 编程实现从第 10列开始输出下列图形 。
SET TALK OFF
FOR i=1 TO 4
FOR j=1 TO 2*i-1
@ i,9+j SAY "*"
ENDFOR
ENDFOR
SET TALK ON
不要求输出位置
set talk off
for i=1 to 5
repl('*',2*i-1)
endfor
retu
*
***
*****
*******
FoxPro For Windows http://cc.synu.edu.cn 22
【 编程 7】 键盘输入三角形的三个边,输入, 0”结束。如果
边长合理,显示其面积,否则重新输入其边长。
SET TALK OFF
DO WHILE,T.
INPUT,请输入边长 A:” TO A
INPUT,请输入边长 B:” TO B
INPUT,请输入边长 C:” TO C
IF A=0,OR,B=0,OR,C=0
,结束”
EXIT
ENDIF
IF A+B<=C,OR.B+C<=A,OR,A+C<=B
,输入的边长有误 !”
LOOP
ENDIF
S=(A+B+C)/2
MJ=SQRT(S*(S-A)*(S-B)*(S-C))
,面积 =”,MJ
EXIT
ENDDO
RETURN
FoxPro For Windows http://cc.synu.edu.cn 23
【 编程 8】 设 12+22+32+……,.+N2<=1000,试编一程序求
出满足上述条件的 N最大的值,
SET TALK OFF
S=0
N=1
DO WHIL S<=1000
J=10*N+2
S=S+J
N=N+1
ENDDO
N-2,S-J
RETU
SET TALK OFF
S=0
N=0
DO WHIL S<=1000
N=N+1
J=10*N+2
S=S+J
ENDDO
N-1,S-J
RETU
FoxPro For Windows http://cc.synu.edu.cn 24
【 编程 9】 在规定的范围内 (999---2000)输入学生学号的程序,
SET TALK OFF
CLEA
DO WHILE,T.
XSNO=0
@10,20 SAY '请输入学生的学号,(999---2000)' GET XSNO
READ
IF XSNO>=999,AND,XSNO<=2000
CLEA
@ 14,20 SAY '输入正确 '
EXIT
ENDIF
@12,20 SAY'输入有误!重新输入 '
ENDDO
RETU
FoxPro For Windows http://cc.synu.edu.cn 25
【 编程 10】 有 100元钱,要用它买 100条鱼。已知大鱼 5元一条,
中鱼 3元一条,小鱼 2角一条,编程求出大中小鱼的条数。
SET TALK OFFCLEA
A=1DO WHILE A<100
B=1DO WHIL B<100
C=1DO WHILE C<100
Q=A+B+CIF Q=100,AND,(5*A+3*B+0.2*C)=100
A,B,CENDIF
C=C+1ENDDO
B=B+1ENDDO
A=A+1ENDDO
RETU
FoxPro For Windows http://cc.synu.edu.cn 26
【 编程 11】 把 411分成两个数的和,其中一个数可以被
13整除,另一个数可以被 17整除,求两个数。
SET TALK OFF
CLEA
N=1
DO WHIL N*17<411
M=1
DO WHIL M*13<411
IF M*13+N*17=411
M*13,N*17
ENDIF
M=M+1
ENDDO
N=N+1
ENDDO
RETU
编程练习 (1)
FoxPro For Windows http://cc.synu.edu.cn 2
【 编程 1】 统计 CJK库中, 总分, ( N型字段)分数最高的人
数。
SET TALK OFF
USE CJK
INDEX ON 总分 TO ZF
GO BOTTOM
JG=总分
COUNT TO ABC FOR 总分 =JG
?“总分最高的人数是:”,ABC
USE
SET TALK ON
总分 记录号
456 4
……
478 24
……
488 13
488 28
488 40
Zf.idx
FoxPro For Windows http://cc.synu.edu.cn 3
【 编程 2】 统计数据库文件 xsk.dbf中所有英语通过的人数,
并依次输出这些学生的记录, 其中, 英语通过, 字段为逻辑
型 。 SET TALK OFF
USE xsk
i=0
SCAN FOR 英语通过
i=i+1
DISP
ENDSCAN
i
USE
SET TALK ON
逻辑型字段引用
为真 <字段名 >
为假,not,<字段名 >
FoxPro For Windows http://cc.synu.edu.cn 4
【 编程 3】 统计并显示 student数据库中男生人数, 库中有字
段 sno(c,6),sex(c,2)。
SET TALK OFF
USE student
n=0
DO WHILE,NOT.EOF()
IF sex=“男 "
DISP
n=n+1
ENDIF
SKIP
ENDDO
n
USE
RETURN
SET TALK OFF
USE student
i=0
SCAN FOR SEX=?男 ’
i=i+1
DISP
ENDSCAN
i
USE
SET TALK ON
FoxPro For Windows http://cc.synu.edu.cn 5
【 编程 4】 利用循环和分支结构实现按编号删除 student
库中记录。库中有字段:编号 (c,6),姓名 (c,8)。
SET TALK OFF
USE STUDENT
INDE ON 编号 TO bh
DO WHILE,T.
ACCEPT "请输入要删除记录的编号," TO bh
SEEK bh
IF FOUND()
DELE
ELSE
"查无此人 ! "
ENDIF
WAIT " 是否继续删除 (Y/N)? " TO k
IF UPPER(k)="N"
EXIT
ENDIF
ENDDO
PACK
SET TALK ON
FoxPro For Windows http://cc.synu.edu.cn 6
SET TALK OFF
USE student INDE name
CLEA
ACCEPT“请输入姓名," to xm
SEEK xm
IF,NOT,EOF()
@4,10 SAY "姓名,"+name
@4,30 SAY "出生日期,"+DTOC(birthday)
@5,10 SAY "成绩," GET score
@5,30 SAY "奖学金," GET schoship
READ
ELSE
"查无此人 ! "
ENDIF
USE
RETURN
【 编程 5】 用格式输入输出命令对 student.dbf数据库编写按姓名查询程
序,使其奖学金和成绩字段可以修改。库中有字段,name(c,8),
birthday(d,8),score(n,3),schoship(n,3)。
思考:
1、将 SEEK xm 改为 FIND xm 可以吗?
2、将 IF,NOT,EOF()改为 IF FOUND()可以吗?
3、所有字段都可以修改或都不可以修改如何改?
FoxPro For Windows http://cc.synu.edu.cn 7
【 编程 6】 求 1~100之间能被 11整除的偶数个数以及它们之和。
SET TALK OFF
STORE 0 TO s,n
FOR i=1 TO 100
IF MOD(i,11)=0,AND,MOD(i,2)=0
n=n+1
s=s+i
ENDIF
ENDFOR
" s=",s," n=",n
SET TALK ON
RETURN
INT(i/11)=i/11,AND,INT(i/2)=i/2
FoxPro For Windows http://cc.synu.edu.cn 8
【 编程 7】 输入 n个数,求其中能被 3整除的数之和。
SET TALK OFF
INPUT "n=" TO n
s=0
FOR i=1 TO n
INPUT,m=" TO m
IF INT( m/3)=m/3 MOD(m,3)=0
s=s+m
ENDIF
ENDFOR
"s=",s
SET TALK ON
FoxPro For Windows http://cc.synu.edu.cn 9
【 编程 8】 统计键盘输入字符串其中含有几个大写字母。
SET TALK OFF
m=0
ACCEPT "请输入一串字符," TO x
n=LEN(x)
FOR i=1 TO n
IF UPPER(SUBSTR(x,i,1))= SUBSTR(x,i,1)
m=m+1
ENDIF
ENDFOR
m
SET TALK ON
FoxPro For Windows http://cc.synu.edu.cn 10
【 编程 9】 输入若干个非零任意数,统计其中正负数的个数。
SET TALK OFF
STORE 0 TO a,b
DO WHILE,T.
INPUT "请输入一个数 ( 0-结束 ), " TO n
DO CASE
CASE n=0
EXIT
CASE n>0
a=a+1
CASE n<0
b=b+1
ENDCASE
ENDDO
"正数个数为,",a,"负数个数为,",b
SET TALK ON
FoxPro For Windows http://cc.synu.edu.cn 11
【 编程 10】 编写对任意一个数据库文件都有追加记录功能程序。SET TALK OFF
ACCEPT "请输入库名," TO fm
USE &fm
DO WHILE,T.
"1,追加记录 "
"2,退出 "
INPUT "请选择 ( 1或 2), " TO n
IF n=1
APPEND
ELSE
EXIT
ENDIF
ENDDO
USE
SET TALK ON
FoxPro For Windows http://cc.synu.edu.cn 12
SET TALK OFF
A=.T.
B=0
DO WHIL A
B=B+1 1,2,3……
IF B/3<>INT(B/3)
LOOP
ELSE
B
ENDI
IF B>6
A=.F.
ENDI
ENDDO
SET TALK ON
RETURN
(若把 IF B>6改为 IF B>=6,程序结果如何? )
【 编程 11】 写出程序的运行结果
3 6 9
FoxPro For Windows http://cc.synu.edu.cn 13
查询 TEACHER库中指定记录 。
(1)SET TALK OFF
(2)USE TEACHER
(3)XM=“李群,
(4)LOCATE FOR XM=姓名
(5)IF FOUND()
(6)? 姓名,性别,年龄
(7)ENDIF
(6)USE
(7)SET TALK ON
【 编程 12】 改正程序中的错误
(4)
LOCATE FOR 姓名 = XM
FoxPro For Windows http://cc.synu.edu.cn 14
【 编程 12】 完善程序
下面程序显示标准工资最高者 。
SET TALK OFF
USE GZ
INDEX _____TO GZ 题意应为工资的降序索引
GO TOP
DISPLAY
USE
SET TALK ON
答案,ON -标准工资
注意:索引默认为按关键字升序, 若关键字为数值型, 可用本
题的方法实现降序排列 。
FoxPro For Windows http://cc.synu.edu.cn 15
编程练习 (2)
FoxPro For Windows http://cc.synu.edu.cn 16
【 编程 1】 在数据库中按编号查询记录,并显示其 sno,name,math、
english字段。学生库 student.dbf有字段 sno(c,6),name(c,8),
sex(c,2);成绩库 score.dbf有字段 sno(c,6),math(n,3),
english(n,3)。 set talk off
sele 2
use score
index on sno to sno
sele 1
use student
set relation to sno into b
accept "请输入待查询的编号," to bh
locate for sno=bh
disp sno,name,b->math,b->english
use
set talk on
FoxPro For Windows http://cc.synu.edu.cn 17
【 编程 2】 打印一个 10行 10列的矩阵,其中对角线
的位置为 0,其余位置为 1。
SET TALK OFF
FOR i=1 TO 10
FOR j=1 TO 10
IF i=j,OR,i+j=11
Str(0,2) &&?0?
ELSE
Str(1,2) && ?1?
ENDIF
ENDFOR
ENDFOR
SET TALK ON
0111111111010111111101
1101111101111101110111
1111010111111111011111
1111010111111101110111
1101111101110111111101
01111111110
FoxPro For Windows http://cc.synu.edu.cn 18
【 编程 3】 打印九九乘法表 。
SET TALK OFF
FOR I=1 TO 9
FOR J=1 TO I
K=I*J
SPACE(1)+STR(I,1)+"*"+STR(J,1)+"="+STR(K,2)
ENDFOR
ENDFOR
SET TALK ON
1*1=1
2*1=2 2*2=4
3*1=1 3*2=6 3*3=9
………..
FoxPro For Windows http://cc.synu.edu.cn 19
【 编程 4】 输入 10个数, 找出其中的最大值和最小值并输出 。
SET TALK OFF
DIME x(10)
FOR i=1 TO 10
INPUT ?请输入 10个数 ’ to x(i)
ENDFOR
STORE x(1) TO min,max
FOR i=2 TO 10
IF min>x(i)
min=x(i)
ENDIF
IF max<x(i)
max=x(i)
ENDIF
ENDFOR
"min=",min,"max=",max
SET TALK ON
FoxPro For Windows http://cc.synu.edu.cn 20
【 编程 5】 利用自定义函数 AREA(L,W),对任意输入的长和宽
求矩形的面积。
****main.prg
SET TALK OFF
INPUT"请输入矩形的长," TO L
INPUT"请输入矩形的宽," TO W
"矩形的面积为,",AREA(L,W)
SET TALK ON
****area.prg
PARA c,k
s=0
s=c*k
return s
FoxPro For Windows http://cc.synu.edu.cn 21
【 编程 6】 编程实现从第 10列开始输出下列图形 。
SET TALK OFF
FOR i=1 TO 4
FOR j=1 TO 2*i-1
@ i,9+j SAY "*"
ENDFOR
ENDFOR
SET TALK ON
不要求输出位置
set talk off
for i=1 to 5
repl('*',2*i-1)
endfor
retu
*
***
*****
*******
FoxPro For Windows http://cc.synu.edu.cn 22
【 编程 7】 键盘输入三角形的三个边,输入, 0”结束。如果
边长合理,显示其面积,否则重新输入其边长。
SET TALK OFF
DO WHILE,T.
INPUT,请输入边长 A:” TO A
INPUT,请输入边长 B:” TO B
INPUT,请输入边长 C:” TO C
IF A=0,OR,B=0,OR,C=0
,结束”
EXIT
ENDIF
IF A+B<=C,OR.B+C<=A,OR,A+C<=B
,输入的边长有误 !”
LOOP
ENDIF
S=(A+B+C)/2
MJ=SQRT(S*(S-A)*(S-B)*(S-C))
,面积 =”,MJ
EXIT
ENDDO
RETURN
FoxPro For Windows http://cc.synu.edu.cn 23
【 编程 8】 设 12+22+32+……,.+N2<=1000,试编一程序求
出满足上述条件的 N最大的值,
SET TALK OFF
S=0
N=1
DO WHIL S<=1000
J=10*N+2
S=S+J
N=N+1
ENDDO
N-2,S-J
RETU
SET TALK OFF
S=0
N=0
DO WHIL S<=1000
N=N+1
J=10*N+2
S=S+J
ENDDO
N-1,S-J
RETU
FoxPro For Windows http://cc.synu.edu.cn 24
【 编程 9】 在规定的范围内 (999---2000)输入学生学号的程序,
SET TALK OFF
CLEA
DO WHILE,T.
XSNO=0
@10,20 SAY '请输入学生的学号,(999---2000)' GET XSNO
READ
IF XSNO>=999,AND,XSNO<=2000
CLEA
@ 14,20 SAY '输入正确 '
EXIT
ENDIF
@12,20 SAY'输入有误!重新输入 '
ENDDO
RETU
FoxPro For Windows http://cc.synu.edu.cn 25
【 编程 10】 有 100元钱,要用它买 100条鱼。已知大鱼 5元一条,
中鱼 3元一条,小鱼 2角一条,编程求出大中小鱼的条数。
SET TALK OFFCLEA
A=1DO WHILE A<100
B=1DO WHIL B<100
C=1DO WHILE C<100
Q=A+B+CIF Q=100,AND,(5*A+3*B+0.2*C)=100
A,B,CENDIF
C=C+1ENDDO
B=B+1ENDDO
A=A+1ENDDO
RETU
FoxPro For Windows http://cc.synu.edu.cn 26
【 编程 11】 把 411分成两个数的和,其中一个数可以被
13整除,另一个数可以被 17整除,求两个数。
SET TALK OFF
CLEA
N=1
DO WHIL N*17<411
M=1
DO WHIL M*13<411
IF M*13+N*17=411
M*13,N*17
ENDIF
M=M+1
ENDDO
N=N+1
ENDDO
RETU