资源描述
单击此处编辑母版标题样式,第十讲,while语句、do-while语句、for 语句 循环结构的嵌套,5.1 while循环语句,由while语句构成的循环也称当循环。,while循环的一般形式如下:,while(表达式),循环体语句,图,5.1 while,循环流程图,while语句的执行过程是:,先计算while表达式的值,当表达式的值为非零时,便执行循环体语句,之后再计算该表达式的值,由此构成循环,直到有一次求得表达式的值为零时才结束循环,并继续执行循环体语句之外的后续语句。,图,5.1 while,循环流程图,while(表达式),循环体语句,例:,k=0;,while (k10),printf(“*);k+;,注意:1)表达式不可省;表达式的值为真的时候,作循环;,2)循环体语句,要能改变表达式的值,使其从真变到假;(为什么啦?)如果循环语句是多条,构成复合语句;,执行过程:P50,P51(1)(2)(3),说明:(1)while语句中的表达式可以是任意合法的C表达式。,(2)如果循环体语句是复合语句,一定要用 括起来。,(3) 在循环体语句中应该包含能够使循环趋于结束的操作,以防止出现死循环。,例5.1 编程求1+2+3+100的值。,这是一个求100个数的累加和问题。所加的加数从1变化到100,因此我们可以在循环体中设计一个整型变量i,使它的初值为1,每循环一次使i的值增1,一直循环到i的值超过100为止,用这个方法就解决所需的加数问题。,要解决求累加和的问题,还要再设计一个变量sum用来存放这100个数的和值,先求0+1的和并将其放在sum中,然后把sum中的数加上2再存放在sum中,依次类推。,在这里,sum累加的过程要放在循环体中,由计算机来判断所加的数是否已经超过100。,main(), int i, sum;,i=1; sum=0;,while(,i=100,),sum= sum + i,;,i+,;,printf(sum=%dn, sum);,程序运行后的输出结果:,sum=5050,例程序,求1+2+3+100的值,思考:P51例,sum=sum+i*i sum=1e-6), pi=pi+t;,n+=2.0;,s= -s; /*改变符号*/,t=s/n;,pi=pi*4;,printf(pi=%fn,pi);,程序执行后输出以下结果:,小组讨论:,1、程序5-3:求输入的某个数是否为素数。假设是,输出YES,假设不是,输出NO。,素数是指那些大于1,且除了1和它本身以外不能被其他任何数整除的数。如2、3、5、7、11、都是素数;4、6、8、9、那么不是素数。,为了判断某数x是否为素数,最简单的方法是用2、3、4、x-1,这些数逐个去除x,看能否除尽,只要能被其中某一个数除尽,x就不是素数;否那么,假设不能被任何一个数除尽,x就是素数。,实际上只要试除到,就已经可以说明x是否为素数了。这是因为如果小于等于的数都不能除尽x,那么大于的数也不可能除尽x。试除到,可以减少循环次数,提高程序的运行效率。,程序代码如下:,#include ,main( ), int i, x, yes, a;,printf(Enter integer number : );,scanf (%d,yes=1;,i=2;,a=(int)sqrt ( (double) x);,while( yes & i2时,进入循环,假设x为素数,yes的值不变,仍为1,假设x能被2的某个数整除,那么x不是素数,使yes的值变为0,并且立即退出循环。退出循环后,if的语句判断yes的值为1时,输出YES,否那么输出NO。,小组讨论:,2、P53,迭代法,5.3 用do-while语句构成的循环,由do-while语句构成的循环称为直到型循环,do-while语句的一般形式为:,do,循环体语句,while(表达式);,do-while语句的执行过程是:先执行循环体语句,再求表达式的值,假设表达式的值为“真(非0数值)那么再执行循环体语句,由此构成循环,直到表达式的值为“假 (数值0)时结束循环。如下图。,试将P51例5。1改为do-while语句结构,注意点:P54,do-while语句,和,while语句,的,区别,在于do-while是,先,执行循环体语句,,,后,判断循环条件,,因此do-while至少要执行一次循环体。,main(), int i, sum;,i=1; sum=0;,do, sum= sum+i;,i+;,while(,if3,f1+f2-f3,f1+f2-f3,f1+f2-f3,图5-1 for循环运算过程,5.4 for语句和用for语句构成的循环,for语句,的,一般形式,为:,for,(,表达式1,;,表达式2,;,表达式3,),循环体语句,for循环语句,的,执行过程,是:,(1) 计算”,表达式1,”的值。,(2) 计算”,表达式2,”的值;,若其值为,非零,,转至,步骤(3),;,若其值为,零,,则转至,步骤(5),。,(3) 执行一次,循环体语句,。,(4) 计算”,表达式3,”;然后转向,步骤(2),,,构成循环,。,(5),结束循环,,执行for循环之后的语句。,for语句的常规使用方法:,“表达式1用来给循环变量赋初值或做一些初始工作;,“表达式2用来作为判断循环是否结束的条件;,“表达式3用来修改循环变量的值,使得循环能够趋于结束。,例如:,for(k=0; k10; k+) printf(*);,以上for循环在一行上输出10个“*号。,for语句的,常规,使用方法例P 56例,main() /*,程序1,*/, int i, sum;,for (,i=1,sum=0,;,i=100,;,i+,),sum= sum + i ;,printf(sum=%dn, sum);,“,表达式1,”是逗号表达式,给循环变量赋初值,做一些,初始工作,准备累加!,判断,循环是否结束!,使,得,循环,能够,趋于结束。,从语法上来讲,三个表达式都可以是任意合法的C表达式,各表达式之间用;隔开,并且这三个表达式都是任选项。,例如:我们可以用for循环语句将例的程序改写为如下几种形式,它们都能正确地求出1+2+3+100的值。,for语句的,非常规,使用方法,main() /*程序2 */, int i=1, sum=0;,for (,;,i=100; i+),sum= sum + i ;,printf(“sum=%dn”, sum);,表达式1省略了!,main() /*程序3 */, int i=1, sum=0;,for (,;,i100,goto,pend,;,pend:,printf(“sum=%dn”, sum);,三个表达式,都被省掉了,!,分隔符“,;,”不能省。,由于没有了,表达式2,,用,goto语句,结束,循环。,main() /*程序5 */, int i, sum=0;,for (,i=1,;,i=100,;,sum=sum+i+,),;,printf(“sum=%dn”, sum);,循环体语句是一个空语句!,注意在,循环体语句,之前,不能有,分号,main(), int i, sum=0;,for (,i=1,;,i=100,;,i+,),;,sum= sum + i ;,printf(sum=%dn, sum);,main(), int i, sum=0;,for (,i=1,;,i=100,;,i+,),;,sum= sum + i ;,printf(sum=%dn, sum);,/,*前面两个程序的执行过程,结果=101,*/,main(), int i, sum=0;,for (,i=1,;,i=100,;,i+,),;,sum= sum + i ;,printf(sum=%dn, sum);,即:循环体语句是一个,空语句,!,例5.4 编程计算多个圆的面积,本例要求计算,5个不同半径的圆面积,,且半径,值的变化,是,有规律,的,从,mm,开始按增,mm,的规律递增,可,直接,用,半径r,作为for语句的,循环控制变量,,每,循环一次,使r的值,增0.5,直到r大于为止。,main( ),float r, s ,pi=3.1416;,for(,r,; ; ),s=pi*r*r ;,printf(r=%3.1fs=%fn, r, s);,试改为:非常规for 结构,变量,r,具有,双重功能,,它既是,循环控制变量,,又是,圆的半径值,,它的值由变化到,循环体共执行,5次,,当r增到时,条件表达式的值为,0,,从而,退出循环,。,5.5 循环结构的嵌套,在一个循环语句的循环体内又完整地包含了另一个循环语句,称为循环嵌套。循环嵌套的书写采用缩进形式.,在编写程序时,,循环嵌套的书写,要采用,缩进形式,,如在例的程序中,,内循环,中的语句应该,比,外循环,中的语句有规律地,向右缩进24列,。,例5.5 循环嵌套的应用-输出九九乘法表。,main ( ),int i, j;,for(i=1; i=9; i+),for(j=1; j= i; j+),printf(%1d*%1d =%2d , i, j , i*j);,printf(n);,程序的运行结果为:,1*1= 1,2*1= 2 2*2= 4,3*1= 3 3*2= 6 3*3= 9,4*1= 4 4*2= 8 4*3=12 4*4=16,5*1= 5 5*2=10 5*3=15 5*4=20 5*5=25,6*1= 6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36,7*1= 7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49,8*1= 8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64,9*1= 9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81,例程序输出的九九乘法表,程序5-7:求n!,即计算123 n的值。,程序代码如下:,main(), int i ,s ,n ; /*变量s放置连乘的积*/,s=1; /*注意:s的初值为1*/,printf(Enter n : );,scanf(%d, /*给n读入值,n表示最后一个因子的值*/,for(i=1; i=n; i+) /*用n作为循环的终值*/,s=s*i;,printf(s=%dn,s);,以上程序执行时,假设给n输入5,变量i和s中值的变化如表5-1所示。,
展开阅读全文