十一,综合题
******************************************************************************* 一,多工作区,Replace,copy to . 例题 1: 涉及 set relation to 有如下表: (1) XS.DBF(学号 C(8),姓名 C(8),性别 C(2),班级 C(9),出生日期 D,走 读 L) (2) CJ.DBF(学号 C(8),课程名 C(20),成绩 N(5,1)) 说明:一个学生可以选择多门课程.请编写一个完整的程序,该程序能完成以下功能: 1, 将表 XS.DBF 和表 CJ.DBF 建立关联,并显示出所有男同学的姓名以及他们所选课程的 课程名 2, 将 XS.DBF 表中所有班级为\"2002 级 2 班\"的同学信息拷贝到新表 STUDENT.DBF 中, STUDENT .DBF 只含有学号,姓名,性别,走读四个字段 3,将姓名为\"王小平\"的同学的所有成绩提高 10% CLEAR CLOSE ALL SELE 2 USE CJ INDEX ON 学号 TO XH SELE 1 USE XS SET RELATION TO 学号 INTO B SET SKIP TO B LIST FOR 性别='男' FIELDS 姓名,B.课程名 COPY TO STUDENT FOR 班级='2002 级 2 班' FIELDS 学号,姓名,性别,走读 replace b.成绩 with b.成绩*1.1 for a.姓名=\"王小平\" 例题 2: 涉及 update 下面有两张表: 总分表:ZF.DBF 学号 姓名 语文 数学 总分 110 张三 114 李四 119 王二 成绩表: CJ.DBF 学号 语文 数学 110 67 65 114 89 67 119 78 95 按照成绩表的成绩修改总分表的成绩,并计算出总分表的总分字段 参考答案: CLOSE ALL SELE 2 USE CJ INDEX ON 学号 TAG XHCJ SELE 1 USE ZF INDEX ON 学号 TAG XHZF UPDA ON 学号 FROM B REPL 语文 WITH B.语文,数学 WITH B.数学 REPL ALL 总分 WITH 语文+数学 LIST 例题 3: 涉及 join with: 将 STUDENT.DBF 和 学生成绩.DBF 连接成新文件 NEW.DBF 表 1: student(学号 c(4),姓名 c(8),性别 L,出生日期 D,高考成绩 N(5,2)) 表 2: 学生成绩(学号 c(4),课程号 C(3),分数 N(2)) SELECT 1 USE STUDENT SELECT 2 USE 学生成绩 JOIN WITH A TO NEW FOR 学号=A.学号 ; FIEL 学号,A.姓名,A.性别,A.出生日期,课程号,分数 USE NEW LIST 如果再增加一张表,三表相连: 表 3: 课程(课程号 C(3),课程名称 C(10)) SELECT 1 USE STUDENT SELECT 2 USE 学生成绩 JOIN WITH A TO NEW FOR 学号=A.学号 SELE 1 USE NEW SELE 2 USE 课程 JOIN WITH
A
TO
STU
FOR
课程号=A.课程号
USE
STU
LIST
******************************************************************************* 二,累加,累乘 例 1:累加:求 1~100 的和 SUM=0 FOR I=1 TO 100 SUM=SUM+I ENDFOR ?'1~100 的总和为: ',SUM 使用 DO WHILE 实现: SUM=0 I=1 DO WHILE I<101 SUM=SUM+I I=I+1 ENDDO ?'1~100 的总和为: ',SUM 例 2:累乘:求 n! clear INPUT \"求 n!,请输入 n 的值:\" TO N MUL=1 FOR I=1 TO n MUL=MUL*I ENDFOR ?n,'的值为: ',MUL 例 3:输入 n 的值,求 1+1/2!+1/3!+1/4!+….+1/n! ( 阶乘 n!=1*2*3*4....*(n-1)*n ) CLEAR SUM=_①_ MUL=_②_ INPUT \"请输入 n 的值: \" TO N FOR i=1 TO N FOR j=1 TO i MUL=MUL*__③__ ENDFOR SUM= SUM+____④_____ ENDFOR ?'求得的总和为: ',SUM 答案:1: 0 2: 1 3: j 4: 1/mul 注意:外循环是累加,内循环是
累
乘
******************************************************************************* 三,双重循环:金字塔问题等 看书阅读: 1,P159 页:例 4.39 2,P160 页:例 4.40 3,求 1-100 间所有的质数 CLEAR ?'2,3 是质数' FOR I=4 TO 100 FOR J=2 TO INT(SQRT(I)) IF MOD(I,J)=0 EXIT ENDIF ENDFOR IF J> INT(SQRT(I)) ?I,'是质数' ENDIF ENDFOR 4,运行 XY.PRG 程序后,将在屏幕上显示如下乘法表: 1) 1 2) 2 4 3) 3 6 9 4) 4 8 12 16 5) 5 10 15 20 25 6) 6 12 18 24 30 36 7) 7 14 21 28 35 42 49 8) 8 16 24 32 40 48 56 64 9) 9 18 27 36 45 54 63 72 81 请对下面的程序填空: * * * 计算乘法 XY.PRG * * * CLEAR FOR J=1 TO 9 ?STR(J,2)+') ' FOR ______________ ?? ______________ ENDFOR ? ENDFOR RETURN 第一空 K=1 TO J 第二空 5,排序问题 STR(J*k,6) ******************************************************************************* 四,排序 输入 10 个数,将它们从小到大排列 分析: 用 i 代表趟数,j 代表次数 (1)10 个数要比较 9 趟 (2)每趟要比较的次数为 : 10-趟数 (3)每次比较: 如果当前数 a(j)大于 本次比较的最后一个数 a(10+1-i) 那么就交换,否则不交换 clear dime a(10) ?'输入 10 个数: ' for i=1 to 10 input \"请输入: \" to a(i) endfor for i=1 to 9 for j=1 to 10-i if a(j)>a(10-i+1) t=a(10-i+1) a(10-i+1)=a(j) a(j)=t endif endfor endfor list memo like
a 另外可以参看书:P162-163 页例 4.45
******************************************************************************* 五,查询:locate\\seek 有下列表: book(书名 C(20),作者 C(8),出版日期 D,内容简介 M) 编写程序:查询关于 foxpro 的图书. USE BOOK LOCATE FOR 'foxpro' $ 书名 IF ! FOUND() ?'没有关于 foxpro 的图书' ELSE DO WHILE ! EOF() CLEAR ?书名,作者,出版日期 ?内容介绍 WAIT \"是否继续查找?(Y/N)\" IF M$'nN' EXIT TO M ENDIF CONTINUE ENDDO ?\"全部显示完成\" ENDIF 注意:关键地方在于 1,什么地方用 locate,什么地方用 continue 2,if .. exit .. endif 3,do while not 的条件 使用 Locate 查找出所有入校总分在 580 及以上的所有同学信息 clear use 学生 locate for 入校总分>=580 do while .not. eof() disp
continu
enddo
?'
结
束
'
cancel
******************************************************************************* 六,循环插入新记录 编写程序,对于学生.dbf 能够在程序末尾循环插入新记录 CLEAR CLOSE ALL USE 学生 DO WHILE .T. APPE BLANK @5,20 SAY '学号' GET 学号 @5,40 SAY '姓名' GET 姓名 @7,20 SAY '性别' GET 性别 @7,30 SAY '出生年月' GET 出生年月 @9,20 SAY '入校总分' GET 入校总分 READ WAIT '你想继续插入新记录吗?(Y/N) : ' TO X IF X='N' OR X='n' EXIT ENDIF CLEAR ENDDO CLEAR LIST CLOSE ALL 类似: 编写程序,该程序能够顺序修改表学生.DBF 中的所有数据. (要求:必须使用 @行,列 say ... get .. 进行数据修改) CLEAR CLOSE ALL USE 学生 DO WHILE .T. @5,20 SAY '学号' GET 学号 @5,40 SAY '姓名' GET 姓名 @7,20 SAY '性别' GET 性别 @7,30 SAY '出生年月' GET 出生年月 @9,20 SAY '入校总分' GET 入校总分 READ WAIT '你想继续修改记录吗?(Y/N) : ' TO X IF X='N' OR X='n' EXIT ENDIF CLEAR SKIP ENDDO CLEAR LIST CLOSE
ALL
******************************************************************************* 七,参数传递\\变量的作用域 &&MAIN.PRG &&P1.PRG X1=1 PARA W1,W2 X2=2 PRIVATE W1 DO P1 WITH X1,X2 W1=W1*3 ?'X1='+STR(X1,1) W2=W2*4 ??'X2='+STR(X2,1)
RETURN X1=1 X2=2 DO P1 WITH X1,X1+X2 ?'X1='+STR(X1,1) ??'X2='+STR(X2,1) RETURN (1)第一次显示 X1,X2 的值是( ) A. 1 , 8 B. 3 , 8 C. 1 , 1 D. 8 , 8 (2)第二次显示 X1,X2 的值是( ) A. 1 , 2 B. 3 , 1 C. 3 , 2 D. 1 , 3 参考答案: B C 下面看第二个实例: 主程序 MCX2.PRG clea public i,j store 1 to i,j,k do scx2.prg ?\"主程序的输出结果:\" ?\"i=\"+str(i,2)+\" j=\"+str(j,2)+\" k=\"+str(k,2) cancel 子程序 scx2.prg clea private j,k i=i*2 j=j+1 k=j+1 ?\"子程序中输出的结果:\" ?\"i=\"+str(i,2)+\" j=\"+str(j,2)+\" k=\"+str(k,2) return 执行结果是: 子程序中输出的结果: i= 2 j= 3 k= 4 主程序的输出结果: i= 2 j= 1 k= 1 看等级考试中的题.(2003 年 10 月笔试) ******************************************************************************* 八,@行,列 say ... get ... default ... read 字幕问题: 1,有如下程序段,其功能是显示汉字\"2008 年北京申奥成功! \" 从屏幕的顶部移至底部,请填空补充该程序 CLEAR CH='2008 年北京申奥成功!' R=1 DO WHILE R<=23 @R,26 SAY SPACE(60) @__________, 26 SAY CH T=INKEY(0.2) _______________ ENDDO RETURN 答案为: R+1 R=R+1 答案说明:@R,26 SAY SPACE(60)的作用是将上一行显示的'2008 年北京申奥成功!' 清除掉,然后@R+1, 26 SAY CH 显示新一行的数据 R=R+1 是保证 do while 不是死循环 2,从左到右显示\"同志们,要到期末了,努力奋斗吧!!\"两次 clear s=space(80)+\"同志们,要到期末了,努力奋斗吧!!\"+space(40) for nn1=1 to 2 && 显示两次 for nn2=1 to 110 step 2 &&110=80+30,30 是那个字符串的宽度 @20,0 say substr(s,nn2,80) inkey(2,'H') endfor
endfor
******************************************************************************* 九,scatter/gather(本节选用的表是 学生.dbf) 掌握:1,scatter 是将一条记录的值 copy 到一个数组中. (对应一维数组) copy from array 则是多条记录拷贝到数组中. (对应二维数组) 2,scatter 和 copy from array 使用数组都可以不先定义,大小系统自己搞定 3,如果事先定义了的话,scatter 会自动扩展大小,而 copy from array 则不会 请大家阅读下面两个例题体会: 例 1:将\"江冰\"同学的名字修改成\"姜冰\" clear use 学生 locate for 姓
名=\"江冰\" if found() scatter to x &&思考:数组 X 应该有多少个单元?? list memo like x &&显示数组 X 的单元和值 x(2)=\"江冰\" gather from x wait clear list else ?\"对不起,没有江冰这个人\" endif close all 思考答案:6 个, 那个备注型和通用型不算. 当然,上个题改为下例也对: clear use 学生 locate for 姓名=\"江冰\" dime x(4) &&先定义数组 X 有 4 个单元 if found() scatter to x &&思考:数组 X 应该有多少个单元?? list memo like x &&显示数组 X 的单元和值 x(2)=\"江冰\" gather from x wait clear list else ?\"对不起,没有江冰这个人\" endif close all 思考答案:也是 6 个, 那个备注型和通用型不算,虽然定义了四个,但是会自动扩展 例 2:关于 copy to array 和 append from array clear use 学生 copy stru to new list copy to array y fields 学号,姓名,性别 &&思考:数组 Y 应该是什么样的?? Y(1,2)=\"张波\" &&将\"王小平改为了张波\" sele 0 use new append from array y list close all 思考答案: 数组 Y 是: y(10,3) 另外请分析本程序段的功能. 如果程序改为: clear use 学生 dime y(3,2) list copy stru to new copy to array y fields 学号,姓名,性别 &&思考:数组 Y 应该是什么样的?? Y(1,2)=\"张波\" sele 0 use new append from array y list close all 那么:数组 Y 是: y(3,2) 和 scatter 它们的区别: 不会自动扩展
执行程序观察结果.
看书:P168
页第七题!
!
******************************************************************************* 十,数组 1,排序问题. 2,书:163-164 例 4.46-4.47 1, 数组的定义 DIMENTION 数组名(数值表达式 1,[数组表达式 2...]) 定义后单元默认值为.F. 2,一维数组 (1),定义一个一维数组: dime a(10) ---定义一个 10 数组,且所有单元默认值为.F. (2),赋值: 例如: a='' a(1)=20 a(3)={^2002/09/23} a(7)=.T..... 循环赋值: dime a(10) i=1 do while i<=10 input '请输入数:' to a(i) i=i+1 enddo 或者是: for i=1 to 10 input '请输入数:' to a(i) endfor (3),显示值: for i=1 to 10 ?a(i) endfor 使用 do while 大家思考 方法 2:list memo like a 3,二维数组 例如:dime s(5,4) (1),赋值: 例如: s=0 s(3,4)=.t. s(12)='xixi' ..... 相当于 s(3,4)='xixi' (2),循环赋值 for i=1 to 5 for j=1 to 4 input '输入值:' to a(i,j) endfor endfor (3),显示值: for i=1 to 5 for j=1 to 4 ??a(i,j)+space(2) endfor endfor
******************************************************************************* 十一,综合题 例 1: 数据表 JY.DBF 的内容如下: Record # 借书证号 借书日期 1 0010 02/01/99 2 0007 05/04/99 3 0006 02/03/99 4 0010 05/17/99 数据表 JYR.DBF 的内容如下: Record # 借书证号 姓名 职称 1 0006 孟小梅 教授 2 0010 郑财勇 讲师 3 0007 王志军 助教 且:JYR 库以借书证号为关键字建立了索引,索引文件为 JYR.IDX 程序如下: SELECT 1 USE JYR INDEX JYR SELECT 2 USE JY SET DEVICE TO PRINT &&注意: 有了这句话下面显示的结果都会发送到打印机 H=1 DO WHILE .NOT. EOF() TS=DATE()-借书日期 IF TS>80 SELECT 1 SEEK B.借书证号 IF TS>100 .OR. 职称<>'教授' @H,4 SAY 姓名+'同志,您借的书已过期,请归还' H=H+1 ENDIF SELECT 2 ENDIF SKIP ENDDO SET DEVICE TO SCREEN RETURN (1)设当前系统日期为 06/15/99,程序将打印( )还书的信息 A. 孟小梅,郑财勇各一行 B.孟小梅一行,郑财勇两行 C. 孟,郑,王各一行 D.孟,郑,王三人共五行 参考答案: A (2)高级职称和其它职称借书的最多天数分别是( ) A.81 天,101 天 B.100 天,80 天 C.80 天,100 天 D.101 天,81 天 参考答案: B (3)本程序的功能是: ) ( A.查询接书证号 B.查询借书日期 C.书未还书者 D.查询并打印超期未还书者 参考答案: D 例 2: CLEAR OPEN DATABASE emplorer USE compen SCAN FOR RECNO()<=10 IF 姓名='李强' LOOP ENDIF ?姓名,实发工资 ENDSCAN USE CLOSE DATABASE (1)compen 是: ) ( A.自由表 B.数据库表 C.数据库 D.可能是自由表,也可能是数据库表 答案是 D (2)若数据库有 50 条记录,则程序的功能是: ) ( A. 前 10 条记录中搜索\"李强\"的记录 B.列出前 10 条记录 C.每 10 条记录一屏显示记录,但不显示\"李强\"的记录 D.列出前10条记录,但是不显示\"李强\"的记录 答案是 D (3)循环结束后,指针指向( ) A. 第 1 条 B.最后一条 C.第 10 条 D.最后 1 条记录加 1 答案是 D 请注意: scan 循环是从第一条做到最后一条,然后在根据 for 条件选择处理哪些记录. 循环完成后一定 EOF()为.t. 另外:注意区分 exit 和 loop 的作用是:exit 退出循环,loop 只是结束本次循环 请不能区分的同学下来再问. 请大家注意:Scan 的使用方法,考试很可能要涉及到的 这儿也给大家举例比较一下三种循环操作表:三种方法实现显示出全部的男生.
-----------------------------使用 DO WHILE 循环 : CLEAR CLOSE ALL USE 学生 DO WHILE NOT EOF() IF 性别='男' DISP ENDIF SKIP ENDDO CLOSE ALL -----------------------------使用 FOR 循环 : CLEAR CLOSE ALL USE 学生 COUNT TO X GO TOP FOR I=1 TO X IF 性别='男' DISP ENDIF SKIP ENDFOR CLOSE ALL -----------------------------使用 SCAN 循环 : CLEAR CLOSE ALL USE 学生 SCAN FOR 性别='男' DISP ENDSCAN CLOSE ALL -----------------------------例3: 1, CLEAR M=0 FOR X=1 TO 10 IF MOD(X,3)=0 M=M+X ENDIF ENDFOR ?M RETURN (1)该程序的功能是:求 1 到 10 之间() A. 能被 3 整除数的个数 B. 能被 3 整除数的和 C. 不能被 3 整除数的个数 D. 不能被 3 整除数的和 答案是:B (2)该程序执行的结果是: ) ( A. 3 B. 10 C. 18 D. 37 答案是:C 上机考试程序部分说明 1)注意题目要求是一个完整程序,不要写题号 1,2,3 之类 2)如果题目涉及到表的操作,请第一条命令可以先发 close all clear 最后条命令请书写: close all return 3)注意检查是否存盘到了指定的位置,是否是在项目中建立的程序
因篇幅问题不能全部显示,请点此查看更多更全内容