C++选择结构 21道题(含答案)_第1页
C++选择结构 21道题(含答案)_第2页
C++选择结构 21道题(含答案)_第3页
C++选择结构 21道题(含答案)_第4页
C++选择结构 21道题(含答案)_第5页
已阅读5页,还剩28页未读, 继续免费阅读

付费下载

下载本文档

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

文档简介

C++选择结构21道题(含答案)1.下列关于C++中if单分支结构的语法描述,正确的是()A.if后面的圆括号内只能是关系表达式或逻辑表达式B.if子句如果包含多条执行语句,必须用大括号包裹形成复合语句C.if后面的圆括号后必须加分号才能接执行语句D.if语句的条件判断为假时,一定会执行紧接的else子句【答案】B【解析】选项A错误:C++中if括号内可以是任意能隐式转换为bool类型的表达式,包括算术表达式、赋值表达式、单个变量等,例如`if(5)`、`if(a=3)`都是合法语法,其中非零值转换为bool为true,零值为false;选项B正确:if分支默认只能绑定紧跟其后的单条语句,多条语句必须通过大括号封装为块语句(复合语句),否则只有第一条语句受分支条件控制,后续语句会脱离分支、无论条件真假都会执行;选项C错误:if括号后直接接执行语句,若额外加分号,相当于if子句是空语句,会导致后续逻辑脱离分支控制,属于常见语法错误;选项D错误:单分支if结构没有配套的else子句,只有双分支、多分支结构才存在else分支。2.已知`inta=3,b=5;`,以下if语句中编译无语法错误、且能正确实现“当a大于b时交换a、b值”逻辑的是()A.`if(a>b)intt=a;a=b;b=t;`B.`if(a>b){t=a;a=b;b=t;}`C.`if(a>b){intt=a;a=b;b=t;}`D.`ifa>b{intt=a;a=b;b=t;}`【答案】C【解析】选项A错误:无大括号时只有`intt=a;`属于if分支,后续`a=b;b=t;`不受条件控制,且变量t是if块内的局部变量,块外访问`t`会触发编译错误;选项B错误:块内使用的变量t未提前声明,编译器会报“未定义标识符”错误;选项C正确:大括号将三条交换语句封装为分支块,t为块内局部变量,仅在条件成立时执行完整交换逻辑;选项D错误:if后的条件表达式必须放在圆括号内,不符合C++基本语法规则。3.阅读代码片段:`intx=2,y=1;if(x>1)if(y>1)cout<<x+y;elsecout<<x-y;`,该代码的输出结果是()A.1B.3C.-1D.无输出【答案】A【解析】本题考查“悬挂else”规则:C++中else始终与同一作用域内最近的、尚未匹配else的if配对,不受代码缩进影响。本题中else实际与内层`if(y>1)`配对,而非外层`if(x>1)`。执行流程为:x=2满足x>1的外层条件,进入内层判断y=1不满足y>1,因此执行else分支计算x-y=2-1=1。若要让else与外层if配对,必须给内层if块加大括号明确边界:`if(x>1){if(y>1)cout<<x+y;}elsecout<<x-y;`,此时x=2、y=1时不会执行else分支,无输出。4.下列关于switch语句语法规则的说法,正确的是()A.switch后面括号内的表达式可以是任意浮点类型的算术表达式B.每个case后面的常量表达式的值可以重复,只要对应执行语句不同即可C.case分支后面如果没有break语句,会继续执行后续case分支的语句直到遇到break或switch结构结束D.default子句必须放在所有case分支的最后面,否则会出现编译错误【答案】C【解析】选项A错误:switch的表达式只能是整型、字符型、枚举型等可隐式转换为整型的类型,浮点类型因存在精度误差,无法作为switch的判断表达式;选项B错误:case后必须是编译期可确定的常量表达式,且同一switch结构中所有case的常量值必须唯一,否则编译器无法确定分支匹配逻辑,会触发编译错误;选项C正确:break的作用是立即跳出当前switch结构,若case后无break,会发生“分支穿透”,顺序执行后续所有case的语句直到遇到break或结构结束,开发者也可以刻意利用穿透特性简化多值匹配的代码;选项D错误:default子句可以放在switch结构的任意位置,其匹配逻辑不受位置影响——只有当所有case都不匹配时才会进入default分支,若default分支无break,同样会穿透后续case语句。5.已知`chargrade='B';`,执行以下switch结构后,变量count的值是()```cppintcount=0;switch(grade){case'A':count++;case'B':count++;case'C':count++;break;case'D':count+=2;default:count+=3;}```A.1B.2C.3D.6【答案】B【解析】grade值为'B',首先匹配case'B'分支,执行count++使count从0变为1;由于case'B'后无break语句,发生分支穿透,继续执行case'C'分支的count++,使count变为2;随后遇到break语句,立即跳出switch结构,后续的case'D'和default分支都不会执行,因此count最终值为2。本题需注意:只有匹配到的分支才会触发后续穿透流程,未匹配到的分支(如本题的case'A')不会被执行。6.已知`inta=1,b=2,c=3,d=4;`,执行语句`if((a=a+b)>(c=c+d)&&(b=b-a)<0)`后,变量b的值是()A.2B.-1C.-2D.3【答案】A【解析】本题考查逻辑与&&的短路求值特性:C++中逻辑运算符遵循从左到右的求值顺序,当&&左侧表达式的值为false时,右侧表达式不会被执行(因为整个逻辑与的结果已经确定为false)。本题中首先计算&&左侧的表达式:a=a+b计算后a=3,c=c+d计算后c=7,`3>7`的结果为false,因此&&右侧的`(b=b-a)<0`完全不会被执行,b始终保持初始值2。需注意:虽然&&的运算符优先级高于赋值运算符,但优先级仅决定表达式的结合方式,不改变从左到右的求值顺序和短路规则。7.以下if语句中,存在典型逻辑错误(语法合法但无法实现预期功能)的是()。预期功能:判断整数x是否在区间[0,100]内,是则输出“合法”A.`if(x>=0&&x<=100)cout<<"合法";`B.`if(0<=x<=100)cout<<"合法";`C.`if(x>0&&x<100)cout<<"合法";`【解析】选项A是区间判断的标准写法,用逻辑与连接两个边界条件,逻辑正确;选项B是新手最易犯的错误:数学中的连续不等式写法不符合C++的运算规则,C++中关系运算符从左到右结合,先计算`0<=x`得到bool值true(1)或false(0),再将该0或1与100比较,由于0和1都小于等于100,因此无论x取何值,该条件永远为真,完全无法实现区间判断;选项C虽然漏了x=0和x=100两个边界值,但属于业务逻辑疏漏,并非语法规则导致的典型错误;选项D通过德摩根律对区间条件取反,和选项A的逻辑完全等价,写法正确。8.已知`intn=5;`,以下多分支if结构执行后,输出结果是()```cppif(n<3)cout<<"A";elseif(n<6)cout<<"B";elseif(n<10)cout<<"C";elsecout<<"D";```A.AB.BC.CD.BCD【答案】B【解析】多分支if结构的执行逻辑是从上到下依次判断条件,一旦某个条件成立就执行对应分支的语句,后续所有分支不再判断、直接跳出整个结构。本题中n=5,第一个条件n<3不成立,第二个条件n<6成立,因此输出B,不会再判断n<10的条件,也不会输出C。多分支结构的条件顺序至关重要,若将范围宽松的条件放在前面,会导致后续严格条件无法被触发。9.下列业务场景中,最不适合使用switch语句实现的是()A.根据用户输入的1-7整数输出对应的星期几B.根据学生的0-100整数百分制成绩输出对应等级(90+为A,80-89为B,以此类推)C.根据输入的+、-、*、/算术运算符对两个整数执行对应运算D.根据枚举类型表示的月份值输出对应月份的天数(不考虑闰年)【答案】B【解析】switch本质是等值匹配的分支结构,要求case后为常量表达式,适合处理离散值的分支判断。选项A、C、D都是典型的离散等值匹配场景,用switch实现逻辑清晰;选项B是连续范围判断,若直接用switch实现,需要为0-100的每个分数写一个case分支,代码极其冗余,虽然可以通过score/10将分数转换为0-10的离散值简化代码,但本质上多分支if更适合连续范围判断,不需要枚举所有可能值,代码更简洁。10.下列代码片段中,无论整型变量x取何值,执行后一定会输出“Yes”的是()A.`if(x=1)cout<<"Yes";elsecout<<"No";`B.`if(x==1)cout<<"Yes";elsecout<<"No";`C.`if(x!=1)cout<<"Yes";elsecout<<"No";`D.`if(x=0)cout<<"Yes";elsecout<<"No";`【答案】A【解析】选项A中if的条件是赋值表达式`x=1`,表达式的值为1(非零),转换为bool为true,因此无论x的初始值是多少,都会先将x赋值为1,且条件恒为真,永远输出“Yes”,这是新手将相等判断==误写为赋值=的经典错误,这类代码多数编译器仅会抛出警告、不会阻止编译,极易引发逻辑bug;选项D中的赋值表达式为x=0,表达式值为0转换为bool为false,永远输出“No”;选项B、C的判断条件随x值变化,不会恒为真。实际开发中为避免这类错误,可将常量写在==左侧,如`if(1==x)`,若误写为`if(1=x)`会直接触发编译错误,提前拦截问题。11.阅读以下程序,写出运行结果```cppusingnamespacestd;intmain(){inta=4,b=3,c=2;if(a>b){intt=a;a=b;b=t;}if(b>c){intt=b;b=c;c=t;}cout<<a<<""<<b<<""<<c<<endl;return0;}```【答案】324【解析】程序包含两个顺序执行的单分支if结构:第一个if判断a>b(4>3成立),执行块内交换逻辑后,a=3、b=4、c=2;第二个if判断b>c(4>2成立),执行块内交换逻辑后,a=3、b=2、c=4。需注意:这两个单分支是单向顺序执行的,交换b和c的值后,不会回溯判断a和新的b值的大小关系,因此最终结果不是升序排列的2、3、4,这也说明单分支结构不会自动重复判断,若要实现三数升序排序,需要补充第三次比较逻辑。12.阅读以下程序,写出运行结果```cppusingnamespacestd;intmain(){intx=10,y=20,z=30;if(x>y)if(y>z)cout<<"A";elsecout<<"B";else{if(z>x)cout<<"C";elsecout<<"D";}cout<<"E"<<endl;return0;}```【答案】CE【解析】本题中else块通过大括号明确了作用域边界,不存在悬挂else问题:外层if判断x>y(10>20不成立),直接进入else块;块内if判断z>x(30>10成立),输出字符C;分支结构结束后,顺序执行块外的输出语句打印E,因此最终结果为CE。大括号是明确分支边界最可靠的方式,即使分支内只有单条语句,复杂嵌套场景下也建议添加大括号提升代码可读性、避免else匹配错误。13.阅读以下程序,写出运行结果```cppusingnamespacestd;intmain(){intk=2;switch(k){default:cout<<"X";case1:cout<<"Y";break;case2:cout<<"Z";case3:cout<<"M";}cout<<endl;return0;}```【答案】ZM【解析】switch结构首先匹配所有case常量,全部不匹配时才会进入default分支,和default的位置无关。本题k=2可以匹配case2分支,因此不会执行default中的输出X;进入case2后输出Z,由于分支后无break,穿透执行case3的输出M,到达switch结构末尾后跳出。若k=0(无匹配case),则会进入default输出X,因default后无break,继续穿透case1输出Y,遇到break跳出,结果为XY。14.阅读以下程序,写出运行结果```cppusingnamespacestd;intmain(){inta=0,b=0,c=0;}return0;}```【答案】100```cppusingnamespacestd;intmain(){intscore=59;if(score>=90){cout<<"优秀";}elseif(score>=60){cout<<"及格";}elseif(score>=0){cout<<"不及格";}else{cout<<"成绩无效";}cout<<endl;return0;}```【答案】不及格【解析】多分支结构从上到下判断:score=59不满足>=90、>=60的条件,满足>=0的条件,因此输出“不及格”。若score为-10,则三个条件都不满足,进入else分支输出“成绩无效”。本题中多分支的条件是从高到低排列的,逻辑正确;若将score>=0的分支放在最前面,会导致所有0分以上的成绩都被判定为“不及格”,引发逻辑错误。16.阅读以下程序,写出运行结果```cppusingnamespacestd;intmain(){intx=10;if(x>5){intx=20;cout<<x<<"";}cout<<x<<endl;return0;}```【答案】2010【解析】C++中块作用域内定义的变量会屏蔽外层同名变量:if块内定义的x是局部变量,仅在块内有效,因此块内输出的是局部x的值20;离开if块后,块内的局部x被销毁,访问的是外层定义的x,值为10。实际开发中不建议在分支块内定义和外层同名的变量,极易引发逻辑混淆。17.编写程序:从键盘输入一个整数,判断该数是奇数还是偶数,奇数输出“Odd”,偶数输出“Even”。【解题思路】使用双分支if结构,通过整数对2取余的结果判断奇偶性:若余数为0则为偶数,否则为奇数。注意负奇数对2取余的结果为-1,不能用`num%2==1`作为奇数的判断条件,需使用`num%2!=0`覆盖负数场景。【参考代码】```cppusingnamespacestd;intmain(){intnum;cout<<"请输入一个整数:";cin>>num;if(num%2==0){cout<<"Even"<<endl;}else{cout<<"Odd"<<endl;}return0;}```【代码说明】该代码可正确处理负整数场景,例如输入-4会输出Even,输入-3会输出Odd,逻辑覆盖全面。18.编写程序:从键盘输入三个整数,输出三个数中的最大值。【解题思路】采用打擂台算法:先假设第一个数为初始最大值,再通过两个单分支if依次将剩余两个数和当前最大值比较,若数值更大则更新最大值,最终得到的最大值变量即为三个数中的最大值,无需嵌套分支,逻辑简单清晰。【参考代码】```cppusingnamespacestd;intmain(){inta,b,c;cout<<"请输入三个整数(空格分隔):";cin>>a>>b>>c;intmax_val=a;if(b>max_val)max_val=b;if(c>max_val)max_val=c;cout<<"最大值为:"<<max_val<<endl;return0;}```【代码说明】该算法时间复杂度为O(1),无论三个数的大小关系如何,仅需两次比较即可得到结果,适合初学者理解单分支结构的执行逻辑。19.编写程序:实现简易四则运算计算器,从键盘输入两个操作数和一个算术运算符(+、-、*、/),输出对应运算结果;若运算符不合法则输出“Invalidoperator”;若为除法运算且除数为0,输出“Dividebyzeroerror”。【解题思路】由于运算符是离散字符值,适合用switch结构做等值分支判断,在除法分支中嵌套if结构判断除数是否为0(浮点数判断0需考虑精度误差,不能直接用==0)。【参考代码】```cppusingnamespacestd;intmain(){doublenum1,num2;charop;cout<<"请输入表达式(格式:操作数1运算符操作数2):";cin>>num1>>op>>num2;switch(op){case'+':cout<<num1<<"+"<<num2<<"="<<num1+num2<<endl;break;case'-':cout<<num1<<"-"<<num2<<"="<<num1-num2<<endl;break;case'*':cout<<num1<<"*"<<num2<<"="<<num1*num2<<endl;break;case'/':if(fabs(num2)<1e-9){cout<<"Dividebyzeroerror"<<endl;}else{cout<<num1<<"/"<<num2<<"="<<num1/num2<<endl;}break;default:cout<<"Invalidoperator"<<endl;}return0;}```【代码说明】代码中用fabs判断除数绝对值是否小于1e-9,避免浮点数存储精度导致的0值判断错误,通过switch和if的嵌套实现分支逻辑分层,结构清晰易读。20.编写程序:从键盘输入一个年份(正整数),判断该年份是否为闰年。闰年规则:能被4整除但不能被100整除,或能被400整除的年份为闰年。【解题思路】通过逻辑运算符组合闰年判断条件,将条件结果存入bool变量,再通过双分支if输出判断结果,注意逻辑与和逻辑或的优先级,必要时加括号明确运算顺序。【参考代码】```cppusingnamespacestd;int

温馨提示

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

最新文档

评论

0/150

提交评论