《VFP第3、4、5部分(程序算法及顺序分支循环).ppt》由会员分享,可在线阅读,更多相关《VFP第3、4、5部分(程序算法及顺序分支循环).ppt(77页珍藏版)》请在三一办公上搜索。
1、Visual Foxpro 6.0,程序设计基础,重庆工商大学计算机学院计算机基础教研室,要点:1.算法的概念及特点 2.掌握程序3种基本结构的表示 3.掌握利用分支结构编程 4.掌握利用循环结构编程,第三、四、五讲 程序设计(1),算法及算法的表示,一、算法的概念及特点 所谓算法就是对解决问题所采用的方法和步骤的描述。,二、算法的描述 算法的描述方法有很多,为直观、准确地表示一个问题的处理方法和步骤,通常采用流程图的方法。流程图是用一些几何图形符号、线条及文字说明来表征一个问题的处理过程。一般采用传统流程图和N-S图来描述算法。,(教材P51)【例3-1】设计如图所示表单,在文本框text1
2、中输入华氏温度,单击“计算”按钮可以求出对应的摄氏温度,并在文本框text2中显示。,“计算”按钮的“Click”事件代码如下:fascels=5*(fas-32)/9thisform.text2.value=round(cels,1)&结果保留1位小数,描述方法1用自然语言表示步骤1:输入华氏温度fas。步骤2:按照公式,计算摄氏温度cels。,步骤3:输出摄氏温度。,描述方法2 用流程图表示如图所示。,描述方法3用N-S流程图如图所示。,一个算法应该具有以下特点:教材P52 确定性。有穷性。有效性。输入。输出。,任何一个问题能否让计算机处理,关键在于能否设计出合理的算法,有了合适的算法,再
3、使用合适的计算机语言来编写程序。VFP就是一种语言工具。要用VFP编写出高质量的程序,一方面要构建合理的算法,另一方面要掌握VFP的语法规则,它是实现算法的基础。,命令有一定的书写规则:1、命令分行。程序中每条命令都以回车键结尾,一行只能写一条命令。若命令需分行书写,应在一行终了时键入续行符“;”,然后按回车键。,2、命令注释。程序中可以插入注释,以提高程序的可读性。注释语句,NOTE|*注释部分&注释部分,格式:,行首注释,单命令的行尾注释,三、3种基本结构的表示 程序的3种基本结构:顺序结构、选择(或分支)结构、循环结构,它们构成了实现一个算法的基本单元。,顺序结构:是一种最基本、最简单的
4、程序结构。如下图所示,先执行A,再执行B,A与B按照顺序执行。,选择(或分支)结构:根据条件是否成立而执行不同的程序模块。,循环结构:是指重复执行某些操作,重复执行的部分称为循环体。,1、基本的输入/输出命令,常用命令(用于结构化程序),1)INPUT命令,INPUT TO,格式:,例如:s=100 input 请输入:to a?a=,a 执行上述命令,若输入的内容为s+20,则 输出结果,2)ACCEPT命令,ACCEPT TO,格式:,例如,把上例中的input改成accept:s=100accept 请输入:to b?b=,b执行上述命令,若输入的内容为s+20,则 输出结果,3)基本输
5、出命令,?|?,,格式:,常用输入输出控件(用于可视化程序),1)输入控件,2)输出控件,文本框,标签、文本框,fas,thisform.text2.value=round(cels,1),程序设计实例,顺序结构程序实例分支(选择)结构程序实例循环结构程序实例,1顺序结构 顺序结构是在程序执行时,根据程序中语句的书写顺序依次执行的命令序列。Visual FoxPro系统中的大多数命令都可以作为顺序结构中的语句。,教材P53,(教材P52)【例3-2】设计如图3-5所示表单,在文本框text1、text2、text3中输入三角形的三边,单击“计算”按钮可以在文本框text4中显示三角形的面积。其
6、计算公式为,(其中a,b,c为三角形的三边,area为三角形的面积),“计算”按钮的“Click”事件代码如下:=(a+b+c)/2area=sqrt(*(-a)*(-b)*(-c)thisform.text4.value=round(area,1),2分支(选择)结构 分支结构是在程序执行时,根据不同的条件,选择执行不同的程序语句,用来解决有选择、有转移的诸多问题。,多路分支语句,常见的分支结构有:,IF语句,流程图,1)IF语句 格式:,见教材P57,条件?,语句序列1,语句序列2,Y,N,ENDIF之后的命令,(教材P53)【例3-3】修改【例3-2】,在文本框text1、text2、t
7、ext3中输入三角形的三边,单击“计算”按钮,如果输入的三边能构成三角形,则在文本框text4中显示三角形的面积;否则用提示框给出提示信息:不能构成三角形,重新输入!。如图所示。,“计算”按钮的“Click”事件代码如下:if a+bc and a+cb and b+ca=(a+b+c)/2 area=sqrt(*(-a)*(-b)*(-c)thisform.text4.value=round(area,1)elsemessagebox(不能构成三角形,重新输入!)thisform.text1.value=0thisform.text2.value=0thisform.text3.value=
8、0thisform.text4.value=0thisform.text1.setfocus endif,EXM1:判断某一年是否是闰年。,假如年份用y表示,判断y是否是闰年的方法是:若y能够被400整除或y能够被4整除并且不能够被100整除,y/4=int(y/4)and y/100int(y/100)or y/400=int(y/400),提示:判断一个整数M能否被另一个整数N整除,一般采用三种方法,判断:MOD(M,N)是否等于0INT(M/N)是否等于M/NM%N=0若等于,则表明M能被N整除。,CLEARINPUT 请输入年份:to yIF y/4=int(y/4)and y/100
9、int(y/100)or y/400=int(y/400)?str(y,4)+年是闰年ELSE?str(y,4)+年不是闰年ENDIFRETURN,结构化方法,程序设计及运行,表单设计(参考教材p54例3-4),设计界面,(教材P53)【例3-5】已知一元二次方程的3个系数,求一元二次方程的根。求根公式:,“求解”命令按钮的“Click”事件代码如下:a=thisform.text1.value b=thisform.text2.value c=thisform.text3.value if a=0messagebox(二次项系数为0,这不是一个一元二次方程)else d=b2-4*a*cif
10、 d=0 x1=round(-b+sqrt(d)/(2*a),2)x2=round(-b-sqrt(d)/(2*a),2)thisform.text4.value=x1 thisform.text5.value=x2elsemessagebox(该方程没有实数根!)endifendif,EXM2:输入两个数,比较大小,并输出较大数。,表单设计界面,表单运行结果,方法一:双分支,方法二:单分支,表单设计界面,EXM3:输入两个数,比较大小,并按从大到小的顺序输出。,使用单分支结构:,容器A,容器B,容器C,1,3,交换,1、C=A2、A=B3、B=C,表单设计界面,表单运行结果,分支的嵌套EXM
11、 4:比较任意三个数的大小,并输出较大数。,输入三个数a,b,c,ab?,ca?,cb?,输出c,输出a,输出c,输出b,结束,N,Y,Y,N,N,Y,表单设计界面,表单运行结果,4)多分支语句 格式:(见教材58页)流程图:,ENDCASE后面的语句,EXM 5:输入月份值,显示对应季节的中文名字(3,4,5月为春季,6,7,8月为夏季,9,10,11月为秋季;12,1,2月为冬季)。(参考教材P56例3-6),“输出”命令按钮的click事件代码:yf=val(thisform.text1.value)do casecase yf=3 or yf=4 or yf=5jj=春季case yf
12、=6 or yf=7 or yf=8jj=夏季case yf=9 or yf=10 or yf=11jj=秋季case yf=12 or yf=1 or yf=2jj=冬季endcasethisform.label3.caption=jj,注意:ifendif,do caseendcase必须配对出现,表示分支的开始和结束。为使程序清晰易读,对分支、循环等结构应使用缩格书写方式。,表达分支、循环的每种语句都不允许在一个命令行中输完,必须按格式一行一行地键入,因此,不能出现在命令窗口中。三种选择结构之间可以相互嵌套,但不能交叉。,循环结构能够使某些语句或程序段重复执行若干次。如果某些语句或程序段
13、需要在一个固定的位置上重复操作,使用循环是最好的选择。,3循环结构,常见的循环结构有:,条件循环,步长循环,扫描循环,涉及数据表的循环,第6章介绍,1)条件循环(do while循环)格式:流程图:,条件,语句序列,Enddo之后的语句,N,Y,循环体,教材P62,第 1 步,计算 0+1;第 2 步,计算(0+1)+2;第 3 步,计算(0+1+2)+3;第 i 步,计算(0+1+i-1)+i;.第 100 步,计算(0+1+99)+100;,递归算法,EXM6:计算s=1+2+3+100,前i-1次累加和,第i次累加项,基本方法:,属于“累加器”类型问题,(1)在进入累加前先给累加器赋初值
14、(求和一般为0)(2)用循环语句实现累加 循环变量赋初值;循环条件;循环变量的改变规律(3)循环体语句的设计 累加器当前值=累加器原值+循环变量当前值,三个“确定”循环三要素,算法:确定循环变量i并赋初值为1 定义s存放累加和,初值为0 确定循环条件 i=100s=s+i 确定循环变量的变化趋势i=i+1 输出结果s,递推公式,在条件循环中如何体现的?,s=1+2+3+100,cleas=0i=1do while i=100s=s+ii=i+1enddo?1+2+3+.+100=,sreturn,循环体,程序及运行结果,EXM7:计算s=1+2+3+n。(参看教材P59例3-8),“计算”命令
15、按钮的“click”事件代码:n=thisform.text1.value s=0 x=1do while x=ns=s+xenddothisform.text2.value=s,说明:循环结构从do while开始,到enddo结束,两者必须成对出现;在enddo后面可以书写注释。循环是否继续取决于条件的当前取值,一般情况下循环体中应含有改变条件取值的命令或语句,否则将造成死循环。循环结构能自身嵌套(多重循环),还能与选择结构的各种形式嵌套。,2)步长循环(forendfor计数循环)格式:,教材P62,计算s=1+2+3+100,cleas=0for i=1 to 100 s=s+iend
16、for?1+2+3+.+100=,sreturn,step 1,(教材P60)【例3-9】设计如图所示表单,在文本框text1中输入N的值,求N!。,(1)给累乘器赋初值(一般为1)(2)用循环语句实现累乘 循环变量赋初值;循环条件;循环变量改变规律(3)循环体设计 累乘器当前值=累乘器原值*循环变量当前值,如:123.100,基本方法:,属于“累乘器”类型问题,“计算”命令按钮的“Click”事件代码:p=1p=p*iendforthisform.text2.value=p,说明:步长可正可负,缺省为1。循环体中不应包含改变循环变量值的命令,否则循环次数将随之改变。如果循环可以通过计数来控制
17、,则本循环比条件循环更为方便。,当循环 步长循环 input“请输入终值:”to n input“请输入步长:”to k i=1 for i=1 to n step k do while i endfor|next i=i+k endddo,EXM8:求100以内的奇数和。,A=1+3+5+99,循环变量初值n=1,循环条件n100,循环变量的变化趋势n=n+2,请同学们自己写出程序,循环体累加语句:A=A+n,EXM9:求,循环变量初值x=1,循环条件xn,循环变量的变化趋势x=x+1,请同学们自己写出程序,循环体累加语句:K=K+x2,EXM10:求所有的水仙花数。(所谓水仙花数是指一个三
18、位数,其各位数字的立方和等于该数本身。,编程方法:“枚举法”按问题本身的性质,一一列举出该问题所有可能的解,并在逐一列举的过程中,检验每个可能解是否是问题的真正解,若是,我们采纳这个解,否则抛弃它。对于所列举的值,既不能遗漏也不能重复。,查找范围:,三位数100999,任意一个三位数,判断这个三位数x是水仙花数的条件:X=x13+x23+x33,表单设计界面,表单运行结果,例:1+2+n 1到n的奇数和、偶数和 100以内能够被X整除的数之和。,请同学们自己写出程序,(教材P60-61)【例3-10】设计如图1所示表单。运行该表单,在文本框Text1中输入一串字符,单击“逆序显示”命令按钮后,
19、逆序显示该字符串,如图2所示。,图1,图2,x=“Av56:YijB8,A,v,5,6,:,Y,i,j,B,8,c=c+substr(x,i,1),确定变量:x:存任意字符串x=Av56:YijB8 i:存截取次数(1len(x)c:存逆序字符串 c=c+substr(x,i,1),确定算法:用循环在原字符串中从右到左逐个截取字符,重新组装成逆序字符串,确定循环三要素:循环变量:i(i初值为len(x),终值为1)循环条件:i=1循环条件改变:i=i-1(从右到左截取),EXM12:输入一串ASCII字符,显示数字字符串。假设输入:Av56:YijB8 显示:568。,请同学们自己写出程序,从
20、左到右逐个取出字符x,判断x是数字的条件:,Asc(x)asc(0)and Asc(x)asc(9),例:输入一串ASCII字符,显示大写字母串。假设输入:Av56:YijB8 显示:AYB。输入一串ASCII字符,显示小写字母串。假设输入:Av56:YijB8 显示:vij。,请同学们自己写出程序,例:如图所示一程序界面。文本框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+YN=N-1ENDDOTHISFORM.TEXT1.VALUE=Y,tHIS IS A cpu.,