1.1 引例
输入三角形的三边,判断是否构成三角形,若能则计算并输出三角形的体积,否则各处出错提示。
编辑
编辑
程序运行时首先输入三角形的三条边,分别保存在三个证型变量a,b,c中,然后根据三角形的构成条件,判断任意两边值和是否大于第三边。若不满足此条件,则这三便不能构成三角形,若满足此条件则构成三角形,则根据相应公式计算出三角形的面积。
编写程序,首先输入x的值,按以下分段函数计算并输出y的值。
编辑
编辑
编辑
4.2 关系运算符、逻辑运算符、条件运算符
4.2.1 关系运算符和关系表达式
1. 关系运算符
关系运算符用于判断两个操作数的大小关系。在C语言中有6个关系运算符,如表4.1所示。
表4.1 关系运算符
运算符 | 含义 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
注意:
(1)关系运算符都是双目运算符,其结合方向是左结合。
(2)关系运算符的优先级低于算术运算符,但高于赋值运算符。
(3)关系运算符中,>、<、>=、<=的优先级相同,==、!=的优先级相同,前者的优先级高于后者,即“>=”的优先级高于“==”。
2.关系表达式
用关系运算符将两个表达式连接起来的式子称为关系表达式。关系表达式的一般形式为:
表达式1 关系运算符 表达式2
功能:比较两个表达式的大小,返回一个逻辑值。
关系表达式中允许出现嵌套的情况。
注意:
(1)注意区分运算符“=”和“==”。“=”是赋值运算符,“==”是关系运算符。
(2)对实数进行判断可能得不到正确的结果,例如“1.0/3.0==1.0”的结果为0。
(3)关系表达式中可以出现赋值运算符,如“a>(b=0)”,但不能个写成“a>b=0”的形式。应为关系运算符的优先级高于算术运算符,表达式“a>b=0”相当于“(a>b)=0”,赋值运算符左边不是变量,会出现编译错误。
关系表达式主要用于分支结构中的条件判断。关系表达式的结果是一个逻辑值“真”或“假”,由于C语言中逻辑类型的数据,应此用“1”表示真,“0”表示假。
关系运算示例
编辑
编辑
4.2.2逻辑运算符与逻辑表达式
1.逻辑运算符
关系表达式只能表示单一的条件。对于较复杂的符合条件,例如“x小于10且x大于4”,如果用关系表达式“4<x<10”来描述,则当x=2时,由于关系运算符是左结合的,应此先计算“4<x”其值为0;然后再计算“0<10”,其值为1;即说明当x=2时满足关系“4<x<10”,很显然是错误的。应此需要逻辑运算符将若干个关系表达式连接起来才能正确描述上述关系。逻辑运算符如表4.2所示:
表4.2逻辑运算符
运算符 | ! | && | || |
名称 | 逻辑非 | 逻辑与 | 逻辑或 |
结合性 | 右结合 | 左结合 | 左结合 |
优先级 | 高→低 |
注意:与运算符&&和运算符||都是双目运算符,非运算符!为单目运算符。
2.逻辑表达式
用逻辑运算符将两个表达式连接起来的式子称为逻辑表达式。逻辑表达式的一般形式为:
表达式1 逻辑运算符 表达式2
或
逻辑运算符 表达式1
逻辑表达式的结果也是一个逻辑值“真”或“假”,即为“1”或“0”。逻辑运算的真值表如表4.3所示。
表4.3逻辑运算真值表
x | y | !x | x&&y | x||y |
0 | 0 | 1 | 0 | 0 |
0 | 非0 | 1 | 0 | 1 |
非0 | 0 | 0 | 0 | 1 |
非0 | 非0 | 0 | 1 | 1 |
关于逻辑表达式的说明:
(1)参与逻辑运算的数据可以是1和0,也可以是非0值和0,还可以是任何类型的数据,但最终都是以非0和0来判断他们是“真”或“假”。
(2)在逻辑表达式中,也可以使用赋值运算符,如“a&&(b=0)”,但不能写成“a&&b=0”的形式。因为逻辑运算符的优先级高于赋值运算符,表达式“a&&b=0”相当于“(a&&b)=0”,赋值运算符左边不是变量,会出现编译错误。
(3)C语言规定,只对整个表达式所需的最少数目的子表达式进行运算。即在若干个子表达式组成的逻辑表达式中,从左向右计算,当计算出一个子表达式的值就确定了整个逻辑表达式值时,此后就不再计算右边剩下的子表达式的值,这种情况称为“短路”。
①对于逻辑与(&&)运算,若“&&”左边的表达式的值为假,则可以得出整个表达式的值为假,那么“&&”右边的表达是不再进行运算;只有当“&&”左边表达式为真时才计算右边表达式的值。
②对于逻辑或(||)运算,若“||”左边的表达式的值为真,则可以得出整个表达式的值为真,那么“||”右边的表达是不再进行运算;只有当“||”左边表达式为假时才计算右边表达式的值。
逻辑运算示例
编辑
编辑
分析:
(1)语句1中,逻辑表达式“!a&&!b&c”中包含逻辑运算符“!”和“&&”,由于“!”的优先级高,因此先计算“!a”,值为0,则由于逻辑运算符的短路现象,后面的表达式不再计算则可得出表达式“!a&&!b&&c”的值为0。
(2)语句2中,由于“!”的优先级高于“||”,先计算“!a”,值为0,则还要继续计算“!b”,值为0,然后计算0||0,结果为0,最后计算0||c,结果为1,应此表达式“!a||!b||c”的值为1。
(3)语句3中,关系运算符的优先级高于逻辑运算符,因此先计算“a>=b”,值为1,再计算“b>c”,值为1,最后计算1&&1,值为1,应此表达式“a>=b&&b>c”值为1。
(4)语句4中,逻辑运算符“&&”的优先级高于“||”,因此语句4相当于“b=c--||((b=6)&&a++);”,先计算“c--”,值为2,再将“c--”的结果与表达式“(b=6)&&a++”进行逻辑或运算,由于“||”左边的表达式为真,则可以得出整个表达式的值为真,即b=1,同时“||”右边的表达式不再进行计算。另外表达式“c--”计算完后c自减1,即c=1.因此语句4执行完后,a=3,b=3,c=1,d=1。
算术运算符、关系运算符和逻辑运算符优先级从高到底的顺序如表4.4所示
表4.4各种运算符的优先级从低到高的顺序
运算符 | ! | 算术运算符 | 关系运算符 | &&和|| | 赋值运算符 |
结合性 | 右结合 | 左结合 | 右结合 | ||
优先级 | 高——————————————————————>低 |
逻辑表达式举例:
(1)ch是英文字母。表达式逻辑为(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')。
(2)a,b不同时为0。逻辑表达式为!(a==0&&b==0)或a!=0||b!=0或a||b。
(3)ch是空格或回车。逻辑表达式为(ch==' '||(ch=='\n')。
(4)year是闰年,即year能被4整除但不能被100整除,或year能被400整除。逻辑表达式为(year%4==0&&year%100!=0)||(year%4==0)。
4.2.3 条件运算符和条件表达式
1. 条件运算符
条件运算符由“?”和“:”两个符号组成,用于条件求值,他是一个三目运算符,需要三个操作数。条件运算符的优先级低于逻辑运算符、高于赋值运算符吗,他是右结合的。
2. 条件表达式
由条件运算符将3个表达式连接起来的式子称为条件表达式,其一般形式为:
表达式1?表达式2:表达式3
条件表达式的执行顺序是:先计算表达式1的值,若值为非0,表达式为真,则将表达式2的值作为整个条件表达式的值,否则,将表达式3的值作为整个条件表达式的值。如 4>3!5:7的值为5 若以声明“int x=4,y=3;”则表达式x<y?x++:y++的值是3。
分析:对于表达式“x<y?x++:y++”,先计算表达式“x<y”的值,结果为0,则将表达式“y++”的值,也就是3,作为条件表达式“x<y?x++:y++”的值,而变量y的值为4。
关于条件表达式的说明:
(1)条件表达式中表达式1的类型可以与表达式2和表达式3不同,表达式2和表达式3的类型也可以不同,此时系统会自动进行转换,结果为表达式2和表达是3中级别类型较高的,并将其作为表达式的类型。如条件表达式“'a'!1:2.0”的结果为double型的1.0。
(2)条件表达式中表达式2和表达是3不仅可以是数值表达式,还可以是赋值表达式或函数表达式,如“a>b?b=3:(c=4)”但不能写成“a>b?b=3:c=4”的形式。这是由于在表达式“a>b?b=3:c=4”中,条件运算符的优先级高于赋值运算符,上述表达式相当于“(a>b?b=3:c)=4”,因赋值运算符左边不是变量,所以会出现编译错误。
(3)条件表达式允许嵌套,例如“a>3?b:(c>2?1:0)”根据条件表达式的结合性,他相当于“a>3?b:(c>2?1:0)”。
用条件表达式求两个数中较大的值
编辑
编辑
4.3 使用if—else实现分支结构
4.3.1 if—else语句
1. 双分支if语句
其一般形式如下:
if(表达) 语句1; else 语句2;
用双分支if语句求两个数中较大的值
编辑
编辑
编辑
编写一个程序,根据键盘输入x的值,计算y的值。
编辑
编辑
编辑
双分支if语句可以用条件表达式替换。例如,当if语句中只给同一个变量赋值时,可以使用条件表达式代替if语句。
例如求一个数的绝对值,下面的if语句和条件表达式是等价的。
if(a>0)
y=a;
else
y=-a; 等价于 y=(a>0)?a:(-a);
2. 单分支if语句
其一般形式如下
if(表达式) 语句;
双分支if—else语句中,若缺少了“语句2时”,则构成了单分支if语句。其语意是首先计算表达式,如果表达式的值为“真”,则执行语句;否则不执行语句,直接执行if语句的下一语句。
编写程序任意输入一个实数,输出其绝对值。
编辑
编辑
编辑
无论是双分支还是单分支if语句的格式中,“表达式”都是用来描述判断的条件,语法上可以是任意类型的表达式。表达式的结果如果为“0”,表示“假”,结果为“非0”,则表示“真”。
若有如下分段函数,根据x的值,求y的值。
编辑
编辑
编辑
无论是双分支还是单分支if语句的格式中,被执行的语句均为单个语句,如果想要执行一组(多于一个)语句时,则必须将这一组语句用{ }括起来形成复合语句。但在“}”之后不能再加括号。注意,复合语句中的语句执行时会全部被执行。
输入3个实数,按要求从小到大的顺序输出。
编辑
编辑
4.3.2 if语句的嵌套
在4.3.1节介绍了分支结构if语句的基本形式。使用if语句的基本形式解决分支少于两个的问题十分方便,而经常遇到的是多于两个分支,或者需要在多个不同条件下执行不同语句的问题,这就需要掌握if语句的嵌套以及多分支结构。
一个if语句中又包含一个或多个if语句的现象称为if语句的嵌套。
if语句的基本形式:
if(表达式) 语句1; else 语句2;
其中“语句1”或“语句2”都可以嵌套另一个if语句,在缺省else部分的if语句中的“语句”也可以嵌套另一个if语句。因此,具体嵌套形式可以有很多种。如:
if(表达式1)
if(表达式2)
在if语句的嵌套结构中一定要注意else与if之间的对应关系。
为了避免二义性,在C语言中规定其对应原则是:else总是与它前面最近的一个未匹配的if相匹配。
输入3个任意整数,找出其中的最大值。
编辑
编辑
编辑
编辑
编写程序,输入一个x的值,按以下函数计算并输出y的值。
编辑
编辑
编辑
编辑
4.3.3 多分支if语句
多分支if语句是最常用的实现多路分支的方法,其一般形式如下:
if(表达式1) 语句1; else if(表达式2) 语句2; … else if(表达式n-1) 语句n-1; else 语句n;
编写程序,输入x的值,按以下分段函数计算并输出y的值。
编辑
编辑
编辑
编辑
编写程序由键盘输入一个字符,若该字符为小写字母,则将其转换为大写字母;若该字符为大写字母,则将其转换为小写字母;否则将其转换为ASCII码表中该字符的下一个字符。
编辑
编辑
编辑
4.4 使用switch语句实现分支结构
在C语言中还提供了一种switch语句也可以实现多分支的选择。
switch语句的一般形式如下:
switch(表达式){
case常量表达式1:语句1;break;
case常量表达式2:语句2;break;
…
case常量表达式n:语句n;break;
default:语句n-1;break;
}
switch语句多分支结构执行流程如图所示,其执行过程为:首先计算switch后面括号内的表达式,然后将表达式的值从上到下按顺序与各个case后面的常量表达式的值进行比较,若与某个常量表达式的值相等,则执行该常量表达式后面的语句,然后执行break语句,跳出switch语句,switch语句执行结束;如果表达式的值与任何一个常量表达式的值都不相等,则执行default后的语句,结束switch语句的执行。
编辑
关于switch语句的几点说明:
(1)switch后的表达式可以是任意表达式,其值只能为整型、字符型、枚举型之一;
(2)每个case后面的常量表达式的值互不相同,否则就会出相互相矛盾的现象;
(3)各个case和default的出现次序不影响执行结果;
(4)可以让多个case共用一组执行语句;
(5)switch语句允许嵌套使用。
1. 在switch语句格式中的每个语句后面都使用break语句
编写程序,输入一个月份的值,输出该月份是第几季度。
编辑
编辑
2. 在switch语句格式中的部分语句后面使用break语句
由于可以让多个case共用一组执行语句,在解决默写问题时很有用。
本程序的功能是:根据键盘输入的年、月,输出该年、月的天数。
编辑
编辑
使用switch语句编写4.14的程序。
编辑
编辑
3. 在switch语句格式中不使用break语句
switch语句中不使用break语句时,程序在执行相应语句后,不会跳出正在执行的switch语句,而会执行其后的所有语句。
4.5 分支结构程序设计实例
编写程序,输入x。计算并输出下列分段函数f(x)的值(保留2位小数),要求调用sqrt()函数求平方根,调用pow()函数求幂。
编辑
编辑
编写程序,判断输入的年份是否为闰年。要求使用if语句的标准格式、嵌套格式及多分支格式实现。
编辑
标准格式
编辑
嵌套格式
编辑
分支格式
编辑
由键盘输入一个3位的整数,判断该书是否为升序数。若输入的不是3位数,输出“Enter error”。
编辑
编辑