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