资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,5,章 循环结构程序设计,5.1,循环结构程序设计的概念,5.2,语句标号和,goto,语句,5.3 while,语句,5.4 do while,语句,5.5 for,语句,5.6,循环结构嵌套,5.7 break,语句和,continue,语句,5.1,循环结构程序设计的概念,实现循环的程序结构称为循环结构,是计算机科学中用以描述客观世界循环现象的重要手段。,程序设计中的循环简称循环是指在程序设计中,从某处开始有规律地反复执行某一操作块或程序块。如果循环永远不会终止,这样的循环就称为死循环。,第,5,章 循环结构程序设计,5.2,语句标号和,goto,语句,goto,语句为无条件转向语句,它的一般格式为:,goto,语句标号,;,第,5,章 循环结构程序设计,例,5.1,用,if,语句和,goto,语句构成循环,求,n,。,main(),int i,,,sum=0;,i=1;,loop:if(i=100),sum=sum+i;,i+;,goto loop;,printf(%d,,,sum);,100,n=1,5.3 while,语句,while语句用来实现“当型循环结构。,5.3.1 while语句的一般格式,while语句是一个循环控制语句,用来控制程序段的重复执行。其一般格式为:,while(表达式),循环体;,格式中的循环体,可以是单个语句、空语句,也可以是复合语句。,第,5,章 循环结构程序设计,5.3.2 while,语句的执行过程,当表达式为非0时,执行while语句中的循环体,然后继续进行表达式的判断,如此循环。当表达式为0时,那么退出循环。,说明:如果循环体包含一个以上的语句,就构成块语句,应该用花括号 括起来。,第,5,章 循环结构程序设计,返回章目录,当表达式为非0值时,执行while语句中的内嵌语句。其流程图见图5.1。其特点是:先判断表达式,后执行语句。,图,5.1,图,5.2,例,5.2,求,n,。,用传统流程图和,N-S,结构流程图表示算法,见图,P84 5.2(a),和图,5.2(b),。根据流程图写出程序:,main(),int i,,,sum=0;,i=1;,while(i=100),sum=sum+i;,i+;,printf(%d,,,sum);,100,n=1,5.4 do while,语句,C,语言中,用,do while,语句构成直到型循环结构。,5.4.1 do while,语句的一般格式,do while,语句也是一个循环控制语句。其特点是先执行循环体,然后判断条件是否成立。其一般格式为:,do,循环体,while(,表达式,);,说明:循环体至少执行一次。当循环体有多个语句时必须加花括号,。,第,5,章 循环结构程序设计,5.4.2 do while,语句的执行过程,先执行一次指定的循环体语句,然后判断表达式。当表达式的值为非,0,的数据时,返回重新执行循环体,如此反复直到表达式的值为,0,为止,此时循环结束。,第,5,章 循环结构程序设计,返回章目录,图5.3,例,5.3,用,dowhile,语句求,n,。,先画出流程图,见图,5.4,。,图,5.4,图,5.5,100,n=1,程序如下:,main(),int i,,,sum=0;,i=1;,do,sum=sum+i;,i+;,while(i=100);,printf(%d,,,sum),;,例5.4while和do-while循环的比较。,(1)main()(2)main(),int sum=0,i;int sum=0,i;,scanf(“%d,,while(i=10)do,sum=sum+i;sum=sum+i;,i+;i+;,while(i=10),printf(“sum=%d,sum);printf(“sum=%d,sum);,5.5 for,语句,for,语句可以用于循环次数已经确定的情况,还可用于循环次数不确定而只给出循环结束条件的情况。,5.5.1 for,语句的一般格式,for,语句的一般格式为:,for(,表达式,1;,表达式,2;,表达式,3),循环体,第,5,章 循环结构程序设计,5.5.2 for,语句的执行过程,for语句的执行过程为:,(1)先求解表达式1,表达式1只执行一次,一般是赋值语句,用于初始化变量。,(2)求解表达式2,假设为假0,那么结束循环。(3)当表达式2为真非0时,执行循环体。,(4)执行表达式3。,(5)转回(2)。,第,5,章 循环结构程序设计,图,5.6,for(i=1;i=100;i+),sum=sum+i;,5.6,循环结构嵌套,一个循环体内包含另一个完整的循环结构,称为循环的嵌套。循环之中还可以套循环,称为多层循环。三种循环while循环、do while循环和for循环可以互相嵌套。例如:,while(),for(),第,5,章 循环结构程序设计,5.7 break,语句和,continue,语句,5.7.1 break,语句,break,语句可以使流程跳出,Switch,结构,继续执行,Switch,语句下面的一个语句。,break,语句还可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。如:,for(r=1;r100)break;,printf(%f,,,area);,第,5,章 循环结构程序设计,5.7.2 continue语句,continue语句的作用是结束本次循环,忽略continue后面的语句,进行下一次循环判定。,continue语句和break语句的区别是:continue语句只结束本次循环,而不是终止整个循环的执行。而break语句那么是结束整个循环过程,不再判断执行循环的条件是否成立。,第,5,章 循环结构程序设计,返回章目录,5.9,程序举例,例,5.6,用,/41-13+15-17+,公式求,的近似值,直到最后一项的绝对值小于,10-6,为止。,用,N|S,结构化流程图表示算法,(,见图,5.12),。,图,5.12,程序如下:,#include,main(),int s;,float n,,,t,,,Pi;,t=1,;,Pi=0;n=1.0;S=1;,while(fabs(t)1e-6),Pi=Pi+t;,n=n+2;,s=-s;,t=S/n;,Pi=Pi*4;,printf(Pi=%10.6f,n,,,Pi);,运行结果为:,Pi=3.141594,例,5.7,求,fibonacci,数列,40,个数。这个数列有如下特点:第,1,,,2,两个数为,1,,,1,。从第,3,个数开始,该数是其前面两个数之和。即,:,f,1,=1 (n=1),f,2,=1 (n=2),f,n,=f,n-1,+f,n-2,(n3),解此题的算法如图,5.13,所示。,图5.13,程序如下:,main(),long int f1,,,f2;,int i;,f1=1;f2=1;,for(i=1;i=20;i+),printf(%12ld%12ld,,,f1,,,f2);,if(i%2=0)printf(,n);,f1=f1+f2;,f2=f2+f1;,运行结果为:,1,1,2 3,5 8 13 21,34 55 89 144,233 377 610 987,1597 2584 4181 6765,10946 17711 28657 46368,75025 121393 196418 317811,514229 832040 1346269 2178309,3524578 57022887 9227465 14930352,24157817 39088169 63245986 102334155,例5.8判断m是否素数。算法如图5.14所示。,我们采用的算法是这样的:让m被2到m 除,如果m能被2m 之中任何一个整数整除,那么提前结束循环,此时i必然小于或等于k(即m);如果m不能,图5.14,#include,main(),int m,i,k;,scanf(%d,,k=sqrt(m+1);/*加1是为了防止在求m时可能出现的误差*/,for(i=2;i=k+1)printf(%d is a Prime muber,n,,,m);,else printf(%d is not a Prime number,n,,,m);,运行情况如下:,17,17 is a Prime number,例5.9求100200间的全部素数。,在例5.8的根底上,对此题用一个嵌套的for循环即可处理。程序如下:#include,main(),int m,k,i,n=0;,for(m=101;m=200;m=m+2),k=sqrt(m);,for(i=2;i=k+1)printf(%d ,,,m);n=n+1;,if(n%10=0)printf(,n);,printf(,n);,运行结果如下:,101 103 107 109 113 127 131 137 139 149,151 157 163 167 173 179 181 191 193 197,199,n,的作用是累计输出素数的个数,控制每行输出,10,个数据。,例5.10译密码。为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。例如,可以按以下规律将电文变成密码:,将字母a变成字母E,a变成e,即变成其后的第4个字母,W变成a,X变成b,Y变成c,Z变成D。见图5.15。字母按上述规律转换,非字母字符不变。如“china!转换为“Glmre!。,输入一行字符,要求输出其相应的密码。,图5.15,程序如下:,#include,main(),char c;,while(c=getchar()!=,n),if(c=a&c=a&cZ,printf(%c,c);,运行结果如下:,china!,Glmre!,程序中对输入的字符处理方法是:先判定它是否大写字母或小写字母,假设是,那么将其值加4(变成其后的第4个字母)。如果加4以后字符值大于Z或z,那么表示原来的字母在V(或v)之后,应按图5.15所示的规律将它转换为aD(或ad)之一。方法是,使c减26,如果读者对此还有疑问,请查ascII码表即可清楚。还有一点请读者注意:内嵌的if语句不能写成,if(cZ|cz)c=c-26;,因为当字母为小写时都满足“cZ条件,从而也执行“c=c-26;语句,这就会出错。,因此必须限制其范围为“cZ&cz&cz即可。,
展开阅读全文