版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章之循环结构程序设计5.2.5循环结构程序设计1.DOWHILE循环语句在解决实际问题时,有许多操作(特别是对大量数据的处理)往往需要重复进行。在程序中这种处理要求反复执行某段程序,而且每次使用的数据都按一定规律变化,这种程序结构称为循环结构。
VFP提供了三种循环结构语句。基本流程Dowhile循环[格式]DOWHILE<条件表达式><语句序列1>[LOOP][EXIT]……ENDDO[<注释>]举例:计算10!的值并输出。1!=1×1,2!=1!×2,3!=2!×3,……,n!=(n-1)!×n。以S存放阶乘,则顺序执行以下赋值语句,S=(n-1)!S=S*n=(n-1)!×n=n!当N<=10S=1,N=1S=S*NN=N+1产生自然数,计数SETTALKOFFCLEARS=1&&暂存阶乘值N=1&&控制循环次数,兼产生自然数DOWHILEN<=10S=S*NN=N+1ENDDO?“10!=”,SSETTALKON例:设有一张足够大的厚度为0.5毫米的纸,问至少折叠多少次可以达到(或超过)珠穆朗玛峰(8848.13米)。折叠,hight=hight×2,n=n+1厚度hight=0.5是否超过朱峰是不再折叠否继续折叠计数,折叠几次,n=0n=0hight=0.5dowhile.t.hight=hight*2n=n+1ifhight>=8848.13*1000exitendifenddo?”为超过珠峰高度,应折叠”+str(n)+”次”Dowhilenoteof()循环用来处理数据表DOWHILENOTEOF()或DOWHILEEOF=.F.
<语句组>
SKIPENDDOSCAN循环该语句是为处理数据表而设计的循环语句。[格式]SCAN[<范围>][FOR/WHILE<条件表达式>]<语句序列>[EXIT][LOOP]ENDSCAN说明:通过循环依次处理给定范围符合条件的每一条记录,语句本身自动移动记录指针。For循环[格式]FOR<内存变量>=<数值表达式1>TO<数值表达式2>STEP<数值表达式3><语句序列>[EXIT][LOOP]ENDFOR|NEXT求1000之内所有奇数之和。S=1+3+5+……+999S=0&&初始化SForI=1to1000step2&&产生1,3,5……,999S=s+iEndfor?”1000之内所有奇数之和为:”+str(s)练习:求1000之内所有不能被3整除的整数之和。FOR循环语句举例举例:用试探法求解百鸡问题,“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一,百钱百鸡,问鸡翁、母、雏各几何?”设:X—公鸡,Y—母鸡,Z—小鸡x=1,y=1,z=1x=1,y=1,z=2x=1,y=1,z=3……x=1,y=1,z=300x=1,y=2,z=1x=1,y=2,z=2……x=1,y=2,z=300...x=1,y=33,z=1x=1,y=33,z=2……x=1,y=33,z=300x=2,y=1,z=1x=2,y=1,z=2x=2,y=1,z=3……x=2,y=1,z=300...……x=20,y=1,z=1x=20,y=1,z=2x=20,y=1,z=3……x=20,y=1,z=300...Forx=1to20Fory=1to33Forz=1to300Ifx+y+z=100.&.5*x+3*y+z/3=100是否输出x,y,zforx=1to20fory=1to33forz=1to300if5x+3y+z/3=100.and.x+y+z=100?“公鸡=”,x?”母鸡=”,y?“小鸡=”,z
endif
endfor
endfornext几个例子输出九九乘法表j从1数到9&&表示行数i=1&&i表示j行的第几列i从1数到j不换行输出公式,公式格式为“1*1=1”,由于i,j均为数值,]所以要用函数str换行note九九乘法表settalkoffclearj=1dowhilej<=9i=1dowhilei<=j??str(j,1)+"*"+str(i,1)+"="+str(i*j,2)+space(2)&&输出公式
i=i+1
enddo?&&换行
j=j+1enddosettalkonreturnN个数排序对n个数进行排序(从小到大)思路:1)两两比较,前者大于后者就交换
——冒泡法
2)第一个数和后面几个数比较,大于就交换,再让第二数和后面的数比较…——选择法冒泡法
7105172
7105172
7510172
7510217
第一轮比较完了,最大的数沉底了,比较4次
7510217
5710217
5710217
5721017
7510172第二轮比较完了,最大的两个数沉底了比较3次冒泡法
5721017
5721017
52
71017
第三轮比较完了,倒数第三个最大的数沉底了,比较2次
52
71017
25
71017
5个数需比较4轮,每比较一轮,一个较大的数沉底,n个数两两比较:需比较n-1轮,第1轮比较n-1次,第2轮比较n-2次,第n-1轮比较一次,第j轮比较n-j次冒泡法(沉底法)10个数比较大小,从小到大输入10个数给a[1]~a[10]forj=1to10-1fori=1to10-ja[i]>a[i+1]
真假
a[i]与
a[i+1]交换输出a[1]到a[10]选择法
7105172
7105172
5107172
2107175
5107172第一轮比较完了,最小的数在最前边比较4次,拿第1个数和其他比较
2107175
2
710175
2
710175
2510177
第二轮比较完了,最小的两个数最前边比较3次,拿第2个数和后边的比较选择法
2510177
2510177
2571710
第三轮比较完了,最小的三个比较出来了,比较2次,拿第3个数和后边的数比较
2571710
25
71017
5个数需比较4轮,每比较一轮,一个较小的数就比较出来了,n个数比较:需比较n-1轮,第1轮:第一个数和后面的n-1个数比较第2轮:第2个数和后面的n-2个数比较,第j轮:第j个数和后面的n-j个数比较,选择法10个数比较大小,从小到大输入10个数给a[1]~a[10]forj=1to10-1fori=jto10a[j]>a[i]
真假
a[j]与
a[i]交换输出a[1]到a[10]SETTALKOFFCLEARINPUT"请输入共有几个数:"TONDECLAREX[n]FORI=1TON S=STR(I) INPUT"请输入第&s.个数:"TOX[i]NEXTFORJ=1TON-1 FORI=1TON-J IFX[i]>X[i+1] T=X[i] X[i]=X[i+1] X[i+1]=T ENDIF NEXTNEXTFORI=1TON ??X[i]NEXT循环程序练习1.编制一个检查用户口令的程序,允许用户从键盘上输入三次口令,若其中一次正确,则在屏幕上显示“欢迎您使用本系统!”,若三次口令都不正确,则在屏幕上显示“请向管理员申请权限!”,并退出。假设口令为“master”,保存在某内存变量中。note三次输入口令settalkoffclearpwd=space(6)accept"请输入口令:"topwdfori=1to3ifpwd="master"clear?"欢迎您使用本系统!"exitelseifi=3clear?"请向管理员申请权限!"elseclearaccept"口令不正确,请第"+str(i+1,1)+"次输入:"topwd
endif
endifendforsettalkonreturn2。从键盘上接受一个字符串,以相反的顺序将其显示出来(例如,若输入为“aBxyxty1”,则输出应为“1ytxyxBa”)。
settalkoffclears=""accept"请输入一个字符串:"toafori=len(a)to1step-1s=s+substr(a,i,1)endfor?"该字符串的相反顺序为:"+ssettalkonreturn3.从键盘上输入一个三位数,若该数能被3整除且末位数为5则显示该数,否则显示“该数不符合要求”。4.从键盘上接受一个字符串,统计该字符串中包含的数字字符(0~9)的总个数并显示出来。5.2.6子程序及其调用在程序中,可能某些程序段需要多次使用,但又不是连续使用可通过循环来完成。我们可以把具有特定功能的程序段独立成单独的程序文件称子程序。其他程序在使用时可以调用子程序,调用子程序的程序称主程序。
主程序和子程序在逻辑意义上有主从调用关系,但在物理意义上都是独立的命令文件,存储于磁盘上。5.2.6子程序及其调用1.子程序调用语句[格式]
DO<子程序名>[WITH<实参表>]说明:调用子程序时,经常需要在主程序和子程序之间传递数据。可以使用两种方法传递数据:一是利用内存变量传递数据,二是利用参数传递数据。如果使用参数传递数据,应使用WITH短语,实参数用表达式表示,表达式中若有内存变量必须先定义。实参数把表达式的值传递给子程序的形式参数,并接收子程序形式参数的数据,因此参数传递数据是双向的。调用子程序后实参变量被隐匿起来。实参数若接收数据,只能使用内存变量(不能用表达式)的形式。子程序调用可以嵌套。5.2.6子程序及其调用2.参数传递语句[格式]
PARAMETERS<形参表>说明:主程序用DO命令的WITH短语传递参数,子程序则用该语句接收参数,它必须是子程序的第一条可执行语句。形式参数用内存变量的形式表示,由该语句定义,勿须再定义。子程序中的形式参数与主程序实参表中的实际参数,其数量、位置、数据类型应相对应。5.2.6子程序及其调用3.返回主程序语句[格式]RETURN[TOMASTER|TO<程序名>|<表达式>]说明:结束子程序的运行,返回主程序调用子程序语句的下一条语句继续执行。
TOMASTER是在多级程序被调用时直接返回主程序,而TO<程序名>返回到指定程序。<表达式>只用于用户自定义函数,将表达式的值返回给调用程序。
RETURN可以放在子程序的最后一条语句,在子程序的其它地方也可以放置,作为有条件返回主程序的另一出口。子程序调用举例举例1:用内存变量在主程序和子程序之间传递数据。已知m和为n正整数,且m>n,计算组合:m和n的值由键盘输入,用子程序求任意数的阶乘。子程序调用用内存变量在主程序和子程序间传递数据内存变量主程序子程序数据数据2.调用子程序5.返回主程序1346内存变量的作用域定义内存变量的名字一般与应用中的含义相吻合,这就很容易产生不同的程序使用同名内存变量,处理不当很容易造成数据混乱。
VFP有几种类型的内存变量,各自的作用范围不同,应防止内存变量间互相干扰。1.局部型内存变量程序中未加任何定义说明的内存变量都是局部变量。它具有如下性质:(1)局部变量在定义它的程序运行结束后立即被清除。(2)主程序中定义的局部变量在子程序中继续有效,上一级子程序定义的局部变量在下一级子程序继续有效,反之则不可以。所以,局部型内存变量在子程序嵌套时,使用权具有单向性。内存变量的作用域2.全局型内存变量全局型内存变量用PUBLIC命令来定义。[格式]PUBLIC<内存变量名表>
或PUBLIC[ARRAY]<数组名1>(<数值表达式1>[,<数值表达式2>])[,<数组名2>(<数值表达式3>[,<数值表达式4>])……]说明:全局型内存变量定义后对所有程序都有效,包括主程序、各级子程序及其它项目的程序,并一直保留在内存中,除非用RELEASE或CLEARALL命令清除。全局型内存变量定义后才能被赋值,已定义的局部型内存变量不可再定义为全局型内存变量。命令窗口定义的内存变量为全局型变量。内存变量的作用域3.隐蔽型内存变量隐蔽型内存变量用PRIVATE命令定义。[格式]PRIVATE<内存变量名表>
或
PRIVATEALL[LIKE<标识符>|EXCEPT<标识符>]说明:该命令对先前程序定义的内存变量或数组进行屏蔽,之后可以建立与隐蔽变量同名的内存变量,但不影响被隐蔽的变量。当前程序执行完,隐蔽变量被恢复。一般在子程序中隐蔽主程序或上一级子程序使用的变量,再在当前程序中同名使用。命令中选择ALL将所有内存变量隐蔽;ALLLIKE<标识符>仅隐蔽与标识符匹配的变量;ALLEXCEPT<标识符>仅隐蔽与标识符不匹配的变量。标识符中使用通配符”*”和”?”进行匹配。内存变量的作用域举例:
S1.PRGA=1&&局部变量
C=3&&局部变量
PRIVATED&&隐蔽型变量
D=DATE()DOS2?A,B,CRETU
输出结果为:SUBA=2SUBC=ABCSBUD=2001/08/08223S2.PRGPUBLICB&&全局变量PRIVATEC&&隐蔽型变量C="ABC"B=2A=A+1?"SUBA=",A?"SUBC=",C?"SUBD=",DRETU内存变量的作用域通过例子我们可以看到:1)主程序中的局部变量A,虽然在子程序中未定义,仍可在子程序中使用;(2)主程序中的PRIVATE变量D也可在子程序中使用;(3)子程序中的PRIVATE变量D不能在主程序中使用,它与主程序中的D毫无关系,起到了屏蔽上层的作用。总之为了取得所调用的下一级程序的变量值,可以在上一级程序中定义该变量(局部变量或隐蔽型变量),或在下一级程序中定义该变量为全局变量,如B;
为了使不同层次的程序使用同名变量,又不致造成混乱(同名不同值),可以在低层次程序中定义隐蔽型变量。内存变量的作用域隐蔽型变量注:在子程序调用时,当主程序使用DO<程序名>WITH<实参表>命令后,实参中的内存变量被隐匿起来。子程序可以使用与实参变量同名的内存变量,但不会影响实参变量的值。但子程序返回时,PARAMETERS<形参表>命令会通过形式参数把数据传递给曾被隐匿的实参内存变量,改变实参变量的值。这与隐蔽变量是不同的。(见课本172页zichengxu.prgsub1.prgyincang.prgsub2.prg)4.区域型内存变量区域型内存变量用LOCAL命令定义。区域型内存变量仅限于定义它的程序中使用。命令格式同PRIVATE。5.2.7过程和自定义函数1.过程及过程文件的概念子程序是完成某一功能的程序,它以独立的文件形式存储在磁盘中。子程序在调用过程中存在一些缺点:(1)执行RETURN命令后,子程序便在内存中消失,下次调用该程序时,需再次打开该文件并调入内存;当多次调用子程序时,多次访问磁盘文件降低了程序运行速度。(2)在子程序多层嵌套时,同时要打开多个文件,但系统能同时打开的文件数量有限,也增加系统的负担。(3)命令文件再小也占具一个基本存贮空间(1Kb),当系统很大子程序很多时,不但浪费存贮空间,也不便于管理和维护。过程及过程文件的概念解决的方法是,把每一个子程序作为过程文件中的一个“过程”,整个过程文件是磁盘中的一个文件,进行存储。当打开过程文件时,过程文件中的所有过程都调入内存。再调用过程就象调用子程序一样,只是从内存中调用,而不是再从磁盘中调用。此外,过程也可以放在程序文件的后面,逻辑上与主程序分开,过程只能放在主程序之后。过程、过程文件及其调用2.建立过程文件建立过程文件的方法同建立一般命令文件一样,默认扩展名为.PRG,过程文件中可以包含若干个过程。[过程格式]
PROCEDURE<过程名>[(<形参表>)]|PARAMETERS(<形参表>)
<过程语句序列>[RETURN[TOMASTER|<过程名>]]
ENDPROC建立过程文件说明:过程名是标示符,不同于文件名,没有扩展名,最多254个字符,定义规则同变量名。过程如果用参数传递数据,形参表有两种形式表示。一是放在过程名后面的圆括号中;二是使用参数传递语句parameters(<形参表>),但要紧放在过程标识语句PROCEDURE之后。形参的表示只能取其中的一种。RETURN语句可以缺省,系统隐含最后有该语句。过程若放在程序文件的后面,过程格式相同。过程文件的使用及过程的调用1.打开过程文件在调用过程文件中的过程之前,一定要先打开过程文件。[格式]
SETPROCEDURETO<过程文件名1>[,<过程文件名2>……][ADDITIVE]说明:打开一个或多个过程文件。选择[ADDITIVE]在打开新的过程文件时,不关闭已打开的过程文件。过程文件的使用及过程的调用2.调用过程[格式]
DO<过程名>[WITH<实参表>]说明:打开过程文件后,就可以随时用该语句调用其中的过程。该语句也可以调用本程序中的过程,以及程序嵌套中任一个程序所包含的过程,也可以调用子程序。查找被调用过程的顺序是:(1)本程序中的过程(2)已打开过程文件中的过程(3)程序嵌套中某程序中的过程(4)与过程名相同的独立命令文件(子程序)。过程文件的使用3.关闭过程文件[格式]
SETPROCEDURETO
或CLOSEPROCEDURE此外,CLOSEALL、CLEARALL在关闭所有文件时也关闭过程文件。4.过程的嵌套调用过程中调用其他过程就是过程的嵌套调用,若过程中调用过程本身,称为“递归”调用。递归调用过程自己调用自己。用递归调用计算1到10的和。s=s+10s=0s=s+9s=s+8……s=s+1dosubwith10,sdosubwithM-1,s...*rexam.prgsettalkoffsetproceduretorexams=0dosumwith10,s?scloseprocedurereturnproceduresumparameterm,ss=s+mifm>1
dosumwithm-1,sendifreturn递归调用用户自定义函数
VFP系统为用户提供了很多函数,但也允许用户自己定义函数。函数与过程(或子程序)一样具有某一功能,但是函数可以在表达式中调用,返回一个函数值。每一个自定义函数都对应于一个程序,它与过程及子程序非常相似,而且存储形式也相仿。程序中使用自定义函数,能使程序清晰简捷。独立自定义函数独立自定义函数与子程序很相似,它所对应的程序单独以命令文件形式存储,文件名即函数名。[格式][PARAMETERS<形参表>]
<自定义函数语句序列>RETURN<表达式>说明:自定义函数的调用与系统函数调用相同。如果有参数传递,自定义函数调用形
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年外研版七年级英语下册核心知识点教学设计
- 2025-2026学年外研版(2024)七年级英语下册期末知识点教学设计
- 2026年山东海事职业学院单招职业技能考试题库有答案详细解析
- 2026年重庆工程职业技术学院单招职业技能考试题库附答案详细解析
- 2026年长白山职业技术学院单招职业适应性测试题库及答案详细解析
- 2026年江苏海事职业技术学院单招职业适应性测试题库附答案详细解析
- 2025年度环卫车辆采购合同
- 2024年三年级品社下册《主题3 友爱是相同的》教学设计2 上海科教版
- 2025年高中地理 2.3大气环境教学设计 湘教版必修1
- 2.1 生物与环境的相互关系(教学设计)九年级科学下册同步高效课堂(浙教版)
- 吉林市2024~2025学年度初中毕业年级第一次阶段性教学质量检测 语文(含答案)
- 新工科大学英语 课件 Unit 1 Future by design;Unit 2 Living smarter,living better
- 2025年路桥专业中级试题及答案
- 纺织厂5S管理课件
- 乡风文明建设课件
- 毕业设计(论文)-水下4自由度抓取机械臂设计-scara机器人
- HSK4标准教材课件
- 云南省中药材产地加工(趁鲜切制)指导原则、品种目录、风险提示清单、中药材质量标准制定指导原则
- 金融风控模型建设及管理规范
- T/CSBME 070-2023计算机断层成像(CT)临床图像质量评价
- 《陶瓷工艺概览:课件中的釉料组成与特性》
评论
0/150
提交评论