《C语言程序设计教程 第4章.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计教程 第4章.ppt(49页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第4章 循环结构 4.1 当型循环与直到型循环当型循环与直到型循环4.2 for 循循 环环4.3 循环的嵌套与其他有关语句循环的嵌套与其他有关语句4.4 程序举例程序举例4.1 当型循环与直到型循环当型循环与直到型循环4.1.1 当型循环结构当型循环结构当型循环结构的流程图如图当型循环结构的流程图如图4.1所示。所示。图4.1 当型循环结构流程图 在在图图4.1中中,条条件件在在程程序序中中一一般般是是一一个个逻逻辑辑表表达达式式,条条件件满满足足是是指指逻逻辑辑表表达达式式的的值值为为真真。循循环环体体可可以以是是单单个个语语句句,也也可可以以是是由由若若干干可可执执行行语语句句组组成成的
2、的复复合合语语句句,它它们是需要重复执行的操作。们是需要重复执行的操作。当当型型循循环环的的执执行行过过程程是是:当当条条件件满满足足(即即逻逻辑辑表表达达式式的的值值为为真真)时时,执执行行循循环环体体中中所所包包括括的的操操作作,当当循循环环体体执执行行完完后后,将将再再次次判判断断条条件件,直直到到条条件件不不满满足足(即即逻逻辑表达式的值为假)为止,从而退出循环结构。辑表达式的值为假)为止,从而退出循环结构。实现当型循环结构的实现当型循环结构的C语句形式为语句形式为 while (表达式表达式)循环体语句循环体语句 功能:当表达式值功能:当表达式值0时,执行循环体,执行完时,执行循环体
3、,执行完后继续判断表达式值,只有当表达式值后继续判断表达式值,只有当表达式值0时才退时才退出循环。出循环。例例4.2 从从键键盘盘输输入入各各学学生生成成绩绩,并并对对90分分以以上上(包包括括90分分)的的学学生生人人数数进进行行计计数数,直直到到输输入入的的成成绩绩为为负负为为止止,最最后后输输出出成成绩绩在在90分分以以上上的的学学生人数。生人数。图4.3 例4.2的流程图 其流程图如图其流程图如图4.3所示。其中变量所示。其中变量count为整型,用于为整型,用于对对90分以上的学生人数进行计数。分以上的学生人数进行计数。相应的相应的C程序如下:程序如下:#include stdio.
4、hmain()int count;float grade;count0;scanf(%f,&grade);while(grade0.0)if(grade90.0)countcount1;scanf(%f,&grade);printf(count%dn,count);4.1.2 直到型循环结构直到型循环结构直到型循环结构的流程图如图直到型循环结构的流程图如图4.4所示。所示。图4.4 直到型循环结构流程图 直直到到型型循循环环的的执执行行过过程程是是,首首先先执执行行循循环环体体,然然后后判判断断条条件件(即即计计算算逻逻辑辑表表达达式式),如如果果条条件件满满足足(即即逻逻辑辑表表达达式式值值
5、为为真真),则则退退出出循循环环结结构构;如如果果条条件件不不满满足足(即逻辑表达式值为假),则继续执行循环体。(即逻辑表达式值为假),则继续执行循环体。实现直到型循环结构的实现直到型循环结构的C语句形式为语句形式为do 循环体语句循环体语句 while(表达式);(表达式);功功能能:先先执执行行循循环环体体,然然后后判判断断表表达达式式值值,若若表表达达式式值值0,则则再再次次执执行行循循环环体体,如如此此循循环环,直直到到表表达达式式值值0为止。为止。例例4.3 计算并输出下列级数和:计算并输出下列级数和:直到某项的绝对值小于直到某项的绝对值小于 为止。为止。相相应应的的流流程程图图如如
6、图图4.5所所示示。其其中中f用用于于改改变变每每一一项项的的符符号号,因为这是一个各项符号相间的级数。因为这是一个各项符号相间的级数。图4.5 例4.3的流程图相应的相应的C程序如下:程序如下:#include stdio.hmain()int k;double sum,d,f;sum1.0;k1;f1.0;do kk1;ff;d1.0/(k*(k1);sumsumf*d;while(d1.0e4);printf(sum%lfn,sum);4.1.3 当型循环结构与直到型循环结构的区别与联系当型循环结构与直到型循环结构的区别与联系 当当型型循循环环结结构构与与直直到到型型循循环环结结构构既既
7、有有共共同同之之处处,又又有有区区别。主要体现在以下几个方面。别。主要体现在以下几个方面。(1)在当型循环中,其循环体可以一次也不执行(即执行)在当型循环中,其循环体可以一次也不执行(即执行当型循环结构的一开始,其条件就不满足)。当型循环结构的一开始,其条件就不满足)。(2)不管是当型循环结构还是直到型循环结构,在循环体)不管是当型循环结构还是直到型循环结构,在循环体内部必须要有能改变条件内部必须要有能改变条件(即逻辑表达式值即逻辑表达式值)的语句,否则将的语句,否则将造成死循环。造成死循环。(3)对对于于有有些些问问题题既既可可以以用用当当型型循循环环结结构构来来处处理理,也也可可以以用直到
8、型循环结构来处理。用直到型循环结构来处理。(4)不不管管是是当当型型循循环环结结构构还还是是直直到到型型循循环环结结构构,其其循循环环体体如果包含一个以上的语句,应以复合语句形式出现。如果包含一个以上的语句,应以复合语句形式出现。4.2 for 循循 环环C语言提供的语言提供的for循环属于当型循环结构,其一般形式为循环属于当型循环结构,其一般形式为for(表达式(表达式1;表达式;表达式2;表达式;表达式3)循环体语句(组)循环体语句(组)它等价于下列的当型循环结构:它等价于下列的当型循环结构:表达式表达式1;while(表达式(表达式2)循环体语句循环体语句 表达式表达式3;下面对下面对f
9、or循环语句作几点说明:循环语句作几点说明:(1)在)在for语句中,三个表达式中的任何一个表达式均可语句中,三个表达式中的任何一个表达式均可省略,但其中的两个省略,但其中的两个“;”不能省略。不能省略。(2)下列两个循环都是死循环:)下列两个循环都是死循环:for(表达式表达式1;表达式;表达式3)循环体循环体与与 for(;)循环体循环体 因为它们都没有用于判断循环是否结束的条件(即表达因为它们都没有用于判断循环是否结束的条件(即表达式式2)。)。(3)for循环本质上也是当型循环结构,只不过它对于事循环本质上也是当型循环结构,只不过它对于事先可以确定循环次数的问题特别方便。先可以确定循环
10、次数的问题特别方便。(4)在在for循循环环中中,循循环环体体也也可可以以是是复复合合语语句句(即即用用一一对对花括号花括号 括起来的语句组)。括起来的语句组)。4.3 循环的嵌套与其他有关语句循环的嵌套与其他有关语句4.3.1 循环的嵌套循环的嵌套 所所谓谓循循环环的的嵌嵌套套是是指指一一个个循循环环体体内内又又包包含含了了另另一一个个完完整整的的循循环环结结构构。C语语言言允允许许循循环环结结构构嵌嵌套套多多层层。循循环环的的嵌嵌套套结结构构又又称为多重循环。称为多重循环。例例4.6 计算并输出计算并输出10以内以内(包括包括10)所有自然数的阶乘所有自然数的阶乘值。即计算值。即计算1!,
11、2!,3!,4!,5!,6!,7!,8!,9!,10!。采采用用的的方方法法是是,对对于于10以以内内的的每每一一个个自自然然数数分分别别求求它它们们的的阶阶乘乘值值。其其流流程程图图如如图图4.7所所示示。显显然然,这这是是一一个个二二重重循循环环结结构。构。图4.7 例4.6的流程图相应的相应的C程序如下:程序如下:#include stdio.hmain()int n,k;double s;for(n1;n10;nn1)s1.0;for(k1;kn;kk1)ss*k;printf(%2d!%16.7fn,n,s);4.3.2 break 语句语句C语言中的语言中的break语句有以下两个
12、功能:语句有以下两个功能:(1)跳出)跳出 switch 结构;结构;(2)退退出出当当前前循循环环结结构构,包包括括 while 结结构构、dowhile 结结构和构和for循环结构。循环结构。4.3.3 continue 语句语句 continue语语句句的的功功能能是是结结束束本本次次循循环环的的执执行行,但但不不退退出循环结构。出循环结构。下面举两个例子来说明下面举两个例子来说明continue语句的使用。语句的使用。例例4.10 输出输出100200之间所有能被之间所有能被7或或9整除的自然数。整除的自然数。相应的相应的C程序如下:程序如下:#include stdio.hmain(
13、)int n;for(n100;n200;nn1)if(n%7!0)&(n%9!0)continue;/*结束本次循环,继续进行结束本次循环,继续进行下次循环下次循环*/printf(%d n,n);实际上,上述程序等价于实际上,上述程序等价于#include stdio.hmain()int n;for(n100;n200;nn1)if(n%70)|(n%90)printf(%d n,n);4.4 程序举例程序举例4.4.1 列举算法列举算法 所谓列举算法,是指根据提出的问题,列举所有可能的所谓列举算法,是指根据提出的问题,列举所有可能的情况,并根据条件检验哪些是需要的,哪些是不需要的。情况
14、,并根据条件检验哪些是需要的,哪些是不需要的。例例4.11 某某单单位位要要在在A,B,C,D,E,F 6人人中中选选派派若若干干人人去去执行一项任务,选人的条件如下:执行一项任务,选人的条件如下:(1)若)若C不去,则不去,则B也不去;也不去;(2)C和和D两人中去一个;两人中去一个;(3)D和和E要么都去,要么都不去;要么都去,要么都不去;(4)A,B,F 3人中要去两个;人中要去两个;(5)C和和F不能一起去:不能一起去:(6)E和和F两人中至少去一个。两人中至少去一个。问应该选哪几个人去?问应该选哪几个人去?C程序如下:程序如下:#include stdio.hmain()int a,
15、b,c,d,e,f;for(a0;a1;a)for(b0;b1;b)for(c0;c1;c)for(d0;d1;d)for(e0;e1;e)for(f0;f1;f)if(bc0|c1)&(cd1)&(de0|de2)&(abf2)&(cf!2)&(ef1)printf(A will%s be assigned.n,a?:not);printf(B will%s be assigned.n,b?:not);printf(C will%s be assigned.n,c?:not);printf(D will%s be assigned.n,d?:not);printf(E will%s be a
16、ssigned.n,e?:not);printf(F will%s be assigned.n,f?:not);4.4.2 密码问题密码问题 在在报报文文通通信信中中,为为使使报报文文保保密密,发发报报人人往往往往要要按按一一定定规规律律将将其其加加密密,收收报报人人再再按按约约定定的的规规律律将将其其解解密密(即即将将其其译译回回原文)。原文)。例例4.13 从从键键盘盘输输入入一一行行字字符符,将将其其中中的的英英文文字字母母进进行行加加密密输输出(非英文字母不用加密)。出(非英文字母不用加密)。C程序如下:程序如下:#include stdio.hmain()char c;int k;p
17、rintf(input k:);scanf(%d,&k);scanf(%c,&c);/*吃掉上次输入的回车符吃掉上次输入的回车符*/cgetchar();while(c!n)if(ca&cz)|(cA&cZ)cck;if(cz|(cZ&cZk)cc26;printf(%c,c);cgetchar();4.4.3 对分法求方程实根对分法求方程实根 设非线性方程为设非线性方程为f(x)0 用对分法求在区间用对分法求在区间a,b上的实根。上的实根。具体方法如下:具体方法如下:从区间端点从区间端点x0a出发,以出发,以h为步长,逐步往后进行扫描。为步长,逐步往后进行扫描。对对于于每每一一个个被被扫扫描
18、描的的子子区区间间xi,xi1(其其中中xi1xih)作作如下处理:如下处理:若若在在子子区区间间两两个个端端点点上上的的函函数数值值f(xi)与与f(xi1)同同号号,则则说说明明在在该该子子区区间间上上没没有有实实根根,将将扫扫描描下下一一个个子子区区间间;否否则则说说明明在在该该子子区区间间上上至至少少有有一一个个实实根根。此此时时就就可可以以在在该该子子区区间间上上采采用用对分法进一步搜索实根。对分法进一步搜索实根。对分法的基本过程如下:对分法的基本过程如下:取子区间取子区间xi,xi1的中点的中点如果如果f(x)与与f(xi)同号,则令同号,则令xix;否则令;否则令xi1x。然后重
19、复这个过程,直到满足条件然后重复这个过程,直到满足条件为止。其中为止。其中为事先给定的精度要求。为事先给定的精度要求。图4.9 对分法求方程实根的流程图对分法求方程实根的流程图如图对分法求方程实根的流程图如图4.9所示。所示。例例4.15 用对分法求方程用对分法求方程f(x)x26x10 在在区区间间10,10上上的的实实根根,即即A10,B10。取取扫扫描步长描步长H0.1,精度要求,精度要求 。相应的相应的C程序如下:程序如下:#include stdio.hmain()int flag;double a10.0,b10.0,h0.1,x1,y1,x2,y2,x,y;x1a;y1x1*x1
20、6*x11.0;x2x1h;y2x2*x26*x21.0;while(x1b)if(y1*y20.0)x1x2;y1y2;x2x1h;y2x2*x26*x21.0;else flag0;while(flag0)x(x1x2)/2;if(fabs(x2x1)0.000001)printf(x%11.7fn,x);x1x0.5*h;y1x1*x16*x11.0;x2x1h;y2x2*x26*x21.0;flag1;else yx*x6*x1.0;if(y1*y0.0)x2x;y2y;else x1x;y1y;4.4.4 迭代法求方程实根迭代法求方程实根 设非线性方程为设非线性方程为f(x)0 用迭
21、代法求一个实根的基本方法如下:用迭代法求一个实根的基本方法如下:首先将方程首先将方程f(x)0改写成便于迭代的格式改写成便于迭代的格式x(x)然后初步估计方程实根的一个初值然后初步估计方程实根的一个初值x0,作如下迭代:,作如下迭代:,n0,1,2,直到满足条件直到满足条件|或或者者迭迭代代了了足足够够多多的的次次数数还还不不满满足足这这个个条条件件为为止止。其其中中为为事事先给定的精度要求。先给定的精度要求。反映上述过程的流程图如图反映上述过程的流程图如图4.10所示。所示。图4.10 迭代法求方程实根流程图例例4.16 求求非非线线性性方方程程x1arctanx0 的的一一个个实实根根。取
22、取初初值值x01.0,精度要求,精度要求0.000001。并改写成如下迭代格式:。并改写成如下迭代格式:相应的相应的C程序如下:程序如下:#include stdio.h#include math.hmain()int m;double x1.0,eps0.000001,x0;printf(input m:);scanf(%d,&m);/*输入最大迭代次数输入最大迭代次数*/do x0 x;x1.0atan(x0);mm1;while(m!0)&(fabs(xx0)eps);if(m0)printf(FAIL!n);else printf(x%11.fn,x);4.4.5 牛顿法求方程实根牛顿
23、法求方程实根 设非线性方程为设非线性方程为f(x)0 在选取一个初值在选取一个初值x0后,牛顿迭代格式为后,牛顿迭代格式为 实际上牛顿迭代格式是一种特殊的简单迭代格式,相当于实际上牛顿迭代格式是一种特殊的简单迭代格式,相当于 上述迭代过程一直进行到满足条件上述迭代过程一直进行到满足条件|或或者者迭迭代代了了足足够够多多的的次次数数还还不不满满足足这这个个条条件件为为止止。其其中中为为事事先先给定的精度要求。给定的精度要求。反映上述过程的流程图如图反映上述过程的流程图如图4.11所示。所示。图4.11 牛顿法求方程实根流程图 例例4.17 求求非非线线性性方方程程x1cosx0的的一一个个实实根
24、根。取取初初值值x01.0,精度要求,精度要求0.000001。其牛顿迭代格式为。其牛顿迭代格式为 其中其中f(xn)xn1cos xn,f (xn)1sin xn。相应的相应的C程序如下:程序如下:#include stdio.h#include math.hmain()int m;double x1.0,eps0.000001,x0;printf(input m:);scanf(%d,&m);/*输入最大迭代次数输入最大迭代次数*/do x0 x;xx0(x01cos(x0)/(1.0sin(x0);mm1;while(m!0)&(fabs(xx0)eps);if(m0)printf(FA
25、IL!n);else printf(x%11.fn,x);4.4.6 梯形法求定积分梯形法求定积分 设定积分为设定积分为 由由微微积积分分的的知知识识可可以以知知道道,该该积积分分值值的的几几何何意意义义是是在在区区间间a,b内的曲线内的曲线f(x)下的面积,如图下的面积,如图4.12所示。所示。图4.12 定积分几何意义梯形法求定积分的基本思想是:梯形法求定积分的基本思想是:首先将积分区间首先将积分区间a,bn等分,得到等分,得到n个子区间个子区间xi,xi1(i0,1,2,n1),每一个子区间的长度为,每一个子区间的长度为h(ba)/n,如图如图4.12所示,其中所示,其中xiaih。然后
26、在每一个子区间上用梯形的面积然后在每一个子区间上用梯形的面积来近似代替该子区间上小长条的面积。来近似代替该子区间上小长条的面积。最最后后将将所所有有小小长长条条的的面面积积近近似似值值Si累累加加就就可可得得到到积积分分值值的的近近似值。即似值。即S 其流程图如图其流程图如图4.13所示。所示。图4.13 梯形法求定积分例例4.18 用梯形法求积分用梯形法求积分dx即即a0,b1,f(x)。相应的相应的C程序如下:程序如下:#include stdio.h#include math.hmain()int n,k;double a0.0,b1.0,h,s,p,x;printf(input n:);scanf(%d,&n);/*输入等分数输入等分数*/h(ba)/n;sh*(exp(a*a)exp(b*b)/2;p0.0;for(k1;kn;kk1)xak*h;ppexp(x*x);ssp*h;printf(s%11.7fn,s);