您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > 5.2第五章循环结构的程序设计2
第五章循环结构的程序设计本章要点循环语句break和continue语句循环嵌套转移语句转移语句的作用改变程序的运行流程。C语言转移语句breakcontinuegotobreak语句格式break;break语句的功能1.在switch语句中结束case子句,使控制转到switch语句之外。2.在循环语句的循环体中使用,结束循环过程,使控制转移到整个循环语句之外的下一条语句处。结束循环while(exp){语句1if(expb)break;语句2}break语句的执行流程while语句for语句do-while语句表达式?成立不成立执行后续语句break语句序列表达式2?成立不成立执行后续语句执行表达式3执行表达式1break语句序列表达式?成立不成立执行后续语句break语句序列语句序列例判断m是否素数读入mk=mi=2当ikm被i整除真假用break结束循环i=i+1ik+1真假输出:m”是素数”输出:m”不是素数”#includestdio.h#includemath.hmain(){intm,i,k;scanf(%d,&m);k=sqrt(m);for(i=2;i=k;i++)if(m%i==0)break;if(i=k+1)printf(%disaprimenumber\n,m);elseprintf(%disnotaprimenumber\n,m);}结束循环,即转到for循环的下一个语句,通常作为if的内嵌语句break语句使用注意:1、在嵌套循环中,break语句仅能退出一层(当前)循环。2、若在循环语句中包含了switch语句,那么switch语句中的break语句仅能使控制退出switch语句。3、break语句并不是程序设计中必不可少的语句,可以通过改变程序的结构去掉。break与循环for(){.........while(){..........break;..........}.........}例:求555555的约数中最大的三位数是多少?main(){intj;longn;printf(Pleaseinputnumber:);scanf(%ld,&n);/*所求的约数的可能取值是从999到100,j从大到小*/for(j=999;j=100;j--)if(n%j==0)/*若能够整除j,则j是约数*/{printf(”3digitsin%ld=%d\n”,n,j);break;/*控制退出循环*/}}例在3位数中找一个满足下列要求的正整数n:其各位数字的立方和恰好等于它本身,例如:371=33+73+13intmain(){intn,i,j,k;for(n=100;n1000;n++){i=n/100;j=n/10%10;k=n%10;if(n==i*i*i+j*j*j+k*k*k){printf(%d=%d*%d*%d+%d*%d*%d+%d*%d*%d\n,n,i,i,i,j,j,j,k,k,k);break;}}return0;}continue语句格式continue;continue语句的功能continue语句仅能在循环语句中使用.它的作用不是结束循环,而是开始一次新的循环。对于for语句,将控制转到执行表达式3和循环控制条件部分;对于while和do-while语句,将控制转到循环控制条件部分;跳过continue后面的语句,继续下一次循环while(exp){语句1if(expc)continue;语句2}continue语句continue语句的执行流程表达式2?continue成立不成立执行后续语句执行表达式3执行表达式1语句序列表达式?continue成立不成立执行后续语句语句序列表达式?continue成立不成立执行后续语句语句序列例:输入10个整数,求其中正数的个数及平均值,精确到小数点后两位。main(){inti,count=0,j,sum=0;for(i=1;i=10;i++){printf(Inputinteger:);scanf(%d,&j);if(j=0)continue;/*结束本次循环,不进行后续操作*/count++;/*计数器*/sum+=j;/*求累加和*/}if(count)printf(Plusnumer:%d,averagevalue:%.2f,count,1.0*sum/count);elseprintf(Plusnumer:0,averagevalue:0);}break和continue#includestdio.hvoidmain(){charc;inti=0;for(i=0;i10;i++){c=getchar();if(c=='\n')break;putchar(c);}}#includestdio.hvoidmain(){charc;inti=0;for(i=0;i10;i++){c=getchar();if(c=='\n')continue;putchar(c);}}输入:abc↙efgh↙123↙输出:abcefgh1输出:abcgoto语句格式goto标号;goto语句的功能1、将控制转移到标号所指定的语句处继续执行。2、标号的唯一功能就是作为goto语句的目标。标号的作用域是它所在的整个函数。goto语句的使用说明在C语言中,goto语句并不是必不可少的,使用goto语句的地方都可以用C的其它控制流程语句改写。见书P81结构化程序设计方法主张限制使用goto语句,因为goto语句将使程序流程变得混乱,降低程序的可读性。一般来说,goto语句可以有两种用途:1与if语句一起构成循环结构2从循环体内跳转到循环体外。虽然C语言提供的break和continue也具有同样的功能,但是它们只能跳出一层循环,而使用goto语句则可以跳转出多重循环。循环嵌套循环嵌套在一个循环体中,又包含有另一个完整循环语句,构成循环嵌套。while(表达式)语句;循环语句do语句while(表达式);循环语句for(表达式1;表达式2;表达式3)语句;循环语句内嵌的循环中又可以嵌套循环,从而构成多重循环三种循环可以互相嵌套循环嵌套均是大循环嵌小循环绝对不允许循环体交叉!for(){.........do{..........}}while(....)for(){.........do{}while()}外循环内循环交叉循环外循环入口内循环出口内循环出口外循环出口外循环出口内循环入口嵌套的循环控制变量不能相同内循环变化快,外循环变化慢如:for(i=1;i=9;i++){for(j=1;j10;j++)printf(“%d*%d=%d”,i,j,i*j);printf(“\n”);}正确确定循环体例循环嵌套,输出九九表1234567891234567892468101214161836912151821242791827364554637281……………..ij#includestdio.hmain(){inti,j;for(i=1;i10;i++)printf(%4d,i);printf(\n---------------------------------------\n);for(i=1;i10;i++)for(j=1;j10;j++)printf((j==9)?%4d\n:%4d,i*j);}i10printf假(0)真(非0)i=1j++j=1j10真(非0)假(0)i++for(i=1;i10;i++)for(j=1;j10;j++)printf((j==9)?%4d\n:%4d,i*j);外循环内循环例:输出下三角形乘法九九表。123456789---------------------------------------12436948121651015202561218243036714212835424981624324048566491827364554637281假设:行号为i,列号为ji=6j=5i*j(1=i=9)(1=j=i)则:第i行中一共要输出i个乘积#includestdio.hmain(){inti=1,j;/*i:行计数器j:列计数器*/while(i=9)/*控制打印表头*/printf(%4d,i++);printf(\n------------------------------------\n);i=1;while(i=9){j=1;/*列计数器置1*/while(j=i)/*嵌套的二重循环。输出第i行*/{printf(%4d,i*j);j++;/*列计数器+1*/}printf(\n);/*一行输出结束后,输出\n*/i++;/*行计数器+1*/}}外层循环体执行1次,内层循环要完整执行1次内循环终值与外循环变量有关例求1+2+3+4+……+n算法:i=1tons=s+tt++i++程序段:s=0;for(i=1;i=n;i++)s=s+i;算法:i=1tons=s+ii++例T1-2求1+1/2+1/3+……+1/n算法:i=1tons=s+tt=1.0/ii++程序段:s=0;for(i=1;i=n;i++)s=s+1.0/i;算法:i=1tons=s+tt++i++例求1-1/2+1/3-1/4+……1/ni=1tons=s+tt=1.0/ii++程序段:s=0;flag=1;for(i=1;i=n;i++){s=s+1.0/i*flag;flag=-flag;}算法:i=1tont=1.0/i*flags=s+tflag=-flagi++例求1-1/3+1/5-……前n项和算法:i=1tons=s+tt=1.0/i*flagflag=-flagi++程序段:s=0;flag=1;tt=1;for(i=1;i=n;i++){s=s+1.0/tt*flag;tt+=2;flag=-flag;}算法:i=1tont=1.0/tt*flags=s+tflag=-flagtt=tt+2i++例求1-1/3+1/5-…直到最后1项的绝对值10-5程序段:s=0;flag=1;tt=1;t=1;while(fabs(t)=1E-5){s=s+t;flag=-flag;tt+=2;t=1.0/tt*flag;}i=1tons=s+tt=1.0/tt*flagflag=-flagtt=tt+2i++算法:while|t|=1E-5s=s+tflag=-flagtt=tt+2t=1.0/tt*flag例求n!算法:i=1tonf=f*tt++i++程序段:f=1;for(i=1;i=n;i++)f=f*i;算法:i=1tonf=f*ii++例1!+2!+……+n!s=0;for(k=1;k=n;k++){s=s+f;}f=1;/*n!*/for(i=1;i=n;i++)f=f*i;f=1;for(i=1;i=k;i++)f=f*i;算法:k=1tons=s+ff=k!k++例输出Fibonacci序列前20个数1,1,2,3,5,8,……x1x2tx1x2t程序段:x1=x2=1;printf(%d%d,x1,x2);for(i=1;i=18;i++){t=x1+x2;printf(%d,t);x1=x2;x2=t;}x1=x2=1;t=x1+x2;x1=x2;x2=t;例1:在一行中输出m个*号。要求:从键盘输入m值,输出一行m个*号。例:输入m=4,输出的图形如下:****基本语句:输出一个*号:ptintf(”*”);基本算法:1.输入m,2.重复输出m个*;scanf(”%d”,&m);while(m0){printf(”*”);m--;}printf(”\n”);#includestdio.hmain(){intm;scanf(”%d”,&m);while(m0){printf(”*”);m--;}printf(
本文标题:5.2第五章循环结构的程序设计2
链接地址:https://www.777doc.com/doc-4008064 .html