1、C语言可实现循环的语句:用goto 和 if 构成循环 while 语句 do while 语句 for 语句,第五章 循环结构程序设计,5-1. goto语句及用goto构成循环 goto语句一般格式,goto 语句标号;. 标号:语句;,功能:无条件转移语句 说明: 不能用整数作标号 只能出现在goto所在函数内 限制使用goto语句,goto语句及用goto构成循环 说明:,不提倡使用goto语句。对结构化语句,程序控制不好,编译系统也比较混乱。 为什么高级语言还要有goto语句。因为软件系统要向下兼容,用低版本编写的程序可能有goto语句,为了高版本能读懂低版本的程序,因此,要把got
2、o的语法放进来。但是,不提倡大家使用。,例 用if 和goto语句构成循环,求,#include main() int i,sum=0;i=1; loop: if(i=100) sum=sum+i;i+;goto loop;printf(“%d“,sum); ,sum=0+1 sum=1+2=3 sum=3+3=6 sum=6+4 sum=4950+100=5050,5-2. while语句 一般形式:,while(表达式) 循环体语句;,执行流程:,特点:先判断表达式,后执行循环体 功能:条件满足时执行循环体,条件不满足时结束循环体转去执行下一条语句。,说明: 如果刚进入循环体时条件就不满足
3、,则循环体一次也不执行。它相当于一条空语句。 如:while(0) printf(“%dn”,x); 循环条件一定要有不满足的时候,否则将出现“死循环”。 如:while(1) printf(“%dn”,x);,循环体如果包含一个语句以上,应组成复合语句。 如:while(ab) t=a;a=b;b=t; 如不加 ,则while语句的范围只到while后面第一个分号处。,例 用while循环求 (5-1.c),#include main() int i,sum=0;i=1;while(i=100) sum=sum+i;i+;printf(“%d“,sum); ,sum=0+1 sum=1+2=
4、3 sum=3+3=6 sum=6+4 sum=4950+100=5050,例 显示110的平方(5-2.c),#include main() int i=1;while(i=10) printf(“%d*%d=%dn“,i,i,i*i);i+; ,运行结果: 1*1=1 2*2=4 3*3=9 4*4=16 5*5=25 6*6=36 7*7=49 8*8=64 9*9=81 10*10=100,5-3. dowhile语句 一般形式:,do 循环体语句;while(表达式);,执行流程:,特点:先执行循环体,后判断表达式 说明: 至少执行一次循环体 dowhile可转化成while结构,例
5、 用dowhile循环求 (5-3.c),#include main() int i,sum=0;i=1;do sum=sum+i;i+;while(i=100);printf(“%d“,sum); ,例 while和dowhile循环的比较,main() int i,sum=0;scanf(“%d“, ,main() int i,sum=0;scanf(“%d“, ,运行结果: 1 sum=55 再运行一次: 11 sum=0,运行结果: 1 sum=55 再运行一次: 11 sum=11,结论:当 while后面的表达式第一次值为真时,两种循环得到的结果相同;否则,二者结果不相同(指二者具
6、有相同的循环体的情况)。,可以看到,当输入i的值小于或等于10时,二者得到的结果相同。而当i的值大于10时,二者结果就不同了。这是因为此时对while循环来说,一次也不执行循环体,而对dowhile循环语句来说则要执行一次循环体。,while和dowhile循环补充,while 语句用来实现“当型”循环。 do-while语句是先执行循环体,后判断表达式的“当型”循环(因为当条件满足时才执行循环体)。但利用它可以方便的实现“直到型”循环结构。,“直到型”循环结构是表达式为真时结束循环。因此,用do-while语句表示时,应将条件取“反”。,main() int t=1,i=2;do t=t*i
7、;i+; while(i=5);printf(“t=%d“,t); ,“当 i5结束循环”是对同一问题的两种表述方法。,5-4. 用for 语句实现循环,C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。,for语句 一般形式:,for(表达式1 ;表达式2 ;表达式3)循环体语句;,执行流程:,for(i=1 ;i=10 ;i+)sum=sum+i;,执行流程:,循环变量赋初值,循环控制条件,循环体,循环变量增值,for(i=1 ;i=10 ;i+)sum=sum+i;,for语句一般应用
8、形式:,for(循环变量赋初值;循环条件;循环变量增值) 循环体语句; ,说明: for语句可以转换成while结构,表达式1; while(表达式2) 循环体语句;表达式3; ,5-4. 用for 语句实现循环,补充说明: (1) for语句的一般形式中的“表达式1”可以省略,此时应在for语句之前给循环变量赋初值。注意省略表达式1时,其后的分号不能省略。如for(;i=100;i+) sum=sum+i; 执行时,跳过“求解表达式1”这一步,其他不变。,补充说明: (2) 如果表达式2省略,即不判断循环条件,循环无终 止地进行下去。也就是认为表达式2始终为真。 例如:for(i=1; ;i
9、+) sum=sum+i; 表达式1是一个赋值表达式,表达式2空缺。它相当于:i=1;while(1)sum=sum+1;i+;,5-5. 用for 语句实现循环,补充说明: (3) 表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。如:for(i=1;i=100;)sum=sum+i;i+; 在上面的for语句中只有表达式1和表达式2,而没有表达式3。i+的操作不放在for语句的表达式3的位置处,而作为循环体的一部分,效果是一样的,都能使循环正常结束。,5-5. 用for 语句实现循环,补充说明: (4) 可以省略表达式1和表达式3,只有表达式2,即只 给循环条件。如:for
10、(;i=100;) while(i=100) sum=sum+i; 相当于 sum=sum+i;i+; i+; 在这种情况下,完全等同于while语句。可见for语句 比while语句功能强,除了可以给出循环条件外,还可 以赋初值,使循环变量自动增值等。,5-5. 用for 语句实现循环,补充说明: (5) 3个表达式都可省略,如:for(; ;) 语句相当于while(1) 语句即不设初值,不判断条件(认为表达式2为真值), 循环变量不增值。无终止地执行循环体。,5-5. 用for 语句实现循环,补充说明: (6) 表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达
11、式。如: for (sum=0;i=100;i+) sum=sum+i;表达式3也可以是与循环控制无关的任意表达式。,5-5. 用for 语句实现循环,补充说明:表达式1和表达式3可以是一个简单的表达式,也可以 是逗号表达式,即包含一个以上的简单表达式,中间用 逗号间隔。如: for(sum=0,i=1;i=100;i+) sum=sum+i; 或for(i=0,j=100;i=j;i+,j-) k=i+j;表达式1和表达式3都是逗号表达式,各包含两个赋值 表达式,即同时设两个初值,使两个变量增值.,5-5. 用for 语句实现循环,补充说明:在逗号表达式内按自左至右顺序求解,整个逗号表达 式
12、的值为其中最右边的表达式的值。如:for(i=1;i=100;i+,i+) sum=sum+i; 相当于for(i=1;i=100;i=i+2) sum=sum+i;,5.5 用for 语句实现循环,补充说明: (7) 表达式一般是关系表达式(如i=100)或逻辑表达式(如ab & xy),但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体。,5.5 用for 语句实现循环,补充说明: for(i=0;(c=getchar()!=n;i+=c); 在表达式2中先从终端接收一个字符赋给c,然后判 断此赋值表达式的值是否不等于n(换行符),如 果不等于n,就执行循环体。即不断输入字符,
13、 将它们的ASC码相加,直到输入一个“换行”符为止。 注意:此for语句的循环体为空语句,把本来要在循环 体内处理的内容放在表达式3中,作用是一样的。可见 for语句功能强,可以在表达式中完成本来应在循环体 内完成的操作。,5.5 用for 语句实现循环,补充说明: for( ;(c=getchar()!=n;)printf(%c,c);for语句中只有表达式2,而无表达式1和表达式3。 其作用是每读入一个字符后立即输出该字符,直到输入 一个“换行”为止。请注意,从终端键盘向计算机输入 时,是在按Enter键以后才将一批数据一起送到内存缓 冲区中去的。,运行情况: Computer (输入)
14、Computer (输出) 而不是 CCoommppuutteerr,5-5. 用for 语句实现循环,注意: C语言中的for语句比其他语言(如BASIC,PASCAL) 中的FOR语句功能强得多。可以把循环体和一些与循环控 制无关的操作也作为表达式1或表达式3出现,这样程序 可以短小简洁。但过分地利用这一特点会使for语句显得 杂乱,可读性降低,最好不要把与循环控制无关的内容 放到for语句中。,for循环程序举例,例:国王的小麦。相传古代印度国王舍罕要褒赏聪明能干的宰相达 依尔(国际象棋的发明者),国王问他要什么?达依尔回答说: “国王只要在国际象棋的棋盘第1个格子中放1粒麦子,第2个格
15、子 中放2粒麦子,第3个格子中放4粒麦子,以后按此比例每一格加一 倍,一直放到第64格(国际象棋的棋盘是8*8=64格),我感恩不 尽,其他什么都不要了。”国王想,这有多少?还不容易?于是让 人扛来一袋小麦,但不到一会儿全用没了,再来一袋很快又用完了。 结果全印度的粮食全部用完还不够。国王纳闷,怎样也算不清这笔 帐。现在我们用计算机来算一下。,解题思路: 麦子的总粒数是: 分别计算出每一格的麦子粒数,把它们加起来,就得到总粒数。据 估算,1立方米小麦约有 粒,可以计算出小麦的体积。,#include void main() double p=1,t=1,v;int i;for(i=1;i64;
16、i+) p=p*2; /p是当前格子中的麦子粒数t=t+p; /t是当前麦子总粒数v=t/1.42e8;printf(“total=%en”,t);printf(“volume=%en”,v); ,可以用for语句实现循环,相当于全中国960万平方公里的土地上,全铺满1.3cm厚的小麦,相当于我国几百年的小麦产量。,运行结果: Total=1.844674e+019 Volnme=1.299066e+011,for循环程序举例,例:人口增长预测。据2005年末统计,我国人口为130756万人,如 果人口的年增长率为1%,请计算到哪一年中国总人口超过15亿。,解题思路: 假设原来的人口为p0,则
17、一年后的人口为: p=p0*(1+r) 其中r是年增长率。用此公式依次计算出每年的人口,每 算出一年的人口就检查一下是否达到或超过15亿。如果未 达到或超过15亿,就再计算下一年的人口,直到某一年的 人口达到或超过15亿为止。,#include void main() double p=1.30756e9,r=0.01;int y;for(y=2006;p1.5e9;y+)p=p*(1+r);printf(“year=%d,p=%en”,y-1,p); ,可以用for语句实现循环,运行结果: year=2019,p=1.503007e+009 即到2019年末,中国人口达到15.03007亿。
18、,5-6. 辅助控制语句 break语句 功能:在循环语句和switch语句中,终止并跳出循环体 说明: break只能终止并跳出最近一层的结构 break只能用于循环语句和switch语句,例 break举例:输出圆面积,面积大于100时停止(5-4.c),#include #define PI 3.14159 main() int r;double area;for(r=1;r100)break;printf(“r=%d,area=%.2fn“,r,area); ,例 小写字母转换成大写字母,直至输入非字母字符.(5-5.c),#include main() char c;while(1)
19、 c=getchar();if(c=a ,continue语句 功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断 仅用于循环语句中,计算100以内能被7或9整除的所有数之和,#include void main() int i,sum=0;for(i=1;i=100;i+) if(i%7!=0,运行结果:sum=1266,在for语句的循环体中使用break和continue语句。,/*5-6.c*/ #include main() int i;for(i=1;i=100;+i)if(i=5) continue;printf(“%dn”,i);if(i=10) b
20、reak; ,结果:1 2 3 4 6 7 8 9 10,循环的嵌套 一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。 三种循环可互相嵌套,层数不限 外层循环可包含两个以上内循环,但不能相互交叉 嵌套循环的执行流程,(1) while() while() .,(2) do do while( );.while( );,(3) while() do while( );.,(4) for( ; ;) do while();while() . ,for(h=0;h=23;h+)for(m=0;m=59;m+)for(s=0;s=59;s+),循环的嵌套,for(h=0;h=23;h+)for
21、(m=0;m=59;m+)for(s=0;s=59;s+),for(h=0;h=23;h+)for(m=0;m=59;m+)for(s=0;s=59;s+),循环的嵌套,例 循环嵌套,输出九九表(5-7.c),#include main() int i,j;for(i=1;i=9;i+)for(j=1;j=9;j+)printf(“%2d*%2d=%2d”,i,j,i*j);printf(“n”); ,5-7 几种循环的比较,(1)四种循环都可以用来处理同一问题,一般情况下它们可以互相代替。但一般不提倡用goto型循环。 (2)在while循环和do-while循环中,只在while后面的 括
22、号内指定循环条件,因此为了使循环能正常结束,应在循环体中包含使循环趋于结束的语句(如i+,或i=i+1等)。for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用while循环能完成的,用for循环都能实现。,5-7 几种循环的比较,(3)用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。(4)while循环、do-while循环和for循环,可以用break语句跳出循环,用continue语句结束本次循环。而对用got
23、o语句和if语句构成的循环,不能用break语句和continue语句进行控制。,程序举例,例 求Fibonacci数列:1,1,2,3,5,8,的前40个数,#include void main() long int f1,f2;int i;f1=1;f2=1;for(i=1;i=20;i+)printf(“%12ld%12ld”,f1,f2);if(i%2=0) printf(“n”);f1=f1+f2;f2=f2+f1; ,例 求Fibonacci数列:1,1,2,3,5,8,的前40个数(5-8.c),例 判断m是否素数(5-9.c),#include #include Void ma
24、in() int i,m,k;printf(“enter a integer number:”)scanf(“%d”, ,例 译密码,例如 Hello,world! 译成密码:Lipps,asvph!,#include void main() char c;while (c=getchar()!=n)if(c=a ,例 译密码(5-10.c),练习题,1.以下程序的输出结果是( ) #include “stdio.h” void main() int num=0;while(num=2) num+; printf(“%dn”,num); 1 (B) 1 (C) 1 (D) 12 2 23 34
25、,C,练习题,2.以下程序的输出结果为 #include “stdio.h” void main() int x=15;while(x10,17,练习题,3.执行以下程序段的输出结果是( )int x=3;do printf(“%dn”,x-=2); while(!(-x); 1 (B) 3 0 (C) 1 -2 (D) 死循环 4.假定a和b为int型变量,则执行以下语句后b的值为( )a=1; b=10;do b-=a; a+; while(b-0); 9 (B) -2 (C) -1 (D) 8,C,D,练习题,5.以下程序的输出结果是( ) main() int i,j,m=0,n=0;
26、for(i=0;i=i) m=1;n+;printf(“%d”,n); 4 (B) 2 (C) 1 (D) 0,C,练习题,6.以下程序的输出结果是( ) main() int x=10,y=10,i;for(i=0;x8; y=+i)printf(“%d %d”,x-,y); 10 1 9 2 (B) 9 8 7 6 (C) 10 9 9 0 (D) 10 10 9 1,D,练习题,7.以下程序的输出结果是( ) main() int i,j,x=0;for(i=0;i2;i+)x+;for(j=0;j3;j+) if(j%2) continue; x+; x+; printf(“x=%dn
27、”,x); x=4 (B) x=8 (C) x=6 (D) x=12,B,作 业,设每只母鸡值3元,每只公鸡值2元,每只小鸡 值0.5元。现要用100元钱买100只鸡,设计买鸡 方案。(用for循环写程序),解题思路:设买母鸡i只,公鸡j只,小鸡k只。 首先,考虑到母鸡3元一只,因此,母鸡最多只能买33只,即外循环只需要从0到33就可以了。其次,考虑到公鸡2元一只,因此,公鸡最多只能买50只,又考虑到对公鸡的列举放到第二层for循环中,此时已经买了i只母鸡,所以公鸡最多只能买(100-3i)/2只,即第二层for循环只需从0到50-1.5i就可以了。此时,买小鸡数为k=100-i-j。,#include “stdio.h“main() int i,j,k;for (i0; i33; i)for (j0; j501.5*i; j) k100ij;if (3*i2*j0.5*k100.0)printf(“%5d%5d%5dn“,i,j,k);,运行结果如下:2 30 685 25 708 20 7211 15 7414 10 7617 5 7820 0 80,设每只母鸡值3元,每只公鸡值2元,每只小鸡 值0.5元。现要用100元钱买100只鸡,设计买鸡 方案。(用for循环写程序) 设买母鸡i只,公鸡j只,小鸡k只,