《fortran循环结构及基本语句.ppt》由会员分享,可在线阅读,更多相关《fortran循环结构及基本语句.ppt(20页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第五讲第五讲第五讲第五讲 循环结构及基本语句循环结构及基本语句循环结构及基本语句循环结构及基本语句5.1 5.1 5.1 5.1 循环结构概述循环结构概述循环结构概述循环结构概述对于问题规模较大的重复问题适宜采用循环结构。对于问题规模较大的重复问题适宜采用循环结构。如:从键盘输入如:从键盘输入5050个数,求个数,求5050个数之和,并输出。个数之和,并输出。求解算法:求解算法:求解程序:求解程序:(1)(1)初始化:初始化:0.00.0sumsum。(2)1(2)1I I。(3)(3)如果如果I50,I50,则执行步骤则执行步骤(7)(7)。(4)(4)输入一个数输入一个数x,x,并累加到并
2、累加到sumsum中。中。(5)I+1(5)I+1I I。(6)(6)转步骤转步骤(3)(3)。(7)(7)输出结果输出结果sumsum。(8)(8)结束。结束。对于上述算法和程序,不管程序规模多大,长度不变。对于上述算法和程序,不管程序规模多大,长度不变。Program ex1Program ex1 sum=0.0 sum=0.0 DO I=1,50,1 DO I=1,50,1 READ(*,*)xREAD(*,*)x sum=sum=sum+xsum+x ENDDO ENDDO WRITE(*,*)sum=,sum WRITE(*,*)sum=,sumENDEND循循环结环结构分构分为为两
3、两类类:l循环体的循环次数事先确定循环体的循环次数事先确定(如如 例例5.15.1 中循环结构中循环结构),),这类循环结这类循环结构称为确定性循环构称为确定性循环,或称或称“计数型计数型”循环循环,使用计数型循环语句使用计数型循环语句(如如DODO循环语句循环语句)实现这类循环结构。实现这类循环结构。循循环环次数次数为为:MAX(MAX(终值终值-初初值值)/)/步步长长+1+1,0),0)。l循环体的循环次数事先不确定循环体的循环次数事先不确定(如如 例例5.25.2 中循环结构中循环结构),),这类循环这类循环结构称为非确定性循环结构称为非确定性循环,或称或称“条件型条件型”循环循环,使
4、用条件型循环语使用条件型循环语句句(如如DO WHILEDO WHILE循环语句循环语句)实现这类循环结构。条件型循环又分实现这类循环结构。条件型循环又分“当型当型”循环和循环和“直到型直到型”循环。循环。初值初值循环变量循环变量v vvv终值终值v+v+步长步长v v假假真真计数型计数型判定条件判定条件判定条件判定条件循环体循环体假假真真循环体循环体假假真真当型当型直到型直到型 例例5.1 5.1 求求S=1+2+3+S=1+2+3+N+N的值的值(N(N由键盘输入由键盘输入,N2),N2)。编写程序。编写程序。解:求解这一问题解:求解这一问题,将执行将执行N-1N-1次加法运算。次加法运算
5、。如果将等式写成如果将等式写成S=0+1+2+S=0+1+2+N,+N,则执行则执行N N次加法运算。次加法运算。重复问题易采用循环结构实现。重复问题易采用循环结构实现。用用S S保存和保存和,用用N N保存最大求和保存最大求和值值,用用I I作作计计数器。数器。编编写程序如下:写程序如下:Program ex2 Program ex2 INTEGER S,N,IINTEGER S,N,I READ(*,*)N READ(*,*)N S=0 S=0 DO I=1,N,1 DO I=1,N,1 S=S+I S=S+I EDNDO EDNDO WRITE(*WRITE(*,*)S=,S)S=,S
6、END END 例例5.2 5.2 读读入某班入某班级级考考试试成成绩绩(人数不定人数不定),),计计算其平均成算其平均成绩绩,并并输输出出。解:由于学生人数不定解:由于学生人数不定,所以输入的学生成绩个数不确定所以输入的学生成绩个数不确定,以输入以输入-1-1作作为结束标志为结束标志(因为成绩不可能为负数因为成绩不可能为负数),),从而动态确定学生人数从而动态确定学生人数n n。平均成绩计算公式是:平均成绩计算公式是:avav=(x=(x1 1+x+x2 2+x xn n)/n)/n Program ex3 Program ex3 INTEGER sum,n,x INTEGER sum,n,
7、x REAL REAL avav sum=0 sum=0 n=0 n=0 READ(*,*)x READ(*,*)x DO WHILE(x/=-1)DO WHILE(x/=-1)n=n+1 n=n+1 sum=sum=sum+xsum+x READ(*,*)x READ(*,*)x ENDDO ENDDO avav=sum/n=sum/n WRITE(*WRITE(*,*)平均成绩为:平均成绩为:,avav END END5.2 5.2 5.2 5.2 使用使用使用使用DODODODO循环语句实现计数型循环循环语句实现计数型循环循环语句实现计数型循环循环语句实现计数型循环 DO:DO=,:DO
8、=,1 2 n ENDDO ENDDO 说明:说明:v v为循环变量,一般为整型变量,用来控制循环次数。为循环变量,一般为整型变量,用来控制循环次数。e1e1、e2e2和和e3e3为表达式,为表达式,其类型与循环变量类型相同。其类型与循环变量类型相同。e1e1代表循环变量代表循环变量v v的初值,的初值,e2e2代表循环变量代表循环变量v v的的终值,终值,e3e3代表循环变量代表循环变量v v的步长,的步长,e3e3可缺省,可缺省,e3e3缺省指缺省指e3e3为为1 1。循环次数计算公式是:循环次数计算公式是:MAX(MAX(e2-e1)/e3+1(e2-e1)/e3+1 ,0)0)。如果如
9、果e30e30,则一般要求则一般要求e1e2e1e2,否则循环次数为否则循环次数为0 0,即循环体一次也不执行。,即循环体一次也不执行。如果如果e30e30,则一般要求则一般要求e1e2e1e2,否则循环次数为否则循环次数为0 0,即循环体一次也不执行。,即循环体一次也不执行。在循环体中可引用循环变量在循环体中可引用循环变量v v的值,但不能赋值,即修改它的值。的值,但不能赋值,即修改它的值。DODO循环语句执行过程说明:下面循环语句执行过程说明:下面DODO循环语句的循环次数为循环语句的循环次数为5 5:M=1;N=5;L=1M=1;N=5;L=1 DO I=M,N+5,L+1 !DO I=
10、M,N+5,L+1 !输出输出1 1、3 3、5 5、7 7、9 9 write(*,*)I,M,N,L write(*,*)I,M,N,L M=M+1;N=N*I;L=2*L+I M=M+1;N=N*I;L=2*L+I ENDDO ENDDO程序运行后程序运行后,输出结果为:输出结果为:1 1 5 11 1 5 1 3 2 5 3 3 2 5 3 5 3 15 9 5 3 15 9 7 4 75 23 7 4 75 23 9 5 525 53 9 5 525 53计算表达式计算表达式e1e1,e2e2,e3e3e1 e1 v v计算循环次数计算循环次数r:MAX(INT(e2-e1)/e3+
11、1)r:MAX(INT(e2-e1)/e3+1),0)0)r rr r 0 0执行循环体执行循环体v+e3 v+e3 v vr-1 r-1 r rDODO循环语句下面一条语句循环语句下面一条语句真真假假5.3 5.3 5.3 5.3 使用使用使用使用DO WHILEDO WHILEDO WHILEDO WHILE循环语句实现循环循环语句实现循环循环语句实现循环循环语句实现循环 DO:DO WHILE(:DO WHILE()1 2 n ENDDO ENDDO 说明:说明:循环条件可以是关系表达式,也可以是逻辑表达式,但不能是算术循环条件可以是关系表达式,也可以是逻辑表达式,但不能是算术表达式或字
12、符表达式。表达式或字符表达式。使用使用DO WHILEDO WHILE语句时要特别注意死循环的产生,要保证循环体中至少语句时要特别注意死循环的产生,要保证循环体中至少有一条对循环控制条件有影响的语句,否则将产生死循环。有一条对循环控制条件有影响的语句,否则将产生死循环。循环体循环体 DO WHILEDO WHILE循循环语环语句在每次循句在每次循环环体体执执行前都要行前都要计计算表示循算表示循环环控制控制条件的条件的逻辑逻辑表达式表达式,其其计计算算结结果决定循果决定循环环体是否体是否继续执继续执行行,循循环环体的体的执执行行过过程必程必须对须对循循环环控制条件控制条件产产生影响。生影响。计算
13、表示循环控制条件的逻辑表达式计算表示循环控制条件的逻辑表达式结果赋予结果赋予logloglog=.TRUE.log=.TRUE.循环语句下面一条语句循环语句下面一条语句真真假假执行循环体执行循环体PROGRAM cycle2PROGRAM cycle2sum=0sum=0READ(*,*)xREAD(*,*)xDO WHILE(0=x.AND.DO WHILE(0=x.AND.x=100)x=9)EXIT IF(I=9)EXITENDDOENDDOENDEND!示例程序二:输出奇数示例程序二:输出奇数1,3,5,7,91,3,5,7,9I=1I=1DO WHILE(I=100)DO WHILE
14、(I=9)EXIT IF(I=9)EXIT I=I+2 I=I+2ENDDOENDDOENDEND!示例程序三:输出奇数示例程序三:输出奇数1,3,5,7,91,3,5,7,9I=1I=1DO DO write(*,*)I write(*,*)I IF(I=9)EXIT IF(I=9)EXIT I=I+2 I=I+2ENDDOENDDOENDENDCYCLECYCLE功能:功能:在循环体执行过程中强制性终止本次循环的执行在循环体执行过程中强制性终止本次循环的执行,转循环开转循环开始语句始语句(DO(DO语句语句)执行。只能在执行。只能在DODO和和DO WHILEDO WHILE循环语句内使用
15、循环语句内使用CYCLECYCLE语句。语句。DO I=2,5DO I=2,5 write(*,(1X write(*,(1X,I3)II3)I IF(I3)CYCLE IF(I3)CYCLE write(*,(1X,I3)I write(*,(1X,I3)IEND DOEND DOWrite(*,*)Write(*,*)结束!结束!ENDEND!执行结果:执行结果:2 2 3 3 4 52 2 3 3 4 55.6 5.6 特殊特殊DODO循环语句与循环语句与EXITEXIT语句语句:DO:DO 1 2 n ENDDO ENDDO 说明:说明:特殊特殊DODO循环语句必须与循环语句必须与EX
16、ITEXIT语句配合使用。语句配合使用。使用特殊使用特殊DODO循环语句可使循环变得短小、简洁、清晰。循环语句可使循环变得短小、简洁、清晰。执行过程:执行过程:(1)(1)按顺序依次执行循环体语句。按顺序依次执行循环体语句。(2)(2)循环执行过程中循环执行过程中,若满足循环结束条件若满足循环结束条件,则执行则执行EXITEXIT语句退出循环。语句退出循环。(3)(3)无条件无条件转转(1)(1)。循环体循环体循环体循环体:DO:DO 1 2 n ENDDO ENDDO 说明:说明:特殊特殊DODO循环语句必须与循环语句必须与EXITEXIT语句配合使用。语句配合使用。使用特殊使用特殊DODO
17、循环语句可使循环变得短小、简洁、清晰。循环语句可使循环变得短小、简洁、清晰。执行过程:执行过程:(1)(1)按顺序依次执行循环体语句。按顺序依次执行循环体语句。(2)(2)循环执行过程中循环执行过程中,若满足循环结束条件若满足循环结束条件,则执行则执行EXITEXIT语句退出循环。语句退出循环。(3)(3)无条件无条件转转(1)(1)。(示例示例)循环体循环体ProgramProgramINTEGER MINTEGER M,N N,R1R1,R2R2,R3R3,gcdgcd,lcmlcmWrite(*,*)Write(*,*)输入两个自然数:输入两个自然数:READ(*,*)M,NREAD(*
18、,*)M,NR1=M;R2=NR1=M;R2=NDO DO IF(R2=0)EXIT IF(R2=0)EXIT R3=MOD(R1,R2)!R3=MOD(R1,R2)!求求R1R1除以除以R2R2的余数的余数 R1=R2;R2=R3R1=R2;R2=R3END DOEND DOgcdgcd=R1;lcm=M*N/=R1;lcm=M*N/gcdgcdWrite(*,(1X,I3,Write(*,(1X,I3,和和,I3,I3,的最大公约数为:的最大公约数为:,I3)M,N,gcd,I3)M,N,gcdWrite(*,(1X,I3,Write(*,(1X,I3,和和,I3,I3,的最小公倍数为:的
19、最小公倍数为:,I3)M,N,lcm,I3)M,N,lcmENDEND5.7 5.7 循环嵌套循环嵌套l前面介绍的循环结构和循环语句前面介绍的循环结构和循环语句都是一层循环都是一层循环,许多实际问题的许多实际问题的求解算法和程序往往具有多重循求解算法和程序往往具有多重循环结构。环结构。l多重循环结构称为循环嵌套多重循环结构称为循环嵌套,循循环嵌套是指在一个循环结构或循环嵌套是指在一个循环结构或循环语句的循环体中又含有循环结环语句的循环体中又含有循环结构或循环语句。对于构或循环语句。对于n n层循环嵌层循环嵌套称为套称为n n重循环。嵌套的循环层重循环。嵌套的循环层数原则上不限数原则上不限,但不
20、易太多。但不易太多。l计数型、当型、直到型循环结构计数型、当型、直到型循环结构都可相互嵌套都可相互嵌套,DO,DO语句、语句、DO DO WHILEWHILE语句、特殊语句、特殊DODO循环语句都循环语句都可相互嵌套。根据实际问题的求可相互嵌套。根据实际问题的求解需要决定循环嵌套的形式和层解需要决定循环嵌套的形式和层数。数。l如果有如果有n n重循环重循环,且循环次数分别且循环次数分别为为r r1 1、r r2 2、r rn n,则一般最内层则一般最内层循环体的循环总次数为:循环体的循环总次数为:r r1 1 r r2 2 r rn n。一层循环一层循环二层循环二层循环二层循环二层循环三层循环
21、三层循环三层循环三层循环四层循环四层循环 例例5.85.8求求 。解:求解这一问题的算法结构具有解:求解这一问题的算法结构具有“计数型计数型”循环结构与循环结构与“计数型计数型”循循环结构嵌套的二重循环结构。程序中用两个环结构嵌套的二重循环结构。程序中用两个DODO循环语句嵌套来实现二重循环语句嵌套来实现二重循环结构。循环结构。ProgramProgramINTEGER:iINTEGER:i,j j,fac,fac_sumfac,fac_sum=0=0!循环嵌套循环嵌套DO i=1,10 DO i=1,10 !用外层循环控制求和次数用外层循环控制求和次数 facfac=1=1 DO j=1,i
22、 DO j=1,i !用内层循环控制阶乘用内层循环控制阶乘 facfac=facfac*j*j ENDDO ENDDO fac_sumfac_sum=fac_sum+facfac_sum+facENDDOENDDOWrite(*,*)Write(*,*)前前1010个自然数的阶乘和个自然数的阶乘和=,=,fac_sumfac_sumEND END!赋值语句赋值语句facfac=facfac*j*j被被执行执行5555次次!赋值语句!赋值语句fac_sumfac_sum=fac_sum+facfac_sum+fac被被执行执行1010次次 例例5.125.12根据下面泰勒根据下面泰勒级级数求数求
23、x x的正弦的正弦值值。解:解:我我们们已已经经熟悉熟悉FORTRAN 90FORTRAN 90提供的提供的SIN(x)SIN(x)、COS(x)COS(x)、EXP(x)EXP(x)等内部函数等内部函数,我我们们可直接使用可直接使用这这些内部函数些内部函数计计算正弦、余弦、指数等算正弦、余弦、指数等值值。那么。那么这这些函数些函数是如何是如何计计算的呢?一般都是通算的呢?一般都是通过过其泰勒其泰勒级级数数计计算。下面我算。下面我们们不用内部函数不用内部函数,自己自己编编写程序写程序计计算正弦算正弦值值,然后与内部函数然后与内部函数计计算算值进值进行比行比较较。遇到遇到这类问题这类问题,必必须
24、须将泰勒将泰勒级级数用通数用通项项公式表示公式表示,然后得出迭代公式。然后得出迭代公式。其中:其中:n=1,2,3,n=1,2,3,。设:设:T Tn n=(-1)=(-1)n+1n+1x x2n-12n-1/(2n-1)!=T/(2n-1)!=Tn-1n-1(-1)x(-1)x2 2/(2n-2)(2n-1),n=1,2,3,/(2n-2)(2n-1),n=1,2,3,sinx sinx T T1 1+T+T2 2+T+Tn n,T,Tn+1n+11010-7-7,10,10-7-7决定了计算精度。决定了计算精度。上述计算问题变成了一个求和问题上述计算问题变成了一个求和问题,可用一个可用一个
25、DO WHILEDO WHILE语句实现。语句实现。根据分析,设计算法,编写程序根据分析,设计算法,编写程序。PROGRAM Sin_xPROGRAM Sin_xPARAMETER(pi=3.14159278PARAMETER(pi=3.14159278,epseps=1E-7)=1E-7)INTEGER INTEGER:n=1n=1,maxtermsmaxterms=10=10REAL xREAL x,T T,sinxsinxWRITE(*WRITE(*,“(A)(A)”,ADVANCE=ADVANCE=NONO)输入一个度数值:输入一个度数值:READ(*,*)xREAD(*,*)xx=x
26、*pi/180 x=x*pi/180 !转换为弧度值转换为弧度值T=T=x;sinxx;sinx=T=TDO WHILE(ABS(T)DO WHILE(ABS(T)eps).AND.(neps).AND.(n=IF(ABS(T)eps)THENeps)THEN write(*,*)write(*,*)发散级数,不能得到结果。发散级数,不能得到结果。ELSEELSE write(*,*)write(*,*)程序计算得到的正弦值:程序计算得到的正弦值:,sinxsinx write(*,*)FORTRAN 90 write(*,*)FORTRAN 90内部函数值:内部函数值:,SIN(x)SIN(
27、x)END IFEND IFENDEND计算计算T T和和sinxsinx将将x x转换为弧度转换为弧度开始开始 不满足精度吗不满足精度吗?真真假假结束结束输入输入x xn+1n+1n n初始化初始化T T和和sinxsinx判定收敛或发散,并输出相应结果判定收敛或发散,并输出相应结果输入数据:输入数据:输入一个度数值:输入一个度数值:4545输出结果为:输出结果为:程序计算得到的正弦值:程序计算得到的正弦值:0.70710680.7071068 Fortran 90 Fortran 90内部函数值:内部函数值:0.70710680.70710681 1 输输入入x x值值(x x 1),1),按按下下列列公公式式计计算算s s。精精度度要要求求5 5位位有有效效数数字字,最最后后一一项项1010-5-5。编写程序实现之。编写程序实现之。2 2输输入入x,x,用用迭迭代代法法按按下下列列迭迭代代公公式式求求的的值值。初初始始值值y y0 0=x,=x,精精度度要要求求4 4位位有有效效数字。编写程序实现之。数字。编写程序实现之。P194P194页页 9 9,1010题题5.8 5.8 5.8 5.8 习题习题习题习题
限制150内