1、2016年下半年软件水平考试(初级)程序员下午(应用技术)真题试卷及答案与解析 1 阅读以下说明和流程图,填补流程图中的空缺,将解答填入答题纸的对应栏内。【说明】设有整数数组 A1: N(N1),其元素有正有负。下面的流程图在该数组中寻找连续排列的若干个元素,使其和达到最大值,并输出其起始下标 K、元素个数 L以及最大的和值 M。例如,若数组元素依次为 3,一 6, 2, 4,一 2, 3,一1,则输出 k=3, L=4, M=7。该流程图中考察了 A1: N中所有从下标 i到下标j(ji)的各元素之和 S,并动态地记录其最大值 M。【流程图】注:循环开始框内应给出循环控制变量的初值和终值,默
2、认递增值为 1,格式为:循环控制变量 =初值,终值 1 阅读以下代码,回答问题 1至问题 3,将解答填入答题纸的对应栏内。 【代码 1】 #include Void swap(int x, int y) int tmp=x; x=y; y=tmp; int main() int a=3, b=7; printf(“a1= d b1= d n”, a, b); swap(a, b); printf(“a2= d b2= d n”, a, b); return 0; 【代码 2】 #include #define SPACE 空格字符 int main() char str128=“Nothing
3、 is impossible! ”; int i, num=0, wordMark=0; for(i=0; stri; i+) if(stri: =SPACE) wordMark=0; else if(wordMark=0) wordMark=1; num+; printf(“ d n”, num); return 0; 【代码 3】 #include #define SPACE 空格字符 int countStrs(char*); int main() char str128=“Nothing is impossible! ”; printf(“ d n”, (1)(str); return
4、 0; int countStrs(char*p) int num=0, wordMark=0; for(;(2); p+) if( (3) =SPACE) wordMark=0; else if(!wordMark)( WordMark=1; +num return (4); 2 写出代码 1运行后的输出结果。 3 写出代码 2运行后的输出结果。 4 代码 3的功能与代码 2完全相同,请补充代码 3中的空缺,将解答写入答题纸的对应栏内。 5 阅读以下说明和代码,填补代码中的空缺,将解答填入答题纸的对应栏内。 【说明】 下面的程序利用快速排序中划分的思想在整数序列中找出第 k小的元素 (即 将
5、元素从小到大排序后,取第 k个元素 )。 对一个整数序列进行快速排序的方法是:在待排序的整数序列中取第一个数作为基准值,然后根据基准值进行划分,从而将待排序的序列划分为不大于基准值者 (称为左子序列 )和大于基准值者 (称为右子序列 );然后再对左子序列和右子序列分别进行快速排序,最终得到非递减的有序序列。 例如,整数序列 “19, 12, 30, 11, 7, 53, 78, 25”的第 3小元素为 12。整数序列“19, 12, 7, 30, 11, 11, 7, 53, 78, 25, 7”的第 3小元素为 7。 函数 partition(int a, int low,int high)
6、以 alow的值为基准,对 alow,alow+1, ahigh 进行划分,最后将该基准值放入 ai(lowihigh),并使得alow, alow+1, ai 1都小于或等于 ai,而 ai+1, ai+2, ahigh 都大于ai。 函数 findkthElem(int a, int startldx, int endldx, int k)在 astartldx,astartldx+1 , aendIdx中找出第 k小的元素。 【 代码】 #include #include int partition(int a, int low, int high) 对 alow high进行划分,使得
7、 alow i中的元素都不大于ai+1 high中的元素。 int pivot=alow; pivot表示基准元素 int i=low, j=high; while( (1) ) while(ipivot)一一 j; ai=aj; while(iendIdx kendIdx k一 1name=name; string getName() return name; void sendMessage(string message); ; class ChatRoom public: static void showMessage(User*user, string message) coutget
8、Name() sendMessage(“Hi!Leo!”); li-sendMessage(“Hi!John!”); void join(User*user) (3) (“Hello Everyone!I am”+user一 getName(); ; int main() chatRoomsystem* crs =(4) ; crs一 startup(); crs-join(*(5)(“Wayne”); delete crs; *程序运行结果: John:Hi!Leo!Leo: Hi!John!Wayne: Hello Everyone!I am Wayne* 2016年下半年软件水平考试(初
9、级)程序员下午(应用技术)真题试卷答案与解析 1 【正确答案】 (1)i,N或 i,N, l或等效形式 (2)S+Aj或等效形式 (3)S (4)ji+1或等效形式 (5)S 【试题解析】 本题考查程序员对算法流程进行设计的能力。 既然要考察整数数组 A1: N中所有从下标 i到下标 j(ji)的各元素之和 S,因此需要执行对 i和 j的双重循环。显然,对 i的外循环应从 l到 N进行。在确定了 i后,可以从 Ai开始依次将元素 Aj累加到 S中。所以,对 j的内循环应从 i开始直到 N,以保持 (ji)。因此空 (1)处应填入 “i, N”,而空 (2)处应填写 “S+Aj”。 为了在内循环
10、中累计计算若干个连续元素之和 S,在 i循环之后, j循环之前,首先应将 S清 0。 由于已知数组元素中有正数,所以 S的最大值 M肯定是正数,因此,流程图一开始就应将 M赋值 0,以后,每当计算出一个 S,就应将其与 M比较。当 SM时,就应将 S的值送入 M(替代原来的值 )。因此,空 (3)处和 (5)处都应填写 “S”。此时,从下标 i到 j求和各元素的开始下标 K为 i,个数 L为 ji+1,因此,空 (4)处应填写 “j-i+1”。 2 【正确答案】 a1=3 b1=7, a2=3 b2=7 【试题解析】 本问题考查函数调用时的参数传递。 C语言仅支持传值调用方式,实参传递给形参的
11、值可以是数值,也可以是地址值。根据题目中给出的函数 swap(int x, int y)定义信息,在 main中执行函数调用“swap(a, b)”时,是将实参 a的值传递给形参 x、实参 b的值传递给形参 y,这个传递过程是单方向的,此后再执行 swap中的操作时, x、 y的修改与 a、 b再无关联,因此在 main函数中, a和 b的值没有变化 。 3 【正确答案】 3 【试题解析】 本问题考查程序的基本结构和运算逻辑。 首先确定变量的作用, num用来对单词进行计数。 for循环语句的作用是遍历字符串中的字符。对字符串中的每个字符 stri,如果是空格字符,则将 wordMark设置为
12、 0,然后继续考查下一个字符。观察存储在数组 str中的字符串,空格字符的作用是作为单词的分隔符。显然,对于每个单词的第一个字符,此时 wordMark的值一定为 0。当字符 stri不是空格字符,接下来通过判断 wordMark是否为 0来决定 num是否增加,以及是否改变 wordMark。据此可以看出,对于一个单词的第一个字符之后的其他字符,通过将 wordMark设置为 1,使得 对每个单词,num的值仅自增 1次。因此,程序的功能是对字符串中的单词进行计数 (与单词连载一起的特殊符号也算作单词的一部分,单词仅以空格分隔 )。 4 【正确答案】 (1)countStrs (2)*p 或
13、 p0 或 *(p+0)或 *p! =0或 *p!= 0或等效形式 (3)*p或 p0或 *(p+0)或等效形式 (4)num 【试题解析】 本问题考查程序的基本结构、运算逻辑和函数调用规范。 在代码 3中,将对字符串中的单词计数用一个函数来实现,需要在理解代码 2的基础上来完善代码 3。 空 (1)处的 要求很明确,就是要通过函数调用来完成单词计数,为防止考生误解,该函数调用的实参已给出,因此填入函数名 “countStrs”即可。 空 (2)处的 for循环用来遍历字符串中的字符,显然, p是指向串中字符的指针,循环条件应为是否遇到串结束标志字符,因此空 (2)处应填入 “*p!=0”或者
14、等效方式。 空 (3)处所在表达式是串中的字符与空格字符进行相等比较,应填入 “*p”或者等效方式。 根据函数 countStrs的首部定义及函数体内的代码逻辑,空 (4)处是返回字符串中的单词数目,应填入 “num”。 5 【正确答案】 (1)ipiVot ) 一一 j; 然后通过 “ai=aj”将不大于基准的元素 aj往前移了。 之后从序列的前端开始向后扫描,遇到一个大于基准的元素为止,语句如下: while ( iname (2)ChatRoom: showMessage (3)user-sendMessage (4)new ChatRoomSystem(i)或 new ChatRoom
15、System (5)new User 【试题解析】 本题考查 C+语言程序设计的能力,涉及类、对象、对象函数 (非静态 )和静态函数的定义和使用。要求考生根据给出的案例和代码说明,认真阅读理清程序思路,然后完成题目。题目所给代码较短,较易理清思路。 先考查题目说明,实现一个简单的聊天室系统 (ChatRoomSystem),多个用户 (User)可以向聊天室 (ChatRoom)发送消息,聊天室将消息展示给所有用户。根据说明进行设计,题目说明中图 6-1的类图给出了类 ChatRoomSystem、 User、 ChatRoom之间的关系。 ChatRoom作为中介器,处理 User对象之间的
16、所有消息交互,即User向 ChatRoom发送消息, ChatRoom负责将消息显示给所有的 User对象。User对象使用 ChatRoom的函数分享其消息。 ChatRoom中定义了一个静态成员函数,使所有调用者直接通过类来访问此函数,无须创建对象。静态函数用关键字 static修饰,参数接收 User对象和消息内容,并显示。 public static void showMessage(User*user, string message) 在 C+中, static函数直接通过类名 ChatRoom来访问,即: ChatRoom: showMeSSage() User类中定义私有属性
17、name及其 get和 set函数,通过 User类的构造器创建对象,赋给新建对象的 name属性值。构造器参数和对象的属性区分方式用 this关键字。 User类的对象发送消息时提供对象自身,用 this表示,以及消息 内容,字符串表示,调用 ChatRoom中的静态函数 showMessage,即: ChatRoom: showMessage(this, message); ChatRoomSystem类实现聊天室系统,实现启动初始化聊天和聊天过程中加入新聊天用户 (聊天过程中的退出等实现类似 )。在主函数 main中,创建ChatRoomSystem对象,然后调用 startup函数 (
18、crs一 startupO),初始化加入一些用户 (字符串用户名: “John”和 “Leo”)并发送问候消息,即: User*zhang: new User(“John”); User*li=new User(“Leo”); zhang一 sendMessage(“Hi!Leo!”); li一 sendMessage(“Hi!John!”); 调用 join函数 (crs一 join)加入用户 “Wayne”,并由此用户对象发送问候消息,即: user一 sendMessage(“Hello Everyone!I am”+user一 getName(); C+中创建对象采用 new关键字,在
19、没有定义构造器时,使用编译器自动创建一个不带参数的缺省 构造器。 ChatRoomSystem中没有定义构造器,所以对象创建方式为: new chatRoomsystem() 或 new chatRoomsystem User的对象创建为: new User(字符串用户名 ) 综上所述,空 (I)需要标识当前对象的 name属性,即 this-name;空 (2)调用类ChatRoom的静态函数 showMessage,即 ChatRoom: showMessage空 (3)需要表示 user对象调用发送消息的函数 sendMessage,即 user-sendMessage:空 (4)需要用 new关键字调用缺省构造器,即 new ChatRoomSystem()或 new ChatRoomSystem;空 (5)处为采用 new关键字调用 User类的构造器函数创建 User类的对象,即 new User。