第五章循环结构程序设计5.1while语句5.2do-while语句5.3for语句5.4goto语句以及用goto语句构成的循环5.5break语句和continue语句5.6循环的嵌套5.7循环结构程序设计举例第五章目录在C语言中可以用以下语句来实现循环:1.用goto语句和if语句构成循环;2.用while语句;3.用do--while语句;4.用for语句。第五章循环结构程序设计循环:就是在给定的条件成立时反复执行某一程序段,被反复执行的程序段称为循环体。5.1while语句真(非零)表达式循环体假(零)第五章5.1while语句1、while语句的形式:while(表达式)循环体;2、while语句常称为“当型”循环语句。3、说明:先判断表达式,后执行语句。表达式同if语句后的表达式一样,可以是任何类型的表达式。循环体多于一句时,用一对{}括起。while循环结构常用于循环次数不固定,根据是否满足某个条件决定循环与否的情况。第五章5.1while语句例:分析下列程序段的循环次数i=1;while(i=100)putchar(‘*’);i++;第五章5.1while语句#includestdio.hvoidmain(){floatx;scanf(%f,&x);【例5-1】输入一系列整数,判断其正负号,当输入0时,结束循环。输入数据,为第一次判断做准备while(x!=0)判断是否结束{if(x0)printf(+);elseprintf(-);scanf(%f,&x);}判断正负号第五章5.1while语句#includestdio.hvoidmain(){charch;intnum=0;ch=getchar();【例5-2】统计从键盘输入的一行字符的个数(以回车键作为输入结束标记)。while(ch!='\n')判断是否输入结束{num++;ch=getchar();}第五章5.1while语句printf(num=%d\n,num);}注意第五章5.1while语句表达式在判断前,必须要有明确的值。循环体中一般有改变条件表达式的语句。while(表达式)后面没有分号。5.2do--while语句1、do--while的形式:do{循环体;}while(表达式);2、do--while语句常称为“直到型”循环语句。真(非零)表达式循环体假(零)第五章5.2do-while语句3、说明:先执行语句,后判断表达式。第一次条件为真时,while,do-while等价;第一次条件为假时,二者不同。第五章5.2do-while语句【例5-3】用do-while语句编写程序统计从键盘输入的一行非空字符的个数(以回车键作为输入结束标记)。#includestdio.hvoidmain(){charch;intnum=0;ch=getchar();do{num++;ch=getchar();}while(ch!='\n');printf(num=%d\n,num);}第五章5.2do-while语句注意在if、while语句中,表达式后面都没有分号,而在do-while语句的表达式后面则必须加分号。do-while和while语句相互替换时,要注意修改循环控制条件。第五章5.2do-while语句5.3for语句1、for的形式:for(初始表达式1;条件表达式2;循环表达式3){循环体;}表达式1:用于循环开始前为循环变量设置初始值。表达式2:控制循环执行的条件,决定循环次数。表达式3:循环控制变量修改表达式。循环体语句:被重复执行的语句。第五章5.3for语句表达式3计算表达式1循环体判断表达式2零非零for的下一条语句2、执行过程第五章5.3for语句for(i=1;i=100;i++)sum=sum+i;例如:它相当于以下语句:i=1;while(i=100){sum=sum+i;i++;}表达式1;while(表达式2)表达式3;第五章5.3for语句3、说明三个表达式都可以是逗号表达式。三个表达式都是任选项,都可以省略,但要注意省略表达式后,分号间隔符不能省略。第五章5.3for语句1、for语句中表达式省略的形式(1)for语句一般形式中的“表达式1”可以省略;如:sum=0;i=1;for(;i=100;i++)sum=sum+i;学生自学第五章5.3for语句1、for语句中表达式省略的形式(2)表达式2省略,即不判断循环条件,循环无终止地进行下去;如:for(sum=0,i=1;;i++){if(i100)break;sum=sum+i;}学生自学第五章5.3for语句1、for语句中表达式省略的形式(3)表达式3也可以省略,但此时保证循环能正常结束如:for(sum=0,i=1;i=100;){sum=sum+i;i++;}学生自学第五章5.3for语句(4)可以省略表达式1和表达式3,只有表达式2,如:i=1;sum=0;for(;i=100;){sum=sum+i;i++;}学生自学1、for语句中表达式省略的形式i=1;sum=0;while(i=100){sum=sum+i;i++;}相当于第五章5.3for语句while(1)循环体;即不设初值,不判断条件,循环变量不增值。无终止地执行循环体。学生自学(5)三个表达式都可省略,如for(;;)循环体;1、for语句中表达式省略的形式如:sum=0,i=1;for(;;){if(i100)break;sum=sum+i;i++;}相当于第五章5.3for语句(6)循环体为空语句对for语句,循环体为空语句的一般形式为:for(表达式1;表达式2;表达式3);如:for(sum=0,i=1;i=100;sum+=i,i++);学生自学1、for语句中表达式省略的形式要在显示器上复制输入的字符,输入的字符为’.’时,结束循环。输入abcdefg.输出abcdefg.while(putchar(getchar())!=’.’);第五章5.3for语句(1)在进入累加前先给累加器赋初值(一般为0);(2)用循环语句实现累加;for(循环变量赋初值;循环条件;循环变量改变规律)(3)循环体语句的设计。累加器当前值=累加器原值+循环变量当前值;典型例题分析【例5-4】求累加和1+2+3+…+1000基本方法:第五章5.3for语句属于“累加器”类型问题。累加器赋初值求偶数和2+4+6+…+100参考程序:voidmain(){longintk,s;s=0;for(k=1;k=1000;k++)s=s+k;printf(s=%ld,s);}累加思考第五章5.3for语句(1)给累乘器赋初值,一般为1;(2)用循环语句实现累乘;for(循环变量赋初值;循环条件;循环变量改变规律)(3)循环体设计。累乘器当前值=累乘器原值*循环变量当前值;例5-5:求累乘积。如:1×2×3×...×100基本方法:第五章5.3for语句属于“累乘器”类型问题。累乘器赋初值求n!=1×2×3×…n参考程序:voidmain(){doubles=1;intk;for(k=1;k=100;k++)s=s*k;printf(s=%lf,s);}累乘思考第五章5.3for语句整数连乘结果一定是整数,而本例中结果数值相当大,用long型都无法存放,因此将存放累乘结果的变量s定义为double型。例5-6判断一个数是否为素数?一个数x在[2,sqrt(x)]范围内没有因子,我们就称其为素数(质数)主要编程方法:循环变量终值法、标记变量法第五章5.3for语句#includemath.hvoidmain(){intx,k;scanf(%d,&x);排除法:如果有因子,不再往下判断是否是素数循环变量终值法for(k=2;k=sqrt(x);k++)if(x%k==0)break;if(ksqrt(x))printf(%disaprime,x);elseprintf(%disnotaprime,x);}在判断范围内无因子,程序正常终止有因子,程序非正常终止第五章5.3for语句#includemath.hvoidmain(){intx,k,f=1;scanf(%d,&x);排除法:如果有因子,不再往下判断是否是素数for(k=2;k=sqrt(x);k++)if(x%k==0){f=0;break;}if(f==1)printf(%disaprime,x);elseprintf(%disnotaprime,x);}在判断范围内无因子,程序正常终止有因子,程序非正常终止标记变量法第五章5.3for语句例5-7用0--9这十个数字可以组成多少无重复的三位数?编程方法:“枚举法”按问题本身的性质,一一列举出该问题所有可能的解,并在逐一列举的过程中,检验每个可能解是否是问题的真正解,若是,我们采纳这个解,否则抛弃它。对于所列举的值,既不能遗漏也不能重复。第五章5.3for语句#includestdio.hvoidmain()/*a,b,c代表百位、十位、个位*/{intx,a,b,c,num=0;/*num存放满足条件的数的个数,注意num要赋初值*/for(x=100;x=999;x++){a=x/100;b=x/10%10;c=x%10;if(a!=b&&a!=c&&b!=c){num++;printf(%5d,x);}}printf(\nnumber=%d,num);}第五章5.3for语句编程方法:“递推法”例5-8裴波那契数列的第1、2项分别为1、1,以后各项的值均是其前两项之和。求前30项菲波那契数。所谓递推法就是从初值出发,归纳出新值与旧值间的关系,直到求出所需值为止。新值的求出依赖于旧值,不知道旧值,无法推导出新值。数学上递推公式正是这一类问题。第五章5.3for语句f1--第一个数f2--第二个数f3--第三个数f1=1;f2=1;f3=f1+f2;以后只要改变f1,f2的值,即可求出下一个数.f1=f2;f2=f3;f3=f1+f2;递推第五章5.3for语句voidmain(){longf1=1,f2=1,f3;intk;参考程序:printf(%ld\t%ld\t,f1,f2);for(k=3;k=30;k++){f3=f1+f2;printf(%ld\t,f3);f1=f2;f2=f3;}}注意f1、f2、f3、x的类型递推第五章5.3for语句5.4goto语句以及用goto语句构成的循环1、语句形式:goto语句标号;例如:gotolabel;……label:…...第五章5.4goto语句语句标号用标识符表示,它的定名规则与变量名相同。2、语句执行流程:在程序执行过程中,如果遇到goto语句,则程序执行流程无条件地转向语句标号后的语句继续执行。第五章5.4goto语句3、说明语句标号仅仅对goto语句有效,对其它语句不影响。同一个程序中,不允许有同名标号。goto语句通常与条件语句配合使用。可用来实现条件转移、构成循环、跳出循环体等功能第五章5.4goto语句【例5-9】分析下面程序的运行结果:#includestdio.hvoidmain(){charc;loop:c=getchar();if(c=='\n')gotoend;putchar(c);gotoloop;end:printf(Theend\n);}程序运行情况为:123asd↙123asdTheend第五章5.4goto语句1.break语句5.5break语句和continue语句(1)语句形式:break;(2)作用:结束break所在的switch语句。结束当前循环,跳出break所在的循环结构。第五章5.5break和continue语句【例5-10】求300以内能被17整除的最大的数。#includestdio.hvoidmain(){intx,k;for(x=300;x=1;x--)if(x%17==0)break;printf(x=%d\n,x);}找