资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,1,第六章 循环结构程序设计,6.1,概 述,循环结构,是程序中一种很重要的结构。其特点是,在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段,称为循环体,。语言提供了多种循环语句,可以组成各种不同形式的循环结构。,(,1,)用,goto,语句和,if,语句构成循环,(,2,)用,while,语句,(,3,)用,do-while,语句,(,4,)用,for,语句,2,表达式,语句,表达式,语句,a),当型循环,b),直到循环,非,0,0,非,0,0,3,6.2 goto,语句及用,goto,语句构成的循环,一、无条件转移语句,goto,语句,一般格式:,goto,语句标号;,其中语句标号是按标识符规定书写的符号,放在某一语句行的前面,标号后加冒号,(,:,),。语句标号起标识语句的作用,与,goto,语句配合使用。,如:,label:i+;,goto label1;,语言不限制程序中使用标号的次数,但各标号不得重名。,goto,语句的语义是改变程序流向,转去执行语句标号所标识的语句。,4,二、用,goto,语句与,if,语句实现循环,用,goto,语句与,if,语句实现循环的形式:,形式,1,:,loop1,:,语句;,if,(表达式),goto loop1;,形式,2,:,loop1,:,if,(表达式),goto loop2;,语句;,goto loop1;,loop2,:,注意:,在结构化程序设计中一般不主张使用,goto,语句,以免造成程序流程的混乱,使理解和调试程序都产生困难。,5,例,1,:编程序求:,s=1+2+3+100,main(),int s=0,n=1;,loop:,s=s+n;,n+;,if(n100)goto loop2;,s=s+n;,n+;,goto loop1;,loop2:,printf(S=%d,s);,6,例,2,:统计从键盘输入一行字符的个数。,#includestdio.h,void main(),int n=0;,printf(input a stringn);,loop:if(getchar()!=n),n+;,goto loop;,printf(%d,n);,7,6.3 while,语句,执行过程是:计算表达式的值,当值为真,(,非,0),时,执行循环体语句。如右上图。,while,语句的一般形式为:,while(,表达式,),语句;,其中表达式是循环条件,语句为循环体,若是多个语句则必须用,和,组成复合语句。,表达式,语句,非,0,0,8,例,1,:编程序求:,s=1+2+3+100,main(),int s=0,n=1;,while (n=100),s=s+n;,n+;,printf(S=%d,s);,9,6.4 Do,while,语句,do-while,语句的一般形式为:,do,语句;,while(,表达式,),;,其中:语句是循环体,,表达式是循环条件。,表达式,语句,非,0,0,执行过程:,先执行循环体语句一次,再判别表达式的值,若为真,(,非,0),则继续循环,否则终止循环。,10,例,1,:编程序求:,s=1+2+3+100,main(),int s=0,n=1;,do,s=s+n;,n+;,while (n=100);,printf(S=%d,s);,11,使用,while,和,do-while,语句应注意以下几点:,1.,在,if,语句,,while,语句中,表达式后面都不能加分号,而在,do-while,语句的表达式后面则必须加分号。,2.,do-while,语句也可以组成多重循环,而且也可以和,while,语句相互嵌套。,3.,当循环体由多个语句组成时,也必须用,括起来组成一个复合语句。,4.,如果循环至少要执行一次,,while,和,do-while,语句可以相互替换。,12,6.5 for,语句,for,语句是语言所提供的功能更强,使用更广泛的一种循环语句。,一、使用一般形式为:,for(,表达式,1,;表达式,2,;表达,3),语句;,其中:,表达式,1,通常用来给循环变量赋初值,一般是赋值表达式。也允许在,for,语句外给循环变量赋初值,此时可以省略该表达式。,表达式,2,通常是循环条件,一般为关系表达式或逻辑表达式。,表达式,3,通常可用来修改循环变量的值,一般是赋值语句。,13,for,语句的执行过程:,1.,首先计算表达式,1,的值。,2.,再计算表达式,2,的值,若值为真,(,非,0),则执行循环体一次,否则跳出循环。,3,.,然后再计算表达式,3,的值,转回第,2,步重复执行。,在整个,for,循环过程中,表达式,1,只计算一次,表达式,2,和表达式,3,则可能计算多次。循环体可能多次执行,也可能一次都不执行。,表达式,2,语句,非,0,0,语句,求解表达式,1,求解表达式,3,for,语句的执行过程,14,例:用,for,语句计算,s=1+2+3+.+99+100,main(),int n,s=0;,for(n=1;n=100;n+),s=s+n;,printf(s=%dn,s);,本例,for,语句中的表达式,3,为,n+,,实际上也是一种赋值语句,相当于,n=n+1,,以改变循环变量的值。,15,二、在使用,for,语句中要注意以下几点:,1.,for,语句中的各表达式都可省略,但分号间隔符不能少,如:,for(,;表达式,2,;表达式,3),省去了表达式,1,。,for(,表达式,1,;表达式,3),省去了表达式,2,。,for(,表达式,1,;表达式,2,;,),省去了表达式,3,。,for(,;,),省去了全部表达式。,2.,在循环变量已赋初值时,可省去表达式,1,。如省去表达式,2,或表达式,3,则将造成无限循环,这时应在循环体内设法结束循环。,例:,16,main(),int n=1,s=0;,for(;n=100;n+),s=s+n;,printf(s=%dn,s);,main(),int n=1,s=0;,for(;n=10)break;,printf(s=%dn,s);,for(;),等效于,while(1),18,3.,for,语句中的 三个表达式都可以是逗号表达式,即每个表达式都可由多个表达式组成。,例:,main(),int n,s;,for(n=1,s=0;n=100;n+),s=s+n;,printf(s=%dn,s);,main(),int n,s;,for(n=1,s=0;n=100;n+,s+=n);,printf(s=%dn,s);,这里为什么要加;,19,例:统计从键盘输入一行字符的个数。,#includestdio.h,void main(),int n=0;,printf(input a string:n);,for(;getchar()!=n;n+);,printf(%d,n);,说明:,本例中,省去了,for,语句的表达式,1,,表达式,3,也不是用来修改循环变量,而是用作输入字符的计数。这样,就把本应在循环体中完成的计数放在表达式中完成了。因此循环体是空语句。应注意的是,,空语句后的分号不可少,,如缺少此分号,则把后面的,printf,语句当成循环体来执行。反过来说,,如循环体不为空语句时,决不能在表达式的括号后加分号,,这样又会认为循环体是空语句而不能执行循环体。,20,6.6,循环的嵌套,for,语句也可与,while,do-while,语句相互嵌套,构成多重循环。以下形式都合法的嵌套。,(4)while(),for(),(1)while(),while(),do,do,while(),while();,(3)for(),for(),21,while(),do,while();,(5)for(),while(),(6)do,for(),while();,(8)for(),do,while();,22,例:打印如下形式的九九乘法表,.,#include,main(),int x,y;,for(x=1;x=9;x+),for(y=1;y=9;y+),printf(%d*%d=%2d ,x,y,x*y);,printf(n);,23,6.7,几种循环语句的比较,24,6.8 break,语句和,continue,语句,一、,break,语句,break,语句只能用在,switch,语句或循环语句中,其作用是跳出,switch,语句或跳出,本层循环,,转去执行后面的程序。由于,break,语句的转移方向是明确的,所以不需要语句标号与之配合。,break,语句的一般形式为:,break;,注意:,break,语句用于循环体中,一般与,if,语句联合使用。,25,分析下面程序的功能,#includestdio.h,void main(),char a,b;,printf(input a string:n);,b=getchar();,while(a=getchar()!=n),if(a=b),printf(same charactern);,break;,b=a;,功能是:检查输入的一行中有无相邻两字符相同。,26,main(),int n;,for(n=7;n=100;n+),if(n%7!=0),continue;,printf(%d ,n);,main(),int n;,for(n=7;n1e-6),pi=pi+t;,n=n+2;,s=-s;,t=s/n;,pi=pi*4;,printf(pi+%10.6fn,pi);,例,6.6,用,/41-1/3+1/5-1/7+,公式求,的近似值,直到最后一项的绝对值小于,10,-6,为止,28,例,6.8,判断一个整数,m,是否是素数。素数是只能被,1,和本身整除的数。,算法:让,m,被,2,到,sqrt(m),除,如果能被,2 sqrt(m),之中的任何一个整除,则提前结束循环,如果不能,则在完成最后一次循环后,,i,还要,+1,然后终止循环。,29,#include,#include math.h,void main(),int m,i,k;,printf(Enter m=n);,scanf(%d,k=sqrt(m);,for(i=2;i=k),printf(Yesn);,else,printf(Non);,输入,m,当,ik,Y,N,打印,Yes,break,打印,No,程序流程图,30,例,6.9,打印输出,100,200,之间的素数。,#include,#include math.h,void main(),int n=0,i,k,m;,for(m=101;m=199;m+),k=sqrt(m);,for(i=2;i=k),n+;,printf(%d ,m);,if(n%10=0)printf(n);,31,例,6.10,字符加密、解密,加密的思想是:,将每个字母,C,加(或减)一序数,k,,即用它后的第,k,个字母代替,变换式公式:,c=c+k,例如序数,k,为,5,,这时“,A”,“F”,,“,a”,“f”,,“,B”,“G”,当加序数后的字母超过“,Z”,或“,z”,则,c=c+k-26,例如:,You are good,Dtz fwj ltti,解密为加密的逆过程,将每个字母,C,减(或加),一序数,k,,即,c=c-k,例如序数,k,为,5,,这时“,Z”,“U”,,“,z”,“u”,,“,Y”,“T”,当加序数后的字母小于“,A”,或“,a”,则,c=c-k+26,32,加密程序如下:,#include stdio.h,main(),char c;,while(c=getchar()!=n),if(c=a&c=A&cZ&cz),c=c-26;,printf(%c,c);,33,解密程序如下:,#include stdio.h,main(),char c;,while(c=getc
展开阅读全文