您好,欢迎访问三七文档
11第三讲多重循环1:什么是多重循环?当一个循环语句的循环体内又包含另一个完整的循环语句时,称为双重循环.或称为嵌套循环.,另外,还有三重四重等多重循环。2:双重循环示意图:1:for(;;){for(;;){…;}}2:for(;;){do{…;}}注①不管怎样搭配组成多重循环,必须注意:外循环体与内循体的两对花括号必须各自对齐(.观察示意图)注②外层循环必须“包含”一个完整的内循环结构,不能发生交叉.(详讲)注③书写时一定要使用“缩進式”格式。使程序层次清楚。增强可读性。注③要优化程序,如果循环嵌套得不好,增加很多次循环,造成运行时间浪费。3:程序举例:1:打印九九乘法表:main(){inti,j;clrscr();for(i=1;i=9;i++){gotoxy(1,i);for(j=1;j=i;j++)printf(%d*%d=%d,i,j,i*j);printf(\n);}}注①本程序有两对花括号,外面的一对是函数体,里面的一对是外循环体。注②”i”循环体里“包含”了一个完整的”j”循环结构,所以是双重循环.注③我们称for(i=1;i=9;i++)为外循环,for(j=1;j=9;j++)为内循环.当然内循环也有循环体,因只有一个打印语句,所以省略了一对花括号.2:打印五行奇数三角形。main(){inti,j;for(i=1;i=5;i++){gotoxy(38-i,i);for(j=1;j=2*i-1;j++)printf(*);}}注①外循环管三角形的行数.内循环管每行“*”号的个数.注②gotoxy(38-i,i);为图形定位.括号中的38-i是定列,i是定行.3打印三位数中的回文数(百位上的数字与亇位上的数字相同的叫回文数)main(){inti,j,k=0;for(i=1;i=9;i++)for(j=0;j=9;j++){printf(%d\t,i*100+j*10+i);k=k+1;}printf(\nk=%d,k);}注:外循环穷举百位与个位上的数字.内循环穷举十位上的数字.4:蜘蛛8条腿,蜻蜒6条腿,2对翅膀,蝉6条腿,1对翅膀,现有118条腿,20对翅膀,求三虫各有多少?main(){intx,y,z,a,b;for(x=1;x=20;x++)for(y=1;y=20;y++)for(z=1;z=20;z++){a=8*x+6*y+6*z;b=2*y+z;if(a==118&&b==20)printf(%d,%d,%d\n,x,y,z);}}注①if(a==118&&b=20)是条件表达式。注②蜘蛛只数在x循环中穷举.蜻蜒只数在y循环中穷举.蝉在z循环中穷举5:求(10+20+30)+(10+20+30)的和。main(){inti,j,s=0;22for(i=1;i=2;i++){for(j=1;j=3;j++)s=s+j*10;}printf(“s=%d”,s);}注:本题可看成两行三列,外循环穷举有几行,内循环管累乘累加几次.4:执行顺序流程图:(以程序5为例)NoYes继退续岀No外外继Yes退循续续岀循循循环环环环5:小结多重循环:①分支与循环语句后面都旡分号.②求n个未知数,用n重循环求解.③熟习分支与循环语句的“缩進”格式的书写形式.在程序中其他的语句要用“并列”格式来书写。6:编徎与上机练习题:①一堆西瓜三个人分,第一个人分这堆西瓜的一半加半个,第二人分剩下的一半加半个,第三个人分再剩下的一半加半个,正好是一个,问这堆西瓜原有多少个?②打印数列:1,1,2,3,5,8…144的各项。③求XXX+YYY+ZZZ=XYYZ中的X,Y,Z的值。④打印平行四边形(大小自定).⑤小朋友分苹果:毎人分3个差55个,毎人分2个多30个,求小朋友与苹果各有多少?⑥一只蚂蚁发现一块肉,拖不动,回去叫来7个同伴,还是拖不动,于是它们毎只蚂蚁又叫来7个同伴,终于拖动了,问一共有多少蚂蚁?7:参攷程序:①:main(){floata=1,i;for(i=1;i=2;i++)a=(a+.5)*2;printf(a=%.0f,a);}注:用倒推还原法.从a=1开始推到第2次再推到第1次,就是原有的西瓜数.for语句只要循环2次即可。倒累推表达式作赋值运算.②:main(){inta,b,c,i;a=1;b=1;printf(%d%4d,a,b);for(i=3;i=12;i++){c=a+b;/*第三项的和*/printf(%4d,c);a=b;b=c;/*产生新的前兩项(复盖移位)*/}}注:本题中的数列的规律是:从第三项开始等亍前襾项的和,a=1;b=1;两项作为已知数,开始求第三项.打印第三项后.用a=b;b=c;产生新的前两项,再求新的第三项c,以此类推.循环12次.③:main(){intx,y,z,a,b;for(x=1;x=9;x++)for(y=1;y=9;y++)for(z=1;z=9;z++){a=x*111+y*111+z*111;b=x*1000+110*y+z;main()nti,j,s=0;i=2吗?i=1赋初值j=1赋初值j=3吗s=s+10*jj++;自增加1i++;自增加1打印s的累加和程序结束33if(a==b)printf(%d,%d,%d,x,y,z);}}注:变量a存放的是三个加数之和,要与b存放的三数之和相等,才是x,y,z的正确值,而a的值须用三重循环穷举,才能使a==b.④:main(){inti,j;for(i=1;i=5;i++){gotoxy(40-i,i);for(j=1;j=8;j++)printf(*);}}注:i循环管行数.j循环管每行的8个”*”号,gotoxy(40-i,i);中,40-I是定列,i是定行⑤:main(){intr,p1,p2;clrscr();for(r=1;r=500;r++){p1=3*r-55;p2=2*r+30;if(p1==p2)printf(r=%d,p=%d,r,p1);}}注:为p1赋值是第1次每人分3个的苹果数,为p2赋值是第2次每人分2个的苹果数,人数由r循环穷举.⑥:main(){intm,i;m=1;for(i=2;i=3;i++)m=m*7+m;printf(m=%d,m);}注:本例用顺推法求蚂蚁的的只数顺推赋值语句是”m=m*7+m;”,以”m=1;”开始,循环2次進行顺推两次求蚂蚁数.顺推表达式作赋值运算2:break语句与continue语句1break语句只能用在循环体内.扏行该语句则跳岀循环体,并终止后面所有的循环.break语句一般和if语句或输岀语句一起使用.2continue语句也只能用在循环体内.扏行该语句则跳岀循环体,只终止本次循环,继续执行后面的循环.该语句也和if语句或输出语句一起使用3:两个跳岀语句的程序举例:①程序一:(break;)main(){inti;clrscr();for(i=1;i=10;i++){if(i==5)break;printf(%4d,i);}}运行结果:1234②程序二:(continue;)main(){inti;clrscr();for(i=1;i=10;i++){if(i==5)continue;printf(%4d,i);}}运行结果:1234678910注:请仔细观察两个不同的结果,说说它们的相同点与不同点?注:break与continue语句,都只能跳岀一层循环,而不能跳岀多层循环.break;与continue;语句跳岀示意图:外循环外内循环循内循环体环跳出体外循环体程序举例:①输入两个正整数,求这两个数的最大公约数。main(){inta,b,x=2;/*为短除法准备除数x=2;*/ints=1;clrscr();/*为累乘公因数s=1;*/scanf(%d%d,&a,&b);/*输入两个整数*/do44{if(a%x==0&&b%x==0)/*判断是否为真{a=a/x;b=b/x;s=s*x;}为真求公因数…elsex++;/*为假时,除数x加1.*/}while(xa||xb);直到条件为假,退岀循.printf(%4d,s);}②家中来客:2人共1个飯碗,3人共1个菜碗,4人共1个汤碗,问家中有多少客人?main(){inta;clrscr();for(a=4;a=65;a++)if(a%2==0&&a%3==0&&a%4==0&&)if(a/2+a/3+a/4==65)/*方程作条件判断*printf(%d,a);getch();}注:第1个if判断人是否为整数,人为整数时,才能進行第2个if语句的判断,为真时打印所求的客人数.③一个7层塔,共有381盏灯,它每下一层的灯数都是上一层的2倍,求最底层有多少盏灯?main(){intq,y,s,x=0;clrscr();while(x=20){x++;s=x;q=x;for(y=2;y=7;y++){q=q*2;s=s+q;}if(s==381)printf(%4d,q);}}注:根据题意,最顶层是按自然数从1,2,3…中的一个数作为已知数,用”x++;”产生,再循环6次求每一层的灯数,并累加起来,如果累加和等于381,则打印最底层的灯数.④程序欣赏:字符“Good”不断从左向右移动.#includestdio.h/*输岀输入头文件*/#includeconio.h/*颜色头文件*/main(){longi=0,x=0,n=20;/*定乂长整型,赋初值*/textbackground(RED);/*背景色(红色)*/textcolor(YELLOW);/*前景色(黄色)*/while(x=n){gotoxy(i,10);/*定位(列与行)*/cprintf(good);cprintf打印有色…*/sleep(1);x++;/*本语句是停止几秒钟*/clrscr();i=i+5;/*清屏*/if(i=76)i=1;/*如在76列显示”good”*/}/*后,”i=1”使其返回到1列.*/}⑤求”(a*10+3)*(20+b)=c*1000+72”中的三个未知数.main(){inta,b,c,x,y;clrscr();for(a=1;a=9;a++)for(b=0;b=9;b++)for(c=0;c=9;c++){x=(a*10+3)*(20+b);y=1000+c*100+72;if(x==y){printf(%d%d%d,a,b,c);break;}}}注:含有未知数的等式叫方程.本程序中的3个未知数,用三重循环穷举,x为等号左边算式的值,y为等号右边算式的值,如果”x==y”为真则打印a,b,c的值.为假则继续循环穷举.⑥一个四位数,它的前两个数相同,后两位数相同,并且是个完全平方数.求这个四位数.#includemath.hmain(){inti,j,a,b;floatk;clrscr();for(i=1;i=9;i++)for(j=0;j=9;j++){a=i*1100;/*a为前两位相同数*/b=j*11;/*b为后两位相同数*/k=a+b;/*k为四位数*/if(sqrt(k)==floor(sqrt(k)))printf(%f,k);}}注:if语句中的sqrt(k)是开方,floor()是取整函数,如果if中的表达式为真,说明k是一个完全平方数.程序中的sqrt();与floor()在头55文”math.h”中,在程序开头应有math.h头文件.编程与上机练习题:①输入一个正整数,判断是否为质数,是则打印Yes,否则打印No.②输入两个正整数,求这两个数的最小公倍数.③编程打印200以内所有的质数,并统计200以内有多少质数.④一个三位数,它的每位数字都不相同,且都小于7,并且百位上的数等于十位上的数加上个位上的数,打印这样的三位数.提示一:①输入整数n,根据质数的定义,n只有两个因素1与n本身,才是质数.②循环判
本文标题:第三讲多重循环
链接地址:https://www.777doc.com/doc-2183786 .html