资源预览内容
第1页 / 共100页
第2页 / 共100页
第3页 / 共100页
第4页 / 共100页
第5页 / 共100页
第6页 / 共100页
第7页 / 共100页
第8页 / 共100页
第9页 / 共100页
第10页 / 共100页
亲,该文档总共100页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
PPT模板下载:/moban/ 行业PPT模板:/hangye/ 节日PPT模板:/jieri/ PPT素材下载:/sucai/PPT背景图片:/beijing/ PPT图表下载:/tubiao/ 优秀PPT下载:/xiazai/ PPT教程: /powerpoint/ Word教程: /word/ Excel教程:/excel/ 资料下载:/ziliao/ PPT课件下载:/kejian/ 范文下载:/fanwen/ 试卷下载:/shiti/ 教案下载:/jiaoan/ 字体下载:/ziti/ 教学课件C语言程序设计第4章 结构控制语句 C C语言程序设计语言程序设计火火 主编主编ISBN:978-7-5611-5634-6ISBN:978-7-5611-5634-62024/7/30第4章 结构控制语句 C C 语言程序设计语言程序设计大连理工大学出版社大连理工大学出版社第第4章章 结构控制语句结构控制语句l l4.1 引例引例l l4.2 C语言的执行语句语言的执行语句l l4.3 顺序结构顺序结构l l4.4 选择结构选择结构l l4.5 循环结构循环结构l l4.6 程序举例程序举例l l本章小结本章小结2024/7/304.1 引例引例l l输入任意输入任意输入任意输入任意1010个整数,求其所有正整数的和个整数,求其所有正整数的和个整数,求其所有正整数的和个整数,求其所有正整数的和。l l#include #include l lvoid main()void main()l l int n,sum=0; int n,sum=0;l l int i=1; int i=1;l l printf(please enter ten numbers:n); printf(please enter ten numbers:n);l l while(i=10) /* while(i0) /* if(n0) /* 选择结构开始选择结构开始选择结构开始选择结构开始 */ */l l sum=sum+n; /* sum=sum+n; /* 选择结构结束选择结构结束选择结构结束选择结构结束 */ */l l i+; i+;l l /* /* 循环结构结束循环结构结束循环结构结束循环结构结束 */ */l l printf(sum=%d,sum); printf(sum=%d,sum);l l l l程序运行情况如下:程序运行情况如下:程序运行情况如下:程序运行情况如下:l lplease enter ten numbers:please enter ten numbers:l l5 -3 2 -2 7 9 10 -15 10 -15 -3 2 -2 7 9 10 -15 10 -1 2024/7/304.2 C语言的执行语句语言的执行语句C语言的执行语句分为四类:语言的执行语句分为四类: (1)表达式语句;)表达式语句; a=a+1; printf(“ ”); (2)空语句;)空语句; ; (3)复合语句;)复合语句;a=a+1; printf(“ ”); (4)控制语句;)控制语句;2024/7/304.2.1 表达式语句表达式语句l l格式:表达式格式:表达式格式:表达式格式:表达式; ;表达式后面加一个表达式后面加一个表达式后面加一个表达式后面加一个分号分号分号分号,构成表达式语句,构成表达式语句,构成表达式语句,构成表达式语句例如:例如:例如:例如:c=a+absc=a+abs(b b); /* ; /* 赋值语句赋值语句赋值语句赋值语句 * */ / x=1 x=1,y=0; /* y=0; /* 逗号表达式语句逗号表达式语句逗号表达式语句逗号表达式语句 * */ / i+; /* i+; /* 自增自增自增自增1 1 语句语句语句语句 * */ / m * n; /* m * n; /* 乘法运算语句,但其计乘法运算语句,但其计乘法运算语句,但其计乘法运算语句,但其计 算结果不能保存,无意义算结果不能保存,无意义算结果不能保存,无意义算结果不能保存,无意义* */ / printf(sum=%d,sum); /* printf(sum=%d,sum); /* 函数调用语句函数调用语句函数调用语句函数调用语句 * */ / 2024/7/30赋值语句赋值语句一般形式:一般形式:变量赋值运算符表达式;变量赋值运算符表达式;(1) x+=a*b; (2) n=n+1; (3) x=y=9*6; (4) if(x+=y*b) z=x; if(x+=y*b;) z=x; 表达式语句表达式语句2024/7/302函数调用语句函数调用语句一般形式:一般形式:函数调用;函数调用;如:如:printf(“Welcome!”); sin(x);l l注意:注意: 分号是语句必不可少的一部分分号是语句必不可少的一部分分号是语句必不可少的一部分分号是语句必不可少的一部分 单独的一个分号单独的一个分号单独的一个分号单独的一个分号“ “; ;” ” 构成一个空语句构成一个空语句构成一个空语句构成一个空语句例如:例如:例如:例如: ; (空语句,是最简单的(空语句,是最简单的(空语句,是最简单的(空语句,是最简单的C C语句)语句)语句)语句)表达式语句表达式语句2024/7/30 空语句是指只由一个空语句是指只由一个分号分号构成的语句。即:构成的语句。即: ;空语句不产生任何操作运算空语句不产生任何操作运算,只是在逻辑,只是在逻辑上起到一个语句的作用。空语句常用于:上起到一个语句的作用。空语句常用于: (1)构成标号语句,用来标识程序流程的)构成标号语句,用来标识程序流程的转向点。转向点。 (2)构成循环语句中的)构成循环语句中的“空空”循环体。循环体。4.2.2 空语句空语句2024/7/30l l用一对用一对花括号花括号“”括起来的若干条语括起来的若干条语句句 l l花括号中可以是花括号中可以是表达式语句、控制语句表达式语句、控制语句,也可以是也可以是复合语句复合语句l l其形式为:其形式为: 语句语句1 语句语句2 语句语句n 4.2.3 复合语句复合语句例如:例如:例如:例如: temp=x; temp=x; x=y; x=y; y=temp; y=temp; 2024/7/304.2.3复合语句(续)复合语句(续)例如:例如: main( ) int a,b; a=b=100; float c=10.23; printf(%fn,c); printf(%d %dn,a,b); 要特别注意:要特别注意:l l花括号的配对花括号的配对l l花括号的位置花括号的位置C C C C语言学习语言学习语言学习语言学习的难点之的难点之的难点之的难点之一一一一2024/7/30(1 1 1 1)复合语句内的)复合语句内的)复合语句内的)复合语句内的各条语句均应以分号各条语句均应以分号各条语句均应以分号各条语句均应以分号“ “; ; ; ;” ”结结结结尾尾尾尾,而右花括号,而右花括号,而右花括号,而右花括号“ “ ” ”后面则不能有分号后面则不能有分号后面则不能有分号后面则不能有分号。 (2 2 2 2)复合语句是一个语句,而不是多条语句。复合语句是一个语句,而不是多条语句。复合语句是一个语句,而不是多条语句。复合语句是一个语句,而不是多条语句。 (3 3 3 3)将复合语句)将复合语句)将复合语句)将复合语句用作循环语句的循环体用作循环语句的循环体用作循环语句的循环体用作循环语句的循环体,或作为,或作为,或作为,或作为选择语句某分支内嵌的语句。选择语句某分支内嵌的语句。选择语句某分支内嵌的语句。选择语句某分支内嵌的语句。 (4 4 4 4)复合语句也称为)复合语句也称为)复合语句也称为)复合语句也称为分程序,其可有属于自己的分程序,其可有属于自己的分程序,其可有属于自己的分程序,其可有属于自己的数据声明语句数据声明语句数据声明语句数据声明语句。关于复合语句的几点说明:关于复合语句的几点说明:2024/7/304.2.4控制语句控制语句1选择分支控制语句选择分支控制语句if ( ) else switch ( ) 2循环控制语句循环控制语句 for ( ) while ( ) do while ( )3其他控制语句其他控制语句 break、continue、gotoreturn2024/7/30l lC程序的核心部分程序的核心部分“三大结构,九大语句三大结构,九大语句”,其中的九大语句就是上面所提到的,其中的九大语句就是上面所提到的9种控种控制语句,而三大结构指的是制语句,而三大结构指的是: (1)顺序结构顺序结构 (2)选择结构选择结构 (3)循环结构循环结构4.3 顺序结构顺序结构2024/7/30程序的三种基本结构程序的三种基本结构顺序结构顺序结构N-S结结构构图图流流程程图图ABAB选择结构选择结构Y(真真)N(假假)ABP成成立立?PTFAB2024/7/30程序的三种基本结构程序的三种基本结构循环结构循环结构N(假)(假)Y(真真)P成立成立?A当当P成立时成立时A直到型循环直到型循环直到型循环直到型循环 A当P成立时Y(真真)N(假假)AP成立成立?当型循环当型循环当型循环当型循环N-S结结构构图图流流程程图图2024/7/30 选择结构的控制语句有两种:选择结构的控制语句有两种:(1)(1)选择分支语句:选择分支语句:(2)(2)开关分支语句:开关分支语句:switch ( ) 4.4选择结构选择结构简单分支语句简单分支语句if ( ) if ( ) 双分支语句双分支语句if ( ) else if ( ) else If语句的嵌套语句的嵌套2024/7/30简单分支语句简单分支语句l l语句一般格式语句一般格式 if (表达式表达式) 语句语句1l l功能:功能: 计算表达式的值,如果是一个非计算表达式的值,如果是一个非计算表达式的值,如果是一个非计算表达式的值,如果是一个非0 0值(即逻值(即逻值(即逻值(即逻辑真),就执行内嵌语句辑真),就执行内嵌语句辑真),就执行内嵌语句辑真),就执行内嵌语句1 1,否则(即逻辑,否则(即逻辑,否则(即逻辑,否则(即逻辑假)跳过内嵌语句假)跳过内嵌语句假)跳过内嵌语句假)跳过内嵌语句1 1,顺序执行后续语句。,顺序执行后续语句。,顺序执行后续语句。,顺序执行后续语句。 语句语句1流程图流程图NY表达式非表达式非0?l l例如:例如: if (x0) m+; if ( ab ) c=a; a=b; b=c; 2024/7/30双分支语句双分支语句 l l语句一般格式语句一般格式if (表达式表达式)语句语句1 else 语句语句2 l l功能:功能: 计算表达式的值,如果它的值是一个非计算表达式的值,如果它的值是一个非0值(逻辑真),就执行内嵌语句值(逻辑真),就执行内嵌语句1,之,之后跳过内嵌语句后跳过内嵌语句2,执行后续语句;否,执行后续语句;否则跳过内嵌语句则跳过内嵌语句1,执行内嵌语句,执行内嵌语句2,之,之后执行后续语句。后执行后续语句。 语句语句1语句语句2流程图流程图NY表达式非表达式非0?2024/7/30双分支语句的算法:双分支语句的算法:l l例如:例如:例如:例如: if (x0) m+; else m-; y=y+1; if ( ch= a & ch= z ) ch=ch-32 ; printf( %cn,ch); else printf( %cn,ch) ; ch=getchar();2024/7/30【例例4.2】从键盘输入从键盘输入x,y两个整数,比较其两个整数,比较其大小大小,并按降序输出这两个整数。并按降序输出这两个整数。思路一思路一:(用一个单分支用一个单分支if语句实现语句实现)l l输入:输入:输入:输入:用用用用scanfscanf函数输入函数输入函数输入函数输入x x和和和和y y的值的值的值的值l l用用用用if if语句判断语句判断语句判断语句判断x x和和和和y y是否满足是否满足是否满足是否满足xy,xy,若是,则交换若是,则交换若是,则交换若是,则交换两数的值;否则无需交换两数的值;否则无需交换两数的值;否则无需交换两数的值;否则无需交换l l输出:输出输出:输出输出:输出输出:输出x x和和和和y y的值的值的值的值2024/7/30void main() int x,y,temp; printf(“x=”); scanf(“%d”,&x); printf(“y=”); scanf(“%d”,&y); If(x=y,x=y,若是,则若是,则若是,则若是,则先先先先x x后后后后y y输出两数输出两数输出两数输出两数;l l用用用用if if语句判断语句判断语句判断语句判断x x和和和和y y是否满足是否满足是否满足是否满足xy,x=y) printf(%d, %dn,x,y); If(x=y,x=y,若是,则若是,则若是,则若是,则输出输出输出输出x x和和和和y y的值的值的值的值; ;否则用否则用否则用否则用elseelse语句语句语句语句输出输出输出输出y y和和和和x x的值的值的值的值;2024/7/30void main() int x,y,temp; printf(“x=”); scanf(“%d”,&x); printf(“y=”); scanf(“%d”,&y); If(x=y) printf(%d, %dn,x,y); else printf(%d, %dn,y,x); 程序运行情况:程序运行情况:x=5 y=9 9,5x=9 y=5 9,5对比思路一对比思路一对比思路二对比思路二2024/7/30例4.3 判断某年份是闰年还是平年。判断某年份是闰年还是平年。判断闰年的条件是:判断闰年的条件是:判断闰年的条件是:判断闰年的条件是:年份能被年份能被年份能被年份能被4 4整除而不能整除而不能整除而不能整除而不能被被被被100100整除,或者年份整除,或者年份整除,或者年份整除,或者年份能被能被能被能被400400整除。整除。整除。整除。void main()int year; printf(“请输入年份:请输入年份:”); scanf(“%d”,&year);if(year%4=0&year%100!=0|year%400=0) printf(“%d年是闰年!年是闰年!n,year); else printf(“%d年是平年!年是平年!n,year); 2024/7/30If语句的嵌套语句的嵌套 l lIf语句的嵌套格式语句的嵌套格式1:if (表达式表达式1) if (表达式表达式2) 语句语句1 else 语句语句2 else if (表达式表达式3) 语句语句3 else 语句语句 4If嵌套嵌套If嵌套嵌套2024/7/30例例1voidmain()inta=10,b=8,c=9;if(ab)if(bc)printf(“1”);elseprintf(“2”);elseif(bc)printf(“3”);elseprintf(“4”);2024/7/30多重分支语句多重分支语句 l lIf语句的嵌套语句的嵌套格式格式2:if (表达式表达式1) 语句语句1 else if (表达式表达式2) 语句语句2 else if (表达式表达式3) 语句语句3 else 语句语句4l l功能:功能: 依次计算并判断表达式依次计算并判断表达式i,为非,为非0时执行后面时执行后面的语句,都为的语句,都为0时,执行语句时,执行语句n 无论执行完那个语句分支,都转到后续语句无论执行完那个语句分支,都转到后续语句If语句语句多重多重嵌套嵌套2024/7/30例例4.4 输入任意一个整数输入任意一个整数x,判断该数的正负,如,判断该数的正负,如果果x=0,则输出,则输出0 。 运行结果:运行结果: x=5 x的符号为:的符号为:+void main() int x; printf(“x=”); scanf(“%d”,&x); if(x0) printf(“x的符号为:的符号为:+”); else if(xb) if(ac)if(ad) m=1; else m=2; else m=3;问题:哪一个问题:哪一个 else 和哪一个和哪一个 if 相匹配相匹配?规则:在规则:在嵌套的嵌套的ifelse语句语句中,中,else总是与总是与上面的离它最近的尚未配对的上面的离它最近的尚未配对的if 配对。配对。if(ab) if(ac) if(ad) m=1; else m=2; else m=3; 2024/7/30学习学习if语句的难点语句的难点l lif else 语句的配对语句的配对l l正确用表达式描述条件正确用表达式描述条件例如:当例如:当x大于大于5小于小于10时令时令x自增自增 if ( 5x10 ) x+;l l正确判断内嵌语句正确判断内嵌语句例如:例如:if(x5 & xy) if(xz) max=x; else max=z;else if(yz) max=y; else max=z;printf(“the max is:%d”,max); 例例4.5由键盘输入三个整数由键盘输入三个整数x,y,z,求其最大者求其最大者 。2024/7/30 例例4.54.5 由键盘输入三个整数由键盘输入三个整数由键盘输入三个整数由键盘输入三个整数x,y,z,x,y,z,求其最大者。求其最大者。求其最大者。求其最大者。 if(xy)if(xy) if(xz) /* if(xz) /* 表明表明表明表明xyxy,并且同时,并且同时,并且同时,并且同时xz */xz */ max=x; max=x; else /* else /* 表明表明表明表明xy xy ,并且同时,并且同时,并且同时,并且同时 x=z */xz) /* if(yz) /* 表明表明表明表明x=yxz */yz */ max=y; max=y; else /* else /* 表明表明表明表明x=y x=y ,并且同时,并且同时,并且同时,并且同时y=z */y5)printf(“%dn”,m);elseprintf(“%dn”,m-);执行后行后输出的出的结果是果是A)4B)5C)6D)7答案:答案:练习题()练习题()2024/7/30语句句printf(“%d”,(a=2)&(b=-2);的的输出出结果是()。果是()。 答案:答案: 练习题()练习题()2024/7/30有定有定义语句:句:inta=1,b=2,c=3,x;则以下以下选项中各程序段中各程序段执行后,行后,x的的值不不为3的是:的是:.if(ca)x=1;B.if(a3)x=3;elseif(ba)x=2;elseif(a2)x=2;elsex=3;elsex=1;C.if(a3)x=3;D.if(ab)x=b;if(a2)x=2;if(bb?(bc?1:0):0;功能等价的是()功能等价的是()A)if(ab)&(bc)k=1;elsek=0;B)if(ab)|(bc)k=1;elsek=0; 答案:答案: A练习题()练习题()C)if(a=b)k=0;elseif(bb)k=1;elseif(bc)k=1;2024/7/30有以下程序有以下程序main()inta=3,b=4,c=5,d=2;if(ab)if(bc)printf(%d,d+1);elseprintf(%d,+d+1);printf(%dn,d);运行后的运行后的输出出结果是果是:A)2B)3C)43D)44 答案:答案: A练习题()练习题()2024/7/30 main( ) int x=0,y=5,z=3; while(z-0&+x5) y=y-1; printf(“%d,%d,%dn”,x,y,z); 程序程序执行后的行后的输出出结果是()果是()A)3,2,0 B)3,2,-1 C)4,3,-1 D)5,-2,-5 答案:答案: B 练习题(练习题(8)2024/7/30main() int s=0,a=1,n; scanf(%d,&n); do s+=1; a=a-2; while(a!=n); printf(%dn,s); 若要使程序的若要使程序的输出出值为2,则应该从从键盘给n输入的入的值是是 A)-1 B)-3 C)-5 D)0 答案:答案: B练习题(练习题(9)2024/7/304.5 循环结构循环结构l l用用goto语句实现循环控制语句实现循环控制l lwhile循环控制(当型)循环控制(当型)l ldo-while循环控制循环控制(直到型)(直到型)l lfor循环控制循环控制2024/7/30goto语句为语句为无条件转向语句无条件转向语句,其一般格式,其一般格式如下:如下: goto 语句标号;语句标号;其中其中“语句标号语句标号”用用标识符标识符实现。实现。 4.5.1 用用goto语句实现循环语句实现循环goto语句和语句标号相结合语句和语句标号相结合可以实现可以实现无条无条件循环结构件循环结构。当然要跳出循环,往往还要。当然要跳出循环,往往还要和和if语句相结合。形式为:语句相结合。形式为:语句标号:语句标号:if(条件表达式)(条件表达式) 程序段程序段 goto 语句标号语句标号;2024/7/30【例例】编写程序,求编写程序,求100个自然数的和个自然数的和即:即: s=1+2+3+ +100 加数加数i i从从1变到变到100,每循环一次,使,每循环一次,使i增增1,直到直到i的值超过的值超过100。i i的的初值初值初值初值设为设为1。求和求和设变量设变量 sum sum 存放和存放和,循环求,循环求sum=sum+isum=sum+i,直至,直至i超过超过100。 思路:寻找思路:寻找加数加数与与求和求和的规律的规律 加数加数i i从从1变到变到100,每循环一次,使,每循环一次,使i增增1,直到直到i的值超过的值超过100。i i的的初值初值初值初值设为设为1。求和求和设变量设变量 sum sum 存放和存放和,循环求,循环求sum=sum+isum=sum+i,直至,直至i超过超过100。 2024/7/30 void main() int i,sum; sum=0; i=1; loop: if(i=100) sum+=i; i+; goto loop; printf(“1至至100的累加和为:的累加和为:%d”,sum); 运行结果:运行结果: 1至至100的累加和为:的累加和为:5050 例例4.8 用用goto语句和语句和if语句相结合,求语句相结合,求1+2+3 +99+100的和。的和。2024/7/30l不提倡使用不提倡使用goto语句语句注意注意:goto语句能实现程序无条件转移,为语句能实现程序无条件转移,为编程提供了便利。但是无限制地使用,编程提供了便利。但是无限制地使用,会破坏程序的结构化程度。会破坏程序的结构化程度。因此应限制使用。因此应限制使用。2024/7/304.5.2 用用while语句实现循环语句实现循环l l基本格式:基本格式:基本格式:基本格式: whilewhilewhilewhile(条件表达式)(条件表达式)(条件表达式)(条件表达式) 循环体循环体循环体循环体 功能:当条件表达式功能:当条件表达式功能:当条件表达式功能:当条件表达式成立成立成立成立(值非)(值非)(值非)(值非)时,时,时,时,执行循执行循执行循执行循环体语句环体语句环体语句环体语句,再重新判断,再重新判断,再重新判断,再重新判断条件表达式的值,条件表达式的值,条件表达式的值,条件表达式的值,一直一直一直一直循环判断循环判断循环判断循环判断,当条件表达,当条件表达,当条件表达,当条件表达式式式式不成立(值为)不成立(值为)不成立(值为)不成立(值为)时,时,时,时,则退出循环,执行后续则退出循环,执行后续则退出循环,执行后续则退出循环,执行后续语句。语句。语句。语句。N NY Y流程图流程图流程图流程图表达式非表达式非0?语句语句循环控制条件循环控制条件循环控制条件循环控制条件循环体循环体循环体循环体2024/7/30注意:注意: l l如果如果while的的 (表达式表达式) 值为值为0,则循环体一,则循环体一次也不执行次也不执行 (例如当例如当i的初值的初值=101) 。l l在循环体中必须有使循环趋向结束的操作,在循环体中必须有使循环趋向结束的操作,否则循环将无限进行(否则循环将无限进行(死循环死循环)。)。 l l在循环体中,语句的先后位置必须符合逻在循环体中,语句的先后位置必须符合逻辑,否则会影响运算结果。辑,否则会影响运算结果。 思考程序段的输出?思考程序段的输出?int i=1,sum=0; while (i=2) i+; sum=sum+i; 运行后,输出:运行后,输出:运行后,输出:运行后,输出:sum=5sum=5原因是什么?原因是什么?原因是什么?原因是什么? 2024/7/30 void main() int i=1,sum=0; while(i=100) sum+=i; i+; printf(“1至至100的累加和为:的累加和为:%d”,sum); 运行结果:运行结果: 1至至100的累加和为:的累加和为:5050 例例4.9 用用while循环语句编写程序,求循环语句编写程序,求1+2+3+99+100的和。的和。i i: : 循环控制变量循环控制变量2024/7/30辗转相除法求两个整数的最大公约数辗转相除法求两个整数的最大公约数,步骤是:,步骤是:先用大的一个数除以小的一个数,得第一个余数;先用大的一个数除以小的一个数,得第一个余数;再用小的一个数除以第一个余数,得第二个余数;再用小的一个数除以第一个余数,得第二个余数;又用小的一个数除以第二个余数,得第三个余数;又用小的一个数除以第二个余数,得第三个余数;依此类推依此类推,直到余数是为止。那么,最后一个,直到余数是为止。那么,最后一个除数就是所求的最大公约数。除数就是所求的最大公约数。2024/7/30 void main() int n1,n2,t; printf(“输入两个正整数输入两个正整数:n”); scanf(“%d%d”,&n1,&n2); if(n1n2) /*n1存最大值存最大值 t=n1;n2存最小值存最小值*/ n1=n2; n2=t; 例例4.10 求两个正整数求两个正整数n1和和n2的最大公约数。的最大公约数。/*以下通过辗转相除法以下通过辗转相除法求两数的最大公约数求两数的最大公约数*/While(n2!=0) t=n1%n2; n1=n2; n2=t;printf(“它们的最大公它们的最大公约数为:约数为:%dn”,n1);2024/7/304.5.3 用用 do-while语句实现循环语句实现循环l l语句一般格式语句一般格式 do 循环体循环体while (条件表达式条件表达式);); l l功能:功能: 先执行循环体先执行循环体,之后计算表达式的值,之后计算表达式的值,不为不为0(逻辑真)时,再执行循环体并判(逻辑真)时,再执行循环体并判断条件,断条件,直到表达式的值为直到表达式的值为0 结束循环,结束循环,转去执行转去执行while下面的语句。下面的语句。NY循环体循环体表达式非表达式非0?流程图流程图2024/7/30 do-while循环的算法循环的算法main( ) int i=1,sum=0; do sum=sum+i; i+; while (i=100); printf(%dn,sum);例例4.1.1用用do-while语句求语句求100个自然数的和个自然数的和 运行结果:运行结果: 5050 2024/7/30说明:说明: l lwhile和和do-while都能实现循环控制,都能实现循环控制,while结构程序通常都结构程序通常都可以转换可以转换成成do-while结构结构l l区别:区别: do- while 语句语句先执行循环体再判断条先执行循环体再判断条件,循环体件,循环体至少执行一次至少执行一次; while 语句语句先判断条件再执行循环体,先判断条件再执行循环体,循环体循环体有可能一次也不执行有可能一次也不执行。2024/7/30例例4-9修改如下:修改如下:void main() int i,sum; sum=0; printf(i=); scanf(%d,&i); while(i=100) sum+=i; i+; printf(“sum=%d”,sum);程序第一次运行:程序第一次运行:i=50i=50sum=3825sum=3825程序第二次运行:程序第二次运行:i=101i=101sum=0sum=0例例4.12 修改例修改例4-9与例与例4-11,比较,比较while循环和循环和 do.while循环的差异。循环的差异。2024/7/30修改例修改例4-11如下:如下:void main() int i,sum; sum=0; printf(i=); scanf(%d,&i); do sum+=i; i+; while(i=1):); scanf(%d, &n); do sum=sum+1.0/i*flag; flag= -1*flag; i+; while(i=1), 计算并输出计算并输出S:S = 1-1/2 + 1/3 - 1/4 + 1/5 -1/6 + +(-)n+11/n2024/7/304.5.4 for语句语句 l l语句一般格式语句一般格式 for (表达式表达式1;表达式表达式2;表达式表达式3) 循环体循环体 l l功能:功能:计算表达式计算表达式1的值,再的值,再判断表达式判断表达式2,如果其值为非如果其值为非0(逻辑真),则执行内嵌语句(逻辑真),则执行内嵌语句(循环体循环体),并,并计算表达式计算表达式3;之后再去判断表;之后再去判断表达式达式2,一直到其值为,一直到其值为0时结束循环,执行后时结束循环,执行后续语句。续语句。循环初始条件循环初始条件循环初始条件循环初始条件循环控制条件循环控制条件循环控制条件循环控制条件2024/7/30for语句的算法语句的算法NY流程图流程图计算表达式计算表达式1循环体循环体计算表达式计算表达式3表达式表达式2为真为真?main( )main( ) int i,sum; int i,sum; sum=0; sum=0; for ( i=1; i=100; i+) for ( i=1; i=100; i+) sum=sum+i; sum=sum+i; printf(sum=%dn,sum); printf(sum=%dn,sum); 可部分或全部省略,可部分或全部省略,可部分或全部省略,可部分或全部省略,但但但但“ “; ;” ”不可省略不可省略不可省略不可省略例例4.14 用用for循环语句,实现求循环语句,实现求sum的值,其中的值,其中sum=1+2+3+100的和。的和。for (for (表达式表达式表达式表达式1;1;表达式表达式表达式表达式2;2;表达表达表达表达式式式式3) 3) 循环体循环体循环体循环体 2024/7/30例如:例如:(1)缺省表达式)缺省表达式1i=1;for(;i100) /* i100退出循退出循环 */ break; /*该break语句用于退出循句用于退出循环体体 */ else sum=sum+i; 2024/7/30(3)缺省表达式)缺省表达式1和表达式和表达式3 i=1; for( ;i=100 ; ) sum=sum+i; i+; 等价于等价于 i=1; while(i100) break; 2024/7/30说明:说明:l l所有用所有用 while 语句语句实现的循环都可以用实现的循环都可以用for 语句语句实现。实现。 等价于:等价于:for(表达式表达式1;表达式表达式2 ;表达式表达式3) 语句;语句;表达式表达式1;while (表达式表达式2) 语句;语句; 表达式表达式3; 2024/7/30#include #include void main()void main() long binary; /* long binary; /*用于存放二用于存放二用于存放二用于存放二进进制数制数制数制数* */ / int sum=0,temp; int sum=0,temp; int n=0; /* int n=0; /*权值权值n */n */ printf( printf(请输请输入一个二入一个二入一个二入一个二进进制整数制整数制整数制整数:);:); scanf(%ld,&binary); scanf(%ld,&binary); for( ;binary!=0; binary=binary/10) for( ;binary!=0; binary=binary/10) temp=binary%10;temp=binary%10; sum=sum+temp*(int)pow(2,n); /* sum=sum+temp*(int)pow(2,n); /*函数函数函数函数powpow(2,n2,n) n+; n+; 用于求用于求用于求用于求2 2的的的的n n次方次方次方次方* */ / printf(printf(转换为转换为十十十十进进制数是制数是制数是制数是:%d,sum); :%d,sum); 例例4.15 将一个二进制整数转换为十进制数。将一个二进制整数转换为十进制数。2024/7/304.5.5 continue语句和语句和break语句语句1 1continuecontinue语语句句句句continuecontinue语语句只能用在循句只能用在循句只能用在循句只能用在循环结环结构中,其作用是构中,其作用是构中,其作用是构中,其作用是跳跳跳跳过过循循循循环环体内尚未体内尚未体内尚未体内尚未执执行的部分行的部分行的部分行的部分(即跳(即跳(即跳(即跳过过循循循循环环体中体中体中体中continuecontinue语语句后面的程序段),句后面的程序段),句后面的程序段),句后面的程序段),进进入下一次的入下一次的入下一次的入下一次的循循循循环环条件判断条件判断条件判断条件判断。例如以下的循。例如以下的循。例如以下的循。例如以下的循环结环结构:构:构:构: whilewhile(条件(条件(条件(条件1 1) 语语句段句段句段句段1 1 if if(条件(条件(条件(条件2 2) continuecontinue; 语语句段句段句段句段2 2 2024/7/30例如:例如: int x,n=0,s=0; int x,n=0,s=0;while (n10) scanf(%d,&x); if(x0) continue; s+=x; n+; ; int x,n=0,s=0; int x,n=0,s=0;dodo scanf(%d,&x); scanf(%d,&x); if (x0) continue;if (x0) continue; s+=x; n+;s+=x; n+; while (n10); while (n10); for (n=0,s=0; n10; n+) for (n=0,s=0; n10; n+) scanf(%d,&x); scanf(%d,&x); if (x0) continue;if (x0) continue; s+=x; s+=x; 2024/7/30例例4.16 输出输出1-100之间能被之间能被7整除的所有整数。整除的所有整数。 void main()void main() int i; int i; printf(1-100 printf(1-100之间能被之间能被之间能被之间能被7 7整除的数是:整除的数是:整除的数是:整除的数是:n);n); for(i=1;i=100;i+) for(i=1;i=100;i+) if(i%7!=0) if(i%7!=0) continue;continue; printf(%d ,i);printf(%d ,i); 运行结果如下:运行结果如下:1-100之间能被之间能被7整除的数是:整除的数是:7 14 21 28 35 42 49 56 63 70 77 84 91 98 2024/7/302 2breakbreak语语句句句句l l功能:功能: 利用利用break语句能够语句能够强迫终止本层循环强迫终止本层循环,转,转到后续语句执行。到后续语句执行。 例如以下的循例如以下的循环结构:构: whilewhile(条件(条件(条件(条件1 1) 语语句段句段句段句段1 1 if if(条件(条件(条件(条件2 2) breakbreak; 语语句段句段句段句段2 2 2024/7/30例如:例如: int x,n=0,s=0; int x,n=0,s=0;while (n10) scanf(%d,&x); if (x0) break; s+=x; n+; ; int x,n=0,s=0; int x,n=0,s=0;dodo scanf(%d,&x); scanf(%d,&x); if (x0) break;if (x0) break; s+=x; n+; s+=x; n+; while (n10); while (n10); for (n=0,s=0; n10; n+ ) for (n=0,s=0; n10; n+ ) scanf(%d,&x); scanf(%d,&x); if (x0) break;if (x0) break; s+=x; s+=x; 2024/7/30例例4.17 在在100和和200之间找出能同时被之间找出能同时被6和和9整整除的最小数。除的最小数。void main()void main() int i; int i; for(i=100;i=200 ;i+) for(i=100;i=200 ;i+) if(i%6=0&i%9=0) if(i%6=0&i%9=0) break; break; printf( printf(在在在在100-200100-200之间能同时被之间能同时被之间能同时被之间能同时被6 6和和和和9 9整除的最小整除的最小整除的最小整除的最小数是:数是:数是:数是:%d,i);%d,i); 运行结果如下:运行结果如下:在在100-200之间能同时被之间能同时被6和和9整除的最小数整除的最小数是:是:1082024/7/30例例4.18 将上例改为:输出能同时被将上例改为:输出能同时被6和和9整除的整除的最小正整数。最小正整数。void main()void main() int i; int i; for(i=1; ;i+) for(i=1; ;i+) if(i%6=0&i%9=0) if(i%6=0&i%9=0) break;break; printf( printf(能同时被能同时被能同时被能同时被6 6和和和和9 9整除的最小正整数是:整除的最小正整数是:整除的最小正整数是:整除的最小正整数是:%d,i);%d,i); 运行结果如下:运行结果如下:能同时被能同时被6和和9整除的最小正整数是:整除的最小正整数是:182024/7/30在使用在使用break语句和句和continue语句句时,需注意以,需注意以下三点:下三点:(1)break不能用在除不能用在除switch和循和循环结构之外构之外的其他的其他结构中。构中。(2)break只能退出一只能退出一层循循环结构构(这点将在点将在下下节循循环嵌套中学嵌套中学习)。)。(3 3)breakbreak和和continuecontinue的的区区别在在于于:执行行continuecontinue语句句,跳跳过循循环体体中中居居于于其其后后的的语句句,继续循循环条条件件的的判判断断,而而并并未未跳跳出出循循环结构构;执行行breakbreak语句句,则是是跳跳出出循循环,结束本束本层循循环结构。构。2024/7/304.5.6 循环的嵌套循环的嵌套l l如果循环语句的循环体内又包含了另一条如果循环语句的循环体内又包含了另一条循环语句,则称为循环的嵌套循环语句,则称为循环的嵌套l l例如:例如: main( ) int i, j; for ( i=1; i10; i+ ) for ( j=1; j=3; j+ ) printf (“ %dn”,i*j); 外循环语句外循环语句内循环语句内循环语句2024/7/30循环的嵌套循环的嵌套同同同同类类型的循型的循型的循型的循环语环语句可以相互嵌套,不同句可以相互嵌套,不同句可以相互嵌套,不同句可以相互嵌套,不同类类型型型型的循的循的循的循环语环语句也可以相互嵌套。句也可以相互嵌套。句也可以相互嵌套。句也可以相互嵌套。诸诸如以下嵌套形式是合法的。如以下嵌套形式是合法的。如以下嵌套形式是合法的。如以下嵌套形式是合法的。(1)while(1)while(条件(条件(条件(条件1 1) while( while( 条件条件条件条件2)2) (2 2)while(while(条件条件条件条件1)1) do do while( while(条件条件条件条件2);2); 2024/7/30(3 3)forfor( 表达式表达式表达式表达式1;1;表达式表达式表达式表达式2; 2; 表达式表达式表达式表达式3 3 ) while( while( 条件条件条件条件2)2) 2024/7/30使用循环嵌套时,要注意嵌套的层次性,内嵌使用循环嵌套时,要注意嵌套的层次性,内嵌循环要完整的包含在外层循环体内,循环要完整的包含在外层循环体内,不可与外不可与外层循环出现交叉现象层循环出现交叉现象,例如以下形式是,例如以下形式是错误错误的。的。(1)for( ; ; ) do while( );(2) do while() while();while();2024/7/30例例4.19 打印如下图形。打印如下图形。 * * * * * * * * * * * * * * * * * * * * *程序设计如下:程序设计如下:void main() int i,j; for(i=1;i=4;i+) for(j=1;j=6;j+) printf(* ); printf(n); 2024/7/30例例4.20 找出找出3-100的全部素数。的全部素数。void main()void main() int i,n; int i,n; printf(3-100 printf(3-100之间的素数:之间的素数:之间的素数:之间的素数:n);n); for(n=3;n=100;n+) for(n=3;n=100;n+) for(i=2;i=n;i+) for(i=2;i0, 方程有两不同实根方程有两不同实根b2-4ac0)if(delta0) x1=(-b+sqrt(delta)/(2*a); x1=(-b+sqrt(delta)/(2*a); x2=(-b-sqrt(delta)/(2*a); x2=(-b-sqrt(delta)/(2*a); printf(printf( %f,%fn%f,%fn ,x1,x2);,x1,x2); else if(delta=0)else if(delta=0) x1=x2=-b/(2*a); x1=x2=-b/(2*a); printf( printf( x1=x2=%fnx1=x2=%fn ,x1);,x1); elseelse r=-b/(2*a); r=-b/(2*a); i=sqrt(-delta)/(2*a); i=sqrt(-delta)/(2*a); printf(%f+%finprintf(%f+%fin ,r,i);,r,i);printf(printf( %f-%fin%f-%fin ,r,i);,r,i); 2024/7/30例例 4.22 打印出打印出1001000之间的所有之间的所有“水仙花数水仙花数”。运行结果:运行结果:运行结果:运行结果:the water flowers number the water flowers number is:153 370 371 407is:153 370 371 407水仙花数是指一个三位整数,其各个位数水仙花数是指一个三位整数,其各个位数的立方之和等于该数本身。如:的立方之和等于该数本身。如:153=13+53+33.void main()void main() int i,j,k,num; int i,j,k,num; printf(the water flowers number is:); printf(the water flowers number is:); for(num=100;num1000;num+) for(num=100;num1000;num+) i=num%10; /* i=num%10; /*分解出个位分解出个位分解出个位分解出个位* */ / j=num/10%10; /* j=num/10%10; /*分解出十位分解出十位分解出十位分解出十位* */ / k=num/100; /* k=num/100; /*分解出百位分解出百位分解出百位分解出百位* */ / if(num=i*i*i+j*j*j+k*k*k) if(num=i*i*i+j*j*j+k*k*k) printf(%-5d,num); printf(%-5d,num); 2024/7/30例例例例4.234.234.234.23兔子问题。有一对兔子,从出生后的第兔子问题。有一对兔子,从出生后的第兔子问题。有一对兔子,从出生后的第兔子问题。有一对兔子,从出生后的第3 3 3 3个个个个月起,每个月都生一对兔子。小兔子长到第月起,每个月都生一对兔子。小兔子长到第月起,每个月都生一对兔子。小兔子长到第月起,每个月都生一对兔子。小兔子长到第3 3 3 3个月个月个月个月时,每个月又生一对兔子。假设兔子不死,那么每时,每个月又生一对兔子。假设兔子不死,那么每时,每个月又生一对兔子。假设兔子不死,那么每时,每个月又生一对兔子。假设兔子不死,那么每个月(求前个月(求前个月(求前个月(求前12121212个月)兔子的总数是多少?个月)兔子的总数是多少?个月)兔子的总数是多少?个月)兔子的总数是多少?月份月份234562024/7/30void main()void main() long int f1,f2; long int f1,f2; int n; int n; f1=f2=1; f1=f2=1; for(n=1;n=12;n+) for(n=1;n=12;n+) printf(%8ld%8ld,f1,f2); printf(%8ld%8ld,f1,f2); if(n%2=0) if(n%2=0) printf(n); printf(n); f1=f1+f2; f1=f1+f2; f2=f2+f1; f2=f2+f1; 程序运行结果:程序运行结果:程序运行结果:程序运行结果: 1 1 2 3 1 1 2 3 5 6 13 21 5 6 13 21 34 55 89 144 34 55 89 144 233 377 610 987 233 377 610 987 1597 2584 4181 6765 1597 2584 4181 6765 10946 17711 28657 46360 10946 17711 28657 463602024/7/30例例4.24 输出九九乘法表。输出九九乘法表。void main() int i,j; for(i=1;i=9;i+) for(j=1;j=i;j+) printf(%d*%d=%-4d,j,i,i*j); printf(n); 程序一:程序一:2024/7/30程序运行结果如下:程序运行结果如下:程序运行结果如下:程序运行结果如下:1*1=1 1*1=1 1*2=2 2*2=4 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81 2024/7/30void main()void main() int i,j; int i,j; for(i=1;i=9;i+) for(i=1;i=9;i+) j=1; j=1; do printf(%d*%d=%-4d,j,i,i*j); do printf(%d*%d=%-4d,j,i,i*j); j+ j+; whilewhile(j=ij=i) printf(n);printf(n); 程序二:程序二:2024/7/30本章小结本章小结l l本章节主要介绍了本章节主要介绍了本章节主要介绍了本章节主要介绍了C C语言中的语句以及三种程序控语言中的语句以及三种程序控语言中的语句以及三种程序控语言中的语句以及三种程序控制结构,主要针对选择结构和循环结构的相关控制结构,主要针对选择结构和循环结构的相关控制结构,主要针对选择结构和循环结构的相关控制结构,主要针对选择结构和循环结构的相关控制语句进行了讲解。制语句进行了讲解。制语句进行了讲解。制语句进行了讲解。l l顺序结构按照命令从前到后的顺序逐条执行,它顺序结构按照命令从前到后的顺序逐条执行,它顺序结构按照命令从前到后的顺序逐条执行,它顺序结构按照命令从前到后的顺序逐条执行,它是是是是C C语言中使用最普遍的一种基本程序结构。语言中使用最普遍的一种基本程序结构。语言中使用最普遍的一种基本程序结构。语言中使用最普遍的一种基本程序结构。l l选择控制结构根据条件表达式的判断结果,决定选择控制结构根据条件表达式的判断结果,决定选择控制结构根据条件表达式的判断结果,决定选择控制结构根据条件表达式的判断结果,决定执行后面若干条语句中的哪一条语句。要求熟练执行后面若干条语句中的哪一条语句。要求熟练执行后面若干条语句中的哪一条语句。要求熟练执行后面若干条语句中的哪一条语句。要求熟练掌握掌握掌握掌握if if语句的使用,熟悉语句的使用,熟悉语句的使用,熟悉语句的使用,熟悉if if语句嵌套结构。若程序语句嵌套结构。若程序语句嵌套结构。若程序语句嵌套结构。若程序中同时出现多条中同时出现多条中同时出现多条中同时出现多条if if语句,但出现部分语句,但出现部分语句,但出现部分语句,但出现部分if if语句的语句的语句的语句的elseelse分支缺省的情况,要特别注意分支缺省的情况,要特别注意分支缺省的情况,要特别注意分支缺省的情况,要特别注意if if和和和和elseelse的配对关系,的配对关系,的配对关系,的配对关系,避免出现逻辑错误和嵌套混乱的情况。对于多路避免出现逻辑错误和嵌套混乱的情况。对于多路避免出现逻辑错误和嵌套混乱的情况。对于多路避免出现逻辑错误和嵌套混乱的情况。对于多路分支分支分支分支switchswitch语句,首先要注意其条件表达式的类语句,首先要注意其条件表达式的类语句,首先要注意其条件表达式的类语句,首先要注意其条件表达式的类型限制,即只允许整型、字符型和枚举类型;其型限制,即只允许整型、字符型和枚举类型;其型限制,即只允许整型、字符型和枚举类型;其型限制,即只允许整型、字符型和枚举类型;其次,要掌握其分支的特点;最后,注意在次,要掌握其分支的特点;最后,注意在次,要掌握其分支的特点;最后,注意在次,要掌握其分支的特点;最后,注意在casecase子子子子句中是否出现句中是否出现句中是否出现句中是否出现breakbreak语句程序的执行情况。语句程序的执行情况。语句程序的执行情况。语句程序的执行情况。2024/7/30本章小结本章小结(续续)l l循环控制结构是所有实用程序不可或缺的,循环控制结构是所有实用程序不可或缺的,在在C语言中主要有语言中主要有while型循环、型循环、dowhile型循环、型循环、for型循环以及使用型循环以及使用goto语句实现循语句实现循环控制。环控制。while型循环是先判断条件表达式,型循环是先判断条件表达式,再决定是否执行循环体,而再决定是否执行循环体,而dowhile型循型循环先执行一次循环体,然后判断条件表达式,环先执行一次循环体,然后判断条件表达式,以决定是否再次执行循环体。在许多场合,以决定是否再次执行循环体。在许多场合,它们之间可以相互替代,但要两者之间存在它们之间可以相互替代,但要两者之间存在的不同之处。的不同之处。for型循环将关于循环控制的三型循环将关于循环控制的三个环节集中于个环节集中于for语句的开头,是最紧凑的循语句的开头,是最紧凑的循环形式。在设计程序时,可根据所遇问题的环形式。在设计程序时,可根据所遇问题的情况结合三种循环语句的特点来选择使用哪情况结合三种循环语句的特点来选择使用哪一种循环语句。除此之外,还要学会这三种一种循环语句。除此之外,还要学会这三种语句的嵌套使用。语句的嵌套使用。2024/7/30本章小结本章小结(续续)l lcontinuecontinue语句和语句和语句和语句和breakbreak语句分别对循环控制产生了语句分别对循环控制产生了语句分别对循环控制产生了语句分别对循环控制产生了不同的影响。其中不同的影响。其中不同的影响。其中不同的影响。其中continuecontinue语句是起到提前结束语句是起到提前结束语句是起到提前结束语句是起到提前结束本次循环,接着下一次循环条件判断的作用,而本次循环,接着下一次循环条件判断的作用,而本次循环,接着下一次循环条件判断的作用,而本次循环,接着下一次循环条件判断的作用,而breakbreak语句是结束循环,跳出循环体的作用。在程语句是结束循环,跳出循环体的作用。在程语句是结束循环,跳出循环体的作用。在程语句是结束循环,跳出循环体的作用。在程序中要注意两者的使用时机。序中要注意两者的使用时机。序中要注意两者的使用时机。序中要注意两者的使用时机。l l总之,在本章中大家首先要掌握选择结构和循环总之,在本章中大家首先要掌握选择结构和循环总之,在本章中大家首先要掌握选择结构和循环总之,在本章中大家首先要掌握选择结构和循环结构的控制机制、功能和格式,比较相互之间的结构的控制机制、功能和格式,比较相互之间的结构的控制机制、功能和格式,比较相互之间的结构的控制机制、功能和格式,比较相互之间的异同,避免出现逻辑和语义上的错误,学会不用异同,避免出现逻辑和语义上的错误,学会不用异同,避免出现逻辑和语义上的错误,学会不用异同,避免出现逻辑和语义上的错误,学会不用语句的适用情况。在编写程序特别是使用嵌套时,语句的适用情况。在编写程序特别是使用嵌套时,语句的适用情况。在编写程序特别是使用嵌套时,语句的适用情况。在编写程序特别是使用嵌套时,书写形式应采用书写形式应采用书写形式应采用书写形式应采用“ “分层递进分层递进分层递进分层递进” ”的格式,养成良好的格式,养成良好的格式,养成良好的格式,养成良好的编程习惯,保证程序代码的正确性,同时做到的编程习惯,保证程序代码的正确性,同时做到的编程习惯,保证程序代码的正确性,同时做到的编程习惯,保证程序代码的正确性,同时做到层次分明,增强程序的可读性。层次分明,增强程序的可读性。层次分明,增强程序的可读性。层次分明,增强程序的可读性。2024/7/30
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号