第五章循环控制结构学习内容:3、while循环5、for循环6、循环的嵌套4、do-while循环7、几种循环结构的比较1、循环控制概述2、goto语句和goto循环重难点:2、break、continue语句。1、while语句、do-while语句和for语句及三种循环之间嵌套和区别。学习目标:2、掌握break、continue语句的功能和用法。1、熟练掌握while、do-while和for语句及三种循环之间的嵌套和区别。8、辅助控制语句9、循环结构程序设计举例5.1循环控制概述引例:给出N个儿童的体重,要求计算平均体重#defineN10#include“stdio.h”main(){/*定义变量存放某儿童体重、总体重和平均体重*/floatWeight,total=0,aver;*输入N个儿童的体重并计算总体重*/scanf(“%f”,&Weight);/*第1个儿童的体重*/total=total+Weight;/*前1个儿童的总体重*/scanf(“%f”,&Weight);/*第2个儿童的体重*/total=total+Weight;/*前2个儿童的总体重*/scanf(“%f”,&Weight);/*第3个儿童的体重*/total=total+Weight;/*前3个儿童的总体重*/scanf(“%f”,&Weight);/*第4个儿童的体重*/total=total+Weight;/*前4个儿童的总体重*/scanf(“%f”,&Weight);/*第5个儿童的体重*/total=total+Weight;/*前5个儿童的总体重*/scanf(“%f”,&Weight);/*第6个儿童的体重*/total=total+Weight;/*前6个儿童的总体重*/scanf(“%f”,&Weight);/*第7个儿童的体重*/total=total+Weight;/*前7个儿童的总体重*/scanf(“%f”,&Weight);/*第8个儿童的体重*/total=total+Weight;/*前8个儿童的总体重*/scanf(“%f”,&Weight);/*第9个儿童的体重*/total=total+Weight;/*前9个儿童的总体重*/scanf(“%f”,&Weight);/*第10个儿童的体重*/total=total+Weight;/*10个儿童的总体重*/aver=total/N;/*10个儿童的平均体重*/printf(“%d个儿童的平均体重是:%.2\n”,N,aver);}#defineN10#include“stdio.h”main(){/*定义变量存放某儿童体重、总体重和平均体重*/inti;floatWeight,total=0,aver;*输入N个儿童的体重并计算总体重*/for(i=1;i=N;i++){scanf(“%f”,&Weight);/*第i个儿童的体重*/total=total+Weight;/*i个儿童的总体重*/}aver=total/N;/*10个儿童的平均体重*/printf(“%d个儿童的平均体重是:%.2\n”,N,aver);}循环结构是结构化程序设计的基本结构之一。C语言中的循环结构可以用以下语句实现:1.while循环2.do-while循环3.for循环5.3while循环一、while语句的语法格式:while(表达式)循环体while循环控制流程图表达式循环体非00二、执行过程:1.计算while后圆括号内表达式的值,为非0则执行第②步,否则执行第③步;2.执行循环体,然后返回第①步;3.结束循环,执行while语句的下一语句。例6-2:从键盘输入正整数n,求1+2+3+...+n。#includestdio.hvoidmain(){intn,i,sum=0;scanf(“%u”,&n);i=1;while(i=n){sum+=i;i++;}printf(“1—%usum=%d,n,sum);}#includestdio.hmain(){unsignedn,i=1;longfactorial=1;scanf(“%u”,&n);while(i=n){factorial=factorial*I;i++;}printf(“%u!=%ld”,n,factorial);}例6-3:从键盘输入正整数n,求n!三、while语句的功能:当表达式为非0时重复执行循环体。四、注意事项:1.while语句的特征是”先判断后执行”;允许0次循环。2.如果循环体包含一个以上的语句,那么应该用复合语句“{}”的形式。例如,程序段1:sum=i=0;while(i10)++i;sum+=i;程序段2:sum=i=0;while(i10){++i;sum+=i;}想一想执行程序段1和程序段2后i、sum的值?3.在循环体中应有使循环趋于结束的语句。考虑以下while循环的执行情况:i=1;sum=0;while(i10)sum+=i;i=1;sum=0;while(i10){sum+=i;++i;}作业:1.从键盘输入两个正整数,求出它们的最大公约数和最小公倍数。要求:(1)使用while语句实现;(2)输出要说明信息,其形式为:最大公约数=具体值,最小公倍数=具体值。2.计算并输出100~999中的水仙花数(若3位数的各位数立方之和等于该数本身,则称该3位数为水仙花数)。(1)使用while语句实现;(2)注意输出数据的格式控制。3.假设公鸡每只5元,母鸡每只3元,小鸡三只1元,现有100元,要求买100只鸡,问公鸡、母鸡和小鸡各多少只?要求:(1)使用while语句的嵌套形式实现;(2)输出要有说明信息。5.4do-while循环一、do-while语句的语法格式:do循环体while(表达式);循环体语句表达式真假do-while循环控制流程图二、执行过程:1.执行循环体;2.求解while后圆括号内的表达式,若为非0则返回第1步;否则执行第3步;3.结束循环,执行do-while语句的下一语句。例6-4:从键盘输入正整数n,求1+2+3+...+n。#includestdio.hvoidmain(){inti=1;unsignedn,sum=0;scanf(“%u”,&n);do{sum+=i;i++;}while(i=n);printf(“1—%d\’sum=%u,n,sum);}3、do-while语句的功能:执行循环体,直到表达式为0。#includestdio.hmain(){unsignedn,i=1;longfactorial=1;scanf(“%u”,&n);do{factorial=factorial*i;i++;}while(i=n);printf(“%u!=%ld”,n,factorial);}例6-5:从键盘输入正整数n,求n!四、注意事项:1.do-while语句的特征是“先执行,后判断”;循环体最少执行一次。2.对于同一个问题,既可以用while语句,也可以用do-while语句处理。3.特别要注意while后加分号;4.while和do-while循环的比较:unsignedn,i=1,sum=0;scanf(“%u”,&n);while(i=n){sum+=i;i++;}unsignedn,i=1,sum=0;scanf(“%u”,&n);do{sum+=i;i++;}while(i=n);作业:1.从键盘输入两个正整数,求出它们的最大公约数和最小公倍数。要求:(1)使用do-while语句实现;(2)输出要有字说明,其形式为:最大公约数=具体值,最小公倍数=具体值。2.计算并输出100~999中的水仙花数(若3位数的各位数立方之和等于该数本身,则称该3位数为水仙花数)。(1)使用do-while语句实现;(2)注意输出数据的格式控制。3.从键盘输入80个字符,统计其中的空格、+、-、*、/、英文字母和其他字符的个数。要求:(1)使用do-while语句的嵌套形式实现;(2)输出要有说明信息。5.5for循环一、for语句的语法格式:for(表达式1;表达式2;表达式3)循环体二、说明:2.循环体由语句构成,以实现某种功能。1.表达式1和表达式3是算式表达式,表达式2是条件;for(i=1,sum=0;i=100;i++)sum=sum+i;表达式2循环体表达式1表达式3非00for循环控制流程图三、执行过程:1.求解表达式1;2.求解表达式2,若为非0则执行第3步;否则执行第5步;3.执行循环体;4.求解表达式3,然后返回第2步;5.结束循环,执行for语句的下一语句。例6-6:从键盘输入正整数n,求1+2+3+...+n。#includestdio.hvoidmain(){inti;unsignedn,sum=0;scanf(“%u”,&n);for(i=1;i=n;i++)sum+=i;printf(“1—%usum=%d,n,sum);}#includestdio.hmain(){unsignedn,i;longfactorial=1;scanf(“%u”,&n);for(i=1;i=n;++i)factorial=factorial*i;printf(“%u!=%ld”,n,factorial);}例6-7:从键盘输入正整数n求n!四、for语句的功能:当表达式2为非0时重复执行循环体。五、使用for语句的注意事项:1.任意表达式都可省略,但表达式后的分号必须保留:例6-8:求1—100之内偶数和。main(){inti,sum=0;for(i=1;i100;i++)if(i%2==0)sum+=i;printf(“1--100之内偶数=%d”,sum);}省略“表达式1”时,应在for语句之前给循环变量赋初值;i=1;for(;i=100;i++)sum+=i;省略“表达式2”时,编译系统默认表达式2为非0;省略“表达式3”时,应在循环体中修改循环控制变量,以保证循环正常结束.for(i=1;;i++)sum+=i;for(i=1;i=100;){sum+=i;i++;}2.表达式2可以是任何类型,其值理解为逻辑量;3.若表达式2从一开始就为0,那么循环体一次也不执行;4.表达式1可以包含除给循环变量赋初值之外的其他操作;5.表达式3可以做属于循环体的操作;6.逗号表达式的最主要的用处:让程序员使用多个初始化表达式和多个值递增表达式,这在for语句中表现为表达式1和表达式3都是逗号表达式。for(i=1,j=100,sum=0;ij;i++,j--)sum+=i+j;for(i=1,sum=0;i=n;sum+=i++);for(i=1,sum=0;i=n;i++)sum+=i;六、循环语句的使用要点:1.循环体含一个以上语句时,必须以复合语句的形式出现;当循环体为空时不要掉了分号(;)。2.注意循环控制变量的初值及其修改,以保证循环正常执行和正常结束。3.可以在循环体中安排使表达式变为”0”的语句,也可以通过表达式本身实现这种控制功能。for(i=1;i=n;i++)if(!(i%2))sum=sum+i;for(i=1;i=n;){if(!(i%2))sum=sum+i;i++;}4.应避免无限循环、永不执行的循环、执行次数不正确的循环等情况.5.对于嵌套的循环语句,应写成缩进对齐格式,以增加程序结构的清晰感和美感.作业:1.从键盘输入两个正整数,求出它们的最大公约数和最小公倍数。要求:(1)使用for语句实现;(2)输出要有字说明,其形式为:最大公约数=具体值,最小公倍数=具体值。2.计算并输出100~999中的水仙花数(若3位数的各位数立方之和等于该数本身,则称该3位数为水仙花数)。(1)使用for语句实现;(2)注意输出数据的格式控制。3.从键盘输入80个字符,统计其中的空格、+、-、*、/、英文字母和其他字符的个数。要求:(1)使用