《c语言课件第5章》由会员分享,可在线阅读,更多相关《c语言课件第5章(31页珍藏版)》请在金锄头文库上搜索。
1、四、四、break语句与语句与continue语句语句五、五、goto 语句语句六、多重循环六、多重循环七、梯形法求积分算例七、梯形法求积分算例 1四、四、break语句与语句与continue语句语句 前面三种循环结构都以某个表达式的判断结果作为循环前面三种循环结构都以某个表达式的判断结果作为循环条件,当表达式的值为零时,就立即结束循环。条件,当表达式的值为零时,就立即结束循环。 这是一种遇零就结束循环的简短直接的判断。这是一种遇零就结束循环的简短直接的判断。 C/C+另外提供了另外提供了break语句、语句、continue语句与语句与goto 语语句来改变循环的转向。句来改变循环的转向。
2、 break与与continue语句用在语句用在while、dowhile和和for循环循环中,中,break尚可用于尚可用于switch 语句。语句。 break语句与语句与continue语句的语法格式非常简单,各在其语句的语法格式非常简单,各在其关键字后跟随一个分号关键字后跟随一个分号 : break; 或或 continue;2(1)while语句语句 (2)for语句语句 (3) do while语句语句 非零非零 while 零零 循环体循环体 break; .continue; . 后续语句后续语句表达式表达式 后续语句后续语句增量表达式增量表达式 循环体循环体 break; .
3、continue; . 零零 非零非零 for 初始表达式初始表达式表达式表达式 零零 后续语句后续语句非非零零 循环体循环体 . break; .continue; . do表达式表达式while31.break语句语句 用于退出循环体或用于退出循环体或switch语句语句,在多重循环或在多重循环或switch语语句的嵌套中句的嵌套中break语句仅只终止最紧密包含它的循环体或语句仅只终止最紧密包含它的循环体或switch语句,控制跳转到当前层的循环体或语句,控制跳转到当前层的循环体或switch语句的后语句的后续语句续语句;2.continue语句语句 仅位于循环语句的循环体中,忽略跟随其
4、后的剩余语仅位于循环语句的循环体中,忽略跟随其后的剩余语句,然后判断是否继续下一轮的循环,它的作用不是结束循句,然后判断是否继续下一轮的循环,它的作用不是结束循环迭代,而是退出本次循环,继续下一轮的循环环迭代,而是退出本次循环,继续下一轮的循环; 对于对于while和和dowhile循环循环continue语句跳到循环的底语句跳到循环的底部或立即执行条件测试,对于常规的部或立即执行条件测试,对于常规的for循环,执行增量表循环,执行增量表式之后再继续下一个回合的条件判断。式之后再继续下一个回合的条件判断。 4 for循环和循环和while循环具有下面的相当的关系:循环具有下面的相当的关系: f
5、or(初始化表达式初始化表达式;条件表达式条件表达式;增量表达式增量表达式) 循环体语句循环体语句; for (initialexpre; conditionexpre; stepexpre) statement; 相当于下面相当于下面while循环循环: initialexpre; while (conditionexpre) statement; stepexpre; 初始化表达式初始化表达式; while (条件表达式条件表达式) 循环体语句循环体语句; 增量表达式增量表达式; 但但continue语句隐含地执行语句隐含地执行for循环的增量表达式。如循环的增量表达式。如果果while循
6、环中的增量表达式位于循环中的增量表达式位于continue语句之后,此时语句之后,此时这个增量表达式这个增量表达式stepexpre可以不执行。这是两者不同之可以不执行。这是两者不同之处。处。5常规形式:常规形式: for (initexpre;conditionexpre;stepexpre) statement; # include /求自然数的和求自然数的和 void main (void) int sum=0; for (int k=0; k=100; sum+=k+); / 循环体的语句为空语句循环体的语句为空语句coutsum endl; /输出输出 50506初始化表达式前置:初
7、始化表达式前置: initexpre;for ( ; conditionexpre; stepexpre) statement; # include int sum ( int k ) /此种形式用于函数体中,初始值直接从形参中获得此种形式用于函数体中,初始值直接从形参中获得 int s=0; for ( ; k=100;s+=k+) ; /循环体的语句为空语句循环体的语句为空语句 return s; void main (void) coutsum (10) endl; /输出输出 50057条件表达式内置条件表达式内置(目的是灵活控制循环的跳出件目的是灵活控制循环的跳出件): for (i
8、nitexpre ; ; stepexpr) if(condition1=0) break; /条件条件1为为0跳出循环跳出循环 statement; /条件条件1非非0继续循环继续循环 if(condition2) break; /条件条件2为非为非0跳出循环跳出循环 /for ( initexpre ; ; stepexpr )等价于等价于 for(initexpre ; 1 ; stepexpr) 此时如果此时如果for循环中没有相应的跳出条件,则循环中没有相应的跳出条件,则构成无穷循环。构成无穷循环。8例例输出奇数输出奇数 例例2输出偶数输出偶数 # include # include
9、 void main (void) void main(void) for(int k=1;k10;k+) for (int k=1;k+) if (k%2=0) continue; if (k%2=0) coutk,; continue; coutk10) break; /*输出:输出:1,3,5,7,9,*/ /输出:输出:2,4,6,8,10,9条件表达式内置与增量表达式内置条件表达式内置与增量表达式内置例例输出奇数输出奇数 例例输出偶数输出偶数# include # includevoid main (void) void main (void) for (int k=0;) for
10、(int k=0;) k+; k+; if (k10) if (k%2=0) if(k%2)coutk; continue; cout10) break; /输出:输出:246810 /输出:输出:13579 10无穷循环无穷循环for (;) # include void main(void) int k=0,sum=0; / initexpre; for(; ;) /for (;) if( k100) break; / if(condition) break;条件判断为真退出循环条件判断为真退出循环 sum+=k; / statement; 条件判断为条件判断为0执行循环体执行循环体 k+
11、; / stepexpre; 循环步长增量变动循环步长增量变动 coutsum endl; /*输出输出 5050*/ 11五、五、goto 语句语句要求和标号配合及使用的格式如下:要求和标号配合及使用的格式如下: goto 标号;标号; goto label; 标号:语句;标号:语句; label :statement; goto语句语句 goto语句要求和标号配合;其中标号的命名遵循标识语句要求和标号配合;其中标号的命名遵循标识符的规定。符的规定。 goto语句的功能是把程序控制转移到标号指定的语语句的功能是把程序控制转移到标号指定的语句,即执行句,即执行goto语句之后,程序从指定标号处
12、的语句继续执语句之后,程序从指定标号处的语句继续执行标号表明程序中代码段的某个位置。行标号表明程序中代码段的某个位置。 标号加在某个执行语句的前面,其后面使用冒号标号加在某个执行语句的前面,其后面使用冒号“:”作作为分隔符。为分隔符。12例例 for循环与循环与ifgoto label 循环比较循环比较 1.ifgoto label 循环求和循环求和 2.goto 语句循环求和语句循环求和# include int sum (int n=100)void main (void) int k=1,s=0; int k=0,sum=0; loop: loop: if (k100) goto end
13、; s+=k+; sum+=k+; goto loop;goto loop; end: cout sum endl; return s; /*输出输出 5050*/ 133. ifgoto label 循环求和循环求和# includevoid main (void) int k=0,sum=0; loop: if (k100) goto end; sum+=k+; goto loop; end:cout sum endl; /*输出输出 5050*/ 14六、多重循环六、多重循环 多重循环结构指在循环体中的复合语句是另外一个循环多重循环结构指在循环体中的复合语句是另外一个循环控制结构,形成循
14、环的多层次的嵌套。控制结构,形成循环的多层次的嵌套。C/C+中三种循环可以互相渗透互相包含,也可以自身嵌套中三种循环可以互相渗透互相包含,也可以自身嵌套如如: while(e4) statement ; while(e) while(e4) statement ; for (e1;e2;e3) while(e4) statement; while(e) for (e1;e2;e3) while(e4) statement; do do statement; while(e1); while(e2); while(e) do do statement; while(e1); while(e2);
15、15 每一个循环控制结构本身应是一个完整的循环语句,同每一个循环控制结构本身应是一个完整的循环语句,同时完整的循环语句可以视为一条简单的语句。单一语句可以时完整的循环语句可以视为一条简单的语句。单一语句可以出现的场所,完整的循环语句也可以恰当地嵌入。出现的场所,完整的循环语句也可以恰当地嵌入。 循环嵌套时外层的循环控制变量常作为内层的循环控制循环嵌套时外层的循环控制变量常作为内层的循环控制体相关变量的初值。体相关变量的初值。 不要在内层轻易改变外层循环的增量控制条件。不要在内层轻易改变外层循环的增量控制条件。 for循环语句循环语句 for (e1; e2; e3) s; 中的语句是另外一个中
16、的语句是另外一个for循环语句这样就得到双重循环语句这样就得到双重for循环:循环: for ( e1;e2;e3 ) for ( e4;e5;e6 ) statement;16例例 求的求的 和和,误差小于指定精度误差小于指定精度eps #include#include const double e=exp(1); double expf () double const eps=1.0e-19; double sum=1; int n=1; while (e - sum eps) 17 double facn=1; for (int i=1; ieps) 条件判断中的条件判断中的e=exp(
17、1),如果写如果写为为while (exp(1)- sum eps)则每次判断时都需执行函数则每次判断时都需执行函数exp(1)求值计算。求值计算。 对于与循环无关的函数调用应先计算出其值,以减少不对于与循环无关的函数调用应先计算出其值,以减少不必要的重复计算。必要的重复计算。18七、梯形法求积分算例七、梯形法求积分算例 将一个区间将一个区间a,b分成分成n个子区间:个子区间: 其中其中 下面是积分的定义:下面是积分的定义: 积分积分 如果右边的极限存在,其极限值就是定积分的结果。如果右边的极限存在,其极限值就是定积分的结果。理论上区间分得越细越逼近理论的解,但计算机求和次数过理论上区间分得越
18、细越逼近理论的解,但计算机求和次数过多导致的计算误差不容小视。多导致的计算误差不容小视。19 在计算机进行离散处理时应考虑两方面因素:在计算机进行离散处理时应考虑两方面因素: 一是区间适当细分;一是区间适当细分; 二是收敛性的精度限制。二是收敛性的精度限制。 区间的划分存在两种途径:区间的划分存在两种途径: 一是静态地将区间分为一是静态地将区间分为n等分,等分,n是预先定好的是预先定好的整数;整数; 另一种是动态地确定区间划分数,将区间根据另一种是动态地确定区间划分数,将区间根据某种细分机制,逐步细分,最终的区间划分数根据某种细分机制,逐步细分,最终的区间划分数根据收敛指标动态确定。收敛指标动
19、态确定。 20 下面介绍的梯形算法属于区间一分为二的动态等分,包下面介绍的梯形算法属于区间一分为二的动态等分,包含复杂求积算法的基本要素。梯形法的求解步骤为:含复杂求积算法的基本要素。梯形法的求解步骤为: (1)首先分成一个区间时积分值为首先分成一个区间时积分值为: h=b-a ,T2=0 上面的关系作为迭代的初始值。上面的关系作为迭代的初始值。abxy21(2)分成两个相等的子区间时积分值为分成两个相等的子区间时积分值为: baxyx122(3)当分成相等的子区间时积分值为当分成相等的子区间时积分值为:xkxk1xy23 (4)进一步将上面个相等的每一个子区间一分为二进一步将上面个相等的每一
20、个子区间一分为二,对于对于每一新的子区间采用梯形计算公式每一新的子区间采用梯形计算公式,其结果用前一个回合的其结果用前一个回合的区间边界值予以表示得到区间边界值予以表示得到:这样就得到迭代关系式这样就得到迭代关系式:xy24 (5) 迭代的收敛准则。迭代根据一个精度指标限定,满迭代的收敛准则。迭代根据一个精度指标限定,满足这个指标认为计算收敛,这个指标为:足这个指标认为计算收敛,这个指标为: 即相邻两次迭代求得的积分值之差小于一个非常小的即相邻两次迭代求得的积分值之差小于一个非常小的eps,则认为此时求得的就是所求的结果。,则认为此时求得的就是所求的结果。 如果不满足收敛指标则继续迭代,即将区
21、间的分点加密如果不满足收敛指标则继续迭代,即将区间的分点加密一倍。一倍。 迭代不一定收敛,因此通常内置一个最大迭代次数。如迭代不一定收敛,因此通常内置一个最大迭代次数。如果超过最个迭代次数依然未得到正常的收敛结果,应考虑采果超过最个迭代次数依然未得到正常的收敛结果,应考虑采取相关的手段。取相关的手段。 如调整精度指标如调整精度指标eps,过小的,过小的eps非但得不到合理的计非但得不到合理的计算结果反而因为计算的累计误差而发散。算结果反而因为计算的累计误差而发散。25例例 梯形求积算法梯形求积算法 #include # include extern double f(double); /函数原
22、型说明函数原型说明 double Trapzoidal (double a,double b, const double eps=1.0e-8) double h=b - a; double T1=0.5*h*(f(a)+f(b); double T2=0; const int MaxIteration=0x7000;26 for (int n=1;nMaxIteration;n*=2) double sum=0; double x=a+0.5*h; for ( int k=0; kn; k+,x+=h) sum+=f(x); T2=0.5*(T1+h*sum); if(fabs(T2-T1)
23、eps) return T2; T1=T2; h/=2; printf (Epsilon is too smalln); return MaxIteration;27 Trapzoidal函数第三个形参函数第三个形参eps声明为声明为const double eps=1.0e-8,这是程序员对于函数使用者的,这是程序员对于函数使用者的一个缺省建议,收敛指标一个缺省建议,收敛指标eps取值于取值于1.0e-8附近,函数容易附近,函数容易收敛。带缺省值的参数是收敛。带缺省值的参数是C+新引进的语法现象。新引进的语法现象。 上面的上面的Trapzoidal函数通过两个被积函数进行具体算题函数通过两个
24、被积函数进行具体算题考核,它们分别是:考核,它们分别是: f(x)=1+x 精度指标精度指标eps影响函数影响函数 的积分收的积分收敛性,对于线性函数无影响。敛性,对于线性函数无影响。 28例例被积函数为被积函数为 double f(double x) return exp(x)/(2.5+x*x); void main (void) printf(%fn,Trapzoidal(1,2,1.0e-7); printf(%fn,Trapzoidal(1,2,1.0e-13); 被积函数为输出结果为被积函数为输出结果为 0.947938 Epsilon is too small 28672.000000 29例例 被积函数为被积函数为1+xdouble f(double x)return (1+x); void main (void) printf(%fn,Trapzoidal(1,2,1.0e-1); printf(%fn,Trapzoidal(1,2,1.0e-23); printf(%fn,Trapzoidal(1,2,1.0e-123); 被积函数为被积函数为1+x输出结果为:输出结果为:2.5000002.5000002.5000003031