C语言的控制结构.pptx
11 C语言本身不提供输入输出语句,得由标准I/O库函数提供。输入输出库函数很丰富,可以从键盘、显示器、磁盘文件和硬件端口进行输入或输出操作。本节主要介绍用于键盘输入和显示器输出的函数。3.23.2数据的输入与输出数据的输入与输出第1页/共78页223.23.2数据的输入与输出数据的输入与输出3.2.1字符数据的输入与输出1 1、字符输入函数、字符输入函数int getchar(void)函数功能:函数功能:从输入设备从输入设备(一般为键盘一般为键盘)上输入一个字符。上输入一个字符。它每被调用一次,就从标准输入设备上取一个字符,它每被调用一次,就从标准输入设备上取一个字符,返回值是该字符的返回值是该字符的ASCII编码值。可以赋给字符变量编码值。可以赋给字符变量或整型变量。或整型变量。执行执行getchar()时输入字符后要回车。时输入字符后要回车。例:例:#includevoidmain(void)charc;c=getchar();putchar(c);输出结果输出结果:A A第2页/共78页333.23.2数据的输入与输出数据的输入与输出2 2、字符输出函数、字符输出函数int putchar(int)函数功能:函数功能:向标准输出设备向标准输出设备(一般为显示器一般为显示器)输出一个输出一个字符,并返回该字母的字符,并返回该字母的ASCII码值。参数可以是字符码值。参数可以是字符常量,变量或整型数。常量,变量或整型数。例:例:#include void main(void)char a,b,c;a=b;b=o;c=y;putchar(a);putchar(b);putchar(c);输出结果输出结果:boy第3页/共78页443.23.2数据的输入与输出数据的输入与输出格式输出函数的一般形式printf(“格式控制字符串格式控制字符串”,输出参数表输出参数表);可以是一个或多个输出项.可以是常量或变量表达式,用逗号分隔。类型可以是整型实型字符型和字符串型.用双引号括起来,控制输出项的格式和输出一些提示信息 说明说明:格式字符要用小写(个别的可用大写)格式字符与输出项个数应相同,按先后顺序一一对应格式字符与输出项类型不一致,自动按指定格式输出函数功能:函数功能:按用户指定的格式,把指定的数据显示到显按用户指定的格式,把指定的数据显示到显示器屏幕上示器屏幕上,并返回输出的字符数。这个函数可以输出,并返回输出的字符数。这个函数可以输出多字信息。多字信息。3.2.2格式输出函数第4页/共78页55例:例:include void main(void)int i=97;char ch=a;printf(“i=%d,%cn”,i,i);两个输出项都是变量两个输出项都是变量i,i,但以不同的格式输出但以不同的格式输出,一个是输出的整型数一个是输出的整型数,一个输出的是字符一个输出的是字符a.a.其其格式是由格式是由%d%d与与%c%c控制的控制的.输出结果输出结果:i=97,a3.23.2数据的输入与输出数据的输入与输出第5页/共78页66printf(“i=%d,%c n”,i,i);3.23.2数据的输入与输出数据的输入与输出普通字符,按原样输出转义字符指明特定的操作,如n表示换行而格式说明部分由%和格式字符串组成,下面详细讨论。格式控制由格式控制字符串实现。格式控制符由三部分组成:普通字符:输出时按原样输出,主要用于输出提示信息转义字符:指明特定的操作。输出项格式说明%flagswidth.prech|l|Ltype第6页/共78页77%flagswidth.prech|l|LtypeFlags为选择的标志字符。常用的有:为选择的标志字符。常用的有:-:为左对齐,否则右对齐为左对齐,否则右对齐+:正数输出:正数输出+,负数输出,负数输出-空格:正数输出空格,负数输出空格:正数输出空格,负数输出-Width为宽度指示符。用十进制数来设置输出值的最少输为宽度指示符。用十进制数来设置输出值的最少输出个数,少则补空格,多则按实际输出,缺省则按实际输出个数,少则补空格,多则按实际输出,缺省则按实际输出。出。3.23.2数据的输入与输出数据的输入与输出flags width.prec为精度指示符。用小数点加十进制正整数构成,用来为精度指示符。用小数点加十进制正整数构成,用来限制输出数的精度。限制输出数的精度。.prech|l|L为长度修饰符为长度修饰符h短整数据的值短整数据的值 l 长整型数据的值长整型数据的值 L长双精度数据的值长双精度数据的值h|l|L第7页/共78页88type为格式字符。用来进行格式转换为格式字符。用来进行格式转换d以带符号的十进制形式输出整数(正数不输出符号)以带符号的十进制形式输出整数(正数不输出符号)o以以8进制无符号形式输出整数(不输出前导符进制无符号形式输出整数(不输出前导符O)x(X)以以16进制无符号形式输出整数(不输出前导符进制无符号形式输出整数(不输出前导符Ox)u以无符号以无符号10进制形式输出整数进制形式输出整数 c以字符形式输出一个字符以字符形式输出一个字符s输出字符串输出字符串 f以小数形式输出单、双精度数,隐含输出以小数形式输出单、双精度数,隐含输出6位小数位小数 e(E)以标准指数形式输出单、双精度数,小数位数为以标准指数形式输出单、双精度数,小数位数为6位位 g(G)选用选用%f或或%e格式中输出宽度较短的一种格式格式中输出宽度较短的一种格式%百分号百分号3.23.2数据的输入与输出数据的输入与输出%flagswidth.prech|l|Ltypetype第8页/共78页9printf 常用格式字符转换转换字符字符参数参数类型类型输输 出出格格 式式dint以带符号的十进制形式输出整数以带符号的十进制形式输出整数(正数不输出符号正数不输出符号)oint以八进制无符号形式输出整数以八进制无符号形式输出整数(不输出前导符不输出前导符0)。xint以十六进制无符号形式输出整数以十六进制无符号形式输出整数(不输出前导符不输出前导符0 x)。uint以无符号十进制形式输出整数。以无符号十进制形式输出整数。cint单个字符单个字符schar*字符串字符串fdouble 以小数形式输出单、双精度数以小数形式输出单、双精度数,隐含输出隐含输出6位小数。位小数。edouble以标准制数形式输出单、双精度数以标准制数形式输出单、双精度数,数字部分小数位数数字部分小数位数为为6位。位。gdouble选用选用%f或或%e格式中输出宽度较短的一种格式,不输格式中输出宽度较短的一种格式,不输出无意义的出无意义的0。第9页/共78页10printf 附加格式说明字符字字 符符意意 义义特征符特征符-(减号)(减号)在指定的区域内以左对齐方式输出在指定的区域内以左对齐方式输出+输出正值时前冠以正号输出正值时前冠以正号+空格空格输出第一个字符不是符号时,要输出一个空格输出第一个字符不是符号时,要输出一个空格0(零)(零)在域宽范围内用前导在域宽范围内用前导0填补空位填补空位#对于对于O格式输出前导格式输出前导0,对于,对于X或或x格式要输出格式要输出0X或或0 x前缀,对于前缀,对于G或或g格式不删除尾部零格式不删除尾部零域宽域宽m(正整数)(正整数)指出输出数据的最小域宽。如果数据的实际宽度指出输出数据的最小域宽。如果数据的实际宽度m,则按实际宽度输出。,则按实际宽度输出。m.n对实数,表示输出数据共占对实数,表示输出数据共占m列列,n指出输出数据指出输出数据的精度,表示输出的精度,表示输出n位小数位小数长度修饰长度修饰符符h指出输出参数是指出输出参数是 short intl指出输出参数是指出输出参数是 long intL指出输出参数是指出输出参数是 long double第10页/共78页11113.23.2数据的输入与输出数据的输入与输出3.2.2格式输入函数函数功能:函数功能:从键盘输入任何类型的数据给所指定的单元,从键盘输入任何类型的数据给所指定的单元,并返回输入的数据个数。并返回输入的数据个数。格式输入函数一般形式scanf(“格式控制字符串格式控制字符串”,地址列表地址列表);例如:例如:scanf(“%d%d%f”,&a,&b,&c);控制字符串说明了需输入数据的类型,两个整型数和控制字符串说明了需输入数据的类型,两个整型数和一个实型数。一个实型数。&a&a,&b&b和和&c&c是变量是变量a a,b b和和c c的地址。的地址。第11页/共78页1212%*widthh|l|Ltype输入赋值抑制字符,输入数据但不赋值输入赋值抑制字符,输入数据但不赋值3.23.2数据的输入与输出数据的输入与输出*widthhL宽度指示符,表示最多可输入的字符个数。宽度指示符,表示最多可输入的字符个数。|输入数据类型。输入数据类型。h短整型,短整型,l长整型,长整型,L长双精度型长双精度型l第12页/共78页1313%*widthh|l|Ltypetype是必须的,表示输入后转换的数据类型。是必须的,表示输入后转换的数据类型。d(D)十进制整数十进制整数o(O)八进制整数八进制整数x(X)十六进制整数十六进制整数i(I)自动根据数头分辨十、八、十六进制自动根据数头分辨十、八、十六进制u(U)无符号十进制整数无符号十进制整数c单个字符单个字符s字符串字符串f(e,g,G)实数实数n不输入数据,将已读入的字符输送到对应的地址中不输入数据,将已读入的字符输送到对应的地址中%百分号百分号3.23.2数据的输入与输出数据的输入与输出type第13页/共78页14scanf常用的格式字符格式字符格式字符参数类型参数类型说说明明dint*用来输入十进制整数oint*用来输入八进制整数xint*用来输入十六进制整数uunsigned*用来输入无符号十进制整数cchar*用来输入单个字符。schar*无空白字符的字符串;参数指向一个可容纳该字符串的足够大的数组,转换时要添加0e,f,gfloat*用来输入float 数,可以用小数形式或指数形式输入。第14页/共78页1515使用scanf应注意:scanfscanf()的格式控制字符串中的字符不是用于输出()的格式控制字符串中的字符不是用于输出的的,都是要求输入的。都是要求输入的。scanfscanf(”x=%dx=%d”,&x&x);参数的第二部分一定是地址列表参数的第二部分一定是地址列表,不能是表达式,请不能是表达式,请记得在变量前加上记得在变量前加上&。且地址列表的参数与格式说明。且地址列表的参数与格式说明个数应保持一致。个数应保持一致。执行执行scanf()scanf()输入数据时,在两个数据之间允许以一输入数据时,在两个数据之间允许以一个或多个空格间隔,也可以用回车键、个或多个空格间隔,也可以用回车键、tabtab键分隔。键分隔。实数不许规定精度,像实数不许规定精度,像%10.4f%10.4f是不合法的。是不合法的。%后面有后面有*号时,该数据会被禁止使用。号时,该数据会被禁止使用。如果输入时类型不匹配则停止处理,返回如果输入时类型不匹配则停止处理,返回0 0。3.23.2数据的输入与输出数据的输入与输出第15页/共78页16例1:int i;char c;scanf(%d%c,&i,&c);执行时输入1234a 则1234被赋给i,a被赋给c。但若输入1234 a 则i值同上,c被赋予一个空格。第16页/共78页17例2:int day,year;char month10;scanf(%d%s%d,&day,month,&year);执行时输入:25 Dec 1996 则整数25被赋予day,字符串“Dec”被赋予数组month,整数1996被赋予month.第17页/共78页18例3:int i,j;scanf(%d%d,&i,&j);执行时输入12a 则整数12被赋予i,由于第二输入域是字符a,与第二个转换说明%d不相匹配而不能转化,因而j未被赋值.第18页/共78页19例4:当格式字符串中包含有普通字符时,在输入流中相应位置中必须有相同的字符与之匹配。scanf(%d,%d,%d),&i,&j,&k);执行时输入10,20,30 其中10,20和30之间必须有且仅有一个逗号字符。第19页/共78页20例5:若要读入long 和 double 数据,需用长度修饰符 double y;long x;scanf(%lf%ld,&y,&x);执行时输入12 60 浮点数12.0赋予y,60赋予x第20页/共78页21例6:若指定了*,则输入域被跳过,不赋值。double v1,v2,v3;scanf(%lf%*d%lf%*d%lf%*d,&v1,&v2,&v3);执行时输入11 22 33 44 55 66 浮点数11.0赋予v1,33.0赋予v2,55.0赋予v3;输入域22,44,66被跳过。第21页/共78页22例7:指定域宽的整数,如果说明了域宽,则输入域直到域宽用完为止。char name20;scanf(%8s,name);执行时输入abcdefghi 字符串abcdefgh被赋给字符数组name,输入域为9个字符,域宽为指定的8,所以只有前8个字符被读入。第22页/共78页2323例例3.13.1 输入圆的半径,输出圆的周长和面积。分析:1.定义实型变量r、l、s用于存放半径、周长、面积;2.调用输入函数,输入r:3.分别利用周长公式和面积公式求出l、s;4.调用输出函数输出l、s。程序举例程序举例 3.23.2数据的输入与输出数据的输入与输出第23页/共78页2424程序:#include void main()float r,l,s;scanf(%f,&r);/*输入一个浮点数据,存入地址&r*/l=2*3.14159*r;/*计算周长,赋值给l*/s=3.14159*r*r;/*计算面积,赋值给s*/printf(n l=%8.4f,l);/*周长占8个字符宽,4位小数*/printf(n s=%8.4f,s);/*输出面积,数据共占8个字符宽,4位小数*/3.23.2数据的输入与输出数据的输入与输出第24页/共78页2525分析:1.输入小写字母存入变量a;2.转换成大写a=a-32;3.输出 a.例例3.23.2 从键盘输入一个小写字母,用大写形式输出该字母。3.23.2数据的输入与输出数据的输入与输出第25页/共78页2626#include“stdio.h”void main()char a;printf(“Input a lowercase letter:”);a=getchar();a=a-32;/*将大写字母转换成对应的小写字母*/printf(“%c n”,a);思考:如何使程序可以处理任何字符的输入。即判断输入的是小写字母,才转换成大写;如果输入的其他字符,则直接输出。3.23.2数据的输入与输出数据的输入与输出程序:第26页/共78页2727结构化程序设计基本思想:任何程序都可以用三种基本结构表示,限制使用无条件转移语句(goto)结构化程序:由三种基本结构反复嵌套构成的程序叫优点:结构清晰,易读,提高程序设计质量和效率三种基本结构3.33.3基本控制结构与流程控制语句基本控制结构与流程控制语句顺序结构顺序结构ABab第27页/共78页2828二分支选择结构二分支选择结构多分支选择结构多分支选择结构选择结构选择结构3.33.3基本控制结构与流程控制语句基本控制结构与流程控制语句PAB真假bakA1A2AiAnk=k2k=k1k=knk=ki.ab第28页/共78页2929l当型循环结构l直到型循环结构PA假真baAP假真ba循环结构循环结构3.33.3基本控制结构与流程控制语句基本控制结构与流程控制语句第29页/共78页30303.33.3基本控制结构与流程控制语句基本控制结构与流程控制语句三种基本控制结构的特点:三种基本控制结构的特点:l只有一个入口只有一个入口l只有一个出口只有一个出口l结构内的每一部分都有机会被执行到。即,对每结构内的每一部分都有机会被执行到。即,对每一个框来说,都应当有一条从入口到出口的路径通过一个框来说,都应当有一条从入口到出口的路径通过它它l结构内不存在死循环结构内不存在死循环APAB注:注:A,B,A1.An可以是一个简单语句,也可以是一个基本结构可以是一个简单语句,也可以是一个基本结构x xx x第30页/共78页3131例如计算分段函数分析:计算 x0,如果结果为1:计算:y=3-x;否则,计算:y=2*x;需要根据x的值进行流程选择(分支)。3.43.4选择结构控制选择结构控制第31页/共78页3232#include void main(void)float x,y;scanf(“%f”,&x);y=2*x;if(x 0)y=3-x;printf(“y=%6.2f”,y);形式一(单分支选择结构):形式一(单分支选择结构):格式:格式:if(表达式)语句执行过程:执行过程:表达式语句语句非非0=0表达式语句语句1语句语句2非非0=0形式二(双分支选择结构)形式二(双分支选择结构):格式格式:if(表达式)语句1else语句2执行过程:执行过程:3.4.1if语句的形式#include void main(void)float x,y;scanf(“%f”,&x);if(x 0)y=3-x;else y=2*x;printf(“y=%6.2f”,y);3.43.4选择结构控制选择结构控制#include void main(void)float x,y;scanf(“%f”,&x);y=2*x;if(x b 则输出a;否则,输出b。#include void main(void)float a,b;scanf(“%f%f”,&a,&b);if (ab)printf(“%f”,a);else printf(“%f”,b);第33页/共78页3434表达式1语句语句1非非0=0表达式2表达式3语句语句n语句语句3语句语句2非非0非非0=0=0形式三(多分支选择结构):形式三(多分支选择结构):格式:格式:if(表达式1)语句1else if(表达式2)语句2.else 语句n 执行过程:执行过程:3.43.4选择结构控制选择结构控制例:例:if(salary1000)index=0.4;else if(salary800)index=0.3;else if(salary600)index=0.2;else if(salary400)index=0.1;else index=0;第34页/共78页35353.43.4选择结构控制选择结构控制 写一个程序完成下列功能:1 输入一个分数score 2 score60 输出 E 3 60=score 70 输出 D 4 70=score 80 输出 C 5 80=score 90 输出 B 5 90=score 输出 A#include void main(void)int score;scanf(“%d”,&score);if(score60)printf(“%c”,E);else if(score 70)printf(“%c”,D);else if(score 80)printf(“%c”,C);else if(score 90)printf(“%c”,B);else printf(“%c”,A);第35页/共78页3636如:如:if(a=b&x=y)printf(“a=b,x=y”);if(3)printf(“OK”);if(a)printf(“%d”,a);if(x)if(x!=0)if(!x)if(x=0)说明:说明:ifif语句中的表达式一般为关系或逻辑表达式,也可以语句中的表达式一般为关系或逻辑表达式,也可以为任何数值类型的表达式。为任何数值类型的表达式。执行语句可以是一条简单语句、空语句或复合语句,执行语句可以是一条简单语句、空语句或复合语句,也可以嵌套其它流程控制语句。也可以嵌套其它流程控制语句。3.43.4选择结构控制选择结构控制例例 考虑下面程序的输出结果考虑下面程序的输出结果:#include main()int x,y;scanf(“%d,%d”,&x,&y);if(xy)x=y;y=x;else x+;y+;printf(“%d,%dn”,x,y);Compile Error!第36页/共78页37373.43.4选择结构控制选择结构控制问题:输入两个字符ch1和ch2,如果ch1=Z 且 ch2=B,则输出“You are right!”#includevoid main(void)char ch1,ch2;ch1=getchar();ch2=getchar();if(ch1=Z&ch2=B )printf(“You are right!“);复杂条件选择第37页/共78页3838if(表达式表达式1)if(表达式表达式2)语句语句1 else 语句语句2else if(表达式表达式3)语句语句3 else 语句语句4内嵌内嵌if内嵌内嵌ifif(表达式表达式1)if(表达式表达式2)语句语句1 else 语句语句2内嵌内嵌ifif(表达式表达式1)if(表达式表达式2)语句语句1else 语句语句3 内嵌内嵌ifif(表达式表达式1)语句语句1else if(表达式表达式3)语句语句3 else 语句语句4内嵌内嵌ifif语句嵌套语句嵌套3.43.4选择结构控制选择结构控制第38页/共78页3939#include void main(void)int x,y;printf(Enter integer x,y:);scanf(“%d,%d,&x,&y);if(x!=y)if(xy)printf(XYn);else printf(XYn);else printf(X=Yn);运行:运行:Enter integer x,y:12,23 XY Enter integer x,y:12,12 X=Y例例 输入两数并判断其大小关系3.43.4选择结构控制选择结构控制第39页/共78页4040缺省 时,else总是和它上面离它最近的未配对的if配对if()if()if()else.else.else.if else 配对原则:3.43.4选择结构控制选择结构控制第40页/共78页4141例:例:if(a=b)if(b=c)printf(“a=b=c”);else printf(“a!=b”);修改:修改:if(a=b)if(b=c)printf(“a=b=c”);else printf(“a!=b”);实现实现if else 正确正确配对配对方法:加方法:加 3.43.4选择结构控制选择结构控制第41页/共78页42423.43.4选择结构控制选择结构控制例例4.44.4 编程实现:根据两个数sex和tall分类,如果sex为F,当tall大于等于150时,输出”A“,否则输出“B“;若sex不为F,当tall大于等于170时,输出A,否则输出B。分析:根据sex分支在sex为F的分支中判断tall=150否在sex不为F的分支中判断tall=170否#includevoid main(void)int tall;char sex;printf(“input sex and tall:”);scanf(“%c%d”,&sex,&tall);if (sex=F)if (tall=150)printf(“A”);else printf(“B”);else if (tall=170)printf(“A”);else printf(“B”);第42页/共78页4343v一般形式:一般形式:switch(表达式表达式)case 常量表达式常量表达式1:语句组语句组 1;break;case 常量表达式常量表达式2:语句组语句组 2;break;.case En:语句组语句组 n;break;default:语句组语句组;break;v执行过程执行过程:switch表达式语句组语句组1语句组语句组2语句组语句组n语句组语句组.E 1E 2Endefaultcase 3.53.5多分支选择控制语句多分支选择控制语句switchswitch语句语句第43页/共78页44443.53.5多分支选择控制语句多分支选择控制语句switchswitch语句语句例如:例如:要求按照考试成绩的等级打印出百分制分数要求按照考试成绩的等级打印出百分制分数段,可以用段,可以用switch语句实现:语句实现:switch(grade)case A:printf(“85100n”);case B:printf(“7084n”);case C:printf(“6069n”);case D:printf(“60n”);default:printf(“errorn”);运行结果:若运行结果:若grade=A则输出:则输出:85100 7084 6069 60 error第44页/共78页4545说明:说明:3.53.5多分支选择控制语句多分支选择控制语句switchswitch语句语句l语句中的表达式可以是数字型或字符型,表达式的值,称为开语句中的表达式可以是数字型或字符型,表达式的值,称为开关值。关值。l语句结构中各个语句结构中各个casecase后常量表达式的值必须互不相同;否则执后常量表达式的值必须互不相同;否则执行时将出现矛盾,即同一个开关值,对应多种执行方案行时将出现矛盾,即同一个开关值,对应多种执行方案l当表达式的值与某一个常量相等时,就执行后面的语句;若无当表达式的值与某一个常量相等时,就执行后面的语句;若无breakbreak语句,执行该语句后,流程控制转移到下一个分支语句,执行该语句后,流程控制转移到下一个分支:继续继续执行这一个分支的语句,一直到最后一个语句执行完。执行这一个分支的语句,一直到最后一个语句执行完。l当表达式的值与所有常量表达式的值不相等时,执行当表达式的值与所有常量表达式的值不相等时,执行default:default:后面的语句。后面的语句。lcasecase后可包含多个可执行语句,且不必加后可包含多个可执行语句,且不必加 lswitchswitch可嵌套可嵌套l多个多个casecase可共用一组执行语句可共用一组执行语句switch(grade)case A:printf(“85100n”);break;case B:printf(“7084n”);break;case C:printf(“6069n”);break;case D:printf(“60n”);break;.第45页/共78页4646例例 switch(score)case 5:printf(“Very good!”);case 4:printf(“Good!”);case 3:printf(“Pass!”);case 2:printf(“Fail!”);default :printf(“data error!”);运行结果:运行结果:score为为5时,输出:时,输出:Very good!Good!Pass!Fail!data error!3.53.5多分支选择控制语句多分支选择控制语句switchswitch语句语句要求:要求:当当score为为5时,时,输出:输出:Very good!Good!当当score为为2时,输出:时,输出:Fail!break;break;第46页/共78页4747#include void main(void)int c;printf(Enter m or n or h or other:);c=getchar();switch(c)case m:printf(nGood morning!n);break;case n:printf(nGood night!n);break;case h:printf(nHello!n);break;default:printf(n?n);break;例例 根据输入字母输出字符串3.53.5多分支选择控制语句多分支选择控制语句switchswitch语句语句第47页/共78页48483.63.6循环控制循环控制问题:求问题:求1至至5的和的和#includevoidmain(void)inta=1,b=2,c=3,d=4,e=5,sum;sum=a+b+c+d+e;printf(“sum=%d”,sum);5个变量#includevoidmain(void)inta=1,sum;sum=a;a=a+1;sum=sum+a;a=a+1;sum=sum+a;a=a+1;sum=sum+a;a=a+1;sum=sum+a;printf(“sum=%d”,sum);若求若求1 1至至100100的和?的和?第48页/共78页49493.63.6循环控制循环控制C语言有while、do-while、和for语句三种循环结构语句。前两个称为条件循环,即根据条件来决定是否继续循环;后一个称为计数循环,即根据设定的执行次数来执行循环。第49页/共78页5050v一般形式一般形式:while (表达式表达式)循环体语句;循环体语句;v执行流程:执行流程:表达式循环体循环体假假(0)真真(非非0)while3.63.6循环控制循环控制3.6.1while语句第50页/共78页5151v特点:先判断表达式,后执行循环体特点:先判断表达式,后执行循环体v说明:说明:l循环体有可能一次也不执行循环体有可能一次也不执行l循环体可为任意类型语句循环体可为任意类型语句l下列情况,退出下列情况,退出whilewhile循环循环u条件表达式不成立(为零)条件表达式不成立(为零)u循环体内遇循环体内遇break,returnbreak,returnl循环体中应有使循环趋向于结束的语句。循环体中应有使循环趋向于结束的语句。While语句特点和语句特点和说明说明3.63.6循环控制循环控制例如例如:i=1;while(i=100)putchar(*);i+;第51页/共78页5252用用while循环求循环求1至至100的和的和#include void main(void)int i,sum=0;i=1;while(i=100)sum=sum+i;i+;printf(“%d,sum);循环初值循环初值循环终值循环终值循环变量增值循环变量增值循环条件循环条件循环体循环体3.63.6循环控制循环控制第52页/共78页5353#include void main(void)int i=1;while(i=10)printf(%d*%d=%dn,i,i,i*i);i+;运行结果:运行结果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=100例例 显示110的平方3.63.6循环控制循环控制第53页/共78页5454v一般形式:一般形式:do 循环体语句;循环体语句;while(表达式表达式);v执行流程:执行流程:do循环体循环体expr假假(0)真真(非非0)while3.63.6循环控制循环控制3.6.2do-while语句第54页/共78页5555v特点:先执行循环体,后判断表达式特点:先执行循环体,后判断表达式v说明:说明:l至少执行一次循环体至少执行一次循环体ldowhile可转化成可转化成while结构结构表达式循环体循环体假假(0)真真(非非0)循环体循环体While循环dowhile语句特点和说明语句特点和说明3.63.6循环控制循环控制第55页/共78页56563.63.6循环控制循环控制用用do-while循环求循环求1至至100的和的和#include void main(void)int i,sum=0;i=1;do sum=sum+i;i+;while(i=100)printf(%d,sum);#include void main(void)int i,sum=0;i=1;while(i=100)sum=sum+i;i+;printf(%d,sum);运行结果:运行结果:5050 运行结果:运行结果:5050i=101;i=101;运行结果:运行结果:0 运行结果:运行结果:101第56页/共78页5757v一般形式:一般形式:for(表达式表达式1;表达式表达式2;表达式表达式3)循环体语句;循环体语句;v执行流程:执行流程:表达式2循环体循环体假假(0)真真(非非0)for表达式表达式1表达式表达式33.63.6循环控制循环控制3.6.3for语句第57页/共78页5858l for语句中语句中表达式表达式1,表达式表达式2,表达式表达式3 类型任意,类型任意,都可省略,但分号;不可省都可省略,但分号;不可省l for语句可以转换成语句可以转换成while结构结构如已先给变量赋过值。如已先给变量赋过值。则可以省略表达式则可以省略表达式1。如果想在循环内部改如果想在循环内部改变变量的值,则可以变变量的值,则可以省略表达式省略表达式3。如果都省略的话就相如果都省略的话就相当于当于while。全部省略就是死循环。全部省略就是死循环。表达式表达式1;while(表达式表达式2)循环体语句;循环体语句;表达式表达式3;3.63.6循环控制循环控制for语句说明语句说明for(;i100;i+)for(;i100;i+)for(i=0;i100;)for(i=0;i100;)for(;i100;)for(;i100;)while(i100)while(i100)for(;)(for(;)(需要用需要用breakbreak跳出跳出)运行结果:运行结果:abcdefghij#include void main(void)int i=0;for(i=0;i10;i+)putchar(a+i);#include void main(void)int i=0;for(;i10;i+)putchar(a+i);#include void main(void)int i=0;for(;i10;)putchar(a+(i+);#include void main(void)int i=0;for(;i10;putchar(a+i),i+);第58页/共78页59593.63.6循环控制循环控制用用for循环求循环求1至至100的和的和#include voidmain(void)int i,sum=0;i=1;do sum=sum+i;i+;while(i=100);printf(%d,sum);#include voidmain(void)int i,sum=0;i=1;while(i=100)sum=sum+i;i+;printf(%d,sum);#include void main(void)int i,sum=0;for(i=0;i=100;i+)sum=sum+i;printf(%d,sum);第59页/共78页60603.63.6循环控制循环控制3.6.4循环的嵌套 在循环体语句中又有另一个完整的循环结构的形式,称为循环的嵌套。嵌套在循环体内的循环语句称为内循环,外面的循环语句称为外循环。如果内循环体中又有嵌套的循环语句,称为多层循环。While、do-while、for三种循环都可以互相嵌套。循循环环嵌嵌套套的的程程序序中中,要要求求内内循循环环必必须须被被包包含含在在外外层层循循环环的的循循环环体体中中,不不允允许许出出现现内内外外层层循循环环体体交交叉叉的的情况。情况。第60页/共78页6161v三种循环可互相嵌套三种循环可互相嵌套,层数不限层数不限v外层循环可包含两个以上内循环外层循环可包含两个以上内循环,但不能相互交叉但不能相互交叉v嵌套循环的一般形式嵌套循环的一般形式(1)while()while().(2)do do while();.while();(3)while()do while();.(4)for(;)do while();while().内循