《C语言课件05ControlFlow》由会员分享,可在线阅读,更多相关《C语言课件05ControlFlow(25页珍藏版)》请在金锄头文库上搜索。
1、控制流控制流提纲提纲 分支结构分支结构 if if 条件运算符条件运算符 switchswitch 循环结构循环结构 whilewhile do-whiledo-while forfor breakbreak与与continuecontinue gotogoto 多重循环多重循环 例题例题 运算符小结运算符小结结束if(1):): if语句的三种形式语句的三种形式语句形式:语句形式:if (if (表达式表达式表达式表达式) ) 语句语句语句语句if (if (表达式表达式表达式表达式) ) 语句语句语句语句1 1 else else 语句语句语句语句2 2if (if (表达式表达式表达式表
2、达式1 1) ) 语句语句语句语句1 1else if (else if (表达式表达式表达式表达式2 2) ) 语句语句语句语句2 2else if (else if (表达式表达式表达式表达式n-1n-1) ) 语句语句语句语句n-1n-1else else 语句语句语句语句n n示例示例P8488 此处的此处的此处的此处的语句语句语句语句指指指指单个语句单个语句单个语句单个语句,如果在某个分支中需要执如果在某个分支中需要执如果在某个分支中需要执如果在某个分支中需要执行多个操作,必须使用块行多个操作,必须使用块行多个操作,必须使用块行多个操作,必须使用块语句。语句。语句。语句。 包围包围包
3、围包围表达式表达式表达式表达式的的的的小括号是必小括号是必小括号是必小括号是必须的须的须的须的。 此处的此处的此处的此处的表达式表达式表达式表达式不要求不要求不要求不要求是逻是逻是逻是逻辑表达式或关系表达式,辑表达式或关系表达式,辑表达式或关系表达式,辑表达式或关系表达式,可以是数值表达式(非可以是数值表达式(非可以是数值表达式(非可以是数值表达式(非0 0表示真,表示真,表示真,表示真,0 0表示假)表示假)表示假)表示假)这个这个这个这个else else 语句语句语句语句n n也可以没有也可以没有也可以没有也可以没有if(2):): if语句的嵌套语句的嵌套if语句中的内嵌语句也可能是语
4、句中的内嵌语句也可能是if语句。语句。一般形式是:一般形式是:if (表达式表达式1) if (表达式表达式2) 语句语句1 else 语句语句2else if (表达式表达式3) 语句语句3 else 语句语句4P9091if(3):): if语句歧义语句歧义 歧义情形:歧义情形:歧义情形:歧义情形:if (if (表达式表达式表达式表达式1 1) )if (if (表达式表达式表达式表达式2 2) ) 语句语句语句语句1 1else else 语句语句语句语句2 2 解决方案:解决方案:解决方案:解决方案:C C规定,规定,规定,规定,elseelse总与最近的未配对的总与最近的未配对的总
5、与最近的未配对的总与最近的未配对的if if配对。配对。配对。配对。 如果想表达左边这种情形必须采用如下形式:如果想表达左边这种情形必须采用如下形式:如果想表达左边这种情形必须采用如下形式:如果想表达左边这种情形必须采用如下形式:if (if (表达式表达式表达式表达式1 1) if ( if (表达式表达式表达式表达式2 2) ) 语句语句语句语句1 1 else else 语句语句语句语句2 2 P9295P9295返回表达式1表达式2语句1语句2表达式1表达式2语句1语句2条件运算符(条件运算符(1)当当当当if if语句中无论表达式为语句中无论表达式为语句中无论表达式为语句中无论表达式
6、为“ “真真真真” ”和和和和“ “假假假假” ”时,都只时,都只时,都只时,都只执行一个赋值语句,并且赋值语句的执行一个赋值语句,并且赋值语句的执行一个赋值语句,并且赋值语句的执行一个赋值语句,并且赋值语句的左值左值左值左值相同时,相同时,相同时,相同时,C C允许使用形式更简单的条件运算符来替代。如:允许使用形式更简单的条件运算符来替代。如:允许使用形式更简单的条件运算符来替代。如:允许使用形式更简单的条件运算符来替代。如:if (ab) max=a; else max=b;if (ab) max=a; else max=b;等价于等价于等价于等价于max=(amax=(ab)?a:bb)
7、?a:b; ;其中,其中,其中,其中,(a(ab)?a:bb)?a:b为为为为“ “条件表达式条件表达式条件表达式条件表达式” ”。条件运算符要求有条件运算符要求有条件运算符要求有条件运算符要求有3 3个操作对象,是个操作对象,是个操作对象,是个操作对象,是C C语言中唯一语言中唯一语言中唯一语言中唯一的的的的三目运算符三目运算符三目运算符三目运算符。条件表达式的一般形式为:。条件表达式的一般形式为:。条件表达式的一般形式为:。条件表达式的一般形式为:表达式表达式表达式表达式1 1? ?表达式表达式表达式表达式2 2: :表达式表达式表达式表达式3 3条件运算符(条件运算符(2)条件运算符优先
8、级高于赋值运算符,但是低于算术运条件运算符优先级高于赋值运算符,但是低于算术运条件运算符优先级高于赋值运算符,但是低于算术运条件运算符优先级高于赋值运算符,但是低于算术运算符。所以算符。所以算符。所以算符。所以max=(amax=(ab?a:bb?a:b) )等价于等价于等价于等价于 max=amax=ab?a:bb?a:bab?a:b+1ab?a:b+1 等价于等价于等价于等价于 ab?a:(b+1)ab?a:(b+1)条件运算符的结合方向为条件运算符的结合方向为条件运算符的结合方向为条件运算符的结合方向为“ “自右至左自右至左自右至左自右至左” ”。所以。所以。所以。所以aab?a:cb?
9、a:cd?c:dd?c:d等价于等价于等价于等价于 aab?a:(cb?a:(cd?c:dd?c:d) )注意,与注意,与注意,与注意,与(a(ab?a:cb?a:c)d?c:dd?c:d不同。不同。不同。不同。见见见见P96P96例例例例4.3.124.3.12条件表达式中,三个表达式的类型均可不同。当条件表达式中,三个表达式的类型均可不同。当条件表达式中,三个表达式的类型均可不同。当条件表达式中,三个表达式的类型均可不同。当表达表达表达表达式式式式2 2和和和和表达式表达式表达式表达式3 3的类型不同时,可能出现类型转换。如:的类型不同时,可能出现类型转换。如:的类型不同时,可能出现类型转
10、换。如:的类型不同时,可能出现类型转换。如:xy?1:1.5xy?1:1.5返回doubledouble型型switch语句形式:语句形式:switch (switch (表达式表达式表达式表达式) case case 常量表达式常量表达式常量表达式常量表达式1 1: : 语句组语句组语句组语句组1 1 case case 常量表达式常量表达式常量表达式常量表达式2 2: : 语句组语句组语句组语句组2 2 case case 常量表达式常量表达式常量表达式常量表达式n n: : 语句组语句组语句组语句组n n default: default: 语句组语句组语句组语句组n+1n+1 示例示例
11、P9798例例4.4.1和例和例4.4.2返回 表达式表达式表达式表达式可以任意类型,其值可以任意类型,其值可以任意类型,其值可以任意类型,其值将自动转换为整数。将自动转换为整数。将自动转换为整数。将自动转换为整数。 各各各各常量表达式常量表达式常量表达式常量表达式的值必须是整的值必须是整的值必须是整的值必须是整数数数数( (或字符或字符或字符或字符) ),且各不相同。,且各不相同。,且各不相同。,且各不相同。 当某当某当某当某casecase常量表达式常量表达式常量表达式常量表达式被匹被匹被匹被匹配成功时,将执行其后配成功时,将执行其后配成功时,将执行其后配成功时,将执行其后语句语句语句语句
12、组组组组,执行过程将一直持续到,执行过程将一直持续到,执行过程将一直持续到,执行过程将一直持续到遇见遇见遇见遇见breakbreak、returnreturn或或或或switchswitch语句的结束语句的结束语句的结束语句的结束“ “”。语句形式:语句形式:语句形式:语句形式: while (while (表达式表达式表达式表达式) ) 语句语句语句语句注意:注意:注意:注意: whilewhile的的的的循环体循环体循环体循环体只能包含一个语句,若有多项操作应采只能包含一个语句,若有多项操作应采只能包含一个语句,若有多项操作应采只能包含一个语句,若有多项操作应采用复合语句。用复合语句。用复
13、合语句。用复合语句。 whilewhile的特点是先判断表达式,后执行循环体;故的特点是先判断表达式,后执行循环体;故的特点是先判断表达式,后执行循环体;故的特点是先判断表达式,后执行循环体;故whilewhile语句的循环体可能一次也不被执行语句的循环体可能一次也不被执行语句的循环体可能一次也不被执行语句的循环体可能一次也不被执行。 使用使用使用使用whilewhile语句经常容易犯的语句经常容易犯的语句经常容易犯的语句经常容易犯的错误错误错误错误是:在循环体中不包是:在循环体中不包是:在循环体中不包是:在循环体中不包含能最终促使循环结束的语句含能最终促使循环结束的语句含能最终促使循环结束的
14、语句含能最终促使循环结束的语句死循环死循环死循环死循环。示例示例示例示例while返回语句语句当当表达式表达式成立成立语句语句表达式表达式成立成立否则否则语句形式:语句形式:dodo 语句语句语句语句while (while (表达式表达式表达式表达式) ); ;注意注意do-whiledo-while语句的特点是先执行循环体,再判断语句的特点是先执行循环体,再判断语句的特点是先执行循环体,再判断语句的特点是先执行循环体,再判断循环条件是否成立。故循环体至少执行一次。循环条件是否成立。故循环体至少执行一次。循环条件是否成立。故循环体至少执行一次。循环条件是否成立。故循环体至少执行一次。示例示例
15、do-while(1)语句语句直到直到表达式表达式不不成立成立语句语句表达式表达式成立成立否则否则把把do-while转换成转换成while把把while转换成转换成do-whiledo-while(2)返回do 语句while (表达式);循环体语句while (表达式) 语句if (表达式) do 语句 while (表达式);while (表达式) 语句语句形式:语句形式:语句形式:语句形式: 一般形式:一般形式:一般形式:一般形式:for (for (表达式表达式表达式表达式1 1; ;表达式表达式表达式表达式2 2; ;表达式表达式表达式表达式3 3) ) 语句语句语句语句 最简单的
16、应用形式:最简单的应用形式:最简单的应用形式:最简单的应用形式:for (for (循环变量赋初值循环变量赋初值循环变量赋初值循环变量赋初值; ;循环条件循环条件循环条件循环条件; ;循环变量增值循环变量增值循环变量增值循环变量增值) ) 语句语句语句语句如:如:如:如:for (i=0; i=n; i+) for (i=0; i=n; i+) printf(printf( %d%d , i); , i);注意:注意:注意:注意: forfor语句的三个语句的三个语句的三个语句的三个表达式表达式表达式表达式都不是必须的,但都不是必须的,但都不是必须的,但都不是必须的,但作为分隔符的作为分隔符的
17、作为分隔符的作为分隔符的分号分号分号分号却是必须的,下面是一些例子:却是必须的,下面是一些例子:却是必须的,下面是一些例子:却是必须的,下面是一些例子:i=0; for ( i=0; for ( ; ;i=n; i+) i=n; i+) printfprintf ( ( %d %d , i);, i);for(ifor(i=0; i=n=0; i=n; ; ) ) printf(printf( %d%d , i+);, i+);forfor(; ;)(; ;) 语句语句语句语句 表达式表达式表达式表达式2 2通常通常通常通常是关系表达式或逻辑表达式。是关系表达式或逻辑表达式。是关系表达式或逻辑
18、表达式。是关系表达式或逻辑表达式。 语句语句语句语句部分也可以是部分也可以是部分也可以是部分也可以是空语句空语句空语句空语句,如:,如:,如:,如:for (i=0; i=n; for (i=0; i=n; i+) i+) ; ; for(1)没有表达式没有表达式2 2,语句中必须有,语句中必须有breakbreak或或returnreturn把for转换成while把while转换成forfor(2)返回for (表达式1;表达式2;表达式3) 语句表达式1while (表达式2) 语句 表达式3for (;表达式;) 语句while (表达式) 语句breakbreak语句语句语句语句 一
19、般形式:一般形式:一般形式:一般形式:break;break; breakbreak可以用在可以用在可以用在可以用在switchswitch语句中,也可用在循环语句中。语句中,也可用在循环语句中。语句中,也可用在循环语句中。语句中,也可用在循环语句中。在循环语句中,在循环语句中,在循环语句中,在循环语句中,breakbreak用于终止循环。用于终止循环。用于终止循环。用于终止循环。 breakbreak不能用于循环语句或不能用于循环语句或不能用于循环语句或不能用于循环语句或switchswitch语句外的任何语句中,语句外的任何语句中,语句外的任何语句中,语句外的任何语句中,这里的循环语句专指
20、这里的循环语句专指这里的循环语句专指这里的循环语句专指whilewhile,do-whiledo-while或或或或forfor。continuecontinue语句语句语句语句 一般形式:一般形式:一般形式:一般形式:continue;continue; 作用:结束本次循环,即跳过循环体中下面尚未执行的语作用:结束本次循环,即跳过循环体中下面尚未执行的语作用:结束本次循环,即跳过循环体中下面尚未执行的语作用:结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。句,接着进行下一次是否执行循环的判定。句,接着进行下一次是否执行循环的判定。句,接着进行下一次是否执行循
21、环的判定。continuecontinue语句和语句和语句和语句和breakbreak语句的区别是:语句的区别是:语句的区别是:语句的区别是:continuecontinue仅仅仅仅仅结束本次循环,而仅结束本次循环,而仅结束本次循环,而仅结束本次循环,而breakbreak则终止整个循环则终止整个循环则终止整个循环则终止整个循环。示例示例示例示例break与与continue返回 gotogoto语句为无条件转向语句,其一般形式为:语句为无条件转向语句,其一般形式为:语句为无条件转向语句,其一般形式为:语句为无条件转向语句,其一般形式为:gotogoto 语句标号语句标号语句标号语句标号; ;
22、其中语句标号是一个标识符。其中语句标号是一个标识符。其中语句标号是一个标识符。其中语句标号是一个标识符。 gotogoto语句的滥用将使程序流程无规律、可读性差。语句的滥用将使程序流程无规律、可读性差。语句的滥用将使程序流程无规律、可读性差。语句的滥用将使程序流程无规律、可读性差。 gotogoto主要用在与主要用在与主要用在与主要用在与if if语句一起构成循环结构。或从循环体中语句一起构成循环结构。或从循环体中语句一起构成循环结构。或从循环体中语句一起构成循环结构。或从循环体中跳转到循环体外。跳转到循环体外。跳转到循环体外。跳转到循环体外。 例子:实现求例子:实现求例子:实现求例子:实现求
23、n!n!voidvoid main()main() intint n,p,in,p,i; ; scanf(%d,&nscanf(%d,&n);); p=1;i=2; p=1;i=2;loop:ploop:p*=i;*=i; i+; i+; if(iif(i=n) goto loop;=n) goto loop; printf(%dprintf(%d!=%!=%dn,n,pdn,n,p);); goto语句语句返回多重循环多重循环 多重循环是指在某个循环语句的循环体内还有循环多重循环是指在某个循环语句的循环体内还有循环语句,这又称为循环的嵌套。语句,这又称为循环的嵌套。 三种循环可以自身嵌套,也
24、允许相互嵌套。三种循环可以自身嵌套,也允许相互嵌套。 嵌套时要注意在一个循环体内包含另一个完整的循环结构。嵌套时要注意在一个循环体内包含另一个完整的循环结构。例如,九九乘法表: #include void main( ) int i,j;for(i=1;i=9;i+) for(j=1;j=9;j+) /矩形乘法表 printf(“%d*%d=%dt”,i,j,i*j); printf(“n”); for(j=1;j=i;j+) /左下三角形 for( j=i;j=9;j+) /左上三角形 for(j=1;ji;j+) printf(t); for(;ji;j-) printf(“t”); fo
25、r(j=1;j=i;j+) /右下三角形 printf(“%d*%d=%dt”,i,j,i*j); printf(“n”);返回例题:例题:求最大公约数、最小公倍数求最大公约数、最小公倍数求最大公约数、最小公倍数求最大公约数、最小公倍数 输入两个正整数输入两个正整数mm和和n n,求其最大公约数和最小公倍数。求其最大公约数和最小公倍数。可以用两种方法求解:(1)用两数中较小的数作为因子去除该两数,若均能除尽,表明它就是最大 公约数。否则将它减1后再去除,直到除尽为止。 最小公倍数可由两数的乘积除以最大公约数得到。返回#includevoid main( ) int m,n,x,y; scanf
26、(“%d%d”,&m,&n); x=mn?n:m; while(m%x!=0|n%x!=0) x-=1; y=m*n /x; printf(“%dn%dn”,x,y);#includevoid main( ) int m,n,x,y; scanf(“%d%d”,&m,&n); y=mn? m:n; while(y%m!=0|y%n!=0) y+=1; x= m*n /y; printf(“%dn%dn”,x,y);(2)用辗转相除法:对于两数m和n(设mn),用n去除m,若余数为0,则n为 最大公约数,否则将n作为m,余数作为n,再用n去除m,直到n为0,m即为 最大公约数。例如: m(n)
27、n(m%n) 27 18 18 9 9 0#includevoid main( ) int m,n,x,y; scanf(“%d%d”,&m,&n); if(mn) x=m; m=n; n=x; y=m*n; while(n) x=m%n; m=n; n=x; y=y/m; printf(“%dn%dn”,m,y); 运算符小结运算符小结返回运算符运算符结合方向结合方向 备注备注! !、- -、+、- -、( (类型类型) )自右向左自右向左 此处的此处的- -为负号运算符为负号运算符* *、/ /、%自左向右自左向右 此处的此处的* *为乘法运算符为乘法运算符+ +、- -自左向右自左向右
28、此处的此处的- -为减法运算符为减法运算符 、=、 自左向右自左向右=、!=!=自左向右自左向右&自左向右自左向右|自左向右自左向右? :? :自右向左自右向左 唯一的三目运算符唯一的三目运算符= =、+=+=、-=-=、* *= =、/=/=、%=%=自右向左自右向左, ,自左向右自左向右高高低低示例:示例:if(1)下列语句是否正确?下列语句是否正确? if (i0) i+if (i0) i+else i-;else i-; if (i0)if (i0) i+; i+; printf(printf( i i=%=%dndn , i);, i);else i-;else i-; if (x=
29、if (x=y)|(xy)|(x=z)=z) printf(printf( x x is equal to y or x is equal to is equal to y or x is equal to znzn);); if (a=b)if (a=b) printf(printf(a a=%=%dndn, a);, a); 示例:示例:if(2) 输入两个数,并要求按由小到大的次序输出输入两个数,并要求按由小到大的次序输出输入两个数,并要求按由小到大的次序输出输入两个数,并要求按由小到大的次序输出 void main()void main() float a, b, t; float a
30、, b, t; scanf(scanf(%f%f%f%f, &a, &b);, &a, &b); if(aif(ab)b) t=a; a=b; b=t; t=a; a=b; b=t; printf printf( (%5.2f,%5.2fn, a, b); %5.2f,%5.2fn, a, b); void main()void main() float a, b; float a, b; scanf(scanf(%f%f%f%f, &a, &b);, &a, &b); if(aif(ab)b) a= a=a+ba+b; b=a-b; a=a-b; b=a-b; a=a-b; printf p
31、rintf( (%5.2f,%5.2fn, a, b); %5.2f,%5.2fn, a, b); atb(1)(2)(3)初值初值a=a=a+ba+bb=a-bb=a-ba=a-ba=a-ba a3030505050502020b b2020202030303030示例:示例:if(3) 输入三个数,并要求按由小到大的次序输出输入三个数,并要求按由小到大的次序输出(P86(P86例例4.3.4)4.3.4) void main()void main() float a, b, c, t; float a, b, c, t; scanf(scanf(%f%f%f%f%f%f, &a, &b,
32、&c);, &a, &b, &c); if(aif(a b)tb)t=a; a=b; b=t;=a; a=b; b=t; if(aif(a c)tc)t=a; a=c; c=t;=a; a=c; c=t; if(bif(b c)tc)t=b; b=c; c=t;=b; b=c; c=t; printf printf( (%5.2f,%5.2f,%5.2fn, a, b, c); %5.2f,%5.2f,%5.2fn, a, b, c); void main()void main() float a, b, c, t; float a, b, c, t; scanf(scanf(%f%f%f%f
33、%f%f, &a, &b, &c);, &a, &b, &c); if(aif(a b)tb)t=a; a=b; b=t;=a; a=b; b=t; if(bif(b c)tc)t=b; b=c; c=t;=b; b=c; c=t; if(aif(a b)tb)t=a; a=b; b=t;=a; a=b; b=t; printf printf( (%5.2f,%5.2f,%5.2fn, a, b, c); %5.2f,%5.2f,%5.2fn, a, b, c); 返回初值初值a a3030202010101010b b2020303030302020c c1010101020203030初值
34、初值a a3030202020201010b b2020303010102020c c1010101030303030示例:示例:switch下列程序片段是否正确?下列程序片段是否正确? intint i=10, j=11; i=10, j=11;switch(iswitch(i) case j: case j: printf(iprintf(i=%d, in case %=%d, in case %dndn, i, j);, i, j); case 10: case 10: printf(iprintf(i=%d, in case %=%d, in case %dndn, i, 10);,
35、i, 10); #define J 10#define J 10intint i=10; i=10;switch(iswitch(i) case J: case J: printf(iprintf(i=%d, in case %=%d, in case %dndn, i, J);, i, J); case 10: case 10: printf(iprintf(i=%d, in case %=%d, in case %dndn, i, 10);, i, 10); 返回示例:示例:while输入一个整数,求其阶乘输入一个整数,求其阶乘void main()void main() intint n
36、, p, i; n, p, i; scanf(%dscanf(%d, &n);, &n); p=1; i=2; p=1; i=2;初始化部分初始化部分 while (i=n)while (inin printf(%dprintf(%d!=%!=%dndn, n, p);, n, p); 返回如果输入小于等于1,循环体将不被执行。程序的不足之处,对于输入是否非负没有判别。示例:示例:do-while输入一个整数,求其阶乘输入一个整数,求其阶乘void void main()main() intint n, n, p,p, i; i; scanf(%dscanf(%d, , &n);&n); p=
37、1; p=1; i=1;i=1;初始化部分初始化部分 do do p*=i; p*=i; i+; i+; while(iwhile(i=n);=n); printf(%dprintf(%d!=%!=%dndn, , n,n, p);p); 返回注意到,初试化部分不能直接设置i=2,这样将多执行一次乘法!示例:示例:break和和continue分析下列程序的功能:#includevoid main( ) int num,sum=0,i; printf(“Input number:”); for(i=0;i10;i+) scanf(“%d”,&num); if(num0) break; sum+=num; printf(“sum=%dn”,sum);continue;分析下列程序的输出结果:#includevoid main( ) int a=7; do switch(a%2) case 1:a-; break; case 0:a-; continue; printf(“%dn”,a); while(a0); 6420返回