1、Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,西南交通大学,*,Click to edit Master title style,第,4,章 循环结构,计算机系,内容提要,for,循环,1,while,循环,2,do-while,循环,3,goto,语句,4,循环嵌套,5,break,语句和,continue,语句,6,西南交通大学,4.1,引言,在不少实际问题中有许多具有规律性的重复操作,在程序中就需要重复执行某些语句。一组被重复执行的语句称之为循环体,能否继续重复,取决于
2、循环的终止条件。,循环语句,是由,循环体,及,循环的终止条件,两部分组成的。,要使用循环语句时,必须要确定两个重要因素:,要重复执行哪些语句,重复到什么时候为止,。,西南交通大学,4.2 for,循环,1.,语法格式,for,(,循环变量赋初值;循环条件;循环变量值的改变,),循环体语句,2.,说 明,(,1,)执行顺序,先执行循环变量赋初值;,再判断循环条件;,如果条件成立执行循环体语句;,再返回上面执行循环变量值的改变;,后面,重复这个顺序,;,直到条件不成立,跳出整个,for,循环。,西南交通大学,4.2 for,循环,(,2,),for,循环中的,循环变量赋初值,可省略,但后面的,;,
3、不能,省略。,如果省略,则要求循环变量在,for,之前已经赋值。,另外,该处也可写与循环变量无关的其他表达式。,(,3,),for,循环中的,循环条件,可省略,但后面的,;,不能省。,如果省略,即无循环结束的条件,循环将无终止地执行下去。,如果省略,还可用,break,语句替代其功能(在,4.7,节详细说明)。,循环条件,可以是关系、逻辑、数值、字符表达式,只要值不为,0,就执行循环体。,西南交通大学,4.2 for,循环,(,4,),for,循环中的,循环变量值的改变,可省略。,如果省略,应在循环体语句中设置变量值的改变,否则循环可能无法结束。,另外,该处也可写与循环变量无关的其他表达式。,
4、5,),for,循环中的,都可省略,如:,for(;),表示无限循环。,(,6,),循环体语句,如果超过一条应加上花括号“,”,构成复合语句。,西南交通大学,for,循环 举例,【,例,4.1】,求和。,输入,10,个数,求这,10,个数的和,然后输出结果。,#include,int,main(void,),float,count,sum,x,;,printf,(,输入,10,个数:,);,for(count,=0,sum=0;count10;count+),scanf(%f,&x,);,sum+=x;,printf,(,结果为,%,gn,sum,);,return 0;,例,4.1.1,
5、西南交通大学,for,循环 举例,程序说明:,(,1,)该例中,,count=0,sum=0;,还可写为:,count=sum=0;,(,2,)该例中,可省略和,即将放在循环体之前进行,,将放在循环体中进行。,(,3,),循环结束时,,count,的值为,10,。,(,4,)循环体语句执行了,10,次。,注意,循环的执行顺序:,当,count=0,时,判断条件满足,第,1,次执行循环体语句;,当,count=9,时,判断条件满足,第,10,次执行循环体语句;,当,count=10,时,判断条件不满足,跳出循环。,例,4.1.2,西南交通大学,for,循环 举例,【,例,4.2】,求阶乘。编程求
6、10!,。,#include,int,main(void,),long,int,i,s,;,for(i,=1,s=1;i=10;i+),s*=i;,printf(10!=%ld,n,s,);,return 0;,例,4.2,西南交通大学,for,循环 举例,程序说明:,(,1,),跳出循环时,,i=11,,循环体共执行了,10,次。,(,2,)本题中,变量,i,也可从,2,开始。,(,3,)由于,10,!超过了“整型”范围,因此必须定义为“长整型”。,(,4,)循环体语句只有一句,s*=i;,因此可以不用加花括号。,西南交通大学,for,循环 举例,【,例,4.3】,求阶乘的和。编程求,1!
7、2!+10!,。,基本思路:,本题把例,4.1,和例,4.2,的要求融合在一起,用循环实现,累加,和,累乘,。,很多程序都是在累加和累乘的基础上实现的,请读者在初学时,多练习写相关的程序,以更好地理解程序设计中循环的解题思想。,如:求,100,200,所有的奇数和;,求,10,20,所有偶数的乘积。,例,4.3,西南交通大学,for,循环 举例,#include,int,main(void,),long,int,i,s,sum,;,for(i,=2,s=1,sum=1;i=10;i+),s*=i;,sum+=s;,printf(1!+2!+3!+10!=%ld,n,sum,);,return
8、 0;,西南交通大学,for,循环 举例,【,例,4.4】,输出所有水仙花数。,水仙花数为一个三位数,该三位数每位数字的立方和等于该数本身。编程求出所有三位水仙花数。,基本思路:,三位数即表示范围为,100,999,,这种,明确给出了数值范围的题目,用,for,循环来表示,结构上非常清晰,。,该题也可用,while,循环来实现,读者可以自己尝试写出程序,比较这两种循环在表达上的差异。,例,4.4,西南交通大学,for,循环 举例,#include,void main(),int,i,a,b,c,;,for(i,=100;i=999;i+),a=i%10;,/*a,为个位*,/,c=i/100;
9、/*c,为百位*,/,b=i%100/10;,/*b,为十位*,/,if(i,=a*a*,a+b,*b*,b+c,*c*c),printf(%d,i,);,西南交通大学,例,4.5,for,循环 举例,【,例,4.5】,输入任意字符,并将刚才输入的字符输出,如果想结束输入,则输入字母,t,。,#include,int,main(void,),char c;,for(;(c,=,getchar,()!=t;),printf(%c,c,);,printf(n,);,return 0;,该题,省略了,和,,只保留了,循环体语句只有一句,而,printf(n);,是循环外的语句,要在整个循环结束后才
10、会执行,函数,getchar(),获取从键盘上输入的字符,赋给变量,c,西南交通大学,for,循环 举例,每输入一个字符,按回车键,结果如下:,连续输入一串字符,最后一个输入,t,,然后按回车键,结果如下:,西南交通大学,4.3 while,循环,1.,语法格式,while(,循环条件,),循环体语句,2.,说 明,(,1,)执行顺序:,当循环条件“真”,即值为非,0,时,执行循环体语句;,当循环条件“假”,即值为,0,时,跳出循环。,西南交通大学,4.3 while,循环,(,2,)循环体语句如果有一个以上的语句,应以一对花括号“,”,括起来,成为,复合语句,。,(,3,)循环体语句中应该有
11、使循环趋于结束的语句,。,(,4,),while,循环,,首先就要判断条件,,如果条件一开始就为假,循环体语句可能一次都不执行。,西南交通大学,while,循环 举例,【,例,4.6】,求和(,与例,4.1,的,for,循环比较,)。,#include,int,main(void,),float count=0,sum=0,x;/*,变量赋初值*,/,printf,(,输入,10,个数:,);,while(count,10),scanf(%f,&x,);,count+,sum,+=x;,printf,(,结果为,%,gn,sum,);,return 0;,例,4.6,西南交通大学,while
12、循环 举例,程序说明:,将本例和例,4.1,比较,我们发现:,while,循环就是把,for,循环的,循环体变量赋初值,放到,while,之前;,把,for,循环的,循环体变量值的改变,放到,while,的循环体内;,条件判断,部分是一样的。,西南交通大学,while,循环 举例,实际编程中一般选择表达方式简洁明确的:,例,4.1-,例,4.4,用,for,循环更好;,例,4.5,和,4.8,用,while,循环更好。,问题,通过分析,我们看到,for,循环和,while,循环功能基本相同,那么在使用时该选用哪一种呢?,西南交通大学,例,4.7,while,循环 举例,【,例,4.7】,求阶
13、乘(,与例,4.2,的,for,循环比较,)。,#include,int,main(void,),long,int,i,s,;,i=1,s=1;,while(i,=10),s*=i;i+;,printf(10!=%ld,n,s,);,return 0;,注,意,while,中一定要有使程序趋于结束的语句。,本例中是,i+;,。,如果没有这一句,那么,i,永远都不会超过,10,,循环将无终止的执行下去,成为死循环。,西南交通大学,while,循环 举例,【,例,4.8】,使用公式,/41,1/3+1/5,1/7+,求,,直到最后一项的绝对值小于,10,-8,为止。,#include,#inclu
14、de,int,main(void,),double pi=0,t=1,n=1;,int,s=1;,while(fabs(t)=1E-8),pi+=t;,n+=2;,s=-s;,t=s/n;,printf(%.8fn,pi*4);,return 0;,例,4.8,西南交通大学,while,循环 举例,程序说明:,(,1,)最后一项的绝对值小于,10,-8,,即有效位数超过,7,位,已超出,float,型的精度范围,因此应定义为,double,型。,(,2,)该例中循环次数不明确,循环条件要通过计算才能得到,这种类型的程序,选择,while,循环实现要更清楚明确,读者可以尝试用,for,循环来实现
15、西南交通大学,4.4 do-,while循环,1.,语法格式,do,循环体语句,while(,循环条件,);,2.,说 明,(,1,)执行顺序:,先,无条件执行一次,do,后的循环体语句;,然后,判断循环条件,,若值为“真”,返回,do,处,执行循环体语句;,如此反复,直到循环条件为“假”,跳出循环。,西南交通大学,4.4 do-,while循环,(,2,)无论条件是否成立,,do-while,循环的循环体语句,至少执行一次,;,而,while,循环的循环体语句,可能一次都不执行,。,(,3,),do-while,循环中,,while,后的循环条件 后有一个分号,;,书写时不要遗漏了。,西
16、南交通大学,do-,while循环,举例,【,例,4.9】,求和(与例,4.6,的,while,循环比较)。,#include,int,main(void,),float count=0,sum=0,x;,printf,(,输入,10,个数:,);,do,scanf(%f,&x,);,count+,sum,+=x;,while(count,=0,else,if(c,=,a&c,=,A&c,=0,elseif(c=a,else other+;,西南交通大学,do-,while循环,举例,【,例,4.11】,任意输入两个数,求这两个数的最大公约数。,基本思路:,首先,随机输入两个数,m,、,n,(
17、默认,mn,);,其次,将,m,除以,n,的余数赋给,k,,如果,m,能被,n,整除,则,k,值为,0,,,n,即为这两个数的最大公约数;,否则,将,n,赋给,m,,,k,赋给,n,,重复以上过程,直到,k,值为,0,。,这种求最大公约数的算法称为,辗转相除法,。,例,4.11,西南交通大学,do-,while循环,举例,int,m,n,k,result,;,printf(Enter,two numbers:);,scanf(%d%d,&m,&n,);,if(m,0&n0)/*,限定,m,和,n,为正数*,/,do,k=,m%n,;,if(k,=0)result=n;,else m=n,n=k
18、while(k,0);,printf(The,greatest common,divistor,is:%dn,result,);,else,printf(Nonpositive,values not allowedn);,西南交通大学,4.5,goto,语句,1.,语法格式,goto,语句标号,;,2.,说 明,(,1,)执行顺序:无条件跳转到语句标号所在行。,(,2,)语句标号用标识符表示,命名规则和变量名相同。,(,3,)可与,if,语句一起构成循环。,(,4,)滥用,goto,语句会使程序流程无规律,一般限制使用,只在需要从多层循环的内层跳,到外层时才会用到该语句。,西南交通大学,g
19、oto,语句 举例,【,例,4.12】,求和。,#include,int,main(void,),int,i=1,sum=0;,loop:if(i,=10),sum=,sum+i;i,+;,goto,loop;,printf(%d,sum,);,return 0;,程序说明:,该程序相当,while,循环,当,i=10,时,执行花括号内的语句块。,例,4.12,西南交通大学,4.6,循环嵌套,一个循环体内又包含另一个完整的循环结构,称为,循环的嵌套,。,内嵌的循环中还可以嵌套循环,这就是多层循环。,西南交通大学,循环嵌套 举例,【例4.13】,百钱买百鸡。现有,100,元钱,要买,100,只鸡
20、公鸡,5,元一只,母鸡,3 元一只,小鸡,1,元钱,三,只,问如何买法,。,#include,int,main(void,),int,cock,hen,chick,;,for(cock,=0;cock=20;cock+),for(hen,=0;hen=33;hen+),chick=100cockhen;,if(cock,*15+hen*9+chick=300),printf(%d,%d,%dn,cock,hen,chick,);,return 0;,例,4.13,西南交通大学,循环嵌套 举例,程序说明:,(,1,),100,元钱全部买公鸡,最多买,20,只。因此循环中,cock,最大值取,2
21、0,;,取,100,也可以,但使循环多执行了很多次,程序效率低,。,(,2,)程序执行顺序:请老师上课讲解。,西南交通大学,4.7 break,语句和,continue,语句,break,语句,可以使程序流程跳出,switch,语句,,还可以从循环体内跳出循环体,提前结束循环。,continue,语句,可以提前结束本次循环。,西南交通大学,4.7.1 break,语句,1.,语法格式,break;,2.,说 明,(,1,)作用,1,:使流程跳出循环,终止整个循环。,(,2,)作用,2,:使流程跳出,switch,语句。,(,3,),不能用于循环语句和,switch,语句之外的其他任何语句,。,
22、西南交通大学,break,语句 举例,【,例,4.14】,判别所输入的一个大于,1,的正整数是否是素数。,判断素数的方法是,:,用这个数分别去除,2,到这个数的平方根,,只要有一个数能被整除,则表明此数不是素数,,如果没有一个数能被整除,则是素数。,#include,#include,int,main(void,),int,x,i,j,;,printf,(,输入一个大于,1,的正整数?,);,scanf(%d,&x,);,例,4.14,西南交通大学,break,语句 举例,j=(,int)sqrt(x,);,for(i,=2;ij),printf(%d,是素数!,n,x,);,else,pri
23、ntf(%d,不是素数!,n,x,);,return 0;,sqrt(),平方根函数,,见附录,当,ij,时,跳出,说明从,2,到,sqrt(x),之间,没有一个能被,x,整除,这种情况判断出,x,是素数,当,x%i=0,时,跳出,说明,x,有因子,不可能是素数,这时,i,还未取到终止值,j,如果不用,break,语句,本程序可将,for,语句改成:,for(i=2,j=(int)sqrt(x);ij,时跳出,说明从,2,到,sqrt(x,),之间,没有一个能被,x,整除,这种情况判断出,x,是素数。,当,x%i,=0,时跳出,说明,x,有因子,不可能是素数,这时,i,还未取到终止值,j,。,
24、如果不用,break,语句,本程序可将,for,语句改成:,for(i,=2,j=(,int)sqrt(x);i,=,ji,+);,西南交通大学,break,语句 举例,【,例,4.15】,判断,101,200,有多少个素数,并输出所有素数。并且每输出,5,个数字换一行。,int,x,i,j,count,=0;,for(x,=101;x=200;x+),j=(,int)sqrt(x,);,for(i,=2;ij),count+;,/*count,用来记录当前素数的个数*,/,printf(%d,x,);,if(count%5=0),printf(n,);,外层的,for,控制,x,的区间为,1
25、01,200,内层的,for,用来判断当前的,x,是否为素数,例,4.15,西南交通大学,4.7.2 continue,语句,1.,语法格式,continue;,2.,要 点,(,1,)作用:结束本次循环,而不是终止整个循环。,(,2,)与,break,语句的区别:,break,语句不仅仅结束本次循环,而且还终止整个循环。,西南交通大学,continue,语句 举例,【,例,4.16】,编程求,10,50,范围内能被,3,整除的所有整数。,#include,int,main(void,),int,x;,for(x,=10;x=50;x+),if(x%3)continue;,printf(%3d
26、x);,printf(n,);,return 0;,本题也可不用,continue,语句,直接将,if,语句改为:,if(x%3=0)printf(%3d,x);,例,4.16,西南交通大学,小 结,循,环,语,句,while(,条件,),循环体语句,先判断条件,do,循环体语句,while(,条件,);,后判断条件;,注意该语句条件后有一个分号,for(,表达式,1;,表达式,2;,表达式,3),循环体语句,goto,语句标号,;,无条件跳转,少用,其,他,break;,只能用于循环语句和,switch,语句,continue;,只能用于循环语句,西南交通大学,Thank You!,计算机系,






