C语言讲义第03章-控制语句.ppt
第三章第三章控制语句控制语句 C语言程序设计主要内容主要内容控制语句简介ifelse语句 SwitchCase for语句while、dowhile语句break、continue语句 特别的goto语句多重循环 小结控制语句控制语句控制语句是C语言中非常重要的语句,用来实现结构程序设计中的选择和循环结构。语言主要有八种控制语句。可分成以下三类:(1)选择控制语句:ifelse语句,switchcase语句(2)循环控制语句:for语句,while语句,do while语句(3)转移控制语句:break语句,continue语句,goto语句3.1ifelse语句语句ifelse语句判定所给的条件是否满足,根据判定的结果选择执行两种操作之一执行。ifelse 语句的三种形式if(表达式)语句if(表达式)语句1else 语句2if(表达式1)语句1else if(表达式2)语句2else if(表达式3)语句3else if(表达式n)语句nelse 语句n+1形式1:if(表达式)语句功能:这种形式的语句无else部分,它的功能是首先对表达式进行求解,若表达式的值为非0,则执行语句;若表达式的值为0,则该语句不起作用,不执行,而继续执行if语句下面的语句。例如:if(ab)printf(the max is%d,a);当ab为真时,打印输出a的值,否则什么也不执行。3.1 ifelse语语句句三种形式之一三种形式之一exprstatement非0=0形式2:if(表达式)语句1 else 语句2功能:首先对表达式进行求解,若表达式的值为非0,则执行语句1,否则执行语句2。例如:if(ab)printf(the max is%d,a);else printf(the max is%d,b);当ab为真时,打印输出a的值,否则打印输出b的值。3.1 ifelse语语句句三种形式之二三种形式之二exprstatement1statement2非0=0形式3:if(表达式1)语句1else if(表达式2)语句2else if(表达式3)语句3else if(表达式n)语句nelse 语句n+13.1 ifelse语语句句三种形式之三三种形式之三expr1statemnt1非0=0expr2expr3statemntnstatemnt3statemnt2非0非0=0=0功能:依次判断表达式的值,当出现某个值为非0时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序。如果所有的表达式均为假,则执行语句n+1。然后继续执行后续程序。前二种形式的ifelse语句一般都用于两个分支的情况。当有多个分支选择时,可采用第3种形式ifelse语句。例如:if(grade=80)printf(A);else if(grade=70)printf(B);else if(grade=60)printf(C);else printf(D);3.1 ifelse语语句句三种形式之三三种形式之三注意事项:1、在if 后面的表达式,其类型可以是任意的其类型可以是任意的(整形、实型、字符型、指针型),C C语言在判断时只要非语言在判断时只要非0 0,就认为是真,按,就认为是真,按真处理,只有真处理,只有0 0时才认为是假,按假处理。时才认为是假,按假处理。因此,而不仅仅限于逻辑表达式或关系表达式。3.1 ifelse语语句句注意事项注意事项如:if(a=b&x=y)printf(“a=b,x=y”);if(3)printf(“OK”);if(a)printf(“%d”,a);2、C语句必须在最后出现分号,分号是语句中不可缺少的一部分,因此if和else后面的语句都必须有分号。例如:if(ab)printf(the max is%d,a);else printf(the max is%d,b);3.1 ifelse语语句句注意事项注意事项3.1 ifelse语语句句注意事项注意事项u语句可以是复合语句u if(x)if(x!=0)if(!x)if(x=0)u在每个else前面有一分号,整个语句结束处有一分号u在 if 或 else 后可有多个操作语句,此时需加 将几个语句括起来成为一个复合语句。例 考虑下面程序的输出结果:#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!例3.1 接收任意输入的两个实数,按从大到小的顺序输出。程序如下:3.1 ifelse语语句句举例举例例3.3 要求判别键盘输入字符的类别。可以根据输入字符的ASCII码来判别类型。由ASCII码表可知ASCII值小于32的为控制字符。在0和9之间的为数字,在A和Z之间为大写字母,在a和z之间为小写字母,其余则为其它字符。这是一个多分支选择的问题,可采用第3种形式的.程序如下:3.1 ifelse语语句句举例举例/*lt03_03.c*/#include void main()char c;printf(Enter a character:);c=getchar();if(c=0&c=A&c=a&c=z)printf(The character is a lower lettern);else printf(The character is other charactern);运行:Enter a character:The character is a control character运行:Enter a character:8 The character is a digit运行:Enter a character:D The character is a capital letter运行:Enter a character:h The character is a lower letter运行:Enter a character:F1 The character is other charactervIf 语句嵌套:在一个if语句中又包含一个或多个if语句。l一般形式:if(expr1)if(expr2)statement1 else statement2else if(expr3)statement3 else statement4内嵌if内嵌ifif(expr1)if(expr2)statement1 else statement2内嵌ifif(expr1)if(expr2)statement1else statement3 内嵌ifif(expr1)statement1else if(expr3)statement3 else statement4内嵌if注意事项:注意事项:if else 配对原则:缺省 时,else总是和它上面离它最近的未配对的if配对if()if()if()else.else.else.3.1.2ifelse语语句句嵌套嵌套例: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 正确配对方法:加 例 考虑下面程序输出结果:main()int x=100,a=10,b=20;int v1=5,v2=0;if(ab)if(b!=15)if(!v1)x=1;else if(!v2)x=10;x=-1;printf(“%d”,x);/*ifz.c*/结果:-1例 3.5有一函数如下:y=写一程序,输入x,输出y的值。程序如下:3.1.2ifelse语语句句嵌套注意事项嵌套注意事项x(x 4)2x-1(4 x b)?a:b 它等价于:if(ab)max=a;else max=b;说明:(1)条件运算符是一个三目运算符,即有三个参与运算的量,它是C语言中唯一的一个三目运算符。(2)条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。因此 max=(ab)?a:b可以去掉括号而写为 max=ab?a:b,如果有 ab?a:b+1 则它等价于:ab?a:(b+1)。(3)条件运算符?和:是一对运算符,不能分开单独使用。(4)条件运算符的结合方向是自右至左。ab?a:cd?c:d应理解为ab?a:(cd?c:d)这也就是条件表达式嵌套的情形,即其中的表达式3又是一个条件表达式。如果a=2,b=3,c=4,d=5,则条件表达式的值为5条件运算符条件运算符?:?:(5)条件表达式不能取代一般的if语句,只有当if语句的表达式为“真”和“假”时,都执行赋值语句并且都给同一个变量赋值时才能代替if语句。(6)表达式1的类型可以与表达式2和表达式3的类型不同;如:a?b:c表达式2和表达式3的类型也可以不同,此时条件表达式的值的类型为二者中较高的类型。例如:ab?3:3.5此时如果ab,则条件表达式的值为3.5,若ab,值应为3,但是由于3.5为实型数据,比整型的数据类型高,因此,将3转换成实型数据3.0,所以当ab时,条件表达式的值为3.0条件运算符条件运算符?:?:例3.7 输入一个字符,如果是小写字母,转换成对应的大写字母,其它字符不变。程序如下:条件运算符条件运算符?:举例?:举例switch语句(开关分支语句)v一般形式:switch(表达式)case E1:语句组 1;break;case E2:语句组 2;break;.case En:语句组 n;break;default:语句组;break;v执行过程:switch表达式语句组1语句组2语句组n语句组.E 1E 2Endefaultcase 3.2 SwitchCase语句语句switch语句说明:Switch后面的表达式允许为任何类型,一般为整形或字符型。当表达式的值与某一个case后面的常量表达式的值相等时,就执行case后面的语句,若所有的case中的常量表达式的值都没有与表达式的值相匹配,就执行default后面的语句。执行完一个case后面的语句后,流程控制转移到下一个case继续执行。(若无break语句)每一个case的常量表达式的值必须互不相等。各个case和default的出现次序影响执行结果。(若无break语句)break语句 为了保证各个 case和default的出现次序不影响执行结果,在case语句后加一break语句。3.2 SwitchCase语句语句例 switch(score)case 5:printf(Very good!”);case 4:printf(“Good!”);case 3:printf(“Pass!”);case 2:printf(“Fail!”);default :printf(“data error!”);/*switch1.c*/运行结果:score为5时,输出:Very good!Good!Pass!Fail!data error!3.2 SwitchCase语句语句运行结果:a=2,b=1l附加说明:lcase后可包含多个可执行语句,且不必加 lswitch可嵌套l多个case可共用一组执行语句例 void main()int x=1,y=0,a=0,b=0;switch(x)case 1:switch(y)case 0:a+;break;case 1:b+;break;case 2:a+;b+;break;case 3:a+;b+;printf(“na=%d,b=%d”,a,b);/*switch2.c*/如:case A:case B:case C:printf(“score60n”);break;.3.2 SwitchCase语句语句例3.8 求一元二次方程ax2+bx+c=0的根。程序分析:一元二次方程ax2+bx+c=0的求根公式为:x=当a=0时,不是二次方程。当a=0,b=0时,方程无解。当a=0,b0时,方程的解为。当a0时,b2-4ac0 有两个不相等的实根。b2-4ac=0 有两个相等的实根。b2-4ac0 有两个复根。程序如下:3.2 多分支程序举例多分支程序举例3.2 多分支程序举例多分支程序举例例 3.9写程序,判断某一年是否是闰年。分析:能被4整除但不能被100整除的是闰年。能被4、100、400同时整除的也是闰年。程序如下:例 3.10四则运算求值:判断运算符,然后输出运算值。当输入运算符不是+,-,*,/时给出错误提示。程序如下:for循环使用灵活,功能很强,不仅可用来表示循环次数已知的情况,而且也可以用于循环次数不确定只给出循环终止条件的情况。for语句的一般形式:一般形式:执行过程:执行过程:3.3 for语句语句for(expr1;expr2;expr3)循环体语句;expr2循环体假(0)真(非0)forexpr1expr3例3.12 编写程序计算1+2+3+100的和。3.3 for语句语句#include void main()int is,ii;is=0;for(ii=1;ii=100;ii+)is=is+ii;printf(the sum is%dn,is);for循环最简单也就是最容易理解的形式如下:for(for(循环变量赋初值;循环条件;循环变量增值循环变量赋初值;循环条件;循环变量增值)循环体语句;循环体语句;说明:(1)for语句一般形式中的表达式1可以省略,注意省略表达式1 时,其后的分号是不能省略的,省略后的一般形式如下:for(;表达式2;表达式3)没有了表达式1,此时就没有了给循环变量赋初值的操作,一般情况下程序设计者应在for语句之前给循环变量赋初值。3.3 for语句语句说明说明1(2)for语句一般形式中的表达式2也可以省略,注意省略时,其后的分号是不能省略的,省略后的一般形式如下:for(表达式1;表达式3)没有了表达式2,此时就没有了循环判断条件,循环会无止境的执行下去,相当于表达式2始终为真。此时程序设计者可采用我们以后要讲的break语句强制结束循环。3.3 for语句语句说明说明2(3)表达式3也可以省略,省略后的一般形式如下:for(表达式1;表达式2;)此时没有了循环变量增值的操作,为了保证循环能正常结束,一般情况下程序设计者应在循环体内改变循环变量的值。3.3 for语句语句说明说明3(4)表达式1和表达式3可以同时省略,省略后的一般形式如下:for(;表达式2;)此时的for循环相当于我们以后要讲的while循环,程序设计者应在for语句之前给循环变量赋初值,在循环体内改变循环变量的值。3.3 for语句语句说明说明4(5)表达式1、表达式2和表达式3都可以省略,省略后的一般形式如下:for(;)此时程序设计者应在for语句之前给循环变量赋初值,在循环体内改变循环变量的值,强制结束循环。(6)表达式1和表达式3也可以是逗号表达式。如:for(i=0,j=100;i=j;i+,j-)s=s+i+j 这个循环实现的也是1+2+3+100的功能。(7)表达式2的值只要非0,就执行循环体。例如:for(;(c=getchar()!=n;)在表达式2中不断从终端接收字符赋给变量c,直到输入一个“换行”为止。3.3 for语句语句说明说明5、6、73.3 for语句语句例 3.13 在屏幕上输出1到100,每行输出5个。程序如下:例 3.14将输入的一串字符显示在屏幕上,直到输入字符“!”时停止。程序如下:#include void main()int ii;for(ii=1;ii=100;ii+)printf(%d,ii);if(ii%5=0)printf(n);#include void main()char cc;printf(please input a string:);for(cc=getchar();cc!=!;cc=getchar()putchar(cc);While语句语句While语句是专门的“当型”循环语句。其一般形式如下:while(表达式)循环体语句功能:先判断表达式,当表达式的值为非0(真)时,就反复执行循环体语句,直到表达式的值为0(假),退出while语句,继续执行while语句后面的语句。3.4 while、dowhile语句语句 例 3.15用while语句编写程序计算1+2+3+100的和。程序如下:3.4 while、dowhile语句语句 说明:(1)循环体有可能一次也不执行。(2)循环体可为简单语句也可为复合语句,若为复合语句应该用花括号括起来。(3)循环体内应有使表达式的值趋向于0(假)的操作,使得能够退出while循环。例3.16编程实现显示110的平方。程序如下:3.4 while、dowhile语句语句(4)循环表达式可以始终为真,通过在循环体中加break语句(关于该语句,参见3.5节内容)对循环进行控制。例如例3.16也可以用如下的程序实现:#include void main()int ii=1;while(1)/*循环表达式始终为真*/printf(%d*%d=%dn,ii,ii,ii*ii);ii+;if(ii 10)break;/*当ii10时,break语句跳出循环*/3.4 while、dowhile语句语句 3.4.2 dowhile语句语句dowhile语句用来实现“直到型”循环。其一般形式如下:do 循环体语句;while(表达式);功能:先执行循环体,然后判断表达式的值,若为非0(真)时,就反复执行循环体,直到表达式的值为0(假),退出while语句,继续执行while语句后面的语句。3.4 while、dowhile语句语句 例3.17 用dowhile语句编写程序计算1+2+3+100的和。程序如下:3.4 while、dowhile语句语句 说明:至少执行一次循环体。在if语句,while语句中,表达式后面都不加分号,而在 do-while语句的表达式后面则必须加分号。在do和while之间的循环体由多个语句组成时,也必须用括起来组成一个复合语句。dowhile可转化成while结构,但do-while和while语句相互替换时,要注意修改循环控制条件。3.4 while、dowhile语句语句 例3.18 输入若干个职工的工资,直到输入负数结束,求工资的总和及平均工资。程序如下:3.4 while、dowhile语句举例语句举例3.5.1break语句语句break语句的一般形式为:break;功能:在分支结构程序设计中已经介绍过用break语句可以使流程跳出switch结构,继续执行switch语句下面的一个语句。实际上,break语句还可以用来从循环体内中途跳出循环体,即提前结束循环,执行循环下面的语句。3.5 break、continue语句语句 while(表达式1)语句组1 if(表达式2)break;语句组2当表达式1成立时,进入循环体执行,若表达式2成立时执行break语句,提前结束循环,即不再继续执行循环(即使此时表达式1还成立)。3.5 break、continue语句语句 说明:break语句使用应该注意的问题(1)在循环语句中,break语句一般都是与if语句一起使用。(2)break语句不能用于循环语句和switch语句之外的任何其它语句中。3.5 break、continue语句语句注意注意例3.19计算1+2+3+100的和,当和大于2500时停止。程序如下:在3.3节讲解for循环时,曾提到for语句一般形式中的表达式2可以省略,当省略表达式2时,因为没有了表达式2,此时就没有了循环判断条件,循环会无止境的执行下去,相当于表达式2始终为真,此时程序设计者应采用break语句强制结束循环。例3.20编写程序计算1+2+3+100的和。程序如下3.5 break、continue语句语句 3.5.2continue语句语句continue语句的一般形式为:continue;功能:continue语句是跳过循环体中剩余的语句而强制执行下一次循环。其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。3.5 break、continue语句语句 如:while(表达式1)语句组1 if(表达式2)continue;语句组2当表达式1成立时,进入循环体执行语句组1,若表达式2成立时执行continue语句,语句组2就不再执行,而转去判定下一次循环是否执行。3.5 break、continue语句语句 说明:continue语句使用应该注意的问题(1)continue语句只能用在循环语句中。(2)一般都是与if语句一起使用。例3.21把1100之间的不能被5整除的数输出。程序如下:3.5 break、continue语句语句 goto语句是无条件转移语句。goto语句的一般形式为:goto 语句标号;功能:无条件转向“语句标号”处执行。说明:(1)语句标号是一标识符,它的命名规则与变量名相同。(2)goto 语句可以灵活跳转,它能从多重循环体一下子跳到外面,用不着写很多次的break 语句,这个特点使得程序处理一些异常情况时非常的方便,但是如果不加限制,它会破坏结构化设计风格,但实事求是地说,错误是程序员自己造成的,不是goto 的过错,所以我们主张少用、慎用goto 语句,而不是禁用 3.6 特别的特别的goto语句语句循环体内的语句本身还可以是另一个循环语句,因此这样就构成了另一层循环。其中,处于外层的循环称为外循环,处于内层的循环称为内循环,这种一个循环体内又包含另一个完整的循环结构称为循环的嵌套。这种嵌套结构的循环可以有多层,从而构成多重循环。三种循环(while循环、do-while循环和for循环)可以互相嵌套。3.7多重循环多重循环多重循环的执行过程中,外循环控制变量的值变化得较慢,内循环控制变量的值变化得较快。外循环进行1次,内循环就要完成所有的循环。说明:写多重循环程序时要注意,内外循环的层次要分明,内层循环必须被完整地嵌套在外循环在里面,可以若干个循环嵌套、并列,但绝对不允许循环之间相互交叉。例3.22输出由星号构成的一个5行的直角三角形。程序如下:例3.23编写一个程序,输出如下所示九九乘法表:程序如下:例3.24百马百担问题程序如下:3.7多重循环多重循环例3.25任意输入一个自然数n,判断它是否为素数。算法分析:一个自然数n如果只能被1和它本身整除,则该自然数为素数,否则不是素数。根据素数的定义,可以编写一个容易理解的判定素数的程序。程序如下:上面的程序容易理解,但这种方法效率不高,当自然数in较大时,循环次数较多,可采取一种改进效率的方法。ii从2循环到 即可,可以提高循环的效率。程序如下:3.7多重循环举例多重循环举例#include#include void main()int in,ii,ik;scanf(%d,&in);ik=sqrt(in);for(ii=2;ii=ik+1)printf(%d is a prime numbern,in);else printf(%d is not a prime numbern,in);3.7多重循环举例多重循环举例例3.26求Fibonacci数列:1,1,2,3,5,8,的前40个数,即11(n=1)1 2 3 4 5 6 7.21(n=2)1 1 2 3 5 8 13 n n-1 n-2 (n=3)程序如下:3.7多重循环举例多重循环举例例3.27用/4 11/31/51/7 公式求的近似值,直到最后一项的绝对值小于10-6为止。程序如下:3.7多重循环举例多重循环举例3.8小结本章主要讲解了控制语句的使用及其功能,控制语句用于控制程序的流程,是C语言中非常重要的语句,用来实现程序的选择结构和循环结构。语言主要有八种控制语句:选择控制语句包括:ifelse语句和switchcase语句。循环控制语句包括:for语句,while语句,dowhile语句转移控制语句包括:break语句,continue语句,goto语句3.8小结选择控制语句包括:ifelse语句和switchcase语句。ifelse语句是选择控制语句,它判定所给的条件是否满足,根据判定的结果选择两种分支之一执行。if后面是一种分支,else后面是另外一种分支。如果条件满足,选择if后面的分支执行,如果条件不满足,选择else后面分支执行。ifelse语句并不是只能用于实现两分支的情况,ifelse语句有三种不同的形式,使得它可用于两分支情况也可用于多分支情况。3.8小结switchcase语句是多分支选择语句,利用嵌套的if语句也可以处理多分支选择问题,但如果分支较多,则嵌套的if语句层数多,致使程序冗长而且可读性降低。所以C语言提供switch语句直接处理多分支选择。3.8小结循环控制语句包括:for语句,while语句,dowhile语句for语句用来实现for循环,for循环使用灵活,功能很强,不仅可用来表示循环次数已知的情况,而且也可以用于循环次数不确定只给出循环终止条件的情况。for语句的一般形式如下:for(表达式1;表达式2;表达式3)循环体语句3.8小结while语句是先判断表达式后再执行循环体的循环语句。因此,有可能一次循环体也不执行。do-while循环是先执行循环体后再判断表达式的循环语句,通常用它来完成必须至少执行一次循环体的操作。3.8小结转移控制语句包括:break语句,continue语句,goto语句。break语句用于从内循环跳到外循环,使循环提前结束。但它只能跳一层循环,不能跳多层循环。continue语句用于跳过其后的语句,使本轮循环提前结束。goto语句是无条件转移语句,我们主张少用、慎用goto 语句,而不是禁用。3.8小结多重循环:循环体内的语句本身还可以是另一个循环语句,因此这样就构成了另一层循环。其中,处于外层的循环称为外循环,处于内层的循环称为内循环,这种一个循环体内又包含另一个完整的循环结构称为循环的嵌套。这种嵌套结构的循环可以有多层,从而构成多重循环。多重循环的执行过程中,外循环控制变量的值变化得较慢,内循环控制变量的值变化得较快。外循环进行1次,内循环就要完成所有的循环。写多重循环程序时要注意,内外循环的层次要分明,内层循环必须被完整地嵌套在外循环在里面,可以若干个循环嵌套、并列,但绝对不允许循环之间相互交叉。