C语言40第 5章选择结构程序设计课堂教学 4学时上机操作2学时教学累计12学时上机累计 2学时
C语言40
选择结构是三种基本结构之一
作用是,根据所指定的条件是否满足,决定从给定的两组操作选择其一
实现程序分支如,if(x>0) y=1;
else y=-1;
C语言40
关系运算符和关系表达式关系运算符是逻辑运算中比较简单的一种关系运算 就是 比较运算
C语言40
如:设 a=5 a>3,a==2,a<1+3
真 假 假
关系运算符及其优先次序
1,<
2,<= 优先级相同(高)
3,>
4,>=
5,==
6,!= 优先级相同(低)
C语言40
优先次序,
算术运算符 高关系运算符赋值运算符 低例:
c>a+b 等效于 c>(a+b)
a>b==c 等效于 (a>b)==c
a==b<c 等效于 a==(b<c)
a=b>c 等效于 a=(b>c)
C语言40
关系表达式用关系运算符将两个表达式连接起来的式子,称关系表达式
下面是合法的关系表达式
a>b>c,a+b>b+c,(a=3)>(b=5),(a>b)>(b<c)
关系表达式的值是一个逻辑值
逻辑判断的结果:
以“0”代表“假”
以“1”代表“真”
C语言40
逻辑运算符和逻辑表达式用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式
C语言40
逻辑运算符及其优先次序
1,&& 逻辑与
2,|| 逻辑或
3,! 逻辑非 (单目 )
如,(a>b)&&(x>y)
a+b||b-c
!a<0&&b+!c
C语言40
例如:设 a=3,b=2,c=1
a>b 为“真”
d=a>b d的值是1
a>b==c 为“真”
d=a>b==c d的值是1
b+c<a 为“假”
d=b+c<a d的值是0
a>b>c 为“假”
f=a>b>c f的值是0
C语言40
课堂练习设 int a=2;char c=?a?;float f=3.0求表达式的值
a+2!=c-100 f/3<=a-c
a<=(f<=c) (a>c)>=(f>4)
!a==!f (!a&&1)!=(!c||1)
(a=2)<=(f=1) (c=?A?)!=(f=100.5)
(1,2)!=(2,1) (1,2,3)==(3,3,3)
C语言40? 答案
a+2!=c-100 f/3<=a-c 1、0
a<=(f<=c) (a>c)>=(f>4) 0、1
!a==!f (!a&&1)!=(!c||1) 1、1
(a=2)<=(f=1) (c=?A?)!=(f=100.5) 0、1
(1,2)!=(2,1) (1,2,3)==(3,3,3) 1、1
C语言40
逻辑运算规则:
1,a&&b 若 a,b均为真,则 a&&b为真
2,a||b 若 a,b之一为真,则 a||b为真
3,!a 若 a为假,则 !a为真
请思考,a,b如何表示真、假?
逻辑运算符的优先次序
! && ||
C语言40? 优先顺序

算术运算符关系运算符
&& 和 ||
赋值运算符例如,x=(a+b)&&(b<c)||!(d=1)
问:括号都能去掉吗?
高低
C语言40逻辑表达式
逻辑表达式的值是一个逻辑量“真”或
“假”
C规定,逻辑运算的结果:
以数值 1代表“真”
以数值 0代表“假”
逻辑运算时判断一个量是“真”是“假”:
以 0代表“假”
以非 0代表“真”
逻辑运算符两侧的运算对象可以是任何类型的数据
C语言40
例:设 a=3,b=4,c=5 求表达式的值
1,‘ c?&&?d?&&
2,!(a=3)&&(b=4)||b-a-1
3,a-3||b+c&&b-c
4,a<=c||a>c
机内逻辑运算执行原则
1,a&&b&&c
2,a||b||c
C语言40
讨论:
设 a=1,b=2,c=3,d=4,m=n=1 问,m=?n=?
(m=a>b)&&n=c>d)
逻辑表达式表达复杂条件判别是否闰年
year%4==0&&year%100!=0||year%400==0
C语言40if 语句
if语句也称条件语句,用于实现程序分支结构,根据判断条件是否满足决定执行给出的两种操作之一。
if语句的三种形式
1,if(表达式)语句例如:
if(x>y) printf(“%d”,x);
if(x>y&&x<10)printf(“%d”,x);
if(x) printf(“%d”,x); 等效于 if(x!=0)~
C语言40
表达式语句假 0
真非 0
表达式语句 1 语句 2
假真图 a
图 b
C语言40
2,if(表达式 ) 语句 1 else 语句 2
例如:
if(x>y)printf(“%d”,x);
else printf(“%d”,y);
3,if(表达式 1) 语句 1
else if(表达式 2) 语句 2
else if(表达式 3) 语句 3
……
else if(表达式 m) 语句 m
else 语句 n
C语言40
表达式 3
表达式 4
表达式 2
表达式1
语句5语句 4语句 3语句 2语句 1
假假假假真真真真图 c
C语言40
例如
if(number>500) cost=0.15;
elseif(number>300) cost=0.10;
elseif(number>100) cost=0.075;
elseif(number>50) cost=0.05;
else cost=0;
说明
1,表达式
2,分号;
3,{ }
C语言40? 例 5.1输入两个实数,按代数值从小到大的次序输出这两个实数
main( )
{float a,b,t;
scanf("%f,%f",&a,&b);
if(a>b)
{t=a;a=b;b=t;}
printf("%5.2f,%5.2f",a,b);}
运行时输入,3.6,-3.2
输出结果,-3.20,3.60
C语言40
例 5.2输入 3个数 a,b,c,要求按由小到大顺序输出
main( )
{float a,b,c,t;
scanf("%f,%f,%f",&a,&b,&c);
if(a>b)
{t=a;a=b;b=t;}
if(a>c)
{t=a;a=c;c=t;}
if(b>c)
{t=b;b=c;c=t;}
printf("%5.2f,%5.2f,%5.2f",a,b,c);}
y a>b n
a?b
y a>c n
a?c
y b>c n
b?c
C语言40
运行时输入,3,7,1
输出结果,1.00,3.00,7.00
if语句语句的嵌套在一个 if语句中又包含一个或多个 if语句称
if语句的嵌套
一般形式如下:
C语言40
if( )
if( ) 语句1
else 语句2
else
if( ) 语句 3
else 语句 4
内嵌 if
内嵌 if
C语言40
注意 if与 else的配对关系
else总是与它上面最近的没有 else的 if配对
if( )
if( ) 语句1
else
if( ) 语句2
else 语句3
if( )
{if( ) 语句1 } (实现内嵌 if)
else
内嵌 if
内嵌 if
C语言40? 例 5.3有一函数:
-1 (x<0)
y= 0 (x=0)
1 (x>0)
算法1,算法2:
输入 x 输入 x
若 x<0 y=-1 若 x<0 y=-1
若 x=0 y=0 否则若 x>0 y=1 若 x=0 y=0
输出 y 若 x>0 y=1
输出 y
C语言40
判断哪个是正确的程序一
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);}
C语言40
程序二
main( )
{int x,y;
scanf("%d",&x);
if(x>=0)
if(x>0) y=1;
else y=0;
else y=-1;
printf("x=%d,y=%d\n",x,y);}
C语言40
程序三
main( )
{int x,y;
scanf("%d",&x);
y=-1;
if(x!=0)
if(x>0 ) y=1;
else y=0;
printf("x=%d,y=%d\n",x,y);}
C语言40? 程序四
main( )
{int x,y;
scanf("%d",&x);
y=0;
if(x>=0)
if(x>0) y=1;
else y=-1;
printf("x=%d,y=%d\n",x,y);}
C语言40条件运算符
条件运算符要求3个操作对象(右结合)
一般格式:
表达式1? 表达式2:表达式3
说明:
1,条件运算符的执行顺序如,max=(a>b)? a,b
表达式1
取表达式2
的值取表达式3
的值假(0)真(非0)
C语言402,条件运算符的优先级,高于赋值运算符如,max=a>b? a,b
3,结合方向为“自右至左”
如,a=1,b=2,c=3,d=4
a<b? a,c>d? c,d
右结合,a<b? a,(c>d? c,d) 结果:1
左结合,(a<b? a,c)>d? c,d 结果:4
4,不能完全取代 if语句,但可灵活应用
if(a>b)printf(“%d”,a); printf(“%d”,a>b?a:b)
else printf(“%d”,b);
C语言405,表达式1的类型可以与表达式2
或表达式3的类型不同例 5.4 将大写字母转换成小写字母
main( )
{char ch;
scanf("%c",&ch);
ch=(ch>='A'&&ch<='Z')?(ch+32):ch;
printf("%c",ch);
} 运行结果,A
输出结果,a
C语言40switch语句
switch语句是多分支选择语句,又称开关语句,if语句只有两个分支可供选择,而实际问题中常常需要用到多分支的选择
如,成绩分类、人口统计分类、工资统计分类、银行存款分类 …
当然这些都可以用嵌套的 if语句来处理,但分支较多可读性下降
C语言40
一般形式:
switch(表达式 )
{ case 常量表达式1:语句1
case 常量表达式2:语句2

case 常量表达式 n:语句 n
default,语句 n+1
}
C语言40
例如,按照考试成绩的等级打印出百分制分数段
main( )
{char grade;
scanf(“%c”,&grade); 运行时输入,A
switch(grade) 结果,85~100
{case?A?:printf(“85~100\n”); 70~84
case?B?:printf(“70~84\n”); 60~69
case?C?:printf(“60~69\n”); <60
case?D?:printf(“<60\n”); error
default,printf(“error\n”);}}
C语言40
break不可少
main( )
{char grade;
scanf(“%c”,&grade);
switch(grade)
{case?A?:printf(“85~100\n”);break;
case?B?:printf(“70~84\n”); break;
case?C?:printf(“60~69\n”); break;
case?D?:printf(“<60\n”); break;
default,printf(“error\n”);}}
C语言40
说明
1,每个常量表达式的值必须互不相同
2,用 break语句进行分割
3,case和 default出现的次序不影响运行结果
程序举例例 5.5判断某一年是否闰年真 y被 4整除 假真 y被 100整除 假真 y被 400 假
l=1 l=0
真 l=1 假输出“闰年” 输出“非闰年”
l=0
l=1
C语言40
main()
1,{int year,leap;
2,scanf("%d",&year);
3,if(year%4==0)
4,{if(year%100==0)
5,{if(year%400==0) 运行时输入,2000
6,leap=1; 运行结果,2000 is a leap year.
7,else leap=0;}
8,else leap=1;}
9,else leap=0;
10,if(leap) printf("%d is ",year);
11,else printf("%d is not ",year);
12,printf("a leap year.\n");}
C语言40课堂练习读程序写出运行结果:
main( )
{int a=2,b=-1,c=2;
if(a<b) /* a>b */
if(b<0) c++; /* b>0 */
else c+=3;
printf(“c=%d\n”,c); }
C语言40
运行结果
c=5
若改 if(a>b) 结果为,c=3
若改 if(b>0) 结果为,c=5
若改 if(a>b)
if(b>0) 结果为,c=2
C语言40课堂练习读程序写出运行结果:
main( )
{int year;
scanf(“%d”,&year);
if((year%4!=0)||(year%100==0 && year%400!=0))
printf(“123”);
else
printf(“456”);
} 运行时输入,2000
C语言40
运行结果
456
C语言40? 例 5.7运输公司对用户计算运费.路程 s越远,
每公里运费越低标准如下:
s< 250km 没有折扣
250≤s< 500 2%折扣
500≤s< 1000 5%折扣
1000≤s< 2000 8%折扣
2000≤s< 3000 10%折扣
3000≤s 15%折扣总运费的计算公式,f=p× w× s× (1-d)
其中:基本运费 p,货物重量 w,距离 s,折扣 d
C语言40
折扣
d(%
)
250 15001000500 2000 2500 30000
2
4
6
8
10
14
16
12
2 1210 4 6 8 10 c
s
C语言40
main( )
{int c,s;
float p,w,d,f;
scanf("%f,%f,%d",&p,&w.&s);
if(s>=3000)c=12;
else c=s/250;
switch(c)
{case 0:d=0;break; 运行时输入,100,20,300
case 1:d=2;break; 运行结果,freight=588000.0000
case 2:
case 3:d=5;break;
case 4:
case 5:
case 6:
case 7:d=8;break;
case 8:
case 9:
case 10:
case 11:d=10;break;
case 12:d=15;break;}
f=p*w*s*(1-d/100.0);
printf("freight=%15.4f",f);}
C语言40
main( )
{int c,s;
float p,w,d,f;
scanf("%f,%f,%d",&p,&w.&s);
if(s>=3000)c=12;
else c=s/250;
switch(c)
{case 0:d=0;break; 运行时输入,100,20,300
case 1:d=2;break; 运行结果,freight=588000.000000
case 2,case 3:d=5;break;
case 4:case 5:case 6:
case 7:d=8;break;
case 8:case 9:case 10:
case 11:d=10;break;
case 12:d=15;break;}
f=p*w*s*(1-d/100.0);
printf("freight=%15.4f",f);}
C语言40习题讲解
给一个不多于 5位的正整数,要求,① 求出它是几位数 ;② 分别打印出每一位数字 ;③ 按逆序
#include "stdio.h"
main( )
{long int num;
int ge,shi,bai,qian,wan,place;
printf("enter a number(0~9999:)");
scanf("%ld",&num);
if(num>9999)
place=5;
else if(num>999)
place=4;
else if(num>99)
place=3;
else if(num>9)
place=2;
else place=1;
C语言40printf("place=%d\n",place);
printf(“每位数字为,");
wan=num/10000;
qian=(num-wan*10000)/1000;
bai=(num-wan*10000-qian*1000)/100;
shi=(num-wan*10000-qian*1000-bai*100)/10;
ge=num%10;
switch(place)
{case 5:printf("%d,%d,%d,%d,%d\n",wan,qian,bai,shi,ge);
printf("fan xu,%d,%d,%d,%d,%d\n",ge,shi,bai,qian,wan);break;
case 4:printf("%d,%d,%d,%d\n",qian,bai,shi,ge);
printf("fan xu:%d,%d,%d,%d\n",ge,shi,bai,qian);break;
case 3:printf("%b,%b,%b\n",bai,shi,ge);
printf(“fan xu:%d,%d,%d\n”,ge,shi,bai);break;
case 2:printf("%b,%b\n",shi,ge);
printf(“fan xu:%d,%d\n”,ge,shi);break;
case 1:printf("%b\n",ge);
printf(“fan xu:%d\n”,ge);break;}
}
C语言40上机题目
第一次上机 2学时
编写程序上机调试、运行
习题,p105
① 5.5 ② 5.6 ③ 5.7 ④ 5.8