VFP第11部分(循环辅助语句及多重循环)解析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例:以下程序段与VFP命令: DELETE WHILE 性别="男" .and. 政治面貌="群众" 等效,请填空完成。 Go top do while .not.eof() if 性别<>"男" ① endif if 政治面貌="群众" ①exit ② ②delete endif skip enddo
例:编写输出乘法口诀表的程序,要求口诀 表呈三角形格式输出。
1*1=1 2*1=2 3*1=3 4*1=4 5*1=5 . . . 9*1=9
2*2=4 3*2=6 4*2=8 5*2=10 . . 9*2=18
3*3=9 4*3=12 4*4=16 5*3=15 5*4=20 5*5=25 9*3=27 9*4=36 9*5=45 … 9*9=81
3种循环结构
Do while….enddo for….endfor scan….endscan
循环辅助语句
loop: 通常又称为中途复始语句或 短路语句。
exit:通常又称为中途退出语句或 循环终止语句。
流程图:
N
条件 Y 语句序列 LOOP EXIT
enddo的下一条命令
【例】 来。
将10到20中第一个能被3整除的数找出
xs
do while .t. && accept "请输入学生的学号:" to xh if len(alltrim(xh))=0 exit If alltrim(xh)=“#” endif ? “姓名 专业班级 课程号 成绩" scan for 学号=xh &&内循环 ?xs.姓名,xs.籍贯,课程号, endscan enddo close all set safety on return
找到满足条件的最 大数,结束循环
【例】 来。
将10到20中所有不能被3整除的数找出
for n=10 to 20
if n/3=int(n/3)
loop
结束本次循环, 转入下一次循 环条件的判断
endif
?n endfor
【例】 求300以内能被17整除的所有整数。
for x=1 to 300 if x%17!=0
例:逐条显示xsda.dbf中女生的记录并统 计人数。
clea use xsda vs=0 do whil not eof() if 性别=“男” skip loop else disp vs=vs+1 skip endi endd ?”女生人数为:”,vs retu
scan if 性别=“男” loop else disp vs=vs+1 endi ends
例(0802).
有一程序如下,请写出运行结果。
CLEAR DIMENSION A(3,3) FOR I=1 TO 3 FOR J=1 TO 3 IF I<>J A(I,J)=0 ELSE A(I,J)=9 ENDIF ??A(I,J) ENDFOR ? ENDFOR CANCEL
9 0 0
0 9 0
①mn(6)
②scatter to mn
③skip
例(0801)以下程序的功能是统计100以内能被 8整除的整数的个数。 X=0 N=0 ①x/8<>int(x/8) DO WHILE X<=100 或 mod(x,8)<>0 X=X+1 或 x%8<>0 IF ② n=n+1 LOOP ENDIF ENDDO ?N
clear for i=1 to 5 for j=1 to ??'*' endfor ? endfor return
&&控制行 2*i-1 &&控制列
例:编程打印图形:
* *** ***** ******* ********* ***********
for i=1 to 6 && 用于控制行 ?space(6-i) for j=1 to 2*i-1 && 用于控制每行的字符个数 ??“*” && 每行输出的字符 endfor endfor
所有累加 项可以看 成右图
1 1+2 1+2+3 1+2+3+4 ……………… …………………… 1+2+3+4+5+6+7+8+9+10
方法一: clear sum=0 t=0 for i=1 to 10 t=t+i sum=sum+t endfor ?'sum=',sum return
方法二: clear思考:P29实验12 任务2 sum=0 ( 3 )计算 e 的近似值。用 for i=1 to 10 双重循环怎么做? t=0 for j=1 to i t=t+j 累加 endfor sum=sum+t endfor ? "1+(1+2)+(1+2+3)+…+(1+2+3+…+10) =",sum return
方法二: CLEAR yn="y" do while upper(yn)="Y" accept "请输入部门:" to bm clea ?space(15)+bm+"部门" select stu.姓名 as 学生姓名,关系 as 亲属关系, 亲属姓名 as 亲属名单 from stu,fam ; where stu.学号=fam.学号 and 部门=bm to screen wait "是否还要继续?(y/n)" to yn enddo retu
涉及表的双重循环
例:利用学生.dbf和选课.dbf,通过反复输入学生的 学号(输入回车键退出),查询学生的姓名、籍贯、
方法1: set safety off sele 1 use 学生 alias xs index on 学号 tag xh sele 2 use set relation to 学号 into
例:计算100 以内的奇数和
mod(I,2)=0 或 int(i/2)=i/2
s=0 i=0 do while .t. i=i+1 if i>100 永真 exit 循环 endif if i%2=0 loop 还有哪些等价 else 的表达式? s=s+i endif enddo ? "100以内的奇数和为:",s cancel
多重循环(掌握双重循环)
外循环初始条件 假 外循环条件
二重 循环 嵌套 结构 执行 流程
真 内循环初始条件 假 内循环结束 改变外循环 循环条件
内循环条件 真 内循环体 改变内循环循 环条件
外循环结束
例:利用双重循环编程求sum=1+(1+2)+ (1+2+3)+…+(1+2+3+…+10)之值。
方法2: clear all do while .t. accept "请输入学生的学号:" to xh if len(alltrim(xh))=0 exit endif select 姓名,籍贯,课程号,成绩 from 选课 xk,学生 xs where xs.学号=xh and xk. 学号=xs.学号 to screen enddo
clea for x=1 to 9 &&控制行 for y=1 to x &&控制列 s=x*y ??allt(str(x))+"*"+allt(str(y))+; "="+allt(str(s))+ " " endf ? 什么意思,可 endf 以省略吗? retu
例:编程打印如下图形:
* *** ***** ******* *********
例:下列程序判断一个自然数n是否为素 数,其方法是用2到 n 之间的数逐个去除, 若余数都不为0,则n为素数,否则不是素 数,请填空完成。
INPUT "请输入一个大于1的自然数:" TO N Y=1 &&Y=1表示所输入的自然数是素数,为0表示不是素数 X=INT(SQRT(N)) I=2 DO WHILE I<=X IF N%I___①____ ____②_____ LOOP ELSE Y=0 EXIT ① <>0 ENDIF ②i=i+1 ENDDO IF Y=1 ③str(n) ?____③______ +"是素数" ELSE ?N,"不是素数" ENDIF RETURN
loop
else
?x
endif endfor
例:写出程序 的结果 实验13 任务1(2)
结果为:8 16 24 32 40 48
x=.t. s=0 do whil x s=s+1 if s/8=int(s/8) ?s else loop endi if s>40 x=.f. endi endd retu
学号 KI01 KI02 KI03 KI04 KI05
学生情况表ST.DBF 姓名 性别 王子仪 女 李丽萍 女 张雨 男 马思成 男 陈艳 女
总成绩 409 512 390 400 395 学号 KI01 KI01 KI02 KI03 KI03 KI03 KI04 KI05 KI05
例(实验指导书 P40) :现有两个表 文件,表结构及部分 记录如下
例(0802)定义一个一维数组MN,将数据表 XZ.DBF(6个字段)中的每条记录存入该数组,并 将该数组的值依次显示出来,请填空。
CLEAR DIMENSION ① USE XZ DO WHILE .NOT.EOF() ② I=1 DO WHILE I<7 ??MN(I) I=I+1 ENDDO ③ ? ENDDO USE
方法一: clear set talk off sele 1 use st inde on 学号 tag xh sele 2 use fam set rela to 学号 into a
yn="y" do while uppe(yn)="Y" accept "请输入部门:" to bm clea ?space(15)+bm+"部门" ?"学生姓名 亲属关系 亲属名单" scan for 部门=bm ?a.姓名+" "+关系+" "+亲属姓名 ends wait "是否还要继续?(y/n)" to yn enddo close all set talk on return
家庭情况表FAM.DBF 亲属姓名 关系 部门 王松 父亲 DE3 刘利 母亲 DE1 李永 父亲 DE1 张永强 父亲 DE5 赵雯 母亲 DE7 张明 哥哥 DE3 李翠花 母亲 DE3 陈兴平 父亲 DE5 陈大伟 爷爷 DE2
编写程序,反复输入部门,查询亲属在该部门工作 的学生名单(即按亲属工作部门查询学生)。要求输出式 如下(假设输入的部门为DE3): DE3 部 门 学生姓名 亲属关系 亲属姓名 王子仪 父亲 王松 张明 哥哥 张明 马思成 母亲 李翠花
For n=10 to 20 if n%3=0 ?n exit endif endfor
结束当前循环,跳出 exit所在的循环结构
【例】 求300以内能被17整除的最大的数。
for x=300 to 1 step -1 if mod(x,17)=0 ?x exit endif endfor
从大数开始,第 一次找到的就 是最大值
0 0 9
例(0901).读如下程序,写出运行结果: CLEAR DIME W1(5) X='A' 1 AAAAA W1="" 2 BBBB FOR I=5 TO 1 step -1 3 CCC FOR J=1 TO I 4 DD W1(I)=W1(I)+X 5 E ENDFOR X=CHR(ASC(X)+1) ?6-I,W1(I) ENDFOR