选择结构程序设计【C语言程序设计】.ppt_第1页
选择结构程序设计【C语言程序设计】.ppt_第2页
选择结构程序设计【C语言程序设计】.ppt_第3页
选择结构程序设计【C语言程序设计】.ppt_第4页
选择结构程序设计【C语言程序设计】.ppt_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

4,选择结构程序设计,第4章,【本章导读】,选择结构是结构化程序中基本结构之一。选择结构是根据判定所给条件是否满足,从而决定程序执行哪些语句。C语言中,通常用if语句或switch语句来实现选择结构。 本章主要介绍关系运算符与关系表达式、逻辑运算符与逻辑表达式、if语句、switch语句。通过本章节的学习,读者要掌握关系表达式和逻辑表达式的组成及运算,理解分支程序设计的概念,掌握if语句、switch语句的基本结构及执行过程,理解if语句的嵌套概念,能正确选择分支结构进行程序设计。,选择结构程序设计,4.1,4.1.1 关系运算符 大于 = 大于或等于 = = 等于 != 等于,优先级和结合性: 关系运算符的优先级低于算术运算符,关系运算符中、=、=优先级相同;= =和!= 的优先级低于前四种。 结合性 :左结合,关系运算符与关系表达式,4.1.1,关系运算符都是双目运算符,要求两个操作数是同一种数据类型,其结果为逻辑值。 按C语言的习惯,值为真(true)时用非0值(一般用1)表示;值为假(false)时用0表示。,关系运算符,4.1.2,关系表达式是用关系运算符将两个表达式(可以是算术表达式、关系表达式、逻辑表达式、赋值表达式、字符表达式等表达式)连接起来的式子。 例如: 3+2 = = 2*3; 表示判断3+2的结果和2*3的结果是否相等,关系表达式的一般形式为: 表达式 关系运算符 表达式,关系表达式,4.2,4.2.1 逻辑运算符 & 与运算 | 或运算 ! 非运算 其中,与运算符&和或运算符|均为双目运算符,非运算符!为单目运算符,逻辑运算符与逻辑表达式,a&b 当且仅当a,b都为真时,结果为真 a|b 当且仅当a,b都为假时,结果为假 !a 当a为真时,结果为假;当a为假时,结果为真,逻辑运算的真值表,表4.1,4.2.2,优先级:逻辑运算符中,非运算符(!)和单目的算术运算符同级,高于双目的算术运算符,优先于关系运算符,优先于逻辑运算符与(&)和或(|) ab | cd 等价于 (ab) | (cd) !a= =b& cd 等价于 (!a) = =b)&(cd) 结合性:逻辑运算符中,非运算符(!)的结合性为右结合;与运算(&)和或运算(|)的结合性为左结合。,逻辑运算符的优先级和结合性,4.2.3,逻辑表达式类似于关系表达式,是用逻辑运算符把两个表达式连接起来的式子。 例如: a+b&a; 表示判断a+b和a的值是否为真,若都为真表达式为真,逻辑表达式的一般形式为: 表达式 逻辑运算符 表达式,逻辑表达式,【例4-1】,分析下面程序段的运行结果,/* EX4-1.C */ main() int a=14,b=15,x; char c=A; x=(a ,【注意】,由于&和|运算的左结合性及运算特点,若&运算符左边的表达式为假(或0),则其右边的表达式将不再运算,整个表达式的值必然为假;同理,若|运算符左边的表达式为真(或非0值),则其右边的表达式将不再运算,整个表达式的值必然为真。例如: a=0 & b=b-1 由于表达式a=0的值为0,因此&运算符右边的式子将不再运算(即b的值不变),整个逻辑表达式的值为0。 同理: a=1 | b=b-1 由于表达式a=1的值为1,因此|运算符右边的式子将不再运算(即b的值不变),整个逻辑表达式的值为1。,逻辑运算符的“短路”现象, 4.3,【问题】我们在求解数学问题中常会遇到这样的问题:计算一个分段函数:,单分支if语句 双分支if语句 多分支选择结构,if语句,4.3.1,单分支if语句的基本形式为: if (表达式) 语句; 其语义是:首先判断表达式的值是否为真,若表达式的值非0,则执行其后的语句; 否则不执行该语句,单分支if语句,4.3.1,/* EX4-2.C */ main() float a; printf(“please input the score: “); scanf(“%f“, ,【例4-2】,从键盘输入学生成绩并判断是否及格,若及格输出“pass”,单分支if语句控制流程,双分支if语句,4.3.2,双分支if语句为if-else形式,语句的结构为: if(表达式) 语句1; else 语句2; 其语义是:当表达式的值为真,则执行语句1,否则执行语句2,双分支if语句的控制流程,4.3.2,/* EX4-3.C */ main() int a, b; printf(“input the two numbers: “); scanf(“%d,%d“, ,【例4-3】从键盘输入两个整数,输出其中最大者,多分支选择结构,4.3.3,多分支选择结构的if语句一般形式为: if(表达式1) 语句1; else if (表达式2) 语句2; else if (表达式3) 语句3; else if (表达式n) 语句n; else 语句n+1;,语义:依次判断表达式的值,当某个表达式的值为真时, 则执行其对应的语句。然后跳到整个if语句之外继续执行程序。 如果所有的表达式均为假,则执行语句n 。 然后继续执行后续程序,多分支if语句的控制流程,4.3.3,分段函数,【例4-4】,输入任意x,求y值。,/* EX4-4.C */ main() float x,y; printf(“input the number: “); scanf(“%f“, ,输入-10,输入 0,输入10,【注意】,if语句的条件表达式一般是逻辑表达式或关系表达式,但也可以是其它任何类型的表达式,如赋值表达式等,甚至也可以是一个变量。只要表达式的值非0,即为“真”;表达式值为0,即为“假”。 如在if(a=5)printf(“%dn”,a);中表达式a=5的值永远为非0,条件永远为真。这种情况在程序中一般不会出现。 初学者经常会将符号混淆,尤其是将赋值运算符“=”和关系运算符中的相等运算符“= =”混淆。 例如:判断a的值是否等于2,应写为:a = 2,初学者经常会在这里写为:a = 2。这样,不管a的值原来为多少,现在给a赋值为2,表达式的值为2,永远为真。这样的写法可能会造成程序的执行错误,特别是后面我们将学习循环结构,这种错误的写法常会造成程序的死循环,使程序没有正确的运行结果。,【注意】,(2) 在if语句中,条件表达式必须用括号括起来。在每一个else语句之前必须加分号,整个语句结束处也必须有分号。例如: if ( ab ) max=a; else max=b; 虽然if和else之间加了分号,但ifelse仍是一条语句,都同属于一个if语句。else子句也是if语句的一部分,和if语句配对使用,不能单独使用。 (3) 在if语句的三种形式中,所有的语句应为单个语句,如果想在满足条件时执行一组(多句)操作,则必须把这一组语句用花括号“ ”括起来组成一个复合语句。,if语句的嵌套,4.3.4,当if语句中的语句体又是if语句时,我们认为这种情况就叫if语句的嵌套。 其一般形式: if (表达式) if (表达式) 语句1; else 语句2; else if (表达式) 语句3; else 语句4;,去掉方框部分,可以构造省略的形式,【例4-5】,/* EX4-5.C */ #include “stdio.h“ main( ) int year,flag; scanf(“%d“, ,从键盘输入一个正整数作为年份,编程判断该年是不是闰年。若是输出“YES”,否则输出“NO”。,【分析】闰年的条件是:能被4整除,但不能被100整除的年份是闰年;能被4整除,并且能被400整除的年份是闰年。,【例4-6】,/* EX4-6.C */ #include main() int a,b; printf(“input the two numbers: “); scanf(“%d,%d“, ,输入两个十进制整数,输出这两个数的关系。如若输入的数据为2,3,则输出结果为22,若输入数据为3,3,则输出结果为3=3。,条件运算符和条件表达式,4.3.4,条件运算符 条件运算符是C语言中一个特殊的运算符,由“?”和“:”组合而成,是三目运算符,要求有3个操作对象,并且三个操作对象都是表达式,在条件语句中,若只执行单个赋值语句,我们常使用条件运算来表示 如: if (ab) max=a; else max=b; 用条件运算可以表示为: max=(ab)?a:b;,4.3.4,条件表达式,条件表达式的一般形式为: 表达式1? 表达式2: 表达式3 条件运算的求值规则为: 计算表达式1的值,若表达式1的值为真,则以表达式2的值作为整个条件表达式的值,否则以表达式3的值作为整个条件表达式的值。表达式1的类型可以与表达式2、3不同,表达式2、3的类型可以是数值表达式、赋值表达式或函数表达式,优先级:条件运算符的运算优先级低于关系运算符和算术运算符,高于赋值符 结合方向:自右至左,条件运算符和条件表达式,【例4-7】,/* EX4-7.C */ main() int a, b; printf(“input the two numbers: “); scanf(“%d,%d“, ,用条件运算符对【例4-3】重新编程,输出两个整数中的最大者,switch语句, 4.4,【问题】前面我们所说的if语句通常用于解决两个分支的情况,而日常生活中我们常常要解决多个分支的问题。例如前面我们所说的,给学生成绩划分A、B、C等,诸如此类问题。利用嵌套的if语句当然也可以解决,但是如果分支太多,if语句嵌套的层次数太多,势必会造成程序的冗长,可读性差。有没有什么更好的方法能解决多分支问题呢?,switch语句, 4.4,switch语句专门用于解决多分支选择问题 其一般形式为: switch(表达式) case常量表达式1: 语句1; case常量表达式2: 语句2; case常量表达式n: 语句n; default : 语句n+1; ,switch语句, 4.4,语义:计算表达式的值,并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时, 即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。 如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。,【例4-8】,/* EX4-8.C */ #include main() int a; scanf(“%d“, ,输入一个十进制数,根据输入的数输出所对应的英文星期单词,若所输入的数小于1或大与7,则输出“Error”,【注意】,(1) switch后跟的“表达式”允许为任何类型的表达式。 (2) 在每一个case后的各常量表达式的值不能相同,否则会出现错误。 (3) 在case后,允许有多个语句,可以不用括起来。 (4) case和default子句出现的先后顺序可以变动,不会影响程序执行结果。default子句也可以省略不用。 (5) 多个case可以共用一组执行语句。例如: case A: case B: case C:printf(“60n“);break; , 4.5,程序举例,/* EX4-10.C */ #include main() int a; printf(“Enter an integer: “); scanf(“%d“, ,【例4-10】输入一个十进制正整数,判断该数是否是7的倍数,若是输出“Yes!“,否则输出“No!” 【分析】输入一个十进制数,判断是否为7的倍数,只需考察这个数对7取余数结果是否为0,为0就是7的倍数,否则就不是7的倍数。,【例4-11】,/* EX4-11.C */ #include “stdio.h“ main ( ) int a, b, c, t ; printf (“please input the three number: “); scanf (“%d,%d,%d“, ,输入3个数,按从大到小的顺序输出。,【分析】设3个数分别是a、b和c,把它们中最大者存放在a中,把次大者存放在b中,c中存放最小者,然后依次输出a、b和c,【例4-12】,#include main() int a; printf(“input the score: “); scanf(“%d“, ,【将一个百分制的成绩转化成5个等级:90分以上为A,8089分为B,7079分为C,6069分为D,60分以下为E。例如输入75,则显示C。,【分析】先判断输入的数据是否在合理的分数范围(0100)内,然后再判断是哪个分数段:90分以上输出A,8089分输出B,7079分输出C,6069分输出D,否则显示E。,/* EX4-12.C */,【例4-13】,用switchcase语句来实现【例4-12】,【分析】为了使用switch语句,必须将分数段和等级字母的对应关系转化为某个常量和等级字母的对应关系。经过分析,我们可以把输入的分数十位上的数字作为考查对象,只需要将输入的分数除以十,得到的数据就是十位上的数值。用这个数据和等级字母的对应关系来替代某个分数段和等级字母的对应关系。,/* EX4-13.C */ main() int a; scanf(“%d“, ,【例4-13】,用switchcase语句来实现【例4-12】,【例4-14】,输入2005年的一个月份,输出这个月的天数。(2005年为平年),【分析】根据输入的月份数判断,当月份为1、3、5、7、8、10、12时,天数为31,当月份为4、6、9、11时,天数为30,20

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论