《C语言程序设计》课程教案表授课题目第三章程序的控制结构(6)——循环结构while和do-while课时安排2授课时间教学目的和要求1.掌握:while语句、do-while语句2.熟悉:三种循环语句教学内容1.基本内容:(1)while语句(2)do-while语句(3)for语句2.重点:三种循环语句讲课进程和时间分配1、问题引入:回顾if语句和for语句。(15分钟)2、while语句(35分钟)(1)while语句•格式:while(条件表达式)语句序列;执行过程:先计算while后面的表达式的值,如果其值为“真”则执行循环体,在执行完循环体后,再次计算while后面的表达式的值,如果其值为“真”则继续执行循环体,如果表达式的值为假,退出此循环结构。说明:1)循环体可以是一条简单的语句,也可以由多个语句组成。若是2个语句以上必须用{}括起来,形成复合语句。2)在循环体中应有使循环趋向于结束的语句,即设置改变循环条件的语句。3)while语句又称“当型”循环结构。其特点是先判断表达式的值,然后执行循环体中的语句。如果表达式的值一开始为假(值为0),则直接执行循环体下面的语句。思考;如何求1+2+3+4+……100=?算法1:直接写出算式(用变量sum存放和)sum=1+2+3+4+5+…+100考虑:1+2+3+…+100可以改写为:(((1+2)+3)+…+100),sum=0;sum=sum+1;sum=sum+2;sum=sum+3;…sum=sum+100;规律:每一步都是两个数相加,加数总是对上一步加数增加1后参与本次加法运算,被加数总是上一步加法运算的和。可以考虑用一个变量i存放加数,一个变量sum存放上一步的和。那么每一步都可以写成:sum+i根据规律上述式子可以改成:sum=sum+i,i=i+1sum=sum+i,i=i+1sum=sum+i,i=i+1规律:若i小于或等于100重复执行该算式循环条件循环体算法2:分析:设想用sum作为累加器,初值为0,利用sum+=i(i依次取值为1、2。。100)此分析需要解决的3个问题:1)sum=0,i=1;2)每执行一次sum+=i后,i增1(i=i+1);3)判断如果i小于或等于100,重新执行步骤(2),否则停止计算main(){inti,s=0;i=1;while(i=100)/*i=100为循环条件*/{s=s+i;i++;/*改变i的值*/}printf(″s=%d″,s);}运行结果:s=5050说明:循环结构的三个术语:1、循环条件:循环结构中的条件表达式如while(i=100)其中,i100就是循环条件。2、循环体:在每个循环周期均要执行一次的语句序列。如while下用{}括起来的语句序列。3、循环控制变量:能够决定控制条件是真是假的量。如while(i=100)中的变量i要写出一个正确的循环结构,对控制变量要做三方面的工作:1、对循环控制变量赋初值。2、将循环控制变量写入正确的控制条件。3、对循环控制变量值的更新。使用while语句需要注意以下几点:while语句的特点是先计算表达式的值,然后根据表达式的值决定是否执行循环体中的语句。因此,如果表达式的值一开始就为“假”,那么循环体一次也不执行。当循环体为多个语句组成,必须用{}括起来,形成复合语句。在循环体中应有使循环趋于结束的语句,以避免“死循环”的发生。下列情况,退出while循环条件表达式不成立(为零)循环体内遇break,goto无限循环:while(1)循环体;例:分析程序的运行结果#includestdio.hmain(){inti=1,sum=0;while(i=100)printf(“i=%d,sum=%d\n”,i,sum+=i);printf(“sum=%d\n”,sum);}结果:程序将不停的打印“i=1,sum=...”。无法正常终止的程序,称为“死循环”。结论:在while语句循环体中,一定要有能够对循环控制条件产生影响的语句。避免出现“死循环”现象。例显示1~10的平方#includestdio.hmain(){inti=1;while(i=10){printf(%d*%d=%d\n,i,i,i*i);i++;}}运行结果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=100练习:对下列程序段叙述正确的是[]。intk=0;while(k=0)k=k-1;A)while循环执行10次B)无限循环C)循环体一次也不被执行D)循环体被执行一次下面程序的运行结果是_______________。main(){ints=0,i=1;while(s=10){s=s+i*i;i++;}printf(“%d”,--i);}A)4B)3C)5D)6对以下程序段,描述正确的是________________。intx=0,s=0;while(!x!=0)s+=++x;printf(“%d”,s);A)运行程序段后输出0B)运行程序段后输出1C)程序段中的控制表达式是非法的D)程序段循环无数次下面程序段的运行结果是[]。intn=0;while(n++=20);printf(“%d”,n);A、20B、21C、22D、23定义inta=10;下列循环的输出结果是_______________。while(a7){a--;printf(“%d”,a);}A)1098B)987C)10987D)98763、do…while语句(20分钟)dowhile语句的一般形式:格式:do{〈语句〉}while(表达式);功能:先执行〈语句〉,后判断表达式的值。执行过程:先执行一次指定的语句,然后判断表达式的值,当表达式的值为非零(“真”)时,返回重新执行该语句,如此反复,直到表达式的值等于0为止,此时循环结束。结构流程图如图5-3所示。说明:1)循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现;2)dowhile语句与while语句都是循环语句,但有区别,dowhile语句先执行一次循环体,然后再回去判断条件是否成立,比while语句多执行一次。该语句用来实现“直到型”循环结构。例:计算1+2+…+100=?main(){inti=1,sum=0;do{sum=sum+i;i++;}while(i=100);printf(“thesumis:%d”,sum);}例:求正整数5的阶乘(即求5!)。main(){floatfact=1.0;inti=1;do{fact=fact*i;i++;}while(i=5)printf(“the5!is:%f”,fact);}说明:do-while循环,总是先执行一次循环体,然后再求表达式的值,因此,无论表达式是否为“真”,循环体至少执行一次。do-while循环与while循环十分相似,它们的主要区别是:while循环先判断循环条件再执行循环体,循环体可能一次也不执行。do-while循环先执行循环体,再判断循环条件,循环体至少执行一次。其它:复合语句{},避免死循环要求同while循环。练习:以下程序段的执行结果是()main(){inty=4;do{y--;}while(--y);printf(“%d\n”,y--);}A)-1B)1C)2D)0以下程序段的执行结果是()main(){inta=1;b=10;do{b-=a;a++;}while(b--0);printf(“%d,%d\n”,a,b);}A)3,11B)2,8C)1,-1D)4,9以下说法正确的是()x=1;do{x=x*x;}while(!x);A)无限循环B)循环执行两次C)循环执行一次D)有语法错误4、总结(10分钟)学过的三种循环语句•循环结构的基本组成部分(小结)•循环变量、条件(状态)的初始化•循环变量、条件(状态)检查,以确认是否进行循环•循环变量、条件(状态)的修改,使循环趋于结束(循环体中)•循环体处理的其它工作。2、三种循环的比较•循环变量初始化:while和do-while循环,循环变量初始化应该在while和do-while语句之前完成;而for循环,循环变量的初始化可以在表达式1中完成。•循环条件:while和do-while循环只在while后面指定循环条件;而for循环可以在表达式2中指定。•循环变量修改使循环趋向结束:while和do-while循环要在循环体内包含使循环趋于结束的操作;for循环可以在表达式3中完成。•for循环可以省略循环体,将部分操作放到表达式2,表达式3中,for语句功能强大。•while和for循环先测试表达式,后执行循环体,而do-while是先执行循环体,再判断表达式。(所以while,for循环是典型的当型循环,而do-while循环可以看作是直到型循环)。•三种基本循环结构一般可以相互替代,不能说哪种更加优越。具体使用哪一种结构依赖于程序的可读性和程序设计者个人程序设计的风格(偏好)•对计数型的循环或确切知道循环次数的循环,用for比较合适,对其它不确定循环次数的循环,许多程序设计者喜好用while/do-while循环5、多重循环(10分钟)•一个循环结构程序的循环体包含另一个循环。形如:for(){for(){}}例5.12】求出1---100间的全部素数。提示:①素数(质数)是除了1和它本身以外,不能够被其它数除尽的数,例3,5,7,11……while(){while(){}}while(){for(){}}等;②判断一个素数:数m用2~m-1除,若都除不尽,则m是素数。程序代码:main(){intm,n=0,i,k;for(m=1;m=100;m=m+2){if(n%10==0)printf(\n);/*每行打印10个数*/for(i=2;im;i++)•if(m%i==0)break;/*若有一个能除尽,终止内循环*/•if(i=m)/*若是素数应i=m*/•{printf(%5d,m);•n++;•}}}讨论、思考题、作业:实验指导书习题参考资料(含参考书、文献等):叶斌陈世强.C语言程序设计.北京:科学出版社授课类型:理论课讨论课□实验课□练习课□其他□教学方式:传统授课双语□讨论□示教□指导□其他□教学资源:多媒体模型□实物□挂图□音像□其他□