第三章-结构化程序设计_第1页
第三章-结构化程序设计_第2页
第三章-结构化程序设计_第3页
第三章-结构化程序设计_第4页
第三章-结构化程序设计_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章

FORTRAN结构化程序设计本章内容顺序结构程序设计选择结构程序设计循环结构程序设计

结构化程序设计:按照一定的结构形式来设计和编写程序,以便阅读与检查。顺序结构选择结构循环结构

当型循环

直到型循环

3.1顺序结构程序设计先上后下,先左后右;即先执行A,再执行B顺序结构【例3-1】输入3个气象站5个月(汛期)雨量数据,统计每个气象站的总雨量和平均雨量,计算3个站五月、六月、七月、八月、九月的平均雨量,输出每个气象站每个月的雨量、总雨量和平均雨量,以及五月、六月、七月、八月、九月的平均雨量。站名汛期各月雨量(毫米)5月6月7月8月9月江阴76.8176.5308.141.069.6定波闸71.5208.5352.147.262.6肖山65.5200.0239.744.363.0表3-11998年主要站汛期雨量统计表1

PROGRAMex06_02

2

IMPLICITNONE

3

REALr11,r12,r13,r14,r15,total11,av11

4

REALr21,r22,r23,r24,r25,total21,av21

5

REALr31,r32,r33,r34,r35,total31,av31

6

REALav1,av2,av3,av4,av5

7

WRITE(*,“(28X,‘5月6月7月8月9月’)”)

8

WRITE(*,“(1X,‘输入江阴气象站五个月的雨:’,\)”)

9

READ(*,*)r11,r12,r13,r14,r15

10

WRITE(*,“(1X,‘输入定波闸气象站五个月的雨量:’,\)”)

11

READ(*,*)r21,r22,r23,r24,r25

12

WRITE(*,“(1X,‘输入肖山气象站五个月的雨量:’,\)”)

13

READ(*,*)r31,r32,r33,r34,r35

14

!100 FORMAT(F5.1,F5.1,F5.1,F5.1,F5.1)

15

total11=r11+r12+r13+r14+r15

16

av11=total11/5

17

total21=r21+r22+r23+r24+r25

18

av21=total21/5

19

total31=r31+r32+r33+r34+r35

20

av31=total31/5

21

av1=(r11+r21+r31)/3

22

av2=(r12+r22+r32)/3

23

av3=(r13+r23+r33)/3

24

av4=(r14+r24+r34)/3

25

av5=(r15+r25+r35)/3

26

WRITE(*,“(26X,‘5月6月7月8月9月总雨量平均雨量’)”)

27

WRITE(*,200)‘江阴气象站五个月的雨量:’,r11,r12,r13,r14,r15,total11,av11

28

WRITE(*,200)‘定波闸气象站五个月的雨量:’,r21,r22,r23,r24,r25,total21,av21

29

WRITE(*,200)‘肖山气象站五个月的雨量:’,r31,r32,r33,r34,r35,total31,av31

30

200

FORMAT(1X,A22,5(F5.1,2X),F6.1,2X,F7.3)

31

WRITE(*,300)‘5月’,av1,‘6月’,av2,‘7月’,av3,‘8月’,av4,‘9月’,av5

32

300

FORMAT(1X,A4,‘平均雨量:’,F7.3)

33

END运行结果:3.2选择结构3.2.1选择结构简介3.2.2

IF语句3.2.3

SELECTCASE语句3.2.4选择语句的嵌套3.2.1选择结构简介

依据给定的条件做逻辑判断,再根据判断的结果决定应执行哪种操作——选择结构。如:1输入学生成绩,判定合格与否,输出判定结果。2已知三个整数A,B,C,输入其值并打印三个数中最大值。

3暴雨预警信号分三级,分别以黄色、橙色、红色表示。

(1)暴雨黄色预警信号(2)暴雨橙色预警信号(3)暴雨红色预警信号根据降雨量评判当前预警信号,从而做出不同防御指南。必须使用选择结构程序来解决这类问题FORTRAN提供了3种典型的块IF结构:

(1)单分支

(2)双分支

(3)多分支3.2.2

IF语句(1)单分支块IF结构

一般形式为:

IF(条件) THEN IF块

ENDIF这种块IF结构包括:块IF语句“IF(条件)THEN”。它是块IF结构的入口语句。IF块。它是一个语句序列,由若干条可执行语句组成。ENDIF语句。它是块IF结构的出口语句。

【例3-2】从键盘输入一个气温值,如果大于35.0,则显示在屏幕上。1PROGRAMex04_022IMPLICITNONE3REALT4 READ*,T5 IF(T>35.0) THEN6 PRINT*,'这是高温'7 PRINT*,'T=',T8 ENDIF9END(2)双分支块IF结构

一般形式为:

IF(条件) THEN IF块

ELSE ELSE块

ENDIF【例3-3】由于大气受到污染,一些地区开始形成酸雨区,酸雨是指PH值小于5.6的雨雪或其他形式的大气降水。通过收集水样测量其PH值,判断它的酸碱性并打印出来。根据题意设计算法并画出程序流程图,如图所示。1PROGRAMex07_032IMPLICITNONE3 REALph4 WRITE(*,*)'PleaseenterPHvalue:'5 READ*,ph!定义变量ph来存放酸碱度值6 IF(ph<5.6)THEN!用分支语句来判断7 WRITE(*,100)ph8 ELSE9 WRITE(*,200)ph10 ENDIF11100FORMAT(1X,'PH=',F4.2,',isacidrain!')12200FORMAT(1X,'PH=',F4.2,',isnotacidrain!')13END(3)多分支块IF结构

一般形式为:

IF(条件1) THEN

块1 ELSEIF(条件2)THEN

块2 ELSEIF(条件3)THEN

块3 . . ELSEIF(条件n)THEN

块n [ELSE

块n+1] ENDIF【例3-4】在气象部门发布的天气预报中小雨、中雨、暴雨等专业术语,它们之间的区别如表所示:降雨强度降雨量(12小时,单位:mm)降雨量(24小时,单位:mm)小雨<5<10中雨5~1510~25大雨15~3025~50暴雨30~7050~100大暴雨70~140100~250特大暴雨>140>2501PROGRAMex07_042IMPLICITNONE3 REALr!定义用来记录降雨量的实型量r4 WRITE(*,100)5 READ*,r6 IF(r<5)THEN!用多分支IF语句进行判断7 PRINT2008 ELSEIF(r<15)THEN9 PRINT30010 ELSEIF(r<30)THEN11 PRINT40012 ELSEIF(r<70)THEN13 PRINT50014 ELSEIF(r<140)THEN15 PRINT60016 ELSE17 PRINT70018 ENDIF19100FORMAT(1X,'请输入12小时降雨量:')20200FORMAT(1X,'小雨')21300FORMAT(1X,'中雨')22400FORMAT(1X,'大雨')23500FORMAT(1X,'暴雨')24600FORMAT(1X,'大暴雨')25700FORMAT(1X,'特大暴雨')26END(4)逻辑IF结构

逻辑IF语句的一般形式:

IF(条件)语句其中“条件”可以是一个合法的逻辑表达式或关系表达式,“语句”是一个合法的可执行语句,且只有一条语句。【例3-5】根据层结参数N2的大小可以判断大气层结状态:N2要求从键盘输入。1PROGRAMex07_052IMPLICITNONE3 REALN24 WRITE(*,100)5 READ(*,*)N26 IF(N2.EQ.0.0)PRINT*,‘中性层结’7 IF(N2.GT.0.0)PRINT*,‘稳定层结’8 IF(N2.LT.0.0)PRINT*,‘不稳定层结’9100 FORMAT(1X,'PLEASEINPUTN2:')10END

CASE结构是一种多路分支选择结构,可有多个分支可供选择。

CASE结构的一般形式为:

SELECTCASE(选择表达式)

CASE(控制表达式1) 块1 CASE(控制表达式2) 块2 . . CASE(控制表达式n) 块n [CASEDEFAULT

默认块] ENDSELECT3.2.3SELECTCASE语句

实质:判断选择表达式的值是否与某一控制表达式的值相匹配。说明:选择表达式和控制表达式可以为整型、逻辑型或字符型。控制表达式可以是一个不重复的值或一组同类值的列表,如:(1)用逗号分隔的单个值列表。如:CASE(‘a’,‘b’,‘c’,‘x’,‘y’,‘z’),当选择表达式的值为a,b,c,x,y,z之一时,执行相应的语句块。CASE(3,6,9),当选择表达式的值为3,6或9时,执行相应的语句块。(2)用冒号分隔的值的范围。如:CASE(‘a’:‘g’),当选择表达式的值落入a~g范围内时,执行相应的语句块。CASE(5:10),当选择表达式的值落入5~10范围内时,执行相应的语句块。CASE(10:),当选择表达式的值大于或等于10时,执行相应的语句块。CASE(:10),当选择表达式的值小于或等于10时,执行相应的语句块。【例3-6】根据风对地上物体所引起的现象将风的大小分为13个等级,称为风力等级,以0~12等级数字记载,如下表所示:等级名称风速陆地物象海面波浪浪高0无风0.0~0.2烟直上平静0.01软风0.3~1.5烟示风向微波峰无飞沫0.12轻风1.6~3.3感觉有风小波峰未破碎0.23微风3.4~5.4旌旗展开小波峰顶破裂0.64和风5.5~7.9吹起尘土小浪白沫波峰1.05劲风8.0~10.7小数摇摆中浪折沫峰群2.06强风10.8~13.8电线有声大浪到个飞沫3.07疾风13.9~17.1步行困难破峰白沫成条4.08大风17.2~20.7折毁树枝浪长高有浪花5.59烈风20.8~24.4小损房屋浪峰倒卷7.010狂风24.5~28.4拔起树木海浪翻滚咆哮9.011暴风28.5~32.6损毁普遍波峰全呈飞沫11.512台风/飓风32.7以上摧毁巨大海浪滔天14.0现对所输入的风速进行分类并输出。

1PROGRAMex07_062IMPLICITNONE3REALwind_velocity4PRINT*,'请输入风速:'5READ*,wind_velocity6SELECTCASE(INT(wind_velocity*10))7 CASE(0:2)8 PRINT*,'0级'9 PRINT*,'无风'10 CASE(3:15)11 PRINT*,'1级'12 PRINT*,'软风'13 CASE(16:33)14 PRINT*,'2级'15 PRINT*,'轻风'。

。。。。

。。。40 CASE(285:326)41 PRINT*,'11级'42 PRINT*,'暴风'43 CASE(327:)44 PRINT*,'12级'45 PRINT*,'台风/飓风'46 CASEDEFAULT47 PRINT*,'非法数据'48ENDSELECT49END

在一个块IF结构中都可以完整地包含一个(或多个)块IF结构,即构成块IF的嵌套结构。它的结构为:

3.2.4选择语句的嵌套

当嵌套层次过多时,往往一时难以找到同一层的块IF中的各语句,一般可按以下方法确定:

(1)从最内层的块IF语句开始,向下找到离它最近的ENDIF语句,将它们用线括起来,这就是同一层次的块IF。(2)由内向外重复这一个过程,直到遇见最外层块IF语句和ENDIF语句为止。(3)在书写嵌套分支结构时采取缩进方式进行程序书写,程序的嵌套层次就容易确定。【例3-7】求解当系数a,b,c为不同情况下的一元二次方程根。N-S图如下:

READ*,a,b,cd=b**2-4.0*a*cIF(a==0.0)THENIF(b==0.0)THENIF(c==0.0)THEN PRINT*,'平凡解'ELSEPRINT*,'无解'ENDIFELSEPRINT*,'一个实根'PRINT*,-c/dENDIFELSEIF(d>0.0)THEN x1=(-b+sqrt(d))/(2.0*a) x2=(-b-sqrt(d))/(2.0*a) PRINT*,'两个不等实根:' PRINT*,'x1=',x1 PRINT*,'x2=',x2ELSEIF(d==0.0)THEN PRINT*,'两个相等实根' PRINT*,-b/(2.0*a)ELSE pr=-b/(2.0*a) pi=sqrt(-d)/(2.0*a) PRINT*,'两个复根' PRINT*,'x1=',pr,'+',pi,'i' PRINT*,'x2=',pr,'-',pi,'i'ENDIFENDIFEND【例3-8】已知U,V风速,判断风向:U>0;V>0西南风U>0;V<0西北风U<0;V>0东南风U<0;V<0东北风programex0308realu,vread*,u,vif(u>0.0)then

if(v>0.0)then!u>0,v>0print*,'西南风'

elseif(v<0.0)then!u>0,v<0print*,'西北风‘

else!u>0,v=0print*,'西风'

endifelseif(u<0.0)then

if(v>0.0)then!u<0,v>0print*,'东南风'

elseif(v<0.0)then!u<0,v<0print*,'东北风'

else!u<0,v=0print*,'东风‘

endifelse

if(v>0.0)then!u=0,v>0print*,'南风'

elseif(v<0.0)then!u=0,v<0print*,'北风'

else!u=0,v=0print*,'无风'

endifendifend3.3循环结构程序设计

3.3.1循环语句的形式3.3.2循环控制语句3.3.3循环语句的嵌套3.3.4两种循环形式的比较和关系3.3.1循环语句的形式

(1)有循环变量的DO循环结构

格式有循环变量DO结构的一般形式为:[结构名:]DO循环变量=E1,E2,E3

循环体ENDDO[结构名]DO循环结构的程序举例【例3-9】了解循环执行的过程和计算循环次数DOI=1,3,2M=I*IPRINT*,I,MENDDOEND运行结果DO循环结构循环的次数:R=MAX(INT((E2-E1+E3)/E3),0)REAL::IDOI=0.6,6.6,1.4INTEGER::IDOI=0.6,6.6,1.4DOR=0.6,6.6,-1.4DOR=6.6,0.6,1.45次,0.6,2.0,3.4,4.8,6.27次,0,1,2,3,4,5,60次0次先计算E1、E2、E3的值,然后转换为与循环控制变量相同的类型;给循环控制变量赋初值

v=E1;计算循环次数,计算公式为:

R=MAX(INT((E2-E1+E3)/E3),0)检查循环次数,当R0时,执行循环体,继续做第(4-6)步;当

R≤0时,转向(7);当执行到循环终端语句时,循环变量按步长增值,即:循环变量

=循环变量

+E3;循环次数减1:R=R–1;返回

(4)继续执行。

循环结束。执行过程注意事项循环变量在循环体中可以引用不能重新赋值E1、E2、E3的类型应与循环变量相同。E3的缺省意味着循环步长为1。可以不经过ENDDO语句退出循环DO循环和其它结构(如块IF结构、CASE结构)可以相互嵌套使用退出循环后,循环变量仍然存在。【例3-10】循环输入一周日最高气温,判断最高气温,并计算一周平均最高气温。2014年3月23日-29日南京日最高气温如下:16.017.017.018.016.022.024.0(单位:℃)。programex0309realt,tmax,sum,taveIntegeritmax=0.0sum=0.0doi=1,7read*,tsum=t+sumif(t>=tmax)thentmax=tendifenddotave=sum/7.0print*,'tmax=',tmaxprint*,'tave=',taveend43(2)DO-WHILE控制的循环结构

DO-WHILE结构格式一般形式为:[结构名:]DOWHILE(逻辑表达式)

循环体

ENDDO[结构名]例子【例3-11】循环输入每六小时降水资料,如果发现数据小于0或者大于1000时,终止循环,并提示输入数据异常。realprecipprint*,'输入每六小时降水量(mm):'read*,precipdowhile(precip.ge.0.and.precip.le.1000) print*,'降水量(mm):',precip read*,precipenddoprint*,'输入数据异常'end程序运行结果45DO-WHILE循环流程图

46循环结构的选择:如果已知循环的次数,或者知道循环的初值和终值,那么用有循环变量的DO循环结构。知道循环的条件时,选用DO_WHILE循环结构,或者是重复DO循环结构。其中在使用这两种结构时,注意循环条件的变化,以避免“死循环”。47(1)EXIT语句EXIT语句用于强制退出循环,将执行控制转移到当前循环或结构之外。

一般格式为:

EXIT[DO循环结构名]

3.3.2循环流程控制语句48EXIT语句的使用说明:EXIT语句通常是作为逻辑IF语句的内嵌语句来使用。其作用是有条件中断。

形式为:IF(逻辑表达式)EXIT[结构名]

执行过程为:当逻辑表达式为真时,中止正在执行的循环,将控制转到EXIT语句指定的结构之后;当逻辑表达式为假时,继续正在执行的循环,不进行任何转移。49【例3-12】输入正整数n,求级数的前n项和,如果当某项绝对值≤10-5时,虽未满n项,也因满足精度而不再加入下一项。1PROGRAMex08_08

2IMPLICITNONE

3INTEGER::i,n

4REAL::s=0,t

5READ*,n

6DOi=1,n

7t=1./(i*(i+1))!注意t要求是实型8s=s+t

9IF(ABS(t)<=1.E-5)EXIT!循环的非正常出口时,I的值为当前值10ENDDO

11IF(i==n+1)i=i-1!循环正常出口时,I的值为终值+步长12PRINT*,'SUM=',s,'TERM=',i

13END

51(2)CYCLE语句

CYCLE语句用于中止执行循环体中剩余的语句,重新执行下一轮循环。

一般格式为:

CYCLE[DO循环结构名]52CYCLE语句的使用说明:CYCLE语句与EXIT语句不同,它不中止循环的执行,而是将循环变量增加一个步长,从下一个循环开始执行。CYCLE语句通常是作为逻辑IF语句的内嵌语句来使用。形式为: IF(逻辑表达式)CYCLE[DO循环结构名]

53执行过程:当逻辑表达式为真时,中止正在执行的循环体的剩余语句,将控制转到循环体的开始重新循环;当逻辑表达式为假时,继续正在执行的循环,不进行任何转移。【例3-13】顺序输出1-10序列中除了9以外的其它数字doi=1,10 if(i==9)cycle print*,ienddoend运行结果【练习】输入3月份气温,缺测记录为999,请统计3月份平均气温。programmainimplicitnonerealt,tsum,taveintegeri,numtsum=0.0num=0doi=1,31read*,tif(t==999.0)cycletsum=tsum+tnum=num+1enddotave=tsum/numprint*,taveendprogrammainimplicitnonerealt,tsum,taveintegeri,numtsum=0.0num=0doi=1,31read*,tif(t/=999.0)thentsum=tsum+tnum=num+1endifenddotave=tsum/numprint*,taveend563.3.3循环语句的嵌套

DO循环结构嵌套的一般格式为:

[结构名1:]DOV1=E11,E12,E13[其它循环体][结构名2:]DOV2=E21,E22,E23

内部循环体

ENDDO[结构名2][其它循环体]ENDDO[结构名1]【例3-13】doj=1,2 print*,'第',j,'次外循环开始' print*,'****' doi=1,3 print*,'第',(j-1)*3+i,'次内循环' enddo print*,'第',j,'次外循环结束' print*,'****'enddoend运行结果58循环嵌套执行的过程

计算外层循环次数R1,I赋初值R1>0计算内层循环次数R2,J赋初值R2>0执行内层循环体J=J+内层循环步长R2=R2-1I=I+外层循环步长R1=R1-159循环嵌套循环的次数:外层循环的次数为:R1内层循环的次数为:R2整个循环的次数为:RR=R1*R260计算循环嵌套循环次数:M=0DOI=1,3,4

DOJ=4,19,4 M=M+1

PRINT*,M

ENDDOENDDOEND运行结果61嵌套DO循环的说明

三种DO循环结构必须是完整的嵌套。循环嵌套时,内、外层不能使用相同的循环变量。循环转移的问题。DO循环结构可以与选择结构的嵌套。62计算循环嵌套循环次数:M=0II:DOI=1,3,4 JJ:DOJ=4,19,4 M=M+1 if(M>=3)EXITII ENDDOJJENDDOIIPRINT*,MEND运行结果3.3.4两种循环形式的比较和关系

(1)带循环变量的DO循环用来处理已确定循环次数的问题。DOWHILE循环既可以用来处理已知循环次数的循环问题,也可用来处理不确定循环次数的问题。(2)对事先已确定循环次数的问题,用带循环变量的DO循环比较方便,它能使循环变量自动增值,不需用户写逻辑表达式,只需写出循环变量的初值、终值和步长即可,使用方

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论