版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四章 控制结构,2,本章要点,关系运算符和逻辑运算符 if语句和switch语句 while语句、do while语句和for语句 break语句和continue语句,3,本章学习目标,了解结构化程序设计的基本思想 掌握C语言的基本控制结构和基本控制语句的使用方法 熟练掌握使用基本控制语句进行结构化程序设计的方法 掌握break语句和continue语句的使用方法 掌握一些常用的算法,4,4.1 关系运算符和关系表达式,4.1.1 关系运算符 用于判断两个数据之间的某个关系是否成立。 C语言提供了六种关系运算符: 大于 = 大于等于 = 等于 != 不等于 关系运算的结果是逻辑值:成立(真
2、)或不成立(假)。 53 运算结果为真,35 运算结果为假,5,使用关系运算符需要注意,(1)注意书写格式 =判断两个数据是否相等,一定要和赋值运算符=区分开。 (2)关系运算符均是二元运算符,一个关系运算符的两个操作数类型要相同,如果类型不一致,系统将自动进行类型转换。 A=65 运算结果为真 0=0 运算结果为假,6,(3)注意运算符优先级和结合性 ,=,=的优先级相同(6级),=和!=的优先级相同(7级)。 关系运算符的结合方向均为自左向右结合。,7,4.1.2 关系表达式,利用关系运算符将表达式连接起来的式子。 关系运算的结果为逻辑值,由于C语言中没有逻辑类型,因此当运算结果为真时,用
3、整数1表示,当运算结果为假时,用整数0表示。 关系表达式的值也是一个逻辑值,即1或0。,8,假设变量已如下定义:,int a=3,b=2,c=1,d=5,f; ab 表达式值为1 ab=c 等价于(ab)=c,表达式的值为1 b+cb 等价于d=(ab),d的值为1 f=abcd 等价于f=(ab)c)d),f的值为0 注意:这里任意改变a、b、c的值,会影响整个表达式的值吗?为什么?,4.1.2 关系表达式,9,4.2 逻辑运算符和逻辑表达式,4.2.1 逻辑运算符 逻辑与运算 b=5; !a 表达式值为0 a printf(Please input the value of x:); sc
4、anf(%d, ,20,4.3.1 if语句,注意,小括号后面是单独一条语句,而不是多条语句。如果当表达式为真时,需要执行多条语句应该使用复合语句。 复合语句的格式为: 若干条语句 如:i+; sum+=i; 其中的每条语句均以分号结束,而复合语句本身没有分号。,21,4.3.2 else子句,if(表达式) 语句1 else 语句2 如果括号内的表达式为真,则执行括号后面的语句1。如果表达式值为假,则执行else后面的语句2;语句1和语句2只能有一个被执行。,22,4.3.2 else子句,【例4-2】输入两个整数,将较大者输出。 /*程序4-2*/ #include void main (
5、) int a, b, max; printf(Please input the data a and b:); scanf(%d, %d, ,23,4.3.3 if语句嵌套,如果需要根据多个不同的条件,分别去执行不同操作,就要用嵌套的if语句来实现。 在if语句内部和else子句内部可以包含任何类型的语句,通过在if语句和else子句内部嵌套其它if语句可以形成if语句的嵌套。,24,两级if语句嵌套的一般格式,执行过程 如果表达式1成立,并且表达式2成立,则执行语句1,然后执行语句5; 如果表达式1成立,并且表达式2不成立,则执行语句2,然后执行语句5; 如果表达式1不成立,并且表达式3成
6、立,则执行语句3 ,然后执行语句5; 如果表达式1不成立,并且表达式3不成立,则执行语句4 ,然后执行语句5;,if(表达式1) if(表达式2) 语句1; else 语句2; else if(表达式3) 语句3; else 语句4; 语句5;,25,4.3.3 if语句嵌套,【例4-3】编写程序,要求从键盘输入一个字符,判断其类型,将字符分为四种类型:小写字母、大写字母、数字或者其他字符。,/*程序4-3*/ #include void main() char ch; printf(Please input a letter:); scanf(%c, ,26,4.3.3 if语句嵌套,【例4
7、-4】从键盘输入一个小于10000的整数,判断其是几位数。,/*程序4-4*/ #include void main() int num,gw,sw,bw,qw; printf(Please input a number:); scanf(%d, ,27,在程序4-3和程序4-4中,我们都是在else子句内部嵌套if语句,这种嵌套形式通常称为级联式if语句。许多程序员在书写级联式if语句时,通常不采用缩进的格式,例如程序4-4可以修改为下面的程序。,/*程序4-5*/ #include void main() int num,gw,sw,bw,qw; printf(Please input a
8、 number:); scanf(%d, ,28,4.3.4使用if语句应注意的问题,(1)在(表达式)后面或else关键字后面加分号通常会导致出现语义错误。 单独使用一个分号表示一个空语句,void main() int x; x=1; if(x=1) ; /*这里多加了个分号*/ printf(x等于1n); else printf(x不等于1n); ,当尝试对该程序进行编译时,C语言编译器会报告illegal else without matching if的语法错误。,29,4.3.4使用if语句应注意的问题,void main() int x; x=1; if(x=1) printf
9、(x等于1n); else ; /*这里多加了个分号*/ printf(x不等于1n); ,该程序运行后的输出结果为: x等于1 x不等于1,不是我们所期望得到的输出结果,30,4.3.4使用if语句应注意的问题,(2)如果if语句内部或else子句内部需要放置多条语句,必须将这多条语句构成一个复合语句,这样才能符合if语句的语法格式。 【例4-5】输入三个整数,将其降序排序后输出。,/*程序4-6*/ #include void main() int a,b,c,t; printf(input the data:); scanf(%d,%d,%d, ,31,4.3.4使用if语句应注意的问题
10、,(3)在嵌套的if语句中,确保else子句和对应的if语句正确匹配非常关键。else子句不能单独使用,每个else子句必须属于前面出现的某个if语句。 考虑下面的程序片段:,if (a=b) if(b=c) printf(a=b=c); else printf(a!=b);,上面的else子句应该属于哪一个if语句呢?,32,4.3.4使用if语句应注意的问题,匹配原则 从最内层开始,else子句总是和离它最近的,还未和其它else匹配的if语句进行匹配。 因此在上述程序片段中,else子句实际上是和第二个if语句匹配的,写成下面的形式可以更直观的表达出它们的匹配关系。,if (a=b) i
11、f(b=c) printf(a=b=c); else printf(a!=b);,33,4.3.4使用if语句应注意的问题,根据上述规则,上面的程序片段便出现了严重的逻辑矛盾。从语义上分析,希望else子句和第一个if语句匹配。为了实现这一点,可以用一对大括号将第二个if语句括起来。,if (a=b) if(b=c) printf(a=b=c); else printf(a!=b);,避免if与else配对错位的最佳办法是加大括号,同时,为了便于阅读,使用适当的缩进(只有大括号能保证if和else不错位配对,缩进仅便于阅读)。,34,4.3.5 条件运算符和条件表达式,根据条件在两个备选值中选
12、择一个 一般形式为: 表达式? 表达式:表达式 条件运算符是唯一的一个三元运算符。 使用条件表达式可以代替一些简单的if语句。,35,4.3.5 条件运算符和条件表达式,条件表达式的求值过程 首先计算表达式1的值。 如果表达式的值为真,则计算表达式的值,并将该值作为整个条件表达式的值;表达式3不计算。 如果表达式的值为假,则计算表达式的值,并将该值作为整个条件表达式的值;表达式2不计算。,36,4.3.5 条件运算符和条件表达式,条件运算符的优先级高于赋值运算符和逗号运算符,低于所有其它运算符。其结合方向为自右向左。,例:计算下列表达式 int a=1,b=2,c=3,d=4,m=5,n=6,
13、k; k=ab?(m=cb): (n=bd) k=ac?(m=cb): (n=bd) k=ab?d: bc?(m=cb): (n=bd) k=ab?d: bb): (n=bd),k=0 m=5 n=0,k=4 m=5 n=6,k=0 m=5 n=0,k=1 m=1 n=6,例 输入一个字符。判别它是否大写字母,如果是,将其转换为小写,否则不转换。然后输出最后得到的字符。,#include void main() char ch; scanf(%c, printf(%c,ch); ,4.3.5 条件运算符和条件表达式,38,4.3.6 switch语句,基本形式的if语句可以根据一个判断条件形成
14、两个处理分支,为了描述更多的分支,我们可以使用嵌套形式的if语句。 C语言还提供了另外一个可以描述多个处理分支的语句switch语句,switch语句可以根据一个表达式的值决定选择哪一个分支。,39,4.3.6 switch语句,switch语句的语法格式 switch(表达式) case E1: 语句序列1; case E2: 语句序列2; case En: 语句序列n; default: 语句序列; ,40,4.3.6 switch语句,switch关键字后面是用括号括起来的表达式,称为控制表达式,该表达式必须为整型或字符型,不能是实型或字符串。 case关键字后面的表达式E1、E2、En
15、必须是常量表达式。常量表达式中只能包含常量不能使用变量,这些常量表达式类型应为整型或字符型,且它们的值必须互不相同。 case E1:、case E2:、case En:、default:被称为分支标号(分支标号以冒号结束)。各case及default子句的先后次序,不影响程序执行结果。 在每个分支标号后面可以包含一组语句,不需要使用大括号将每组语句括起来。每组语句中的最后一条语句通常是break语句。 语法格式中用中括号括起来的部分是可选的。,41,switch语句的执行过程,首先计算控制表达式的值。 然后将该值与常量表达式E1、E2、En的值依次进行比较: 如果控制表达式的值等于E1的值,
16、则执行语句序列1; 如果控制表达式的值等于E2的值,则执行语句序列2; 以此类推,如果控制表达式的值不等于E1至En中的任何一个值,则执行default分支后的语句序列(如果省略了default分支,则不执行任何语句)。,42,【例4-6】输入1至7中的一个数值,然后打印出该数值对应的日期。,switch语句的执行过程,/*程序4-7*/ #include void main() int day; printf(please input a digit ); scanf(%d, ,43,4.3.6 break语句,在switch语句中,每个分支标号后的一组语句中的最后一条语句通常是break语
17、句。 从程序4-7可以看出,break语句的作用是使程序跳出switch语句,继续执行switch语句后面的其它语句。 如果程序4-7中去掉了break语句,我们将得到不合理的执行结果。,/*程序4-7*/ #include void main() int day; printf(please input a digit ); scanf(%d, ,假设输入3,程序会输出: Wednesday Thursday Friday Saturday Sunday data error,44,4.3.6 switch语句,产生这种的结果的原因在于switch语句是一种基于比较的转移。当控制表达式的值与
18、某个常量表达式的值相等时,程序便转移到相应的分支标号处,开始执行分支标号后的语句(这里,分支标号仅起到标识目标语句位置的作用,不能实现对多个处理分支的分割)。当执行完一个处理分支内的语句后,如果没有break语句,程序将直接进入下一个处理分支,然后继续执行下一个分支内的语句。,45,4.3.6 switch语句,有时我们可以利用这个特点,使得多个处理分支可以共享一组语句。 【例4-7】输入1至7中的一个数值,然后打印出该数值对应工作日或休息日。,/*程序4-8*/ #include void main() int day; printf(please input a digit ); scan
19、f(%d, ,【例4-8】 输入学生的百分制成绩,输出该学生的成绩等级,大于等于90分为A ;80分至89分为B;70分至79分为C;60分至69分为D;60分以下为E。 第一种解决方法,用if语句实现。 第二种解决方法,使用switch语句实现。 需要改进 ?,46,4.3.7 应用实例,/*程序4-9*/ #include void main() int score; printf(input the score:); scanf(%d, ,/*程序4-10*/ #include void main() int score; int d; printf(input the score:);
20、 scanf(%d, ,若有定义: float w; int a, b;并且w,a,b已经被正确赋值,则下面哪个switch语句是合法的:,switch(w) case 1.0: printf(*n); case 2.0: printf(*n);,B. switch(a) case 1 printf(*n); case 2 printf(*n); ,C. switch(b) case 1: printf(*n); default: printf(“#n); case 1+2: printf(*n); case 2: printf(#n); ,D. switch(a+b) case 1: pri
21、ntf(*n); case 2: printf(*n); default: printf(#n); ,错:少冒号,错:常量表达式为1或2,对,对,4.3.7 应用实例,#include stdio.h 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; printf(a=%d, b=%dn,a, b); ,写出下列程序的执行结果:,break;,执行结果: a=2, b=1,执行结果: a=1, b=0,4.3.7 应用实例
22、,49,4.4 循环结构,循环结构是结构化程序设计中的三种基本结构之一,也是程序设计的基础。 循环结构的特点是, 在给定条件成立时,反复执行一组语句,直到条件不成立为止。 给定的条件称为循环条件,反复执行的一组语句称为循环体。 C语言提供了三种循环语句:while语句、do while语句和for语句。,语法格式: while (表达式) 语句 其中小括号中的表达式用于描述循环条件,小括号后面的语句为循环体。 表达式两边的小括号是必需的。 当循环体内需要包含一条以上的语句时,应用大括号括起来,构成复合语句。,50,4.4.1 while语句,51,while语句执行过程 (1)计算表达式的值,
23、如果其值不为0(即为真值),转向(2);否则转向(3)。 (2)执行循环体后转向(1)。 (3)循环过程停止,程序转移到while语句后面的语句。,4.4.1 while语句,循环体中应有使循环趋向于结束的语句。,52,【例4-9】求整数1100的累加和,/*程序4-11*/ #include void main() int i,sum=0; i=1; while(i=100) sum += i; i+; printf(sum=%dn,sum); ,4.4.1 while语句,53,【例4-10】输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 while语句的循环体可能一次
24、也不执行,因为while语句是先判断循环条件,再决定是否执行循环体。当读取的第一个字符是换行符时,将不会执行循环体。,4.4.1 while语句,/*程序4-12*/ #include void main() char c; int letter=0,space=0,digit=0,other=0; printf(Input a string:n); while(c=getchar()!=n) if(c=a ,do while语句是先执行循环体,之后再判断循环条件是否成立。 语法格式 do 语句 while (表达式); 括号后面的分号是必需的。 do while语句执行过程 (1)执行循环体
25、 (2)计算表达式的值,如果表达式的值为真,则转向(1);否则转向(3)。 (3)循环过程终止,程序转移到do while语句后面的语句。,54,4.4.2 do while语句,55,【例4-11】求整数1100的累加和,使用do while语句实现。,/*程序4-13*/ #include void main() int i=1, sum=0; /*定义并初始化变量*/ do sum += i; /*累加*/ i+; while(i=100); /*循环条件:i=100*/ printf(sum=%dn,sum); ,4.4.2 do while语句,【例4-12】输入一个整数,判断其是几
26、位数。 从程序4-14可以看出,do while语句的循环体至少执行一次,因为do while语句是先执行循环体,再判断循环条件。,56,/*程序4-14*/ #include void main() int m, a ; int n=0 ; printf (请输入一个正整数:); scanf (%d , ,4.4.2 do while语句,57,我们将程序4-14中的do while语句直接改为while语句,看一下会产生什么结果。,4.4.2 do while语句,#include void main() int m, a ; int n=0 ; printf (请输入一个正整数:); s
27、canf (%d , ,输入整数0,程序输出: 0是0位数,产生这种结果的原因在于,while语句先判断循环条件,当a=0时,循环条件不成立,循环体一次也不执行。为了避免这个问题,需要对特殊情况做一下处理。,/*程序4-15*/ #include void main() int m,a; int n=0 ; printf (请输入一个正整数:); scanf(%d , ,58,4.4.2 do while语句,执行过程: (1)计算表达式1的值。 (2)计算表达式2的值,如果值为真,则转向(3);否则终止循环,转移到for语句后面的语句。 (3)执行循环体,然后计算表达式3的值,然后转向(2)
28、。,59,4.4.3 for语句,语法格式: for(表达式1; 表达式2; 表达式3)语句 表达式1和2后面的分号是必需的,表达式3后面没有分号。,下面是一个for语句的例子: for(i=1;i10;i+) printf(now i is %dn,i); 可以从中看出3个表达式的作用: 表达式1用于初始化,而且仅执行一次。通常使用赋值表达式指定循环变量的初始值。 表达式2描述循环条件,用于控制循环的结束。通常使用关系表达式或逻辑表达式,也可以是数值表达式或字符表达式。每次执行循环体前都要对表达式2进行判断。 表达式3在每次循环体执行后被执行,用于修改循环变量的值,使循环趋向结束。通常使用赋
29、值表达式或自增/自减表达式。,60,4.4.3 for语句,61,【例4-13】求整数1100的累加和,使用for语句实现。,/*程序4-16*/ #include void main() int i,sum=0; for(i=1;i=100;i+) sum=sum+i; printf(sum=%dn,sum); ,4.4.3 for语句,62,对比程序4-11和程序4-16,可以发现for循环可以用等价的while循环来代替。实际上,除了一些特殊情况外,两种循环总是可以互相替换的。将for循环转换为while循环的一般方法是:,表达式1; while(表达式2) 语句; 表达式3; ,4.4
30、.3 for语句,63,【例4-14】求Fibonacci数列的前40项。每行输出4项。 Fibonacci数列的定义为:,4.4.3 for语句,/*程序4-17*/ #include void main() long t1, t2, t3; int i; t1=t2=1; printf(%10ld%10ld, t1,t2); for(i=3; i=40; i+) t3=t1+t2; printf(%10ld, t3); if(i%4=0) printf(n); t1=t2; t2=t3; ,关于for语句的说明: C语言允许省略任意或全部表达式。 (1)关于表达式1: 通常是给循环变量赋初
31、值,也可以是与循环变量无关的其它表达式, 甚至表达式1可以省略。如果省略表达式1,那么需要在for语句之前完成变量的初始化。注意,此时表达式1后面的分号必须保留。,例:sum=0; for(i=1;i=100;i+) sum+=i; 或:i=1; for(sum=0;i=100;i+) sum+=i; 或:for(i=1,sum=0;i=100;i+) sum+=i; 或:i=1; sum=0; for( ; i=100;i+) sum+=i;,64,4.4.3 for语句,(2)关于表达式3: 通常用来改变循环变量的值,也可以是与循环变量的无关的其它表达式,甚至可将循环体中的语句放在表达式3
32、的位置上。表达式3也可以省略,如果省略,那么需要在循环体中包含使循环条件变为假的操作。,65,4.4.3 for语句,例:i=0; for(sum=0;i=100; sum+=i) i+; 或: for(sum=0 ,i=1;i=100; sum+=i,i+); 或:sum=0; for(i=1; i=100;) sum+=i; i+;,66,(3)如果同时省略表达式1和表达式3,只有表达式2,即只给出循环条件。此时的for语句和while语句完全相同。 i=1; for(;i=100;) sum=sum+i; i+; ,4.4.3 for语句,67,(4)关于表达式2 作为循环的判断条件。如
33、果省略表达式2,那么表达式2默认为真值,此时循环条件始终成立,循环将出现死循环,应该通过其它方式使for语句终止,如使用break语句(参考4.4.4节)。 出现死循环时,用Ctrl + C结束程序。,4.4.3 for语句,i=1; sum=0;for( ; ; ) sum+=i; i+; if (i100) break; ,例、sum=0; for(i=1; ;i+) sum+=i; 或:sum=0; i=1; for( ; ; ) sum+=i; 此为死循环。,68,通过在for语句的表达式1或表达式3中使用逗号表达式,可以同时对多个变量进行初始化或同时使多个变量自增/自减。,/*程序4
34、-18*/ #include void main() int i,sum; for(sum=0,i=1;i=100;i+) sum=sum+i; printf(sum=%dn,sum); ,4.4.3 for语句,break语句可以使程序控制从switch语句中转移出来。 break语句还可以用在while、do while、for语句中,使程序控制从循环中转移出来,从而使循环立即终止。 【例4-15】判断正整数m是否为素数。,69,4.4.4 使用break语句,/*程序4-19*/ #include void main() int m,i; printf(Input m:); scanf(
35、%d, ,70,4.4.5 使用continue语句,continue语句可以出现在while、do while、for语句的循环体中,用于控制循环的执行过程。 continue语句跳过循环体内的若干语句,提前结束一次循环体的执行,但不会终止循环。 continue语句只能用于循环。 【例4-16】找出所有小于100,能被3整除且个位数是6的整数。,/*程序4-20*/ #include void main() int i,j; for(i=0;i=9;i+) j=i*10+6; if(j%3!=0) continue; printf(%dn,j); ,break语句和continue语句,7
36、1,break语句和continue语句的区别 while (表达式1) while (表达式1) if (表达式2) break; if (表达式2) continue; break语句跳出循环, continue语句结束本次循环体, 终止整个循环的执行 进入下一次循环,72,4.4.6 循环语句嵌套,在while、do while、for语句的循环体内可以包含任何类型的语句,当一个循环语句的循环体内又包含了另一个循环语句时,便形成了循环语句的嵌套。 【例4-17】按照下图样式,打印乘法表。,/*程序4-21*/ #include void main() int i, j; for(i=1; i=9; i+) for(j=1; j=i; j+) printf(%d*%d=%-3d, i, j, i*j ); printf(n); ,73,【例4-18】将1元钱兑换成1分、2分、5分的硬币,若每种面值的硬币都不得少于一枚,问有几种不同的兑换方法?,/*程序4-22*/ #include void mai
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026江苏国企招聘考试(水电工程)历年参考题库含答案详解
- 2026正高面审答辩-正高070面审答辩临床医学检验技术历年题库含答案详解
- 2026机动车检测维修专业技术人员职业资格考试(整形技术·钣金维修-实务)历年参考题库含答案详解
- 2026新疆公开招聘中小学教师考试(教育基础知识)历年参考题库含答案详解
- 茶叶体系课程设计
- DCT实现图像压缩技巧课程设计
- ui课程设计结课报告
- MATLAB倒立摆模糊控制设计课程设计
- 图像灰度化与边缘检测程序视频分享课程设计
- 基于UWB室内仿真教程课程设计
- 2026年国家能源集团招聘笔试题库及答案真题题库
- 2026年非公企业党建基础知识考试试题
- 2026年监理员考试题库及答案
- 2025年秋五四制六年级上册道德与法治全册知识点
- 2026年全国软件水平考试之中级系统集成项目管理工程师考试绝密预测题(详细参考解析)
- 施工工地扬尘治理方案及施工方法
- 新学期(2026年秋)高一历史教学工作计划
- 流感预防健康知识
- 心肺运动试验(CPET)标准化质量控制全流程科室业务学习资料
- 烟花爆竹从业人员安全教育培训计划
- 网络科学导论
评论
0/150
提交评论