第 5讲 选择结构一、关系运算符和关系表达式二、逻辑运算符和逻辑表达式三,if语句
1,if语句的三种形式
2,if语句的嵌套四,switch语句五、条件运算符一、关系运算符和关系表达式关系运算符:
<(小于) <=(小于等于) >=(大于等于)
>(大于) == (等于) !=(不等于)
运算顺序:
在关系运算符内部:
<,<=,>,>= 优先级相同( 6级)
==,!= 优先级相同( 7级)
关系运算符的优先级低于算术运算符,但高于赋值运算符。
关系运算符为双目运算符,左结合性。
关系表达式,用关系运算符将两个表达式连接起来的式子。
关系表达式中的表达式可以为算术表达式,关系表达式,逻辑表达式,赋值表达式,字符表达式。
格式:
<表达式 > <关系运算符 > <表达式 >
例,a>b,a+b <=( b=6),a>b == m<n
关系表达式的返回值:
关系表达式的返回值应为逻辑值 "真 "或 "假 "。
若关系表达式的值为 真 时,则用数值型数据 1表示
若关系表达式的值为 假 时,则用 0表示例,关系表达式例子
a) int a,b,c;
a=5;
b=4;
c=(a>b);
printf(“%d”,c); 输出,1
b) int a,b,c;
a=5;
b=4;
c=(a+1)==(b+3);
printf(“%d”,c); 输出,0
二、逻辑运算符和逻辑表达式类型逻辑非 !
逻辑与 &&
逻辑或 ||
运算顺序非( !) → 与( && ) → 或( || )
高 低
逻辑非!
单目运算;运算级别 2;右结合性。
a !a
£¨ 1 £ù £¨ 0 £?
ù £¨ 0 £ £¨ 1 £?
逻辑与 &&
双目运算符;运算级别,11;左结合性 。
a b a&&b
£¨ 1 £ £¨ 1 £ £¨ 1 £?
£¨ 1 £ù £¨ 0 £ù £¨ 0 £?
ù £¨ 0 £ £¨ 1 £ù £¨ 0 £?
ù £¨ 0 £ù £¨ 0 £ù £¨ 0 £?
逻辑或 ||
双目运算符;运算级别,12;左结合性。
a b a||b
£¨1 £ £¨1 £ £¨1 £?
£¨1 £ù £¨0 £ £¨1 £?
ù £¨0 £ £¨1 £ £¨1 £?
ù £¨0 £ù £¨0 £ù £¨0 £?
运算顺序:
在逻辑运算内部,由高到低进行运算混合运算,算术运算关系运算逻辑运算赋值运算非高 低逻辑表达式,用逻辑运算符把表达式连接起来的式子,
它常用来表示复杂的关系。
形式:
[<表达式 >]<逻辑运算符 > <表达式 >
例,1)数学表达式 -3<x<5
应写成,-3<x && x<5
2) a,b不能同时为零应写成:
a==0&&b!=0||a!=0&&b==0||a!=0&&b!=0
说明:
逻辑表达式的值是逻辑量,真,和,假,。逻辑值
,真,是用 非零 数值表示,,假,是用数字,0” 表示的。
逻辑与 ( &&),a&&b只有 a为真时才判断 b的值。
逻辑或 ( ||),a||b只有 a为假时才判断 b的值。
例,!0; !5; 2 &&5; 0 &&5; 5 &&0;
2||5; 2||0; 0||5; 0||0;
例,判断闰年闰年:年号能被 4整除而不能被 100整除;或者能被 400整除;
year%4 ==0 && year%100 !=0 || year%400 ==0( ) ( ) ( )( ) ( ) ( )( )
X=0&&y=1; x=1||y=2
三,if语句
1,if语句的三种形式格式一:单分支结构 if ( < 条件 > ) 语句 A ;
格式二:双分支结构 if ( < 条件 > ) 语句 A ;
else 语句 B ;
格式三:多分支结构
if ( < 条件 1 >) 语句 1 ;
else if ( < 条件 2 >) 语句 2 ;
···
else if ( < 条件 n-1 >) 语句 n-1 ;
else 语句 n ;
说明:
1)条件均为逻辑表达式或关系表达式,也可以是任意的数值类型。
2) else子句是 if语句的一部分,它不能作为语句单独使用,必须与 if配对使用。
3)语句可以是单语句,也可以是复合语句。
注意:在复合语句 { } 外不需再加分号 。
例,if ( 3) printf( "O,K.\n");
if (?q?) printf( "%d\n",?a?);
if ( 3<x && x<=5) printf( "3<x<=5\n" );
例,键盘输入一个整数,输出该数的绝对值。
main ()
{ int shu;
printf("请输入一个整数 %%d:\n");
scanf("%d",& shu );
if ( shu < 0 )
shu = -shu;
printf(“该数的绝对值为,%d。 \n",shu );
}
例,计算
main ( )
{ float x,y;
printf("送数 %%f:\ n");
scanf("%f",&x );
if ( x >= 0 )
y = 3*x+6 ;
else
y = -x*x+2*x-8;
printf("y=%.2f\n",y );
}

82
63
2 xx
x
y
)0(
)0(
x
x
例,任意输入两个不相等的数,将大数放入 X,小数放入 Y中。
算法,
1.定义变量
2.给变量赋初值
3.比较 x,y,若 x<y,交换两数
4.输出 x,y
分析,两数比较,要么 x>y,直接输出 ;要么 x<y,两数交换。
程序,
main( )
{ int x,y,t;
printf("\n请输入两个整数 %%d%%d:");
scanf("%d%d",&x,&y );
if ( x < y )
{ t=x; x=y; y=t;
}
printf(" \nx=%d,y=%d\n",x,y );
}
2,if语句的嵌套例 2,if ( a>0 )
if ( b>0 ) printf("%d,%d\n",a,b);
else printf("%d\n",a);
else
if ( b>0 ) printf("%d\n",b);
else printf("\n");
在 if语句中又包含有一个或多个 if语句称为 if语句的嵌套 。
例 1,if ( a>0 )
if ( b>0 )
printf("%d,%d\n",a,b);
如果 a,b
都是正数,则输出 a,b
输出 a,b
中的正数
为避免错误可用 { }将内嵌结构括起来以确定 if与 else
的配对关系属内嵌范围。
说明,
嵌套不允许交叉。
else与 if必须成对出现,且 else总是与最近的一个未配对的 if配对。
例,读程序。
main( )
{ int a=2,b=1,c=2;
if (a)
if ( b<0 ) c=0;
else c++ ;
printf("%d\n",c);
}
main( )
{ int a=2,b=1,c=2;
if (a)
{ if (b<0) c=0; }
else c++ ;
printf("%d\n",c);
}
程序运行结果:
3
程序运行结果:
2
例,任意输入三个整数,找出其中最大的整数。
a>=c
max=c max=b max=c
Y b>=cY
max=a
a>=b
NN
Y N
程序,
main( )
{ int a,b,c,max ;
printf (”请输入三个整数,%%d%%d%%d\n”);
scanf( "%d%d%d",&a,&b,&c );
if ( a>=b )
if ( a>=c ) max=a;
else max=c;
else
if ( b>=c ) max=b;
else max=c;
printf (”\n最大数为,%d\n”,max );
}
break语句格式:
break;
功能:
强迫终止程序的执行,即提前退出程序的执行。
用法:
只能用在 switch语句和循环体中。
四,switch语句
switch语句格式:
switch( 表达式 )
{ case <常量表达式 1>,语句 1; [break; ]
case <常量表达式 2>,语句 2; [break; ]
……
case <常用表达式 n-1>,语句 n-1; [break; ]
default,语句 n ; [ break; ]
}
switch语句执行过程:
执行:
若表达式 == 常量表达式,
则执行语句;
若表达式 ! = 常量表达式,
则执行 default开始的 ( 语句 ) ;
若程序中无 default开始的语句,
则程序语句 switch相当于一个空程序 ( 语句 ) 。
计算表达式的值。
判断,表达式的值与常量表达式的值是否相等。
注意:
注意 break语句的正确使用 。
表达式及常数表达式(由常数、符号常量组成的表达式)必须为整型,故它们也可用字符表达式。
case后的常数表达式的值不允许相同。
例,输入一个 0~ 2的数 。
main( )
{ int x;
printf( "请输入一个 0—2的整数," ) ;
scanf( "%d",&x) ;
switch ( x )
{ case 0,printf("输入 0。 \n");
case 1,printf("输入 1。 \n");
case 2,printf("输入 2。 \n");
default,printf("输入错误 !\n" );
}
}
程序运行结果:
请输入一个 0—2的整数,1 ↙
输入 1。
输入 2。
输入错误 !
例,编程计算 y 的值 。
)2l o g (
)1l n (
1)(2
53
0
2
2
xx
x
xS i n
x
y
)54(
)43(
)32(
)21(
)10(





x
x
x
x
x
#include "math.h"
main ( )
{ float x,y ; int m ;
printf( "请输入 0~5 之间的数 %%f\n" );
scanf( "%f",&x ) ;
m = floor( x );
switch ( m )
{ case 0,y = 0; break;
case 1,y = 3*x+5; break;
case 2,y = 2*sin( x )-1; break;
case 3,y = log( 1+x*x ); break;
case 4,y = log10( x*x-2*x )+5 ; break;
default,printf ("数据输入错误 ! \n" );
}
printf("y = %.2f\n",y );
}
例,任意输入两个数,和一个运算符
(加、减、乘、除),要求输出它们的运算结果。
#include "stdio.h"
main ( )
{ float shu1,shu2,jieg;
char yunsf;
printf(”请输入运算符 + - * /,\n”);
yunsf = getchar ( );
printf(”请输入两个数 %%f%%f\n”);
scanf("%f%f",&shu1,&shu2 );
switch ( yunsf )
{ case '+',jieg = shu1 + shu2 ; break;
case '-',jieg = shu1 - shu2 ; break;
case '*',jieg = shu1 * shu2 ; break;
case '/',jieg = shu1 / shu2 ; break;
default,printf( " 运算符输入错误 !\n" );
}
printf("jieg = %.2f \n",jieg );
}
五、条件运算符说明:
左图为条件表达式的流程图。
各表达式的类型可不同。
表达式 1
表达式 2 表达式 3
真 假条件运算符 (?,)
三目运算符,运算优先级为 13,右结合性。
条件表达式,由条件运算符构成的表达式。
形式,< 表达式 1 >? < 表达式 2 >∶< 表达式 3 >
例,读下列程序,写出运行结果。
main ( )
{ int a=1,b=1,c=1;
a += b; b += c; c += a;
printf("(1)%d\n",a>b?a:b );
printf("(2)%d\n",a>c?a--:c++);
(a>=b>=c)? printf("a\n"):printf("b\n");
printf("(4)%d,%d,%d\n",a,b,c );
}
程序运行结果:
(1)2
(2)3
b
(4)2,2,4