C语言程序控制结构.pptx
l 主要内容4.1 C4.1 C语言的执行语句语言的执行语句4.2 4.2 顺序结构顺序结构4.3 4.3 选择结构选择结构4.4 4.4 循环结构循环结构第1页/共100页4.1C语言的执行语句 C语言的语句分为声明语句和执行语句。第3章介绍的变量定义语句是最常见的声明语句,声明语句在编译时处理,在程序运行时不产生相应的操作。执行语句的作用是在程序运行时向计算机系统发出操作命令,使计算机执行特定的操作.C语句:以“;”作结束符,编译后产生机器指令。C语句分类:u表达式语句u空语句u控制语句u复合语句第2页/共100页4.1.1表达式语句表达式语句是在表达式的末尾加上分号构成的语句。z=x+sin(y);a-=a*a;赋值语句i+;自增1语句x=0,y=1;逗号表达式语句x+y;无意义printf(“This is a C program.n”);函数调用语句赋值语句和函数调用语句是使用最多的表达式语句如:如:printf(This is a C printf(This is a C statement.);statement.);func(a,5);func(a,5);y=max(a,b);y=max(a,b);第3页/共100页4.1.2空语句仅由一个“;”构成的语句只是在逻辑上起到一个语句的作用,在编译时不产生任何指令,在执行时不产生任何操作。作用:构成标号语句,标示流程的转向点;构成循环语句中空循环体。例如:while(getchar()!=n);只要从键盘上输入的字符不是回车则重新输入。第4页/共100页4.1.3复合语句用 括起来的一组语句。一般形式:执行语句;说明:说明:“”后不加分号后不加分号 其中最后一个语句后也要加分号其中最后一个语句后也要加分号 语法上和单一语句相同语法上和单一语句相同 复合语句可嵌套复合语句可嵌套如:如:z=x+y;z=x+y;t=z/100;t=z/100;printf(%f,t)printf(%f,t);如:如:z=x+y;z=x+y;t=z/100;t=z/100;printf(%f,t)printf(%f,t);第5页/共100页4.1.4控制语句控制语句:完成一定的控制功能。辅助控制辅助控制if()else if()else switchswitchfor()for()while()while()dowhile()dowhile()continuecontinuebreakbreakgotogotoreturnreturn分支分支循环循环如:如:if (xy)z=x;if (xy)z=x;else z=y;else z=y;第6页/共100页4.2顺序结构流程图流程图是表示算法的一种工具,用一些图框来表示各种操作。一个流程图包括以下几部分:表示相应操作的框;带箭头的流程线;框内外必要的文字说明。如,顺序结构流程图:如,顺序结构流程图:A AB B第7页/共100页顺序结构常用的流程图符号:起止框判断框处理框输入/输出框注释框流向线连接点 N-SN-S流程图:完全去掉了流程线流程图:完全去掉了流程线,算法的每一步都用矩算法的每一步都用矩形框描述形框描述,把一个个矩形框按执行的次序连接起来就是一,把一个个矩形框按执行的次序连接起来就是一个完整的算法描述。个完整的算法描述。第8页/共100页顺序结构结构化程序的三种基本结构顺序结构:按书写顺序执行的语句构成的程序段ABAB流程图N-S图 选择结构选择结构 循环结构循环结构第9页/共100页例4.1 输入任意两个整数,求它们的和及平均值。要求平均值取两位小数输出。/例例4.14.1#include#include#include#includevoid main()void main()int num1,num2;int num1,num2;float float sum,aver;sum,aver;printf(Please input two integers:n);printf(Please input two integers:n);scanf(%d,%d,&num1,&num2scanf(%d,%d,&num1,&num2););sum=(float)num1+num2;sum=(float)num1+num2;/*求累计和求累计和*/aver=sum/2.0;aver=sum/2.0;/*求平均值求平均值*/printf(sum=%.0f,aver=%.2fn,sum,printf(sum=%.0f,aver=%.2fn,sum,aver);aver);运行情况:运行情况:3000030000,5005 5005 sum=35005,aver=17502.50sum=35005,aver=17502.50开始开始输入两整数输入两整数计算计算sumsum计算计算averaver结束结束第10页/共100页例4.2 给定一个三位正整数,分别输出其个位数、十位数和百位数。#include#include void main()void main()int m,m0,m1,m2;int m,m0,m1,m2;printf(“Input a number(100999):”);printf(“Input a number(100999):”);scanf(%d,&m);scanf(%d,&m);m0=m%10;m0=m%10;m1=(m/10)%10;m1=(m/10)%10;m2=m/100;m2=m/100;printf(%d,%d,%dn,m0,m1,m2);printf(%d,%d,%dn,m0,m1,m2);运行结果:运行结果:Input a number(100999)Input a number(100999):263 263 输出:输出:3,6,23,6,2第11页/共100页例4.3 取一个16位的二进制数a的7、6、5、4四个位,如图4-2中加阴影的部分。void main()unsigned a,b,c,d;scanf(%x,&a);/*以十六进制形式输入整数a*/b=a4;c=(04);d=b&c;printf(%xn%xn,a,d);/*以十六进制输出a和结果d*/第12页/共100页例4.4 求ax2+bx+c=0方程的根。a,b,c由键盘输入,设 。一元二次方程式的根为 x1=x2=可以将上面的分式分为两项:p=,q=,则 x1=p+q,x2=p-q。顺序结构第13页/共100页#include#include#include#include void main()void main()float a,b,c,disc,x1,x2,p,q;float a,b,c,disc,x1,x2,p,q;scanf(a=%f,b=%f,c=%f,&a,&b,&c);scanf(a=%f,b=%f,c=%f,&a,&b,&c);disc=b disc=b*b-4b-4*a a*c;c;p=-b/(2 p=-b/(2*a);a);q=sqrt(disc)/(2 q=sqrt(disc)/(2*a);a);x1=p+q;x2=p-q;x1=p+q;x2=p-q;printf(nx1=%5.2fnx2=%5.2fn,x1,x2);printf(nx1=%5.2fnx2=%5.2fn,x1,x2);运行情况:运行情况:输入:输入:a=1,b=3,c=2 a=1,b=3,c=2 输出:输出:x1=-1.00 x1=-1.00 x2=-2.00 x2=-2.00第14页/共100页4.3选择结构选择结构是指在程序执行过程中,根据指定条件的当前值在两条或多条路径中选择一条执行。C语言的选择控制语句有两条:条件选择语句:if语句开关分支语句:switch语句第15页/共100页4.3.1 if语句表达式语句1真(非0)假(0)1、if 格式(单分支语句)if (判断表达式)语句1;语句 1可以是一条语句或复合语句。注意:满足条件时想要执行多条语句一定要用复合语句 当判断表达式值不为零(即”真”),则执行语句1,再执行其后继语句;否则,不执行语句 1,执行其后继语句。第16页/共100页单分支语句判断表达式应该是具有一定意义、有实用价值的表达式,因此,最常用关系表达式和逻辑表达式来表达,例如:if(a=b)if(a=0)等价于if(!a)if(a!=0)等价于if(a)if(a=5&a=10)例:输入一个整数,求绝对值.main()int i;scanf(%d,&i);if (i 0)i=-i;printf(%d,i);例:执行下列程序段后 a 的值是_。int a=3;if(2)a=5;第17页/共100页单分支语句#include main()char c;printf(input a letter:);c=getchar();if(c=A&c=z)c=c+32;printf(%cn,c);例4.5 从键盘输入一个字母,以小写字母形式输出该字母第18页/共100页单分支语句例4.6从键盘输入两个整数,按升序输出这两个数。#include#includevoid main()void main()int a,b,t;int a,b,t;scanf(%d%d,&a,&b);scanf(%d%d,&a,&b);if(ab)if(ab)t=a;/t=a;/交换两数交换两数 a=b;a=b;b=t;b=t;printf(%d,%dn,a,b);printf(%d,%dn,a,b);T TF Fababt=at=aa=ba=bb=tb=t第19页/共100页例:输入三个数a,b,c,要求按由小到大的顺序输出。If ab 将a和b对换If ac 将a和c对换If bc 将b和c对换abacbca和b交换a和c交换c和b交换yyynn单分支语句第20页/共100页单分支语句#include#include void main()void main()float a,b,c,t;float a,b,c,t;scanf(scanf(%f%f%f%f%f%f,&a,&b,&c);,&a,&b,&c);if(ab)if(ab)t=a;t=a;a=b;a=b;b=t;b=t;if(ac)if(ac)t=a;t=a;a=c;a=c;c=t;c=t;if(bc)if(bc)t=b;t=b;b=c;b=c;c=t;c=t;printf(%5.2f,%5.2f,%5.2fn,a,b,c);printf(%5.2f,%5.2f,%5.2fn,a,b,c);必不可少,否必不可少,否则,会出现逻辑则,会出现逻辑错误!错误!第21页/共100页2、if(表达式)语句1 else 语句2 条件 语句1 语句2YN双分支if-else语句各有一个分号;但属于一个语句各有一个分号;但属于一个语句例:例:if(xy)if(xy)printf(“%d”,x);printf(“%d”,x);else else printf(“%d”,y);printf(“%d”,y);第22页/共100页双分支if-else语句说明:在if和else后面可以只含有一条语句,也可以含有用花括号 括起来的复合语句。如:if(a+b)c&(b+c)a&(c+a)b)s=0.5*(a+b+c);area=sqrt(s*(s-a)*(s-b)*(s-c);printf(area=%6.2f,area);else printf(it is not a trilateral.);第23页/共100页例:输入两个数并判断两数是否相等。#include void main()int a,b;printf(Enter integer a:);scanf(%d,&a);printf(Enter integer b:);scanf(%d,&b);if(a=b)printf(a=bn);else printf(a!=bn);运行结果:运行结果:Enter integer a:12Enter integer a:12 Enter integer b:12Enter integer b:12 a=b a=b 运行结果:运行结果:Enter integer a:12Enter integer a:12 Enter integer b:9Enter integer b:9 a!=b a!=b 双分支if-else语句第24页/共100页分析以下程序的输出结果:(1)(1)#include#include void main()void main()int a,b;int a,b;scanf(%d,&a);scanf(%d,&a);b=1;b=1;if(a=5)if(a=5)b=a+3;b=a+3;b=6;b=6;printf(%dn,b);printf(%dn,b);(2)(2)#include#include void main()void main()int a,b,t;int a,b,t;scanf(%d%d,&a,&b);scanf(%d%d,&a,&b);if(ab)if(ab)t=a;a=b;b=t;t=a;a=b;b=t;printf(a=%d,b=%dn,a,b);printf(a=%d,b=%dn,a,b);getch();getch();第25页/共100页(3)(3)#include#include void main()void main()int x,y;int x,y;scanf(%d,&x);scanf(%d,&x);y=-1y=-1;if(if(x!=0 x!=0)y=1;y=1;if(x0)y=1;if(x0)y=1;else else y=0;y=0;(4)(4)程序输出结果程序输出结果#include#include void main()void main()int x,y;int x,y;scanf(%d,&x);scanf(%d,&x);y=0;y=0;if(x=0)if(x=0)if(x0)y=1;if(x0)y=1;elseelse y=-1;y=-1;printf(%dn,y);printf(%dn,y);第26页/共100页3.多分支语句几种形式:if(if(表达式表达式1)1)if(if(表达式表达式2)2)语句语句1 1 elseelse 语句语句2 2 内嵌内嵌if if if(if(表达式表达式1)1)语句语句1 1elseelse if(if(表达式表达式2)2)语句语句3 3 else else 语句语句4 4内嵌内嵌if if if(if(表达式表达式1)1)if(if(表达式表达式2)2)语句语句1 1 else else 语句语句2 2elseelse if(if(表达式表达式3)3)语句语句3 3 else else 语句语句4 4内嵌内嵌if if内嵌内嵌if if if(if(表达式表达式1)1)if(if(表达式表达式2)2)语句语句1 1 else else 语句语句2 2内嵌内嵌if if第27页/共100页3、if(表达式1)语句1 else if(表达式2)语句2 else if(表达式3)语句3 else if(表达式m)语句m else 语句n多分支语句第28页/共100页例:if(number500)cost=0.15;else if(number300)cost=0.10;else if(number100)cost=0.075;else if(number50)cost=0.05;else cost=0;多分支语句第29页/共100页多分支语句匹配规则:Else总是与它上面的,最近的,统一复合语句中的,未配对的if语句配对。当if和else数目不同时,可以加花括号来确定配对关系。例:例:if(aif(a=b)b)if(b if(b=c)c)printf(“a printf(“a=b b=c”);c”);else else printf(“a!=b”);printf(“a!=b”);修改:修改:if(aif(a=b)b)if(b if(b=c)c)printf(“a printf(“a=b b=c”);c”);else else printf(“a!=b”);printf(“a!=b”);第30页/共100页 -1 (x0)算法1:算法1:输入x 输入x若x0,则y=-1 若x0,则y=1 若x=0,则y=0输出y 若x0,则y=1 输出y 多分支语句第31页/共100页程序程序#include#includevoid main()void main()int x,y;int x,y;scanf(“%d”,&x);scanf(“%d”,&x);if(x0)if(x=0)if(x=0)if(x0)y=1;if(x0)y=1;else y=0;else y=0;else y=-1;else y=-1;正确?正确?第32页/共100页程序1:程序2:if(x=0)y=-1;if(x0)y=1;else else y=0;if(x=0)y=0;else y=-1;else y=1;程序3:程序4:y=-1;y=0;if(x!=0)if(x=0)if(x0)y=1;if(x0)y=1;else y=0;else y=-1;正确正确上例中的程序段有四个,请判断哪个是正确的?X=90)printf(An);else if(score=80)printf(Bn);else if(score=70)printf(Cn);else if(score=60)printf(Dn);else printf(En);第35页/共100页多分支语句例4.8 分段函数定义如右:根据所输入的x的值,求函数值。main()float x,y;scanf(%f,&x);if(x0)y=0;else if(x=50)y=x;else y=x*x;printf(x=%f,y=%fn,x,y);第36页/共100页4.3.2 switch语句switch语句的格式:switch(表达式)case常量表达式:语句 break;case常量表达式:语句 break;case常量表达式:语句 break;default :语句 执行过程:执行过程:当表达式的值与某一个case后面的常量表达式的值相等时,就从此case后面的语句开始执行下去,若所有的case中的常量表达式的值都没有与表达式的值匹配的,就执行default后面的语句。第37页/共100页switch语句case 1语句组1break?case 2语句组2break?case N语句组nbreak?是是是否否否有无无无有有case N+1第38页/共100页switch语句执行流程:首先计算switch圆括号中表达式的值,然后将结果值按前后顺序依次与各个case后的常量表达式进行比较。当表达式的值与某一个case后面的常量表达式的值相等时,就执行该case后边的语句组k,接着如果遇到break语句,则结束整个switch语句(即退出switch)。如果不遇到break语句,则按顺序执行下面其他case后边的语句组,直至遇到break语句或最后边的“”为止,才结束switch语句当结果值与常量表达式k的值都不相等时,若有default,则执行其后语句;若无default,则什么都没执行第39页/共100页switch语句说明:1)switch关键字,case也是关键字,与其后面的常量表达式合称case语句标号,常量表达式类型必须与switch后面表达式类型相匹配,且各case语句标号的值各不相同,不能重复;default也是关键字,起语句标号的作用,代表除了以上所有case标号之外的那些标号;2)语句1、语句2可以是一条语句,也可以是若干条,在必要时,case语句标号后的语句可以省略不写;3)switch的表达式通常是一个整型或字符型变量,也允许枚举型变量,其结果为相应的整数、字符或枚举常量;4)break语句不是一定需要加上,执行完一个case后面的语句,若没有遇到break,就自动进入下一个case继续执行,而不再判断是否与之匹配。第40页/共100页当程序在执行时,如果输入的是A#include stdio.hmain()char a;a=getchar();switch(a)case 65:printf(%c,A);case 66:printf(%c,B);default:printf(%sn,other);运行结果:运行结果:ABotherABother第41页/共100页当程序在执行时,屏幕上输出为:#include stdio.hmain()int k=2;switch(k)case 1:printf(%dn,k+);break;case 2:printf(%d,k+);case 3:printf(%dn,k+);break;cade 4:printf(%dn,k+);default:printf(Full!n“);运行结果:运行结果:2 32 3第42页/共100页switch语句例:要求按照考试成绩的等级输出百分制分数段,用switch语句实现 应写为:应写为:switchswitch(gradegrade)case A:printf(85100n);break;case A:printf(85100n);break;case B:printf(7084n);break;case B:printf(7084n);break;case C:printf(6069n);break;case C:printf(6069n);break;case D:printf(60n);break;case D:printf(60n);break;default:printf(errorn);default:printf(errorn);第43页/共100页补充例:输入成绩,用A、B、C、D、F、R分别表示优、良、中、及格、不及格、补考、缺考。grade=getchar();switch(grade)case A:case a:printf(优);break;case B:case b:printf(良);break;case C:case c:printf(中);break;case D:case d:printf(及格);break;case F:case f:printf(不及格);/*此处没有break语句*/case R:case r:printf(请补考);break;default:printf(输入错);第44页/共100页switch语句例:某幼儿园只收2至6岁的儿童。23岁入小班,4岁入中班,56岁入大班。根据输入的年龄,求应入的班级。分析:设年龄为age,当age为2和3时,应输出同样的内容“入小班”,age为5和6时输出同样的内容“入大班”。该题算法比较简单。第45页/共100页switch语句#include void main()int age;printf(Please enter age:);scanf(%d,&age);switch(age)case 2:case 3:printf(入小班n);break;case 4:printf(入中班n);break;case 5:case 6:printf(入大班n);break;default:printf(不能入园n);第46页/共100页void main()int x,y,a=0,b=0;scanf(x=%d,y=%d,&x,&y);switch(x)case 1:switch(y)case 0:a+;case 1:b+;default:a+;b+;break;case 2:a+=2;b+=2;break;default:a+=3;b+=3;printf(a=%d,b=%dn,a,b);运行结果:输入:x=1,y=0 输出:a=2 b=2switch语句的嵌套第47页/共100页选择结构程序举例例4.13 输入一个字符,判别该字符是数字、英文大写字母、小写字母还是其它字符。#include void main()char c;printf(input a char:);c=getchar();if(c=0&c=A&c=a&c=z)printf(This is a small letter.n);else printf(This is an other character.n);第48页/共100页选择结构程序举例例4.14 输入三角形三边长,求三角形面积。#include void main()float a,b,c,s,area;scanf(%f,%f,%f,&a,&b,&c);if(a+bc&a+cb&b+ca)s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c);printf(area=%7.2fn,area);else printf(Not a triangle.n);第49页/共100页选择结构程序举例例4.15 输入a、b、c三个整数,输出最大数和最小数。void main()int a,b,c,max,min;printf(input three numbers:);scanf(%d,%d,%d,&a,&b,&c);max=ab?a:b;min=amax)max=c;else if(c=6)printf(%dn,n);else printf(%dn,+n);2对于整型变量a,赋值语句 a=(a%3=0?1:0);与()语句不等价。(A)if(a%3=0)a=1;else a=0;(B)if(a%3!=0)a=0;else a=1;(C)if(a%3)a=0;else a=1;(D)if(a%3)a=1;else a=0;第51页/共100页课堂练习3以下程序的运行结果是()。main()int n=c;switch(n+)default:printf(error);break;case a:case b:printf(good);break;case c:printf(pass);case d:printf(warn);第52页/共100页循环结构在许多问题中需要用到循环控制。循环结构是结构化程序设计的基本结构之一,在许多问题中需要用到循环控制。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。特点特点:当给定的条件成立时:当给定的条件成立时,反复执行某个程序段,直到条件不成立为止。反复执行某个程序段,直到条件不成立为止。给定给定的条件称为循环条件的条件称为循环条件,反复执行的程序段称为循环体,反复执行的程序段称为循环体,它由它由C C的语句构成。的语句构成。C语言提供了3种循环结构:while语句;do-while语句;for语句第53页/共100页4.4.1用while语句实现循环whilewhile语句用来实现语句用来实现“当型当型”循环结构。循环结构。一般形式:while(while(表达式表达式)语句语句 当表达式为非当表达式为非0 0值时,执行值时,执行whilewhile语句语句中的内嵌语句。中的内嵌语句。其特点是其特点是:先判断表达式,后执行语句。先判断表达式,后执行语句。(1)与 if 的区别,if 只一次,while反复判断,反复执行;(2)while 语句中通常有改变表达式的值的语句。第54页/共100页用while语句实现循环例4.18 计算1+2+100。main()int i=1,s=0;while(i=100)s+=i;i+;printf(%d,%d,i,s);getch();1.如果缺少i+这一行会出现什么情况?2.若计算:n!该程序应如何修改?第55页/共100页例4.19 根据公式 计算的值。#include void main()int i=1,n;double pi=0;printf(Input an integer:n);scanf(%d,&n);while(i=n)pi+=1.0/(i*i);i+;pi=sqrt(pi*6);printf(pi=%lfn,pi);第56页/共100页用while语句实现循环例4.21 猴子吃桃问题:猴子摘下了一堆桃子,第一天吃总数的一半多一个,第二天吃剩下的一半多一个,以后每天都吃前一天剩下的一半多一个,到第十天想再吃时剩一个,求猴子摘了多少个桃子?算法分析:设第 i 天未吃前有 x i 个桃子,由题意得:x1/2-1=x2 x2/2-1=x3 x9/2-1=x10已知x10=1,我们有:x10=1 xn-1=(xn+1)*2void main()int k,x1,x2;k=1;x2=1;while(k=9)x1=(x2+1)*2;x2=x1;k+;printf(Total number=%dn,x1);第57页/共100页用while语句实现循环补充1.统计从键盘输入的字符个数。(以回车结束)补充2.从键盘输入一个整数(至少大于9),求最高位的数字.#include main()int count=0;while(getchar()!=n)count+;printf(count=%d,count);这种结构的循环次数是不确定的。while (d9)d=d/10;/*反复执行d=d/10*/printf(最高位是%d,d);也可写成:while (d/=10)9);/*空循环体,反复执行d=d/10*/printf(最高位是%d,d);第58页/共100页4.4.2用do-whiledo-while实现循环实现循环 do-while语句的特点:先执行循环体,然后判断循环条件是否成立。一般形式:do 循环体语句 while(表达式);执行过程:先执行一次指定的循环体语句,然后判别表达式,当表达式的值为非零(“真”)时,返回重新执行循环体语句,如此反复,直到表达式的值等于0为止,此时循环结束。第59页/共100页用do-whiledo-while实现循环实现循环用do-while计算:1+2+100。main()int i=1,s=0;do s=s+i;i+;while(i=100);printf(%d,%d,i,s);getch();计算:1-3+5-7+101main()int i=1,s=0;int s=1,t=1;do s=s+t*i;i=i+2 t=-t;while(i1e-6);pi=pi*4;printf(pi=%10.6fn,pi);第61页/共100页while和dowhile循环的比较 上述程序的功能是什么?上述程序的功能是什么?比较:输入比较:输入5 5和和1111时两个程序的输出结果如何?时两个程序的输出结果如何?#include#include void main()void main()int i,sum=0;int i,sum=0;scanf(%d,&i);scanf(%d,&i);do do sum+=i;sum+=i;i+;i+;while(i=10);while(i=10);printf(%d,sum);printf(%d,sum);#include#include void main()void main()int i,sum=0;int i,sum=0;scanf(%d,&i);scanf(%d,&i);while(i=10)while(i=10)sum+=i;sum+=i;i+;i+;printf(%d,sum);printf(%d,sum);当型循环最少执行次数是多少?当型循环最少执行次数是多少?直到型循环,最少执行次数是多少?直到型循环,最少执行次数是多少?第62页/共100页4.4.3用for语句实现循环C C语言中的语言中的forfor语句使用最为灵活,不仅可以用于循环次语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替给出循环结束条件的情况,它完全可以代替whilewhile语句。语句。一般形式:for(for(表达式表达式1 1;表达式;表达式2 2;表达式;表达式3)3)循环体循环体也可写作:也可写作:for(for(循环变量赋初值;循环条件;循环变量增值循环变量赋初值;循环条件;循环变量增值)循环体循环体 for for语句等价于如下的语句等价于如下的whilewhile循环形式:循环形式:表达式表达式1;1;while (while (表达式表达式2)2)语句语句 表达式表达式3 3;第63页/共100页用for语句实现循环for语句的执行过程:(1)先求解表达式1。(2)求解表达式2,若其值为真(值为非0),则执行for语句中指定的内嵌语句,然后执行下面第(3)步。若为假(值为0),则结束循环,转到第(5)步。(3)求解表达式3。(4)转回上面第(2)步骤继续执行。(5)循环结束,执行for语句下面的一个语句 第64页/共100页用for循环计算:1+2+100。main()int i,s=0;for(i=1;i=100;i+)/*注意括号后没有分号*/s=s+i;/*求和:1+2+3+100*/printf(%d,s);变量i用于控制循环次数,我们称其为循环控制变量。1.最后i的值是多少?2.从1加到10000或更多呢?用for语句实现循环第65页/共100页说明:表达式1,表达式2和表达式3之间必须用分号隔开,但表达式3后面不能加分号。循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现。循环体有可能一次也不执行。循环体可以为空。表达式1和表达式3都可以为逗号表达式。(例)表达式1,表达式2和表达式3都可省略,但不鼓励省略表达式2和表达式3。(例:省略表达式1)for语句循环与while循环可以互相转换,但for循环的结构更简洁。第66页/共100页for语句的省略形式例(1):i=1;for (;i=1000;i+)sum=sum+i;例(2):for (i=1;i1000)break;sum=sum+i;1)表达式1可省略,但分号不能省,在for语句前为变量赋初值;2)表达式3也可省略,但应把其放入循环体内,否则for无法正常结束;3)表达式2省略后,for语句将无限循环下去。可在循环体内加退出循环的语句第67页/共100页for语句的省略形式4)表达式1和表达式3可以是一个简单的表达式,也可以是一个逗号表达式,表达式1和表达式3也可以是与循环无关的任意表达式;5)三个表达式全省略,无终止执行循环体,分号不能省;6)把循环体内容放到表达式3,循环体为空语句。尽量避免此写法例(4):i=1,sum=0;for (p=0 ;i1000;sum=sum+i,i+);例(5):i=1,sum=0;for (;)sum=sum+i;i+;if(i100)break;第68页/共100页用for语句实现循环例4.25 求1!+2!+10!的值。void main()int i,n=10;long s,t;for(i=1,t=1,s=0;i=n;i+)t*=i;/*t为上一个数i-1的阶乘值,再乘以i,即i!=(i-1)!*i*/s+=t;/*累加i!*/printf(s=%ldn,s);第69页/共100页用for语句实现循环例4.27 编程输出“斐波那契数列”的前20项。“斐波那契数列”是意大利中世纪数学家列昂纳多斐波那契以兔子繁殖为例子而引入的,故又称为“兔子数列”。main()int i,x1=1,x2=1;for(i=1;i=10;i+)/*每次生成并输出两项,所以循环10次*/printf(%10d%10d ,x1,x2);if(i%2=0)printf(n);/*当i为偶数时换行,即每四个换行*/x1=x1+x2;x2=x2+x1;第70页/共100页用for语句实现循环最简单的写法:main()int i,j,k=100