《2VFP第4部分(循环结构)》由会员分享,可在线阅读,更多相关《2VFP第4部分(循环结构)(43页珍藏版)》请在金锄头文库上搜索。
1、要点:要点: 1.算法的概念及特点算法的概念及特点 2.掌握程序掌握程序3种基本结构的表示种基本结构的表示 3.掌握利用分支结构编程掌握利用分支结构编程 4.掌握利用循环结构编程掌握利用循环结构编程 5.常用控件常用控件 第三、四、五讲第三、四、五讲第三、四、五讲第三、四、五讲 程序设计程序设计程序设计程序设计(1)(1)(1)(1) 循环结构能够使某些语句或程序段重复执行循环结构能够使某些语句或程序段重复执行若干次。若干次。 如果某些语句或程序段需要如果某些语句或程序段需要在一个固定的位在一个固定的位置上重复操作置上重复操作,使用循环是最好的选择。,使用循环是最好的选择。 3循环结构循环结构
2、常见的循环结构有:条件循环条件循环do do whilewhile步长循环步长循环for for 扫描循环扫描循环scanscan涉及数据表的循环,涉及数据表的循环,第第6章介绍章介绍1 1)条件循环()条件循环(do whiledo while循环)循环) 格式格式: 流程图:流程图:条件条件语句序列语句序列EnddoEnddo之后的语句之后的语句NY循环循环体体 教材P62【例例】计算计算1+2+3+1+2+3+100+100第第 1 1 步,步, 计算计算 0+0+1 1;第第 2 2 步,步, 计算计算 (0+1)+(0+1)+2 2;第第 3 3 步,步, 计算计算 (0+1+2)+
3、(0+1+2)+3 3; 第第 i i 步,步, 计算计算 ( (0+1+0+1+i-1+i-1)+)+i i; . . 第第 100 100 步,计算步,计算 (0+1+(0+1+99)+99)+100100; 递归递归算法算法前前i-1次累加和次累加和第第i次累加项次累加项三个三个“确定确定”循环三要素循环三要素算法:算法:确定确定循环变量循环变量i i并赋初值为并赋初值为1 1 定义定义s s存放累加和存放累加和, ,初值为初值为0 0 确定确定循环条件循环条件 i=100i=100s=s=s+is+i 确定确定循环变量的变化趋势循环变量的变化趋势i=i+1 i=i+1 输出结果输出结果
4、s s递推公式递推公式在条件循环中如何在条件循环中如何体现的?体现的?s=1+2+3+s=1+2+3+100+100基本方法基本方法: :属于属于“累加器累加器”类型问题类型问题 (1 1)在进入累加前先给累加器赋初值)在进入累加前先给累加器赋初值 s=0s=0(求和一般为求和一般为0 0)(2 2)用循环语句实现累加)用循环语句实现累加 循环控制变量赋初值:循环控制变量赋初值:i=1i=1 循环条件循环条件: :i=100i=100 循环变量的改变规律循环变量的改变规律: :i=i+1i=i+1(3 3)循环体语句的设计)循环体语句的设计 s=s=s+is+i ( (累加器当前值累加器当前值
5、= =累加器原值累加器原值+ +循环当前值循环当前值) ) i=100s=s+i i=i+1s=0, i=1开始开始结束结束输出输出sYN循环变量赋初值循环变量赋初值循环条件(循环条件(i大于大于100就结束)就结束)循环变量的变化趋势循环变量的变化趋势从从1变到变到100“计算计算”按钮的按钮的clickclick事件代码:事件代码:s=0s=0i=1i=1do while i=100do while i=100s=s=s+is+ii=i+1i=i+1enddoenddoThisform.text1.value=sThisform.text1.value=s循环体循环体【修改修改例例3-83
6、-8】计算计算s=1+2+3+s=1+2+3+n+n x: x=0 x=n x=x+1S: s=0 S=s+x“计算计算”命令按钮的命令按钮的“click”事件代事件代码:码:n=thisform.text1.value s=0x=1do while x=ns=s+xenddothisform.text2.value=s 说明:说明: 循环结构循环结构从从do whiledo while开始,到开始,到enddoenddo结束,两者必须成对出现结束,两者必须成对出现;在在enddoenddo后面可以书写注释后面可以书写注释。 循环是否继续取决于条件的当前循环是否继续取决于条件的当前取值,一般情
7、况下循环体中应含有取值,一般情况下循环体中应含有改变改变条件取值的命令或语句条件取值的命令或语句,否则将造成,否则将造成死死循环。循环。 循环结构能循环结构能自身嵌套自身嵌套( (多重循环多重循环) ),还能与选择结构的各种形式嵌套。,还能与选择结构的各种形式嵌套。2 2)步长循环()步长循环(forforendforendfor计计数循环)数循环) 格式格式: 教材P62确定循环变量并赋初值确定循环变量并赋初值( (在在FOR中实现中实现) )确定循环条件并判断?确定循环条件并判断?(在在FOR中实现中实现)执行循环体中语句序列执行循环体中语句序列循环体变量按步长变化循环体变量按步长变化(在
8、在FOR中实现中实现)执行执行ENDFORENDFOR之后的语句之后的语句计算计算1+2+3+1+2+3+100+100s=0s=0for i=1 to 100 for i=1 to 100 s=s=s+is+iendforendforThisform.text1.value=sThisform.text1.value=sstep 1( (教材教材P60)P60) 【例例3-93-9】设计如图所示表单,在文本框设计如图所示表单,在文本框text1text1中输入中输入N N的值,求的值,求N!N!。 如:如:123.100(1)给累乘器赋初值)给累乘器赋初值 p=1(一般为一般为1)(2)用循
9、环语句实现累乘)用循环语句实现累乘 循环变量赋初值循环变量赋初值:i=1 循环条件循环条件:i= thisform.text1.value 循环变量改变规律循环变量改变规律: i=i+1(3)循环体设计)循环体设计 p=p*i (累乘器当前值累乘器当前值=累乘器原值累乘器原值*循环当前值循环当前值 )基本方法基本方法: :属于属于“累乘器累乘器”类型问题类型问题 输入输入n ni=1i=1,fac=1fac=1 i=i=1 n=1 fac=fac*fac=fac*n n n=n-1 n=n-1 输出输出facfac 求求n n!的!的N-SN-S图图“计算计算”命令按钮的命令按钮的“Click
10、”事件代事件代码:码:p=1for i=1 to thisform.text1.valuep=p*iendforthisform.text2.value=p 说明说明: 步长可正可负,缺省为步长可正可负,缺省为1 1。 循环体中循环体中不应包含改变循环变不应包含改变循环变量值的命令量值的命令,否则循环次数将随之,否则循环次数将随之改变改变。 如果循环可以通过如果循环可以通过计数计数来控制,来控制,则本循环比条件循环更为方便。则本循环比条件循环更为方便。当循环当循环 步长循环步长循环 在文本框在文本框Text1Text1中输入终值中输入终值n n在文本框在文本框Text2Text2中输入步长中输
11、入步长k k i=1 for i=1 to n step k i=1 for i=1 to n step k do while i=n do while i=n endfor|nextendfor|next i= i=i+ki+k endddoendddo【练习练习1】求求100以内的奇数和。以内的奇数和。A=1+3+5+A=1+3+5+99+99循环变量循环变量初值初值n=1循环条件循环条件n100循环变量的变化循环变量的变化趋势趋势n=n+2请同学们自请同学们自己写出流程己写出流程图和程序图和程序循环体累加语句:循环体累加语句:A=A+n【练习练习2】求求循环变量循环变量初值初值x=1循环
12、条件循环条件xn循环变量的变化循环变量的变化趋势趋势x=x+1循环体累加语句:循环体累加语句:K=K+x2请同学们自请同学们自己写出流程己写出流程图和程序图和程序【练习练习3】 请同学们自请同学们自己写出流程己写出流程图和程序图和程序s=0for i=1 to 100s=s+(-1)(i+1)/iendforthisform.text1.value=s方法方法1:方法方法2:s=0k=1for i=1 to 100s=s+k/ik=-kendforthisform.text1.value=s命令按钮的命令按钮的“click”事件代码:事件代码:s1=0s2=0for i=1 to 99 ste
13、p 2s1=s1+1/iendforfor i=2 to 100 step 2s2=s2+1/iendforthisform.text1.value=s1-s2方法方法3:思考:计算思考:计算e e的近似值。其公式为:的近似值。其公式为:e e1+1/1!1+1/1!1/2!1/2!1/3!1/3!1/N!1/N!,直到直到1/N!0.0000011/N!=0.000001s=s+1/pp=p*ii=i+1enddothisform.text1.value=s阶乘累加【例例】求所有的水仙花数。求所有的水仙花数。(所谓水仙花数是指一所谓水仙花数是指一个三位数,其各位数字的立方和等于该数本身。个三
14、位数,其各位数字的立方和等于该数本身。编程方法:编程方法: “枚举法枚举法” 按问题本身的性质,一一列举出该问题所有按问题本身的性质,一一列举出该问题所有可能的解,并在逐一列举的过程中,检验每个可能的解,并在逐一列举的过程中,检验每个可能解是否是问题的真正解,若是,我们采纳可能解是否是问题的真正解,若是,我们采纳这个解,否则抛弃它。对于所列举的值,既不这个解,否则抛弃它。对于所列举的值,既不能遗漏也不能重复。能遗漏也不能重复。查找范围:查找范围:三位数三位数100999任意一个三位数任意一个三位数X百位数字百位数字X1十位数字十位数字X2个位数字个位数字X3判断这个三位数判断这个三位数x是水仙
15、花数的条件:是水仙花数的条件:X=x13+x23+x33【练习练习4】 100以内能够被以内能够被X整除的数之和。整除的数之和。开始开始S=0,i=1S=0,i=1输入输入X Xi=100i=100真真输出输出s s的值的值结束结束假假i=i+1i=i+1S=S=S+iS+iMod(i,XMod(i,X)=0)=0真真假假【练习练习5】找出所有的四位水仙花数找出所有的四位水仙花数开始开始S=0,i=1S=0,i=11000=i and i=99991000=i and i=9999真真输出输出y y结束结束假假i=i+1i=i+1分别取各位数分别取各位数Y=XY=X真真假假计算各位数立方和计算
16、各位数立方和y y【练习练习6】找出所有的三位回文数找出所有的三位回文数开始开始S=0,i=1S=0,i=1100=i and i=999100=i and i8x=Av56:YijB8逆序:逆序: 从右到左逐个取出从右到左逐个取出8 8 B Bj j i iY Y : : 6 6 5 5 v v A A 11 10 9 8 7 6 5 4 3 2 1 次数次数i(i(循环变量循环变量):):总次数总次数= =总的字符数总的字符数c=c+c=c+substr(x,i,1)substr(x,i,1)C=8BjiY:65vA C=8BjiY:65vA substr(x,i,1) substr(x,
17、i,1)总的字符总的字符数数len(xlen(x) )确定变量:确定变量:x x:存任意字符串:存任意字符串x= Av56:YijB8Av56:YijB8 i i:存截取次数:存截取次数(1len(x)(1len(x)c c:存逆序字符串:存逆序字符串 c=c+substr(x,i,1)c=c+substr(x,i,1)确定算法:确定算法:用循环在原字符串中从右到左逐个截取字符,重新组装用循环在原字符串中从右到左逐个截取字符,重新组装成逆序字符串成逆序字符串确定循环三要素:确定循环三要素:循环变量循环变量 : i (i: i (i初值为初值为len(xlen(x),),终值为终值为1)1)循环
18、条件循环条件: i=1: i=1循环条件改变:循环条件改变:i=i-1(i=i-1(从右到左截取从右到左截取) )【例例】输入一串输入一串ASCII字符,显示数字字符串。假设字符,显示数字字符串。假设输入:输入:Av56:YijB8 显示:显示:568。 请同学们自请同学们自己写出程序己写出程序从左到右逐个取出字符从左到右逐个取出字符x x判断判断x x是数字的条件:是数字的条件:Asc(xAsc(x)asc()asc(0 0) and ) and Asc(xAsc(x)asc()8 Av56:YijB8 显示:显示: AYB AYB 。 输入一串输入一串ASCIIASCII字符,显示小写字母
19、串。假设输入:字符,显示小写字母串。假设输入: Av56:YijB8 Av56:YijB8 显示:显示:vijvij 。请同学们自请同学们自己写出程序己写出程序【例例】如如图图所示一程序界面。文本框所示一程序界面。文本框TEXT1已已经输经输入入一串文字,一串文字,单击单击“转换转换”命令按命令按钮钮后,文本框的后,文本框的值值将将变变为为什么?什么?“转换转换” 命令按命令按钮钮的的CLICK CLICK 事件代事件代码码:N=LEN(THISFORM.TEXT1.VALUE)N=LEN(THISFORM.TEXT1.VALUE)Y=Y=DO WHILE N0DO WHILE N0 X=SU
20、BSTR(THISFORM.TEXT1.VALUE,N,1) X=SUBSTR(THISFORM.TEXT1.VALUE,N,1) IF ASC(X)= IF ASC(X)=ASC(aASC(a) X=UPPER(X) X=UPPER(X) ELSE ELSE X=LOWER(X) X=LOWER(X) ENDIFENDIF Y=X+Y Y=X+YN=N-1N=N-1ENDDOENDDOTHISFORM.TEXT1.VALUE=YTHISFORM.TEXT1.VALUE=YtHIS IS A cpu.【练习练习7】输入一个正整数判断这个是几位数。输入一个正整数判断这个是几位数。Command1
21、_click:x=thisform.text1.valueW=0 &位数计数器位数计数器If int(x)=x and x=0 do while x=1 x=int(x/10) w=w+1 enddo messagebox(你输入的是一个你输入的是一个+alltrim(str(w)+位数位数)Else messagebox(请输入正整数请输入正整数.)endif拓展拓展【练习练习8】将整数将整数x中每一位上为奇数的数依次取出,并逆中每一位上为奇数的数依次取出,并逆序构成一个新数返回。例如:程序运行时输入序构成一个新数返回。例如:程序运行时输入123456789,输出:,输出:b=97531。C
22、ommand1_click:x=thisform.text1.valuey=0 If int(x)=x and x=0 do while x=1 x1=mod(x,10) &记录从后向前的每一位数记录从后向前的每一位数 IF x1%2=1 &判断每一位是否为奇数判断每一位是否为奇数 y=y*10+x1 &逆序组合新数逆序组合新数 endif x=int(x/10) enddoElse messagebox(请输入正整数请输入正整数.)endif【练习练习9】有一数列:有一数列:1,1,2,3,5,8,13求出这个数列的前求出这个数列的前30项之和。(注意分子与分母的变化规律。)项之和。(注意分
23、子与分母的变化规律。)Command1_click:x=1a=1b=1W=a+b &和计数器和计数器do while x=28 c=a+b &计算第计算第n项的值项的值 w=w+c a=b &为计算为计算第第n+1项项做准备做准备 b=c x=x+1enddomessagebox(“前前30项的和是:项的和是:+alltrim(str(w)【练习练习10】有一分数序列:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13求出这个数求出这个数列的前列的前20项之和。(注意分子与分母的变化规律。)项之和。(注意分子与分母的变化规律。)Command1_click:w=0 &和计数器和计数器a=2 &记录分子记录分子b=1 &记录分母记录分母x=1do while x=20 w=w+a/b c=a a=b+a &形成下一项的分子形成下一项的分子 b=a &形成下一项的分母形成下一项的分母 x=x+1enddomessagebox(“前前20项的和是:项的和是:+alltrim(str(w)