1、C语言程序设计,循环结构是结构化程序设计三种基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。几乎所有实用的程序都包含循环。 熟练掌握选择结构和循环结构的概念及使用,是程序设计的最基本的要求。 C语言中循环包括: while语句 do-while语句 for语句 goto语句和if语句配合,循环结构程序设计,C语言程序设计,5.1 循环概述,引例: 输入30名同学的成绩,计算全体同学的平均分。 思路1:int x1,x2,x3,x30;int sum;scanf(“%d,%d%d”,循环结构程序设计,C语言程序设计,思路2: 输入第1个同学的成绩,送x; x送s中; 输入
2、第2个同学的成绩,送x; x+s送s中; 输入第30个同学的成绩,送x; x+s送s中; 输出s/30.0,即平均分。,scanf(“%d”,s+=x;,0. 0送s;,x+s送s中;,循环结构程序设计,C语言程序设计,思路3: s=0 重复30次: 读数据,送x s+x送s 输出s,读数据,送x s+x送s,循环结构程序设计,C语言程序设计,语法格式为: while(表达式) 语句 执行过程:,5.2 while语句 “当型”循环,循环结构程序设计,C语言程序设计,引例输入30名同学的成绩,计算全体同学的平均分。 main() int i,s,x;s=0; i=1;while(i=30) s
3、canf(“%d”, ,循环结构程序设计,C语言程序设计,例5.1 求1+2+3+4+5的和。 分析:对引例的算法进行修改 main() int i,s;i=1;s=0;while(i=5) s+=i;i+;printf(“Sum=%dn”,s);,循环结构程序设计,s,5,s+=i,C语言程序设计,运行过程分析:变量跟踪表 例5.1 求1+2+3+4+5的和。main() int i,s;i=1;s=0;while(i=5) s+=i;i+;printf(“Sum=%dn”,s);,循环结构程序设计,i s,1,0,2,1,3,3,6,4,10,5,15,6,C语言程序设计,循环的控制:循环
4、变量 例5.1 求1+2+3+4+5的和。main() int i,s;i=1;s=0;while( i = 5) s+=i;i+;printf(“Sum=%dn”,s);,循环结构程序设计,C语言程序设计,例5.2 求5!,即求12345的积。main() int i,p;i=1;p=1;while(i=5) p*=i;i+;printf(“5! =%dn”,p);,循环结构程序设计,i p,1,1,2,1,3,2,6,4,24,5,120,6,C语言程序设计,例5.3 求1!+2!+3!+4!+5!之和。main() int i,p,s;i=1;p=1;s=0;while(i=5) p*=
5、i; s+=p;i+;printf(“Sum =%dn”,s);,循环结构程序设计,i p s,1,1,2,1,3,2,6,4,24,5,120,6,0,1,3,9,33,153,C语言程序设计,main() int i=1,s=0;while( i _ ) _printf(“Sum=%dn”,s);,例5.4 求100以内的奇数之和,即求:1+3+5+99的和。,循环结构程序设计, 100,s+=i;,i+=2;, 100,if(i%2!=0) s+=i;,i+;,= 50,s+=2*i-1;,i+;,C语言程序设计,语法格式为:do 语句 while(表达式); 执行过程:,5.3 do-
6、while语句 “直到型”循环,循环结构程序设计,C语言程序设计,例5.5 求1+2+3+4+5的和。main() int i,s;i=1;s=0;do s+=i;i+; while(i=5);printf(“Sum=%dn”,s); 运行过程分析:变量跟踪表,循环结构程序设计,i s,1,0,2,1,3,3,6,4,10,5,15,6,C语言程序设计,例5.6 while与do-while的比较:求1+2+3+4+5的和。 用while语句 用do-while语句 main() int i,s=0;i=6;while( i = 5) s+=i;i+;printf(“Sum=%dn”,s);
7、,循环结构程序设计,main() int i,s=0;i=6;do s+=i;i+; while(i=5);printf(“Sum=%dn”,s); ,运行结果:Sum=0,运行结果:Sum=6,C语言程序设计,语法格式为: for(表达式1;表达式2;表达式3) 语句 执行过程:,5.4 for语句“计数式”循环,循环结构程序设计,C语言程序设计,例5.7 用for语句求1+2+3+4+5的和。main() int i,s=0;for(i=1; i =5; i+)s+=i;printf(“Sum=%dn”,s);,循环结构程序设计,C语言程序设计,说明: 表达式1和表达式3既可以是简单的表达
8、式,也可以是逗号表达式;可以与循环变量有关,也可以无关。 求1+2+3+4+5,可以写成如下几种形式: (1)for( i=1, s=0; i=5; i+ ) s=s+i; (2)for(i=1; i=5; s=s+i, i+ ); (3)for( i=1, s=0; i=5; s=s+i,i+ ); (4)for( s=0; i=5; i+ ) s=s+i;,循环结构程序设计,C语言程序设计,for语句中的三个表达式可以全部或部分省略,但分号“;”不能省。如: i=1; for(;i=5;i+) s=s+i; for(i=1;i=5;)s=s+i+; i=1; for(;i=5;) s=s+
9、i+; for(i=1; ;i+) s=s+i; for(;),循环结构程序设计,省略表达式1,省略表达式3,省略表达式1、3,省略表达式2,省略表达式1、2、3,相当于常量1,即为“永真”条件,相当于while(1),C语言程序设计,5.5 break和continue语句,break语句 语法格式: break;例5.9 求1+2+3+4+5的和。用break语句解决“永真”循环,循环结构程序设计,C语言程序设计,continue语句 语法格式: continue;例5.10 输入5个成绩数据求平均成绩。对非法成绩(不在0,100之间)数据要求重新输入。,循环结构程序设计,C语言程序设计,
10、5.6 多重循环,在一个循环中又包含了另一个循环,称多重循环(也称循环的嵌套)。实现多重循环结构仍使用前面讲的三种循环语句。,循环结构程序设计,C语言程序设计,例5.11 用双重循环改写例5.3:求1!+2!+5! main() int i,j,p,s=0;for(i=1;i=5;i+) /* 外循环 */ p=1;for(j=1;j=i;j+) /* 内循环 */p=p*i;s=s+p;printf(“Sum=%dn”,s);,循环结构程序设计,C语言程序设计,例5.12 打印图示的三角形图案。 分析: 每一行由空格、星号和回车组成。 它们之间的关系:,循环结构程序设计,printf(“*”
11、);,for(j=1;j=5;j+),输出1个星号,输出5个星号,i,6-i,2*i-1,C语言程序设计,例5.13 人口增长问题。按年2%的增长速度,现有12亿人,多少年后人口将达到或超过14亿。 分析:,循环结构程序设计,0,12,1,2,12*1.02,12*1.02*1.02,3,12*1.02*1.02*1.02,m,m*1.02,m,m*1.02,m,m*1.02,m,m14,n,n+,y,输出n,5.7 综合应用举例,C语言程序设计,例5.14 验证素数。 分析:素数:是指这个数只能被1和它本身整除。7是素数:它只能被1和7整除;8不是素数:除了1和8之外,还能被其它数(如2)整
12、除。判断m是否为素数,是要验证m是否能被2m-1之中的一个数n整除即可。若n存在,则m不是素数;否则m为素数。,循环结构程序设计,C语言程序设计,例5.15 打印100200之间的全部素数,每行10数据。 分析:只要把上例中从键盘输入的m由程序产生即可(从100变到200)。每得到一个素数,使一计数器加1。当计数器的值为10的倍数时,输出换行。,循环结构程序设计,C语言程序设计,例5.16 百钱买百鸡:分析:这是一个不定方程 。,循环结构程序设计,鸡翁一值钱五,,鸡母一值钱三,,鸡雏三值钱一。,百钱买百鸡,,问鸡翁、母、雏各几何?,cocks,hens,chicks,1cocks18,1hen
13、s32,1chicks98,1,1,若成立,得一组解,2,C语言程序设计,第5章作业,5.1 求2 + 4 + 6 + 8 + + 50。 5.2 求自然数e = 1 + 1/2! + 1/3! + 1/n! 近似值,控制第n项的值大于10-5时进行求和。 5.3 计算sin(x)=x - x3/3! + x5/5! - x7/7! +,直到最后一项的绝对值小于10-6时停止计算,x由键盘输入。 5.4 输入10个数,找出其中的最大值。 5.5 输入20个数,统计其中正、负和零的个数。 5.6 输入一行字符,分别统计出其中英文字母、空格、数字字符和其它字符的个数。,循环结构程序设计,C语言程序
14、设计,5.7 输入30个成绩数据,统计各分数段(059、6069、7079、8089、90100)的人数、最高分、最低分和平均分。 5.8 求Sa = a + aa + aaa + + aaa(其中最后一项有n个a)之值,其中a是一个数字。例如2+ 22+ 222 +2222 +22222(此时n=5),n由键盘输入。 5.9 输出100999中能被3整除,且至少有一位数字是5的所有整数。 5.10 打印所有“水仙花数”。水仙花数是一个三位数,其各位数字立方和等于该数本身。例如153是一水仙花数,因为153=13+53+33。 5.11 验证在何范围内,勒让德提出的公式:an=n2+n+41是
15、一个计算素数的通项公式。,循环结构程序设计,C语言程序设计,5.12 分别编写程序,打印以下各图案。5.13 搬砖问题:36块砖,36人搬;男搬4、女搬3、两个小孩抬一砖。要求一次全搬完,问男、女、小孩各若干。 5.14 爱因斯坦的阶梯问题:设有一阶梯,每步跨2阶,最后余1阶;每步跨3阶,最后余2阶;每步跨5阶,最后余4阶;每步跨6阶,最后余5阶;只有每步跨7阶,正好到阶梯顶。问共有多少阶梯。,循环结构程序设计,C语言程序设计,5.15 换零钱。将一张100元的大钞票,兑换成10元、5元、2元、1元的小钞票。要求每种小钞票至少一张。有多少种兑换方法?如何兑换? 5.16 印度国王的奖励。相传古代印度国王要褒奖他的聪明能干的宰相达依尔(国际象棋发明者),问他要什么?达依尔回答:“陛下只要在国际象棋棋盘的第一个格子上放一粒麦子,第二格子放二粒麦子,以后每个格子的麦子数都按前一格的两倍计算。如果陛下按此法给我64格的麦子,就感激不尽了。”国王想,“这还不容易!”让人杠了一袋麦子,但很快用光了,再扛一袋还不够,请你为国王算一下共要给达依尔多少小麦?(设1立方米小麦约1.4108颗),循环结构程序设计,