《第三章结构化程序设计.ppt》由会员分享,可在线阅读,更多相关《第三章结构化程序设计.ppt(79页珍藏版)》请在课桌文档上搜索。
1、第3章 FORTRAN结构化程序设计,本章内容,顺序结构程序设计选择结构程序设计循环结构程序设计,结构化程序设计:按照一定的结构形式来设计和编写程序,以便阅读与检查。,顺序结构,选择结构,循环结构,当型循环,直到型循环,3.1 顺序结构程序设计,先上后下,先左后右;即先执行A,再执行B,顺序结构,【例3-1】输入3个气象站5个月(汛期)雨量数据,统计每个气象站的总雨量和平均雨量,计算3个站五月、六月、七月、八月、九月的平均雨量,输出每个气象站每个月的雨量、总雨量和平均雨量,以及五月、六月、七月、八月、九月的平均雨量。,表3-1 1998年主要站汛期雨量统计表,PROGRAM ex06_02IM
2、PLICIT NONEREAL r11,r12,r13,r14,r15,total11,av11REAL r21,r22,r23,r24,r25,total21,av21REAL r31,r32,r33,r34,r35,total31,av31REAL av1,av2,av3,av4,av5WRITE(*,“(28X,5月 6月 7月 8月 9月)”)WRITE(*,“(1X,输入江阴气象站五个月的雨:,)”)READ(*,*)r11,r12,r13,r14,r15WRITE(*,“(1X,输入定波闸气象站五个月的雨量:,)”)READ(*,*)r21,r22,r23,r24,r25,WRIT
3、E(*,“(1X,输入肖山气象站五个月的雨量:,)”)READ(*,*)r31,r32,r33,r34,r35100FORMAT(F5.1,F5.1,F5.1,F5.1,F5.1)total11=r11+r12+r13+r14+r15 av11=total11/5 total21=r21+r22+r23+r24+r25 av21=total21/5 total31=r31+r32+r33+r34+r35 av31=total31/5 av1=(r11+r21+r31)/3 av2=(r12+r22+r32)/3 av3=(r13+r23+r33)/3,av4=(r14+r24+r34)/3 a
4、v5=(r15+r25+r35)/3WRITE(*,“(26X,5月 6月 7月 8月 9月 总雨量 平均雨量)”WRITE(*,200)江阴气象站五个月的雨量:,r11,r12,r13,r14,r15,total11,av11WRITE(*,200)定波闸气象站五个月的雨量:,r21,r22,r23,r24,r25,total21,av21WRITE(*,200)肖山气象站五个月的雨量:,r31,r32,r33,r34,r35,total31,av31200 FORMAT(1X,A22,5(F5.1,2X),F6.1,2X,F7.3)WRITE(*,300)5月,av1,6月,av2,7月,
5、av3,8月,av4,9月,av5,300 FORMAT(1X,A4,平均雨量:,F7.3)END,运行结果:,3.2 选择结构,3.2.1 选择结构简介3.2.2 IF语句 3.2.3 SELECT CASE语句 3.2.4 选择语句的嵌套,3.2.1 选择结构简介依据给定的条件做逻辑判断,再根据判断的结果决定应执行哪种操作选择结构。如:1 输入学生成绩,判定合格与否,输出判定结果。2 已知三个整数A,B,C,输入其值并打印三个数中最大值。3 暴雨预警信号分三级,分别以黄色、橙色、红色表示。(1)暴雨黄色预警信号(2)暴雨橙色预警信号(3)暴雨红色预警信号根据降雨量评判当前预警信号,从而做出
6、不同防御指南。必须使用选择结构程序来解决这类问题,FORTRAN提供了3种典型的块IF结构:(1)单分支(2)双分支(3)多分支,3.2.2 IF语句,(1)单分支块IF结构一般形式为:IF(条件)THENIF块END IF这种块IF结构包括:块IF语句“IF(条件)THEN”。它是块IF结构的入口语句。IF块。它是一个语句序列,由若干条可执行语句组成。END IF语句。它是块IF结构的出口语句。,【例3-2】从键盘输入一个气温值,如果大于35.0,则显示在屏幕上。,(2)双分支块IF结构一般形式为:IF(条件)THENIF块ELSEELSE块END IF,【例3-3】由于大气受到污染,一些地
7、区开始形成酸雨区,酸雨是指PH值小于5.6的雨雪或其他形式的大气降水。通过收集水样测量其PH值,判断它的酸碱性并打印出来。根据题意设计算法并画出程序流程图,如图所示。,(3)多分支块IF结构一般形式为:IF(条件1)THEN块1ELSE IF(条件2)THEN块2ELSE IF(条件3)THEN块3.ELSE IF(条件n)THEN块nELSE块n+1END IF,【例3-4】在气象部门发布的天气预报中小雨、中雨、暴雨等专业术语,它们之间的区别如表所示:,(4)逻辑IF结构逻辑IF语句的一般形式:IF(条件)语句其中“条件”可以是一个合法的逻辑表达式或关系表达式,“语句”是一个合法的可执行语句
8、,且只有一条语句。,【例3-5】已知跃阶函数的数学模型是:,x要求从键盘输入。,CASE结构是一种多路分支选择结构,可有多个分支可供选择。CASE结构的一般形式为:SELECT CASE(选择表达式)CASE(控制表达式1)块1CASE(控制表达式2)块2.CASE(控制表达式n)块nCASE DEFAULT默认块END SELECT,3.2.3 SELECT CASE语句,实质:判断选择表达式的值是否与某一控制表达式的值相匹配。,说明:选择表达式和控制表达式可以为整型、逻辑型或字符型。控制表达式可以是一个不重复的值或一组同类值的列表,如:(1)用逗号分隔的单个值列表。如:CASE(a,b,c
9、,x,y,z),当选择表达式的值为a,b,c,x,y,z之一时,执行相应的语句块。CASE(3,6,9),当选择表达式的值为3,6或9时,执行相应的语句块。(2)用冒号分隔的值的范围。如:CASE(a:g),当选择表达式的值落入ag范围内时,执行相应的语句块。CASE(5:10),当选择表达式的值落入510范围内时,执行相应的语句块。CASE(10:),当选择表达式的值大于或等于10时,执行相应的语句块。CASE(:10),当选择表达式的值小于或等于10时,执行相应的语句块。,【例3-6】根据风对地上物体所引起的现象将风的大小分为13个等级,称为风力等级,以 012等级数字记载,如下表所示:,
10、现对所输入的风速进行分类并输出。,在一个块IF结构中都可以完整地包含一个(或多个)块IF结构,即构成块IF的嵌套结构。它的结构为:,3.2.4 选择语句的嵌套,当嵌套层次过多时,往往一时难以找到同一层的块IF中的各语句,一般可按以下方法确定:,(1)从最内层的块IF语句开始,向下找到离它最近的END IF语句,将它们用线括起来,这就是同一层次的块IF。(2)由内向外重复这一个过程,直到遇见最外层块IF语句和END IF语句为止。(3)在书写嵌套分支结构时采取缩进方式进行程序书写,程序的嵌套层次就容易确定。,【例3-7】求解当系数a,b,c为不同情况下的一元二次方程根。N-S图如下:,【例3-8
11、】已知U,V风速,判断风向:,U0;V0西南风,U0;V0西北风,U0东南风,U0;V0东北风,program ex0308real u,vread*,u,vif(u0.0)then if(v0.0)then!u0,v0 print*,西南风 else if(v0,v0,v=0 print*,西风 end ifelse if(u0.0)then!u0 print*,东南风 else if(v0.0)then!u0,v0 print*,东北风 else!u0,v=0 print*,东风 end if,else if(v0.0)then!u=0,v0 print*,南风 else if(v0.0)
12、then!u=0,v0 print*,北风 else!u=0,v=0 print*,无风 end ifend ifend,3.3 循环结构程序设计,3.3.1 循环语句的形式3.3.2 循环控制语句3.3.3 循环语句的嵌套3.3.4 两种循环形式的比较和关系,3.3.1 循环语句的形式(1)有循环变量的DO循环结构,格式有循环变量DO结构的一般形式为:结构名:DO 循环变量=E1,E2,E3 循环体 END DO 结构名,DO循环结构的程序举例,【例3-9】了解循环执行的过程和计算循环次数,DO I=1,3,2M=I*IPRINT*,I,MEND DOEND,运行结果,DO循环结构循环的次数
13、:,R=MAX(INT(E2-E1+E3)/E3),0),REAL:I DO I=0.6,6.6,1.4INTEGER:I DO I=0.6,6.6,1.4DO R=0.6,6.6,-1.4DO R=6.6,0.6,1.4,先计算E1、E2、E3的值,然后转换为与循环控制变量相同的类型;给循环控制变量赋初值 v=E1;计算循环次数,计算公式为:R=MAX(INT(E2-E1+E3)/E3),0)检查循环次数,当R 0时,执行循环体,继续做第(4-6)步;当 R0时,转向(7);当执行到循环终端语句时,循环变量按步长增值,即:循环变量=循环变量+E3;循环次数减1:R=R 1;返回(4)继续执行
14、。循环结束。,执行过程,注意事项,循环变量在循环体中可以引用不能重新赋值E1、E2、E3的类型应与循环变量相同。E3的缺省意味着循环步长为1。可以不经过ENDDO语句退出循环DO循环和其它结构(如块IF结构、CASE结构)可以相互嵌套使用退出循环后,循环变量仍然存在。,【例3-10】循环输入一周日最高气温,判断最高气温,并计算一周平均最高气温。2014年3月23日-29日南京日最高气温如下:16.0 17.0 17.0 18.0 16.0 22.0 24.0(单位:)。,program ex0309real t,tmax,sum,tavetmax=0.0sum=0.0do i=1,7read*
15、,tsum=t+sumif(t=tmax)thentmax=tend ifend dotave=sum/7.0print*,tmax=,tmaxprint*,tave=,taveend,43,(2)DO-WHILE控制的循环结构,DO-WHILE结构格式一般形式为:结构名:DO WHILE(逻辑表达式)循环体 END DO 结构名,例子,【例3-11】循环输入每六小时降水资料,如果发现数据小于0或者大于1000时,终止循环,并提示输入数据异常。,real precipprint*,输入每六小时降水量(mm):read*,precipdo while(precip.ge.0.and.precip
16、.le.1000)print*,降水量(mm):,precipread*,precipenddoprint*,输入数据异常end,程序,运行结果,45,DO-WHILE循环流程图,46,循环结构的选择:,如果已知循环的次数,或者知道循环的初值和终值,那么用有循环变量的DO循环结构。知道循环的条件时,选用DO_WHILE循环结构,或者是重复DO循环结构。其中在使用这两种结构时,注意循环条件的变化,以避免“死循环”。,47,(1)EXIT语句,EXIT语句用于强制退出循环,将执行控制转移到当前循环或结构之外。一般格式为:EXIT DO循环结构名,3.3.2 循环流程控制语句,48,EXIT语句的使
17、用说明:,EXIT语句通常是作为逻辑IF语句的内嵌语句来使用。其作用是有条件中断。形式为:IF(逻辑表达式)EXIT 结构名 执行过程为:当逻辑表达式为真时,中止正在执行的循环,将控制转到EXIT语句指定的结构之后;当逻辑表达式为假时,继续正在执行的循环,不进行任何转移。,49,【例3-12】输入正整数n,求级数 的前n项和,如果当某项绝对值105时,虽未满n项,也因满足精度而不再加入下一项。,51,(2)CYCLE语句,CYCLE语句用于中止执行循环体中剩余的语句,重新执行下一轮循环。一般格式为:CYCLE DO循环结构名,52,CYCLE语句的使用说明:,CYCLE语句与EXIT语句不同,
18、它不中止循环的执行,而是将循环变量增加一个步长,从下一个循环开始执行。CYCLE语句通常是作为逻辑IF语句的内嵌语句来使用。形式为:IF(逻辑表达式)CYCLE DO循环结构名,53,执行过程:,当逻辑表达式为真时,中止正在执行的循环体的剩余语句,将控制转到循环体的开始重新循环;当逻辑表达式为假时,继续正在执行的循环,不进行任何转移。,【例3-13】顺序输出1-10序列中除了9以外的其它数字,do i=1,10if(i=9)cycleprint*,ienddoend,运行结果,55,3.3.3 循环语句的嵌套,DO循环结构嵌套的一般格式为:结构名1:DO V1=E11,E12,E13,其它循环
19、体 结构名2:DO V2=E21,E22,E23内部循环体 ENDDO 结构名2 其它循环体,ENDDO 结构名1,【例3-13】,do j=1,2print*,第,j,次外循环开始print*,*do i=1,3print*,第,(j-1)*3+i,次内循环enddoprint*,第,j,次外循环结束print*,*enddoend,运行结果,57,循环嵌套执行的过程,58,循环嵌套循环的次数:,外层循环的次数为:R1内层循环的次数为:R2,整个循环的次数为:R R=R1*R2,59,计算循环嵌套循环次数:,M=0DO I=1,3,4DO J=4,19,4 M=M+1 PRINT*,M EN
20、DDOENDDOEND,运行结果,60,嵌套DO循环的说明,三种DO循环结构必须是完整的嵌套。循环嵌套时,内、外层不能使用相同的循环变量。循环转移的问题。DO循环结构可以与选择结构的嵌套。,61,计算循环嵌套循环次数:,M=0II:DO I=1,3,4JJ:DO J=4,19,4 M=M+1 if(M=3)EXIT II ENDDO JJENDDO IIPRINT*,MEND,运行结果,3.3.4 两种循环形式的比较和关系,(1)带循环变量的DO循环用来处理已确定循环次数的问题。DO WHILE循环既可以用来处理已知循环次数的循环问题,也可用来处理不确定循环次数的问题。,(2)对事先已确定循环
21、次数的问题,用带循环变量的DO循环比较方便,它能使循环变量自动增值,不需用户写逻辑表达式,只需写出循环变量的初值、终值和步长即可,使用方便。因此带变量的DO循环在气象上使用最为频繁。,(3)由于带循环变量的DO循环只能判断处理一个条件(循环次数R),当需要多个入口条件时,应考虑DO WHILE 循环结构。(4)各类循环可以相互转换以及互相嵌套。嵌套时,需要完整嵌套。,离散化均匀经纬度网格,【例3-14】,沿着某一经度剪开球体,1,请求出11度均匀经纬度网格上,不同纬线上位置相邻格点的实际球面距离。,部分运行结果,程序举例1,那么同一经线上,相邻格点的实际球面距离是多少?,假设降水资料的存放路径
22、按照右图有规律地存放,请利用循环,将1979年1月-1990年12月的资料路径,依次输出至屏幕上。,【例3-14】,程序难点,如何将年文件夹名称表示出来?如何将长度有变化的月文件夹名称表示出来?如何将年、月两个文件夹名称合并至整个文件路径中?,程序举例2,程序举例2,PROGRAM ex03_14IMPLICIT NONEinteger iy,imcharacter year*4,mo*2character dir*100!dir变量由于其有效长度是变化的,故定义一个足够长的字符串do iy=1979,1990write(year(1:4),(i4)iymo=!此处为情况保留值,将mo赋值为2
23、个或者1个空格均可以 do im=1,12 if(im10)then write(mo(1:1),(i1)im else write(mo(1:2),(i2)im endifdir=e:data/trim(year)/trim(mo)/precipprint*,trim(dir)enddo enddo end,运行结果,程序举例2,不用if块处理,只用write(mo(1:2),i2)im语句,所得运行结果,思考题:如果文件路径变为右图形式呢?,编程经验,合理估算你的程序运行时间,循环的条件往往是程序易错之处!例如,如果设计的循环程序要求计算量较大,但是运行过快,需要检查循环是否执行,多重嵌套时需要确保每层循环都按照设计思路进行运行。,do j=1,10do i=j,0print*,ienddoenddoend,程序运行中。,i=0Do while(i=0)i=i+1Enddoend,提示:死循环时,可用Ctrl+c终止你的程序,但是运行过长时,需要检查是否死循环。,本章小结,介绍了三大基本结构:顺序、选择和循环。顺序结构是最简单的一种,按语句的先后顺序依次执行;选择结构学习了解决两路分支或少于两路分支的IF语句结构、解决用于判断多个分支的情况的SELECT CASE语句 和选择结构的嵌套。循环结构,