,*,Visual Foxpro 6.0,程序设计基础,重庆工商大学计算机学院计算机基础教研室,Visual Foxpro 6.0程序设计基础重庆工商大学计,要点:,1.,算法的概念及特点,2.,掌握程序,3,种基本结构的表示,3.,掌握利用分支结构编程,4.,掌握利用循环结构编程,5.,常用控件,第三、四、五讲 程序设计,(1),要点:第三、四、五讲 程序设计(1),循环结构能够使某些语句或程序段重复执行若干次。,如果某些语句或程序段需要,在一个固定的位置上重复操作,,使用循环是最好的选择。,3,循环结构,常见的循环结构有:,条件循环,do while,步长循环,for,扫描循环,scan,涉及数据表的循环,第,6,章介绍,循环结构能够使某些语句或程序段重复执行若干次。3,1,)条件循环(,do while,循环),格式,:,流程图:,条件,语句序列,Enddo,之后的语句,N,Y,循环体,教材,P62,1)条件循环(do while循环)条件语句序列Enddo之,【,例,】,计算,1+2+3+100,【例】计算1+2+3+100,第,1,步,计算,0+,1,;,第,2,步,计算,(0+1)+,2,;,第,3,步,计算,(0+1+2)+,3,;,第,i,步,计算,(,0+1+,+i-1,)+,i,;,.,第,100,步,计算,(0+1+,+99)+,100,;,递归算法,前,i-1,次累加和,第,i,次累加项,第 1 步,计算 0+1;递归算法前i-1次累加和第i,三个,“,确定,”,循环三要素,算法:,确定,循环变量,i,并赋初值为,1,定义,s,存放累加和,初值为,0,确定,循环条件,i=100,s=s+i,确定,循环变量的变化趋势,i=i+1,输出结果,s,递推公式,在条件循环中如何体现的?,s=1+2+3+,+100,三个“确定”算法:递推公式在条件循环中如何体现的?s=1+,基本方法,:,属于“累加器”类型问题,(,1,)在进入累加前先给累加器赋初值,s=0,(,求和一般为,0,),(,2,)用循环语句实现累加,循环控制变量赋初值:,i=1,循环条件,:,i=100,循环变量的改变规律,:,i=i+1,(,3,)循环体语句的设计,s=s+i,(,累加器当前值,=,累加器原值,+,循环当前值,),基本方法:属于“累加器”类型问题(1)在进入累加前先给累加,i=100,s=s+i,i=i+1,s=0,,,i=1,开始,结束,输出,s,Y,N,循环变量赋初值,循环条件(,i,大于,100,就结束),循环变量的变化趋势,从,1,变到,100,i=100s=s+is=0,i=1开始结束输出sY,“,计算”按钮的,click,事件代码:,s=0,i=1,do while i=100,s=s+i,i=i+1,enddo,Thisform.text1.value=s,循环体,“计算”按钮的click事件代码:循环体,【,修改,例,3-8】,计算,s=1+2+3+n,x:x=0,x=n,x=x+1,S:s=0,S=s+x,【修改例3-8】计算s=1+2+3+n x:x=0S,“,计算”命令按钮的“,click”,事件代码:,n=thisform.text1.value,s=0,x=1,do while x=n,s=s+x,enddo,thisform.text2.value=s,“计算”命令按钮的“click”事件代码:,说明:,循环结构,从,do while,开始,到,enddo,结束,两者必须成对出现,;,在,enddo,后面可以书写注释,。,循环是否继续取决于条件的当前取值,一般情况下循环体中应含有,改变条件取值的命令或语句,,否则将造成,死循环。,循环结构能,自身嵌套,(,多重循环,),,还能与选择结构的各种形式嵌套。,说明:,2,)步长循环(,for,endfor,计数循环),格式,:,教材,P62,确定循环变量并赋初值,(,在,FOR,中实现,),确定循环条件并判断?,(,在,FOR,中实现,),执行循环体中语句序列,循环体变量按步长变化,(,在,FOR,中实现,),执行,ENDFOR,之后的语句,2)步长循环(forendfor计数循环)教材P6,计算,1+2+3+,+100,s=0,for i=1 to 100,s=s+i,endfor,Thisform.text1.value=s,step 1,计算1+2+3+100s=0step 1,(,教材,P60),【,例,3-9】,设计如图所示表单,在文本框,text1,中输入,N,的值,求,N!,。,如:,123.100,(教材P60)【例3-9】设计如图所示表单,在文本框tex,(,1,)给累乘器赋初值,p=1,(,一般为,1,),(,2,)用循环语句实现累乘,循环变量赋初值,:,i=1,循环条件,:,i=thisform.text1.value,循环变量改变规律,:,i=i+1,(,3,)循环体设计,p=p*i,(,累乘器当前值,=,累乘器原值*循环当前值,),基本方法,:,属于“累乘器”类型问题,(1)给累乘器赋初值基本方法:属于“累乘器”类型问题,输入,n,i=1,fac=1,i=1,fac=fac*,n,n=n-1,输出,fac,求,n,!的,N-S,图,输入n 求n!的N-S图输入n 求n!的N-S图,“,计算”命令按钮的“,Click”,事件代码:,p=1,for i=1 to thisform.text1.value,p=p*i,endfor,thisform.text2.value=p,“计算”命令按钮的“Click”事件代码:,说明,:,步长可正可负,缺省为,1,。,循环体中,不应包含改变循环变量值的命令,,否则循环次数将随之改变,。,如果循环可以通过,计数,来控制,则本循环比条件循环更为方便。,说明:,当循环 步长循环,在文本框,Text1,中输入终值,n,在文本框,Text2,中输入步长,k,i=1 for i=1 to n step k,do while i=n ,endfor|next,i=i+k,endddo,当循环 步长循环,【,练习,1】,求,100,以内的奇数和。,A=1+3+5+,+99,循环变量,初值,n=1,循环条件,n100,循环变量的变化,趋势,n=n+2,请同学们自己写出流程图和程序,循环体累加语句:,A=A+n,【练习1】求100以内的奇数和。A=1+3+5+99循环,【,练习,2】,求,循环变量,初值,x=1,循环条件,xn,循环变量的变化,趋势,x=x+1,循环体累加语句:,K=K+x,2,请同学们自己写出流程图和程序,【练习2】求循环变量循环条件xn循环变量的变化循环体累加语,【,练习,3】,请同学们自己写出流程图和程序,【练习3】请同学们自己写出流程图和程序,s=0,for i=1 to 100,s=s+(-1)(i+1)/i,endfor,thisform.text1.value=s,方法,1,:,方法,2,:,s=0,k=1,for i=1 to 100,s=s+k/i,k=-k,endfor,thisform.text1.value=s,s=0方法1:方法2:s=0,命令按钮的“,click”,事件代码:,s1=0,s2=0,for i=1 to 99 step 2,s1=s1+1/i,endfor,for i=2 to 100 step 2,s2=s2+1/i,endfor,thisform.text1.value=s1-s2,方法,3,:,命令按钮的“click”事件代码:方法3:,思考:计算,e,的近似值。其公式为:,e,1+1/1!,1/2!,1/3!,1/N!,,直到,1/N!=0.000001,s=s+1/p,p=p*i,i=i+1,enddo,thisform.text1.value=s,阶乘,累加,“计算”命令按钮的“click”事件代码:阶乘累加,【,例,】,求所有的水仙花数。,(,所谓水仙花数是指一个三位数,其各位数字的立方和等于该数本身。,编程方法:“枚举法”,按问题本身的性质,一一列举出该问题所有可能的解,并在逐一列举的过程中,检验每个可能解是否是问题的真正解,若是,我们采纳这个解,否则抛弃它。对于所列举的值,既不能遗漏也不能重复。,【例】求所有的水仙花数。(所谓水仙花数是指一个三位数,其各位,查找范围:,三位数,100999,任意一个三位数,X,百位数字,X1,十位数字,X2,个位数字,X3,判断这个三位数,x,是水仙花数的条件:,X=x1,3,+x2,3,+x3,3,查找范围:三位数100999任意一个三位数X百位数字X1十,【,练习,4】,100,以内能够被,X,整除的数之和。,开始,S=0,i=1,输入,X,i=100,真,输出,s,的值,结束,假,i=i+1,S=S+i,Mod(i,X)=0,真,假,【练习4】100以内能够被X整除的数之和。开始S=0,i=,【,练习,5】,找出所有的四位水仙花数,开始,S=0,i=1,1000=i and i=9999,真,输出,y,结束,假,i=i+1,分别取各位数,Y=X,真,假,计算各位数立方和,y,【练习5】找出所有的四位水仙花数开始S=0,i=11000,【,练习,6】,找出所有的三位回文数,开始,S=0,i=1,100=i and i=999,真,输出,i,结束,假,i=i+1,取个位数,a1,和百位数,a3,a1=a3,真,假,【练习6】找出所有的三位回文数开始S=0,i=11008,逆序:,从右到左逐个取出,8,B,j,i,Y,:,6,5,v,A,11 10 9 8 7 6 5 4 3 2 1,次数,i(,循环变量,):,总次数,=,总的字符数,c=c+,substr(x,i,1),C=8BjiY:65vA,substr(x,i,1),总的字符数,len(x),x=Av56:YijB8逆序:从右到左逐个取出8Bj,确定变量:,x,:存任意字符串,x=,Av56:YijB8,i,:存截取次数,(1len(x),c,:存逆序字符串,c=c+substr(x,i,1),确定算法:,用循环在原字符串中从右到左逐个截取字符,重新组装成逆序字符串,确定循环三要素:,循环变量,:i(i,初值为,len(x),终值为,1),循环条件,:i=1,循环条件改变:,i=i-1(,从右到左截取,),确定变量:确定算法:用循环在原字符串中从右到左逐个截取字符,,【,例,】,输入一串,ASCII,字符,显示数字字符串。假设输入:,Av56:YijB8,显示:,568,。,请同学们自己写出程序,从左到右逐个取出字符,x,判断,x,是数字的条件:,Asc(x)asc(,0,)and Asc(x)8,显示:,AYB,。,输入一串,ASCII,字符,显示小写字母串。假设输入:,Av56:YijB8,显示:,vij,。,请同学们自己写出程序,【例】输入一串ASCII字符,显示大写字母串。假设输入:Av,【,例,】,如图所示一程序界面。文本框,TEXT1,已经输入一串文字,单击“转换”命令按钮后,文本框的值将变为什么?,“,转换,”,命令按钮的,CLICK,事件代码:,N=LEN(THISFORM.TEXT1.VALUE),Y=,DO WHILE N0,X=SUBSTR(THISFORM.TEXT1.VALUE,N,1),IF ASC(X)=ASC(a),X=UPPER(X),ELSE,X=LOWER(X),ENDIF,Y=X+Y,N=N-1,ENDDO,THISFORM.TEXT1.VALUE=Y,tHIS IS A cpu.,【例】如图所示一程序界面。文本框TEXT1已经输入一串文字,,【,练习,7】,输入一个正整数判断这个是几位数。,Command1_click:,x=thisform.text1.value,W=0,&,位数计数器,If int(x)=x and x=0,do while x=1,x=int(x/10),w=w+1,end