1、2013年下半年软件水平考试(初级)程序员下午(应用技术)试题真题试卷及答案与解析 1 阅读以下说明和流程图,填补流程图中的空缺 (1) (5),将解答填入答题纸的对应栏内。【说明】 两个包含有限个元素的非空集合 A、 B的相似度定义为|AB|/|A B|,即它们的交集大小 (元素个数 )与并集大小之比。 以下的流程图计算两个非空整数集合 (以数组表示 )的交集和并集,并计算其相似度。已知整数组A1: m和 B1: n分别存储了集合 A和 B的元素 (每个集合中包含的元素各不相同 ),其交集存放于数组 C1: s,并集存放 于数组 D1: t,集合 A和 B的相似度存放于 SIM。 例如,假设
2、 A=1, 2, 3, 4, B=1, 4, 5, 6,则 C=1, 4),D=1, 2, 3, 4, 5, 6), A与 B的相似度 SIM=1 3。【流程图】2 阅读以下说明和 C函数,填充函数中的空缺,将解答填入答题纸的对应栏内。【说明】 下面的函数 sort(int n, int a)对保存在数组 a中的整数序列进行非递减排序。由于该序列中的元素在一定范围内重复取值,因此排序方法是先计算出每个元素出现的次数并记录在数组 b中,再从小到大顺序地排列各元素即可得 到一个非递减有序序列。例如,对于序列 6, 5, 6, 9, 6, 4, 8, 6, 5,其元素在整数区间4, 9内取值,因此使
3、数组元素 b0-b5的下标 0-5分别对应数值 4-9,顺序地扫描序列的每一个元素并累计其出现的次数,即将 4的个数记入 b0, 5的个数记入b1,依此类推, 9的个数记入 b5。最后依次判断数组 b的每个元素值,并将相应个数的数值顺序地写入结果序列即可。 对于上例,所得数组 b的各个元素值如下: 那么在输出序列中写入 1个4、 2个 5、 4个 6、 1个 8、 1个 9,即得 4, 5, 5, 6, 6, 6, 6, 8, 9,从而完成排序处理。【 C函数】 void sort(int n, int a) int*b; int i , k|number; int minimum=a0, m
4、aximum=a0; /*minimum和 maximum分别表示数组 a的最小、最大元素值 */ for(i=1; i n; i+) if(1)minimum=ai; else if(2)maximum=ai; number=maximum-minimum+1; if(number =1)return;b=(int*)calloc(number, Sizeof(int); if(!b) return; for(i=0; i n; i+)/*计算数组a的每个元素值出现的次数并记入数组 b*/ k=ai-minimum; +bk; /*按次序在数组 a中写入排好的序列 */ i= (3) ; f
5、or(k=0; k number; k+) for(; (4); -bk) ai+=minimum+ (5) ; 3 阅读以下说明和 C代码,填充代码中的空缺,将解答填入答题纸的对应栏内。 【说明 1】 下面的函数 countCharq(char*text)统计字符串 text中不同的英文字母数和每个英文字母出现的次数 (英文字母不区分大小写 )。 【 C代码 1】 int countChar(char *text ) int i, sum=0; /*sum保存不同的英文字母数 */ char*ptr; int c2 6=0; *数组 C保存每个英文字母出现的次数 * *c0记录字母 A或 a
6、的次数, c1记录字母 B或 b的次数,依此类推 * ptr= (1 ); *ptr初始时指向字符 串的首字符 * while(*ptr) if(isupper(*ptr) c*ptr-A+; else if(islower(*ptr) C*ptr-a+; ( 2); /*指向下一个字符 */ for(i=0; i int fl(int(*f)(int); int f2(int); int f3(int); int main() printf(“ d n“, fl(4); printf(” d n”, fl(5); return 0; int fl(int(*f)(int) int n=0;
7、/*通过函数指针实现函数调用,以返回值作为循环条件 */ while ( (6 ) ) n+; retUrn n; int f2(int n) printf(“f2: “); return n*n-4; int f3(int n) printf(“f3: “); return n-1; 4 阅读以下说明和 C程序,填充程序中的空缺,将解答填入答题纸的对应栏内。 【说明】 正整数 n若是其平方数的尾部,则称 n为同构数。例如, 6是其平方数 36的尾部, 76是其平方数 5776的尾部, 6与 76都是同构数。下面的程序求解不超过10000的所有同构数。 已知一位的同构数有三个: 1, 5, 6
8、,因此二位同构数的个位数字只可能是 1,5, 6这三个数字。依此类推,更高位数同构数的个位数字也只可能是 1, 5, 6这三个数字。 下面程序的处理思路是:对不超过 10000的每一个整数 a,判断其个位数字,若为 1、 5或 6,则将 a转换为字符串 as,然后对 a进行平方运算,并截取其尾部与as长度相等的若干字符形成字符串后与 as比较,根据它们相等与否来断定 a是否为同构数。 【 C程序】 #include #include #include int myitoa(int, char*); *将整数转换为字符串 * *right取得指定字符串尾部长度为 length的子串,返回所得子串
9、的首字符指针 * char*right(char*, int length); int main() int a, t; int len; char as1 0, rs2 0; printf(“1, 10000内的同构数: n“); for(a=1; aisEmergency = false; PoliceCar(b001 b) : Car(), Emergency() this一 isEmergency=b; PoliceCar() bool isEmergent() return (4 ); ) void runRedLight() *代码略 * ; /*类Ambulance、 FireE
10、ngine实现代码略 */ class Traficcontrolsystem *交通控制类 * private: Vehicle*v24; int numVehicles; *在构造函数中设置初始值为 0* public: void control() 控制在紧急情况 下应急车辆红灯通行,其他情况按常规通行 for(int i=0; i(Vi); if(ev!=0) (5 ) -runRedLight(); else (6)-run(); void add(Vehicle*vehicle) vnumVehicles+=vehicle; *添加车辆 * void shutDown()for(i
11、nt i=0; iadd(new Car(); tcs-add(new PoliceCar(); tcs-add(new Ambulance(); tcs-add(new Ambulance(true); tcs-add(new FireEngine(true); tcs-add(new FireEngine(); tcs-add(new Truck(); tcs-control(); tcs-shutDown(); delete tcs; 6 阅读以下说明和 Java代码,填充程序中的空缺,将解答填入答题纸的对应栏内。 【说明】 某应急交通控制系统 (TraficControlSystem)
12、在红灯时控制各类车辆 (Vehicle)的通 行,其类图如图 6 1所示,在紧急状态下应急车辆在红灯时可通行,其余车辆按正常规则通行。下面的 Java代码实现以上设计,请完善其中的空缺。 Java代码 abstract clasS Vehicle public Vehicle() abstract void run(); , interface Emergency (1) ; (2) ; ; ClasS Car extends VehiCle public Car() void run() *代码略 * , Class Truck extends Vehicle publiC Truck()
13、void run() *代码略 * ; clasS PoliceCar (3) boolean isEmergency= false; public PoliceCar() public PoliceCar(boolean b) f thiS isEmergency=b; public boolean isEmergent() return ( 4); public void runRedLight() *代码略 * , /*类 Ambulance、 FireEngine实现代码略 */ public class Traficcontrolsystem *交通控制类 * private Veh
14、iclev=new Vehicle2 4; int numVehicleS; public void control() for(int i=0; i numVehicleS;i+) if(viinstanceof Emergency(Emergency)Vi) isEmergent() ( (5 ) ) runRedLight(); else (6) run(); void add(Vehicle vehicle) vnumVehicles+=vehicle; *添加车辆* void shutDown() *代码略 * public static void main(Stringargs)
15、TraficControlSystem tcs = new TraficControlSystem(); tcs add(new Car(); tcs add(new PoliceCar(); tcs add(new Ambulance(); tcs add(new Ambulance(true); tcs add(new FireEngine(true); tcs add(new Truck(); tcs add(new FireEngine(); tcs control(); tcs shutDown(); 2013年下半年软件水平考试(初级)程序员下午(应用技术)试题真题试卷答案与解析
16、1 【正确答案】 (1)s (2)t (3)Cs (4)Dt (5)s t 【试题解析】 首先我们来理解两个有限集合的相似度的含义。两个包含有限个元素的非空集合 A、 B的相似度定义为它们的交集大小 (元素个数 )与并集大小之比。如果两集合完全相等,则相似度必然为 1(100 );如果两集合完全不同 (没有公共元素 ),则相似度必然为 0;如果集合 A中有一半元素就是集合 B的全部元素,而另一半元素不属于集合 B,则这两个集合的相似度为 0 5(50 )。因此,这个定义符合人们的常理性认识。 在大数据应用中,经常要将很多有限集进行分类。例如, 每天都有大量的新闻稿。为了方便用户检索,需要将新闻
17、稿分类。用什么标准来分类呢 ?每一篇新闻稿可以用其中所有的关键词来表征。这些关键词的集合称为这篇新闻稿的特征向量。两篇新闻稿是否属于同一类,依赖于它们的关键词集合是否具有较高的相似度 (公共关键词个数除以总关键词个数 )。搜索引擎可以将相似度超过一定水平的新闻稿作为同一类。从而,可以将每天的新闻稿进行分类,就可以按用户的需要将某些类的新闻稿推送给相关的用户。 本题中的集合用整数组表示,因此,需要规定同一数组中的元素各不相同 (集合中的元素是各不相同的 )。题中 ,整数组 A1: m和 B1: n分别存储了集合 A和B的元素。流程图的目标是将 A、 B中相同的元素存放入数组 C1: s(共 s个
18、元素 ),并将 A、 B中的所有元素 (相同元素只取一次 )存放入数组 D1: t(共 t个元素 ),最后再计算集合 A和 B相似度 s t。 流程图中的第一步显然是将数组 A中的全部元素放入数组 D中。随后,只需要对数组 B中的每个元素进行判断,凡与数组 A中某个元素相同时,就将其存入数组 C;否则就续存入数组 D(注意,数组 D中已有 m个元素 )。这需要对 j(遍历数组 B)与 i(遍历数组 A)进行两重循环。判断 框 BD=Ai成立时, BD应存入数组c;否则应继续 i循环,直到循环结束仍没有相等情况出现时,就应将 B啪存入数组 D。存入数组 C之前,需要将其下标 s增 1;存入数组
19、D之前,需要将其下标 t增 1。因此,初始时,应当给 j赋 0,使数组 C的存数从 C1开始。从而, (1)处应填 s, (3)处应填 Cs。而数组 D是在已有 m个元素后续存,所以,初始时,数组D的下标 t应当是 m,续存是从 Dm+1开始的。因此, (2)处应填 t, (4)处应填Dt。 两重循环结束后,就要计算相似 度 s t,将其赋予 SIM,因此 (5)处应填 s t。 2 【正确答案】 (1)aimaximum,或 ai=maximum,或其等价形式 (3)0 (4)bk,或 bk0,或 bk!=0,或其等价形式 (5)k 【试题解析】 本题考查 C程序的基本语法和运算逻辑。 首先
20、应认真分析题目中的说明,然后确定代码结构和各变量的作用。 空 (1)和 (2)所在 for语句的功能是求出数组 a中的最小元素 minimum和最大元素maximum。在设置了 minimum和 maximum的初始值后,空 (1)处的判断条件是只要目前的元素 ai小于 minimum,就需要更新 minimum,反之,空 (2)处的判断条件是只要目前的元素 ai大于 maximum,就需要更新 maximum,因此空 (1)处应填入 aimaximum或其等价方式。 minimum和 maximum的作用是要确定计数数组 b的大小。 根据题目中的描述,序列中的每个元素 ai都对应到计数数组
21、b的一个元素bk,对应方式为: k=ai一 minimum,其中 minimum是数组 a中的最小元素,显然在计数时,一个数值出现一次,就在对应的 bk中累加一次。 空 (3) (5)所在的语句组是产生排序后的序列,重新写入数组 a。首先需明确变量 i和 k的作用,根据它们在该语句组中的出现位置, i用于表示数组 a的元素下标, k用于表示数组 b中元素的下标,因此,空 (3)处应填入 0,使得从数组 a中下标为 0的数组元素开始。通过循环控制 “for(1k=0; k0”或其等价形式。由于 bk中记录的是元素k+minimum的出现次数,所以空 (5)处应填入 “k”,从而将元素值恢复后再写
22、回去。 3 【正确答案】 (1)text,或 &text0,或其等价形式 (2)ptr+,或 +ptr,或 ptr=tr+1,或 ptr+=1 (3)ci,或 *(c+i) (4)f2 (5)f3 (6)f(n),或 (*f)(n) 【试题解析】 本题考 查数据指针、运算逻辑和函数指针的应用。 首先应认真分析题目中的说明,然后确定代码结构和各变量的作用。 在函数 countChar(char*text中来统计字符串 text中不同的英文字母数和每个英文字母出现的次数。用来表示计数值的数组元素 ci需要与英文字母对应起来,方式为 c0记录字母 A或 a的次数, c1记录字母 B或 b的次数,依此
23、类推,因此i=英文字母 A (英文字母为大写 )或 i=英文字母 -a(英文字母为小写 )。 数据指针是指向数据的指针变量。数据指针 ptr用来表示。 text中的每一个字符,初始时 ptr指向第一个字符,因此空 (1)处应填入 “text“或其等价方式, (2)处的作用是随循环控制逐个指出 text中的后续字符,因此空 (2)处应填入 “ptr+”或其等价方式。 显然,若 ci的值不为 0则表示字符 A+i或 a+i出现了,反之,则表示字符A+i或 a+i未出现,因此在计算字符种类时只要判断 ci是否为 0即可,因此空(3)处应填入 “ci”或其等价形式。 函数指针是指向函数的指针变量。根据
24、代码 2的声明 “int fl(int(*f)(int); ”可知调用函数 f1时,实参应该是函数名或函数指针,且函数名或函数指针指向的函数应有一个整型参数,返回值为整型,而 f2和 f3都是符合这种定义类型的函数。 C代码 2中,在 main函数中两次调用了函数 f1,分析运行结果可知,是先以 f2为实参调用 f1,然后以 f3为实参调用 f1,因此空 (4)和 (5)分别填入 “f2”或 “f3”或它们的等价形式,在空 (6)处应填入 “f(n)”或其等价形式来实现最后对 f2和 f3的调用。 while ( (6 ) ) n+; retUrn n; int f2(int n) print
25、f(“f2: “); return n*n-4; int f3(int n) printf(“f3: “); return n-1; 4 【正确答案】 (1)a 10,或其等价形式 (2)right(rs,len) 【试题解析】 本题考查 C语言语法、数据指针和运算逻辑的应用。 首先应认真分析题目中的说明,然后确定代码结构和各 变量的作用。 根据题目中的叙述,同构数的个位数为 1、 5或 6,因此,对于不超过 10000的每个整数,应先获取其个位数字,因此空 (1)处应填入 “a 10”或其等价形式,从而可以 先过滤掉不可能是同构数的数。 根据代码中的注释,通过以下运算后,得到由 a中数值转换
26、所得的字符串 as,以及 a的平方所得数值转换得到的字符串 11s,此后通过字符串比较运算来判断是否为同构数。 len=myitoa(a, as); *数 a转换为字符串,存入 as* myitoa(a*a, rs); *数 a的平方转换为字符串,存入 rs* 函数 myitoa(mnUITI, char*s)的功能是将整数 num转换为字符串 s,这就需要将整数 hum的每个数字分离出来,通常通过整除取余运算实现,即以下代码所实现的。 while(num) *从个位数开始,取 num的每一位数字转换为字符后放入 s* sn+ = (3) + 0; num=num 10; sn= 0; 其中,
27、空 (3)处应填入 “hum 10”或其等价形式。 函数 right(char*ms, int length)取字符串 ms尾部长度为 length的子串,返回所得子串的首字符指针。该函数的处理思路是先找到 ms中字符串的结尾,然后倒着数出 length个字符,从而得到所需字符串的首字符指针。空 (5)处应填入 “i+,ms-”或其等价形式。 另一个更简便的方式是在得到 ms的结尾指针后,再减去 length即可,即最后返回 ms-length即可。 5 【正确答案】 (1)virtual bool isEmergent() (2)virtual void runRedLight() (3)p
28、ublic Car,public Emergency (4)this-isEmergency (5)ev (6)vi 【试题解析】 本题考查 C+语言程序设计的能力,涉及类、对象、函数的定义和相关操作。要求考生根据给出的案例和执行过程说明,认真阅读理清程序思路,然后完成题目。 根据题目描述,以交通控制系统 (TraficControlSystem)为背景,本题目中涉及的各类车辆和是否应急状态下在红灯时的通行情况。根据说明进行设计,题目给出了类图 (图 5 1类图所示 )。 图中父类 Vehicle代表交通工具,设计为抽象类,包含一个方法: run(),表示行驶某一个具体的交通工具对象,行驶的方
29、法由具体子类型完成,所以 Vehicle的run()为一个纯虚函数: Car和 Truck都继承自 Vehicle的两个子类型,所以它们都继承了 Vehicle的run()方法,各自行驶方式有所不同,所以都覆盖了 Vehicle的 run()方法,并加以实现: void run() *代码略 * Car的两个子类型 PoliceCar和 Ambulance都继承自 Car,从而 PoliceCar和Ambulance也都继承了 Car中的 run()方法。 Truck的子类 FireEngine也继承了Truck中的 run()方法。 图中接口 Emergency在 C+中采用抽象基类的方法实
30、现,其中约定红灯时通行的相关接口函数为: isEmergent0和 nmRedLight0,均为纯虚函数,原型中 =0表示纯虚函数,实现由子类完成: virtual bool isEmergent()=0; virtual void runRedLight() =0; isEmergent0函数接 121约定应急车辆返回自身紧急情况状态,用 bool类型的isEmergency表示: this isEmergency,其值在紧急情况下为 bool值 true,非紧急情况下为 bool值 false。 runRedLight0函数接口约定应急车辆在红灯时如何通行(isEmergency为 tru
31、e,则通行, isEmergency为 false,和普通车辆一样通行 )。Emergency的子类有 PoliceCar、 Ambulance和 FireEngine,所以在这三个类中都要实现 Emergency中定义的纯虚函数接口。 交通控制类 TraficControlSystem对运行的交通工具进行控制,所有交通工具用Vehicle数组 v表示; numVehicles表示交通工具数量; control函数进行控制在紧急情况下应急车辆红灯通行,其他情况按常规通行; add0表示有车辆加入系统,shutDown()在系统关闭时清除每个对象数组元素: delete vi; Vehicle的
32、子类具体类型有 Car、 Truck、 PoliceCar、 Ambulance和 FireEngine,所以 v口数组中对象有这些类型的对 象,加入 v时会自动向上转型成为 Vehicle类型,而实现了Emergency接口的应急车辆有 runRedLight()函数,其他 Car和 Truck只有 run()函数。因此,用 for循环对每个 vi,判定是否是 Emergency类型,即是否继承了Emergency,调用时动态绑定每个数组元素的实际类型,需要通过动态类型转换: Emergency*ev=dynamic_cast(vi); 如果转换成功,说明是Emergency的子类,实现了
33、nmRedLight(),可以调用 rtmRedLight(),否则调用run(): if(ev !=0) ev-runRedLight(); else vi-run(); 主控逻辑代码在 main函数中实现。初始化 TraficControlSystem,用 tcs表示,调用 tcs的 add()函数添加具体的交通工具,这里会自动向上转型成为 Vehicle类型,调用 control() 对各车辆进行控制,调用 shutDown()系统关闭,使用完数组对象之后,需要用 delete操 作进行释放对象,即 delete tcs; 因此,空 (1)和空 (2)需要定义纯虚函数 isEmergen
34、t()和 runRedLight(),原型中 =0题目代码中已经给出,所以空 (1)和空 (2)分别为 “virtual bool isEmergent0“和“virtual void nmRedLight()”;空 (3)需要继承 Car和 Emergency,即 “public Car,public Emergency”: 空 (4)要返回应急车辆对象的状态,即 “this-isEmergency”;空 (5)处动态类型转换成功的对 象 ev;空 (6)处为普通车辆对象 vi。 6 【正确答案】 (1)boolean isEmergent() (2)void runRedLight0 (3
35、)extends Car implements Emergency (4)this isEmergency (5)(Emergency)vi (6)vii 【试题解析】 本题考查 Java语言程序设计的能力,涉及类、对象、方法的定义和相关操作。要求考生根据给出的案例和执行过程说明,认真阅读理清程序思路,然后完成题目。 根据题目说明, 以交通控制系统 (TraficControlSystem)为背景,本题目中涉及的各类车辆和是否应急状态下在红灯时的通行情况。根据说明进行设计,题目给出了类图 (图 6 1类图所示 )。 图中父类 Vehicle,代表交通工具,设计为抽象类。在 Java用 abst
36、ract关键字表示,表示行驶某一个具体的交通工具。 Vehicle包含一个抽象方法: run( ),方法后没有实现,直接用;来表示抽象方法,表示行驶的方法由具体子类型完成,所以Vehicle的 run( )为一个抽象方法: abstract void run( ); Car和 Truck都继承自 Vehicle的两个子类型,所以他们都继承了 Vehicle的run0法,各自行驶方式有所不同,所以都覆盖了 Vehicle的 ruIl( )方法,并加以实现: void run( ) *代码略 * Car的两个子类型 PoliceCar和 Ambulance都继承自 Car,从而 PoliceCar
37、和Ambulance 也都继承了 Car中的 run()方法。 Truck的子类 FireEngine也继承了 Truck的run( )方法。 图 6-1中 Emergency在 Java中采用接口实现,其中约定红灯时通行的相关接口为: isEmergent0和 runRedLight0。 isEmergent( )接口约定应急车辆返回自身紧急情况状态,用 bool类型的isEmergency表示: this isEmergency,其值在紧急情况下为 true,非紧急情况下为 false。 runRedLight0接口约定应急车辆在红灯时如何通行 (isEmergency为true,则通行,
38、 isEmergency为 false,和普通车辆一样通行 )。实现 Emergency的类有 PoliceCar、 Ambulance和 FireEngine,所以在这三个类中都要实现Emergency中定义的接口。在 Java中,实现接口用 implements关键字,后面加上所要实现的接 El,即: Clas sName implements InterfaceName 交通控制类 TraficControlSystem对运行的交通工具进行控制,所有交通工具用Vehicle数组 v表示; numVehicles表示交通工具数量; control函数进行控制在紧急情况下应急车辆红灯通行,其
39、他情况按常规通 行; add()表示有车辆加入系统,shutDown()表示系统关闭。 Vehicle的子类具体类型有 Car、 Truck、 PoliceCar、Ambulance和 FireEngine,所以 v 数组中对象有这些类型的对象,加入 v时会自动向上转型成为 Vehicle类型, Emergency接口的应急车辆有 runRedLight( )方法,其他 Car和 Truck只有 run( )方法。因此,用 for循环中对每个 vi,判定是否是 Emergency类型的实例,即是否实现了 Emergency。 Java中判断一个对 象是否是某个类型的实例用 instanceof
40、关键字。即: vi instanceof Emergency,如果是,说明是应急车辆,接着判定应急车辆的状态,在判定之前先要将应急车辆进行向下转型, Java中向下转型直接在对象前加上用括号括起来的转换的目标类型即可,即: (Emergency)vi) isEmergent(),如果判定为真,执行runRedLight( ),判定不成功,则调用 run( ),调用时动态绑定每个数组元素的实际类型,需要通过动态类型转换并调用 runRedLight0: if(Viinstanceof Emergency (Emergency)Vi) isEmergent( ) (Emergency)Vi) ru
41、nRedLight( ); el se vi-run()j 主控逻辑代码在 main方法中实现。初始化 TraficControlSystem,用 tcs表示,调用 tcs的 add()函数添加具体的交通工具,这里会自动向上转型成为 Vehicle类型,调用 control( ) 对各车辆进行控制,调用 shutDown( )系统关闭。 因此,空 (1)和空 (2)需要定义接口 isEmergent0和 nmRedLight0,题目代码中已经给出用分号结尾,所以空 (1)和空 (2)分别为 “bool isEmergent( )“和 “void runRedLight( )”;空 (3)需要继承父类 Car和实现接口 Emergency, Java中继承采用 extends关键字,即应填入 “extends Car implements Emergency”;空 (4)要返回应急车辆对象的状态,即填入 “this isEmergency”;空 (5)处为动态类型转换后的对象 (Emergency)vi;空 (6)处为普通车辆对象 vi。
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1