




已阅读5页,还剩92页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,第八讲 (六)程序调试 (七)结构化程序设计综合实例,第3章 结构化程序设计,2,3, Visual FoxPo程序设计的概念,一、什么是程序,Visual FoxPro提供了一种程序执行方式,这种方式就是预选把需要执行的多条命令按一定的结构组成一个有机序列以文件的形式存储在磁盘上,这个文件就称为程序文件或命令文件。,4,其中,把Visual FoxPro提供的命令、函数和控制语句有机的组成一个计算机可执行的序列,这个序列的设计、编码和调试的过程编写调试程序。,使用计算机解决实际问题,通常是先要对问题进行分析并建立数学模型,然后考虑数据的组织方式和算法,并用某一种程序设计语言编写程序,最后调试程序,使之运行后能产生预期的结果。这个过程称为程序设计。,5,二、 Visual FoxPro程序设计语言的特点,1、语言丰富、自成体系,2、人机对话功能,3、高效的结构化程序设计功能,Visual FoxPro程序具有顺序、分支、循环三种基本结构。 Visual FoxPro的语句没有标号,程序的走向完全靠控制块控制。一般来讲, Visual FoxPro程序由一主控程序和若干子控程序组成。任何一个程序的逻辑结构均可由顺序结构、分支结构、循环结构组合而成。,6, 顺序结构, 分支选择结构(选择结构),循环结构,1.当型循环结构:当条件成立时反复执行,直到条件不成立; 2.直到型循环结构:先执行, 再判断条件是否成立,若为假(不 成立),继续执行,直到条件为真(成立), 用循环结构编程时,要注意出现死循环。,死循环:一种永远也跳不出循环体的循环。,7,!注意: 程序的每一行只能书写一条语句,并且一行最多只能有255个字符(包括空格)。如果一条语句一行写不完,可以用“;”续行,每一个语句用回车键结束。,8,9,10,算法,如果需要解决一个实际问题,从拿到任务到得到结果,要经过以下几个阶段: 1、分析问题; 2、确定处理方案; 3、确定操作步骤; 4、根据操作步骤编写源程序; 5、将程序输入计算机并使之运行; 6、整理输出结果,写出有关文档资料。,一、利用计算机处理问题的过程,11,计算机处理一个实际问题的主要过程,12,二、算法的概念,在上述六个步骤中,第1、2步一般与实际问题的专业有关,第36步则是程序人员的职责。其中最关键的是第3步,即“算法设计”,只要算法是正确的,写程序就不会有太多困难。所谓“算法”,粗略地说,是为解决一个特定问题而采取的确定的、有限的步骤。,三、算法的表示流程图,例2 求一个班学生的平均成绩。设A等(85)12人,B等(70分)16人,C等(60分)6人,D等(50分)5人。,例3 输入一个数x ,如果它的值为正,则打印x的值。,例4 输入10个数,把其中的正数打印出来。,13,14,N,Y,15,16,程序的建立与运行,一、Visual FoxPro程序的建立,1、用Visual FoxPro本身提供的文本编辑器来建立和编辑,命令窗口方式: MODIFY COMMAND ,菜单窗口方式:,文件的保存:,2、用WPS建立和编辑VFP程序文件,3、用DOS的EDIT编辑器来建立和编辑VFP程序文件,17,二、 Visual FoxPro程序文件的执行,1、命令窗口方式: DO ,2、菜单窗口方式,3 、直接单击工具栏中的红色惊叹号。,4、右击程序编辑窗口标题栏,弹出快捷菜单, 选择执行命令。,18,一、迭加(累加)法, 典型算法 ,19,和积综合计算 1、有限个符合条件的整数的和积计算; 2、有特殊规律的分数的和的计算; 3、逆积式的计算。 这类计算要注意两个要点:一是用来表示计算结果的初始化值。二是计算的过程是否正确。这类问题出现在填空题和改错题中的可能性非常大。主要考核程序设计的基本功。,20,举例:,例1 利用循环结构求1100之和。,MODI COMM EX121.PRG,SET TALK OFF CLEAR S=0 I=1,方法一,21,DO WHILE I=100 S=S+I I=I+1 ENDDO 10,10 SAY “ 1-100的和S=“; FONT 仿宋体,30 STYLE I; GET S FONT 仿宋体,30 ; STYLE I SET TALK ON RETURN,22,方法二,SET TALK OFF CLEAR S=0 FOR I=1 TO 100 S=S+I ENDFOR,23,10,10 SAY “ 1-100的和S=“; FONT 仿宋体,30 STYLE I; GET S FONT 仿宋体,30 ; STYLE I SET TALK ON RETURN,24,循环控制条件恒为真,要使用EXIT语句 结束循环,在这种循环结构中,控制条件恒为真,只能 依靠包含在IF ENDIF或DO CASE ENDCASE 结构中的EXIT语句来退出循环。,例2: 求连乘数1*2*3*4*5 ,当积大于720时 退出程序。,MODI COMM EX122.PRG,25,SET TALK OFF CLEAR I=1 S=1 DO WHILE .T. S=S*I I=I+1 IF S720 EXIT ENDIF ENDDO I=I-1 &最后一个乘数,方法一,26,10,10 SAY “连乘数的积S=“; FONT 魏碑体,28 STYLE B; GET S FONT 魏碑体,28; STYLE B FUNCTION B 14,10 SAY “最后一个乘数是”; FONT 魏碑体,28 STYLE B; GET I FONT 魏碑体,28; STYLE B FUNCTION B SET TALK ON RETURN,27,SET TALK OFF CLEAR S=1 FOR I= 1 TO 800 S=S*I IF S720 EXIT ENDIF ENDFOR ?”最后一个乘数是” FONT 魏碑体,28 STYLE B,I FONT “”,28 ? “连乘数的积S=“FONT “”,28,S FONT “”,28 SET TALK ON RETURN,方法二,28,例3,已知 S1=1,S2=1+2,S3=1+2+3, Sn= 1+2+3,+n,编写一程序求 S1+ S2+ +S100的和。,MODI COMM EX738PRG,29,SET TALK OFF CLEAR N=1 S=0 DO WHILE N=100 I=1 SUB=0 DO WHILE I=N SUB=SUB+I,30,I=I+1 ENDDO S=S+SUB N=N+1 ENDDO ? S1+S2+ +S100=,S SET TALK ON RETURN,31,SET TALK OFF DO WHILE .T. CLEAR ACCEPT 请选择代码:1问候; 2 循环 3 退出 TO CHOICE DO CASE CASE CHOICE=1 ?,例4 根据输入代码执行相应操作,32,? Good! 您好! WAIT “请按任一键继续” WINDOW; TIMEOUT 15 CASE CHOICE=2 I=1 S=0 DO WHILE I=100 S=S+I I=I+1 ENDDO,33,? ? 1+2+3+ +100=,S WAIT “请按任一键继续” WINDOW; TIMEOUT 15 CASE CHOICE=3 EXIT ENDCASE ENDDO SET TALK ON RETURN,【例3.15】求和:,,当n=100时的S值,Y,N,n%3=1,*prog3_15.prg,求和S,SET TALK OFF CLEAR S=0 FOR n=1 TO 100 IF n%3=1 S=S+1/n ELSE S=S-1/n ENDIF ENDFOR ?” S=”,S SET TALK ON,【例3.16】已知一个数列的前三项为0,0,1,以后各项都是其相邻的前三项之和,求该数列前30项之和。,*prog3_16.prg,求 SET TALK OFF CLEAR S=1 &因为数列前三项的计算不包含在循环体中 f1=0 f2=0 f3=1,FOR n=4 TO 30 ff= f1+f2+f3 S=S+ff f1=f2 f2=f3 f3=ff ENDFOR ?” S=”,S SET TALK ON,38,二、穷举法 所谓穷举法是从有限个对象中一个一个的进行判断,选择符合要求的对象进行处理。主要有两种处理类型:一是符合要求的对象的统计计算,如个数的计算、累加和的计算、连乘积的计算;二是寻找最大(或最小)对象。穷举法必须使用循环及选择分支结构才能实现其功能。,39,例3.17:我国古代数学家在算经中出了一道题:“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、鸡雏各几何?”,X+Y+Z=100 X*5+Y*3+Z/3=100,40,SET TALK OFF CLEAR ?“ 公鸡 母鸡 小鸡“ FOR X=0 TO 19 FOR Y=0 TO 33 Z=100-X-Y,41,IF 5*X+3*Y+Z/3=100 ?X,Y,Z ENDIF NEXT NEXT SET TALK ON RETURN,42,例8:从键盘上输入一个整数,判断其是否为素数(质数)。,SET TALK OFF CLEAR N=0 10,30 SAY “请输入一个整数:” ; GET N READ FLAG=0,43,FOR I=2 TO SQRT(N) IF N/I=INT(N/I) FLAG=1 ENDIF NEXT IF FLAG=1,44,12,30 SAY LTRIM(STR(N); +“不是一个素数“ ELSE 12,30 SAY LTRIM(STR(N); +“是一个素数“ ENDIF SET TALK ON RETURN,45,*例题9:求出3100之间的全部素数。,SET TALK OFF CLEAR FOR M=3 TO 99 FLAG=0 FOR N=2 TO M-1 IF INT(M/N)=M/N FLAG=1 EXIT ENDIF ENDFOR,方法一,46,IF FLAG=0 ?M ENDIF ENDFOR SET TALK ON RETURN,47,SET TALK OFF CLEAR M=3 DO WHILE M100 N=2 DO WHILE N=M-1 IF M/N=INT(M/N) EXIT ENDIF IF N=M-1 ?M ENDIF,方法二,48,N=N+1 ENDDO M=M+1 ENDDO SET TALK ON RETURN,49,【例3.19】“水仙花数”是指这样的数,其各位数字的立方和等于该数本身,如153=13+53+33。编写程序求100至999范围内的第二大水仙花数。,MODI COMM EX129.PRG,SET TALK OFF CLEAR,50,SET TALK OFF CLEAR mycount=0 &计数 FOR I=999 TO 100 STEP -1 A=INT(I/100) B=INT(I-100*A)/10) C=I-INT(I/10)*10 IF I=A3+B3+C3 mycount=mycount+1 if mycount=2 exit endif ENDIF NEXT ?” 100至999范围内的第二大水仙花数为:”,I SET TALK ON RETURN,方法一,51,SET TALK OFF CLEAR mycount=0 &计数 FOR I=999 TO 100 STEP -1 A=INT(I/100) B=MOD(INT(X/10),10) C=MOD(X,10) IF I=A3+B3+C3 mycount=mycount+1 if mycount=2 exit endif ENDIF NEXT ? ” 100至999范围内的第二大水仙花数为:”,I SET TALK ON RETURN,方法二,52,方法三,SET TALK OFF CLEAR mycount=0 &计数 FOR I=999 TO 100 STEP -1 s=ALLTRIM(STR(n) &去掉前后导空格的对应于该数值的字符串,以免取到空格 a=RIGHT(s,1) &百位 b=SUBSTR(s,2,1) &十位 c=LEFT(s,1) &个位 IF I=A3+B3+C3 mycount=mycount+1 if mycount=2 exit endif ENDIF NEXT ?” 100至999范围内的第二大水仙花数为:”,I SET TALK ON,53,例14.9: 韩信有一队兵,他想知道有多少人,便让士兵排队报数:按从1 至5报数,记下最后一个士兵报的数为1;按从1 至6报数,记下最后一个士兵报的数为5;按从1 至7报数,记下最后一个士兵报的数为4;按从1 至11报数,记下最后一个士兵报的数为10。设计程序求至少有多少兵? 解:设兵数为X,则X满足下列不定方程组: X=5Y+1 即 mod(x,5)=1 X=1(MOD 5) X=6Z+5 mod(x,6)=5 X=7U+4 mod(x,7)=4 X=11V+10 mod(x,11)=10 1、注意到X除11余10,于是可设置X从21以步长11开始递增,只要判断前三个条件(方程); 2、注意到X+1为11的倍数也为6的倍数,而11与6 互素,因而X+1必为66的倍数。于是取X=65开始以步长66递增,只要判断另两个条件(方程)。 3、方程有无穷个解,只要得到第一个解便可退出循环。,54,SET TALK OFF FOR X=21 TO 10000 STEP 11 IF MOD(X,5)=1 AND MOD(X,6)=5 AND MOD(X,7)=4 ?至少有兵+LTRIM(STR(X)+个 EXIT ENDIF ENDFOR SET TALK ON RETURN,方法一:,55,方法二:,SET TALK OFF X=65 DO WHILE X10000 X=X+66 IF MOD(X,5)=1 AND MOD(X,7)=4 ?至少有兵+LTRIM(STR(X)+个 EXIT ENDIF ENDDO RETURN,方法三:?,57,set talk off clear P=0 for n=100 to 999 step 2 A=INT(n/100) B=INT(n-100*A)/10) C=N-INT(n/10)*10 if MOD(B+C,10)=A ?N P=P+1 ENDIF ENDFOR ?“P=“,P SET TALK ON RETURN,5求三位数中,个位数字与十位数字之和除以10所得的余数是百位数字的所有偶数的个数。,58,三、递推法 递推:指在前一个(或几个)结果的基础上推出下一个结果。 递推法主要是对数列、数序集进行处理。使用数组是实现递推法的主要手段。,例12.11:编程求Fibonacci数列:1,1,2,3,5,8的前30个数。即 F1=1 F2=1 Fn=Fn-1+Fn-2,59,SET TALK OFF CLEAR F1=1 F2=1 I=1,60,DO WHILE (I=15) ?F1,F2 F1=F1+F2 F2=F1+F2 IF I/3=INT(I/3) ? ENDIF,61,I=I+1 ENDDO SET TALK ON RETURN,62,63,*P85二、程序题1.一个素数,若将其数字位置任意对换后仍为素数,则称为绝对素数。求两位数的绝对素数的和及个数。程序中有两个错误,请改正。&prog21.prg,64,SET TALK OFF CLEA T=0 S=0 FOR I=10 TO 99 P=.T. FOR J=2 TO SQRT(I) IF MOD(I,J)=0 P=.F. LOOP &正确语句为 EXIT ENDIF ENDFOR IF P A=INT(I/10) B=MOD(I,10) K=B*10+A,方法一,65,W=.T. FOR J=2 TO SQRT(K) IF MOD(K,J)=0 W=.F. EXIT ENDIF ENDFOR IF W=.F. &正确语句为 IF W 或者 IF W=.T. ?I S=S+I T=T+1 ENDIF ENDIF ENDFOR ?“S=“,S ,“T=“,T set talk on return,66,SET TALK OFF CLEAR P=0 S=0 for m=11 to 99 if prime(m) n=10*mod(m,10)+int(m/10) if prime(n) ?m P=P+1 S=S+M endif endif endfor ?“S=“+ALLT(STR(S) FONT “, 46 ?“P=“+ALLT(STR(P) FONT “, 46 CAncel,方法二,67,func prime para n flag=.t. k=int(sqrt(n) j=2 do while j=k and flag if mod(n,j)=0 flag=.f. endif j=j+1 enddo return flag,68,P85二、程序题3. 若一个自然数恰好是它的平方的末后几位数,则称此数为自同构数。如5和76都是自同构数,因为它们的平方分别是25和5776。求2,99999内所有自同构数之和。 set talk off CLEAR ?“同构数有:“ for n=2 to 99999 L=LEN(ALLT(STR(N) if n=mod(n2,10L) ?n endif endfor set talk on,69,SET TALK OFF CLEAR SUMX=1 FOR K=9 TO 1 STEP -1 SUMX=2*(SUMX+1) ENDFOR ?SUMX RETURN, P85二、程序题5.猴子吃桃子问题。小猴子第一天摘下若干个桃子,立即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩余的吃了一半,又多吃了一个。以后每天早上都吃了剩余的一半又一个。到第十天早上想吃桃子时,只剩余一个了。问第一天共摘了多少个,70,*思考题 *1:已知S=2+(2+4)+(2+4+8)+求S6000的S的最小值 CLEAR DIME SUM2(10000) S=0 SUM1=0 FOR N=1 TO 10000 SUM1=SUM1+2N S=S+SUM1 SUM2(N)=S ?SUM2(N) IF S6000 EXIT ENDIF ENDFOR ?“S=“,SUM2(N-1) RETURN,71,*2求S=1+1/1!+1/2!+1/3!+1/n! SET TALK OFF CLEAR S=1 T=1 FOR N=1 TO 25 T=T*N S=S+1/T ENDFOR ?“S=“,ROUND(S,4) SET TALK ON RETURN,72,*3求100,900之间相差为12 的素数对的个数 SET TALK OFF CLEAR dime a(400) k=0 p=0 FOR M=100 TO 900 IF PRI(M) k=k+1 a(k)=m * ?“A(“+allt(str(K)+“)=“,A(K) ENDIF ENDFOR *?K,73,for i=2 to K if a(i)-a(i-1)=12 * ?a(i),a(i-1) p=p+1 endif endfor ?“p=“,p SET TALK ON RETURN,74,FUNC PRI PARA N J=2 FL=.T. X=INT(SQRT(N) DO WHILE J=X AND FL IF MOD(N,J)=0 FL=.F. EXIT ENDIF J=J+1 ENDD RETURN FL,75,SET TALK OFF CLEAR X=0 s=0 for n=9 to 499 flag=.t. &假设N为素数 for j=2 to sqrt(n) if mod(n,j)=0 &N不为素数 flag=.f. endif endfor if flag=.f. and mod(n,2)0 &判断N不是素数且不为偶数 ?N s=s+n X=X+1 endif endfor ?X=,X ?“s=“,s SET TALK ON RETURN,*4-求9-499之间非偶非素数的数之和及个数,76,*5 输出字母金字塔 SET TALK OFF CLEAR FOR X=1 TO 5 ?SPACE(40-X) FOR Y=65 TO 64+X*2-1 ?CHR(Y+X-1) ENDFOR ENDFOR SET TALK ON RETURN,77,set talk off clear k=0 for m=700 to 899 for i=2 to m-1 if mod(m,i)=0 exit endif endfor if i=m and “1“$str(m)=.T. k=k+1 b=m endif endfor ? k,b set talk on return,求(-)素数且至少有一位为1的素数,*
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年北京市电子产品买卖合同样本
- 最优物业服务合同范本
- 废弃仓库出售合同范本
- 以车抵债合同范本
- 2025汽车买卖委托合同范本
- 2025农资购销合同模板
- 出租 押金合同范本
- 2025股票交易合同范本
- 短期招工租赁合同范本
- 牌楼拆除合同范本
- 2022水环式机械真空泵选型计算手册
- 2025-2030中国辣椒酱行业供需趋势及投资风险研究报告
- 2025年度运输业安全生产知识竞赛试题(附答案)
- 光伏居间的合同8篇
- GB/T 45418-2025配电网通用技术导则
- 医疗风险防控培训课件
- 机械设计部绩效考核制度
- 诊疗规范培训课件
- 《KANO模型培训》课件
- 复苏室患者的交接流程
- DB21-T 2523-2015矿山地质环境恢复治理规程
评论
0/150
提交评论