/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
|
|