第五章 循环结构程序设计.ppt_第1页
第五章 循环结构程序设计.ppt_第2页
第五章 循环结构程序设计.ppt_第3页
第五章 循环结构程序设计.ppt_第4页
第五章 循环结构程序设计.ppt_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

1、第五章 循环结构程序设计,主要内容: 1. DO语句 2. DO WHILE语句 3. 循环的流程控制语句 4. 程序举例,在实际应用中,经常会遇到一些操作并不复杂,但在一定的条件下需要反复多次操作处理的问题,例如,要输入某班100个学生的五门课的成绩、并求每个学生的总分。对于这类问题,在程序设计中,需要反复执行同一种操作,如果用顺序结构的程序来处理,将十分繁琐,有时候可能难以实现,而使用循环结构就可以很简便地实现。循环的作用就是用来自动重复执行某一个操作。善用循环可以使程序变得很精简、提高编程效率。,5.1 DO循环结构,1. DO循环结构的组成 一般格式: DO i=e1,e2,e3 (循

2、环体) END DO 其中循环变量i可以是整型或实型变量;初值e1、终值e2、步长e3可以是常量、已赋值的变量或表达式,步长e3的值可以为正数也可以为负数,但是不能为0。当步长e3为1时,常省略 。,【例5-1】显示10行hello。 程序编写如下: do i=1,10, 1 print*,HELLO!,i,次 enddo end,do i=1,10, 1 print*,HELLO!,i,次 enddo end,do语句,循环体,enddo语句,do循环结构由三部分组成,do i=1,10, 1 print*,HELLO!,i,次 enddo end,do语句,循环体,enddo语句,循环次数

3、r的计算公式: r=int(e2-e1)/e3+1) r0循环体执行r次,r0循环体一次也不执行。,例如: (1) do i=1,10,2 s=s+i end do (2) do n=1,5 f=f*n end do (3) a=2.5 b=3.0 do t=10,a+b,2.0 print*,t end do,2. DO循环结构的执行过程,1)将初值赋给循环变量2)判断循环变量是否超过终值3)若初值超过终值,循环结束,否者,执行循环体4)循环变量增加一个步长值5)执行第2)步,阅读以下程序,写出运行结果: do i=1,5, 1 print*,HELLO!,i,次 Enddo print*,

4、HELLO!,i,次 end,说明: (1)循环变量在循环体中只能引用,不能再去改变它的值,否则将产生语法错误。例如下列程序段: do m=1,10 n=m*3+6 ! 对循环变量引用 m=n*2!改变循环变量的值,在编译时会发现错误 end do 在编译时会出现错误。错误提示“Error: an Assignment to a DO variable within a DO body is invalid.”。,do m=1,10 n=m*3+6 ! 对循环变量引用 end do m=n*2 !是否有错误?,(2)循环结束后,循环变量的值有意义,其值为最后一次执行完循环体增加一个步长后得到的

5、值。例如: k=0 do i=1,5,2 k=i enddo print *,k,i end,【例5-2】计算5!,并输出。 分析: 5!=12345。 对于n!的问题,计算公式是:n!=123(n-1)n。 显然这是一个重复计算问题,需做n-1次乘法运算。用do循环结构实现。 程序编写如下: parameter(n=5) integer factor factor=1 do i=1,n factor=factor*i end do print*, 5! =,factor end,【例5-3】编写程序输出100-999之间的所有“水仙花数”。 分析:“水仙花数”是指任何一个数各位数字的立方和等

6、于该数本身。从这个条件出发,再对100-999之间的数一一验证是否符合这个条件就可以了。很明显,这是一个循环次数确定的循环,可以用do循环结构编写程序: 程序编写如下: integer n,nb,ns,ng do n=100,999 nb=n/100 ns=mod(n/10,10) ng=mod(n,10) if(nb*3+ns*3+ng*3=n) print*,n,是水仙花数 enddo end,【例5-4】输入某班50位同学一门课程的成绩,并统计各分数段人数。 分数段划分为:90分-100分 80分-89分 70分-79分 60分-69分 60分以下 分析:本程序可用do循环结构来编写,采

7、用边输入边判断的方式进行统计各分数段人数。 程序编写如下:,integer n,n90,n80,n70,n60,ns60,g n90=0 n80=0 n70=0 n60=0 ns60=0 do n=1,50 read*,g if(g=90.and.g=80.and.g=70.and.g=60.and.g70) n60=n60+1 if(g60) ns60=ns60+1 enddo print*,分数段90-100之间的学生数为,n90 print*,分数段80-89之间的学生数为,n80 print*,分数段70-79之间的学生数为,n70 print*,分数段60-69之间的学生数为,n60

8、 print*,分数段60之间的学生数为,ns60 end,3. do循环结构嵌套,一个do循环结构中又完整地包含另一个或多个do循环结构称为do循环结构嵌套。 通常,把处在外层的循环结构称为外循环, 处在内层的循环结构称为内循环。 由于循环结构可以多层嵌套(也称多重循环),所以,内循环和外循环是相对的。嵌套的循环层数原则上不限,但不易太多。 如果有n重循环,且从外到内循环次数分别为r1、r2、rn,则最内层循环结构中循环体的执行次数为: r1r2rn 。,【例5-6】 求 ,n的值通过键盘输入。 分析:从整体上看这仍然是累加求和的问题,需要重复进行求和运算,运算的次数是可以确定的,而累加的每

9、一项是阶乘值,又属于累乘的问题,因此可用循环嵌套的方法解决。 程序编写如下: integer : i,j,f,sum sum=0 read*,n do i=1,n f=1 do j=1,i f=f*j enddo sum=sum+f enddo print *,自然数的阶乘和=, sum end,4. 隐含do循环结构,通过前面的例题我们不难看出:利用一般格式的do循环结构或do循环结构嵌套进行输入或输出时,由于每次都要重新调用执行输入或输出语句,因此每行只能输入或输出一次执行的结果。见【例5-7】。 【例5-7】打印数字1-10中所有的奇数, 利用do循环结构可编写程序如下: do i=1,

10、10,2 print*,i end do End 分析:对于此类问题,如果计算结果较多,就会分多屏显示,查看时会非常不方便。这时就迫切需要新的方法来改变具有一定规律的一系列数据的输入或输出方式。,利用隐含do循环结构就可以很方便地实现对数据输入和输出方式的控制。 隐含do循环结构是do循环结构的一种特殊表现形式,它一般只出现在输入或输出语句中。 1. 隐含do循环结构的一般格式: print *,(w,v=e1,e2,e3) 或 read *,(w,v=e1,e2,e3) 说明: (1)v为循环变量,用来控制循环次数。e1、e2和e3为表达式,分别表示循环变量v的初值、终值及步长。 (2)w为

11、输入或输出项列表,输入或输出项的数目可根据需要自行设定。它表示要输出的内容,可以是常量也可以是包含循环变量的表达式,输入、输出元素的个数由循环次数决定。 (3)循环次数计算方法、循环执行的过程、使用该种循环应注意的事项等与一般格式的do循环结构完全一样。,【例5-8】打印数字1-10中所有奇数,程序可改为: print *,(i,i=1,10,2) end 程序运行如下:,【例】打印一行(10个)*号: print *,(*,i=1,10) end,【例5-9】打印九九乘法表。 1*1=1 1*2=2 2*2=4 1*3=3 2*3=63*3=9 分析:很明显,程序中需要用到两个变量i和j来分

12、别表示乘数和被乘数,这两个变量都很有规律,解决此类问题可以用二重嵌套的do循环结构。另外,程序中可使用format语句来控制输出数据的格式,format语句中的为可变重复系数,其值可根据循环变量发生变化,需要注意的是用变量做重复系数时一对“”不可省略。,程序编写如下: integer i,j do i=1,9 print 10,(j,*,i,=,i*j, j=1,i ) end do 10 format(i1,a,i1,a,i2,2x) end,2. 隐含do循环结构的嵌套 与do循环结构的嵌套一样,隐含do循环结构也可以有嵌套,而且同样可以出现多重嵌套。其嵌套是以括号划分的,内层括号称为内循

13、环,外层括号称为外循环。 隐含do循环结构的嵌套一般格式为: print *,( w,v1=e1,e2,e3),v2=e1,e2,e3) 或 read *,( w,v1=e1,e2,e3),v2=e1,e2,e3),说明: (1)v2为外循环的循环变量,用来控制外循环次数;v1为内循环的循环变量,用来控制内循环次数。e1、e2和e3为表达式,分别表示循环变量v2和v1的初值、终值及步长。内循环体实际执行的次数为内、外循环各自可以执行的次数之积。 (2)不论循环嵌套的次数如何,都只能用小括号,且括号一定要成对出现,不允许出现其他括号形式。,【例5-10】用隐含do循环结构的嵌套打印“ab”六次。

14、 程序编写如下: print*,( a,b,i=1,3),j=1,2) End 程序中i为内层循环变量,j为外层循环变量,内层循环次数为3次,外层循环次数为2次,所以输出项字符a和b共显示23=6次 。,3.隐含do循环结构及do循环结构嵌套的应用 利用隐含循环不但可以改变输入输出的方式、数组元素输入输出的先后顺序(详见第六章),而且可以打印具有一定变化规律的图形,这类问题中通常要配套使用formmat语句来对数据进行格式输出。,【例5-11】打印以下由数字组成的图形。 1 12 123 1234 12345 分析:利用循环结构实现输出图形的功能重要的是先观察图形的形状,然后再看图形中字符的变

15、化规律。该题从图形形状上看是一个直角三角形,字符组成相对比较简单,只有数字,而且数字呈现规律性的排列:每一行从左到右都是按照由小到大的顺序排列,并且数字的个数和所在行号相同。因此可以利用循环嵌套编写程序,其中外循环控制行数,每循环一次,执行一次输出,隐含do循环作为内循环控制输出每一行的内容。程序中format语句控制数据输出格式,每个数据占一个列宽。,do i=1,5 print 10,(j,j=1,i) end do 10 format(i1) end,5.2 do while循环结构,对于循环次数确定的循环可以用do循环结构很方便地实现,但是有些问题的循环次数并不能确定,只能通过给定的条

16、件来决定是否进行循环,这时就可以用do while循环结构来实现。,5.2.1 do while循环结构的组成 do while循环结构的一般格式如下: do while(逻辑表达式) 循环体 enddo,说明: (1)do while循环结构由三部分组成:do while语句、循环体和end do语句。 (2)do while语句是do while循环结构的起始语句,其中逻辑表达式是表示循环的控制条件,必须全部放在括号里面。 (3)循环体是do while循环结构的主体,是在循环过程中被重复执行的语句组。 (4)end do语句是do while循环结构的终端语句,表明本次的循环体执行到此结

17、束,后又转到do while语句继续执行循环结构。 (5)使用do while循环语句时要特别注意避免死循环的产生,要保证循环体中至少有一条对循环控制条件有影响的语句,否则将产生死循环,引起严重后果。,如下程序: sum=0 read *,x do while (0=x .and. x=100) sum=sum+x print *, x enddo print *,sum=,sum end 程序运行时,若第1个输入数据为0至100以内的数,程序产生死循环,无法终止。 (6)do while循环结构也可以多重嵌套,用法与注意事项同do循环结构。,5.2.2 do while循环结构的执行过程,d

18、o while循环结构在每次循环体执行前都要先计算表示循环控制条件的逻辑表达式,其计算结果决定循环体是否继续执行,循环体的执行过程必须对循环控制条件产生影响。,【例5-12】用do while循环结构改写【例5-2】计算5!的程序 程序编写如下: parameter(n=5) integer f i=1 f=1 do while(i=n) f=f*i i=i+1 end do print*, 5! =,f End 分析: 程序执行结果和【例5.2】完全相同,同样会算出正确的结果。不过程序语句看起来比较复杂一点。改用do while循环结构编写程序,循环变量的初值设置(程序中第3行)跟累加(第7

19、行)都需要命令明确表示出来,循环终止条件的判断表达式也要明确写清楚(第5行),这里使用do while循环结构并不比前面使用do循环结构所编写出来的程序精简和美观。因为do while循环结构的目的并不是用来处理这种“计数累加循环”情况的。do while循环结构所处理的是无法预先确定循环次数,只能通过给定条件判断的循环,即用do while循环结构实现的是当型循环。,【例5-13】求,直到最后一项的绝对值小于时,停止计算。x由键盘输入。 分析:这显然是一个累加求和问题。关键是如何表示出累加项。公式中给出的累加项表示很复杂,较好的方法是找到递推公式,利用前一项来求下一项,会简化程序设计。 这里

20、我们首先推导出递推公式,用表示累加项: 第1项:第项: () 第项: () 我们知道:已知,求公式为:同理可推:已知,求为:所以第项和第项的之间的递推公式为: () 本次循环的累加项可以在上一次循环累加项的基础上递推出来,递推公式要比原公式简单。,parameter (pi=3.1415926) real x,f,sin integer : i=1 read *,x!输入角度值 x=x*pi/180!将角度换算为弧度值 sin=x f=x do while(abs(f)1.0e-6) !循环条件判断 i=i+1 f=-x*x/(2*i-2)*(2*i-1)*f sin=sin+f enddo

21、print 10,sin 10 format(f4.2) end,【例5-14】输入一个正整数,统计并输出其位数。 分析:利用整数相除得到整数的计算规则来求位数。把输入的整数存入变量n中,用变量k来统计n的位数,使用do while循环结构来实现。 程序编写如下: integer n,k k=k+1 read*,n do while(n0) k=k+1 n=n/10 end do print*,k=,k end,5.3 循环的流程控制,在前面的示例程序中,循环过程都是正常结束。有些特殊问题,如在循环处理过程中需要提前终止本次循环或整个循环,则需要在循环中进行流程控制。下面就来介绍两个与循环相关

22、的语句,exit语句和cycle语句。,5.3.1 exit语句 exit语句的功能是可以直接“跳出”一个正在运行的循环,转到循环结构enddo后的下一个语句执行。do和do while循环结构语句内都可以使用exit语句。,【例5-15】用exit语句改写前面的【例5-14】求正整数位数程序来做示例。 程序编写如下: integer n,k k=0 read*,n do while(.true.) k=k+1 n=n/10 if(n=0) exit end do print*,k=,k end,在示例程序中,循环的逻辑表达式(循环控制条件)直接置为.true.,这是允许的,表示这个循环执行的

23、条件永远成立,如果不在循环中加入跳出循环的控制语句,会造成死循环。所以在循环体内设置了exit语句,当条件n=0满足时执行exit语句跳出循环。 exit语句不提倡使用,因为它破坏了程序的结构化特性。有些情况,高水平的设计人员可用exit语句简化程序。合理使用exit语句是从死循环中退出的有效途径。,5.3.2 cycle语句 cycle语句的功能是略过循环体中在cycle语句后面的所有语句,直接跳回循环的开头来进行下一次循环。在do和do while循环语句内都可以使用cycle语句。来看下面的示例。 【例5-16】打印出110内的数字,3和6不打印。 分析:在程序中通过条件设定跳过输出3和

24、6的操作。 程序编写如下: integer i do i=1,10 if(i=3.or.i=6) cycle print *,i enddo end,在程序中使用do循环,从1到10,每一次循环,都将循环变量的值显示出来,再循环体输出语句前加入条件判断,如果循环变量的值为3或6时执行cycle语句,略过后面的输出语句,4跳回循环的入口继续执行新一轮的循环。 在程序中如果需要略过目前的循环程序语句,直接进入下一次循环时,就可以使用cycle命令。,5.4 程序举例,【例5-17】求菲波纳契(Fibonacci)数列前20个数:1、1、2、3、5、8、。数列按下面递推公式计算得到: 分析 :Fib

25、onacci的计算公式已给出,利用这一公式,可以在程序中定义两个变量f1和f2,并将两者赋初值为1,输出后根据当3时的特点,可以利用迭代的方法来实现。 数据每行输出5个,每个数据占5位,采用format语句对数据进行格式输出。,integer: f1=1, f2=1, f3 print (2x,i5,2x,i5), f1, f2 do i=3,20 f3=f2+f1 print (2x,i5),f3 f1=f2 f2=f3 if(mod(i,5)=0) print * enddo end,【例5-18】求2,10000内的守形数。 分析:所谓守形数是指该数平方的低位数等于该数本身。例如25=6

26、25,而625的低位25与原数相同,则称25为守形数。 可以用穷举法解决这类问题,即在2,10000范围内,对所有的数逐一验证是否符合守形数的条件。问题的关键就是如何判断一个任意数N是否是它平方的低位数。换句话说,对任意两个有内在联系的自然数m和n,怎样判断n是否为m的低位数,判断的方法是对m用求余函数截取与n相同的位数进行比较。,do i=2,10000 k=i*i if(i10)then m=mod(k,10) else if(i100)then m=mod(k,100) elseif(i1000)then m=mod(k,1000) else m=mod(k,10000) end if

27、if(m=i)print*,i enddo end,【例5-19】求2100之间的素数。 分析:所谓素数是指只能被1和自身整除而不能被其他数整除的整数(除1以外)。 这一题同样可用穷举法解决,即在2,100范围内,对所有的数逐一验证是否符合素数的条件。根据素数定义,判断一个数m是否是素数的基本方法为: 将n作为被除数,将2到(n-1)各个整数轮流作为除数,如果都不能整除,则n为素数。实际上,从数学的角度分析,n不必被2到(n-1)的整数整除,只需被2到n/2间整数整除即可,甚至只需被2到sqrt(n)之间的数整除即可。这样就可以大大节省运行时间,提高程序效率。 判断一个数是否是素数需要用一重循

28、环,要找出2100之间的素数需要用两重循环。,integer m,count count=0 print *,2至100之间的素数有: print * do m=2,100 j=int(sqrt(1.0*m) do i=2,j if(mod(m,i)=0)exit enddo if(ij) then count=count+1 print (2x,i2),m !反斜杠编辑符表示继续在本行输出。 if(mod(count,5)=0) print * endif enddo print* print (共有素数,i2,个。),count end,【例5-20】编写程序验证下面公式: 分析:设,l表示等式左端的值,r表示等式右端的值。分别计算l和r,判断它们是否相等,如果相等,则等式成立,否则不成立。采用实数是否相等的判断方法。 计算l,通过do循环结构实现。计算r,通过赋值语句实现。,

温馨提示

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

最新文档

评论

0/150

提交评论