第 5 章 选择结构程序设计

32
第 5 第 第第第第第第第第 §5.1 第第第第第第第第第第第 §5.2 第第第第第第第第第第第 §5.3 if 第第 §5.4 switch 第第 §5.5 第第第第

description

第 5 章 选择结构程序设计. §5.1 关系运算符和关系表达式 §5.2 逻辑运算符和逻辑表达式 §5.3 if 语句 §5.4 switch 语句 § 5.5 程序举例. §5.1 关系运算符 和 关系表达式. 关系运算实际上是比较运算 , 两个值进行比较 , 判断比较的结果是否符合给定的条件 , 如果符合比较的结果为 真 , 否则结果为 假 。 - PowerPoint PPT Presentation

Transcript of 第 5 章 选择结构程序设计

Page 1: 第 5 章 选择结构程序设计

第 5 章 选择结构程序设计

§5.1 关系运算符和关系表达式§5.2 逻辑运算符和逻辑表达式§5.3 if 语句§5.4 switch 语句§5.5 程序举例

Page 2: 第 5 章 选择结构程序设计

§5.1 关系运算符和关系表达式• 关系运算实际上是比较运算 , 两个值进行

比较 , 判断比较的结果是否符合给定的条件 , 如果符合比较的结果为真 , 否则结果为假。

• 用 将两个表达式 ( 可以是算术表达式、关系表达式、逻辑表达式、赋值表达式、字符表达式)连接起来的式子叫 。

• 关系运算符与其它运算符的 。

关系运算符

关系表达式

优先次序

Page 3: 第 5 章 选择结构程序设计

§5.2 逻辑运算符和逻辑表达式• 用 将关系表达式或逻辑量连接

起来就是 。• 逻辑运算符与其它运算符的 。• 在逻辑表达式的求解中 , 并不是所有的逻

辑运算都被执行 .

• 逻辑运算规律 :

优先次序

逻辑运算符逻辑表达式

例如

Page 4: 第 5 章 选择结构程序设计

§5.3 if 语句• if 语句是用来判定所给定的条件是否满足 , 根据判

定的结果 ( 真或假 ) 决定执行给出的两种操作之一 .• if 语句的三种形式 :

① if ( 表达式 ) 语句② if ( 表达式 ) 语句 1 else 语句 2

③ if ( 表达式 1) 语句 1

     else if ( 表达式 2) 语句 2

     else if ( 表达式 3) 语句 3

  ...   ...     else if ( 表达式 n) 语句 n else 语句 n+1

例如例如

例如

Page 5: 第 5 章 选择结构程序设计

if 语句的嵌套• if ( )

if ( ) 语句 1 else 语句 2else if ( ) 语句 3 else 语句 4

• if ( ) if ( ) 语句 1else if ( ) 语句 2 else 语句 3

内嵌 if

内嵌 if

内嵌 if

if ( ) { if ( ) 语句 1 } else { if ( ) 语句 2 else 语句 3 }

Page 6: 第 5 章 选择结构程序设计

-1 (x<0) 例如 y= 0 (x=0) 1 (x>0)

1. main (   ){int x, y; scanf(“%d” ,&x) ;if (x<0) y= - 1;else if (x= =0) y=0; else y=1;printf(“x=%d ,y=%d\n”,x ,y);}

2.if (x>=0) if (x>0) y=1; else y=0; else y= -1;

x>=0

y= -1

x>0

y=1 y=0

x<0

Y=-1

X= =0

Y=0 Y=1真

真 假

真假

{

Page 7: 第 5 章 选择结构程序设计

3 . y= - 1;

if (x!=0)if (x>0) y=1;

else y=0;

真假

x>0

y=1

y= 0

x>=0

y=- 1

4. y=0; if (x>=0) if (x>0) y=1; else y= - 1;

真 假

x>0

y=1

y= -1

X!=0

y=0真

真假

x>0

y=1

y= -1

x!=0

y=0

y=- 1

真 假

x>0

y=1

y= 0

x>=0

Page 8: 第 5 章 选择结构程序设计

5.3.3 条件运算符 ? :? :

表达式 1 ? 表达式 2 : 表达式 3条件表达式 max= (a>b)? a:b 相当于 if (a>b) max=a; else max=b;

说明 :• 条件运算符的执行顺序• 条件运算符的优先级别 , 仅高于赋值运算• 条件运算符的结合方向为右结合性• 条件表达式不能取代 if 语句• 条件表达式中的表达式类型可以不同

Page 9: 第 5 章 选择结构程序设计

§5.4 switch 语句

• switch 语句是多分支选择语句switch (grade){case ‘A’ : printf (“ 85~100\n” ); case ‘B’ : printf (“ 70~84\n” ); case ‘C’ : printf (“ 60~79\n” ); case ‘D’ : printf (“ <60\n” ); default : printf (“ error\n” );}

表达式常量表达式

执行语句

Page 10: 第 5 章 选择结构程序设计

改为

• switch (grade){case ‘A’ : printf (“ 85~100\n” ) ;break; case ‘B’ : printf (“ 70~84\n” ); break; case ‘C’ : printf (“ 60~79\n” ); break; case ‘D’ : printf (“ <60\n” ); break; default : printf (“ error\n” );}

Page 11: 第 5 章 选择结构程序设计

§5.5 程序举例 例 5.5main() { int year, leap; scanf(“%d”, &year);

if (year%4= =0)

{ if (year%100= =0)

{ if (year%400= =0)

leap=1;

else leap=0;}

else

leap=1;}

else

leap=0;

if (leap)

printf (“%d is ”,year);

else

printf (“%d is not ”,year);

printf (“a leap year.\n”);

}

Year 被 4 整除Y N

Year 被 100 整除Y N

Y NYear 被

400 整除

leap=1 leap=0leap=1

leap=0

leapY N

输出闰年 输出非闰年

Page 12: 第 5 章 选择结构程序设计

例 5.7 计算运费。S<250km 没有折扣250<=s<500 2% 折扣500<=s<1000 5% 折扣1000<=s<2000 8% 折扣2000<=s<3000 10% 折扣3000<=s 15% 折扣p(price),w(weight),s(distance),d(discount)

f=p*w*s*(1-d)

250 1000 2000 3000

C=s/250c<1 无折扣1<c<2 2%2<c<4 5%4<c<8 8%

8<c<12 10%c>12 15%

Page 13: 第 5 章 选择结构程序设计

例 5.7• main( )• {int c , s ; float p , w , t , f ; scanf (“ %f , %f%d”,&p,

&w,&s );• if (s> =3000) c = 12 ; else c = s /250 ;

switch ( c ){csae 0 : d = 0 ; break ;csae 1 : d = 2 ; break ;csae 2 : csae 3 : d = 5 ; break ;csae 4 : csae 5 : csae 6 : csae 7 : d = 8 ; break ;csae 8 : csae 9 : csae 10 : csae 11 : d = 10 ; break ;csae 12 : d = 15 ; break ; }f = p*w*s* ( 1- d/100.0 ); printf (“ freight=%15.4f” ,f ); }

Page 14: 第 5 章 选择结构程序设计

x1=x2=

b2-4ac=0

a=0Y N

输出“ 非二次

方程

输出两相

等实根-b/2a

b2-4ac>0Y N

实部 p=

虚部 q=

输出两个实根输出两个复根

p+qip-qi

NYY

例 5.6 解一元二次方程

Page 15: 第 5 章 选择结构程序设计

#include <math.h>

main()

{ float a,b,c,d,disc,x1,x2,realpart,imagpart;

scanf(“%f,%f,%f”,&a,&b,&c);

printf(“The equation”);

if(fabs(a)<=1e-6) printf (“is not a quadratic”);

else

{disc=b*b-4*a*c;

if (fabs(disc)<=1e-6)

printf(“has two equal roots: %8.4\n”,-b/(2*a));

else if (disc>1e -6)

{ x1=(-b+sqrt(disc))/(2*a);

x2=(-b-sqrt(disc))/(2*a);

printf (“has distinct real roots: %8.4f and %8.4f\n”,x1,x2);}

else

Page 16: 第 5 章 选择结构程序设计

{realpart=-b/(2*a);

imagpart=sqrt(-disc)/(2*a);

printf (“has complex roots:\n”);

printf (%8.4f+%8.4fi\n”,realpart,imagpart);

printf (%8.4f+%8.4fi\n”,realpart,imagpart);

}

}

}

Page 17: 第 5 章 选择结构程序设计

第第 55 章结束章结束

Page 18: 第 5 章 选择结构程序设计

• C 语言提供六种关系运算符 ① < 小于 ② <= 小于等于 ③ > 大于 ④ >= 大于等于 ⑤ == 等于 ⑥ != 不等于

双目运算 , 左结合性 . 如 :

a>b , (a+b)>(b+c) ,( a=3 ) >(b=5) ,( a>b ) >c

a>b>c ,

Page 19: 第 5 章 选择结构程序设计

赋值表达式 :

x=a>b

y=a>b>c

关系表达式的值是一个逻辑值,即真或假。运算时以 1代表真,以 0代表假。

的值为真 , 表达式的值为 1

的值为真,表达式的值为 1,

的值为假 , 表达式的值为 0,

例如:若 a=3 , b=2 , c=1 ,则

a>b

(a>b)= =c

b+c<a

Page 20: 第 5 章 选择结构程序设计

优先次序 :

1. 前四种的优先级相同 , 后两种的优先级相同 ,且前高后低 .

2. 关系运算符低于算术运算符 .

3. 关系运算符高于赋值运算符 .

如 :c>a+b 算术运算符 高 a>b!=c

a= =b<c 关系运算符 a=b>c

赋值运算符 低

Page 21: 第 5 章 选择结构程序设计

• 逻辑运算符:&& 逻辑与 ¦ ¦ 逻辑或 ! 逻辑非①&& 和 ¦ ¦ 是双目运算符 ,! 是单目运算符 .

如 :(a>b) && (x>y) (a>b) ¦ ¦ (x>y)

!(a>b)

② 左结合性 .

Page 22: 第 5 章 选择结构程序设计

如 : !a&&b ¦ ¦ x>y&&c 等效((! a)&&b) ¦ ¦ ((x>y)&&c)

(a>b)&&(x>y) 等效 a>b&&x>y

(a= =b) ¦ ¦ (x= =y) 等效a= =b¦ ¦ x= =y

(!a) ¦ ¦ (a>b) 等效!a¦ ¦ a>b

!( 非 ) 高算术运算符关系运算符&&¦ ¦ 赋值运算符 低

优先次序如图所示 :

Page 23: 第 5 章 选择结构程序设计

逻辑表达式• 逻辑表达式的值应该是一个逻辑量“真”或

“假” , 以数值“ 1” 或“ 0” 表示 . 而在判断一个量是否为“真”时 , 以“ 0” 代表假 , 以非“ 0” 代表真 .

• 如 : 若 a= 4, 则 !a 等于 0

若 a=4,b=5, 则 a&&b 等于 1

若 a=0,b=5, 则 a ¦ ¦ b 等于 1

若 a=4,b=5, 则 !a ¦ ¦ b 等于 1

4&&0 ¦ ¦ 2, 等于 1

5>3&&2 ¦ ¦ 8<4- !0, 值等于 1

Page 24: 第 5 章 选择结构程序设计

• a&&b&&c 只有前一个量非 0 时 , 才需要判断下一个量 .

• a¦ ¦b ¦ ¦ c 只要前一个量为真 , 就不必判断下一个量 .

• a=1,b=2,c=3,d=4 m=1,n=1;

• (m=a>b)&&(n=c>d)

• n 的值不是 0, 仍为 1

• 满足下列一个条件即为闰年 :①能被 4 整除 , 不能被 100 整除②能被 4 整除 , 又能被 400 整除 .

(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)

Page 25: 第 5 章 选择结构程序设计

例如 :if (x>y) printf (“%d”,x);

这种 if 语句的执行过程见图 :

假 真

x>y

print(“%d”,x); 可以是一个语句也可以是复合语句

一般为逻辑表达式或关系表达式 .

理论上可以是任意数值

类型

If (a) printf(“Hello, world”);

Page 26: 第 5 章 选择结构程序设计

• 例如 :

if(x > y) printf(“%d”,x); else printf(“%d”,y);

x>y

printf(“%d”,x); printf(“%d”,y)

真 假

注 意 注意

Page 27: 第 5 章 选择结构程序设计

比较两个数, 输出三个数中最大的先大后小的输出例如 :

开始

输入两个数

a>b

t=a;a=b;b=t

输出 a,b

结束

开始

输入三个数

a>b

a>c

b>c

a=b

a=c

输出 a

结束

a=c假

Page 28: 第 5 章 选择结构程序设计

表达式 1

条件表达式取表达式 2 的值

条件表达式取表达式 3 的值

真 ( 非 0) 假 (0)

Page 29: 第 5 章 选择结构程序设计

高于赋值运算符。低于关系运算符和关系运算符

• max=(a>b)?a:b 可以写成max= a>b ?a:b

• 有 a>b?a:b+1 相当于 a>b?a:(b+1) 而不是 (a>b?a:b)+1

Page 30: 第 5 章 选择结构程序设计

• 有自右至左• a>b?a:c>d?c:d

相当于a>b?a:(c>d?c:d)而不是(a>b?a:c)>d?c:d若 a=1;b=2;c=3;d=4;求表达式的值

Page 31: 第 5 章 选择结构程序设计

不能替代如 :• if (a>=b) max=a; else min=b;• if (a>=b) max=a; else

printf(“ 变量 a 不是最大” );

可替代如 :

if (a>b) printf(“%d”,a); else printf(“%d”,b);

替代为 :printf(“%d”,a>b?a:b);

Page 32: 第 5 章 选择结构程序设计

x ?‘ a’ :‘ b’x>y ? 1 : 1.5

• 编程,输入一个字符,若是大写就转换成小写;若不是就不转换,输出字符。main (){char a ;scanf (“ %c” , &a );if ( a>=‘A’&&a<=‘Z’ ) a=a+32;printf(“%c”,a);}

a=(a>=‘A’&&a<=‘Z’)?a+32:a;