• 沒有找到結果。

C语言程序设计综合实训(第二版) - 万水书苑-出版资源网

N/A
N/A
Protected

Academic year: 2021

Share "C语言程序设计综合实训(第二版) - 万水书苑-出版资源网"

Copied!
32
0
0

加載中.... (立即查看全文)

全文

(1)

第 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 层, 输入数据错误,请重新输入! ” 。 【提示】电梯控制程序需要对所输入的楼层数进行判断,然后决定显示何种提示,可利

(2)

用 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 值:

(3)

输入数据:  ­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*x­11。 (1)第一次运行程序,屏幕显示提示信息: 请输入 x 值: 输入数据:  0.5<回车>  屏幕显示结果:  y=0.50  (2)第二次运行程序,屏幕显示提示信息: 请输入 x 值: 输入数据:  8<回车>  屏幕显示结果:  y=8.12  (3)第三次运行程序,屏幕显示提示信息: 请输入 x 值: 输入数据:  12<回车>  屏幕显示结果:  y=49.00  注意:数据输出格式。本程序输出 y 值使用“%0.2f”格式,也可以自定格式。

(4)

三、实训思考  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)

良好 (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,若为假,继续判断后面的条

(6)

件,依次类推。 (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<回车>

(7)

屏幕显示结果:  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

(8)

同学们可以输入多组数据验证程序的正确性。  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,按照运算标志进行指定的计算。运算标志与运算之间 的关系如表 2­1 所示。 【提示】根据标志判断执行哪种操作,若标志等于'a',计算并输出圆面积;若标志等于'b',

(9)

计算并输出圆周长;若标志等于'c',计算并输出圆面积和圆周长。分别用  if 语句和  switch 语 句实现。 表 2­1  运算标志与运算之间的关系 标志 运算  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  元,重量与收费标准之间的关系如表  2­2 所示(邮资=手续费+重量*收费标准) 。 表 2­2  重量与收费标准之间的关系 重量(千克) 收费标准(元)  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)第二次运行程序,屏幕显示: 请输入包裹的长、宽、高、重量:

(10)

输入数据为:  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+(c­t)*60 否则 m=t*90+(c­t)*60  ② 当裤子多于上衣,即 t>c,如果 c>=50 则 m=c*80+(t­c)*45 否则  m=c*90+(t­c)*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 代表“假” 。 ( )

(11)

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;

(12)

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);

(13)

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);  }

(14)

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;

(15)

习题 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=x­1;  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:x­12;  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',则下列程序段的输出结果是“60­69” 。 ( )  switch(grade)  {  case 'A': printf ("85­100\n");  case 'B': printf ("70­84\n");  case 'C':printf ("60­69\n");  case 'D': printf ("<60\n");  default : printf ("error! \n");  }

(16)

二、单项选择题  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");  }  }

(17)

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 的值。

(18)

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");  ;  }  }

(19)

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;  }  }

(20)

第 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,则循环结束,输出满足条件的个数。 运行程序后:

(21)

输出结果为: 其数的平方在 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 语句及应用,

(22)

可熟练进行循环结构程序设计。 二、实训任务 (一)课内 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。 程序运行后:

(23)

输出结果为:  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 循环语句的理解,掌握循环结构的编程技巧和方法,避免在程序中出现死循 环,能够应用三种循环语句解决实际应用问题。

(24)

二、实训任务 (一)课内 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 天卖一半多两个,剩下的西瓜数是(西瓜总数/2­2),第 2  天卖第 1 天剩下的一半多两个,第 2 天剩下的西瓜数是((西瓜总数/2­2)/2­2),依次类推, 卖完为止,统计卖西瓜的天数。设西瓜数为  x,循环条件为“x!=0” ,每天剩下的西瓜数可以 表示为:(x/2­2)。 程序运行后: 输出结果为: 需要 8 天卖完西瓜。 (二)课外 2 学时完成  1.按照从小到大,输入两个正整数,输出这两个数之间不能被 6 整除的数(每行输出 10  个数)。 【提示】设两个变量 m、n 存放输入的两个数,判断输入两个数的大小,m 中存小数,n  中存大数,利用循环输出 m、n 之间不能被 6 整除的数,表达式“i%6==0”表示可以被 6 整 除。利用计数器变量控制每行输出 10 个数。 程序运行后: 输入数据为: 请输入两个正整数:6    20<回车>  输出结果为:

(25)

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;

(26)

二、单项选择题  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("&");  }  }

(27)

&  &  &*  &  *  &  * 三、填空题  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.下面程序的功能是:计算 1­3+5­7+…­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;

(28)

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()

(29)

{  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=ch­32;  printf("%c",ch);  }printf("\n");    } 

(30)

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",m­3);  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);  }

(31)

A.!a=b  B.a!=b  C.a==b  D.a=b  7.C 语言中 while 和 do­while 循环的主要区别是_________。  A.do­while 的循环体至少无条件执行一次  B.while 的循环控制条件比 do­while 的循环控制条件严格  C.do­while 允许从外部转到循环体内  D.do­while 的循环体不能是复合语句  8.以下描述中正确的是_________。  A.do­while 循环中循环体语句只能是一条可执行语句 

B.do­while 循环由 do 开始,在 while(表达式)后面不能写分号  C.在 do­while 循环体中,一定有能使 while 表达式为“假”的操作  D.do­while 循环中,根据情况可以省略 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.do­while 的循环体至少执行________次。 

(32)

#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);

參考文獻

相關文件

題目設計 ( 總分:26 分 ) 初階提問(18 分)、進階提問 (8

二、本案中等師資類科學生(特教系以外之學生)修習之「教育專業課程版本」應為106年11月17日教育部臺教師(二)字第

近年,各地政府都不斷提出相同問題:究竟資訊科技教育的投資能否真正 改善學生的學習成果?這個問題引發很多研究,嘗試評估資訊科技對學習成果 的影響,歐盟執行委員會聘請顧問撰寫的

Jack Little(又稱為 John Little)將 MATLAB 以 C 語言重 寫,並於 1984 年成立 MathWorks 公司,首次推出 MATLAB 商用版。.. MathWorks 在

Jack Little(又稱為 John Little)將 MATLAB 以 C 語言重 寫,並於 1984 年成立 MathWorks 公司,首次推出 MATLAB 商用版。.. MathWorks 在

学与教资源 弹力带肌肉训练

Ma, T.C., “The Effect of Competition Law Enforcement on Economic Growth”, Journal of Competition Law and Economics 2010, 10. Manne, H., “Mergers and the Market for

參考:社會福利署《處理親密伴侶暴力個案程序指引 (二零一一年修訂版) 》、配偶施暴危險評估 (Spousal Assault Risk Assessment, SARA) 及 Guideline on Guidance on Investigating