第 2 单元 选择结构程序设计
实训 2-1 选择结构程序设计(一)
一、实训目标 顺序结构程序只能完成简单的运算和功能。如果要根据给定的条件进行判断并执行相应 的选择,就可以通过编程解决这种较为复杂的问题。通过本实训的练习,掌握单分支“if…” 及双分支“if…else…”语句的应用;熟悉多分支“if…else if…else”语句的应用。 二、实训任务 (一)课内 2 学时完成 1.从键盘上输入一个整数,若为偶数,则输出该数。 【提示】判断偶数的条件表达式为:x%2= =0。利用 if 语句实现单分支结构。 程序运行后: 输入数据为:6 输出结果为: 此数为偶数,其值为 6。 再次运行程序: 输入数据为:5 无输出信息。 2.从键盘上输入 x、y 变量的值,输出其中较大的值。 【提示】本程序要求从键盘上输入两个不相等的数,输出两个数中较大的数。利用 if 语 句实现双分支结构,设 x 和 y 表示两个不等的数,如果 x>y 则输出 x,否则输出 y。程序运行后: 屏幕显示: 输入 x 和 y 的值: 45 23<回车> 输出结果为: 较大数为 45 同学们可输入其他数据验证结果。 3.根据输入的楼层数,判断是否可以进入电梯。若楼层数为 1~3,提示“请走楼梯! ” ; 若楼层数为 4~20,提示“请进电梯! ” :若输入 1~20 之外的数据,提示“本楼只有 1~20 层, 输入数据错误,请重新输入! ” 。 【提示】电梯控制程序需要对所输入的楼层数进行判断,然后决定显示何种提示,可利
用 if 语句完成。设变量 f 表示楼层,当“f>=1 && f<=3”表示楼层数为 1~3。该程序有 3 个 分支。使用“if…else if…else”结构。 程序运行后: (1)屏幕显示: 请输入你所到的楼层数:25<回车> 输出结果为: 本楼只有 1~20 层,输入数据错误,请重新输入! (2)屏幕显示: 请输入你所到的楼层数:2<回车> 输出结果为: 请走楼梯! (3)屏幕显示: 请输入你所到的楼层数:8 输出结果为: 请进电梯! 同学们可输入其他数据验证结果。 (二)课外 2 学时完成 1.由键盘输入 a、b、c 三个整数,将绝对值最大者输出。 【提示】此题的关键是绝对值如何表示,a 的绝对值可表示成 abs(a)。设变量 x 存放绝对 值最大的那个数, 如果 abs(a)>abs(b)成立, 则 x←a 否则 x←b; 再判断 x 与 c, 如果 abs(c)>abs(x) 成立,则 x←c。最后输出 x 的值即可。三个数两两比较,需要使用两次 if 语句进行判断。abs() 是绝对值函数,该函数在“math.h”头文件中。 程序运行后: 输入数据为:4 6 9 <回车> 输出结果为: 9 也可以输入其他数据,观察输出结果。
2.任意给定两个数 x 和 y,若 x 与 y 非异号,求其算术平均数( a x y 2 +
= )与几何平均 数( b= xy )。
【提示】x 与 y 非异号,说明 x、y 同时都大于 0 或同时都小于 0,可以表示为: “x>0 && y>0 || x<0 && y<0” 。采用双分支 if 语句实现,判断条件:x 与 y 非异号。
(1)第一次运行程序,屏幕显示提示信息: 请输入 x 和 y 值: 输入数据: 2.0□4.0<回车> 屏幕显示结果: 算术平均数=3.000000,几何平均数=2.828427 (2)第二次运行程序,屏幕显示提示信息: 请输入 x 和 y 值:
输入数据: 2.0□4.0<回车> 屏幕显示结果: 算术平均数= 3.000000,几何平均数=2.828427 (3)第三次运行程序,屏幕显示提示信息: 请输入 x 和 y 值: 输入数据: 2.0□4.0<回车> 屏幕显示结果: 输入数据错误! 注意:数据输入的格式,本程序输入、输出数据均使用“%f”格式符。 同学们也可以输入其他数据,观察输出结果的变化。 3.有一函数: 2 x x 1 y x 2 1 x 10 5x 11 x 10 < ì ï ï =í + < ï - ï î ≤ ≥ ,编写程序,用 scanf()函数读入 x 的值,计算并 输出 y 的值。 【提示】根据键盘输入 x 值的范围(三种情况),确定 y 的不同取值。这是一个三分支情 况,每种情况对应一个条件,且相邻条件间又有一定的联系,可用具有多分支特点的“if…else if…else” 语句来编写此程序。如果“x<1”条件满足,则 y=x;若不满足,再判断条件“x>=1 && x<10”是否满足条件,满足条件,则 y=sqrt(x*x+2),否则 y=5*x11。 (1)第一次运行程序,屏幕显示提示信息: 请输入 x 值: 输入数据: 0.5<回车> 屏幕显示结果: y=0.50 (2)第二次运行程序,屏幕显示提示信息: 请输入 x 值: 输入数据: 8<回车> 屏幕显示结果: y=8.12 (3)第三次运行程序,屏幕显示提示信息: 请输入 x 值: 输入数据: 12<回车> 屏幕显示结果: y=49.00 注意:数据输出格式。本程序输出 y 值使用“%0.2f”格式,也可以自定格式。
三、实训思考 1.在双分支的程序设计中,如果控制的操作对象是“一段程序” ,则应如何表示? 2.语句 if (x!=y) scanf("%d",&x) else scanf("%d",&y);正确吗? 3.if(1)表示什么含义?
实训 2-2 选择结构程序设计(二)
一、实训目标 if 语句的基本功能是实现两个分支的选择,但在解决实际问题时,经常会遇到多分支的选 择,使用嵌套的 if 语句或 switch 语句可以实现多分支的选择,用 switch 语句解决多分支选择 问题更加方便简洁。通过本实训的练习,熟悉 if 语句的嵌套应用,明确程序执行的流程;掌 握 switch 语句的格式和应用方法。 二、实训任务 (一)课内 2 学时完成 1.根据给定的学生成绩(百分制)写评语,若学生成绩在 90~100 分输出“优秀” ,70~ 89 分输出“良好” ,60~69 分输出“及格” ,60 分以下(0~59)输出“不及格” ,用 switch 语 句编写程序实现相应功能。 【提示】首先对输入的数据是否为有效成绩利用 if 语句进行判断,若为无效成绩,输出 “输入数据有误!”信息,若为有效成绩,再利用 switch 语句进行多种情况的判断。设学生成 绩变量为 s,利用“s/10”产生 0~10 的各种情况,其中:9、10 为“优秀” ,7、8 为“良好” , 6 为“及格” ,0~5 为“不及格” 。 (1)第一次运行程序,输入成绩: 120<回车> 屏幕显示结果: 输入数据有误! (2)第二次运行程序, 输入成绩: 10<回车> 屏幕显示结果: 输入数据有误! (3)第三次运行程序,输入成绩: 65<回车> 屏幕显示结果: 及格 (4)第四次运行程序,输入成绩: 78<回车> 屏幕显示结果:良好 (5)第五次运行程序,输入成绩: 93<回车> 屏幕显示结果: 优秀 (6)第六次运行程序,输入成绩: 54<回车> 屏幕显示结果: 不及格 说明:运行程序,要把每种情况下的数据输入后进行验证,观察运行结果,看看是否和 题目要求一致。 2.编程完成下列功能:判断从键盘输入的字符属于哪一类字符:大写字母、小写字母、 数字或其他字符。 【提示】从键盘输入一个字符,用 if 语句进行判断。如果是大写字母,则输出“大写字 母”字符串,否则再判断是否是小写字母,是则输出“小写字母”字符串,不是则接着判断, 依次类推。 (1)第一次运行程序,输入字符: d<回车> 屏幕显示结果: 小写字母 (2)第二次运行程序,输入字符: Q<回车> 屏幕显示结果: 大写字母 (3)第三次运行程序,输入字符: 3<回车> 屏幕显示结果: 数字字符 (4)第四次运行程序,输入字符: @<回车> 屏幕显示结果: 其他字符 (二)课外 2 学时完成 1.根据下面函数关系,编写程序计算并输出 y 的值。 0 x 0 x 0 x 10 y 10 10 x 20 0.5x 20 20 x 40 1 x 40 < ì ï < ï ï = í < ï - + < ï - > ï î ≤ ≤ ≤ 【提示】这是一个多分支结构,用 if 语句编写程序完成。先判断条件“x<0” ,若为真, 输出 y=0,否则判断条件“x>0 && x<=10” ,若为真,输出 y=x,若为假,继续判断后面的条
件,依次类推。 (1)第一次运行程序,输入数字: 23<回车> 输出结果: 0.00 (2)第二次运行程序,输入数字: 7<回车> 输出结果: 7.00 (3)第三次运行程序,输入数字: 14<回车> 输出结果: 10.00 (4)第四次运行程序,输入数字: 30<回车> 输出结果: 5.00 (5)第五次运行程序,输入数字: 45<回车> 输出结果: 1.00 2.从键盘输入数字 1、2、3、4,编写程序分别显示 excellent、good、pass、fail,若输入 其他数字,则显示“输入错误! ”信息。 【提示】首先对输入的数据是否为有效数据利用 if 语句进行判断,若为无效数据,输出 “输入数据有误!”信息,若为有效数据,再利用 switch 语句进行多种情况的判断。根据题目 分析有 4 个分支:1-“excellent” ,2-“good” ,3-“pass” ,4-“fail” ,通过键盘分别输入 4 个数字,用 printf()函数输出相应的信息。 (1)第一次运行程序,输入数字: 40<回车> 屏幕显示结果: 输入错误! (2)第二次运行程序,输入数字: 5<回车> 屏幕显示结果: 输入错误! (3)第三次运行程序,输入数字: 1<回车> 屏幕显示结果: excellent! (4)第四次运行程序,输入数字: 2<回车>
屏幕显示结果: good! (5)第五次运行程序,输入数字: 3<回车> 屏幕显示结果: pass! (6)第六次运行程序,输入数字: 4<回车> 屏幕显示结果: fail! 三、实训思考 1. “switch(x>0 && x<=10)”表示正确吗? 2. “case "a"”正确吗? 3.在执行完某一分支的语句时,如何才能退出 switch 结构?
实训 2-3 选择结构综合实训
一、实训目标 分支结构是结构化程序设计的三种基本结构之一。C 语言提供了 if 语句和 switch 语句来 完成这种选择功能。通过本实训的练习,加深对单分支、双分支与多分支概念的理解,熟悉 if 语句和 switch 语句的格式, 掌握 if 语句和 switch 语句的编程技巧, 学会使用 if 语句和 switch 语句来解决实际应用问题。 二、实训任务 (一)课内 2 学时完成 1.输入三个整数 x、y、z,按由小到大的顺序输出。 【提示】利用 if 语句,先将 x 与 y 进行比较,若 x>y 成立,则 x 与 y 的值进行交换,交 换之后 x 的值较小,然后将 x 与 z 进行比较,若 x>z 成立,则 x 与 z 的值进行交换,交换之后 x 的值为最小值,以此类推,y 次之,z 为最大值。 程序运行后: (1)输入数据为: 10 8 68 <回车> 输出结果为: 8 10 68 (2)输入数据为: 1 9 6 <回车> 输出结果为: 1 6 9同学们可以输入多组数据验证程序的正确性。 2.输入三角形的三个边长(设为整数),判断是否能构成三角形?若能构成三角形,判 断是否是等边三角形、等腰三角形、直角三角形或一般三角形? 【提示】构成三角形的条件为“(a+b)>c && (a+c)>b && (b+c)>a” ,若条件成立,则构成 三角形,否则,不能构成三角形。在构成三角形的情况下,依次判断是否为等边、等腰、直角 三角形。 判断等边三角形的条件是三边等长:(a= =b) && (b= =c) 判断等腰三角形的条件是任意两边等长:(a= =b) || (a= =c) || (b= =c) 判断直角三角形的条件是任意两条边的平方和等于第三边的平方: (a*a+b*b= =c*c) || (a*a+c*c= =b*b) || (b*b+c*c= =a*a) (1)第一次运行程序,请输入三角形的三边长: 输入数值为: 10 20 30<回车> 输出结果为: 不能构成三角形! (2)第二次运行程序,请输入三角形的三边长: 输入数值为: 3.6 4.5 6.8<回车> 输出结果为: 一般三角形! (3)第三次运行程序,请输入三角形的三边长: 输入数值为: 3.6 4.5 3.6<回车> 输出结果为: 等腰三角形! (4)第四次运行程序,请输入三角形的三边长: 输入数值为: 4.5 4.5 4.5<回车> 输出结果为: 等边三角形! (5)第五次运行程序,请输入三角形的三边长: 输入数值为: 4 3 5<回车> 输出结果为: 直角三角形! (二)课外 2 学时完成 1.输入圆的半径 r 和运算标志 m,按照运算标志进行指定的计算。运算标志与运算之间 的关系如表 21 所示。 【提示】根据标志判断执行哪种操作,若标志等于'a',计算并输出圆面积;若标志等于'b',
计算并输出圆周长;若标志等于'c',计算并输出圆面积和圆周长。分别用 if 语句和 switch 语 句实现。 表 21 运算标志与运算之间的关系 标志 运算 a 面积 b 周长 c 面积和周长均计算 (1)第一次运行程序,输入圆半径 4,输入标志 a 输出结果为: 面积是 50.265440 (2)第二次运行程序,输入圆半径 4,输入标志 b 输出结果为: 圆周长是 25.132720 (3)第三次运行程序,输入圆半径 4,输入标志 c 输出结果为: 面积是 50.265440,圆周长是 25.132720 再次运行程序,同学们可输入不同的标志和圆半径,观察结果的变化。 2.某邮局对邮寄包裹有如下规定:若包裹的长、宽、高任一尺寸超过 1 米或重量超过 30 千克,不予邮寄。对可以邮寄的包裹每件收手续费 0.20 元,重量与收费标准之间的关系如表 22 所示(邮资=手续费+重量*收费标准) 。 表 22 重量与收费标准之间的关系 重量(千克) 收费标准(元) Wei<10 0.80 10<wei<=20 0.75 20<wei<=30 0.70 【提示】设包裹的长、宽、高、重量分别为 len、wid、hei、wei,邮资设为 m,收费标准 为 r。若包裹的长宽高任一尺寸超过 1 米或重量超过 30 千克(len>1 || wid>1 || hei>1 || wei>30), 则不能邮寄包裹,否则可以邮寄,邮资计算方法为:每件包裹手续费 0.2 元+重量*收费标准。 本程序可以用嵌套 if 语句或 else if 语句实现。 (1)第一次运行程序,屏幕显示: 请输入包裹的长、宽、高、重量: 输入数据为: 1.9 0.4 0.7 45<回车> 输出结果为: 不予邮寄! (2)第二次运行程序,屏幕显示: 请输入包裹的长、宽、高、重量:
输入数据为: 0.9 0.4 0.8 26<回车> 输出结果为:重量为: 26.00 千克,邮资为:18.40 元。 3.某服装店经营套服,也可单件出售。若购买不少于 50 套,每套 80 元;不足 50 套, 每套 90 元;只买上衣每件 60 元;只买裤子每条 45 元。计算并输出应付款。 【提示】设上衣为 c,裤子为 t,服装款为 m。 (1)若买的是套服,即 c= =t,如果 c>=50 则 m=c*80 否则 m=c*90。 (2)若买的不是套服: ① 当上衣多于裤子,即 c>t,如果 t>=50 则 m=t*80+(ct)*60 否则 m=t*90+(ct)*60 ② 当裤子多于上衣,即 t>c,如果 c>=50 则 m=c*80+(tc)*45 否则 m=c*90+(tc)*45 这是一个三层分支结构的嵌套,同学们试着做一做。 (1)第一次运行程序,屏幕显示: 请输入要买上衣和裤子数量: 输入数据为: 23 23<回车> 输出结果为: 服装款为:2070 元 (2)第二次运行程序,屏幕显示: 请输入要买上衣和裤子数量: 输入数据为: 76 54<回车> 输出结果为: 服装款为:5640 元 (3)第三次运行程序,屏幕显示: 请输入要买上衣和裤子数量: 输入数据为: 50 70<回车> 输出结果为: 服装款为:4900 元 三、实训思考 1.else 可以单独使用吗? 2.case 后面可以使用变量吗? 3.在 switch 语句中不使用 break;可以吗?
习题 2-1
一、判断题 1.C 语言没有逻辑型数据,以非 0 代表“真” ,以 0 代表“假” 。 ( )2.C 语言在判断一个量是否为“真”时,以 0 代表“假” ,以非 0 代表“真” 。 ( ) 3.条件运算符的优先级比关系运算符和算术运算符都高。 ( ) 4.下面的 if 语句可以用一个条件表达式代替。 ( ) if (a>b) printf("%d",a); else printf("%d",b); 5.用 printf("%d",a>b?a:b);语句可以代替上面的 if 语句。 ( ) 6.已知 x=43,ch='A',y=0;则表达式(x>=y&&ch<'B'&&!y)的值是 1。 ( ) 7.执行以下语句后 a 的值为 1,b 的值为 2。 ( ) int a,b,c; a=b=c=1; ++a||++b&&++c; 8.设有变量定义:int x=3,y=4,z=5; 则表达式!((x<y)&&!z||1)的值为 0。 ( ) 9.在“?:” 、 “&&” 、 “+” 、 “!=”运算符中优先级最低的是“?:” ,优先级最高的是“+” 。 ( ) 10.语句 if (x>y);是正确的。 ( ) 二、单项选择题 1.为表示关系 x 大于等于 y,y 大于等于 z,应使用 C 语言表达式________。 A.(x>=y) && (y>=z) B.(x>=y) AND (y>=z) C.(x>=y>=z) D.(x>=y) & (y>=z) 2.下列程序段的输出结果是________。 a=1; (a>1)?a:a++; printf("%d",a); A.1 B.2 C.3 D.4 3.下面程序运行后,如果从键盘上输入 5,则输出结果是_________。 #include "stdio.h" void main() { int x; scanf("%d",&x); if (x<5) printf("%d\n",x); else printf("%d",x++); } A.3 B.4 C.5 D.6 4.下面程序的输出结果是________。 #include "stdio.h" void main() { int x=3,y=0,z=0;
if (x= =y+z) printf("****"); else printf("# # # #"); } A.有语法错误,不能通过编译 B.**** C.可以通过编译,但是不能通过连接,因而不能运行 D.# # # # 5.下面程序的输出结果是________。 #include "stdio.h" void main() { int x=10,y=5,t=20; if (x=y) t=x; x=y; y=t; printf("%d%d\n",x,y); } A.5 20 B.5 5 C.10 5 D.5 10 6.以下不正确的 if 语句形式是_________。 A.if (x>y && x!=y) ; B.if (x==y) x+=y; C.if (x!=y) scanf("%d",&x) else scanf("%d",&y); D.if (x<y) { x++; y++;} 7.已知 int x=10,y=20,z=30;,以下语句执行后 x,y,z 的值是________。 if (x>y) z=x;x=y;y=z; A.x=10,y=20,z=30 B.x=20,y=30,z=30 C.x=20,y=30,z=10 D.x=20,y=30,z=20 8.下面 if 语法正确的是_________。 A.if (x>0) printf("%f",x); else printf("%f",x); B.if (x>0) { x=x+y; printf("%f",x); } else printf("%f",x); C.if (x>0) { x=x+y; printf("%f",x); }; else printf("%f",x); D.if (x>0) { x=x+y; printf("%f",x) } else printf("%f",x);
9.下面程序的运行结果是________。 #include "stdio.h" void main() { int a=5,b=0,c=0; if (a=b+c) printf ("***\n"); else printf ("$$$\n"); } A.有语法错误不能通过编译 B.可以通过编译但不能通过连接 C.输出 *** D.输出 $$$ 10.下面程序的结果是_________。 #include "stdio.h" void main() { int x=2,y=1,z=2; if (x<y) if (y<0) z=0; else z+=1; printf("%d\n",z); } A.3 B.2 C.1 D.0 11.下面程序输出的结果是_________。 #include "stdio.h" void main() { int i=5,j=9,x; x=(i==j?i:(j=7)); printf("\n%d,%d\n",i,j); } A.5,7 B.5,5 C.语法错误 D.7,5 三、填空题 1.正确表示逻辑关系: “a≥10 或 a≤0”的 C 语言表达式为________。 2.C 语言用________表示逻辑“真”值。 3.若从键盘输入 58,则下面程序输出的结果是________。 #include "stdio.h" void main() { int a; scanf("%d",&a); if(a>50) printf("%d ",a); if(a>40) printf("%d ",a+3); if(a>30) printf("%d ",a+6); }
4.下面程序的输出结果是________。 #include "stdio.h" void main() { float x= 2.0,y; if(x<0.0) y=0.0; else if (x<10.0) y=1.0/x; else y=1.0; printf("%f\n",y); } 5.以下程序运行后的输出结果是________。 #include "stdio.h" void main() { int a=3,b=4,c=5,t=99; if (b<a && a<c) t=a;a=c;c=t; printf("%d,%d,%d\n",a,b,c); } 6.以下程序运行后的输出结果是________。 #include "stdio.h" void main() { int a=10,b=4,c=3; if (a<b) a=b; if (a<c) a=c; printf("%d,%d,%d\n",a,b,c); } 7.下面程序的功能是:有三个整数 a,b,c,由键盘输入,输出其中最大的数。填空, 使程序完整。 #include "stdio.h" void main() { int a,b,c,temp,max; printf("请输入 3 个整数:"); scanf("%d,%d,%d",_________); temp=(a>b)?a:b; max=________; printf(" 3 个整数的最大值是%d\n",max); } 8.执行下面程序段后,x,y 的值是_________。 int x=11;y=1; if (x%2= =1) x+=5; else x=3; y+=5;
习题 2-2
一、判断题
1.else 总是和最近的 if 配对。( )
2 . 语 句 if (x>5) if (x<10) printf("5<AND<10\n"); 等 同 于 if ((x>5)&&(x<10)) printf ("5<AND<10\n");语句。( )
3.对于 switch 语句,在执行完某一分支的语句时,有没有 break 语句都能退出 switch 结 构。( ) 4.下面程序段中 case 后的 a*b 是错误的。( ) switch( c ) { case a*b: …… } 5.下面程序段,可以正确表示函数关系 x 1 x 0 y x x 0 x 1 x 0 - < ì ï =í = ï + > î 。( ) y=x1; if (x!=0) if (x>0) y=x+1; else y=x; 6.若运行时给变量 x 输入 12,则下面程序的运行结果是 22。( ) #include "stdio.h" void main() { int x,y; scanf ("%d",&x); y=x>12?x+10:x12; printf ("%d\n",y); } 7.当 a=3,b=2,c=1 时,表达式 f=a>b>c 的值是 0。 ( ) 8.当 a=5,b=4,c=2 时,表达式 a>b!=c 的值是 1。( ) 9.若 grade 的值为'C',则下列程序段的输出结果是“6069” 。 ( ) switch(grade) { case 'A': printf ("85100\n"); case 'B': printf ("7084\n"); case 'C':printf ("6069\n"); case 'D': printf ("<60\n"); default : printf ("error! \n"); }
二、单项选择题 1.为了避免嵌套的条件分支语句 if…else 的二义性,C 语言规定:C 程序中的 else 总是 与________组成配对关系。 A.缩排位置相同的 if B.在其之前未配对的 if C.在其之前未配对的最近的 if D.同一行上的 if 2.关于与 switch 语句配套的 case 语句中所使用的表达式,说法正确的是________。 A.只能是常量 B.可以是常量或变量 C.只能是常量或常量表达式 D.无论是常量还是变量,只要在执行时已经有确定的值就行 3.下面程序的输出结果是________。 #include "stdio.h" void main() { int a=2,b= 1,c=2; if (a<b) if (b<0) c=0; else c++; printf("%d\n",c); } A.0 B.1 C.2 D.3 4.下面程序的输出结果是________。 #include "stdio.h" void main() { int x=1,a=1,b=1; switch(x) { case 0: b++; case 1: a++; case 2: a++;b++; } printf("a=%d,b=%d\n",a,b); }
A.a=2,b=1 B.a=1,b=2 C.a=3, b=1 D.a=3,b=2 5.若有定义:int a=1,b=3,c=4; 则合法的 switch 语句是_________。 A.switch(a) ; B.switch(a+b) { case 1: printf("*\n"); { case 1 printf("*\n"); case 2: printf("**\n"); case c printf("**\n"); } } C.switch(b) D.switch(a+b); { case 1: printf("*\n"); { case 1: printf("*\n"); default: printf("\n"); case 4: printf("**\n"); case 1+2: printf("**\n"); default: printf("\n"); } }
6.下列程序的输出结果是_________。 #include "stdio.h" void main() { int i=3; switch(i) { case 1: case 2: printf("%d",i); case 3: case 4:break; default: printf("OK"); } } A.0 B.3 C.OK D.没有任何输出 7.下面程序的输出结果是_________。 #include "stdio.h" void main() { int s=0,k=0; switch(k) { case 1: case 4: case 7: s++; break; case 2: case 3: case 6: break; case 0: case 5: s+=2; break; } printf ("%d",s); } A.1 B.2 C.3 D.4 8.设有变量定义 int a=8,b=7,c=6,x=1;,执行下面语句后,变量 x 的值是________。 if(a>b) if(b>7) if(c>8) x=2; else x=3; A.3 B.2 C.1 D.0 三、填空题 1.下面程序段的功能是按下面的分段函数计算 y 的值。
1 x 0 0 x 0 y 1 0 x 1000 2 x 1000 - < ì ï = ï = í < < ï ï î ≥ if (x<0) y=1; else if(_________)y=0; else if(_________)y=1; else y=2; 2.下面程序的输出结果是________。 #include "stdio.h" void main() { int x,y,z; x=1;y=2;z=3; if(x>y) if(x>z) printf("%d",x); else printf("%d",y); printf("%d\n",z); } 3.下面程序的输出结果是________。 #include "stdio.h" void main() { int a=45,b=40,c=50,d; d=a>30?b:c; switch(d) { case 30:printf("%d,",a); case 40:printf("%d,",b); case 50:printf("%d,",c); default:printf("#"); } }
4.下面程序的功能是根据输入的是'y'('Y')、'n'('N'),在屏幕上分别显示出"This is Yes"与 "This is NO"。请填空。 #include "stdio.h" void main() { char ch; printf("\nEnter a char 'y','Y',or 'n','N':"); scanf("%c",&ch); switch(ch) { case 'y': case 'Y':printf("This is Yes\n"); ; case 'n': case 'N':printf("This is No\n"); ; } }
5.以下程序对输入的一个小写字母,将字母循环后移 5 个位置后输出。如'a'变成'f','w' 变成'b'。请在_________内填入正确内容。 #include "stdio.h" void main() { char c; c=getchar(); if(c>='a' && c<'v') __________________; else if(c>='v' && c<='z') __________________; putchar(c); } 6.将百分制转换为五分制,从键盘输入分数,然后按照如下规则输出:90~100 则输出 “优” , 80~89 则输出 “良” , 70~79 则输出 “中” , 60~69 则输出 “可” , 60 分以下则输出 “差” 。 #include "stdio.h" void main() { int s,n; scanf("%d",&s); if ________ printf("error!"); else ________; switch(n) { case 10: case 9: printf("优");break; case 8: printf("良");break; case 7: printf("中");break; case 6: printf("可");break; case 5: case 4: case 3: case 2: case 1: case 0: printf("差");break; } }
第 3 单元 循环结构程序设计
实训 3-1 循环结构程序设计(一)
一、实训目标 在实际生活中,人们在求累加、阶乘、迭代等运算时经常会用到循环结构。循环结构是 程序设计中一种很重要的结构。通过本实训的练习,理解循环结构的概念,掌握 for 语句的格 式和程序执行流程,理解循环嵌套,并可进行循环结构的程序设计。 二、实训任务 (一)课内 2 学时完成 1.编写程序,计算 s=1+2+3+4+…+100 的和并输出。 【提示】设循环控制变量为 i,初值设为 i=1,设累加和变量为 s,初值设为 0。首先判断 循环条件“i<=100”是否成立,若成立,执行循环体,然后,在循环体中,进行求和运算,循 环控制变量加 1,即 i++,之后,再判断循环条件“i<=100”是否成立,若成立,继续下一次 循环,依次类推,直到循环条件不成立时,终止循环。 运行程序后: 输出结果为: 5050 2.编写程序,计算并输出 n!的结果。 【提示】由于是乘法运算,存放结果的变量 s 初始值设为 1,运算结果的数值较大,将变 量 s 的数据类型设为 long 型。 运行程序后: 输入数据为: 8 输出结果为: 40320 3.编写程序,输出 1~100 之间,其数的平方在 300~600 之间的数,并统计这样的数有 多少个? 【提示】利用循环将数的范围控制在 1~100 之间,在循环体中,对 1~100 之间的数进 行判断该数的平方是否在 300~600 之间,如果满足条件,输出该数,并将计数变量加 1。如 果大于等于 100,则循环结束,输出满足条件的个数。 运行程序后:输出结果为: 其数的平方在 300 到 600 之间的数有:18 19 20 21 22 23 24 个数为:7 (二)课外 2 学时完成 1.统计输入字符串中的字符个数。 【提示】输入的字符串一般以换行符作为结束标志,即:'\n',若当前得到的字符不是换 行符,则进行下一次循环,直到当前得到的字符是换行符停止循环,循环条件可以写为: getchar()!='\n',该循环为无条件进行的循环,循环语句可以写为: “for( ; getchar()!='\n'; n++)” , 循环体为空语句,即: “;” ,变量 n 的结果即为字符个数。 程序运行后: 输入字符串为: Computer 输出结果为: 8 2.输出如下九九乘法表。 【提示】这是一个双层循环,实现 9 行 9 列的输出。外循环控制 1~9 行,即: for(i=1;i<=9;i++),内循环控制 1~9 列,注意内循环的循环条件,即:j<=i,循环语句为: for(j=1;j<=i;j++),输出表达式的语句为:printf("%d*%d=%d ",i,j,i*j);,此语句为内循环的循环 体语句,当内循环执行完毕后,应执行 printf("\n");语句使光标移到下一行。 运行程序,验证结果。 三、实训思考 1.循环体如果是由两条或两条以上的语句组成,编程时应该如何保证? 2. “for(i=1;i<=9;i++)”执行结束后,变量 i 的值是多少? 3. 死循环是什么含义?
实训 3-2 循环结构程序设计(二)
一、实训目标 C 语言除了 for 循环语句之外, 还提供了 while、 do… while 循环语句。 通过本实训的练习, 掌握 while、do… while 循环语句的格式和程序执行流程,理解 break、continue 语句及应用,可熟练进行循环结构程序设计。 二、实训任务 (一)课内 2 学时完成 1.利用 while 循环语句,计算 s=1+3+5+…+99 的和并输出。 【提示】设循环控制变量为 i,初值设为 i=1,设累加和变量为 s,初值设为 0。首先判断 循环条件“i<=99”是否成立,若成立,执行循环体,然后,在循环体中,进行求和运算,循 环控制变量加 2,即 i=i+2,之后,再判断循环条件“i<=99”是否成立,若成立,继续下一次 循环,依次类推,直到循环条件不成立时,终止循环。 程序运行后: 输出结果为: 2500 2.输出 50~100 之间所有不能被 7 整除的数,每行输出 6 个数。利用 do…while 循环语 句完成。 【提示】设一循环控制变量 n,其数值范围控制在 50~100 之间,可以利用 do…while 循 环语句实现,若条件“n%7==0”成立,则输出 n 的值,否则,使用“continue;”语句继续下 一次循环。为了实现每行输出 6 个数,在循环体中设一计数变量 k,其初值为 0,每输出一个 n 值,k 加 1,当“k%6==0”条件成立时,输出“\n” ,达到换行的目的。 程序运行后: 输出结果为: 3.编写程序,求出 80~500 之间第一个可以被 88 整除但个位数字不是 8 的数。 【提示】利用 for 循环语句来控制取值范围在 80~500 之间,利用条件“i%88==0”判断 变量 i 是否可以被 88 整除,若可以,再利用条件“i%10!=8”判断变量 i 的个位数字是否为 8, 若不是数字 8,则输出变量 i,而后利用“break;”终止循环。 程序运行后: 输出结果为: 176 (二)课外 2 学时完成 1.编程序实现,求出所有各位数字的立方和等于 1099 的三位整数。 【提示】可用三层循环实现。设最外层循环变量为 i(表示百位:1~9);次外层循环变 量为 j (表示十位: 0~9); 最内层循环变量为 k (表示个位: 0~9)。 若条件 “i*i*i+j*j*j+k*k*k= =1099”成立,则输出 i,j,k 的值即可。三位整数的范围是:100~999。 程序运行后:
输出结果为: 379 397 739 793 937 973 2.输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。 【提示】设一字符型变量 ch,利用“ch=getchar()”每次接受一个字符,循环条件为: “(ch=getchar())!='\n'” ,判断接收到的字符是否为'\n',若不是,则执行循环体。在循环体中使 用 if…else if…else 语句,分别进行“英文字母、数字、空格和其他字符”的判断,并分别对 统计数值的变量进行加 1,直到循环终止。 判断该字符是否是字母的条件表达式为:(ch>='a' && ch<='z' || ch>='A'&& ch<='Z') 程序运行后: 输入字符串为: My teacher’s address is “#123 Beijing Road,Shanghai.” 输出结果为: 字母个数=38,数字个数=3,空格个数=6,其他字符个数=6 3.利用循环编程,输出下面的数字三角形。 【提示】要输出这样的图形使用双循环实现。外循环控制图形的行数,内循环有 2 个: 第 1 个内循环控制每行输出的空格数目(每行输出的空格数递减);第 2 个内循环控制每行输 出的数字字符(每行输出的数字个数递增)。注意:外循环控制变量与内循环控制变量之间的 关系。 运行程序,观察输出结果。 三、实训思考 1.break 语句只能用于循环结构中吗? 2.continue;语句与 break;语句之间的区别是什么? 3.while 语句与 do…while 语句之间有什么区别?
实训 3-3 循环结构综合实训
一、实训目标 循环结构是程序设计中重要的程序结构之一。通过本实训的练习,加深对 for 循环、while 循环、do…while 循环语句的理解,掌握循环结构的编程技巧和方法,避免在程序中出现死循 环,能够应用三种循环语句解决实际应用问题。二、实训任务 (一)课内 2 学时完成 1.计算并输出表达式的值。 s=12+22+32+...+ n 2 【提示】从键盘上输入变量 n 的值,循环控制变量 i 的初值为 0,循环条件为 i<=n,循环 控制变量每次加 1。 程序运行后: 输入数据为: 10<回车> 输出结果为: s=385 2.输出 2000~2100 年中所有的闰年,要求每行输出 10 个年号。 【提示】闰年的条件:能被 4 整除但不能被 100 整除或者能被 400 整除,即:i%4==0 && i%100!=0) || (i%400==0),满足这个条件则输出该年号,并统计闰年的个数,当每行输出够 10 个则输出回车换行。使用循环语句改变年号。 程序运行后: 输出结果为: 3.有 1020 个西瓜,第 1 天卖一半多两个,以后每天卖剩下的一半多两个,问几天以后 能卖完?用 while 循环实现。 【提示】有 1020 个西瓜,第 1 天卖一半多两个,剩下的西瓜数是(西瓜总数/22),第 2 天卖第 1 天剩下的一半多两个,第 2 天剩下的西瓜数是((西瓜总数/22)/22),依次类推, 卖完为止,统计卖西瓜的天数。设西瓜数为 x,循环条件为“x!=0” ,每天剩下的西瓜数可以 表示为:(x/22)。 程序运行后: 输出结果为: 需要 8 天卖完西瓜。 (二)课外 2 学时完成 1.按照从小到大,输入两个正整数,输出这两个数之间不能被 6 整除的数(每行输出 10 个数)。 【提示】设两个变量 m、n 存放输入的两个数,判断输入两个数的大小,m 中存小数,n 中存大数,利用循环输出 m、n 之间不能被 6 整除的数,表达式“i%6==0”表示可以被 6 整 除。利用计数器变量控制每行输出 10 个数。 程序运行后: 输入数据为: 请输入两个正整数:6 20<回车> 输出结果为:
7 8 9 10 11 13 14 15 16 17 19 20 2.有一堆零件(100~200 之间),若分成 4 个零件一组则多 2 个零件;若分成 7 个零件 一组则多 3 个零件;若分成 9 个零件一组则多 5 个零件,求这堆零件总数。 【提示】设零件数为 i,根据已给条件:若分成 4 个零件一组则多 2 个零件(i%4==2);若 分成 7 个零件一组则多 3 个零件(i%7==3);若分成 9 个零件一组则多 5 个零件(i%9==5),利用 循环 for(i=100;i<=200;i++)计算出满足条件的变量 i 的值,即为零件总数。 程序运行后: 输出结果为: 零件总数为:122 3.在某一黑夜一司机碰伤行人之后落荒而逃,经过警方调查,有三个目击者。甲说: “车 牌号的前 2 位相同” 。乙说: “车牌号的后 2 位加起来等于 6” 。丙说: “车牌号是一个 4 位数, 并且能被 2 整除” 。根据上述提供的线索,编写程序找出肇事车可能的车牌号。 【提示】经过分析,要找的车牌号为 4 位数,只能在 1000~9999 之间进行排查。排查条 件为:具有前 2 位相同,后 2 位加起来等于 6 的特点,并且能被 2 整除。设车牌号为 x,四位 数字分别为 a、b、c、d,条件可写为: “a==b && c+d==6 && x%2==0” 运行结果如下: 三、实训思考 1.指出语句 for(i=0;(c=getchar())!='\n';i+=c);的循环体? 2.如何理解 continue 语句? 3.“do x++ while(x==10);” 语句正确吗?若有错误,请修改。
习题 3-1
一、判断题 1.for 循环中的三个表达式可以省略第一个表达式。( ) 2.for 循环中的步长可以任意设定。( ) 3.break 语句只适用于循环语句中。( ) 4.continue 语句和 break 语句功能相同,都用于结束循环。( ) 5.语句 for(i=1;i!=0;)是正确的。 ( ) 6.设 i,j,k 均为 int 型变量,执行下面的循环后,k 的值为 9。( ) for (i=0,j=10;i<=j;i++,j) k=i+j;二、单项选择题 1.执行下列循环语句 for(k=1; k++<4; ); 后,变量 k 的值是________。 A.3 B.4 C.5 D.不定 2.下面语句的输出结果为________。 for(k=0;k<5;++k) { if(k= = 3) continue; printf("%d",k); A.012 B.0124 C.01234 D.没有输出结果 3.循环语句 for (x=0; x<4;x++);的循环执行________。 A.无限次 B.不确定次 C.4 次 D.3 次 4.下面程序的功能是计算 1~50 之间可以是 7 的倍数的数值之和,请选择填空。 #include "stdio.h" void main() { int i,sum=0; for(i=1;i<=50;i++) if(________) sum+=i; printf("%d",sum); }
A.(int)(i/7)==i/7 B.(int)i/7==i/7 C.i%7=0 D.i%7==0 5.下面程序的功能是计算 1~10 之间的偶数之和,请选择填空。 #include "stdio.h" void main() { int a,i; a =0; for(i=0;i<=10;i+=2) _________; printf("偶数之和=%d\n",a); }
A.a=i B.a=i+1 C.a=i++ D.a=a+1 6.下面程序的运行结果是_________ #include "stdio.h" void main() { int i; for(i=1;i<=5;i++) switch (i%5) { case 0: printf ("*");break; case 1:printf("#");break; default:printf("\n"); case 2: printf("&"); } }
& & &* & * & * 三、填空题 1.下面程序的功能是:输出 100 以内(包括 100)个位数为 6 并且能被 3 整除的所有数。 #include "stdio.h" void main() { int k,j; for(k=0; ________; k++) { j=k*10+6; if( ________ ) continue; printf("%d\n",j); } } 2.下面程序的功能是:计算 13+57+…99+101 的值。 #include "stdio.h" void main() { int k,t=1,s=0,m; for(k=1; k<=101; k+=2) { ________; s=s+m; ________; } printf("%d\n",s); } 3.下面是实现输出九九乘法表的程序,在画线的位置填上适当的语句,使该程序完整。 #include "stdio.h" void main() { int i, j, k; for(i=1;________; i++) { for(________; j<=i ; j++) printf("%d*%d=%d",________); printf(_________); } } 4.根据给出的程序段,请写出正确的结果。 x=1; p=1, sum=0 ; for (x=1; x<=5; x++) { p=p*x;
sum=sum+p; } 上面的程序段实现的功能是计算下面的式子________; 其运行结果为_________。 5.下面程序运行后的输出结果是_________。 #include "stdio.h" void main() { int i,j,p,s; s=0; for (i=1;i<=4;i++) { p=1; for (j=1;j<=i;j++) p=p*j; s=s+p; } printf("s=%d\n",s); } 6.从键盘上输入 10 个数,求出其中的最大值与最小值。填空,将程序补充完整。 #include "stdio.h" void main() { int i,x,max,min; scanf("%d",&x); ________; for(i=2;i<=10;i++) { scanf("%d",&x); if (x>max) ________; if (x<min) ________; } printf("max=%d min=%d\n",max,min); } 7.输出 20~30 之间不能被 2 整除的数。填空,将程序补充完整。 #include "stdio.h" void main() { int k; for (k=20;k<=30;k++) { if(k%2==0) _________; printf("%d\t",k); } } 8.求 100 50 10 2 k 1 k 1 k 1 1 k k k = = = + +
å
å
å
。填空,将程序补充完整。 #include "stdio.h" void main(){ int n1=100,n2=50,n3=10; float k; ________; for(k=1;_________;k++) s1=s1+k; for(k=1;k<=n2;k++) s2=s2+k*k; for(k=1;k<=n3;k++) s3=s3+1/k; printf("总和=%8.2f\n",________); }
习题 3-2
一、判断题 1.do_while 的循环体不能使用复合语句。( ) 2.while 的循环体至少执行一次。( ) 3.如果 a 为 3,则语句“while(a) a;”执行的循环次数是 3 次。( ) 4.下列程序段的功能是求 5 的阶乘。( ) s=k=1; while(k<6) s*=k++; 5.如果“条件 e”不成立,则语句 s 至少执行 1 次。( ) do s; while(e); 6.while、do while、for 三种循环形式可以互相嵌套。( ) 7. “do 语句 while(条件) ”必须使用 break 语句退出循环。( ) 8.当条件为 0 时将结束“do 语句 while(条件) ”循环。( ) 二、单项选择题 1.在执行以下程序时,如果从键盘上输入,ABCdef<回车>,则输出为________。 #include"stdio,h" void main() { char ch; while((ch=getchar())!='\n') { if(ch>='A' && ch<='Z') ch=ch+32; else if(ch>='a' && ch<='z') ch=ch32; printf("%c",ch); }printf("\n"); }2.下面程序的输出结果是_________。 #include "stdio.h" void main() { int x=23; do { printf("%d",x); } while(!x); } A.321 B.23 C.死循环 D.不输出任何内容 3.执行下面程序段后的输出结果是________。 int k=1, a=0, b=1; do { a=a+b*k; b= b; k++; } while (a>=0); printf("%d",a); A.1 B.0 C.1 D.2 4.下面程序的输出结果是________。 #include "stdio.h" void main() { int x=3; do { printf("%d\n",x=2); }while(!(x)); } A.输出的是 1 B.输出的是 1 和2 C.输出的是 3 和 0 D.是死循环 5.有如下程序段,则正确的执行结果是________。 int m=3; while(m<=5) { printf("%d",m3); m++; } A.0 0 0 B.0 1 2 C.1 2 3 D.无结果 6.下面程序的功能是将从键盘输入的一对数,由小到大排序输出。当输入一对相等数时 结束循环,请选择填空。 # include "stdio.h" void main() { int a,b,c; scanf ("%d%d",&a,&b); while (_________) { if (a>b) { t=a;a=b;b=t; } printf ("%d,%d\n",a,b); scanf ("%d%d",&a,&b); }
}
A.!a=b B.a!=b C.a==b D.a=b 7.C 语言中 while 和 dowhile 循环的主要区别是_________。 A.dowhile 的循环体至少无条件执行一次 B.while 的循环控制条件比 dowhile 的循环控制条件严格 C.dowhile 允许从外部转到循环体内 D.dowhile 的循环体不能是复合语句 8.以下描述中正确的是_________。 A.dowhile 循环中循环体语句只能是一条可执行语句
B.dowhile 循环由 do 开始,在 while(表达式)后面不能写分号 C.在 dowhile 循环体中,一定有能使 while 表达式为“假”的操作 D.dowhile 循环中,根据情况可以省略 while 9.以下程序段_________。 x=1; do { x=x*x; } while (!x); A.是死循环 B.循环执行两次 C.循环执行一次 D.有语法错误 10.下面程序段输出的是________。 int x=3; do { printf ("%d\n",x=2; } while (!( x)); A.1 B.1 和2 C.3 和 0 C.是死循环 11.下面程序的输出结果是________。 #include "stdio.h" void main() { int n=9; while(n>6) { n; printf("%d",n); } } A.987 B.876 C.8765 D.9876 12.以下说法正确的是________。
A.continue 和 break 只能用在循环体中 B.continue 只能用在循环体中 C.break 只能用在循环体中 D.continue 只能用在循环体外 三、填空题
1.设有整型变量 k=4,则语句“while(k) k;”执行的循环次数是________。 2.dowhile 的循环体至少执行________次。
#include "stdio.h" void main() { int x=25; while(x>20 && x<30) { x++; if(x/6) { x++; break; } else continue; } printf("%d\n",x); } 4.下面程序是计算 10 个整数中奇数的和及其偶数的和,请填空。 #include <stdio.h> void main() { int a,b,c,i; a=c=0; for(i=1;i<=10;i++) { scanf("%d",&b); _____________ _____________ } printf("%d\n",a); printf("%d\n",c); } 5.下面程序的功能是:输出 100 以内(不包含 100)能被 3 整除且个位数为 6 的所有整 数,请填空。 #include<stdio.h> void main() { int i; for(i=1; _________; i++) if___________ } 6.下列程序段中循环体执行的次数是_________。 n=1234; do{ n/=10; }while (n);