资源描述:
《C语言程序设计教程第5章ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
第五章循环结构5.1while语句5.2do-while语句5.3for语句5.4break、continue和goto语句5.5循环的嵌套5.6复合结构程序举例C语言程序设计教程9/3/20211 C语言有while、do-while、和for语句三种循环结构语句。前两个称为条件循环,即根据条件来决定是否继续循环;后一个称为计数循环,即根据设定的执行次数来执行循环。9/3/20212 5.1while语句while语句是通过判断循环控制条件是否满足来决定是否继续循环的语句。一般形式:while(表达式)语句表达式为循环控制条件,当表达式的值为非零(满足循环条件),就执行语句,当表达式的值为零,就退出循环。9/3/20213 while语句执行流程表达式语句真假表达式首先计算表达式语句如果表达式的值为非零,执行语句表达式重新计算表达式如果表达式的值为0,则跳出循环如果表达式的值一开始就为0,则语句一次也会被不执行。9/3/20214 while语句举例问题:求n个学生的平均成绩算法:1输入n;i=1,average=0;2输入第i个学生的score;3average+=score;i++;4当i<=n重复做2;5average/=n;9/3/20215 main(){intn,score,i=1;floataverage=0;printf(“ Entern:”);scanf(“%d”,&n);while(i<=n){printf(“ Enterscore:”);scanf(“%d”,&score);average+=score;i++;}average/=n;printf(“ average=%f”,average);}9/3/20216 5.2do—while语句do—while语句的一般形式是:do{语句}while(表达式)特点:首先执行语句,再通过判断循环控制条件是否满足来决定是否继续循环。9/3/20217 do—while语句执行流程首先计算语句,再计算表达式。如果表达式的值为非零,继续下一次循环如果表达式的值为0,则跳出循环如果表达式的值一开始就为0,也会执行一次语句。语句表达式9/3/20218 main(){intn,score,i=0;floataverage=0;do{printf(“ Enterscore:”);scanf(“%d”,&score);average+=score;i++;}while(score>=0);average/=--i;printf(“ average=%f”,average);}9/3/20219 注意:循环控制变量值在循环体内必须有所改变。例如:i=1;while(i<=100)putchar(‘*’);i++;这个循环永远不会结束,因为循环控制变量i没有在循环体内被改变,i++;不属于循环语句。i++应该在循环体内改变:i=1;while(i<=100){putchar(‘*’);i++;}9/3/202110 5.3for循环语句for(表达式1;表达式2;表达式3)循环体语句这是C语言最有特点的循环语句。使用最为灵活方便一般形式:9/3/202111 先计算初值表达式,用于循环开始前设置变量初值。接着计算循环控制逻辑表达式,控制循环条件,决定循环次数。执行循环体语句,这个语句也可以是其它循环。循环控制变量,修改表达式。表达式1表达式2循环体表达式3执行流程9/3/202112 例:求1+2+…+99#include(stdio.h)main(){inti,s=0;/*s清0*/for(i=1;i<100;i++)s=s+i;printf(“s=%d”,i;)}i=0i<100s=s+ii++9/3/202113 循环语句的多种表示for(i=0;i<100;i++)s=s+i;main(){inti=1,s=0;dos=s+i;while(++i<100)printf(“s=%d”,i);}i=0i<100s=s+ii++main(){inti,s=0;i=0;while(i<100){s=s+i;i++;}printf(“s=%d”,i);}9/3/202114 for语句的表达式可以省略如已先给变量赋过值。则可以省略表达式1。for(;i<100;i++)如果想在循环内部改变变量的值,则可以省略表达式3。for(i=0;i<100;)如果都省略的话就相当于while。for(;i<100;)while(i<100)全部省略就是死循环。for(;;)(需要用break跳出)9/3/202115 逗号表达式逗号运算符的主要应用就在for语句中。for语句中的表达式1和表达式3可以是逗号表达式,特别是有两个循环变量参与对循环的控制时。表达式1和表达式3为逗号表达式,将使程序显得非常清晰。例:for(i=1,j=10;i<=j;i++,j--)9/3/202116 for(i=a,j=b;i<=j;i++,j--)举例问题:求1/100+2/99+…+1floats=0.0;for(i=1,j=100;i<=j;i++,j--)s=s+i/j;9/3/202117 循环语句流程图表达式语句真假语句表达式表达式1表达式2循环体表达式3while循环do—while循环for循环9/3/202118 循环语句流程图的统一格式。循环上限循环下限循环体9/3/202119 5.4break、continue、goto语句这一类语句的功能是改变程序的结构,使程序从其所在的位置转向另一处。这类语句是非结构化语句9/3/202120 非结构化语句之break它的作用是把流程转向所在结构之后。在switch分支结构中,使用break语句可以使流程跳出switch分支结构。同样的,在循环结构中,使用break语句使流程跳出当前的循环层,转向执行该循环结构后面的语句。简单的说就是跳出当前所在的结构main(){ints=0,i=1:for(;;){s=s+i;i++;if(i>100)break;/*如果i>100,则退出循环*/}printf(“s=%d”,s);}本程序中,当i>100时,强行终止for循环,继续执行for语句下一条语句9/3/202121 非结构化语句之continuecontinue语句被称为继续语句。执行continue语句,使本次循环提前结束,即跳过循环体中continrue语句下面的尚未执行的循环体语句,但不结束整个循环,继续进行下一次循环的条件判别,条件为真,继续进行执行循环语句。该语句形式为:continue;9/3/202122 例5.4显示输入的字符,如果按的是Esc键,则退出循环;如果按的是Enter键,则不做任何处理,继续输入下一个字符。#include“conio.h”main(){charch;for(;;){ch=getch();/*字符输入函数*/if(ch==27)/*Esc键的ACSII码为27*/break;/*退出循环*/if(ch==13)continue;/*按的是Enter:键,跳过字符输出语句*/putch(ch);/*显示输入的字符*/}getch();/*让程序停一下,拍任意键继续*/}9/3/202123 非结构化语句之gotogoto被称为无条件转移语句。由两部分组成goto标号;和标号:语句它最大的好处就是可以一下子跳出多重循环,而break却不能做到这点。9/3/202124 #include“stdio.h”main(){floatscore,average=0;intn=0;scanf(“%f”,&score);/*输入第一个学生的分数*/if(score<0)gotoend;/*表达式为非0,转移到end标号处*/loop:average+=score;n++;scanf(“%f”,&score);if(score>=0)/*表达式为非0,转移到loop标号处*/gotoloop;average=average/n;/*求平均成绩average*/end:printf(“%6.2f”,average);/*输出平均成绩,保留两位小数*/}9/3/202125 5.5循环的嵌套在循环体语句中又有另一个完整的循环结构的形式,称为循环的嵌套。嵌套在循环体内的循环称语句称为内循环,外面的循环语句称为外循环。如果内循环体中又有嵌套的循环语句,称为多层循环。While、do-while、for三种循环都可以互相嵌套。循环嵌套的程序中,要求内循环必须被包含在外层循环的循环体中,不允许出现内外层循环体交叉的情况。9/3/202126 000102030405101112131415202122232425303132333435404142434445505152535455输出结果:执行语句段:for(i=0;i<6;i++){for(j=0;j<6;j++)printf(“%3d%3d”,i,j);putchar(‘ ’);}9/3/202127 循环嵌套举例问题:输出图形*********************9/3/202128 分析:一共6行,每行的‘*’数目与行号相同算法:行用i表示,当i<=6do{输出i个‘*’换行}inti,j;for(i=1;i<7;i++){printf(" ");for(j=1;j<=i;j++)putchar('*');}9/3/202129 循环嵌套举例问题:输出图形****************9/3/202130 循环嵌套分析:一共4行,第i行输出的空格数为:(7-i+1)/2第i行输出i*2-1个‘*’,算法:当i<=7do{输出(7-i+1)/2个空格;输出i个‘*’换行;i+=2;}9/3/202131 main(){inti,j;for(i=1;i<=7;i+=2){printf(“ ”);for(j=1;j<=(7-i+1)/2;j++)putchar(‘’);/*输出(7-i+1)/2个空格*/for(j=1;j<=i;j++)putchar(’*’);/*输出i个‘*’*/}getch();}9/3/202132 复合程序结构C语言允许循环语句与分支结构语句联用,即在循环体包含一个完整的分支结构,这样的程序结构被称为复合程序结构。复合程序结构同样必须做到嵌套层次清楚,决不允许出现嵌套层次之间相互交叉的情况。9/3/202133 例:给多个学生的成绩评级。#include#includemain(){inti,score;scanf("%d",&score);while(score>=0){switch(score/10){case10:case9:printf("%d:A ",score);break;case8:case7:printf("%d:B ",score);break;case6:printf("%d:C ",score);break;default:printf("%d:D ",score);}scanf(“%d”,&score);/*输入下一个学生的成绩*/}}while结构中嵌套了一个多分支选择结构。9/3/202134 5.6复合程序结构举例例1目标:输入一个年号,判断是否为闰年。算法:能被4整除且不是100的倍数,或者能被400整除。9/3/202135 9/3/202136 #includevoidmain(){intyear,leap;printf(“Enteryear:”);scanf(“%d”,&year);if(year%400==0)leap=1;/*是闰年leap置成1*/else{if(year%4==0&&year%100!=0)leap=1;elseleap=0;/*不是闰年leap置成0*/}if(leap==1)printf(“%d:isaleapyear.”,year);elseprintf(“%disnotaleapyear”,year);}9/3/202137 例2目标:找出3至1000内的全部的质数。算法:从i=1开始做分别用2,3,4,…i-1除i,如果i被某个数整除,i是素数。i++;测试下一个i;9/3/202138 #includemain(){inti,j,count,flag;/*用flag作标志*/count=0;for(i=3;i<=1000;i++){flag=0;/*设标志为0*/for(j=2;j<=sqrt(i);j++){if(i%j==0)/*用j测试i*/flag=1;/*不是素数,设标志为1*/}/*i测试完毕*/if(flag==0)/*i是素数*/{printf(“%4d,”,i);count++;if(count%8==0)printf(“ ”);/*每输出8个素数就换行*/}}/*测试下一个i*/}9/3/202139