《《C语句和流程控制》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《C语句和流程控制》PPT课件.ppt(32页珍藏版)》请在金锄头文库上搜索。
1、第三章第三章 语句和流程控制语句和流程控制 第三章第三章 语句和流程控制语句和流程控制 3.1 C语句概述语句概述 3.2 基本语句基本语句 3.3 复合语句复合语句 3.4 控制语句控制语句 3.5 分支结构程序设计语句分支结构程序设计语句 3.6 循环语句循环语句 3.7 其他的控制语句其他的控制语句 3.8 循环的退出及死循环的避免循环的退出及死循环的避免 3.9 程序举例程序举例 第三章第三章 语句和流程控制语句和流程控制 3.1 C C语句概述语句概述 C语言有四种类型的语句:基本语句、复合语句、控制语句和空语句。如下图所示。 其中空语句是什么都不做的语句,它只有一个分号“;”,构成
2、C语言中最主要的语句是前三种语句,下面分别介绍它们。 第三章第三章 语句和流程控制语句和流程控制 3.2 基本语句基本语句 C语言的基本语句可分为表达式语句、函数调用语句和说明语句三种。(1)表达式语句在上一章介绍的一些表达式之后紧跟着加上一个分号“;”,即可形成表达式语句。如:x=7;i+;i-;x=y*z;它们分别为赋值语句、增减1语句和算术运算语句。注意:并不是所有的表达式都可加上分号构成C的语句。如“i+j”表达式加上分号形成的“i+j;”没有任何意义,不是语句。(2)函数调用语句由带特定参数的一次函数调用加上一个分号构成。如:printf(China);scanf(%d,&a);是两
3、个库printf()、scanf()函数调用语句。 第三章第三章 语句和流程控制语句和流程控制 (3)说明语句说明语句包括变量定义语句和变量说明、函数说明、结构说明等。例如:intx,y,z=3;定义x,y,z为整型变量staticintw;定义w为静态整型变量intmax();定义ax是整型函数structstudentstu;定义stu是结构体类型变量3.2 基本语句基本语句 第三章第三章 语句和流程控制语句和流程控制 3.3 复合语句复合语句 复合语句也称为程序块。其一般形式是: 说明部分说明部分语句部分语句部分它是由一对花括号(“”和“”)括起来的说明部分和语句部分组合而成的复合结构。
4、最简单的复合语句是单纯由二至多个语句经花括号括起来的结构形式。至今我们见到的复合语句是在函数中,函数的执行部分(函数体)总是一个复合语句。复合语句中可以有说明部分,也可以没有。【例3.1】a和b的数值进行交换的多个语句,可用“”和“”括起来形成复合语句。main()inta,b,t;scanf(%d%d,&a,&b);if(a%dn,a,b);也可以把变量t的说明语句放在复合语句中第三章第三章 语句和流程控制语句和流程控制 main()inta,b;scanf(%d%d,&a,&b);if(ab)intt;t=a;a=b;b=t;printf(%d%dn,a,b);在C语言中,每个变量都有其作
5、用域,作用域为从定义它的地方开始,到同一层对应的右括号结束。即使外层中定义了与它同名的变量,内层中出现的该名字意味着内层变量起作用,而外层变量的访问被阻塞。关于变量的作用域,在第5章将会详细讨论。 3.3 复合语句复合语句 第三章第三章 语句和流程控制语句和流程控制 3.4 控制语句控制语句 对于任何一种计算机程序来说,不外乎有这样三种基本结构(也称为流程控制):顺序结构、选择结构、循环结构。下面在学习各种程序设计语句之前,我们首先一起学习语言的几种基本结构及其描述方式。3.4.1 顺序结构顺序结构在前面所讨论的大多数是顺序结构。在顺序结构中,语句都是表达式语句或其复合构成的复合语句。程序的执
6、行按语句的出现或安放的顺序依次执行。如图所示。 第三章第三章 语句和流程控制语句和流程控制 3.4.2 选择结构选择结构选择结构如图32(b)所示。条件成立则执行语句,否则执行。、只能执行一个,、的出口路径汇合在一起。3.4.3 循环结构循环结构循环结构分为当型循环和直到型循环结构,如图32(c)(d)所示。当型循环结构先判断是否为真,若为真执行;再判断是否为真,若为真再执行,如此反复,直到为假。直到型循环结构先执行,再判断是否为假,若为假再执行,如此反复,直到为真。下面各节将基于上面各种结构分别介绍它们所对应的语句。 3.4 控制语句控制语句 第三章第三章 语句和流程控制语句和流程控制 3.
7、5 分支结构程序设计语句分支结构程序设计语句 1if语句if语句为判断语句,其一般形式有三种:(1)if(表达式)表达式) 语句语句S(2)if(表达式)表达式) 语句语句S1 else 语句语句S2(3)if(表达式表达式1) 语句语句S1else if(表达式表达式2) 语句语句S2else if(表达式表达式3) 语句语句S3 else if(表达式表达式n) 语句语句Snelse 语句语句Sn+1先看第(1)种形式。它将根据表达式的值决定是否执行“语句S”。被测试的条件是圆括号中的表达式,若表达式的值非零(表示该条件成立或关系真),则执行“语句S”,否则跳过“语句S”。如图所示。其中“
8、语句S”既可是单个C语句,也可以是多个C语句组成的复合语句。 第三章第三章 语句和流程控制语句和流程控制 再看第(2)种形式:if(表达式)语句S1else语句S2当表达式的值非0,执行语句S1,否则执行语句S2。流程如图所示。3.5 分支结构程序设计语句分支结构程序设计语句 第三章第三章 语句和流程控制语句和流程控制 2if语句的嵌套语句的嵌套if语句的嵌套是指在if语句中又包含了一个或多个if语句。一般形式如下:if (表达式表达式) if(表达式表达式) 语句语句1 else 语句语句2elseif(表达式表达式) 语句语句3 else 语句语句4说明:(1)if与else是配对关系,e
9、lse总是与它上面最近的if配对。(2)可用复合语句来改变配对关系。如:if (表达式表达式) if(表达式表达式) 语句语句1elseif(表达式表达式) 语句语句3 else 语句语句4对if语句的嵌套层数c语言没有限制。 3.5 分支结构程序设计语句分支结构程序设计语句 第三章第三章 语句和流程控制语句和流程控制 3.5 分支结构程序设计语句分支结构程序设计语句 第三章第三章 语句和流程控制语句和流程控制 【例】用户从键盘键入+、-、*和/中的任意一个,屏幕上出现对应的英文单词plus,minus,multiply,divide。若按了其他键,屏幕上出现问号。#inlcludestdio
10、.hmain()intc;c=getchar();if(c=+)printf(plusn);elseif(c=-)printf(minusn);elseif(c=)printf(multiplyn);elseif(c=/)printf(dividen);elseprintf(?n);3.5 分支结构程序设计语句分支结构程序设计语句 第三章第三章 语句和流程控制语句和流程控制 3switch语句(开关语句)语句(开关语句)switch语句用于多路选择转向的程序中,也就是多路分支结构的程序。前面曾用多重的ifelse语句来表示多路选择转向,现在用switch语句来实现更为清楚简明。switch语句
11、的一般形式: switch (表达式表达式) case 常量表达式常量表达式1:语句:语句1 case 常量表达式常量表达式2:语句:语句2 case 常量表达式常量表达式n:语句语句n default: 语句语句n+1 3.5 分支结构程序设计语句分支结构程序设计语句 第三章第三章 语句和流程控制语句和流程控制 关于switch语句的相关说明:(1)switch后面括号内的表达式,可以是整形表达式、字符型表达式,也可以是枚举型数据,且必须与case后的常量表达式的类型一致;(2)case和default后的语句可以是任意语句,不必用花括号括起来构成复合语句,会自动顺序执行本case后面的可执
12、行语句;(3)case和default相当于语句标号,当表达式的值与某个case后面常量表达式的值相等时,就从该case后面的语句开始执行,直到遇到break语句或switch语句结束。如果所有的常量表达式的值都没有与表达式的值匹配,就从default后面的语句开始执行,直到遇到break语句或执行到switch语句结束。在没有default语句时,什么也不执行,直接执行switch的后继语句;(4)同一个switch语句中,任意两个case的常量均不允许有相同的值,嵌套例外。(5)如果希望在某个case和default分支执行后使流程跳出switch语句,则可以在该分支的最后加上一条brea
13、k语句。如果各个case和default都是独立的分支时,它们都可以用一条break语句中止,这时它们在switch语句中出现的次序不影响执行结果。(6)多个case可以共用一组执行语句,如caseA:caseB:caseC:printf(60n);break;表达式的值为A、B或C时都执行同一组语句。3.5 分支结构程序设计语句分支结构程序设计语句 第三章第三章 语句和流程控制语句和流程控制 3.5 分支结构程序设计语句分支结构程序设计语句 【例】写一个程序,求某年某月的月天数。main()inty,m,d;scanf(%d,%d,&m,&d);switch(m)case4:case6:ca
14、se9:case11:d=30;break;case2:d=28+(y%d=0&y%100!=0|y%400=0);break;default:d=31;printf(y=%d,m=%d,d=%dn,y,m,d);第三章第三章 语句和流程控制语句和流程控制 3.6 循环语句循环语句 3.6.1 while循环语句循环语句while循环语句的一般形式为:while (表达式)表达式) 语句语句S它表示,当表达式的值为非0(即表达式为真),就执行语句S;再计算表达式的值,若非0,再执行语句S,直到表达式计算的结果为0(即表达式为假),结束循环。有的书上称为“当型循环”。其流程如图34所示。 第三章
15、第三章 语句和流程控制语句和流程控制 【例3.7】把输入的字符原样输出,直到输入“?”为止。#includestdio.hmain()charc;while(c=getchar()!=?)putchar(c);【例3.8】求1至100的和。main()inti=1,sum=0;while(i=100)sum=sum+i;i+;printf(sum=%d,sum);3.6 循环语句循环语句 第三章第三章 语句和流程控制语句和流程控制 3.6.2 dowhile 语句语句dowhile语句的一般格式为: do 语句语句 S while (表达式);表达式);它表示,首先执行“语句S”,再计算表达式
16、的值。当表达式的值为非零时,重复执行循环体“语句S”,直到表达式的值为零时结束dowhile循环。如图35所示。 3.6 循环语句循环语句 第三章第三章 语句和流程控制语句和流程控制 【例3.9】求1至100之和。main()inti=1,sum=0;dosum+=i;i+;while(i=100);printf(sum=%dn,sum);【例3.10】在屏幕上显示若干行同一内容的字符串IloveChina!main()inti;scanf(%dn,&i);doprintf(IloveChina!);while(i-);3.6 循环语句循环语句 第三章第三章 语句和流程控制语句和流程控制 3.
17、6.3for循环语句for循环语句的一般形式为:for(表达式E1;表达式E2;表达式E3)语句S其流程图如图36所示。它等价于语句:表达式E1;while(表达式E2)假真计算表达式E1计算表达式E2E2=?语句S计算表达式E3for语句入口语句S表达式E3;3.6 循环语句循环语句 第三章第三章 语句和流程控制语句和流程控制 从图中可以看出:第一个“表达式E1”用来使循环初始化。“表达式E2”指出测试条件,当“表达式E2”的值不等于0(真),进行一次循环,与while的工作方式相同;当“表达式E2”的值为0时(假),结束循环。“表达式E3”规定循环中每次迭代后的增量。【例3.11】使用fo
18、r循环语句求1100之和。main()inti,sum=0;for(i=1;i=100;i+)sum=sum+i;printf(sum=%dn,sum);也可以省略for语句中的“表达式E1”或“表达式E3”,将控制循环变量的初始化及增量修改在其他地方表示出来。可改写成: 3.6 循环语句循环语句 第三章第三章 语句和流程控制语句和流程控制 main()inti=1,sum=0;for(;i=100;)sum=sum+i;+i;printf(sum=%dn,sum);在for语句中,表达式E1、E2和E3并不限于整型,可以是枚举型、浮点型等类型。例如下面语句是合法的:for(x=0.0;x=5
19、.0;x=(x+0.1)printf(%f%fn,x,xx); 3.6 循环语句循环语句 第三章第三章 语句和流程控制语句和流程控制 3.6.4 goto语句和带标号的语句语句和带标号的语句goto语句是无条件转移语句,其一般形式如下:goto 标号;标号;其中标号是一标识符。goto语句的含义是把程序的执行流成转移到标号标识的语句处。即转到同一函数内具有如下形式的带标号的语句:标号:语句标号:语句标号表明了goto的转向目的地。在C语言中任何语句都可以带标号。【例4.12】用if语句、goto语句和带标号的语句构成循环求1到100之和。main()inti=1,sum=0;loop:sum=
20、sum+i;i+;if(i=100)gotoloop;printf(sum=%dn,sum);3.6 循环语句循环语句 第三章第三章 语句和流程控制语句和流程控制 3.7 其他的控制语句其他的控制语句 3.7.1 break语句(中止语句)语句(中止语句)break语句的一般形式为: break;它能使循环提前结束。前面所讲的循环控制流是在底部或顶部通过测试来决定循环是否结束,若要使循环提前结束,即从循环体内向外转移时,可用“break语句”实现。【例3.13】求连续输入的正整数之和。main()inti,m,sum=0;for(i=1;i+)scanf(%d,&m);if(m0)break;
21、elsesum=sum+m;printf(%d,%dn,i,sum); 第三章第三章 语句和流程控制语句和流程控制 3.7.2 continue语句(继续语句)语句(继续语句)continue语句的作用是结束本次循环,即跳过循环体中下面尚未执行的语句,对于for循环,执行表达式3,之后同其他循环一样接着进行下一次是否需要执行循环的判定。continue语句的一般形式:continue;从键盘读入50个整数,求其中正整数之和main()inti,a,sun=0;for(i=0;i50;i+)scanf(%d,&a);if(a0)continue;sum=sum+a;printf(sum=%dn,
22、sum);该程序表示,当输入的整数为正时,累加进sum,否则不执行sum=sum+a;语句 3.7 其他的控制语句其他的控制语句 第三章第三章 语句和流程控制语句和流程控制 注意:contine和break语句的区别是:continue语句只结束本次循环,而不是终止整个循环的执行;break语句则是结束循环,不再进行条件判断。3.7.3 return语句(返回语句)语句(返回语句)C程序是由一个main()函数及若干个其他函数构成的。将流程从被调函数返回到主调函数的断点处,继续执行主调函数,可通过return语句实现。return语句一般形式:return (表达式);或表达式);或 retu
23、rn;若return;语句用做函数的最后一句,则可省略,依靠函数的后花括号可返回到主调函数的调用处。 3.7 其他的控制语句其他的控制语句 第三章第三章 语句和流程控制语句和流程控制 3.8 循环的退出及死循环的避免循环的退出及死循环的避免 正常的循环退出,通常是从正常出口退出,当循环的条件不成立时,循环即告结束。3.8.1 循环的退出循环的退出若想提前结束循环(其原因可能不是由于条件不成立,而是根据输入或计算的结果来定),此时可按情况选择采用前面所讲break,continue及goto语句来实现。但它们三者是有区别的。主要在于:采用goto语句,可以一下子跳出多重循环。如果用break语句
24、,只能跳出一层循环。前者可提高实际效率。 3.8.2 死循环问题死循环问题1由while语句引起的死循环及dowhile引起的死循环 第三章第三章 语句和流程控制语句和流程控制 【例3.15】误将i写成j的程序。main()ints=0,i=1,j;while(i=100)s=s+i;j=i+1;/*误将i写成j*/printf(%dn,s);条件为永真时也是死循环,如while(1100),误将英文i写成数字1。【例3.16】误将英文i写成数字1的程序。main()ints=0,i=1;do3.8 循环的退出及死循环的避免循环的退出及死循环的避免 第三章第三章 语句和流程控制语句和流程控制
25、s=s+i;i+;while(1100);/*误将英文i写成数字1*/printf(%d,s);2由由for语句形成的死循环语句形成的死循环【例3.17】因i+未被置于循环体内形成的死循环。main()ints=0,i=1;for(;i100;)s=s+i; i+;printf(%d,s);3.8 循环的退出及死循环的避免循环的退出及死循环的避免 第三章第三章 语句和流程控制语句和流程控制 3.9 程序举例程序举例 【例】设有一篮鸡蛋,不超过400个,若每次拿2个(或每次都拿3、4、5、6个)时,篮里总剩一个蛋,若每次拿7个,则刚好拿完,问篮里原有多少个鸡蛋?分析,首先推断蛋的数目必是奇数,故
26、可设置n=3,然后用3除,若余数非1就加2,直至余数为1止;若再用4除,若余数非1就不断加6(23=6,即2和3的最小公倍数),至余数为1止;再用5除,若余数非1就反复加12(即2、3、4的最小公倍数),直至余数为1止;再用6除,若余数非1则加60(即2、3、4、5的最小公倍数),待余数为1止;最后用7除,若不能整除就加60,直至整除为止,这时的n值就是所求的数目。用while语句进行重复计算。程序如下:main()intn=3;while(n%3!=1)n+=2;while(n%4!=1)n=n+6;/*或n+=6;*/while(n%5!=1)n=n+12;/*或n+=12;*/while
27、(n%6!=1)n=n+60;/*或n+=60;*/while(n%7!=0)n=n+60;printf(Thereare%deggs.n,n)运行结果:Thereare301eggs。读者可将其中的while语句改为dowhile语句。 第三章第三章 语句和流程控制语句和流程控制 【例】带100元钱去买鱼,大鱼每条3元,中等大小每条2元,小鱼每条5角,要求买100条鱼,试用C程序算出共有几种采购方案。解:可用for语句来构成两重循环的程序解此问题。程序如下:main()intdy,zy,xy;for(dy=0;dy=33;dy+)/*0=dy=33*/for(zy=0;zy=50;zy+)/*0=zy=50*/xy=100-dy-zy;if(3*dy+2*zy+0.5*zy=100)printf(dy=%dzy=%dxy=%dn,dy,zy,xy); 3.9 程序举例程序举例