1、第5章 循环结构程序设计,概述计算机解题过程中,经常遇到要编制循环结构的情况, 大量问题均离不开循环结构如求: 1+2+3+.+100sinx = x -,x3 x5 x7,3!,5!,7!,+ ,准备部分,工作部分,控制部分,准备部分,控制部分,工作部分,修改部分,出循环,出循环,N,Y,N,修改部分,Y,两种循环结构:,左边是先执行后判断 右边是先判断后执行,循环语句while 语句格式:while (表达式) 语句功能: 当表达式为非0值时,执行while语句中的内嵌语句。其特点是: 先判断表达式,后执行语句。,表达式值非 0,语句,编程: 求1+2+3+100的值main() int
2、i=1, sum=0; /* 准备部分 */while (i =100) /* 控制部分 */ sum=sum+ i; /* 工作部分 */i=i+1; /* 修改部分 */printf (“sum = %d n“, sum);printf (“i = %d n“, i ); ,说明: 1) 循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现。 2) 在循环体中应有使循环趋向于结束的语句。如果无此语句,则i的值始终不改变,循环永不结束。即形成了死循环。,do while 语句格式: do 语句 while (表达式 ) ;功能:先执行一次指定的循环体语句,然后判别表达式,当表
3、达式的值为非零时,返回重新执行循环体语句,如此反复,直到表达式的值等于0为止,此时循环结束。,表达式值不为0,语句,main( ) int i=1, sum=0;do sum=sum+i;i=i+1;while (i=100);printf(“sum=%dn“, sum);printf(“i=%dn“, i); ,while语句和do-while语句的比较:在一般情况下,用while语句和用do-while语句处理同一问题时,若二者的循环体部分是一样的,它们的结果也一样。但是如果while后面的表达式一开始就为假(0值)时,两种循环的结果是不同的。,while 与 do while区别i10
4、时不同,main() int sum=0, i;scanf(“%d“, ,main() int sum=0,i;scanf(“%d“, ,main() int c;while(c=getchar()!=n)putchar(c); ,将输入的字符原样输出,main() int c;c=getchar();while(c!=n) putchar(c);c=getchar(); ,例:用 0.1mm 厚纸对折, 对折多少次后其厚度超过地球直径 (12742公里) main() int n=1; float ans ;ans=2*1e-7;while(ans=12742) n=n+1;ans=ans*
5、2;printf(“n=%d, ans=%f n“, n, ans);getch(); ,运行结果: n=37,ans=13743.895347,求:框里数字(19):111111=111*11* 1,运行结果:i=9,main() long int i=1, ans;ans=111*11*(i*10+1);while(111111 != ans) i+;ans=111*11*(i*10+1);printf(“i=%dn“, i) ; ,main() long int i=1, ans;do ans=111*11*(i*10+1);i+;while(111111 != ans);printf(
6、“i=%dn“, i-1); ,运行结果: i =9,设有一阶梯,每步阶,最后余阶;每步阶,最后余阶;每步阶,最后余阶;每步阶,最后余阶;每步阶,正好到楼顶。问共有多少阶梯。,main( ) int ladders=7;while (ladders%3!=2 | ladders%5!=4 | ladders%6!=5)ladders+=14;printf(“%dn“, ladders); ,求两个非负整数u和v 的最大公因子(即最大公约数)。,main() int a,b,i;printf(“please enter 2 integers:“);scanf(“%d,%d“, ,for语句格式:
7、 for (; ; ) 语句,C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。,表达式1,表达式2值非0?,语句,表达式3,Y,下一语句,N,等价于: 表达式1; while (表达式2) 语句;表达式3; ,for语句最简单最常用的应用形式:for (循环变量赋初值;循环条件;循环变量增值) 如: for(i=1;i=100;i+) sum=sum+i; 相当于:i=1;while (i=100) sum=sum+i; i+; ,for语句的一般形式中的“表达式1”可以省略,此时应在fo
8、r语句之前给循环变量赋初值。注意省略表达式1时,其后的分号不能省略。如:for(; i=100; i+) sum=sum+i; 执行时,跳过“表达式1” ,其他不变。,若省略表达式2,即不判断循环条件,即认为表达式2始终为真。如:for(i=1; ;i+) sum=sum+i; 相当于:i=1;while(1) sum=sum+1; i+; ,为避免死循环,应加上if (i100) break;,表达式3也可以省略,但此时应保证循环能正常结束。如:for (i=1;i=100;)sum=sum+i; i+; 此时由于省略表达式3,而将语句i+; 作为循环体的一部分,效果是一样的,都能使循环正常
9、结束。,可以同时省略表达式1和表达式3,只有表达式2,即只给循环条件。如:for(;i=100;) while(i=100) sum=sum+i; sum=sum+i;i+; i+; 在这种情况下,完全等同于while语句。可见for语句比while语句功能强,除了可以给出循环条件外,还可以赋初值,使循环变量自动增值等。,也可以将3个表达式都省略,如:for(; ;) 语句相当于while(1) 语句即不设初值,不判断条件(认为表达式2为真值),循环变量不增值。此时应在循环体中设置退出循环的语句。,表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式。如: for (
10、sum=0;i=100;i+) sum=sum+i;表达式3也可以是与循环控制无关的任意表达式。如:for (sum=0;i=100;sum+) i+;,表达式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;,表达式2一般是关系表达式(如i=100)或逻辑表达式(如ab 在表达式2中先从终端接收一个字符赋给c,然后判断此字符是否非n,如果非n,就执行循环体。此for语句的循环体为空语句,把本来要
11、在循环体内处理的内容放在表达式3中。,for( ;(c=getchar()!=n;)printf(“%c”,c);for语句中只有表达式2,而无表达式1和表达式3。其作用是读入一个字符后即输出该字符,直到输入一个“换行”为止。,运行情况: ComputerComputer,请注意,从终端键盘向计算机输入时,是在按Enter键以后才将一批输入数据一起送到内存缓冲区中去的。,main() int i=1, sum=0;for (; i=100; i+)sum += i;printf(“sum=%dn“, sum); 省略表达式1,求: 1 + 2 + 3 + + 100的值,main ( ) in
12、t i, sum;for (i=1, sum=0; i=100; i+)sum+= i;printf(“sum=%dn“, sum); main() int i, sum;for (i=1, sum=0; i=100; sum+=i, i+);printf(“sum=%dn“, sum); ,使用逗号表达式,验证素数 int prime(int n) int m;for (m=2;m=n/2;m+)if (n%m=0) return(0);return(1); main() int i;scanf(“%d“, ,说明 1. 用计数法设置循环时,要特别留心循环变量的“边界值”。 2. 要使循环体
13、最终能结束,应当在表达式3中或在循环体中存在改变条件表达式的值的操作。 3. 循环体内如果包含一个以上的语句,应该使用花括号,以复合语句形式出现。,break和continue break-退出switch语句或当前循环 continue-结束本次循环,接着进行下一次是否执行循环的判定.while(表达式1) if (表达式2) continue;if (表达式3) break; ,计算100以内的圆面积 main()int r;float pi=3.14159,area;for(r=1;r100) break;printf(“r=%d, area=%fn“, r, area); ,输出100
14、200之间不能被3整除的数。 main() int n;for (n=100;n=200;n+) if (n%3=0) continue;printf(“%d “,n); ,多重循环 一个循环体内又包含另一个完整的循环结构称为循环的嵌套,即多重循环。 三种循环结构(while循环、do-while循环和for循环)可以互相嵌套。 注意: 结构之间仅可嵌套, 不可交叉,不允许:,允许:,例: 编程并输出乘法表 main() int i,j;for(i=0; i=9; i+)for(j=1; j=9; j+) printf(“%d*%d=%2d “, i, j, i*j );if (j=9)pri
15、ntf(“n“); ,运行结果: 1*1= 1 1*2= 2 1*9= 99*1= 9 2*9=18 9*9=81,打印乘法表1 2 3 4 5 6 7 8 9 - 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72
16、811: 打印表头 2: 打印隔线 3: 打印表体,main( ) int i, j;for (i=1;i=9; i+)printf(“%4d“,i);printf(“n“);for (i=1;i=40;i+)printf(“%c“,-);printf(“n“);for (i=1; i=9;i+) for (j=1;j=9;j+)printf(“%4d“, i*j);printf(“n“);,打印隔线,打印表体,打印表头,36块砖,36人搬;男4,女3,两个小孩抬一块。求一次搬完,需男、女、小孩个若干? main() int men=0,women,children;while(men=8)
17、women=0;while (women=11) children=36-women-men;if (4.0*men+3.0*women+children/2=36) printf(“nmen is %d“,men);printf(“t women is %d“, women);printf(“t children is %dn“, children); women+; men+;,例: 键入1个正整数, 求这个数的阶乘 main ( ) int num, i1; long int t;scanf(“%d“, ,运行结果: 3 ans=9,for (t=1; i1=1; i1=num;) t=
18、t*i1;i1+; ,t=1; i1=1; do t=t*i1;i1+; while (i=num);,例: 求A, B, 使 AB-BA=45 成立 main() int a, b, k, ans=45;for (a=1; a10; a+)for (b=0; b10; b+) k=(10*a+b)-(b*10+a);if (k=ans)printf(“a=%d, b=%d n“, a, b); ,穷举法,例: 求 A,B,C, 使 ABC+BCC=532 成立 main() int a, b, c, k, ans=532;for (a=0; a10; a+)for (b=0; b10; b+
19、)for (c=0; c10; c+) k=(100*a+10*b+c)+(b*100+c*10+c);if (k=ans)printf(“a=%d,b=%d,c=%dn“,a,b,c); ,穷举法,例.编程产生 main() int i, j;for (i=2; i5; i+) for (j=2; j5; j+)printf(“%2d “, i*j);if (j=5)printf(“n“);,4 6 86 9 12 8 12 16,计算水仙花数 (如:153=1*1*1+5*5*5+3*3*3) main() int i, j, k, n;for (n=100; n1000; n+) i=n
20、/100;j=n/10 - i*10;k=n%10;if (i*100+j*10+k=i*i*i+j*j*j+k*k*k)printf(“%dt“, n);printf(“n“); ,数的分解,求Fibonacci数列前40个数。 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; ,递推法,求 sinx=x -main( ) int f, i, j, n=1;float x, s, y, t;s
21、canf(“%f“, ,x3 x5 x7,3!,5!,7!,+ ,前10项,+,-,累加法,用/41-1/3+1/5-1/7+求的近似值,直到某一项的绝对值小于10-6为止。 #include #include void main() int s;float n,t,pi;t=1;pi=0;n=1.0;s=1;while(fabs(t)1e-6) pi=pi+t; n=n+2; s=-s; t=s/n;pi=pi*4;printf(“pi=%10.6fn“,pi); ,累加法,译密码。为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。如:可以按以下规律将电文变成密码:将字母A变成字母E,a变成e,即变成其后的第4个字母,W变成A,X变成B,Y变成C,Z变成D。,void main() char c;while(c=getchar()!=n) if(c=a ,