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