您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 第05章 循环结构程序设计
2020/1/241第五章循环结构5.1while语句5.2do-while语句5.3for语句5.4break、continue和goto语句5.5循环的嵌套5.6复合结构程序举例22020/1/24C语言有while、do-while、和for语句三种循环结构语句。前两个称为条件循环,即根据条件来决定是否继续循环;后一个称为计数循环,即根据设定的执行次数来执行循环。在许多问题中需要用到循环控制。例如,要输入全校学生成绩;求若干个数之和;迭代求根等。几乎所有实用的程序都包含循环。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。因此熟练掌握选择结构和循环结构的概念及使用是程序设计的最基本的要求。32020/1/245.1while语句1.While语句的一般形式while(表达式)语句首先计算表达式,当表达式为非0时,执行while语句中的内嵌语句;然后重新计算表达式,如果表达式的值为0,则跳出循环。2.while语句的执行流程表达式语句非00注意:如果表达式的值一开始就为0,则语句一次也会被不执行。42020/1/24特点:先判断表达式,后执行循环体说明:循环体有可能一次也不执行循环体可为任意类型语句下列情况,退出while循环条件表达式不成立(为零)循环体内遇break,return,goto无限循环:while(1)循环体;52020/1/24while语句举例例1:求∑n100n=1main(){inti,sum=0;i=1;while(i=100){sum=sum+i;i++;}printf(“%d”,sum);}62020/1/24例2:显示1~10的平方#includestdio.hmain(){inti=1;while(i=10){printf(%d*%d=%d\n,i,i,i*i);i++;}}运行结果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=10072020/1/24注意:(1)循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现。如果不加花括弧,则while语句的范围只到while后面第一个分号处。(2)在循环体中应有使循环趋向于结束的语句。如果无此语句,则i的值始终不改变,循环永不结束。82020/1/245.2do—while语句1.do-while语句的一般形式为:do循环体语句while(表达式);2.do-while语句的执行流程当表达式值为真循环体语句(b)循环体语句表达式(a)TF92020/1/24do—while语句执行过程首先执行语句,再计算表达式。如果表达式的值为非零,继续下一次循环,如果表达式的值为0,则跳出循环。如果表达式的值一开始就为0,也会执行一次语句。102020/1/24例用do~while循环求#includestdio.hmain(){inti,sum=0;i=1;do{sum+=i;i++;}while(i=100);printf(%d,sum);}112020/1/24例while和do~while比较#includestdio.hmain(){inti,sum=0;scanf(%d,&i);do{sum+=i;i++;}while(i=10);printf(%d,sum);}#includestdio.hmain(){inti,sum=0;scanf(%d,&i);while(i=10){sum+=i;i++;}printf(%d,sum);}思考:这两个程序完全一样吗?122020/1/24结论:当while后面的表达式的第一次的值为“真”时,两种循环得到的结果相同,否则两者结果不相同(指两者具有相同的循环体的情况)。132020/1/24例如:i=1;while(i=100)putchar(‘*’);i++;思考:这个程序段有如何的运行结果?142020/1/24注意:循环控制变量值在循环体内必须有所改变。例如:i=1;while(i=100)putchar(‘*’);i++;这个循环永远不会结束,因为循环控制变量i没有在循环体内被改变,i++;不属于循环语句。i++应该在循环体内改变:i=1;while(i=100){putchar(‘*’);i++;}152020/1/24举例:#includestdio.hmain(){floatscore,average=0;intn=0;do{scanf(“%f”,&score);if(score=0){average+=score;n++;}}while(score=0);if(n!=0)average=average/n;printf(“%6.2f”,average);}思考:该程序是什么功能?162020/1/24for循环语句是C语言中功能最强的循环语句,它有多个变化形式,并且可以很方便的代替其它的循环语句。5.3for语句for语句的一般形式for(表达式1;表达式2;表达式3)循环体语句172020/1/24①先计算初值表达式1,它主要用于循环开始前设置变量初值;②接着计算循环控制逻辑表达式2,它控制循环条件,决定循环次数;③如果表达式2为真,则执行循环体语句,否则结束for循环;④求解表达式3,它主要是对循环控制变量进行修改。⑤转步骤②执行。求表达式1表达式2语句求表达式3for语句的下一语句真假for执行流程182020/1/24求1+2+…+99#include(stdio.h)main(){inti,s=0;/*s清0*/for(i=1;i100;i++)s=s+i;printf(“s=%d”,i;)}i=0i100s=s+ii++例:192020/1/24for语句说明(1)for语句的一般形式中的“表达式1”可以省略,注意省略表达式1时,其后的分号不能省略。如for(;i=100;i++)sum=sum+i;执行时,跳过“求解表达式1”这一步,其他不变。(2)如果表达式2省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式2始终为真。例如:for(i=1;;i++)sum=sum+i;它相当于:i=1;while(1){sum=sum+1;i++;}202020/1/24for语句说明2(3)表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。如:for(i=l;i=100;){sum=sum+l;i++;}(4)可以省略表达式1和表达式3,只有表达式2,即只给循环条件。如:for(;i=100)while(i=100){sum=sum+l;相当于{sum=sum+l;i++;}i++;}212020/1/24for语句说明3(5)3个表达式都可省略,如:for(;;)语句相当于while(1)语句即不设初值,不判断条件(认为表达式2为真值),循环变量不增值。无终止地执行循环体。(6)表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式。如:for(sum=0;i=100;i++)sum=sum+i;表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。如:for(sum=0,i=1;i=100;i++)sum=sum+i;或for(i=0,j=100;i=j;i++,j--)k=i+j;222020/1/24for语句说明4(7)表达式2一般是关系表达式(如i<=100)或逻辑表达式(如a<b&&x<y),但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体。分析下面两个例子:②for(;(c=getchar())!=‘\n’;)printf(“%c”,c);①for(i=0;(c=getchar())!=‘\n’;i+=c);此for语句的执行过程见图,它的作用是不断输入字符,将它们的ASCII码相加,直到输入一个“换行”符为止。i=0取一个字符=cC≠换行符i=i+cTF232020/1/24例:#includestdio.hmain(){inti=0;for(i=0;i10;i++)putchar(‘a’+i);}运行结果:abcdefghij例:#includestdio.hmain(){inti=0;for(;i10;i++)putchar(‘a’+i);}242020/1/24运行结果:abcdefghij例:#includestdio.hmain(){inti=0;for(;i10;)putchar(‘a’+(i++));}例:#includestdio.hmain(){inti=0;for(;i10;putchar(‘a’+i),i++);}252020/1/24举例问题:求s=1/99+2/98+…+1#includestdio.hmain(){inti,j;floats=0.0;for(i=1,j=99;i=j;i++,j--)s=s+i/j;printf(“s=1/99+2/98+…+1=%f”,s);}思考:上面程序的运行结果是多少?262020/1/24举例问题:求s=1/99+2/98+…+1#includestdio.hmain(){inti,j;floats=0.0;for(i=1,j=99;i=j;i++,j--)s=s+i/j;printf(“s=1/99+2/98+…+1=%f”,s);}思考:上面程序的运行结果是多少?程序的运行结果是:s=1/99+2/98+…+1=1.000000272020/1/245.4break、continue、goto语句这一类语句的功能是改变程序的结构,使程序从其所在的位置转向另一处。这类语句是非结构化语句282020/1/24非结构化语句之break它的作用是把流程转向所在结构之后。在switch分支结构中,使用break语句可以使流程跳出switch分支结构。同样的,在循环结构中,使用break语句使流程跳出当前的循环层,转向执行该循环结构后面的语句。简单的说就是跳出当前所在的结构break语句不能用于循环语句和switch语句之外的任何其他语句中。break只能终止并跳出最近一层的结构292020/1/24expr……break;……假(0)真(非0)whiledo……break;…...expr假(0)真(非0)while302020/1/24expr2……break;…...假(0)真(非0)forexpr1expr3switchexpr语句组1break;语句组2break;语句组nbreak;语句组break;…...const1const2constndefaultcase312020/1/24main(){ints=0,i=1:for(;;){s=s+i;i++;if(i100)break;/*如果i100,则退出循环*/}printf(“s=%d”,s);}本程序中,当i100时,强行终止for循环,继续执行for语句下一条语句例如:322020/1/24例break举例:输出圆面积,面积大于100时停止#definePI3.14159main(){intr;floatarea;for(r=1;r=10;r++){area=PI*r*r;if(area100)break;printf(r=%d,area=%.2f\n,r,area);}}332020/1/24例break举例:小写字母转换成大写字母,直至输入非字母字符342020/1/24例break举例:小写字母转换成大写字母,直至输入非字母字符#includestdio.hmain(){inti,j;charc;while(1){c=getchar();if(c='a'&&c='z')putchar(c-'a'+'A');elsebreak;}}352
本文标题:第05章 循环结构程序设计
链接地址:https://www.777doc.com/doc-3275896 .html