版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBULecture7SelectionStructures(1/2)
——选择结构(1/2)
1IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBUCharacteristicsofSelectionStructuresRelationalExpressionsLogicalExpressionsif
StatementsNestedSelectionStructuresConditionalExpressionsswitchStatementLecture7SelectionStructures(1/2)
2IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBUCharacteristicsofSelectionStructures
——选择结构的特征
RelationalExpressionsLogicalExpressionsif
StatementsNestedSelectionStructuresConditionalExpressionsswitchStatementLecture7SelectionStructures(1/2)
3IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU顺序结构与选择结构的差异CharacteristicsofSelectionStructures4顺序结构操作A操作B分支(选择)结构判断操作A操作BYN如果则否则IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU我们需要逻辑判断2012年是闰年吗?——从问题到答案地球绕太阳运行周期为365天5小时48分46秒(1个回归年,合365.24219日)因为在平年公历只计算365日,结果四年后便会累积0.24220×4=0.9688日,大约等于一日,所以便逢四年增加一日闰日以抵销这0.9688日经过四百年就会多算出(1-0.9688)×100=3.12日(大约3日),因此,每四百年中要减少三个闰年CharacteristicsofSelectionStructures5IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU我们需要逻辑判断闰年设定——让地球/人类“等”一天,使我们与地球同步CharacteristicsofSelectionStructures0.24220day每年人类落后0.24220日≈8学时0.24220×4=0.9688day每4年人类落后近1日,每4年应补1日1-0.9688=0.0312day每4年人类超前0.0312日≈1学时0.0312×100=3.12days每400年人类超前近3日,每400年应减少3日,即100,200,300,400年中只增加1日6被100整除的年份,如果被400整除才加1日被4整除的年份,需加1日IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU我们需要逻辑判断算法(y为年度,如2012)如果:y被4整除如果:y不被100整除则:y是闰年否则:如果:y被400整除则:y是闰年否则:y不是闰年否则:y不是闰年CharacteristicsofSelectionStructures7y被4整除但不被100整除y被4整除同时被100整除,也被400整除y被400整除12如果: y被4整除并且
y不被100整除或者y被400整除则:y是闰年否则:y不是闰年需解决3个问题IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBUCharacteristicsofSelectionStructuresRelationalExpressions
——关系表达式【重点】关系运算规则【难点】真假值的确定LogicalExpressionsif
StatementsNestedSelectionStructuresConditionalExpressionsswitchStatementLecture7SelectionStructures(1/2)
8IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU关系表达式:进行数据之间的大小比较运算的表达式关系运算符【pp91】RelationalExpressionsCategory
OperatorAssociativity大小关系运算
>(大于,isgreaterthan)<(小于,islessthan)>=(大于等于,isgreaterthanorequalto)<=(小于等于,islessthanorequalto)
Lefttoright
相等运算
==(等于,isequalto)!=(不等于,isnotequalto)
Lefttoright
highestprecedencelowestprecedence9IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU格式与运算规则格式其中E1和E2为算术类型表达式或指针Op为关系运算符运算规则左结合,优先级低于算术运算、高于赋值运算计算E1和E2的值如果E1和E2之间大小关系与Op的含义一致,则结果为1,否则结果为0结果类型为intRelationalExpressionsE1OpE210>,>=,<,<=,==,!=字符型整型枚举型浮点型整型类型IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU关系表达式的值是逻辑值逻辑值是表示逻辑判断结果的量关系表达式的值是逻辑值,即1或0;1表示真(True),0表示假(False)1==1的值为1(真)1<1的值为0(假)1!=5>=3的值为0(假)2012%4==0的值为1(真)2012%100!=0的值为1(真)2012%400==0的值为0(假)RelationalExpressions11值为1IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU关于关系表达式的说明不同类型之间运算时进行类型转换,应尽量采用同类型(类型不同时可采用强制转换)4>=3.9
4.0>=3.9RelationalExpressions#include<stdio.h>main(){inta=-1;unsignedintb=0;printf("%d,%d",a>b,-1>0);}1111111111111111a0000000000000000b65535intunsigned12显示:1,0-1>0?不同类型混合运算——进行类型转换(int→unsignedint)!同类型(int)运算IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU关于关系表达式的说明字符的比较通过其ASCII码进行’a’>’A’97>65的值为1实数的比较要考虑存储和运算的误差x==0.0
可能永远不为真,可代替为fabs(x)<1.0e-6RelationalExpressions数学库函数,x的绝对值13IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU计算机采用二值逻辑判断结果只有真或假两种情况的逻辑体系计算机中的逻辑运算就是二值逻辑体系,C中的逻辑值只有1和0RelationalExpressions14IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU前沿知识:模糊逻辑(Zadeh,1965)经典集合集合论中,任何一个元素a和集合A之间的关系只有两种:aA和aA而模糊逻辑中一个元素a以一定的隶属度属于A模糊逻辑用于模拟人类的高级思维RelationalExpressions15IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBURelationalExpressions扎德(1921~
)
Zadeh,L.A.
美国自动控制专家。模糊集理论的先驱者。1921年2月生于苏联巴库。1949年获哥伦比亚大学电机工程博士学位。在博士论文中引入时变变换函数概念,成为分析线性时变系统的工具。50年代从事滤波器研究。60年代研究状态空间理论。1965年在《信息与控制》杂志第八期上发表《模糊集》论文,通过引进模糊集(边界不明确的类)提供了一种分析复杂系统的新方法。他提出用语言变量代替数值变量来描述系统的行为,并绘出了一种较好的人类推理模式。他的模糊集理论开创了模糊系统与模糊控制理论的研究。CreatorofFuzzy16IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU模糊逻辑秃顶?RelationalExpressions17IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU模糊逻辑年轻?15岁,24岁,25岁,26岁,35岁,45岁,65岁,…RelationalExpressionsx=30时最模糊18经典逻辑中的排中律不成立——30岁时“既年轻又不年轻”,否定与肯定同时为“真”IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBUCharacteristicsofSelectionStructuresRelationalExpressionsLogicalExpressions
——逻辑表达式【重点】逻辑运算规则【难点】运算对象和运算结果的真假值if
StatementsNestedSelectionStructuresConditionalExpressionsswitchStatementLecture7SelectionStructures(1/2)19IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU目前已解决的问题——简单判断LogicalExpressions如果: y被4整除并且
y不被100整除或者y被400整除则:是闰年否则:不是闰年检测:y%4==0的值y%100!=0的值y%400==0的值20IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU下一步要解决的问题——实现更复杂的逻辑判断LogicalExpressions如果: y被4整除并且
y不被100整除或者y被400整除则:是闰年否则:不是闰年21IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU逻辑表达式对逻辑量(具有逻辑值——真/假——的量,是某种判断的结果)进行逻辑组合,实现复杂逻辑判断的表达式逻辑运算符的运算对象是逻辑量(可以是关系表达式),运算结果也是逻辑量(最终判断结果)关系表达式是逻辑表达式的特例LogicalExpressions22IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU逻辑运算符LogicalExpressionshighestprecedencelowestprecedenceCategory
OperatorAssociativityLogicalNOT
(逻辑非)!Righttoleft
LogicalAND
(逻辑与)&&
Lefttoright
LogicalOR
(逻辑或)||
Lefttoright
23IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU逻辑表达式格式格式其中表达式E1和E2的类型不必一致,但必须为算术类型
(包括关系表达式)或指针算术类型字符型整型枚举型浮点型LogicalExpressionsE1&&E2E1||E2!E124整型类型逻辑表达式运算规则真值表(Truthtable,列出逻辑表达式真假值的表)逻辑运算对象的逻辑值:非0为真,0为假逻辑运算(包括关系运算)结果:1为真,0为假E1的值E2的值E1&&E2E1||E2!E1000010非零011非零0010非零非零110IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBULogicalExpressions25IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU逻辑表达式运算规则逻辑与运算(&&)两个运算对象都非0,结果才为1,否则为0具有严格求值顺序:E1&&E2中E1为非0时才计算E2,E1为0时不计算E2类比LogicalExpressionsE1E2E1&&E2E1打开时不必检查E226IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU逻辑表达式运算规则逻辑或运算(||)两个运算对象都为0,结果才为0,否则为1具有严格求值顺序:E1||E2中E1为0时才计算E2,E1为非0时不计算E2类比LogicalExpressionsE1||E2E1E2E1闭合时不必检查E227IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU逻辑表达式运算规则逻辑非运算(!)只有一个运算对象(单目运算符)运算对象的逻辑值为0(非0)时,结果1(0)类比LogicalExpressions!E1E1R28IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU逻辑表达式运算规则优先级与结合性小结【pp378-379:App.D】LogicalExpressions29!(右结合)算术运算符关系运算符&&||赋值运算符(右结合)逗号运算符高低IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU闰年的条件y被4整除并且y不被100整除或者y被400整除((y%4==0)&&(y%100!=0)) ||(y%400==0)的值为1(真)考虑优先级后:y%4==0&&
y%100!=0
||y%400==0的值为1(真)LogicalExpressions30IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBUCharacteristicsofSelectionStructuresRelationalLogicalExpressionsLogicalExpressionsif
Statements ——if语句【重点】if语句的执行流程【难点】选择结构条件的表示NestedSelectionStructuresConditionalExpressionsswitchStatementLecture7SelectionStructures(1/2)
31IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU目前已解决的问题——逻辑判断,即语句的执行条件if
Statements如果: y被4整除并且
y不被100整除或者y被400整除则:是闰年否则:不是闰年检测:y%4==0&& y%100!=0|| y%400==0
的值32IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU下一步要解决的问题——实现程序的分支结构if
Statements如果: y被4整除并且
y不被100整除或者y被400整除则:是闰年否则:不是闰年33IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU简单if语句格式其中表达式E为算数类型(包括逻辑表达式)或指针,称为条件E非0:条件成立;E等于0:条件不成立S为1条语句(以;号结尾)执行过程if
Statementsif
(E)S计算EE0?执行SYesNo表达式必须用()括起!执行S的下一条语句34IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU示例-1:从键盘输入一个年份,如果是平年则显示365,如果是闰年则显示366if
Statements#include<stdio.h>main(){ unsignedintyear,days=365; printf("\nPleaseinputayear:"); scanf("%u",&year); if(year%4==0&&year%100!=0||year%400==0)
days=366; printf("\n%u",days);}SE35条件不成立时days=?闰年的条件:
year%4==0&&year%100!=0||year%400==0的值为1(真)if((year%4==0&&year%100!=0||year%400==0)==1)…等价于:if((year%4==0&&year%100!=0||year%400==0)!=0)…等价于:if(year%4==0&&year%100!=0||year%400==0)…在逻辑值的意义上:E!=0与E等价;E==0与!E等价逻辑表达式的值只能为1或0IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBUif(E)S在语法上是1条语句条件成立时需要执行多条语句怎么办?问题:E非0时需要执行多个语句S1,S2,…,Sn解决方法:使用复合语句{S1S2…Sn}(语法上相当于1条语句)替代Sif
Statementsif
(E)S36如果a大于b则交换a和b的值:
t=a;a=b;b=a;if(a>b)t=a;a=b;b=a;a>b时正常工作,但a≤b时不符合题意{}IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU可读性好的编码风格采用锯齿形格式,使{与}对齐,其内部语句向右缩进(采用Tab键)if(a>b){t=a;a=b;b=t;}if(a>b) {t=a;a=b;b=t;}if(a>b){ t=a; a=b; b=t; }if
StatementsK&Rstyle37if(a>b) {t=a;a=b;b=t; }AllmanstyleIntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU关于条件E可以是关系表达式或逻辑表达式:E的值为1时条件成立,0时条件不成立if(i!=0)x=1.0/i;E也可以是一般的数值表达式:当E的值为非0时条件成立,0时条件不成立if(i)x=1.0/i;(效率更高,但是…)if((a<=b)==1)…
if((a<=b)!=0)…
if(a<=b)…if
Statements38IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU基本if语句【重点】格式其中表达式E为算数类型(包括逻辑表达式)或指针,称为条件E非0:条件成立;E等于0:条件不成立S1,S2分别为1条语句执行过程if
(E)S1elseS2在语法上视为1条语句if
Statementsif
(E)S1elseS2计算EE0?执行S1YesNo执行S2的下一条语句执行S239表达式必须用()括起!IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU示例-2:平年显示365,闰年显示366if
Statements#include<stdio.h>main(){ unsignedintyear,days; printf("\nPleaseinputayear:"); scanf("%u",&year); if(year%4==0&&year%100!=0||year%400==0)
days=366; else
days=365; printf("\n%u",days);}S1ES240IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU说明简单if语句是if-else语句的特例当S2为空语句时,if(E)S1elseS2等价于if(E)S1if
Statementsif
(E)Sif
(E)Selse;41;计算EE0执行SYesNo;IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU说明当条件成立(不成立)时需要执行多条语句,则S1(S2)应以复合语句替换表达式计算可能的副作用在执行S(或S1或S2)之前全部产生完毕后【难点】if
Statements42#include<stdio.h>main(){ inti=0; if(i++==0) printf("%d",i);}i++的值为0此时i值为1IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU说明注意区分=和==运算的区别!=有副作用,==没有副作用【重点】i=4==4;执行后表达式的值与i的值?(i=4)==4;执行后表达式的值与i的值?if
Statements43#include<stdio.h>main(){ inti=0; if(i=1) printf("1!"); else printf("0!");}【容易犯的错误!】此时i值变成1(副作用!),赋值运算i=1的值为1(非0)IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU示例-3:如果键盘输入是英文字母则显示其ASCII码if
Statements#include<stdio.h>main(){ charch; printf("\nPleaseinputacharacter:"); scanf("%c",&ch); if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z') printf("\nASCIIof%cis%d",ch,ch);}Pleaseinputacharacter:aASCIIofais97
不能写成:’A’<=ch<=’Z’||’a’<=ch<=’z’当ch值为’4’时:ch>=’A’&&ch<=’Z’的值为0;而’A’<=ch<=’Z’(’A’<=ch)<=’Z’(’A’<=’4’)<=’Z’0<=90的值为1(真)!44也不能写成:ch>='A'&&ch<='z'IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU示例-4:问题同前if
Statements#include<stdio.h>main(){ charch; if((ch=getchar())>='A'&&ch<='Z'|| ch>='a'&&ch<='z') printf("\nASCIIof%cis%d",ch,ch); else printf("\nNotaletter");}45&&和||具有严格求值顺序,计算过程中产生的副作用影响后续运算一定会先调用getchar(),因而后续的ch具有确定的值!值为ch的值条件可否写成: getchar()>=’A’&&getchar()<=’Z’||getchar()>=’a’&&getchar()<=’z’IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU多路if语句【重点】格式if
Statementsif
(E1) S1else
if
(E2) S2else
if
(E3) S3…else
if
(En) SnelseSn+1
其中E1,E2,…,En为条件:非0则条件成立;等于0则条件不成立S1,S2,…,Sn,Sn+1分别为1条语句当Sn+1为空语句时,最后一个elseSn+1可以省略46IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU多路if语句执行过程if
Statementsif
(E1) S1else
if
(E2) S2…else
if
(En) Snelse Sn+1
E10?执行S1YesNo执行Sn+1的下一条语句E20?执行S2YesNoEn0?执行SnYesNo执行Sn+1No47计算E1计算E2计算En语法上视为1条语句IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU说明当条件成立(不成立)时需要执行多条语句,则S1,S2,…,Sn,Sn+1应以复合语句替换各路判断中的隐含前提if
Statementsif(E1)S1elseif(E2)S2/*此时E1为0*/elseif(E3)S3/*此时E1和E2皆为0*/…elseif(En)Sn/*此时E1,E2,…,En-1皆为0*/else/*此时E1,E2,…,En皆为0*/Sn+148IntelligentInformationProcessingLab.,Dept.ofComputerSci.&Tech.,YBU说明S1,S2,…,Sn,Sn+1中的语句必定能够得到执行,而且仅有一个语句得以执行n==1时本语句变成基本if语句if
Statements4
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论