第四章 选择结构程序设计《计算机基础与程序设计》广东普通专升本

1.【精析】 ×表达式可以为逻辑表达式或关系表达式,也可以是任意的数值类型。
二、 应 用 题
1.【精析】 定义三个变量a,b,c 用于接收输入的三次成绩,使用嵌套的选择结构对三个变量值进行比 较,输出其中的最大者。
编写程序如下:


2.【精析】 定义一个整型变量a 用于接收输人的整数,使用嵌套的选择结构判断该数与0的大小关 系,若大于0则为正数,若小于0则为负数,否则该数为0。
编写程序如下:


一 单项选择题
1.【精析】 B C语句规定,else 子句总是与它上面最近的未配对的 if 配对。
2.【精析】 B 题中的“if(a语句中a 条件判断为真,执行语句“b=a;” 将b 赋值为1,然后执行“c=b;” 语句将c 赋值为1,else 子句没有执行,所以a 值不变,选项B 正确。
在if…else 选择结构中,若条件表达式为真则执行if 子句中的语句,否则执行else 子句中的语句。
3.【精析】 C 选项A中if 语句的执行体是一条空语句,正确;选项B 中 if 语句的执行体是由逗号表 达式组成的一条语句,正确;选项C中“i=0,” 不正确,应该是“i=0;”, 选项D 中 if 语句的执行体是 “i=j;”, 正确。
4.【精析】 B“if (a>b)c=a; ”是一条if 语句,因为a>b 不成立,所以跳过语句“c=a; ”,直接执行赋值 语句“a=b;” 和“b=c;”, 因 此a=20,b=30,e=30。
5.【精析】 C 选项B 和选项D的 if语句中都是复合语句,由 于a>b 条件不成立,所以复合语句不执 行,a、b、c保持原值;选项A中 ,“c=a,a=b,b=c;” 只有一个分号,是由逗号表达式构成的一条语句, 又由于a>b 条件不成立,所以该语句不执行,a 、b、c 保持原值;选项 C 中有3条语句,其中“if(a>
b)c=a;” 是一条 if 语句,由于 a>b 条件不成立,“c=a;” 没有执行,但语句“a=b;b=c;” 是执行的, a 和 b 的值变为6和3,故选 C。
6.【精析】 B 选项A 中由于条件a 为假,不会执行“i++;” 语句;选项B中a=b 是一个赋值表达式,其
一 单项选择题
1.【精析】 B C语句规定,else 子句总是与它上面最近的未配对的 if 配对。
2.【精析】 B 题中的“if(a语句中a 条件判断为真,执行语句“b=a;” 将b 赋值为1,然后执行“c=b;” 语句将c 赋值为1,else 子句没有执行,所以a 值不变,选项B 正确。
在if…else 选择结构中,若条件表达式为真则执行if 子句中的语句,否则执行else 子句中的语句。
3.【精析】 C 选项A中if 语句的执行体是一条空语句,正确;选项B 中 if 语句的执行体是由逗号表 达式组成的一条语句,正确;选项C中“i=0,” 不正确,应该是“i=0;”, 选项D 中 if 语句的执行体是 “i=j;”, 正确。
4.【精析】 B“if (a>b)c=a; ”是一条if 语句,因为a>b 不成立,所以跳过语句“c=a; ”,直接执行赋值 语句“a=b;” 和“b=c;”, 因 此a=20,b=30,e=30。
5.【精析】 C 选项B 和选项D的 if语句中都是复合语句,由 于a>b 条件不成立,所以复合语句不执 行,a、b、c保持原值;选项A中 ,“c=a,a=b,b=c;” 只有一个分号,是由逗号表达式构成的一条语句, 又由于a>b 条件不成立,所以该语句不执行,a 、b、c 保持原值;选项 C 中有3条语句,其中“if(a>
b)c=a;” 是一条 if 语句,由于 a>b 条件不成立,“c=a;” 没有执行,但语句“a=b;b=c;” 是执行的, a 和 b 的值变为6和3,故选 C。
6.【精析】 B 选项A 中由于条件a 为假,不会执行“i++;” 语句;选项B中a=b 是一个赋值表达式,其
一 单项选择题
1.【精析】 B C语句规定,else 子句总是与它上面最近的未配对的 if 配对。
2.【精析】 B 题中的“if(a语句中a 条件判断为真,执行语句“b=a;” 将b 赋值为1,然后执行“c=b;” 语句将c 赋值为1,else 子句没有执行,所以a 值不变,选项B 正确。
提醒:在if…else 选择结构中,若条件表达式为真则执行if 子句中的语句,否则执行else 子句中的语句。
3.【精析】 C 选项A中if 语句的执行体是一条空语句,正确;选项B 中 if 语句的执行体是由逗号表 达式组成的一条语句,正确;选项C中“i=0,” 不正确,应该是“i=0;”, 选项D 中 if 语句的执行体是 “i=j;”, 正确。
4.【精析】 B“if (a>b)c=a; ”是一条if 语句,因为a>b 不成立,所以跳过语句“c=a; ”,直接执行赋值 语句“a=b;” 和“b=c;”, 因 此a=20,b=30,e=30。
5.【精析】 C 选项B 和选项D的 if语句中都是复合语句,由 于a>b 条件不成立,所以复合语句不执 行,a、b、c保持原值;选项A中 ,“c=a,a=b,b=c;” 只有一个分号,是由逗号表达式构成的一条语句, 又由于a>b 条件不成立,所以该语句不执行,a 、b、c 保持原值;选项 C 中有3条语句,其中“if(a>
b)c=a;” 是一条 if 语句,由于 a>b 条件不成立,“c=a;” 没有执行,但语句“a=b;b=c;” 是执行的, a 和 b 的值变为6和3,故选 C。
6.【精析】 B 选项A 中由于条件a 为假,不会执行“i++;” 语句;选项B中a=b 是一个赋值表达式,其
值为赋值后变量a 的值4,条件为真,执行“i++;” 语句;选项C 中由于条件为假,不会执行“i++;” 语 句;选项D 中 b-a 等于4,!( b-a) 为0,条件为假,不会执行“i++;” 语句。
7.【精析】 D 由 于if 下面的两条语句未加花括号,这样“if(a==6)a=a+2;” 是一条独立的语句,后 面的else 部分找不到对应的if 部分,因此,有语法错误。
8.【精析】 A ?:为条件运算符,在语句“x
9.【精析】 B 表达式(x>='a'&&x<='z') 表示的意思是'a¹<=x<='z¹, 如果从键盘输人的字符满足该条件 (表示输入的是英文小写字母),则条件表达式(x>'a'&&x<='z' )的值为真,执行 printf("%cIn",x- 32)语 句 (小写字母的 ASCII 值比大写的 ASCII 值多32),将小写字母转换成大写字母后输出,否则执行 printf(“%c\n”,x) 语句,输出原字符。选项B 正确。
值为赋值后变量a 的值4,条件为真,执行“i++;” 语句;选项C 中由于条件为假,不会执行“i++;” 语 句;选项D 中 b-a 等于4,!( b-a) 为0,条件为假,不会执行“i++;” 语句。
7.【精析】 D 由 于if 下面的两条语句未加花括号,这样“if(a==6)a=a+2;” 是一条独立的语句,后 面的else 部分找不到对应的if 部分,因此,有语法错误。
8.【精析】 A ?:为条件运算符,在语句“x
9.【精析】 B 表达式(x>='a'&&x<='z') 表示的意思是'a¹<=x<='z¹, 如果从键盘输人的字符满足该条件 (表示输入的是英文小写字母),则条件表达式(x>'a'&&x<='z' )的值为真,执行 printf("%cIn",x- 32)语 句 (小写字母的 ASCII 值比大写的 ASCII 值多32),将小写字母转换成大写字母后输出,否则执行 printf(“%c\n”,x) 语句,输出原字符。选项B 正确。
二、判断题
1.【精析】 × 在if 语句中可以包含一个或多个if 语句,称为if 语句的嵌套。
2.【精析】 × if 语句有两种形式,一种是不带else 子句的;另一种是带else 子句的,所以else 子句不 是if 语句的必选项。
3.【精析】 × else 子句不能作为语句单独使用,它必须是if 语句的一部分,与 if 配对使用,但 if 语句 可单独使用。
4.【精析】 × if…else 语句是一种分支结构,当条件满足时,有“if语句”和“else 语句”两条分支,可以 根据条件执行其中一个。
提醒:
表达式的值在逻辑上只有真和假,故if 和 else 在执行流程上是互斥的,执行且只能选择执行两者
中的一个。
5.【精析】 × s witch 选择结构中可以没有 default 语句,此时如果没有与 switch 表达式相匹配的 case 常量,则不执行任何语句,程序转到switch的下一条语句。
6.【精析】 √ 复合语句在语法上是一条语句,但包含若干条语句,这些语句需要用{}括起来。
7.【精析】 √ 在 switch 选择结构中,每一个 case 常量必须互不相同,否则就会出现互相矛盾的 现象(对 switch 表达式的同一个值,有两种或多种执行方案)。
8.【答案】 √
9.【精析】× 执行if 语句时,首先对括号内的表达式求解,若表达式的值为0,即为“假”,此时条件不 成立,if 语句不执行,若表达式的值为非0,即为“真”,条件成立,执行 if 语句。
10. 【精析】×用switch 语句编写的程序可以实现多分支选择结构,也可以使用if 的嵌套来处理,但 过多的if 嵌套语句会造成程序冗长易出错,可读性降低。 一般不建议使用if 嵌套来实现多分支选 择结构。
11.【答案】 √
三、填空题
1.复合语句
2.switch
3.if
4. 嵌 套
四 简答题
1.【参考答案】 C 语言中用“1”表示“真”,用“0”表示“假”。系统在判断时,一般是当表达式的值非 “0”时,即表示“真”;仅当表达式的值为“0”时,表示“假”。
2.【参考答案】 if 选择结构一般用于单分支选择结构,根据判断的结果决定执行哪种操作。
switch 语句一般用于实现多分支选择结构,可以根据表达式的值,使流程跳转到不同的语句。
五 计算题
1.【精析】(1)0,6,7 (2)0,0,6
(1) if 条件成立,执行“j=k++;” 语句,先把k 的值6赋给j, 所以j 的值为6,执行k++操作后,k 的值变 为7 ,i 值无变化,输出结果为0,6,7。
(2)修改条件为“if(i>0&&j>=0)”, 则if 条件不成立,程序不执行任何操作,原样输出i,j,k 的值。
2. 【精析】(1) -3 (2) m! =0
(1)执行第一条if 语句时,因为!n 为真,所以x 被赋值为-1; m=0 ,第二条if 语句条件为假,不执行; 第三条if 语句的条件为真,x 被赋值为-3后输出。
(2)当m!=0 时,第二条if语句条件为真,程序执行“x=x+1;” 语句。
3.【精析】(1)6 (2)7
对于条件表达式(x--<7), 先使用x 的值7进行判断,7<7不成立,所以执行else 部分的语句,再执行 x-- 操作,x的值变为6;执行“printf("%d\n",x++);” 语句时,先使用x 的值6进行输出,再进行自 增( x 变为7)。
4. 【精析】(1)m= 7 (2)6
先使用m 的值6进行判断,if条件为假,执行m++操作后,m=7; 执行else 子句,m-- 表达式先取m 的 值7输出后再使m 自减1,即输出结果为m=7, 此时 m 的值为6。
5.【精析】(1)0 ( 2)1
(1)在if…else 语句中,else 总是和最近的且未配对的if 配对,由于(!x) 不成立,接着判断(x==0), 又 不成立,所以对y 未进行任何操作,其值仍为初始值0。
(2)当x=0 时,(!x)为真,条件成立,执行“y++;” 语句,输出y 的值为1。
6. 【精析】(1)跳出循环 (2) 12
表达式k+1 的值为11(但k 的值仍为10),满足case 11分支,执行“++k;” 语句,因其后无break 语 句,继续执行 case 12分支中的“++k;” 语句,执行完成后k 的值为12,此时遇到 break 语句结束分支 语句,输出k 的值。
7.【精析】(1)end (2)3end
(1)该程序中,需要注意if…else 语句的实际配对关系,a>b 条件不成立,执行“printf("end\n" );”语 句。所以,该程序的最后输出为end。
(2) a>b条件成立,a>c 条件成立,执行“printf("%d",a);” 语句,输出a 的值。然后执行“prinf("end\n");” 语句,输出end。
提升题
一、单项选择题
1.【精析】 B 在if 语句中,if 后会跟一个表达式,一般为逻辑表达式或关系表达式,此表达式应用 () 括起来,选项B 的正确表示形式为“if((x =y)&&(x! =0))x+=y;”。
2.【精析】 A 对于表达式“a>b?(b>e?1:0):0;” ,只有当a>b 时,其值为表达式( b>e?1:0) 的值。而 表达式( b>c?1:0),只有当b>e 时,其值为1。也就是说,只有当a>b 且b>e 时 ,k的值才为1,其他情况下,k 的值都为0,因此,选项A 正确。
提醒:“z=x>9?x:y; ”语句的作用是当条件成立时将x 的值赋给z, 否则将y 的值赋给z。
3.【精析】 C switch 语句中表达式的值必须是整型或字符型数据,与之对应,case 后面的常量也应为 整型或字符型常量,按照这一原则,选项B 和选项D 不正确;选项A 中,取余的两个操作数都应为整 数,因此表达式c%3 不正确,故选C。
4.【精析】 C 选项C 中,当x 的值为1时,表达式x==1 的值为真,即为1,这样会执行 case 1分支中 的“x++;” 语句,与题目中if语句的功能不同。
5.【精析】 B 只有当x 大于1时才会执行else 部分,另外x 不等于5,才会执行打印输出语句。所以 若要使程序输出结果则x 必须大于1且不等于5。
二计算题
1.【精析】 (1) 1119 (2) 112028
(1)3条if 语句都为单分支语句,x的值为11时,满足条件x>10, 输出x 的值11,又由于x>5 成立,继续 执行“printf("%d\n",x+8);” 语句,输出19。
(2)x 的值为20时,满足条件x>13, 执行语句“printf("%d", x-9);”, 输出11,又满足条件x>10, 输 出x 的值20,还满足条件x>5, 继续执行“printf("%d\n",x+8);” 语句,输出28。
2.【精析】(1)150 (2) 1015
(1)程序中,“if(a==b)t=a;"” 构成一条if 语句。由于a==b 条件不成立,语句“t=a;” 不执行;程序 接着执行“a=b;”“b=t;” 这两条语句,执行后a=15,b=0。
(2)修改过后,“if(a==b){t=a;a=b;b=t;}” 构成一条if 语句,由于条件不成立,则不执行任何操作, 原样输出a、b的值。
3.【精析】(1)passtesterror (2) you
(1) n 被赋值为字符'e¹, 与case 'c' 匹配,输出pass; 此时并没有遇到break 语句,继续执行case 'd 子 句,输出test, 接着执行default 子句,输出error 后遇 break 语句结束switch 分支语句。
(2)当n='a¹, 与 case 'a¹匹配,没有输出,此时没有遇到 break 语句,继续执行 case 'b' 子句,输出you, 遇 break 语句结束switch 分支语句。
4.【精析】(1)11 (2) 10
先取a 的值判断,表达式a++>10 不成立,a 的值再自增1为11,执行语句“printf("%d\n" ,a--);” 时 先将a 的值输出,即输出11,再使a 自减1,此时a 的值为10。
5.【精析】(1) ** 0**
(1)这是 一 个 switeh 嵌套语句。a =1,执行 case 1:switch(b)分支,b=0, 执 行“case 0:
printf("**0**\n"); break;”语句,打 印 出 * * 0 * * ;case 1:switch(b)分支执行完后,碰到 break
语句,结束switch分支语句。
(2)b=1, 执行“case 1:printf("**1**In");break;”语句,打印出**1** ;case 1:switch(b)分 支执行完后,碰到break 语句,结束switch 分支语句。
6.【精析】(1)条件运算符 (2)3
条件运算符的表达式是:表达式1?表达式2:表达式3,含义是:当表达式1的值为真时,返回表达式 2的值,否则返回表达式3的值。
根据运算符的优先级,先计算赋值运算符右侧的条件表达式5?a++:b-- 的值;由于条件5为真,所以 将a++的值作为条件表达式的值;这样“c=5? a++:b--; ”等价于“c=a++;”,a++ 表示先使用a 的值, 再将a 的值加1,因此c 的值为3。
三、应用题



