1、2016 年下半年软件水平考试(初级)程序员下午(应用技术)真题试卷及答案解析(总分:16.00,做题时间:90 分钟)一、必答题(总题数:7,分数:16.00)1.必答题(共 4 道大题,每道大题)_2.阅读以下说明和流程图,填补流程图中的空缺,将解答填入答题纸的对应栏内。【说明】设有整数数组A1:N(N1),其元素有正有负。下面的流程图在该数组中寻找连续排列的若干个元素,使其和达到最大值,并输出其起始下标 K、元素个数 L 以及最大的和值 M。例如,若数组元素依次为 3,一 6,2,4,一2,3,一 1,则输出 k=3,L=4,M=7。该流程图中考察了 A1:N中所有从下标 i 到下标 j
2、(ji)的各元素之和 S,并动态地记录其最大值 M。【流程图】 (分数:2.00)_阅读以下代码,回答问题 1 至问题 3,将解答填入答题纸的对应栏内。【代码 1】#includestdiohVoid swap(int x, int y)int tmp=x; x=y; y=tmp;int main()int a=3, b=7;printf(“a1=d b1=dn”, a, b);swap(a,b);printf(“a2=d b2=dn”, a, b);return 0;【代码 2】#includestdioh#define SPACE 空格字符 int main()char str128=“N
3、othing is impossible! ”;int i,num=0,wordMark=0;for(i=0;stri;i+)if(stri:=SPACE)wordMark=0;elseif(wordMark=0)wordMark=1;num+;printf(“dn”,num);return 0;【代码 3】#includestdioh #define SPACE 空格字符 int countStrs(char*);int main() char str128=“Nothing is impossible! ”;printf(“dn”,(1)(str);return 0;int countSt
4、rs(char*p)int num=0,wordMark=0;for(;(2);p+) if( (3) =SPACE) wordMark=0;elseif(!wordMark)(WordMark=1;+numreturn (4);(分数:6.00)(1).写出代码 1 运行后的输出结果。(分数:2.00)_(2).写出代码 2 运行后的输出结果。(分数:2.00)_(3).代码 3 的功能与代码 2 完全相同,请补充代码 3 中的空缺,将解答写入答题纸的对应栏内。(分数:2.00)_3.阅读以下说明和代码,填补代码中的空缺,将解答填入答题纸的对应栏内。【说明】下面的程序利用快速排序中划分的思想
5、在整数序列中找出第 k 小的元素(即将元素从小到大排序后,取第 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)以 alo
6、w的值为基准,对 alow,alow+1,ahigh进行划分,最后将该基准值放入ai(lowihigh),并使得 alow,alow+1,ai1都小于或等于 ai,而 ai+1,ai+2,ahigh都大于 ai。函数 findkthElem(int a,int startldx,int endldx,int k)在 astartldx,astartldx+1,aendIdx中找出第 k 小的元素。【代码】#includestdioh#includestdlib.hint partition(int a,int low,int high)对alowhigh进行划分,使得 alowi中的元素都不大
7、于 ai+1high中的元素。int pivot=alow; pivot 表示基准元素 int i=low,j=high;while( (1) )while(ijajpivot)一一 j;ai=aj;while(ijai=pivot)+i;aj=ai;(2); 基准元素定位 return i; int findkthElem(int a,int startIdx,int endIdx,int k)整数序列存储在astartIdxendIdx中,查找并返回第 k 小的元素。if(startIdx0 endIdx0 startIdxendIdx k1 klendIdx k 一 1startIdx)
8、return 一 1; 参数错误if(startIdxendIdx)int loc=partition(a,startIdx,endIdx);进行划分,确定基准元素的位置 if(loc=k 一 1) 找到第 k 小的元素 return (3) ; if(k 一 1loc) 继续在基准元素之前查找 return findkthElem(a, (4),k);else 继续在基准元素之后查找 return findkthElem(a,(5),k); return astartIdx, int main()int i,k;int n;int a = 19, 12, 7, 30, 11, 11, 7,
9、53, 7 8, 25, 7;n=sizeof(a)sizeof(int); 计算序列中的元素个数 for(k=1; kn+1; k+) for(i=0; in; i+) printf(“dt”,ai);printf(“n”);printf(“elemd=dn”, k, findkthElem(a,0,n 一 1,k);输出序列中第 k 小的元素return 0;(分数:2.00)_4.阅读以下说明和代码,填补代码中的空缺,将解答填入答题纸的对应栏内。 【说明】 图是很多领域中的数据模型,遍历是图的一种基本运算。从图中某顶点 v 出发进行广度优先遍历的过程是: 访问顶点v; 访问 v 的所有未
10、被访问的邻接顶点 w 1 ,w 2 ,w k ; 依次从这些邻接顶点 w 1 ,w 2 ,w k 出发,访问其所有未被访问的邻接顶点;依此类推,直到图中所有访问过的顶点的邻接顶点都得到访问。 显然,上述过程可以访问到从顶点 v 出发且有路径可达的所有顶点。对于从 v 出发不可达的顶点 u,可从顶点 u 出发再次重复以上过程,直到图中所有顶点都被访问到。 例如,对于图 41 所示的有向图 G,从 a 出发进行广度优先遍历,访问顶点的一种顺序为 a,b,c,e,f,d。 设图 G 采用数组表示法(即用邻接矩阵 arcs 存储),元素 arcsij定义如下: 图 4-1 的邻接矩阵如图 4-2 所示
11、,顶点 af 对应的编号依次为 05。因此,访问顶点 a 的邻接顶点的顺序为 b,C,e。 函数BFSTraverse(Graph G)利用队列实现图 G 的广度优先遍历。 相关的符号和类型定义如下: #define MaxN 50 *图中最多顶点数* typedef int AdjMatrixMaxNMaxN; typedef struct int vexnum, edgenum; *图中实际顶点数和边(弧)数* AdjMatrix arcs; *邻接矩阵* Graph; typedef int QElemType; enumERROR=0 ; OK=1); 代码中用到的队列运算的函数原型如
12、表 4-1 所述,队列类型名为 QUEUE。 (分数:2.00)_5.阅读以下说明和 Java 代码,填补代码中的空缺,将解答填入答题纸的对应栏内。【说明】以下 Java 代码实现一个简单的聊天室系统(ChatRoomSystem),多个用户(User)可以向聊天室(ChatRoom)发送消息,聊天室将消息展示给所有用户。类图如图 51 所示。 (分数:2.00)_6.阅读下列说明和 C+代码,填补代码中的空缺,将解答填入答题纸的对应栏内。 【说明】 以下 C+代码实现一个简单的聊天室系统(ChatRoomSystem),多个用户(User)可以向聊天室(ChatRoom)发送消息,聊天室将消
13、息展示给所有用户。类图如图 6-1 所示。 (分数:2.00)_2016 年下半年软件水平考试(初级)程序员下午(应用技术)真题试卷答案解析(总分:16.00,做题时间:90 分钟)一、必答题(总题数:7,分数:16.00)1.必答题(共 4 道大题,每道大题)_解析:2.阅读以下说明和流程图,填补流程图中的空缺,将解答填入答题纸的对应栏内。【说明】设有整数数组A1:N(N1),其元素有正有负。下面的流程图在该数组中寻找连续排列的若干个元素,使其和达到最大值,并输出其起始下标 K、元素个数 L 以及最大的和值 M。例如,若数组元素依次为 3,一 6,2,4,一2,3,一 1,则输出 k=3,L
14、=4,M=7。该流程图中考察了 A1:N中所有从下标 i 到下标 j(ji)的各元素之和 S,并动态地记录其最大值 M。【流程图】 (分数:2.00)_正确答案:(正确答案:(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 的内循环应从
15、 i 开始直到 N,以保持(ji)。因此空(1)处应填入“i,N”,而空(2)处应填写“S+Aj”。 为了在内循环中累计计算若干个连续元素之和 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”。阅读以下代码,回答问题 1
16、 至问题 3,将解答填入答题纸的对应栏内。【代码 1】#includestdiohVoid swap(int x, int y)int tmp=x; x=y; y=tmp;int main()int a=3, b=7;printf(“a1=d b1=dn”, a, b);swap(a,b);printf(“a2=d b2=dn”, a, b);return 0;【代码 2】#includestdioh#define SPACE 空格字符 int main()char str128=“Nothing is impossible! ”;int i,num=0,wordMark=0;for(i=0;
17、stri;i+)if(stri:=SPACE)wordMark=0;elseif(wordMark=0)wordMark=1;num+;printf(“dn”,num);return 0;【代码 3】#includestdioh #define SPACE 空格字符 int countStrs(char*);int main() char str128=“Nothing is impossible! ”;printf(“dn”,(1)(str);return 0;int countStrs(char*p)int num=0,wordMark=0;for(;(2);p+) if( (3) =SP
18、ACE) wordMark=0;elseif(!wordMark)(WordMark=1;+numreturn (4);(分数:6.00)(1).写出代码 1 运行后的输出结果。(分数:2.00)_正确答案:(正确答案:a1=3 b1=7, a2=3 b2=7)解析:解析:本问题考查函数调用时的参数传递。 C 语言仅支持传值调用方式,实参传递给形参的值可以是数值,也可以是地址值。根据题目中给出的函数 swap(int x,int y)定义信息,在 main 中执行函数调用“swap(a,b)”时,是将实参 a 的值传递给形参 x、实参 b 的值传递给形参 y,这个传递过程是单方向的,此后再执行
19、 swap 中的操作时,x、y 的修改与 a、b 再无关联,因此在 main 函数中,a 和 b 的值没有变化。(2).写出代码 2 运行后的输出结果。(分数:2.00)_正确答案:(正确答案:3)解析:解析:本问题考查程序的基本结构和运算逻辑。 首先确定变量的作用,num 用来对单词进行计数。for 循环语句的作用是遍历字符串中的字符。对字符串中的每个字符 stri,如果是空格字符,则将wordMark 设置为 0,然后继续考查下一个字符。观察存储在数组 str 中的字符串,空格字符的作用是作为单词的分隔符。显然,对于每个单词的第一个字符,此时 wordMark 的值一定为 0。当字符 st
20、ri不是空格字符,接下来通过判断 wordMark 是否为 0 来决定 num 是否增加,以及是否改变 wordMark。据此可以看出,对于一个单词的第一个字符之后的其他字符,通过将 wordMark 设置为 1,使得对每个单词,num 的值仅自增 1 次。因此,程序的功能是对字符串中的单词进行计数(与单词连载一起的特殊符号也算作单词的一部分,单词仅以空格分隔)。(3).代码 3 的功能与代码 2 完全相同,请补充代码 3 中的空缺,将解答写入答题纸的对应栏内。(分数:2.00)_正确答案:(正确答案:(1)countStrs (2)*p 或 p0 或*(p+0)或*p!=0 或*p!=0或等
21、效形式 (3)*p 或 p0或*(p+0)或等效形式 (4)num)解析:解析:本问题考查程序的基本结构、运算逻辑和函数调用规范。 在代码 3 中,将对字符串中的单词计数用一个函数来实现,需要在理解代码 2 的基础上来完善代码 3。 空(1)处的要求很明确,就是要通过函数调用来完成单词计数,为防止考生误解,该函数调用的实参已给出,因此填入函数名“countStrs”即可。 空(2)处的 for 循环用来遍历字符串中的字符,显然,p 是指向串中字符的指针,循环条件应为是否遇到串结束标志字符,因此空(2)处应填入“*p!=0”或者等效方式。 空(3)处所在表达式是串中的字符与空格字符进行相等比较,
22、应填入“*p”或者等效方式。 根据函数 countStrs 的首部定义及函数体内的代码逻辑,空(4)处是返回字符串中的单词数目,应填入“num”。3.阅读以下说明和代码,填补代码中的空缺,将解答填入答题纸的对应栏内。【说明】下面的程序利用快速排序中划分的思想在整数序列中找出第 k 小的元素(即将元素从小到大排序后,取第 k 个元素)。对一个整数序列进行快速排序的方法是:在待排序的整数序列中取第一个数作为基准值,然后根据基准值进行划分,从而将待排序的序列划分为不大于基准值者(称为左子序列)和大于基准值者(称为右子序列);然后再对左子序列和右子序列分别进行快速排序,最终得到非递减的有序序列。例如,
23、整数序列“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)以 alow的值为基准,对 alow,alow+1,ahigh进行划分,最后将该基准值放入ai(lowihigh),并使得 alow,alow+1,ai1都小于或等于 ai,而 ai+1,ai+2,ahigh都大于 ai。函数 findkthElem(int a,int startldx,int endldx,int k)在 astartldx,as
24、tartldx+1,aendIdx中找出第 k 小的元素。【代码】#includestdioh#includestdlib.hint partition(int a,int low,int high)对alowhigh进行划分,使得 alowi中的元素都不大于 ai+1high中的元素。int pivot=alow; pivot 表示基准元素 int i=low,j=high;while( (1) )while(ijajpivot)一一 j;ai=aj;while(ijai=pivot)+i;aj=ai;(2); 基准元素定位 return i; int findkthElem(int a,i
25、nt startIdx,int endIdx,int k)整数序列存储在astartIdxendIdx中,查找并返回第 k 小的元素。if(startIdx0 endIdx0 startIdxendIdx k1 klendIdx k 一 1startIdx)return 一 1; 参数错误if(startIdxendIdx)int loc=partition(a,startIdx,endIdx);进行划分,确定基准元素的位置 if(loc=k 一 1) 找到第 k 小的元素 return (3) ; if(k 一 1loc) 继续在基准元素之前查找 return findkthElem(a,
26、(4),k);else 继续在基准元素之后查找 return findkthElem(a,(5),k); return astartIdx, int main()int i,k;int n;int a = 19, 12, 7, 30, 11, 11, 7, 53, 7 8, 25, 7;n=sizeof(a)sizeof(int); 计算序列中的元素个数 for(k=1; kn+1; k+) for(i=0; in; i+) printf(“dt”,ai);printf(“n”);printf(“elemd=dn”, k, findkthElem(a,0,n 一 1,k);输出序列中第 k 小
27、的元素return 0;(分数:2.00)_正确答案:(正确答案:(1)i解析:解析:本题考查 C 程序中数组、函数参数和排序算法的应用。 根据题目说明中提供的信息,利用快速排序查找给定序列中第 k 小的元素。 首先分析程序的逻辑结构、每个函数的作用和主要变量的含义及作用,然后再具体分析每个函数的运算逻辑。 函数 partition(int a,int low,int high)对保存在数组 a 中的元素序列进行划分,也就是指定第一个元素为基准,通过逐个扫描序列中的元素,将大于基准的其他元素移动到序列的后半区,将不大于基准的其他元素移动到序列的前半区,在这个过程中,对于本来就在后半区且大于基准
28、的元素则保持不动,同理,对于本来就在前半区且小于或等于基准的元素保持其原来所在位置。 根据函数中已给出的语句,先从序列的后端开始向前扫描,遇到一个小于或等于基准的元素为止,语句如下: while ( ij ajpiVot ) 一一 j; 然后通过“ai=aj”将不大于基准的元素 aj往前移了。 之后从序列的前端开始向后扫描,遇到一个大于基准的元素为止,语句如下:while ( ij &ai=pivot ) +i; 然后通过“aD:ai”将大于基准的元素 ai往后移了。 显然易见,重复上面的过程直到基准元素的位置被确定下来,也就是“i=j”为止,因此空(1)处应填入“ij”或“i!=j”或其等效
29、方式。空(2)处应填入“ai=pivot”或“aj=pivot”或其等效方式。 函数 findkthElem(int a,int startldx,int endldx,int k)的功能是在数组 astartldxendldx中查找并返回第 k 小的元素。该函数中,通过调用 pattition 不断地对序列进行划分,直到找到所需元素。调用语句如下: loc=partition(a,startIdx,endIdx);进行划分,确定基准元素的位置由于 C 语言中数组下标从 0 开始,即第一个元素的下标为 0,元素在数组中的下标与元素的序号正好相差 1。对于第一次调用,当得到基准元素的位置为 lo
30、c,也就是说基准元素前面有 loc 个元素,而基准元素在序列中为第 loc+1 个元素,因此,此时若 loc=k 一 1,则基准元素正好就是第 k 小的元素,即空(3)处填入“aloc”或其等效表示。若非如此,则 k-1loc 时,则需到前半区继续查找,否则到后半区继续查找。由于是将所要找的元素的序号与其在数组中的下标直接绑定,也就是需要找出正好在下标为 k 一 1 位置上的元素,保证下标为 0k-2 的元素都不大于 ak-1即可。因此,若下一步需到前半区继续查找,则要找的元素仍然为第 k 个,因此空(4)处所在的完整语句为“return findkthElem(a,startldx,loc
31、一1,k);”若下一步需到后半区继续查找,则要找的元素仍然为第 k 个,因此空(5)处所在的完整语句为“return findkthElem(a,loc+1,endldx,k);”程序中在递归调用的语句中保留了第 1 个参数和第 4 个参数,而将表示基准元素之前的前半区和之后的后半区参数留给考生解答,客观上降低了理解的难度,因此考生应重点把握程序的整体逻辑结构。4.阅读以下说明和代码,填补代码中的空缺,将解答填入答题纸的对应栏内。 【说明】 图是很多领域中的数据模型,遍历是图的一种基本运算。从图中某顶点 v 出发进行广度优先遍历的过程是: 访问顶点v; 访问 v 的所有未被访问的邻接顶点 w
32、1 ,w 2 ,w k ; 依次从这些邻接顶点 w 1 ,w 2 ,w k 出发,访问其所有未被访问的邻接顶点;依此类推,直到图中所有访问过的顶点的邻接顶点都得到访问。 显然,上述过程可以访问到从顶点 v 出发且有路径可达的所有顶点。对于从 v 出发不可达的顶点 u,可从顶点 u 出发再次重复以上过程,直到图中所有顶点都被访问到。 例如,对于图 41 所示的有向图 G,从 a 出发进行广度优先遍历,访问顶点的一种顺序为 a,b,c,e,f,d。 设图 G 采用数组表示法(即用邻接矩阵 arcs 存储),元素 arcsij定义如下: 图 4-1 的邻接矩阵如图 4-2 所示,顶点 af 对应的编
33、号依次为 05。因此,访问顶点 a 的邻接顶点的顺序为 b,C,e。 函数BFSTraverse(Graph G)利用队列实现图 G 的广度优先遍历。 相关的符号和类型定义如下: #define MaxN 50 *图中最多顶点数* typedef int AdjMatrixMaxNMaxN; typedef struct int vexnum, edgenum; *图中实际顶点数和边(弧)数* AdjMatrix arcs; *邻接矩阵* Graph; typedef int QElemType; enumERROR=0 ; OK=1); 代码中用到的队列运算的函数原型如表 4-1 所述,队列
34、类型名为 QUEUE。 (分数:2.00)_正确答案:(正确答案:(1)!visited 或 visited=NULL 或 visited=0 或等效形式 (2)InitQueue(&Q) (3)EnQueue(&Q,V) (4)DeQueue(&Q,&u) (5)!visitedw或 visitedw=0 或 visitedw!=1 或等效形式)解析:解析:本题考查 C 程序中函数参数和数据结构的应用。 根据题目说明,首先需了解对图中顶点进行遍历的基本方式。深度优先和广度优先是对图进行遍历的两种方式。 以图 41 为例,从顶点 a 出发进行深度优先遍历的一种顺序为 a,b,e,d,f,c。毫
35、无疑问,第一个被访问的顶点为 a,第二个为什么是b?这就与图的存储有关系了。若该图采用的是邻接矩阵存储,如图 4-2 所示,观察其中顶点 a 的邻接信息向量“011010”,其中的三个 1 分别表示 b,c,e 这三个顶点是 a 的邻接顶点,一般情况下对该向量从左向右扫描,因此 b 是 a 的第一个邻接顶点且还未被访问(根据访问标志),所以访问 a 之后接下来访问 b。接下来要去访问没有被访问过 b 的邻接顶点,再考察 b 的邻接信息向量“000011”,其中的两个 1 分别表示 e,f 是 b 的邻接顶点,而且这两个顶点都未访问过,所以第三个被访问的顶点是 e,按照相同的思路,然后是 d,f
36、,最后访问顶点 c。 如果是广度优先遍历,访问顶点 a 之后,接下来要访问所有 a 的所有的未被访问的邻接顶点,按照邻接矩阵存储,a 的三个邻接顶点为 b,c,e,依次访问这三个顶点后,接下来先访问 b 的邻接顶点(未被访问过的),然后访问 c 的邻接顶点(未被访问过的),最后访问 e 的邻接顶点(未被访问过的),在该过程中用队列来暂存顶点,确保访问顶点的顺序。因此,广度优先遍历序列为a,b,c,e,f,d。 函数 BFSTraverse(Graph G)对图 G 进行广度优先遍历。空(1)处判断函数 calloc 的返回值是否为空指针,应填入“!visited”或其等效形式。 空(2)处初始
37、化一个空的队列,根据函数原型提供的信息,注意形参为指针参数,要求实参提供的是地址,因此应填入“InitQueue(&Q)”。 根据注释,空(3)处是向队列中加入元素 v,根据函数原型提供的信息,注意第一个形参为指针参数,要求第一个实参提供的是地址,因此应填入“EnQueue(&Q,v)”。 根据注释,空(4)处是令队头元素出队列,根据函数原型提供的信息,注意两个形参都是指针参数,要求两个实参都提供地址,而第一个参数表示队列,第二个参数表示出队的队头元素,因此应填入“DeQueue(&Q,&u)”。 空(5)所在表达式中,“Garcsuw!=0”说明 w 是 u 的邻接顶点,在 w 还未被访问的
38、情况下(visitedw=0)再访问顶点 w,因此应填入“visitedw=0”或其等效形式。5.阅读以下说明和 Java 代码,填补代码中的空缺,将解答填入答题纸的对应栏内。【说明】以下 Java 代码实现一个简单的聊天室系统(ChatRoomSystem),多个用户(User)可以向聊天室(ChatRoom)发送消息,聊天室将消息展示给所有用户。类图如图 51 所示。 (分数:2.00)_正确答案:(正确答案:(1)misname (2)ChatRoomshowMessage (3)usersendMessage (4)new ChatRoomSystem0 (5)new User)解析:
39、解析:本题考查 Java 语言程序设计的能力,涉及类、对象、对象方法和静态方法的定义和使用。要求考生根据给出的案例和代码说明,认真阅读理清程序思路,然后完成题目。题目所给代码较短,较易理清思路。 先考查题目说明,实现一个简单的聊天室系统(ChatRoomSystem),多个用户(User)可以向聊天室(ChatRoom)发送消息,聊天室将消息展示给所有用户。根据说明进行设计,题目说明中图 5-1 的类图给出了类 ChatRoomSystem、User、ChatRoom 之间的关系。ChatRoom 作为中介器,处理 User 对象之间的所有消息交互,即 User 向 ChatRoom 发送消息
40、,ChatRoom 负责将消息显示给所有的 User 对象。User 对象使用 ChatRoom 的方法分享其消息。 ChatRoom 中定义了一个静态方法,即类方法,使所有调用者直接通过类来访问此方法,无须创建对象。静态方法用关键字 static 修饰,参数接收 User 对象和消息内容,加以显示。 public static void showMessage(User user, String message) 在 Java 中,static方法直接通过类名 ChatRoom 来访问,即: ChatRoomshowMes sage() User 类中定义私有属性 name及其 get 和
41、set 方法,通过 User 类的构造器创建对象,赋给新建对象的 name 属性值。构造器参数和对象的属性区分方式用 this 关键字。User 类的对象发送消息时提供对象自身,用 this 表示,以及消息内容,字符串表示,调用 ChatRoom 中的静态方法 showMessage,即: ChatRoomshowMessage(this, message);ChatRoomSystem 类实现聊天室系统,包含入口方法 main,实现启动初始化聊天和聊天过程中加入新聊天用户(聊天过程中的退出等实现类似)。在 main 方法中,创建 ChatRoomSystem 对象,然后调用 startup
42、方法(crsstartup(),初始化加入一些用户(字符串用户名:“John”和“Leo”)并发送问候消息,即: User zhang=new User(“John”); USeri=new USer(“Leo”); zhangsendMessage(“Hi!Leo!”); lisendMessage(“Hi!John!”); 调用 join 方法加入(crsjoin)用户“Wayne”,并由此用户对象发送问候消息,即: usersendMessage(“Hello Everyone!I am”+usergetName(); Java 中创建对象采用 new 关键字,如果类中没有定义构造器,则编译器会自动创建一个不带参数的缺省构造器。ChatRoomSystem 中没有定义构造器,所以对象创建方式为: new ChatRoomSys tem() User 的对象创建为:new User(字符串用户名) 综上所述,空(1)需要标识当前对象的 name 属性,即 thisname:空(2)调用类 ChatRoom 的静态方法 showMessage,即 ChatRoomshowMessage:空(3)需要表示 user 对象调用发送消息的方法 sendMessage,即 usersendMessage:空(