




已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
71 循环结构概述 第七章 循环结构程序设计 循环结构是三种基本控制结构之一。使用循环结构是优化程序结构的一种有效方法。本章将详细介绍循环结构及其程序设计方法有关内容。7.1 循环结构概述7.1.1 循环及循环结构在求解复杂问题时,常常遇到大量重复或相似的处理过程(计算过程、操作过程)。对于这些处理过程,我们不难按顺序结构设计和编写程序。例如:从键盘输入5个数,求5个数之和,并打印输出计算结果。求解这个问题,我们甚至会不假思索地采用顺序结构设计出求解算法,编写出相应程序。求解算法如下:(1)初始化:赋初值0.0至sum。(2)输入一个数x,并累加到sum中。(3)输入一个数x,并累加到sum中。(4)输入一个数x,并累加到sum中。(5)输入一个数x,并累加到sum中。(6)输入一个数x,并累加到sum中。(7)输出结果sum。(8)结束。根据上述算法,编写程序如下:sum=0.0READ *, xsum=sum+xREAD *, xsum=sum+xREAD *, xsum=sum+xREAD *, xsum=sum+xREAD *, xsum=sum+xPRINT *, sum=,sumEND在上述算法中,第2至第6步的处理过程完全相同。在程序中,下面2条语句依次重复出现5次:READ *, xsum=sum+x这是一个典型的重复处理问题。对于这类问题,如果问题规模比较小(如处理5个数),则设计的算法和编写的程序不会感到有何不足之处,相反还给人以简洁、清晰、直观的感觉。问题是当求解规模增大时(如处理100个数据),则算法中的处理过程“输入一个数x,并累加到sum中”将增加到100个,算法设计人员要机械地重复写100个这样的处理过程,同样程序中的重复语句也增加至100组,程序员要机械地重复写200条这样的语句。从中可以看出,采用顺序结构不但大大增加了算法和程序长度,增加了存储开销,而且也大大降低了设计算法和编写程序的效率,浪费了程序设计人员宝贵的时间和精力。求解这类问题的有效办法是采用循环结构,FORTRAN 90提供了循环语句用于实现循环结构。 对于上述问题,采用循环结构设计算法如下:(1)初始化:赋初值0.0至sum,即0.0sum。(2)1I。(3)如果I5,则执行步骤(4),否则执行步骤(7)。循环体(4)输入一个数x,并累加到sum中。(5)I+1I。(6)转步骤(3)。(7)输出结果sum。(8)结束。对于上述问题,采用循环语句编写程序如下:sum=0.0DO I=1,5 READ *, x sum=sum+xENDDOPRINT *,sum=, sum END循环体 对于顺序结构,其算法步数和程序行数与问题规模成正比,当问题规模从5个数增加到100个数时,算法步数从8步增加至103步,程序行数从13行增加至203行。而对于循环结构,当问题规模从5个数增加到100个数时,算法步数也是8步,程序行数从13行降低至7行,算法步数和程序行数与问题的规模大小几乎无关。在算法或程序中,重复地执行某个处理过程或语句块(程序段、语句组)的情形称为循环,被重复执行的处理过程或语句块称为循环体,具有循环特征的程序结构称为循环结构,将重复执行的处理过程或语句块设计成循环结构或编写成循环语句的过程称为循环设计,具有循环结构和循环语句的程序称为循环程序。例7.1 求S=1+2+3+N的值(N由键盘输入,N2)。编写程序。解:求解这一问题,将执行N-1次加法运算,如果将等式写成S=0+1+2+N,则执行N次加法运算,不同的是参与运算的操作数不同而已。显然该问题易采用循环结构实现之。用整型变量S保存和值,用N保存求和最大值,用I作计数器。编写程序如下:INTEGER S,N,IREAD(*,*)NS=0DO I=1,N S=S+IEDNDOWRITE(*,*) S=,SEND循环体 例7.2 读入某班级考试成绩(人数不定),计算其平均成绩,并输出。编写程序。解:由于学生人数不定,所以输入的学生成绩个数不确定,以输入-1作为结束标志(因为成绩不可能为负数),从而动态确定学生人数n。平均成绩计算公式是:av=(x1+x2+xn)/n对于计算平均成绩问题,核心问题是一个求和问题,类似例7.1问题。程序易采用循环结构和循环语句来实现。编写程序如下: INTEGER sum,n,xREAL avsum=0;n=0READ *,xDO WHILE (x-1) n=n+1 sum=sum+x READ *,xENDDOav=sum/nWRITE(*,*) 平均成绩为:,avEND循环体从上述例题中可看出,循环结构或循环语句由两部分组成:一部分是循环体,指需要重复执行的处理过程(语句序列、语句块);另一部分是循环控制机制,指根据条件判断循环体是否继续执行。7.1.2 循环结构分类循环结构分为两类:l 循环体的循环次数事先确定(如例7.1中循环结构),这类循环结构称为确定性循环,或称“计数型”循环,使用计数型循环语句(如DO循环语句)实现这类循环结构。l 循环体的循环次数事先不确定(如例7.2中循环结构),这类循环结构称为非确定性循环,或称“条件型”循环,使用条件型循环语句(如DO WHILE循环语句)实现这类循环结构。条件型循环又分“当型”循环和“直到型”循环。1“计数型”循环结构“计数型”循环是循环体循环次数确定的循环,其循环结构流程图如图7-1所示。“计数型”循环的功能是:已知初值、终值和步长。循环控制变量从初值开始,判断其是否小于等于终值,如果小于等于终值,则执行循环体,执行循环体后,循环变量增加步长,继续判断是否小于等于终值,重复执行以上过程,直到循环变量大于终值,结束循环。循环次数为:MAX(终值-初值)/步长+1,0)。2.“当型”循环结构“当型”循环是循环体循环次数不确定的循环,其循环结构流程图如图7-2所示。“当型”循环的功能是:先判断条件是否成立,当条件成立时,则执行循环体,否则结束循环,即“当条件成立时执行循环体”。循环次数0。3.“直到型”循环“直到型”循环是循环体循环次数不确定的循环,其循环结构流程图如图7-3所示。“直到型”循环的功能是:先执行循环体,再判断条件是否成立,当条件成立时,则结束循环,否则继续执行循环体,即“执行循环直到条件成立”。循环次数1。“直到型”循环和“当型”循环的主要区别在于:“直到型”循环至少执行一次循环体,而“当型”循环则有可能一次也不执行。一般情况下,对于循环次数大于等于1的同一个问题,既可以用“直到型”循环,也可以用“当型”循环来解决。初值循环变量vv终值v+步长v假真判定条件循环体假真判定条件循环体假真 图7-1 “计数型”循环结构 图7-2 “当型”循环结构 图7-3 “直到型”循环结构对于例7.2的问题,如果规定至少有一个学生,则求解该问题的算法可设计成“当型”循环结构,如图7-4所示,也可设计成“直到型”循环结构,如图7-5所示。假真n+1nsum+xsum输入成绩x0sum0n开始结束x-1输入成绩xsum/nav输出:av假真n+1nsum+xsum输入成绩x0sum0n开始结束X=-1输入成绩xsum/nav输出:av 图7-4 “当型”循环结构 图7-5 “直到型”循环结构用DO WHILE循环语句可方便实现“当型”循环结构,而对于“直到型”循环结构,FORTRAN 90没有对应的循环语句来实现,可用IF语句和GOTO语句以及无条件DO语句和EXIT语句实现。用DO WHILE循环语句实现“当型”循环结构的程序上面已经给出,下面给出用IF语句和GOTO语句以及无条件DO语句和EXIT语句实现“直到型”循环结构的两个等价程序: INTEGER sum,n,x REAL av sum=0;n=0 READ *,x10 n=n+1 sum=sum+x READ *,x IF (x-1) GOTO 10 av=sum/n WRITE(*,*) 平均成绩为:,av END循环体 INTEGER sum,n,x REAL av sum=0;n=0 READ *,x DO n=n+1 sum=sum+x READ *,x IF (x=-1) EXIT ENDDO av=sum/n WRITE(*,*) 平均成绩为:,av END循环体7.2 用DO循环语句实现“计数型”循环7.2.1 DO循环语句 DO循环语句用于实现“计数型”循环结构,语句中直接指定循环的次数和范围。DO循环语句的一般格式是:: DO =,循环体 ENDDO 一个DO循环语句称为一个DO循环。DO循环语句由三部分组成:DO语句、循环体(语句序列)和ENDDO语句。DO语句是DO循环的开始语句,指定用于控制循环执行的有关参数(初值、终值和步长),决定是否执行循环体。循环体是DO循环的主体,给出用于处理数据的有关语句,决定DO循环语句的执行结果。ENDDO语句是DO循环的终端语句,表明DO循环语句到此结束(注意:不是循环语句执行结束),控制返回到DO语句执行。说明: v为循环变量,一般为整型变量,用来控制循环次数。e1、e2和e3为表达式,其类型与循环变量类型相同。e1代表循环变量v的初值,e2代表循环变量v的终值,e3代表循环变量v的步长,e3可缺省,e3缺省指e3为1。在Digital Visual FORTRAN 5.0中,v、e1、e2和e3的类型可以是实型,FORTRAN 90不提倡使用实型。下面给出一些合法的DO循环语句: M=1;N=10;L=1DO I=1,10,2 !输出1、3、5、7、9 PRINT *,I ENDDO DO I=10,1,-2 !输出10、8、6、4、2 PRINT*,I ENDDO DO I=M+1,N+2,L+3 !输出2、6、10 PRINT *,I ENDDO DO I=1,5 !输出1、2、3、4、5 PRINT *,I ENDDO DO A=0.1,0.5,0.1 !输出0.1、0.2、0.3、0.4、0.5 PRINT *,A ENDDO19372 用DO循环语句实现“计数型”循环 为DO循环的名称,可选择使用。为了提高DO循环语句的可读性,可通过为DO循环语句命名,后必须跟冒号“:”。DO循环语句一旦命名,DO循环语句中的ENDDO语句后必须跟相同的,否则产生语法错误。下面给出使用DO循环名字的DO循环语句:Odd:DO I=1,10,2 !输出1、3、5、7、9 PRINT *,I ENDDO Odd 循环次数计算公式是:MAX(e2-e1)/e3 + 1 ,0)。 如果e30,则一般要求e1e2,否则循环次数为0,即循环体一次也不执行。下面DO循环语句的循环次数为0:Odd:DO I=1,10,-2 PRINT*,I ENDDO Odd下面DO循环语句的循环次数为0:Even:DO I=10,1,2 PRINT*,I ENDDO Even在循环体中可引用循环变量v的值,但不能赋值,即修改它的值,对它赋值将产生语法错误。允许从循环体内受限转移到循环体外,但不允许从循环体外转到循环体内。下面程序中从DO循环语句内向外转移的操作合法:Odd: DO I=1,100,2 IF (I10) GOTO 999PRINT*,I ENDDO Odd 999 PRINT*,finish loop. END下面程序中向DO循环语句内转移的操作不合法: I=1 GOTO 999Odd: DO I=-100,10,2999: PRINT*,I ENDDO Odd PRINT*,finish loop. END下面DO循环语句执行后,I的值为:11。最后一行输出结果为:11。Odd:DO I=1,10,2 !输出1、3、5、7、9 PRINT*,I ENDDO OddPRINT *,I !输出11END7.2.2 DO循环语句的执行过程DO循环语句的执行过程:(1)先对表达式e1,e2,e3分别求值。若缺省e3,则认为e3=1(2)e1赋予v。(3)计算循环次数:r=MAX(INT(e2-e1)/e3 + 1) ,0)(4)测试循环次数r,若r=0则结束循环,转去执行ENDDO语句后面的第一条可执行语句。若r0,则执行循环体直到ENDDO语句。 循环结束后,循环变量v的值有意义,其值为最后一次增加步长后得到的值。(5)执行ENDDO语句,给循环控制变量v增加一个步长e3,即v+e3v。循环次数减1,即r-1r,转(4)继续执行。DO循环语句的执行过程如图7-6所示。计算表达式e1,e2,e3e1 v计算循环次数r:MAX(INT(e2-e1)/e3 +1),0)rr 0执行循环体v+e3 vr-1 rDO循环语句下面一条语句真假图7-6 DO循环语句执行过程 从DO循环语句的执行过程可以看出,在循环体执行前计算循环次数,循环体的执行过程不影响循环次数(转移语句除外)。循环体中虽然不允许修改循环变量v的值,但允许修改表达式e1、e2和e3中所含变量的值,其修改不影响循环次数。下面程序中DO循环语句的循环次数为3: M=1;N=5;L=1DO I=M,N+5,L+1 !输出1、3、5、7、9 PRINT*,I,M,N,L M=M+1;N=N*I;L=2*L+I ENDDO程序运行后,输出结果为: 1 1 5 1 3 2 5 3 5 3 15 9 7 4 75 23 9 5 525 53 例7.3 打印5个随机数。解:这是一个重复问题,可用循环5次的DO循环语句实现。REAL RDO I=1,5 CALL RANDOM_NUMBER(R) PRINT (1X,F8.3),REND DOEND程序运行后,输出结果为:0.0000004 0.0 254804 0.3525162 0.6669145 0.9630556例7.4 计算4!,并输出。解:4!=1234。对于n!,计算公式是:n!=123(n-1)n。该问题显然是一个重复计算问题,需做n-1次乘法。可用DO循环语句实现。PARAMETER(n=4)INTEGER :factor=1DO i=2,4 factor=factor*iPRINT*,i,! =,factorEND DOEND程序运行后。输出结果为: 2! = 2 3! = 6 4! = 247.3 用DO WHILE循环语句实现循环7.3.1 DO WHILE循环语句 DO WHILE循环语句用于实现“当型”循环结构,语句中可给出控制循环执行的条件。DO WHILE循环语句是一条结构化语句。DO WHILE循环语句一般情况下用于实现循环次数不确定的循环,也可用它实现循环次数已知的循环,所以该语句有很好的通用性。DO WHILE循环语句的一般格式是:: DO WHILE ()循环体 ENDDO 一个DO WHILE循环语句称为一个DO WHILE循环。DO WHILE循环语句由三部分组成:一个DO WHILE语句、一个循环体(语句序列)和一个ENDDO语句。DO WHILE语句是DO WHILE循环的开始语句,指出用于控制循环执行的循环条件(逻辑表达式),决定是否执行循环体。循环体是DO WHILE循环的主体,给出用于处理数据的有关语句,决定DO WHILE循环语句的执行结果。ENDDO语句是DO WHILE循环的终端语句,表明DO WHILE循环语句到此结束(注意:不是循环语句执行结束),控制返回到DO WHILE语句执行。说明: 可以是关系表达式,也可以是复杂的逻辑表达式,但不能是算术表达式和字符表达式。下面给出两个使用合法DO WHILE循环语句的程序:PROGRAM cycle2sum=0READ *,xDO WHILE (0=x .AND. x=100) sum=sum+x READ *,xENDDOPRINT *,sum=,sumENDPROGRAM cycle1sum=0READ *,xDO WHILE (x-1) sum=sum+x READ *,xENDDOPRINT *,sum=,sumEND 第二个程序中使用了更严格和复杂的逻辑表达式作为循环控制条件。 使用DO WHILE循环语句时要特别注意死循环的产生,要保证循环体中至少有一条对循环控制条件有影响的语句,否则将产生死循环,引起严重后果。73 用DO WHILE循环语句实现循环上面程序中若将循环体中READ语句误写成PRINT语句,该程序将会产生死循环。PROGRAM cycle2 !死循环程序sum=0READ *,xDO WHILE (0=x .AND. x=100) sum=sum+x PRINT *, xENDDOPRINT *,sum=,sumEND 程序运行时,若第1个输入数据为0至100以内的数,程序产生死循环,无法终止。7.3.2 DO WHILE循环语句的执行过程DO WHILE循环语句的执行过程:(1)先计算表示循环控制条件的逻辑表达式或关系表达式的值,结果赋予log。(2)若log=.TRUE. 则执行循环体直到ENDDO语句,否则终止循环,转去执行ENDDO语句后面的第一条可执行语句。(3)执行ENDDO语句,控制转(1)继续执行。计算表示循环控制条件的逻辑表达式结果赋予loglog=.TRUE.DO WHILE循环语句下面一条语句真假执行循环体DO WHILE循环语句的执行过程如图7-7所示。图7-7 DO WHILE循环语句执行过程DO WHILE循环语句在每次循环体执行前都要计算表示循环控制条件的逻辑表达式,其计算结果决定循环体是否继续执行,循环体的执行过程必须对循环控制条件产生影响。例7.5 求两整数M和N的最大公约数和最小公倍数。解:用(Ri,Ri+1)表示Ri和Ri+1的最大公约数,i=1,2,3,n, 则有:(R1,R2)=(R2,R3)=(Ri,Ri+1)=(Rn,0)其中:R1=M,R2=N,Rj是Rj-2除以Rj-1的余数,j=3,4,n+1,Rn+1=0。求最大公约数是一个重复计算问题,重复次数不定,可用DO WHILE循环语句实现。最小公倍数通过最大公约数计算得到,用表示最小公倍数,用下面公式计算:=MN/(M,N)编写程序如下:INTEGER M,N,R1,R2,R3,gcd,lcmPRINT *,输入两个自然数:READ *,M,NR1=M;R2=NDO WHILE(R20) R3=MOD(R1,R2) !求R1除以R2的余数 R1=R2;R2=R3END DOgcd=R1;lcm=M*N/gcdPRINT (1X,I3,和,I3,的最大公约数为:,I3),M,N,gcdPRINT (1X,I3,和,I3,的最小公倍数为:,I3),M,N,lcmEND 运行程序,输入数据:9,12程序运行后,输出结果为: 9和 12 的最大公约数为: 3 9和 12 的最小公倍数为: 367.4 用IF和GOTO语句实现循环用IF语句实现选择结构,用GOTO语句实现无条件控制转移,两者结合可实现循环结构,特别是“直到型”循环结构。IF语句给出循环条件,GOTO语句控制循环转移。由于GOTO语句易造成程序错误,故现代程序设计方法不提倡使用此法实现循环。如例7.5问题可用IF和GOTO语句实现,程序如下: INTEGER M,N,R1,R2,R3,gcd,lcm PRINT *,输入两个自然数: READ *,M,N R1=M;R2=N100 R3=MOD(R1,R2) !求R1除以R2的余数 R1=R2;R2=R3 IF (R20) GOTO 100!或 IF (R2=0)THEN! ELSE! GOTO 100! ENDIF gcd=R1;lcm=M*N/gcd PRINT (1X,I3,和,I3,的最大公约数为:,I3),M,N,gcd PRINT (1X,I3,和,I3,的最小公倍数为:,I3),M,N,lcm END “直到型”循环结构75 强制性终止循环过程(EXIT、CYCLE)7.5 强制性终止循环过程(EXIT、CYCLE) 在前面的示例程序中,循环过程都是正常结束。有些特殊问题,在循环处理过程中遇到特殊情况需要提前终止本次循环或整个循环,以免循环陷入死循环,造成严重后果。1 EXIT语句EXIT语句的功能是:在循环体执行过程中强制性终止整个循环语句的执行,转循环语句后的第一条语句执行。只能在DO和DO WHILE循环语句内使用EXIT语句。给定下面三个示例程序:!示例程序一DO I=1,100,2 !输出奇数1,3,5,7,9 PRINT *,I IF (I=9) EXITENDDOEND!示例程序三I=1DO !输出奇数1,3,5,7,9 PRINT *,I IF (I=9) EXIT I=I+2ENDDOEND!示例程序二I=1DO WHILE (I=9) EXIT I=I+2ENDDOEND在上述三个示例程序中,从循环控制条件看,要输出100以内的50个奇数,要循环50次,但由于在循环体内设置了EXIT语句,当输出奇数9后循环便强制终止。EXIT语句不提倡使用,因为它破坏了程序的结构化特性。有些情况,高水平的设计人员可用EXIT语句简化程序。合理使用EXIT语句是从死循环中退出的有效途径。例7.6 一个猜数游戏。这个程序随机产生110之间的一个整数,用户猜测这个数,并输入到程序中,程序判定并输出猜测结果。解:算法描述如下:(1)产生随机数fun_num;(2)提示用户输入猜测到的数my_guess,并输入该数;(3)如果my_guessfun_num,则猜测数太大,建议猜小一点;继续猜;(5)如果my_guess=fun_num,则猜对了,打印祝贺语;(6)结束。这是一个重复处理问题,重复次数不确定,只有猜对后才能终止循环。使用DO循环语句,并在循环体中使用EXIT语句在猜对后强行终止循环的执行。可用语句CALL BANDOM_NUMBE(R)调用标准子程序BANDOM_NUMBE(R)在01的实数范围内产生随机数R。10*R的范围是0,10,10*R+1的范围 1,11,也就是1.000000 and 10.999999之间。用INT(R)将得到110范围的整数值。编写程序如下:INTEGER fun_num,my_guessREAL RCALL RANDOM_NUMBER(R)fun_num=MOD(INT(10E9*R+1),10)DO PRINT *,输入你猜测的整数(1-10): READ*,my_guess IF (my_guessfun_num) THEN PRINT *,猜测数太大,小一点,再试一次。 ELSEIF (my_guess3) CYCLE PRINT (1X,I3),IEND DOPRINT *,结束! END程序运行后,输出结果为:2 2 3 3 4 5 结束!76 特殊DO循环语句与EXIT语句7.6 特殊DO循环语句与EXIT语句除了“计数型”DO循环语句和“条件型”DO WHILE语句外,FORTRAN 90提供了一种特殊的DO循环语句,这种DO循环语句必须同EXIT语句配合才能使用。特殊DO循环语句的一般格式是:: DO循环体 ENDDO 循环体图7-8 特殊DO循环语句执行过程特殊DO循环语句不指定循环次数或循环条件。表面上看这种循环语句将产生死循环,不会有什么使用价值。实际上,对于这种循环语句,如果在循环体中使用适当的EXIT语句,则不但不会使循环产生死循环,而且还会使循环变得短小、简洁、清晰。结构化程序设计方法不提倡使用这种DO循环语句。特殊DO循环语句的执行过程:(1)按顺序依次执行循环体语句。(2)循环执行过程中,若满足某循环结束条件,则执行EXIT语句退出循环。(3)无条件转(1)。特殊DO循环语句的执行过程如图7-8所示。给定下面求最大公约数和最小公倍数的示例程序:INTEGER M,N,R1,R2,R3,gcd,lcmPRINT *,输入两个自然数:READ *,M,NR1=M;R2=NDO IF (R2=0) EXIT R3=MOD(R1,R2) !求R1除以R2的余数 R1=R2;R2=R3END DOgcd=R1;lcm=M*N/gcdPRINT (1X,I3,和,I3,的最大公约数为:,I3),M,N,gcdPRINT (1X,I3,和,I3,的最小公倍数为:,I3),M,N,lcmEND 7.7 循环嵌套前面介绍的循环结构和循环语句都是一层循环,许多实际问题的求解算法和程序往往具有多重循环结构。多重循环结构称为循环嵌套,循环嵌套是指在一个循环结构或循环语句的循环体中又含有循环结构或循环语句。对于n层循环嵌套称为n重循环。嵌套的循环层数原则上不限,但不易太多。“计数型”、“当型”、“直到型”循环结构都可相互嵌套,DO语句、DO WHILE语句、特殊DO循环语句都可相互嵌套。根据实际问题的求解需要决定循环嵌套的形式和层数。如果有n重循环,且循环次数分别为r1、r2、rn,则一般最内层循环体的循环总次数为:r1r2rn。例7.7 打印九九乘法表。解:求解这一问题的算法结构具有“计数型”循环结构与“计数型”循环结构嵌套的二重循环结构。程序中用两个DO循环语句嵌套来实现二重循环结构。编写程序如下:INTEGER i,j,productDO i=1,9 DO j=1,9 product=I*j PRINT *,i,*,j,=,product ENDDOENDDOEND例7.8 求 。解:算法和程序结构同例7.7。编写程序如下:INTEGER : i,j,fac,fac_sum=0!循环嵌套DO i=1,10 !用外层循环控制求和次数 fac=1DO j=1,i !用内层循环控制阶乘 fac=fac*j ENDDO fac_sum=fac_sum+facENDDOPRINT *,前10个自然数的阶乘和=, fac_sumEND赋值语句“fac=fac*j”被循环执行55次,“fac_sum=fac_sum+fac”被循环执行10次。77 循环嵌套例7.9 给出数字2和3组成三位数的所有可能组合,并输出所有可能的三位数。解:该问题需要用三重循环来实现。编写程序如下:INTEGER : i,j,kINTEGER : n !存放组成的三位数INTEGER : num !存放三位数的个数PRINT *,由2和3组成的三位数有:!循环嵌套DO i=2,3 !用外层循环控制百位数字DO j=2,3 !用内层循环控制十位数字 DO k=2,3 !用内层循环控制个位数字 n=100*i+10*j+k ! 计算组成的三位数 num=num+1 ! 累计三位数的个数 PRINT *,n ENDDOENDDOENDDOPRINT *,共组成三位数,num, 个END程序运行后,输出结果为: 222 223 232 233 322 323 332 333共组成三位数 8 个 例7.10 输入某班学生四门课的考试成绩,求这些成绩中的最高成绩,并输出。解:该问题求解算法和程序具有二重循环结构。由于学生人数不定,所以控制学生人数的外层循环用DO WHILE语句实现,输入成绩为负数结束循环。由于课程门数确定,所以控制门数的内层循环用DO语句实现。二重循环结构由“当型”循环结构和“计数型”循环结构嵌套构成。编写程序如下:max=0.0READ *,xDO WHILE (x=0) DO i=1,4 IF (xmax) max=x READ*,x END DOEND DOWRITE(*,*) 最高成绩为,maxEND7.8 循环结构程序设计举例例7.11 用迭代法求牛顿的二次方根,即求 。精度要求小数点后7位。解:求任何正整数x的平方根,可以通过牛顿迭代法,只用加、减和除就可实现。求 的牛顿迭代法公式是:设:初值x0=1,xi+1=(xi+a/xi)/2,i=1,2,3,n, xn+1-xn10-7, xn+1 。根据上面迭代公式,求a的平方根的算法如图7-9所示。(x0+a/x0)/2x1初始化:1x0, 1.5x1开始x1-x0 10-7真假输出:a的平方根为x1结束输入ax1x0PROGRAM NewtonIMPLICT NONEREAL a,x0,x1WRITE(*,10,ADVANCE=NO) 输入计算平方根的数:10 FORMAT(A)READ *,ax0=1; x1=1.5DO WHILE (ABS(x1-x0)1e-7) x0=x1 x1=(x0+a/x0)/2END DOPRINT *PRINT *,a,平方根为:,x1END图7-9 二次方根的迭代算法编写程序如下:78 循环结构程序设计举例运行程序,输入数据:输入计算平方根的数:2程序运行后,输出数据为:2.000000 平方根为: 1.414214 例7.12 根据下面泰勒级数求x的正弦值。解:我们已经熟悉FORTRAN 90提供的SIN(x)、COS(x)、EXP(x)等内部函数,我们可直接使用这些内部函数计算正弦、余弦、指数等值。那么这些函数是如何计算的呢?一般都是通过其泰勒级数计算。下面我们不用内部函数,而是自己编写程序计算正弦,然后与内部函数计算值进行比较。遇到这类问题,必须将泰勒级数用通项公式表示,然后得出迭代公式。其中:n=1,2,3,。设:Tn=(-1)n+1x2n-1/(2n-1)!=Tn-1(-1)x2/(2n-2)(2n-1) , n=1,2,3, sinxT1+T2+Tn,Tn+110-7,10-7决定了计算精度。上述计算问题变成了一个求和问题,可用一个DO WHILE语句实现。 编写程序如下:PROGRAM sin_xPARAMETER(pi=3.14159278,eps=1E-7)INTEGER :n=1,maxterms=10REAL x,T,sinxWRITE(*,(A),ADVANCE=NO) 输入一个度数值:READ*,xx=x*pi/180 !转换为弧度值T=x;sinx=TDO WHILE(ABS(T)ERR).AND.(neps)THEN PRINT*,发散级数,不能得到结果。ELSE PRINT*,程序计算得到的正弦值:,sinx PRINT*,FORTRAN 90内部函数值:,SIN(x)END IFEND运行程序,输入数据:输入一个度数值:45 程序运行后,输出结果为: 程序计算得到的正弦值: 0.7071068 Fortran 90内部函数值: 0.7071068 上述程序采用泰勒级数计算和采用内部函数计算的结果是相同的。 例7.13 向某银行贷款1000元,年利率为:10%、11%、20%,计算不同年利率15年,20年和25年的月偿还金,并输出。解:设贷款本金为a,年利率为r,贷款年数为n,月偿还金为p。求解该问题用二重循环可以实现,外层循环控制不同利率,内层循环控制年限。 INTEGER :ms=12, nINTEGER cycle_countREAL :a=1000, p!r为年利率,r0为最低利率,r1为最高利率,rc为利率增量REAL r,r0,r1,rc READ*,r0,r1,rc !输入最低利率,最高利率,利率增量cycle_count=INT(r1-r0)/rc)+1 !计算循环次数r=r0PRINT*,利率 15年 20年 25年DO i=1,cycle_count WRITE(*,(F5.2,%),ADVANCE=NO) 100*R DO n=15,25,5 p=r/ms*a*(1+r/ms)*(ms*n)/(1+r/ms)*(ms*n)-1) WRITE(*,(F10.2),ADVANCE=NO) p END DO PRINT * r=r+rcEND DOEND 运行程序,输入数据:0.1,0.2,0.01。程序运行后,输出数据为: 利率 15年 20年 25年10.00% 10.75 9.65 9.0911.00% 1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025家庭绿化养护承包合同
- 2025茶叶特许加盟合同书
- 2025智能照明系统能源服务管理合同
- 2025年度分店(分公司)经营承包合同
- 2024年新疆事业单位联考笔试真题
- 塑料厂考勤管理规范制度
- 2025【合同范本】版合作经营协议书
- 2025【合同范本】苏州市上岗劳务合同
- 活动一 民族服装大展示说课稿-2025-2026学年小学综合实践活动蒙沪版四年级上册-蒙沪版
- 3.2细胞器之间的分工合作教学设计教学反思-2023-2024学年高一上学期生物人教版(2019)必修1
- 四川省建筑工程资料表格
- 棋牌室消防应急预案范本
- JGJ/T235-2011建筑外墙防水工程技术规程
- QC-T 1175-2022 电动汽车用高压接触器
- 隧道施工工期及施工进度安排
- 习思想以中国式现代化全面推进中华民族伟大复兴
- 学习任务十 汽车执行器电路控制与检测 (1)讲解
- 2024团校考试入团考试题库(含答案)
- 22G101三维立体彩色图集
- 现场复核记录
- 学校安全风险辨识管控清单
评论
0/150
提交评论