第6章第6节 §66循环的嵌套(难点) 概念 循环中又包含另一个(或多个)循环一形成多层循环 二.使用 while,do… while for()均可互相嵌套 1)while() 2)d0 3)for(;;) while( do for while(; while: 4)while) do 内层循环 while(;
第6章 第6节 §6.6 循环的嵌套(难点) 一. 概念 循环中又包含另一个(或多个)循环 多层循环 形成 二. 使用 while , do .... while for( ) 均可互相嵌套 1) while( ) {.... while( ) {....} } 2) do {.... do {...} while( ); } while; 3) for( ; ; ) {.... for ( ; ; ) {...} } 4) while( ) {.... do {....} while( ); } 内层循环
第6章第2节 执行 从外层循环进入内层循环,只有当内层循环执行完后才返回到外层循环 例1P12064求:1+2!+3!+4!+……+10 求∑ 求:10 10 maint int i=l: main long int mul=l fint j=0, Sum=0; while<=10) while(i<=10) tsum=sum+j; tsum=sum*i; printf(“sum=%dm”,sum) printf((“mul=%dⅦm”,mul);} 解 main( double mul, sum=0.0 printi〔“%ld”,sum) t whiles<=10 =1,mul=10; while(i<=j) mulmul 求j i++;} sumsum+mul: i++
第6章 第2节 三. 执行 从外层循环进入内层循环,只有当内层循环执行完后才返回到外层循环 例 1 P120 6.4 10 n 求 n main() { int j=0, sum=0; while(j<=10) {sum=sum+j; j++;} printf(“sum=%d\n”,sum);} main() { int i=1; long int mul=1; while(i<=10) {sum=sum*i; i++;} printf(“mul=%d\n”,mul);} 求: 10! 解: main( ) {double mul, sum=0.0; int i,j=1; while(j<=10) {i=1,mul=1.0; while(i<=j) {mul=mul*i; i++;} sum=sum+mul; j++ } printf(“%ld”,sum); } 求j! 求:1+2!+3!+4!+……+10!
第6章第6节 用for语句 main Double mul, sum=0.0 Int 1, for(j=1:j<=10j++) {mul=1.0 for(i=l; i<=j;i++) mul=muli: 求j sum=sum+mul; printf(“%ld”,sum) 例2打印“九九表” 2*1=22*2=4 3*1=33*2=63*3=9 9*1=99*2=189*3=27…9*9=81 解:有9行,可用for(i=1;i<=9;i++)… 第共有例for〔j=1;j<=i;j+)
第 6 章 第 6 节 用for 语句 main() {double mul, sum=0.0; int i,j; for(j=1;j<=10;j++) {{mul=1.0; for(i=1;i<=j;i++) mul=mul*i; } sum=sum+mul;} printf(“%ld”,sum); } 求j! 例 2 打印“九九表” 1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 ..... 9*1=9 9*2=18 9*3=27 .... 9*9=81 解 : 有 9行, 可用 for(i=1; i<=9; i++) ..... 第 i行共有 i 例 for(j=1;j<=i;j++)
第6章第8节 程序 maint Int 1, J for(i=1;i<=9;i++) {for(=1;j<=i;j++) printf(%d*%d=%d ,i,j, i*j; printf(“n”); §67几种循环的比较 自学 §68 break语句和 continue语句 . break语句 1)用于 switch语句中。作用:从 switch语句中跳出 两种用途 2)用于循环中。 作用:从循环体中跳出,即循环到此为止,不再 执行(中止整个循环)
第6章 第8节 程序 main() { int i, j; for (i=1;i<=9;i++) { for(j=1;j<=i;j++) printf(“%d*%d=%d ”,i,j,i*j); printf(“\n”); } } §6.7 几种循环的比较 ——自学 §6.8 break语句和continue语句 一. break语句 两种用途 1).用于switch语句中。作用:从switch语句中跳出 2).用于循环中。 作用:从循环体中跳出,即循环到此为止,不再 执行(中止整个循环)
第6章第8节 例1任一数值,连续除以3,直到商的绝对值0.001) if(fabs(resul)=0.001) print(“ resul-%r”,resu); break print(“ resul%r”,resu);
第6章 第8节 例1 任一数值,连续除以3,直到商的绝对值≤0.001为止 解: 循环次数不能确定, 可以假设一个大的循环次数 , 在循环体中 引入一个条件, 判断商是否≤0.001, 如成立, 则结束循环。 # include “math.h” main() {float x, resul; long i; printf(“input a data”); scanf(“%f”,&x); resul=x; for(i=1;i0.001) printf(“resul=%f”,resul); }
第6章第8节 二. continuer语句 结束本次循环。即跳过循环体中 continue后面尚未执行的语句, 接着进行下一次是否循环的判断。(跳过一轮循环) 例65将100~200之间不能被3整除的数输出 根据题意,凡能被3整除的数,就不输出。 main(O f int i; for(n=100;n<=200;n++) Rif(%3== continue printf((“%d”,n);
第6章 第8节 二 . continue语句 结束本次循环。即跳过循环体中continue后面尚未执行的语句, 接着进行下一次是否循环的判断。(跳过一轮循环) 例6.5 将100~200之间不能被3整除的数输出 根据题意,凡能被3整除的数,就不输出。 main() { int i; for(n=100; n<=200; n++) {if (n%3= = 0) continue; printf(“%d”,n); } }
第6章第9节 §69程序举例 n个a 例1P12063求Sn=a+a+aaa+…+a.a之值,其中a为一个数值。例如: 2+22+222+2221222时n=5),n由键盘输入。 解:用双重循环 认为:a+a+aa+aa+.… 1000*a+100*a+10来a+a mal int a, n, i,j, t; long suml, sum2 printi“ input a,n=“); scan(“%d,%d”,&a,&n); sumI=0 for(i=l; i<=n;i++) sum2=a; t1; forj=2;j<=i;j++) {tt*10; . sum2=sum2+t*a: 5 suml=suml+sum2 printf(“ resulte=%ld”,sum1);
第6章 第9节 §6.9 程序举例 例1 P120 6.3 求Sn=a+aa+aaa+...+aa....a 之值,其中a为一个数值。例如: 2+22+222+2222+22222(此时n=5), n由键盘输入。 n个a 解: 用双重循环 认为: a+aa +aaa+aaaa+..... 1000*a+100*a+10*a+a main() {int a , n, i, j, t; long sum1,sum2; printf(“input a,n=“); scanf(“%d,%d”,&a,&n); sum1=0; for(i=1;i<=n;i++) { sum2=a;t=1; for(j=2;j<=i;j++) {t=t*10; sum2=sum2+t*a;} sum1=sum1+sum2; } printf(“resulte=%ld”,sum1); }
第6章第9节 用单层循环 认为:a+a+a+aa+. 第二项aa*10+a 第一项a*10+a main fint a, n, i: long sum, term; printf(“ input a,n=“); scanf(“%d,%d”,&a,&n); sum=O: term=0 for(i=l; i<=n; 1++) i term=term*10+a; sum=sutter: printi(“ resulte=%ldⅦn”,sum);
用单层循环 认为: a+aa +aaa+aaaa+..... 第二项aa*10+a 第一 项a*10+a main() {int a, n, i; long sum, term; printf(“input a,n=“); scanf(“%d,%d”,&a,&n); sum=0;term=0; for(i=1; i<=n; i++) { term=term*10+a; sum=sum+term; } printf(“resulte=%ld\n”,sum); } 第6章 第9节
第6章第9节 用单层循环 认为:a+aa+:a+aa+… a÷100+第二项 a*10+第一项 maint fint a, n, i: long sum, term; printf(“ input a,n=“); scanf(“%d,%d”,&a,&n); sum=O: term=0 for(i=l; i<=n; 1++) term=terma; sum=sutter: a=a*10 为下一次作准备 printf("resulte=% lldn”,sum);
用单层循环 认为: a+aa +aaa+aaaa+..... a*100+第二项 a*10+第一项 main() {int a, n, i; long sum, term; printf(“input a,n=“); scanf(“%d,%d”,&a,&n); sum=0;term=0; for(i=1; i<=n; i++) { term=term+a; sum=sum+term; a=a*10 } printf(“resulte=%ld\n”,sum); } 为下一次作准备 第6章 第9节
第6章第9节 例2P1206.6打印“水仙花”数 解:法一用“穷举法”,即用所有可能的数据试算,如条件成立,则输出结 果 main() int 1,,M5- for(i=1;i<=9;i++) 1for(=0:<=9j+) for(k=0;k<=9;k++) 三重循环 {i*100510+k=-jj+k+k) printf("%6d”,i100j10+1) LL-========== 法二在10099范围内,将所有的三位数分解,再判断 main( if(a==i*1*i+j*j*j+k*k*k) fint i,j, k, a for(a=100;:<999;a++) print(“%d”,a); {k=a%10; j=(a/10%10; =a/100;
例2 P120 6.6 打印“水仙花”数 第6章 第9节 解:法一 用“穷举法”,即用所有可能的数据试算,如条件成立,则输出结 果 main( ) { int i,j,k; for (i=1; i<=9; i++) for(j=0;j<=9;j++) for(k=0;k<=9;k++) { if (i*100+j*10+k==i*i*i+j*j*j+k*k*k) printf(“%6d”, i*100+j*10+k);} } 三重循环 法二 在100——999范围内,将所有的三位数分解,再判断 main( ) { int i,j,k,a for (a=100; a<=999;a++) {k=a%10; j=(a/10)%10; i=a/100; if(a= = i*i*i+j*j*j+k*k*k) printf(“%6d”,a); } }