配色: 字号:
C程序课件第5章分支
2012-04-24 | 阅:  转:  |  分享 
  
C程序设计第五章选择结构程序设计一、关系运算符和关系表达式二、逻辑运算符和表达式三、if语句四、switch语句五、程序举
例例EX5_5_2voidmain(){ inta,b;printf("pleaseinputA,B:");
scanf("%d%d",&a,&b); if(a==b) printf("A=B\n"); elseif(a>b)
printf("A>B\n"); else printf("A式的一般形式为: 表达式1?表达式2:表达式33、条件运算符和条件表达式如果在条件语句中,只执行单个的赋值语
句时,常可使用条件表达式来实现。不但使程序简洁,也提高了运行效率。条件运算符为?和:,它是一个三目运算符,即有三个
参与运算的量。其求值规则为:先求解表达式1,如果表达式1的值为真(非0),则求解表达式2,并以表达式2的值作为
整个条件表达式的值,否则求解表达式3,并以表达式3的值作为整个条件表达式的值。条件表达式通常用于赋值语句之中。例如
条件语句: if(a>b)max=a;elsemax=b;可用条件表达式写为: max=(a>b)?a:b;
执行该语句的语义是:如a>b为真,则把a赋予max,否则把b赋予max。使用条件表达式时,还应注意以下几点:
1)条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。因此 max=(a>b)?a:b 可以去掉括号而写
为 max=a>b?a:b2)条件运算符?和:是一对运算符,不能分开单独使用。3)条件运算符的结合方向是自右
至左。例如:a>b?a:c>d?c:d应理解为a>b?a:(c>d?c:d)这也就是条件表达式嵌套的情形,即其中的表达式3又是
一个条件表达式。例EX5_6用条件表达式,输出两个数中的较大者(EX5_3_1另一方法)voidmain(){ inta
,b,max; printf("Inputtwonumbers:\n"); scanf("%d,%d",&a,&b);
printf("max=%d\n",a>b?a:b);}C语言还提供了另一种用于多分支选择的switch语句,其一般形
式为: switch(表达式) { case常量表达式1:语句1; case常量表达式2:语句2; …… ca
se常量表达式n:语句n; default:语句n+1; }其语义是:计算表达式的值。并逐个与其后的常量表达式值相
比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与
所有case后的常量表达式均不相同时,则执行default后的语句。例EX5_7输入一个数字,输出是星期几。voidmai
n(){ inta; printf("Inputintegernumber:\n"); scanf("%d",&a);
switch(a) { case1: printf("Monday\n"); case2: printf("T
uesday\n"); case3: printf("Wednesday\n"); case4: printf("
Thursday\n"); case5: printf("Friday\n"); case6: printf("S
aturday\n"); case7: printf("Sunday\n"); default: printf("er
ror\n"); }}本程序是要求输入一个数字(1—7之间),输出一个英文单词(星期几)。但是当输入3之后,却执行了
case3以及以后的所有语句,输出了Wednesday及以后的所有单词。这当然是不希望的。为什么会出现这种情况呢?这恰恰反应了sw
itch语句的一个特点。在switch语句中,“case常量表达式”只相当于一个语句标号,表达式的值和某标号相等则转向该标号执行
,但不能在执行完该标号的语句后自动跳出整个switch语句,所以出现了继续执行所有后面case语句的情况。这是与前面介绍的if语句
完全不同的,应特别注意。为了避免上述情况,C语言还提供了一种break语句,专用于跳出switch语句,break语句只有关键字
break,没有参数。在后面还将详细介绍。修改例题的程序,在每一case语句之后增加break语句,使每一次执行之后均可跳出sw
itch语句,从而避免输出不应有的结果。例EX5_7_2voidmain(){ inta;printf("Inpu
tintegernumber:\n"); scanf("%d",&a); switch(a) { case1:
printf("Monday\n"); break; case2: printf("Tuesday\n"); break
; case3: printf("Wednesday\n"); break; case4: printf("T
hursday\n"); break; case5: printf("Friday\n"); break; cas
e6: printf("Saturday\n"); break; case7: printf("Sunday\n"
); break; default: printf("error\n"); }}在使用switch语句时还应注意
以下几点:1)在case后的各常量表达式的值不能相同,否则会出现错误。2)在case后,允许有多个语句,可以不
用{}括起来。3)各case和default子句的先后顺序可以变动,而不会影响程序执行结果。4)defau
lt子句可以省略不用。例EX5_8输入三个整数,输出最大数和最小数。voidmain(){ inta,b,c,ma
x,min; printf("Inputthreenumbers:\n"); scanf("%d,%d,%d",&a,&b
,&c); if(a>b) { max=a;min=b;} else { max=b;min=a;
} if(maxc) min=c; printf("max=%d\nmin=
%d\n",max,min);}例EX5_9求一元二次方程ax2+bx+c=0的解。关于一元二次方程,在实际运算
过程中有以下几种可能:(1)a=0,不是二次方程;(2)b2–4ac=0,有两个相等实根;(3)b2–
4ac>0,有两个不等实根;(4)b2–4ac<0,有两个共轭复根。下面给出N-S图和程序:(P10
2图5.14)数学系计算机系列课程课件之一本章要点5.1关系运算符和表达式5.2逻辑运算符和表达式5.
3if语句和if语句的嵌套5.4switch语句5.5程序举例在程序中经常需要比较两个量的大小关系,以决
定程序下一步的工作。比较两个量的运算符称为关系运算符。在C语言中有以下关系运算符:<(小于)<=
(小于或等于)>(大于)>=(大于或等于)==(等于)!=(不等于)
关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。在六个关系运算符中,<,<=,
>,>=的优先级相同,高于==和!=,==和!=的优先级相同。1、关系运算符2、关系表达式用关系运算符将两个表
达式连接起来的式子,称为关系表达式。关系表达式的一般形式为: 表达式关系运算符表达式例如:a+b>c-d
,x>3/2,''a''+1因此也允许出现嵌套的情况,例如:a>(b>c),a!=(c==d)关系表达式的值是一个逻辑值,即“真”或“假”。C语
言没有逻辑型数据,在一般情况下,用“1”表示“真”,用“0”表示“假”,有时也以“非零”表示“真”,因此在进行比较时要注意关系表达
式最终的值是否是非零还是零。如:5>0的值为“真”,即为1。(a=3)>(b=5)由于3>5不成立,故其值为假,即为0。
又如,当a=3,b=2,c=1时,表达式(a>b)==c的值为“真”,表达式b+cb为
“真”,f=a>b>c为“假”。例EX5_1输出关系表达式的值:voidmain(){ charc=''k'';int
i=1,j=2,k=3; floatx=3e+5,y=0.85; printf("%d,%d\n",''a''+5j>=k+1); printf("%d,%d\n",1,i+j+k==-2j,k==j==i+5);}逻辑运算符和其它运算符优先级的关系可表示如下:(1)!(非)→
&&(与)→||(或),即“!”为三者中优先级最高;1、逻辑运算符及优先次序C语言中提供了三种逻辑运算符:&&(与
运算),||(或运算)和!(非运算)。与运算符(&&)和或运算符(||)均为双目运算符。具有左结合性。非运算符(!)为单目运
算符,具有右结合性。(2)逻辑运算符中的“&&”和“||”低于关系运算符,“!”高于算术运算符。如P89图5.2所示。!(
非)(高)算术运算符关系运算符&&和||赋值运算符(低)按照运算符的优先顺序可以得出:a
>b&&c>d等价于(a>b)&&(c>d)!b==c||ddc&&x+yc)&&((x+y)运算量为真时,结果为假;参与运算量为假时,结果为真。例如:!(5>0)的结果为假。2、逻辑运算的值逻辑运算的值也为“
真”和“假”两种,用“1”和“0”来表示。其求值规则如下:1)与运算&&参与运算的两个量都为真时,结果才为真,否则为假
。例如,5>0&&4>2,由于5>0为真,4>2也为真,相与的结果也为真。2)或运算||参与运算的两个量只要有一个为真
,结果就为真。两个量都为假时,结果为假。例如:5>0||5>8,由于5>0为真,相或的结果也就为真下面给出逻辑运算的真值表:
10100010||10100010&&0110!与运算或运算非运算
虽然C编译在给出逻辑运算值时,以“1”代表“真”,“0”代表“假”。但反过来在判断一个量是为“真”还是为“假”时,以“0”代表“假
”,以非“0”的数值作为“真”。例如:由于5和3均为非“0”因此5&&3的值为“真”,即为1。又如:5||0的值为“真”,即为1。
其中的表达式可以又是逻辑表达式,从而组成了嵌套的情形。例如:(a&&b)&&c根据逻辑运算符的左结合性,上式
可写为:a&&b&&c。3、逻辑表达式用逻辑运算符将关系表达式或逻辑量连接起来的式子,称为逻辑表达式。逻辑表达式的一般形式为
: 表达式逻辑运算符表达式例如:(1)若a=4,则!a的值为0;(2)若a=4,b=5,则a
&&b的值为1,a||b的值为1,!a||b的值为1。与关系表达式相同,逻辑表达式也有一个值,称为逻辑
值即“真”或“假”。C语言编译系统在给出逻辑运算结果时,以数值1代表“真”,以0代表“假”,但在判断一个逻辑量是否为“真”时,以0
代表“假”,以非0代表“真”。即将一个非0的数值认作为真。例EX5_2输出逻辑表达式的值voidmain(){ char
c=''k'';inti=1,j=2,k=3; floatx=3e+5,y=0.85; printf("%d,%d\n"
,!x!y,!!!x); printf("%d,%d\n",x||i&&j-3,i%d\n",i==5&&c&&(j=8),x+y||i+j+k);}在逻辑表达式的求解中,并不是所有的逻辑运算符都被执
行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。例如:(1)a&&b&&c只有a为真时,
才需要判别b的值,只有a和b都为真时才需要判别c的值。只要a为假,就不必判别b和c(此时整个表达式的值为假)。如果a为真,b为假,
不判别c。(见P90图5.3)(2)a||b||c只要a为真,就不必判断b和c;只有a为假,才判别b;a
和b都为假才判别c。(见P90图5.4)也就是说,对&&运算符来说,只有a≠0,才继续进行其右边的运算。对||运
算符来说,只有a=0,才继续进行其右边的运算。在第二章算法中,曾介绍了闰年的算法(第二种),就是使用逻辑表达式来完成的。
闰年问题可以用一个逻辑表达式表示:(year%4==0&&year%100!=0)||year%
400==0而非闰年则可表示为:!((year%4==0&&year%100!=0)||
year%400==0)也就是:(year%4!=0||(year%100==0&&
year%400!=0)这与集合运算是完全等价的,即:。(1)基本形式:if(表达式)语句;其语义
是:如果表达式的值为真,则执行其后的语句,否则不执行该语句。该语句的执行过程如P92图5.5(a)所示。if语句是用来
判定给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。也就是说if语句可以构成分支结构,它根据给定的条件进行
判断,以决定执行某个分支程序。1、if语句的三种形式例EX5_3_1用if语句输出两个数中较大者:voidmain(){
inta,b,max; printf("Inputtwonumbers:\n"); scanf("%d,%d",&
a,&b); max=a; if(max形式:if–else形式,其格式为: if(表达式) 语句1; else 语句2;其语义是:如果表达式的值为
真,则执行语句1,否则执行语句2。该语句的执行过程如P92图5.5(b)所示。例EX5_3_2用if-else语句输出两个数中较
大者voidmain(){ inta,b; printf("Inputtwonumbers:\n"); sca
nf("%d,%d",&a,&b); if(a>b) printf("max=%d\n",a); else pri
ntf("max=%d\n",b);}(3)第三种形式:if–else–if形式前二种形式的if语句一般都用于两个
分支的情况。当有多个分支选择时,可采用if-else-if语句,其一般形式为: if(表达式1) 语句1; elseif
(表达式2) 语句2; elseif(表达式3) 语句3; …… elseif(表达式m) 语句m; el
se 语句n;(或语句m+1;)其语义是:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然
后跳到整个if语句之外继续执行程序。如果所有的表达式均为假,则执行语句n。然后继续执行后续程序。if-else-if语句的执行过程
如P92图5.6所示。例EX5_4用if-else-if语句判断输入的字符的类型:voidmain(){ charc;
printf("Inputacharacter:\n"); c=getchar(); if(c<32) prin
tf("Thisisacontrolcharacter\n"); elseif(c>=''0''&&c<=''9'') p
rintf("Thisisadigit\n"); elseif(c>=''A''&&c<=''Z'') printf("Th
isisacapitalletter\n"); elseif(c>=''a''&&c<=''z'') printf("Th
isisasmallletter\n"); else printf("Thisisanothercharac
ter\n");}在使用if语句时应该注意以下问题:A、在三种形式的if语句中,在if关键字之后均为表达式。
该表达式通常是逻辑表达式或关系表达式,但也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量。例如:if(a=5)语句;i
f(b)语句;都是允许的。只要表达式的值为非0,即为“真”。如在if(a=5)…;中表达式的值永远为非0,所以其后的语句总是要执
行的,当然这种情况在程序中不一定会出现,但在语法上是合法的。又如,有程序段: if(a=b) printf("%d",a);
else printf("a=0");本语句的语义是,把b值赋予a,如为非0则输出该值,否则输出“a=0”字符串
这种用法在程序中是经常出现的。C、在if语句的三种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组(多个)语句,则
必须把这一组语句用{}括起来组成一个复合语句。但要注意的是在}之后不能再加分号。例如: if(a>b){ a++;b
++; } else { a=0; b=10; }B、在if语句中,条件判断表达式必须用括号括起来,在语句之后必须加分
号。当if语句中的执行语句又是if语句时,则构成了if语句嵌套的情形。其一般形式可表示如下: if(表达式) if语
句;或者为 if(表达式) if语句; else if语句;2、if语句的嵌套在嵌套内的if语句
可能又是if-else型的,这将会出现多个if和多个else重叠的情况,这时要特别注意if和else的配对问题。例如: if(表达式1) if(表达式2) 语句1; else 语句2;其中的else究竟是与哪一个if配对呢?应该理解为: 还是应理解为:if(表达式1) if(表达式1) if(表达式2)if(表达式2) 语句1; 语句1; else else 语句2; 语句2;为了避免这种二义性,C语言规定,else总是与它前面最近的if配对,因此对上述例子应按前一种情况理解。如果if与else的数目不一样,为实现程序设计者的企图,也可以使用花括弧来确定配对关系。例如: if() { if()语句1; } (内嵌if) else语句2;例EX5_5_1比较两个数的大小关系:voidmain(){ inta,b;printf("pleaseinputA,B:"); scanf("%d%d",&a,&b); if(a!=b) if(a>b) printf("A>B\n"); else printf("A
献花(0)
+1
(本文系紫霄书屋首藏)