第5章for循环程序设计15.1for循环结构C语言中的for循环语句比较复杂些,也比较灵活,功能较强,虽然主要用于定数循环,但也可以用于不定数循环,它完全可以替代while循环.1.for循环语句的一般形式:for(表达式1;表达式2;表达式3){循环体}2for(表达式1;表达式2;表达式3){循环体}表达式2求表达式1内嵌语句真假for语句后下一条语句求表达式3设置循环变量初值判断表达式循环变量增值3例5.1:求100之内各数之和:#includestdio.hintmain(){inti,sum=0;for(i=1;i=100;i++)sum+=i;printf(“1+2+…100=%d”,sum);return0;}i=100?i=1sum+=i真假for语句后下一条语句i++ch5_5_1.c{}单条语句时,大括号可以不要.4例:把100~200之间的不能被3整除的数输出。main(){intn;for(n=100;n=200;n++){if(n%3==0)continue;/*能被3整除的数,不打印*/printf(“%5d”,n);}}当然函数体也可改成:if(n%3!=0)printf(“%d”,n);使用Continue仅是为了说明其的语法作用。5说明:表达式缺省的for()语句:for()语句中的三个表达式可以省略其中一个,二个,甚至三个。但无论省略几个,其中的二个分号不能省。如果在for语句之前,给循环变量已赋值,表达式1可省去。分号不能省。如:sum=0;i=1;for(;i=100;i++)sum=sum+i;表达式1可省去63.如果表达式2省略,C编译程序认为其值恒为真,无限循环下去。如:for(i=1;;i++)sum=sum+i;2.表达式3也可省去:如:for(i=1;i=100;){sum=sum+i;i++;}可把变量增值部分放在循环体内.可在循环体内加break语句跳出循环.表达式3可省去表达式2可省去74.甚至三个表达式都可省略:for(;;)语句;例:intmain(){inti=1,sum=0;for(;;){sum+=i;i++;if(i10000)break;}}这种无限循环可用break语句来终止循环,避免产生死循环.8补充:逗号运算符(顺序运算符):级别最低的一种。用它将二个表达式联起来。逗号表达式的一般形式:表达式1,表达式2如:a=3*5,a*4……逗号表达式先求解3*5,得a的值为15,然后求解第二表达式a*4,得60。求解过程是:先求解表达式1,再求解表达式2,整个逗号表达式的值为表达式2的值。一般形式还可扩展:表达式1,表达式2,……,表达式n整个表达式的值为表达式n的值。9注意:a.在很多情况下,使用逗号表达式的目的只是想得到各个表达式的值,并非一定需要得到或使用整个表达式的值。b.并非任何出现逗号的地方都是逗号运算符.如:printf(“%d,%d,%d”,a,b,c);其中的逗号就不是。105.含逗号运算符的for语句for语句中,表达式1、表达式3可以使用逗号运算符:如:for(i=1,j=20;ij;i++,j--)两个或两个以上的变量共同实现对循环的控制注:有时各表达式也可以是与循环无关的语句.11例5.2输入一个1~10的自然数,求这个数的阶乘.#includestdio.hintmain(){inti,n,s=1;scanf(%d,&n);for(i=1;i=n;i++)s*=i;//s=s*iprintf(%d!=%d\n,n,s);return0;}ch5_5_2.c12例5.3输入一个正整数,逆序输出.#includestdio.hintmain(){intnum;intdigit;printf(Inputanumber:\t);scanf(%d,&num);for(;num!=0;num=num/10){digit=num%10;printf(%d,digit);}printf(\n);return0;}ch5_5_3.c整数除13例5.4输入不多于10个实数,求这些数的和及其中正数之和.(若不足10个数,以0为结束标志)#includestdio.h#includemath.hintmain(){floatsum,psum,x;inti=1;….14for(sum=psum=0.0,i=0;i10;i++){scanf(%f,&x);if(fabs(x)1e-4)break;sum+=x;//求这些数的总和if(x0)continue;psum+=x;//其中正数之和}printf(sum=%f\n,sum);printf(psum=%f\n,psum);return0;}若输入为0,结束.输入小于0不累加.注意这个表达式ch5_5_4.c15例5.5计算输入一行字符串的字符个数.#includestdio.hintmain(){intn=0;printf(输入一行字符串:\n);for(;getchar()!=‘\n’;n++);printf(共有字符%d个.\n,n);return0;}ch5_5_5.c16对于for语句的进一步说明:(1).表达式1可以是设置变量初值的赋值表达式,也可是与循环变量无关的其它表达式.如:for(sum=0;i100;i++)sum=sum+i;(2).表达式2一般是关系表达式或逻辑表达式,但也可以是其它类型表达式,只要其值为非零,就执行循环体.如:for(i=0;(c=getchar())!=‘\n’;i+=c);(不断输入字符,将ASCII码累加,直到输入一个换行符.)17(3).for循环的条件检查总是在循环开始前进行的,如果一开始条件为假(为零),则循环一次也不执行.main(){intx,y=10;for(x=10;x10;--y)printf(“%d”,y);printf(“%d”,x);}一开始条件就为假!(4).当for语句的循环体是空语句时,则成为空循环体的for语句,利用它可以实现某些特殊功能,比如产生时间延迟等.如下例:for(t=0;tvalue;t++);空循环体185.2循环嵌套:for语句一般用于具有明确循环次数的情况,如果事先不知道准确的循环次数,只知道循环条件,一般用while或dowhile语句.循环是可以嵌套的.循环嵌套是指一个循环体内又可包含另一个完整的循环称为循环嵌套。里面的循环又可嵌套另一个循环,叫多层循环的嵌套。19已知的三种循环:while(),do-while(),for()可以相互嵌套。如:while()for(){┆{┆dowhile(){…}{…}while();┆┆}}注:但循环嵌套不允许交叉20例:问程序输出的结果?main(){inti=1,a=0;for(;i=5;i++){do{i++;a++;}while(i3);i++;}printf(“a=%d,i=%d\n”,a,i);}输出:a=3,i=821例5.6:打印一张九九乘法表.#includestdio.hintmain(){inti,j;for(i=1;i10;i++){for(j=1;j=i;j++)printf(%2d*%d=%-3d,i,j,i*j);printf(\n);}return0;}ch5_5_6.c外循环控制行数.内循环控制每行的输出数据.22例5.7:打印如下一张图形.#includestdio.hintmain(){inti,j,k;for(i=0;i5;i++){for(j=0;j=i;j++)printf();for(k=0;k5-i;k++)printf(*);printf(\n);}return0;}ch5_5_7.c外循环控制行数.控制每行的定位.控制每行输出的*号个数.23例:找出所有的三位数,它和它的各位数字的立方和正好相等.例如:153=13+53+33.设所求的三位数,其百位数字是i,十位数字是j,个位数字是k.显然应满足如下表达式:i*i*i+j*j*j+k*k*k=100*i+10*j+kmain(){inti,j,k;for(i=1;i=9;i++)for(j=0;j=9;j++)for(k=0;k=9;k++)if(i*i*i+j*j*j+k*k*k==100*i+10*j+k)printf(“%d%d%d\n”,i,j,k);}程序运行结果:15337037140724第5章For循环程序设计结束25第4章课后练习2610.ch4_lx10.c#includestdio.hvoidmain(){intm=1,n=1,s=0,k=1;while(n=10){while(m=n){printf(%d,m);m++;}printf(\n);n++;m=1;}}课本P58:10题求:打印图形.Ch4_lx10.c27Ch4_lx12.c输入一行字符串,统计有多少字母.#includestdio.hvoidmain(){intm=0;charch;while((ch=getchar())!='\n')if((ch='a'&&ch='z')||(ch='A'&&ch='Z'))m++;printf(%d\n,m);}}课本P58:12题28Ch4_lx13.c猜字游戏#includestdio.h#includestdlib.h#includemath.h#includetime.hvoidmain(){intmagic;intguess;srand((unsigned)time(NULL));magic=rand();printf(Enteryourguess:);….Ch4_lx13.c课本P58:13题29….scanf(%d,&guess);while(guess!=magic){if(guessmagic)printf(**Toohigh\n**);elseprintf(**TooLow\n**);printf(Enteryourguess:);scanf(%d,&guess);if(guess==magic){printf(**Right**\n);break;}}}Ch4_lx13.c3011.输入一自然数,输出它的因子。解1.#includestdio.hintmain(){intw,i=2;printf(请输入一个整数w:\n);scanf(%d,&w);printf(%d的因子是:,w);….课本P58:11题31…while(w){while(w){if(w%i==0){printf(%d,i);w=w/i;}elsebreak;}i++;}return0;}i初值为2.某个i被除净后,从原数中去除.考虑到有重复的因子.Ch4_lx11.c32Ch5_lx14.c求1*3*5*7…*n#includestdio.hintmain(){inti,x,s=1;printf(请输入一个奇数:\n);scanf(%d,&x);for(i=1;i=x;i+=2)s=s*i;printf(1*3*...*%d=%d\n,x,s);return0;}Ch5_lx14.c课本P73:14题33第5章课后练习结束34设计一个猜字游戏.程序给出一个数,游戏者猜对了,屏幕显示“**Right**”;当猜的数错了,显示”**Wrong**”,并告之猜的数太小并显示”**TooLow**”,否则就显示”**TooHigh**”.35例:猜字游戏(一)main(){intmagic=123;intguess;printf(“Enteryourguess:”;scanf(“%d”,&guess);if(guess==magic)printf(“**Right**”);else{printf(“**Wrong**”);if(guessmagic)printf(“**Toohigh\n**”);elsepri