62程序结构.docx
- 文档编号:5171053
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:27
- 大小:94.32KB
62程序结构.docx
《62程序结构.docx》由会员分享,可在线阅读,更多相关《62程序结构.docx(27页珍藏版)》请在冰豆网上搜索。
62程序结构
6.2程序结构
程序设计
1.程序设计的步骤:
分析问题→确定算法→将算法描述为计算机处理的语句序列(即程序)
2.“结构化程序设计”
原则:
自顶向下,逐步求精
3.结构化编程方法提出了顺序,选择(分支),循环三种基本结构。
任何一个程序都可以用这三种结构装配起来。
三种基本结构
6.2.1顺序结构(最基本,最简单)
按照程序语句行的自然顺序,一条接一条语句的执行,不需要专门的结构语句来支持。
6.2.2分支结构(选择结构)
解决实际问题时,常常需要对问题的给定条件作出判断,以便选择不同的解决方法,这就必须使用分支结构来编制程序。
分支结构有相应的结构语句,根据判断条件的真假,选择不同的语句执行。
分支结构语句(套用这样的语句,实现分支结构):
(1)单一选择:
IF条件
语句序列A
ENDIF
说明:
该结构首先计算IF语句中的条件表达式(逻辑型的值,可以是返回值是逻辑型的函数,关系表达式,逻辑表达式)的值,如果它为真,则执行IF和ENDIF之间的语句序列A。
否则跳过转到ENDIF后面的语句继续执行。
IF条件,ENDIF必须各占一行,且必须成对使用。
语句序列A可由VFP认识的任何语句行构成。
(2)双选择IF条件
语句序列A
ELSE
语句序列B
ENDIF
说明:
该结构当IF语句为真(.T.)时,执行语句序列A,执行完转到ENDIF后面的语句。
若条件为假(.F.),则执行完语句序列B,然后执行ENDIF后面的语句。
注意:
①IF<条件>,ELSE,ENDIF语句各占一行.IF,ENDIF必须成对使用.
②语句序列A,语句序列B可由任何语句行构成.
③允许多层嵌套
(3)多选择
往往在判断选择时,可能会有多个不同的条件,编制这种程序最好使用多选择结构语句。
DOCASE
CASE<条件1>
<语句序列1>
CASE<条件2>
<语句序列2>
……
CASE<条件N>
<语句序列N>
[OTHERWISE
<语句序列N+1>]
ENDCASE
说明:
从DOCASE语句说明多选择结构开始,进入本结构后,按顺序选择第一个条件为真的CASE子句并执行它的若干语句行,然后从ENDCASE语句退出本结构。
如果找不到满足条件的语句,执行OTHERWISE后的语句。
注意:
①DOCASE,ENDCASE必须配对使用,且各占一行。
DOCASE是本结构的入口,ENDCASE是本结构的出口。
②DOCASE后面紧接着CASE,且各占一行,中间不能有任何语句。
③不管有几个CASE条件成立,只有最先成立的那个CASE条件的对应命令会执行。
④语句序列里可以出现各种类型的语句,如果又出现多选择结构,则是本语句的嵌套形式。
例:
计算分段函数值:
Y=-1(X<=0)
1(0 2(10 3(X>20) Y=-1(X<=0) 1(0 2(10 3(X>20) (4)选择嵌套 语句中的IF和ENDIF,DOCASE-ENDCASE等必须成对出现,嵌套不能出现交叉。 在嵌套中,为了使程序清晰易于阅读,可按缩进格式写。 IF<条件1>IF<条件1> IF<条件2>DOCASE 语句序列1CASE<条件1> ELSE语句序列1 语句序列2…… ENDIFCASE<条件N> ……语句序列N ELSE[OTHERWISE 语句序列3语句序列N+1 ENDIFENDCASE ELSE …… ENDIF 双选套双选双选套多选 6.2.3.循环结构 在一个大程序段中,常常会重复使用某一段相同的程序段。 在编制程序时,不必重复编写这个程序段,可以用循环结构来代替它。 如对表的操作和计算问题。 VFP6.0提供了三种循环结构的形式,以适应不同情况的应用. (1)当型循环DOWHILE…ENDDO结构 DOWHILE<条件> 语句序列 [LOOP] 语句序列 [EXIT] 语句序列 ENDDO ①语句含义(如何执行) ②选择项LOOP和EXIT的含义 ③循环条件的设置 第一种: 计数形式 A=1&&循环变量初值 DOWHILEA<=10&&循环变量终值 … A=A+1&&在循环体中修改变量的值 ENDDO 例: 求1-100的和。 SETTALKOFF CLEAR Y=0 X=1 DOWHILEX<=100 Y=Y+X X=X+1&&在循环体中修改变量的值 ENDDO ? ’1-100的和为: ’,Y SETTALKON CANCEL 思考: 1.退出循环结构后X,Y的值分别是多少? 2.循环结构中的两个语句调换位置后是什么结果? 3.X=X+1改成X=X-1后是什么结果? 例: 求1-100的奇数和。 例: 求1-100之间的非3的倍数的所有奇数之和. SETTALKOFF CLEAR STOR0TOY X=1 DOWHILEX<=100 IFINT(X/3)<>X/3 Y=Y+X ENDIF X=X+2 ENDDO ? ’100以内非3的倍数的奇数和为: ’,Y SETTALKON CANCEL 例: 求 例: 求 例: 求 例: 求1×2×3×4×…×99×100=? 例: 求10! 例: 12+42+72+102+…直到和超过1000为止。 求和为多少,项数为多少。 引入: 计数循环FOR—ENDFOR/NEXT结构(一般在已知循环次数的情况下使用) FOR<循环变量>=<初值>TO<终值>[STEP<步长>] 语句序列 ENDFOR/NEXT 执行过程: 遇到FOR语句时,首先将循环变量的值与终值比较,若超过终值,则结束循环.执行ENDFOR/NEXT后面的语句;若没有超过终值,则执行循环体. 每执行一次循环,循环变量的值都要自动加上增量(步长值),从而控制循环执行的次数. 说明: ①步长值可正可负。 即超过的含义是: 若步长为正,控制变量递增,直到大于终值停止循环。 若步长为负,控制变量递减,直到小于终值停止循环。 默认步长为1。 ②循环次数=INT((终值-初值)/步长)+1 ③在此循环体中,循环变量每次加步长是自动加的,不需再加语句, 如果人为的修改控制变量的值,会影响循环的执行次数。 ④LOOP语句,EXIT语句在SCAN,FOR结构的功能与在DOWHILE结构中相同. 例: 求1+2+3+……+9+10的和 SETTALKOFF CLEAR S=0 FORX=1TO10STEP1*STEP1缺省,默认为1 S=S+X ENDFOR ? ’S=’,S SETTALKON CANCEL 例: 宰相的麦子: 相传古印度宰相达依尔,是国际象棋的发明者。 有一次,国王因为他的贡献要奖励他,问他想要什么。 达依尔说: “只要在国际象棋棋盘上(共64格)摆上这么些麦子就行了: 第一格一粒,第二格两粒,……,后面一格的麦子总是前一格麦子数的两倍,摆满整个棋盘,我就感恩不尽了。 ”国王一想,这还不容易,于是就答应了宰相,结果在兑现他的承诺时,发现全印度的粮食都不够奖赏的。 请计算国王总共需要奖赏宰相多少粒米。 请分别用For循环和dowhile循环实现。 例: 编程求P=1*2+3*4+5*6+7*8+……+21*22 算法分析: SETTALKOFF CLEAR S=0 FORI=1TO21STEP2 S=S+I*(I+1) ENDFOR ? ’和是: ’,S或者? ’和是: ’+STR(S) SETTALKON RETURN 例: 找出100-999之间的所有“水仙花数”。 所谓水仙花数是指一个三位数,各位数字的立方和等于该数本身。 (如153=13+53+33) 算法分析: 如何分离出一个三位数中的各位数字。 解1: SETTALKOFF CLEA FORI=100TO999 A=INT(I/100) B=INT((I-100*A)/10) C=I-INT(I/10)*10 IFI=A^3+B^3+C^3 ? ? I ENDIF ENDFOR SETTALKON RETURN 解2: SETTALKOFF CLEA FORI=100TO999 S=STR(I,3) A=VAL(LEFT(S,1) B=VAL(SUBS(S,2,1)) C=VAL(RIGHT(S,1) IFI=A^3+B^3+C^3 ? ? I ENDIF ENDFOR SETTALKON RETURN 例: 求1-100之间的自然数之和,偶数之和,奇数之和。 LOOP和EXIT的含义和使用方法: 例: 给程序填空: 程序的功能是求1到100之间的奇数和。 CLEAR Y=0 FORX=1TO100 IFMOD(X,2)=0 ------------- ELSE ------------- ENDIF ENDFOR ? Y 例: 读程序,写结果: SETTALKOFF N=0 DOWHILE.T. IFN>=98 EXIT ENDIF N=N+2 ENDDO ? "N="+STR(N,3) RETURN 例: 读程序,写结果: SETTALKOFF CLEAR STORE0TOM,N DOWHILEM<6 M=M+1 IFMOD(M,2)=1 LOOP ELSE N=N+M ENDIF ENDDO ? "N=",N RETURN 例: 读懂程序: 一个密码校对程序: 密码为字符串‘12345‘。 用户从键盘上输入密码,如果输入的密码正确,则显示“身份正确,欢迎使用本系统”;如果输入的密码不正确,则显示“请重新输入密码”。 只给用户3次机会,若用户连续3次输入的密码均不正确,则显示“你是非法用户,本系统拒绝你进入! ” SETTALKOFF CLEA I=0 ACCEPT‘请输入密码: ’TOM DOWHILEI<=2 IFM=’12345’ WAIT‘身份正确,欢迎您使用本系统’WINDOWSAT12,30TIMEOUT2 EXIT ELSE IFI=2 WAIT‘你是非法用户,本系统拒绝你进入! ’WINDOWSAT12,30 EXIT ELSE ACCEPT‘请重新输入密码’TOM I=I+1 ENDIF ENDIF ENDDO 例: 编写程序,判断一个大于或等于3的自然数是否为素数。 (思考: FOR循环结束后循环变量的值) 素数: 除2之外的其他质数,又称素数。 算法分析: 判断M是否为素数,即用2到M-1的每一个整数去除M,如果都除不尽,就是素数,否则不是。 实际证明,不需除到M-1,只需除到INT(SQRT(M)),或者M/2即可。 即只要用从2到INT(SQRT(M))依次去除M,如果都除不尽,即为素数,否则不是。 SETTALKOFF CLEAR INPUT[请输入一个大于或等于3的自然数: ]TOM N=INT(SQRT(M)) FORI=2TON IFMOD(M,I)=0 EXIT&&退出循环结构(只有条件MOD(M,I)=0成立才能执行到这个语句) ENDIF ENDFOR IFI>N ? M,'是素数' ELSE ? M,'不是素数' ENDIF SETTALKON RETURN 例: 输入一个字符串,按其倒序输出。 ACCEPT‘请输入一个字符串’TOA L=LEN(A) FORX=LTO1STEP-1 ? ? SUBSTR(A,X,1) ENDFOR 第二种: 键盘输入数据 ANS=’Y’ DOWHILEUPPER(ANS)=’Y’ …… WAIT‘是否继续(Y/N)? ’TOANS&&循环体中输入Y或N,决定是 ENDDO否再次执行循环体 例: 完善程序: 查找表中指定姓名的学生记录.此程序可以实现多次查找,只要输入Y就可以继续查找,输入N停止查找. 第三种: 直接用.T.作为条件,用EXIT退出循环。 DOWHILE.T.&&条件永远成立 … IF<条件> EXIT&&只可能在循环体中退出循环 ENDIF ENDDO 第四种文件头或文件尾的测试 USE<表文件> ……&&这儿不要出现让指针移动的语句,如果需要在循环之前要把指针移回第一条记录 DOWHILE.NOT.EOF()&&指针没到文件尾,即为真,执行循环体,否则退出 …… SKIP&&每执行一次循环体,指针下移一条记录。 ENDDO 例: 列出XSDA表中1979年以后出生的学生人数,并统计出学生人数。 SETTALKOFF CLEA USEXSDA N=0 DOWHILENOTEOF() IF出生日期>={^1979/01/01} DISPLAY N=N+1 ENDIF SKIP ENDDO USE SETTALKON CANCEL 引入: 扫描循环SCAN…ENDSCAN结构 SCANDOWHILENOTEOF() ………… ENDSCANSKIP ENDDO 对打开的表指定范围内符合条件的记录逐条进行语句序列中规定的操作.该循环中语句序列每执行一次,表中记录指针下移一条记录.直到表文件记录结束为止. 缺省范围和条件时上面左右两种结构是等同的。 SCAN后如果加条件表示只对符合条件的记录循环。 例: 试着用SCAN……ENDSCAN改写上面的例子(SCAN后可以加指定条件) 例: 对于给定的表XSCJ,增加一个字段,等级C(6),编程实现填充表中的等级字段,如果其计算机成绩<60分,等级字段填充'不合格',如果在60到70之间(不包括70分),填充'合格',如果在70到85之间(不包括85分),填充'良好',如果在85分到100分之间(包括100分),填充'优秀'. 2005上第二套求阶乘 例: 求两个整数M和N的最大公约数和最小公倍数。 算法分析: 最大公约数: 将两个数中大的数给A,小的数给B(用除法取余的方法来求) (1)求A/B的余数N. (2)若N=0,,则B为最大公约数 若N<>0,则执行(3) (3)将B放入A,N放入B,然后再求A/B的余数,回到 (2) 最小公倍数: 两个数的乘积除以最大公约数。 SETTALKOFF CLEAR INPUT'请输入M值'TOA INPUT'请输入N值'TOB C=A*B N=MOD(A,B) DOWHILEN<>0 A=B B=N N=MOD(A,B) ENDDO ? '最大公约数是: ',+STR(B) ? '最小公倍数是: ',+STR(C/B) SETTALKON RETURN 把此题和表联系起来。 (2005下第四套) 例: 考生文件夹下已有数据表F01.DBF和空数据表 F02.DBF,表结构如下: F01(数据1(N,4),数据2(N,4)) F02(最大公约数(N,4)) 请在考生文件夹下编写程序PROG1.PRG,其功能是: 1)先根据数据表F02.DBF复制一个同结构的空数据表F03.DBF; 2)求F01中“数据1”和“数据2”两字段的最大公约数,并将结果保存到F03的“最大公约数”字段中。 (注: 使用DOWHILE循环编程)(同时操作两张表) USEF02 COPYTOF03 USEF01&&一号工作区打开F01,F02自动关闭 USEF03IN2&&二号工作区打开F03 SCAN&&在F01所在的1号工作区 A=数据1 B=数据2 N=MOD(A,B) DOWHILEN<>0 A=B B=N N=MOD(A,B) ENDDO SELE2 APPEBLANK REPL最大公约数WITHB SELE1 ENDSCAN SELE2 LIST 把素数题和表联系起来: 考生文件夹下已有数据表W1.DBF,表结构如下: W1(数据(N3)) 请在考生文件夹下编写程序PROG1.PRG,其功能是: 1.先根据数据表W1.DBF复制一个同结构的空数据表W2.DBF; 2.找出表W1.DBF中的素数,并添加到W2中; 3.对W2中数据按从大到小进行排序,将排序结果存入W3表中。 注: 使用SCAN循环编程)(同时操作两张表) CLEAR USEW1 COPYSTRUTOW2 SELE2 USEW2 SELE1 SCAN FORI=2TOINT(SQRT(数据)) IFMOD(数据,I)=0 EXIT ENDIF ENDFOR IFI>INT(SQRT(数据)) SELE2 APPEBLANK REPL数据WITHA.数据 SELE1 ENDIF ENDSAN SELE2 SORTTOW3ON数据/D USEW3 LIST 从键盘输入10个数,然后找出其中的最大值和最小值。 算法: 程序首先读入一个数,一个数的最大值和最小值就是它本身,放入MA,MI两个变量中,然后进入循环语句,依次读入其它9个数。 每读入一个数,就让该数分别与MA,MI相比较。 如果该数大于MA,就放入MA,如果该数小于MI,就放入MI。 即MA和MI总是保存着到目前为止的最大值和最小值。 CLEAR INPUT‘请输入一个数: ’TOA STOREATOMA,MI FORI=2TO10 INPUT‘请输入一个数: ’TOA IFA>MA MA=A ELSE IFA MI=A ENDIF ENDIF ENDFOR ? ’最大值: ’,MA ? ’最小值: ’,MI RETURN 把此题和表联系起来。 考生文件夹下已有数据表F01.DBF和空数据表F02.DBF,表结构如下: F01(数据(N3)) F02(最大数(N3),最小数(N3)) 请在考生文件夹下编写程序PROG1.PRG,其功能是: 1.先根据数据表F02.DBF复制数据表F03.DBF,在F03中添加一条空白记录; 2.求出表F01中所有数据的最大值和最小值; 3.将结果分别存入F03中的“最大数”和“最小数”字段中。 (注: 使用DOWHILE循环编程) USEF02 COPYTOF03 USEF03 APPEBLAN USEF01 MIN=数据 MAX=数据 SCAN IF数据 MIN=数据 ELSE IF数据>MAX MAX=数据 ENDIF ENDIF ENDSCAN USEF03 REPL最大数WITHMAX,最小数WITHMIN LIST USE XSCJ表中数学,英语,计算机的平均值大于等于80分的计算总分,否则不计算总分 错误的做法: USEXSCJ A=(数学+英语+计算机)/3 SCAN IFA>=80 REPLACE总分WITH数学+英语+计算机 ENDIF ENDSAN 正确的做法: USEXSCJ SCAN A=(数学+英语+计算机)/3 IFA>=80 REPLACE总分WITH数学+英语+计算机 ENDIF ENDSAN 找出XSCJ表中数学成绩最高的那个学生的学号和数学成绩。 USEXSCJ MA=数学 XH=学号 SCAN IF数学>MA MA=数学 XH=学号 ENDIF ENDSCAN ? MA,XH (4)循环嵌套 在循环体中又包含循环,通常称为多重循环或循环嵌套. 循环中也可以嵌套选择结构。 注意是嵌套,不能交叉。 问题一: 打印图形 打印如下图形 问题2穷举法: 穷举法就是通过把需要解决问题的所有可能情况逐一试验来找出符合条件的解的方法。 这种方法特点是盲目性较大,解决时间可能时间较长。 例.有一道趣味数学题: 有30个人在一家小饭店用餐,其中有男人、女人和小孩。 每个男人花了3块,每个女人花了2块,每个小孩花了1块,一共花去50块。 问男人、女人和小孩各有几人? •分析: 设有男人、女人、小孩各X,Y,Z个。 则X+Y+Z=30 3X+2Y+Z=50 它是不定方程。 应采用“穷举法”去试根。 CLEAR FORX=1TO16 FORY=1TO24 Z=30-X-Y IF3*X+2*Y+Z=50 ? X,Y,Z ENDIF ENDFOR ENDFOR 例: 有表D1 把D1复制成DD1。 有若干鸡和兔放在同一个笼子里,H表示共有多少个头,F表示共有多少只脚,在DD1中填充每条记录里鸡和兔的个数。 分析: 对于每一条记录设有鸡和兔各X,Y个。 则X+Y=H 2X+4Y=F CLOSETABLESALL USED1 COPYTODD1 USEDD1 SCAN FORX=1TOH-1&&X表示鸡的个数,Y表示兔的个数 Y=H-X IFX*2+Y*4=F REPLACE鸡WITHX REPLACE兔WITHY ENDIF ENDFOR ENDSCAN (5)数组问题 1.给一维数组赋值 给一维数组C(10)赋值 (1)赋有规律的数 DIMENSIONC(10) C (1)=1 C (2)=3 C(3)=5 …… C(9)=17 C(10)=19 (2)由用户自己给值 (3)从表中取值(两种方法) 表M1中只有一个字段XN(5) 方法1: USEM1 M=RECCOUNT()&&如果改成COUNTTOM下面循环之前还需要加一句: GO1 DIMENSIONC(M) N=1 SCAN C(N)=X N=N+1 ENDSCAN 方法2:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 62 程序结构
![提示](https://static.bdocx.com/images/bang_tan.gif)