配色: 字号:
第4章 选择结构
2016-06-21 | 阅:  转:  |  分享 
  
/47例4-7:假设用0、1、2......6分别表示星期日、星期一......星期六。现输入一个数字,输出对应的星期几的英文单词。如果
输入3,输出“Wednesday”。#include"stdio.h"voidmain(){intn;sc
anf("%d",&n);switch(n){ case0:printf("Sunday\n");
case1:printf("Monday\n"); case2:printf("Tuesday\n");
case3:printf("Wednesday\n"); case4:printf("Thursday\n"); ca
se5:printf("Friday\n"); case6:printf("Saturday\n"); default
:printf("Error");}}程序运行情况如下:3↙WednesdayThursdayFriday
Saturdayerror/47说明:E1,E2,…En是常量表达式,且值必须互不相同语句标号作用,必须用break
跳出case后可包含多个可执行语句,且不必加{}switch可嵌套多个case可共用一组执行语句如:……
case‘A’:case‘B’:case‘C’:
printf(“score>60\n”);
break;……../47在“switch”语句中,“case常量表达式”只相当于一个语句标号,表达式
的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个switch语句,因此会继续执行所有后面语句的情况。
为此,C语言提供了一种break语句,其功能是可以跳出它所在的switch语句。/47将上面的例4-7修改如下:#inc
lude"stdio.h"voidmain(){intn;scanf("%d",&n);switc
h(n){ case0:printf("Sunday\n");break; case1:printf("Mo
nday\n");break; case2:printf("Tuesday\n");break; case3:pr
intf("Wednesday\n");break; case4:printf("Thursday\n");break;
case5:printf("Friday\n");break; case6:printf("Saturday\n"
);break; default:printf("Error");}}程序运行情况如下:3↙Wednesda
y/47说明多个case语句可以共用一组执行语句。switch(grade){case''A'':case
''B'':case''C'':printf("grade>=60\n");break;default:printf(
"grade<60");}各case和default子句的先后顺序可以变动,而不会影响程序执行结果。/47defaul
t语句可以省略不用。case和default与其后面的常量表达式间至少有一个空格。switch语句可以嵌套,break语句只跳
出它所在的switch语句。/47例voidmain(){intx=1,y=0,a=0,b=
0;switch(x){case1:
switch(y){case0:a++;break
;case1:b++;break;
}case2:a++;b++;break;
case3:a++;b++;}printf(“\na
=%d,b=%d”,a,b);}运行结果:a=2,b=1/47#includema
in(){intc;printf("Entermornorhorother:");
c=getchar();switch(c){case''m'':printf("\nGoodmorn
ing!\n");break;case''n'':printf("\nGoodnight!\n");b
reak;case''h'':printf("\nHello!\n");break;
default:printf("\n????????\n");break;}}例根据
输入字母输出字符串/47例4-8企业发放的奖金根据利润提成。从键盘输入当月利润,求应发放奖金总数?/47利润x
x<=1010,11,22,3,44,5,66,7,8,9,1010以上用这种方法转换后,n出现了在不同区域有重复数字的情况。解决的
方法有很多,其中一种是可以采用当x为10的整数倍时,将计算出的n值减1。使用switch解题的关键,通过分析找到表达式,将问题
分成几种情况。/47#include"stdio.h"voidmain(){floatx,y;intn;
scanf("%f",&x);n=(int)x/10;if((int)x%10==0)n--;switch
(n){case0:y=x0.1;break;case1:y=x0.12;break;case
2:case3:y=x0.14;break;case4:case5:y=x0.16;break;c
ase6:case7:case8:case9:y=x0.18;break;default:y=x0.2;
}printf("y=%.2f\n",y);}程序如下:/474.5选择结构程序设计举例例4-9
将任意三个整数按从大到小的顺序输出。#include"stdio.h"voidmain(){ intx,y,z,
t; scanf("%d,%d,%d",&x,&y,&z); if(x/交换x,y的值/ if(x{t=y;y=z;z=t;}/交换y,z的值/ printf("%d,%d,%d\n",x,y,z);
}/47例4-9给一个不多于4位的正整数,求出它是几位数,逆序打印出各位数字。#include"stdio.h"
voidmain(){ intx,a,b,c,d;/a,b,c,d代表千位、百位、十位、个位/ scanf
("%d",&x); a=x/1000; b=x%1000/100; c=x%100/10; d=x%10;
/分解出千位、百位、十位、个位/ if(a!=0)printf("4:%d%d%d%d\n",d,c,
b,a); elseif(b!=0)printf("3:%d%d%d\n",d,c,b); elsei
f(c!=0)printf("2:%d%d\n",d,c); elseif(d!=0)pr
intf("1:%d\n",d);}/47例4-10任意输入三个数,判断能否构成三角形?若能构成三角形,是等边三角形、等
腰三角形还是其它三角形?#include"stdio.h"voidmain(){ floata,b,c; scan
f("%f,%f,%f",&a,&b,&c); if(a+b>c&&a+c>b&&b+c>a) { if(a==b&&b
==c) printf("equalateraltriangle.\n"); els
eif(a==b||a==c||b==c)p
rintf("isoscelestriangle.\n"); elseprintf
("othertriangle.\n");}elseprintf("ca
nnot\n");}/47例4-11从键盘输入一个年份,判断是否是闰年。#include"stdio.h"voi
dmain(){intyear;scanf("%d",&year);if(
year%400==0||(year%4==0&&year%100!=0))printf("%disal
eapyear\n",year);elseprintf("%disnotaleapyear\n",year
);}例4.12输入一个由两个数据和一个算术运算符组成的表达式,根据运算符完成相应的运算,并将结果输出。voidm
ain(){inta,b;charc;scanf(″%d%c%d″,&a,&c,&b);
switch(c){case’+’:printf(″a+b=%d″,a+b);brea
k; case’-’:printf(″a-b=%d″,a-b);break; case’’:printf(
″ab=%d″,ab);break;case’/′:{if(b!=0)printf(″a/b
=%d″,a/b);elseprintf(″b=0″);}break
;case’%’:{if(b!=0)printf(″amodb=%d″,a%d);
elseprintf(″b=0″);}break; default:printf
(“Dataoutofrange”); }}/47第4章选择结构4.3if语句4.4swit
ch语句4.5结构嵌套程序设计举例4.1关系运算符与关系表达式4.2逻辑运算符与逻辑表达式/474.1关系运
算符和关系表达式1、关系运算符种类:<<===>=>!=结合方向:自左向右优先级别:例
c>a+b//c>(a+b)a>b!=c//(a>b)!=ca==bc//a=(b>c)关系表达式的值:是逻辑值“真”或“假”,用1和0表示例inta
=3,b=2,c=1,d,f;floatx=2.5,y=3.5a>b(a>b)==c
b+cbf=a>b>ca=b=ca=b=c=2
b++==caizeof(int)a+b,18+(b=4)3,(a/b,a%b)++a-c+++b
++a-c+b++a+=a-=a=a(loat)(a+c)/2+(int)x%(int)y
a%=(b%=3)//表达式值1//表达式值1//表达式值0//d=1//f=0<<=>>===
!=优先级6(高)优先级7(低)/47例若a=0;b=0.5;x=0.3;则a<=x<=b的
值为例5>2>7>8在C中是允许的,值为0例‘a’>0结果为
‘A’>100结果为100例inti=1,j=7,a;a=i+(j%4!=
0);则a=2例应避免对实数作相等或不等的判断如1.0/3.03.0==1.0
结果为可改写为:fabs(1.0/3.03.0-1.0)<1e-60例注意区分“=”与“==”
inta=0,b=1;if(a=b)printf(“ae
qualtob”);elseprintf(“anotequal
tob”);/474.2逻辑运算符和逻辑表达式逻辑运算符种类:!&&||逻辑运算真值表a
b!a!ba&&ba||b真假真假假假真真C语言中,运算量:0表示“假”,
非0表示“真”,运算结果:0表示“假”,
1表示“真”,真假假假假假真真假假真真真假真真/47优先级:结合方向:!
:从右向左&&:从左向右||:从左向右例a<=x&&x<=ba>b&&x>
ya==b||x==y!a||a>b//(a<=x)&&(x<=b)/
/(a>b)&&(x>y)//(a==b)||(x==y)//(!a)||(a>b)!(2)&&(11
)||(12)高低例a=4;b=5;!aa&&ba||b!
a||b4&&0||25>3&&2||8<4-!0‘c’&&‘d’//值为1//值为0/
/值为1//值为1//值为1//值为1//(5>3)&&2||(8<(4-(!0)))值为1/47例4-1:
inta=5;floatb=3.5;!a0!b0a&&b1a||b1!a&&!b0例a<=x
&&x<=ba>b&&x>ya==b||x==y!a||a>b//
(a<=x)&&(x<=b)//(a>b)&&(x>y)//(a==b)||(x==y)//(!a)||(a>b)
例a=4;b=5;!aa&&ba||b!a||b4&&0||2
5>3&&2||8<4-!0‘c’&&‘d’/47注意例a&&b&&c//只在a为
真时,才判别b的值;只在a、b都为真时,才判别c的值例
a||b||c//只在a为假时,才判别b的值;
只在a、b都为假时,才判别c的值例a=1;b=2;c=3;d=4;m=1;n=1;(m=a>b
)&&(n=c>d)//结果m=0,n=1短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑
运算符才能求出表达式的解时,才执行该运算符例4-2:a=0;b=1;c=2;d=a++&&b++&&--c;d=(a
++)&&(b++)&&(--c);运算结果:d=0,a=1,b=1,c=2例4-3:a=0;b=1;c=2;
d=a++||b++||--c;d=(a++)||(b++)||(--c);运算结果:d=1,a=1,b
=2,c=2/47问题提出:计算分段函数:y=3-xx≤02/xx>0解题的步骤:输入xx
≤0是y=3-xy=2/x否输出y的值C语言用来设计条件选择结构程序的选择语句有两种:if语句、switch
语句。/474.3if语句if语句(条件选择语句)if语句的三种形式形式一:格式:if(expression)
statement执行过程:exprstatement非0=0exprstatement1
statement2非0=0形式二:格式:if(expression)s
tatement1elsestat
ement2执行过程:例:if(x>y)max=x;elsemax=y;例:if
(x>y)printf(“%d”,x);/47例4-4:从键盘输
入两个整数a和b,如果a大于b则交换两数,最后输出两个数。#include输入a,ba>b交换a、b
输出结束真假voidmain(){inta,b,t;scanf("%d,%d",&a,&b);
if(a>b){t=a;a=b;b=t;}printf("a=%d,b=%d\n",a,b);}/47注
意:(1)if语句自动结合一个语句,当满足条件需要执行多个语句时,应用一对大括号{}将需要执行的多个语句括起,形成一个复合语句
。(2)if语句中表达式形式很灵活,可以是常量、变量、任何类型表达式、函数、指针等。只要表达式的值为非零值,条件就为真,反之条
件为假。/47例4-5输入两个整数,输出其中较大的数。#include#includeath.h>voidmain(){intx,y,max;scanf("%d,%d",&x,&y);if(x
>y)max=x;elsemax=y;printf("max=%d\n",max);}输入x,yx>yma
x=x输出最大值结束真假max=y/47注意if和else语句之间只能有一个语句,当if~else之间的语句不只
一句时,应用一对{}将语句括起。if(a>b){a++;b++;}else{a=0;b=10;}/47形式三:
格式:if(expr1)statement1elseif(expr2)sta
tement2elseif(expr3)statement3…...[else
statementn]expr1statemnt1非0=0expr2expr3statemntnstatem
nt3statemnt2非0非0=0=0执行过程:例:if(salary>1000)in
dex=0.4;elseif(salary>800)index=0.3;
elseif(salary>600)index=0.2;
elseif(salary>400)index=0.1;
elseindex=0;/47例4-6:计算分段函数。假输入xX<=1真X<10y=3/(x-10)
y=2xy=x+5假真/47#includevoidmain(){floatx,y;
printf("enterx:");scanf("%f",&x);else{if(x<=1)y=x+
5;elseif(x<10)y=2x;
else y=3/(x-10); printf("x=%.2f,y=%.2f\n",x,y
);}计算分段函数程序if(x==10)printf("notdefinex.\n");
}/47例4-7输入10个字符,统计其中英文字母、空格或回车、数字和其他字符的个数。输入cc=英文
打印c=数字c=''''或c=''\n''111000停letter++digit++blank++other
++letter=digit=blank=other=0;i=1i<=10i++10/47#includedio.h>voidmain(){intblank,digit,i,letter,other;ch
arch;blank=digit=letter=other=0;printf("input10charac
ters:");for(i=1;i<=10;i++){ch=getchar();if(
(ch>=''a''&&ch<=''z'')||(ch>=''A''&&ch<=''Z''))letter++;el
seif(ch>=''0''&&ch<=''9'')digit++;elseif(
ch==''''||ch==''\n'')blank++;
elseother++;}printf("letter=%d,blank=%d,digit=%d,other=
%d\n",letter,blank,digit,other);}input10charact
ers:Reold123?letter=5,blank=1,digit=3,other=1程序中涉及:字符类型
字符输入输出逻辑运算符/47说明:if后面的表达式类型任意语句可以是复合语句if(x)?if(x!
=0)if(!x)?if(x==0)如:if(a==b&&x==y)printf(“a=b,x
=y”);if(3)printf(“OK”);if(‘a’)printf(“%d
”,’a’);例考虑下面程序的输出结果:#includemain(){
intx,y;scanf(“%d,%d”,&x,&y);if(x>y)
x=y;y=x;elsex++;y++;
printf(“%d,%d\n”,x,y);}CompileError!/47#includem
ain(){intx,y;printf("Enteraninteger:");scanf("%d
",&x);y=x;if(y<0)y=-y;printf("\ninteg
er:%d--->absolutevalue:%d\n",x,y);}例求一个数的绝对值运行:Enterani
nteger:-12?integer:-12--->absolutevalue:12/47#i
ncludemain(){inta,b;printf("Enterintegera:
");scanf("%d",&a);printf("Enterintegerb:");scanf
("%d",&b);if(a==b)printf("a==b\n");else
printf("a!=b\n");}例输入两个数并判断两数相等否运行:Enterintegera:12?
Enterintegerb:12?a==b运行:Enter
integera:12?Enterintegerb:9?a!=
b/47#includemain(){charc;printf
("Enteracharacter:");c=getchar();if(c<0x20)printf("
Thecharacterisacontrolcharacter\n");elseif(c>=''0''&&c<=
''9'')printf("Thecharacterisadigit\n");elseif(c>=''A''&&c
<=''Z'')printf("Thecharacterisacapitalletter\n");elsei
f(c>=''a''&&c<=''z'')printf("Thecharacterisalowerletter\n");
elseprintf("Thecharacterisothercharacter\n");}例判断输入字
符种类运行:Enteracharacter:?Thecharacterisacontro
lcharacter运行:Enteracharacter:8?Thecharacteris
adigit运行:Enteracharacter:D?Thecharacterisa
capitalletter运行:Enteracharacter:h?Thecharacte
risalowerletter运行:Enteracharacter:F1?Thecha
racterisothercharacter/47if语句嵌套:一般形式:if(expr1)st
atement1elseif(expr3)statement3
elsestatement4内嵌ifif(expr1)if(e
xpr2)statement1elses
tatement2内嵌ifif(expr1){if(expr2)sta
tement1}elsestatement3内嵌ifif(expr1)
if(expr2)statement1elsestatement2else
if(expr3)statement3elsestatement4
内嵌if内嵌if/47例输入两数并判断其大小关系#includemain(){intx
,y;printf("Enterintegerx,y:");scanf("%d,%d",&x,&y);
if(x!=y)if(x>y)printf("X>Y\n");elseprin
tf("Xrx,y:12,23?X?X>YEnterintegerx,y:12,12?
X==Y/47if~else配对原则:缺省{}时,else总是和它上面离它最近的未配对的if配对if(…
…)if(……)if(……)else…...else…...else….../47例:if(a==b)
if(b==c)printf(“a==b==c”);
elseprintf(“a!=b”);修改:if(a==b)
{if(b==c)printf(“a==b==c”)
;}elseprintf(“a!=b”
);实现if~else正确配对方法:加{}/47例考虑下面程序输出结果:main()
{intx=100,a=10,b=20;intv1=5,v2=0;if
(ax=1;else
if(v2)x=10;x=-1;printf(“%
d”,x);}结果:-1/47例判别p(x,y)点是否落在阴影部分分析1.p(x,y)落在矩
形之内2.去掉p(x,y)落在圆内解(-22)12-2-112-1-2yxxx+yy>=1&&main(){flo
atx,y;printf(“inputx,y”);scanf(“%f,%f”,&x,&y);
if((-2=1))printf(“
x,yisinp(x,y)”);elseprintf(“x,yisnotinp(x,y)”);}/47条件运算符与表达式一般形式:expr1?expr2:expr3执行过程功能:相当于条件语句,但不能取代一般if语句例求a+|b|printf(“a+|b|=%d\n”,b>0?a+b:a-b);expr1取expr2值取expr3值非0=0例if(a>b)printf(“%d”,a);elseprintf(“%d”,b);printf(“%d”,a>b?a:b);例(a==b)?’Y’:’N’(x%2==1)?1:0(x>=0)?x:-x(c>=‘a’&&c<=‘z’)?c-’a’+’A’:c条件运算符可嵌套如x>0?1:(x<0?-1:0)优先级:13结合方向:自右向左如a>b?a:c>d?c:d?a>b?a:(c>d?c:d)expr1、expr2、expr3类型可不同,表达式值取较高的类型例x?‘a’:‘b’//x=0,表达式值为‘b’;x?0,表达式值为‘a’x>y?1:1.5//x>y,值为1.0;x
献花(0)
+1
(本文系信检彭博海...首藏)