学习指导-单元3_选择结构程序设计.doc_第1页
学习指导-单元3_选择结构程序设计.doc_第2页
学习指导-单元3_选择结构程序设计.doc_第3页
学习指导-单元3_选择结构程序设计.doc_第4页
学习指导-单元3_选择结构程序设计.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单元3 选择结构程序设计一、知识要点通过本章的学习是学生掌握关系、逻辑运算符和表达式以及选择结构程序设计。具体内容如下:1关系运算符和关系表达式(1)关系运算符及其优先次序C语言提供6种关系运算符: (小于) 优先级相同(高) (大于)= (大于或等于)优先级相同(低)= = (等于)!= (不等于)关于优先次序:前4种关系运算符的优先级别相同,后两种也相同。前4种高于后两种;关系运算符的优先级低于算术运算符;关系运算符的优先级高于赋值运算符。(2)关系表达式由关系运算符连接而成的表达式(可以是算术表达式、关系表达式和其他表达式)称为关系表达式。2逻辑运算符和逻辑表达式(1)逻辑运算符及其优先次序C语言提供了三种逻辑运算符:& 逻辑与| 逻辑或! 逻辑非关于优先次序:!(逻辑非)算术运算符关系运算符&|赋值运算符(2)逻辑表达式逻辑表达式由逻辑运算符和运算对象组成,其中参与逻辑运算的对象可以是一个具体的值,还可以是C语言中任意合法的表达式,逻辑表达式的运算结果为1(真)或者为0(假)。3if语句(1)if(表达式)语句(2)if(表达式)语句1 else 语句2(3)if(表达式1)语句1else if(表达式2) 语句2 else if(表达式3) 语句3 else if(表达式m)语句m else 语句m+1注意:“语句”,“语句1”,“语句m”这些子句在语法上要求是一条语句,但需要执行多条语句时,需要用花括号把它们括起来组成复合语句。else不能独立成为一条语句,它仅是if语句的一部分,不能单独出现的程序中,且必须与if进行匹配共同组成ifelse语句。4条件运算符?:和条件表达式条件运算符是两个符号的组合: ? :条件表达式的一般形式为:表达式1 ? 表达式2 :表达式3条件表达式运算过程及表达式的值:先计算表达式1,若表达式1的值非0,则计算表达式2,不再计算表达式3,此时表达式2的值为整个条件表达式的值;若表达式1的值为0,不再计算表达式2,而计算表达式3,此时表达式3的值为整个条件表达式的值。利用条件运算可以表达具有二分支的实际问题。5switch语句switch(表达式) case 常量表达式1: case 常量表达式2: case 常量表达式n: 说明:switch是关键字,switch后面用花括号括起来的部分是switch语句体;switch后面括号内的“表达式”,可以是C语言中整型或字符型表达式,但是表达式两边的括号不能省;case也是关键字,与其后面的常量表达式合称case语句标号,常量表达式的类型必须与switch后面的表达式类型相匹配,且各case语句标号的值不能相同;default也是关键字,起标号的作用,代表除了以上所有case标号之外的那些标号,default语句可以出现在任何标号的位置上,也可以没有。case语句标号后的语句1、语句2等可以是一条语句,可以是若干条语句,也可以省略;break语句的作用:跳出switchcase语句。二、知识拓展1switch.case中default的书写位置default关键字也仅仅起到了标号的作用,与case作用一致,可以出现在switchcase语句的任何地方,不一定要在最后。但是,如果出现在case中间(某些case之前),当default后的语句组执行完毕后不需要执行其后面的case中的语句组时,需要在default语句组之后加上break。【示例】int a=3;switch(a)case 1:printf(#n);break;default:printf(n);case 2:printf(&n);break;在执行过程中,a的值为3,与case后的常量均不符合,于是执行default语句。输出,但是由于没有break,将继续执行printf(&n);break;,输出&。因此执行结果为:&如果只希望输出,则要把上述程序段改成int a=3;switch(a)case 1:printf(#n);break;default:printf(n);break;case 2:printf(&n);break;并且,case 2之后的break可以省略。2条件运算符的结合方向我们知道ifelse语句可以与条件表达式相互转换,比如【示例】求两个数的最大值代码:if(ab) max=a;else max=b;可以转换为max=ab?a:b;当出现如下数学表达式:我们先用if语句来进行表示:if(ab)max=a;else if(bc)max=b;elsemax=c;那它是否等价于max=ab?a:bc?b:c;呢?答案否。因为条件运算符?:是右结合,也就是说max=ab?a:bc?b:c相当于max=ab?a:( bc?b:c),显然于题述不符。三、常见问题1数学关系0x10的表示错误解析:在数学中,关系式0x10是可以使用的,表示x的值应在大于0且小于10的范围内,但在C语言中却不能用0x10这样一个关系表达式来表示上述的逻辑关系,即关系运算符不能连用,但可以借助逻辑运算符来辅助运算,正确的表示方法是0x&x10。2C语言中,表达式abc的值解析:由上题可知,abc不能表示数学中b介于a,c之间,那么,表达式abc是否是一个错误的C语言表达式呢?不然。表达式abc是一个关系表达式,根据关系运算符“”的结合方向,abc其实代表(ab)c。即先计算出ab的值,0或者1,在代入计算。【示例】当a=1,b=2,c=3时,ab为1(真),1c也为真,故表达式 abc值为1;当a=2,b=1,c=3时,ab值为0(假),0c,为真,abc的值也为1。3表达式中忽略了“=”与“= =”的区别解析:C语言中,“=”是赋值运算符,“=”是关系运算符。初学者往往把“=”用做关系运算符来判别相等。先看个示例:下面的程序()#include void fun()int x=0,y=0,z=0;if(x=y+z)printf(*);else printf(#);int main()fun();return 0;A有语法错误不能通过编译;B输出*C可以通过编译,但是不能通过链接,因而不能运行D输出#本题答案D。解决本题的关键在于if后面的表达式语句:x=y+z。y+z的值为0,x的值为0,“=”左右两边的值均为0,但是“=”为赋值运算符,即不管x之前的值如何,经过此表达式后,x的值变成0,即if后表达式为假,执行else之后的语句。如果,if语句改成if(x= =y+z)printf(*);else printf(#);则if后表达式为真,选择B。4if语句中多加了分号“;”解析:一个“;”代表一个语句。在if(表达式)之后若添加了;代表当表达式为真时,执行空语句。还是先看个例子,在上题的基础上稍加修改,在if(x=y+z)后加个“;”。即#include void fun()int x=0,y=0,z=0;if(x=y+z) ;printf(*);else printf(#);int main()fun();return 0;A有语法错误不能通过编译;B输出*C可以通过编译,但是不能通过链接,因而不能运行D输出#本题答案A。由于if之后多了个分号,系统认为if语句到此结束;因此,之后的else找不到与它匹配的if。因此,程序不能通过编译,错误的提示为: illegal else without matching if如果上述程序段改成#include void fun()int x=0,y=0,z=0;if(x=y+z) ;printf(*);printf(#);int main()fun();return 0;编译、链接全部通过,证明没有错误;但是输出*#。5case关键字后的表达式书写错误解析:case关键字后面的表达式只能是常量表达式,而且只能是整型或字符型常量,不能是其他常量。【示例】#include void fun()double a=1.2;switch(a)case 1.1:printf();break;case 1.2:printf(#);break;default:printf(*);int main()fun();return 0;不能通过编译,系统提示错误error C2450: switch expression of type double is illegalerror C2052: const double : illegal type for case expression即,switch括号后的表达式以及case标号后的表达式错误。另外,case标号后必须有空格,若没有,系统将不能识别出case关键字。【示例】#include void fun()int a=1;switch(a)case1:printf(#n);break;case2:printf(%n);break;default:printf(n);int main()fun();return 0;编译、链接都能通过,但输出,与预期不一致。错误原因就是case1,case2中间没有空格。四、同步训练(一)单项选择题1判断字符型变量c1是否为小写字母的正确表达式为( )。Aa=c1=A)&(c1=c1)|(z=a)&(c1y&ch=0|b=0)&(a0|b=0&b=0)&(a0&b0)&(a+b05能正确表示逻辑关系:“a=10或a=10 or a=0|a=10&a=10|a=06在C语言中,if语句后的一对圆括号中,用以决定分支流程的表达式( )。A只能用逻辑表达式B只能用逻辑表达式或关系表达式C只能用关系表达式D可用任意表达式7为避免嵌套的条件语句if-else的二义性,C语言规定:else与( )配对。A编排位置相同的ifB其之前最近的未配对的ifC其之后最近的ifD同一行上的if8下列运算符中优先级最低的是( )。A?:B&C+D!=9下列运算符中优先级最高的是( )。A! B&C+D!=10设a=1,b=2,c=3,d=4,则表达式ab?b:c3|80)|(+j0) k+;printf(%d,%d,%dn,i,j,k);A0,0,6B1,0,7C1,1,7D0,1,714有如下程序段float x=2.0,y;if(x0.0) y=0.0;else if(x7)if(b8)if(c9)x=2;else x=3;后x的值的是( )。A0B2 C1D.317以下程序段,运行后的输出结果是( )。char m=b;if(m+b) printf(%cn,m);else printf(%cn,m-);AaBbCcDd18有以下程序段int a=5,b=4,c=3,d=2;if(abc)printf(%dn,d);else if(c-1=d)=1)printf(%dn,d+1);else printf(%dn,d+2);执行后输出结果是( )。A2B3C4D编译有错,无结果19有如下程序段:int x=1,a=0,b=0;switch(x) case 0:b+;case 1:a+; case 2:a+;b+;printf(a=%d,b=%dn,a,b);该程序段的输出结果是( )。Aa=2,b=1Ba=1,b=1Ca=1,b=0Da=2,b=220以下程序段的输出结果是( )。int a=15,b=21,m=0;switch(a%3)case 0:m+;break;case 1:m+;switch(b%2)default:m+;case 0:m+;break;printf(%d,m);A1B2C3D4(二)填空题1 已知a=7.5,b=2,c=3.6,表达式,ab&ca|ab的值的是 。2 写出判断一个整型数a为奇数的表达式 。3有一个整345,取它的个位数的表达为 ,取十位数的表达式为 ,取百位数的表达式为 。4 能正确表示“当ch为小写字母为真,否则为假”的表达式是 。5 若x为int类型,请以最简单的形式写出与逻辑表达式!x等价的C语言关系表达式 。6 表示“整数x的绝对值大于5”时值为“真”的C语言表达式 。7 设x,y均为int型变量,请写出描述“x,y符号相同”的表达式 。8已知a=3,b=-4,c=5,表达式(a&b)=(a|c)的值是 。9若已知a=2,b=3,则表达式!a+b的值为 。10若有定义:int a=10,b=9,c=8;接着顺序执行下列语句后,变量b中的值为 。c=(a-=(b-5);c=(a%11)+(b=3);11设a,b,c为整型数,且a=2,b=3,c=4;则执行完语句a*=16+(b+)-(+c);后,a的值为 。12若有条件表达式(expression)?a+:b-,则完全等价于表达式(expression)的表达式是 。13以下程序段对输入的一个小写字母,将字母循环后移动5个位置后输出。如a变为f,w变成b。请在空中填入正确内容。char c;c=_;if(c=a&_) _;else if(c=v&cc,a+cb,b+ca。请填空。void fun(float a,float b,float c)if()printf(YESn);/*abc能构成三角形*/else printf(NOn);/*abc不能构成三角形*/17输入一个字符,如果它是一个大写字母,则把它变成小写字母;如果它是一个小写字母,则把它变成大写字母;其它字符不变。请在下划线上填入正确的内容。#include void fun(char ch)if(_) ch=ch+32;elseif(ch=a&ch=z) _;printf(%c,ch);18根据以下if语句写出与其功能相同的switch语句(x的值在0100之间,x为整数)。if语句:if(x60) m=1;else if(x70) m=2; else if(x80) m=3; else if(x90) m=4; else if(x100) m=5;switch语句:switch(_ ) _ m=1;break;case 6:m=2;break;case 7:m=3;break;case 8:m=4;break;_ m=5;19 表达式px或py或pz的C语言表达式 。20 表达式1=a50)printf(%d,a);if(a40)printf(%d,a);if(a30)printf(%d,a);2以下程序段输出的结果是( )。int a=5,b=4,c=3,d;d=(abc);printf(%d,d);3以下程序段输出的结果是( )。int x=10,y=20,t=0;if(x=y)t=x;x=y;y=t;printf(%d,%d,x,y);4若i=10;则执行下列程序后,变量i的正确结果为( )。switch(i)case 9:i+=1;case 10:i+=1;case 11:i+=1;default:i+=1;5以下程序段完成的功能是( )。int shu;printf(请输入一个整数;n);scanf(%d,&shu);if(shu0)shu=-shu;printf(%dn,shu);6以下程序段运行后的输出结果是( )。int a=2,b=1,c=2;if(a)if(b0) c=0;else c+;printf(%dn,c);7以下程序段运行后的输出结果是( )。int a=2,b=1,c=2;if(a)if(b0) c=0;else c+;printf(%dn,c);8 运行以下程序段,并输入1,则输出结果是( )。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);9运行以下程序段,并输入1,则输出结果是( )。int x;printf(请输入一个0-2的整数:);scanf(%d,&x);switch(x)case 0:printf(输入0。n); break;case 1:printf(输入1。n);break;case 2:printf(输入2。n);break;default: printf(输入错误! n);10假定w,x,y,z,m均为int型变量,有如下程序段:w=1;x=2;y=3;z=4;m=(wx)?w:x;m=(my)?m:y;m=(m=A&c=a&c=0&c=9)printf(input character is digitn);elseprintf(other character);若运行时输入大写字母A,则上面程序的输出结果是( )。12以下程序段的结果是( )。int i=4,x=3,y=2,z=1;printf(%dn,ix?i:zb)c=1;else if(a=b) c=0; printf(%dn,c);17以下程序段的运行结果是( )。if(2*1=22*2=4)printf(#);elseprintf(*);18阅读下列程序段,写出运行结果( )。int a=12,b=21,m=0;switch(a%3)case 0:m+;switch(b%2)default :m+;case 0:m+;break;printf(%d,m);19若所有变量都已正确定义为int型,则执行下列程序段后x的值为( )。x=80;a=10;b=16;y=9;z=0;if(ab) if(b!=15)if(!y) x=81;else if(!z) x=79;20有以下程序段int n=0,m=1,x=2;if(!n)x-=1;if(m)x-=2;if(x)x-=3;printf(%dn,x);执行后输出结果是( )。(四)程序设计题1输入一个字符,如果是大写字母,转换为小写,如果不是不转换。最后输出。2根据给定的年份计算该年度二月份的天数。3输入圆的的半径r和一个整型数k,当k=1时,计算圆的面积;但k=2时,计算圆的周长,当k=3时,既要求求圆的周长也要求出圆的面积。编程实现以上功能。4输入4个数,按从小到大的顺序输出。5某商场举行购物优惠活动(x代表购物款,y代表折扣):当x1600时,y=0;1600=x2400时,y=5%;2400=x3200时,y=10%;3200=x=6400时,y=20%。输入一个顾客的购物款后,显示它应付的款数。五同步训练参考答案(一)选择题参考答案1 D2 C3D4 D5 D6 D7 B8 A9A10C11B12A13B14C15D16C17C18B19A20A(二)填空题参考答案102a%2=13345%10,345/10%10,345/1004ch=a&ch5|x08193103112812expression!=013getchar( ) , ay ,yx ,zy ,x, y , z16a+bc&a+cb&b+ca17ch=A&ch=Z ,ch=ch-3218x/10 , default, case 9: case 10: 或者 x/10 , case 0:case 1:case 2:case 3: case 4:case5: ,default19(px)|(py)|(p!=z)20(1=a+8)&(a!=7)(三)程序阅读题参考答案158585820320,04135输出从键盘上输入数据的绝对值63728输入1。 输入2。 输入错误!9输入1。10111input character is letter12113211114221115222116217*183197920-4(四)程序设计题参考答案1输入一个字符,如果是大写字母,转换为小写,如果不是不转换。最后输出。参考代码#includechar zhuanhuan(char c);char zhuanhuan(char c)char ch;ch= (c=A&c=Z)?(c+32):c;return ch;int main()char c;c=getchar();putchar(zhuanhuan(c);return 0;2根据给定的年份计算该年度二月份的天数。参考代码#includeint FebruaryDay(int y);int FebruaryDay(int y)int d2;if(y%4=0&y%100!=0|y%400=0)/判断是否闰年 d2=29; else d2=28;return d2; /将求得的天数作为函数值返回int main()int year,day;printf(请输入年份:n);scanf(%d,&year); /输入年份year的值day=FebruaryDay(year); /以year为参数,调用函数FebruaryDay(),求得/该年二月份的天数,并赋值给天数day。 printf(%d年的二月有%d天!n,year,day);/输出年份及对应的二月份天数return 0;3输入圆的的半径r和一个整型数k,当k=1时,计算圆的面积;但k=2时,计算圆的周长,当k=3时,既要求求圆的周长也要求出圆的面积。编程实现以上功能。参考代码#include#define PI 3.1415void fun(double r,int k);void fun(double r,int k)double c,s;switch(k)case 1:s=PI*r*r;printf(圆面积为:%5.2fn,s);break;case 2:c=2*PI*r;printf(圆周长为:%5.2fn,c);break;case 3:s=PI*r*r;c=2*PI*r;printf(圆面积为:%5.2f,圆周长为:%5.2fn,s,c);break;int main()double r;int k;printf(请输入圆半径:);scanf(%lf,&r);printf(请输入代号1 2 3:);scanf(%d,&k);fun(r,k);return 0;4输入4个数,按从小到大的顺序输出。参考代码#includevoid fun(int a,int b,int c,int d);void fun(int a,int b,int c,int d)int t;if(ab)t=a;a=b;b=t;if(ac)t=a;a=c;c=t;if(ad)t=a;a=d;d=t;/a最小if(bc)t=b;b=c;c=t;if(bd)t=b;b=d;d=t;/b次小if(cd)t=c;c=d;d=t;/c第三,从而d最大printf(四个整数从小到大排列为:%d,%d,%d,%dn,a,b,c,d);int main()int a,b,c,d;printf(请输入四个整数);scanf(%d%d%d%d,&a,&b,&c,&d);fun(a,b,c,d);return 0;5某商场举行购物优惠活动(x代表购物款,y代表折扣):当x1600时,y=0;1600=x2400,y=5%;2400=x3200,y=10%;3200=x=6400.y=20%。输入一个顾客的购物款后,显示它应付的款数。参考代码#includedouble fun(double money);double fun(double money)int t=(int)(money/800);double off;switch(t)case 0:case 1:off=0;break;case 2:off=0.05;break;case 3:off=0.1;break;case 4:case 5:case 6:case 7:off=0.15;break;default:off=0.2;return money*(1-off);int main()double money;printf(请输入购物金额);scanf(%lf,&money);printf(购物金额为%5.2f时,实际付款为% 5.2f。n,money,fun(money);return 0;六课外实践1判断输入的正整数是否既是5又是7的整倍数,若是,则输出yes;否则输出no。2已知银行整存取存款不同的期限的月息利率分别为: 年息利率 3.5% 期限一年 4.4% 期限二年 5.0% 期限三年 5.5% 期限五年 要求输入存钱的本金和期限,求到期能从银行得到的利息和本金的合计。3输入某年某月某日,判断这一天是这一年的第几天?七课外实践参考答案1判断输入的正整数是否既是5又是7的整倍数,若是,则输出yes;否则输出no。参考代码#includevoid fun(int n);void fun(int n)if(n%7=0&n%5=0)printf(yes);elseprintf(no);int main()int n;printf(请输入一个正整数:);scanf(%d,&n);fun(n);return 0; 2已知银行整存取存款不同的期限的月息利率分别为:年息利率 3.5% 期限一年 4.4% 期限二年 5.0% 期限三年 5.5% 期限五年 要求输入存钱的本金和期限,求到期能从

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论