【计算机类职业资格】计算机水平考试初级程序员2007年下半年下午真题及答案解析.doc

上传人:inwarn120 文档编号:1339342 上传时间:2019-10-17 格式:DOC 页数:11 大小:87.50KB
下载 相关 举报
【计算机类职业资格】计算机水平考试初级程序员2007年下半年下午真题及答案解析.doc_第1页
第1页 / 共11页
【计算机类职业资格】计算机水平考试初级程序员2007年下半年下午真题及答案解析.doc_第2页
第2页 / 共11页
【计算机类职业资格】计算机水平考试初级程序员2007年下半年下午真题及答案解析.doc_第3页
第3页 / 共11页
【计算机类职业资格】计算机水平考试初级程序员2007年下半年下午真题及答案解析.doc_第4页
第4页 / 共11页
【计算机类职业资格】计算机水平考试初级程序员2007年下半年下午真题及答案解析.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、计算机水平考试初级程序员 2007 年下半年下午真题及答案解析(总分:74.99,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:10.00)1.【说明】某单位动态收集的数据中常包含重复的数据,所以需要进行处理,使得重复的数据仅出现一次。下面流程图的功能是:在 n(n1)个数据 D1、D 2、D n中,选出其中所有不重复的 k 个数据,置于原来前 k 个数据的位置上。该流程图的算法如下:第 1 个数据必然被选出,然后从第 2 个数据开始,逐个考查其余的数据。假设D1、D 2、D m(m1)是已经选出的、不重复的数据,则对于数据 Di(min),将其依次与 Dm/Dm-1、D 1进行比

2、较,若没有发现与之相同者,则 Di被选出并置于 Dm+1的位置上;否则对 Di不做处理。例如,如下 10 个数据:5,2,2,7,4,4,7, 1,9, 1 (n=10)经过上述算法处理后的结果为:5,2,7,4, 1,9 (k=m=6)【流程图】(分数:10.00)_二、B试题二/B(总题数:1,分数:10.00)2.【说明】 已知 1900 年 1 月 1 日是星期一,下面的函数 count_5_13(int year)用于计算给定的年份year 中有几个“黑色星期五”。“黑色星期五”指既是 13 日又是星期五的日期。 函数 count_5_13(int year)首先算出年份 year

3、的 1 月 13 日是星期几,然后依次计算每个月的 13 日是星期几,若是星期五,则计数。 程序中使用了函数 isLeapYear(int year),其功能是判断给定年份是否为闰年,返回值为 1(或 0)表示 year 是(或不是)闰年。 【C 语言函数】 int count_5_13(int year) int date; /*date 为 0 表示星期日,为 16 分别表示星期一至星期六*/ long days=0; /*days 记录天数*/ int m,y,c=0; /*c用于表示黑色星期五的个数*/ if (year1900) return-1; /*计算从 1900 年 1 月

4、1 日起至给定年份year 的 1 月 13 日间隔的天数*/ days=12; for (y= 1900; y year; y+) days +=365; if (isLeapYear(y) U(1) /U; date=(days%7) +1) %7; /*算出给定年份 year 的 1 月 13 日是星期几*/ c=(U (2) /U) ?1:0; for(m=1;U (3) /U;m+) switch (m) case 1:case 3: case 5: case 7:case 8:case 10:case 12: days=31; break; case 4: case 6: case

5、 9: case 11: days=30; break; case 2:days=28; if(U (4) /U) days=29; break; /*end of switch*/ date=(days%7)+ U(5) /U)%7; if (date=5) c+; /*end of for*/ return c; (分数:10.00)_三、B试题三/B(总题数:1,分数:10.00)3.【说明】 某电信公司记录了每个用户的详细通话情况(每次通话数据记录在一行),现将某用户某月的通话数据存入一个文本文件 dial.txt,其数据格式如下: 拨入或拨出标记通话开始时间通话结束时间对方号码 注

6、1:数据字段以一个空格作为分隔符。 注 2:拨入和拨出标记均为小写字母。拨入标记为 i,表示其他用户呼叫本机,本机用户不需付费:拨出标记为 o,表示本机呼叫其他用户,此时本机用户需要付费。 注 3:通话开始和结束时间的格式均为 HH:MM:SS。其中 HH 表示小时,取值 00 23;MM 表示分钟,取值 0059;SS 表示秒,取值 0059。从通话开始到结束这段时间称为通话时间,假定每次通话时间以秒为单位,最短为 1 秒,最长不超过 24 小时。 注 4:跨月的通话记录计入下个月的通话数据文件。 例如“o23:01:1200:12:15”表示本次通话是本机呼叫其他用户,时间从 23 时 0

7、1 分 12 秒至次日的0 时 12 分 15 秒,通话时间为 71 分 03 秒。 下面程序的功能是计算并输出该用户本月电话费(单位:元)。通话计费规则为: 1月通话费按每次通话费累加; 2每次的通话费按通话时间每分钟 0.08 元计算,不足 1 分钟时按 1 分钟计费。 对于每次的拨出通话,程序中先分别计算出通话开始和结束时间相对于当日 0 点 0 分 0 秒的时间长度(以秒为单位),然后算出本次通话时间和通话费。 例如,若输入文件dial.txt 的数据如下所示,则输出 fee=7.44。 o 14:05:23 14:11:25 82346789 i 15:10:00 16:01:15

8、13890000000 o 10:53:12 11:07:05 63000123 o 23:01:12 00:12:15 13356789001 【C 程序代码】 #includestdio.h FILE *fin; Int main() char str80; int h1,h2,m1,m2,s1,s2; long t_start,t_end,interval; int c; double fee=0; fin=fopen(“dial.txt“,“r“); if (!fin) return-1; while (!feof(fin) if (!fgets(str,80,fin) break;

9、if (U (1) /U) continue; h1= (str2 -48) *10+str3 -48; m1= (str5 -48) *10+str6 -48; s1= (str8 -48) *10+str9 -48; h2= (str11 -48) *10+str12 -48; m2= (str14 -48) *10+str15 -48; s2=(str17-48)*10+str18-48; t_start=h1*60*60+m1*60+s1; /*通话开始时间*/ t_end=h2*60*60+m2.60+s2; /*通话结束时间*/ if(U (2) /U) /*若通话开始和结束时间跨

10、日*/ interval;U (3) /U-t_start+t_end; else interval=t_end-t_start; c= U(4) /U; /*计算完整分钟数表示的通话时间*/ if (interval % 60) U (5) /U; fee+=c*0.08; fclose(fin); printf(“fee=%.2lf/n“,fee);return 0; (分数:10.00)_四、B试题四/B(总题数:1,分数:10.00)4.【说明】 已知包含头结点(不存储元素)的单链表的元素已经按照非递减方式排序,函数 compress(NODE*head)的功能是去掉其中重复的元素,使

11、得链表中的元素互不相同。 处理过程中,当元素重复出现时,保留元素第一次出现所在的结点。 图 2-1(a)、(b)是经函数 compress()处理前后的链表结构示例图。 (分数:10.00)_五、B试题五/B(总题数:1,分数:15.00)阅读下列说明、图和 C+代码,回答问题 1 至问题 3。【说明】已知四个类之间的关系如图 2-2 所示,分别对每个类的方法进行编号,例如 Shape 的 perimeter()方法为1 号,表示为 1:perimeter(),Rectangle 类的 perimeter()为 2 号,表示为 2:perimeter(),依此类推,其中,每个类的 perime

12、ter 方法都为虚函数且方法签名相同。(分数:15.00)(1).【问题 1】 关于上述 C+代码中 sh 和 tr 的以下叙述中,哪两个是正确的(写出编号)。sh 和 tr 分别引用同一个对象;sh 和 tr 分别引用同一类型的不同的对象:sh 和 tr 分别引用不同类型的不同对象;sh 和 tr 分别引用同一个对象的不同备份:sh 和 tr 所引用的内存空间是相同的。(分数:5.00)_(2).【问题 2】 写出下面消息对应的方法编号(如果该消息错误或者没有对应的方法调用,请填写“无”)。tr-height() U(1) /Ush-perimeter() U (2) /Usq-height

13、() U(3) /Usq-perimeter() U (4) /Ush-height() U(5) /U tr-perimeter() U (6) /U(分数:5.00)_(3).【问题 3】 不考虑内存释放问题,下列赋值语句中哪两个是合法的(写出合法赋值语句的编号)。sq=sh; sh=tr; tr=sq; sq=tr; sh=sq;(分数:5.00)_六、B试题六/B(总题数:1,分数:10.00)5.【应用说明】某电视台拟开发应用程序来显示戏曲大赛中 14 号四位选手决赛的现场投票情况。该程序从现场观众中(不超过 2000 人)每 0.5 秒收集一次对这四位选手的支持票数,并在屏幕上动态

14、显示这四位选手的票柱(以高度反映票数)与累计得票数,如图 2-3 所示。投票过程限时 30 秒,每名观众最多为 1 名选手投票。投票结束后系统通过比较各位选手的累计得票数,显示决赛结果:“*号胜出”(如有单个冠军)或“继续进行PK”(如有多人获得相同的最高票数)。(分数:10.00)_七、B试题七/B(总题数:1,分数:10.00)阅读下列说明、图和 Java 代码,回答问题 1 至问题 3。【说明】已知四个类之间的关系如图 2-4 所示,分别对每个类的方法进行编号,例如 Shape 的 perimeter()为 1 号,表示为 1:perimeter(),Rectangle 类的 perim

15、eter()为 2 号,表示为 2:perimeter(),依此类推,其中,每个类的 perimeter 方法签名相同。(分数:9.99)(1).【问题 1】 关于上述 Java 代码中 sh 和 tr 的以下叙述中,哪两个是正确的(写出编号)。sh 和 tr 分别引用同一个对象;sh 和 tr 分别引用同一类型的不同的对象:sh 和 tr 分别引用不同类型的不同对象:sh 和 tr 分别引用同一个对象的不同拷贝;sh 和 tr 所引用的内存空间是相同的。(分数:3.33)_(2).【问题 2】 写出下面消息对应的方法编号(如果该消息错误或者没有对应的方法调用,请填写“无”)。tr.heigh

16、t() U(1) /Ush.perimeter()U (2) /Usq.height() U(3) /Usq.perimeter()U (4) /Ush.height() U(5) /Utr.perimeter()U (6) /U(分数:3.33)_(3).【问题 3】 下列赋值语句中哪两个是合法的(写出合法赋值语句的编号)。sq=sh; sh=tr; tr=sq; sq=tr; sh=sq;(分数:3.33)_计算机水平考试初级程序员 2007 年下半年下午真题答案解析(总分:74.99,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:10.00)1.【说明】某单位动态收集的数据中

17、常包含重复的数据,所以需要进行处理,使得重复的数据仅出现一次。下面流程图的功能是:在 n(n1)个数据 D1、D 2、D n中,选出其中所有不重复的 k 个数据,置于原来前 k 个数据的位置上。该流程图的算法如下:第 1 个数据必然被选出,然后从第 2 个数据开始,逐个考查其余的数据。假设D1、D 2、D m(m1)是已经选出的、不重复的数据,则对于数据 Di(min),将其依次与 Dm/Dm-1、D 1进行比较,若没有发现与之相同者,则 Di被选出并置于 Dm+1的位置上;否则对 Di不做处理。例如,如下 10 个数据:5,2,2,7,4,4,7, 1,9, 1 (n=10)经过上述算法处理

18、后的结果为:5,2,7,4, 1,9 (k=m=6)【流程图】(分数:10.00)_正确答案:()解析:(1)1 (2)2 (3)m (4)Dm+1 (5)mm+1,或其等价表示分析本题涉及信息处理工作中常用的算法。动态收集得到的一批记录中,常包含有某些重复的记录。在做进一步处理前,应当删除这些重复记录。所谓重复记录,通常是指那些具有相同关键词的记录。注意,从经验上看,重复记录往往出现在比较临近的记录中。为了删除重复记录,可以采用本题中的算法思想。对于题中给出的例子,该算法执行的动态情况如下表: D1 D2 D3 D4 D5 D6 D7 D8 D9 D105 2 2 7 4 4 7 1 9 1

19、5 2 7 4 1 9具体做法如下:逐个考查 D1,D 2,D 10的内容。首先,保留 D1中的内容 5,将其作为已经选出的不重复数据,此时 m 应是 1。考查 D2时,将其与 D1进行比较,发现不同,所以保留,形成不重复数据 D1、D 2,此时 m=2。考查 D3时,分别将其与 D2、D 1进行比较,发现有重复,不做处理。考查 D4时,分别将其与 D2、D 1进行比较,发现不同,将 D4的内容放到 D3中,形成不重复数据D1、D 2、D 3,此时 m=3。考查 D5时,分别将其与 D3D 1进行比较,发现不同,将 D5的内容放到 D4中,形成不重复数据D1D 4,此时 m=4。考查 D6时,

20、分别将其与 D4D 1进行比较,发现有重复,不做处理。考查 D7时,分别将其与 D4D 1进行比较,发现有重复,不做处理:考查 D8时,分别将其与 D4D 1进行比较,发现不同,将 D8的内容放到 D5中,形成不重复数据D1D 5,此时 m=5。考查 D9时,分别将其与 D5D 1进行比较,发现不同,将 D9的内容放到 D6中,形成不重复数据D1D 6,此时 m=6。考查 D10时,分别将其与 D6D 1进行比较,发现有重复,不做处理。考查结束,形成不重复数据 D1D 6,此时 m=6。对于一般的情况,就要逐个考查 D1,D 2,D n的内容。首先保留 D1中的内容,作为已选出的不重复数据,此

21、时设置 m=1。对于已经选出的不重复数据 D1,D 2,D m,考查 Di(min),将其与 Dm,D m-1, D 1逐一比较。若发现有重复,则不做处理;发现完全不同时,应将 Di 的内容放入 Dm+1,然后,将 m 增加 1。注意,在考查 Di时,由于重复数据离它更近些,将其与 Dm,D m-1,D 1逐一比较可以节省时间;若与 D1,D 2,D m逐个比较,发现重复的时间会比较长一些。对于程序员来说,能在细节处适当考虑程序的效率也是好的。因此,在本题的流程图中,(1)处应填 1,表示初始时设置 m=1。对于/2 个数据(n1)而言,接着应逐个考查 D2,Dn的内容,因此循环应对 i=2,

22、n,1 进行,所以(2)处应填 2。考查 Di时,需要将其分别与 Dm,Dm-1,D1逐一比较,所以循环应对,j=m, 1,-1 进行,从而(3)处应填 m。若在比较过程中发现重复,则直接返回主程序(不做处理);若始终没有发现重复数据,则应将 Di存入 Dm+1,所以(4)处应填 Dm+1。然后,应将重复数据数目加 1,所以(5)处应填 mm+1(或 m+1m)。二、B试题二/B(总题数:1,分数:10.00)2.【说明】 已知 1900 年 1 月 1 日是星期一,下面的函数 count_5_13(int year)用于计算给定的年份year 中有几个“黑色星期五”。“黑色星期五”指既是 1

23、3 日又是星期五的日期。 函数 count_5_13(int year)首先算出年份 year 的 1 月 13 日是星期几,然后依次计算每个月的 13 日是星期几,若是星期五,则计数。 程序中使用了函数 isLeapYear(int year),其功能是判断给定年份是否为闰年,返回值为 1(或 0)表示 year 是(或不是)闰年。 【C 语言函数】 int count_5_13(int year) int date; /*date 为 0 表示星期日,为 16 分别表示星期一至星期六*/ long days=0; /*days 记录天数*/ int m,y,c=0; /*c用于表示黑色星期

24、五的个数*/ if (year1900) return-1; /*计算从 1900 年 1 月 1 日起至给定年份year 的 1 月 13 日间隔的天数*/ days=12; for (y= 1900; y year; y+) days +=365; if (isLeapYear(y) U(1) /U; date=(days%7) +1) %7; /*算出给定年份 year 的 1 月 13 日是星期几*/ c=(U (2) /U) ?1:0; for(m=1;U (3) /U;m+) switch (m) case 1:case 3: case 5: case 7:case 8:case

25、10:case 12: days=31; break; case 4: case 6: case 9: case 11: days=30; break; case 2:days=28; if(U (4) /U) days=29; break; /*end of switch*/ date=(days%7)+ U(5) /U)%7; if (date=5) c+; /*end of for*/ return c; (分数:10.00)_正确答案:()解析:(1)days+,days+=1,days=days+1,或其等价表示 (2)date=5,或其等价表示 (3)m12,或其等价表示 (4)i

26、sLeapYear(year),或 year%4=0 & year%100!=0|year%400=0,或其等价表示 (5)date 分析 本题考查基本程序设计能力。 题中程序用于计算给定年份中“黑色星期五”(既是 13 日又是星期五的日期)的数目。 基本的常识为平年每年 365 天、闰年 366 天。若今天是星期三(date),则 7 天后的那天也是星期三,依此类推,可算出 m 天后为星期几(date+m)%7,为 0 表示星期日)。 题目中给出了 1900年 1 月 1 日是星期一,因此,对于给定的日期,首先需要算出其距离 1900.1.1 的天数,然后用上式计算该日期对应星期几。 要计算

27、给定年份中有几个“黑色星期五”,可先计算出该年份的 1 月 13 日是星期几,然后计算该年内每月的 13 日是星期几。所以,程序中首先计算出 1900 年 1 月 1 日至给定年份的 1 月 13日共有多少天(days)。 在计算给定日期段的天数时,需要考虑大、小月,对于 2 月份,则需要考虑当前年号是否为闰年。期间若跨年度,则按每年 365 天(闰年 366 天)累加天数。对于以下代码段: for (y = 1900; y year; y+) days+=365; if(isLeapYear(y)U (1) /U; 显然,程序中空(1)处应填入 days+或其等价表示形式。 根据程序中的注释

28、,经语句 date=(days%7)+1)%7;处理后,date 表示给定年份的 1 月 13 日是星期几,而 c 用于表示“黑色星期五”的个数,因此空(2)处应填入 date=5。 在下面的代码中,计算给定年份 2 月份之后每个月的 13 日星期几(计算天数时需要考虑大、小月,2 月份要考虑是否为闰年),其中 m 表示月号。 for(m=1;U (3) /U;m+) switch (m) case 1: case 3: case 5: case 7: case 8: case 10: case 12: days=31; break; case 4: case 6: case 9: case

29、11: days=30; break; case 2:days=28; if(U (4) /U) days=29; break; /*end of switch*/ 由于 1 月 13 日已经考虑过,因此需要考虑的日期为 2 月至 12 月的每个 13日,当月份 m 为 12 时,再计算出的日期就是下一年度的 1 月 13 日了,因此空(3)处应填入 m12,空(4)处显然是判断当前年号是否为闰年,因此应填入 isLeapYear(year)或 isLeapYear(y)。 对于代码date(days%7)+U (5) /U%7;,之前已用 date 表示上个月 13 日是星期几,days 表

30、示间隔的天数,因此空(5)处应填入 date。三、B试题三/B(总题数:1,分数:10.00)3.【说明】 某电信公司记录了每个用户的详细通话情况(每次通话数据记录在一行),现将某用户某月的通话数据存入一个文本文件 dial.txt,其数据格式如下: 拨入或拨出标记通话开始时间通话结束时间对方号码 注 1:数据字段以一个空格作为分隔符。 注 2:拨入和拨出标记均为小写字母。拨入标记为 i,表示其他用户呼叫本机,本机用户不需付费:拨出标记为 o,表示本机呼叫其他用户,此时本机用户需要付费。 注 3:通话开始和结束时间的格式均为 HH:MM:SS。其中 HH 表示小时,取值 00 23;MM 表示

31、分钟,取值 0059;SS 表示秒,取值 0059。从通话开始到结束这段时间称为通话时间,假定每次通话时间以秒为单位,最短为 1 秒,最长不超过 24 小时。 注 4:跨月的通话记录计入下个月的通话数据文件。 例如“o23:01:1200:12:15”表示本次通话是本机呼叫其他用户,时间从 23 时 01 分 12 秒至次日的0 时 12 分 15 秒,通话时间为 71 分 03 秒。 下面程序的功能是计算并输出该用户本月电话费(单位:元)。通话计费规则为: 1月通话费按每次通话费累加; 2每次的通话费按通话时间每分钟 0.08 元计算,不足 1 分钟时按 1 分钟计费。 对于每次的拨出通话,

32、程序中先分别计算出通话开始和结束时间相对于当日 0 点 0 分 0 秒的时间长度(以秒为单位),然后算出本次通话时间和通话费。 例如,若输入文件dial.txt 的数据如下所示,则输出 fee=7.44。 o 14:05:23 14:11:25 82346789 i 15:10:00 16:01:15 13890000000 o 10:53:12 11:07:05 63000123 o 23:01:12 00:12:15 13356789001 【C 程序代码】 #includestdio.h FILE *fin; Int main() char str80; int h1,h2,m1,m2,

33、s1,s2; long t_start,t_end,interval; int c; double fee=0; fin=fopen(“dial.txt“,“r“); if (!fin) return-1; while (!feof(fin) if (!fgets(str,80,fin) break; if (U (1) /U) continue; h1= (str2 -48) *10+str3 -48; m1= (str5 -48) *10+str6 -48; s1= (str8 -48) *10+str9 -48; h2= (str11 -48) *10+str12 -48; m2= (s

34、tr14 -48) *10+str15 -48; s2=(str17-48)*10+str18-48; t_start=h1*60*60+m1*60+s1; /*通话开始时间*/ t_end=h2*60*60+m2.60+s2; /*通话结束时间*/ if(U (2) /U) /*若通话开始和结束时间跨日*/ interval;U (3) /U-t_start+t_end; else interval=t_end-t_start; c= U(4) /U; /*计算完整分钟数表示的通话时间*/ if (interval % 60) U (5) /U; fee+=c*0.08; fclose(fi

35、n); printf(“fee=%.2lf/n“,fee);return 0; (分数:10.00)_正确答案:()解析:(1)str0=i,或*str=i,或其等价表示 (2)t endt start,或其等价表示 (3)24*60*60,或 86400,或其等价表示 (4)interval/60 (5)c+,c+=1,c=c+1,或其等价表示 分析 本题考查基本程序设计能力。 对于读入的每一条通话记录,首先判断其是 i 还是 o,若是 i(拨入),则不计费,然后读入下一条通话记录,因此空(1)处应填入 str0=i(或*str=i)。 根据通话开始时间和结束时间的计算方式(相对于当日 0

36、点 0 分 0 秒的时间长度),一般情况下,若通话的开始时间和结束时间在同一天内,则结束时间应大于开始时间。但是若通话从 0 点前卉始而结束于 0 点之后,则会出现开始通话时间大于结束通话时间的情况,因此 0 点之前到 0 点整的通话长度就是全天的秒数减去以秒为单位的开始时间,即 24*60*60-t start。因此空,(2)处填入 t endt start,而空(3)处填入 24*60*60 或86400。 从程序中可知,interval 是以秒为单位的通话长度,而话费是以分钟为单位计算的,所以空(4)处填入 interval/60,剩余时间则按一分钟计费,因此空(5)处填入 c+。四、B

37、试题四/B(总题数:1,分数:10.00)4.【说明】 已知包含头结点(不存储元素)的单链表的元素已经按照非递减方式排序,函数 compress(NODE*head)的功能是去掉其中重复的元素,使得链表中的元素互不相同。 处理过程中,当元素重复出现时,保留元素第一次出现所在的结点。 图 2-1(a)、(b)是经函数 compress()处理前后的链表结构示例图。 (分数:10.00)_正确答案:()解析:(1)head-next (2)ptr (3)q-data = ptr-data 或 ptr-next-data=ptr-data,或其等价表示 (4)ptr-next (5)ptr 分析 本

38、题考查基本程序设计能力。 链表上的查找、插入和删除运算是常见的考点。本题要求去掉链表中的重复元素,使得链表中的元素互不相同,显然是对链表进行查找和删除操作。 对于元素已经按照非递减方式排序的单链表,删除其中重复的元素,可以采用两种思路。 1顺序地遍历链表,对于逻辑上相邻的两个元素,比较它们是否相同,若相同,则删除后一个元素的结点,直到表尾。代码如下: ptr=head-next; /*取得第一个元素结点的指针*/ while (ptr & ptr-next) /*指针 ptr 指示出重复序列的第一个元素结点*/ q=ptr-next; while(q & ptr-data=q-data) /*

39、处理重复元素*/ ptr-next=q-next; /*将结点从链表中删除*/ free(q); q=ptr-next; /*继续扫描后继元素*/ ptr=ptr-next; 2对于每一组重复元素,先找到其中的第一个结点,然后向后查找,直到出现一个相异元素时为止,此时保留重复元素的第一个结点,其余结点则从链表中删除。 ptr=head-next; /*取得第一个元素结点的指针*/ while (ptr & ptr-next) /*指针ptr 指示出重复序列的第一个元素结点*/ q=ptr-next; while(q & ptr-data=q-data) /*查找重复元素*/ q=q-next;

40、 s=ptr-next; /*需要删除的第一个结点*/ ptr-next=q; /*保留重复序列的第一个结点,将其余结点从链表中删除*/ while (s & s!=q /*逐个释放被删除结点的空间*/ t = s-next; free(s); s = t; ptr=ptr-next; 题目中采用的是第一种思路。五、B试题五/B(总题数:1,分数:15.00)阅读下列说明、图和 C+代码,回答问题 1 至问题 3。【说明】已知四个类之间的关系如图 2-2 所示,分别对每个类的方法进行编号,例如 Shape 的 perimeter()方法为1 号,表示为 1:perimeter(),Rectan

41、gle 类的 perimeter()为 2 号,表示为 2:perimeter(),依此类推,其中,每个类的 perimeter 方法都为虚函数且方法签名相同。(分数:15.00)(1).【问题 1】 关于上述 C+代码中 sh 和 tr 的以下叙述中,哪两个是正确的(写出编号)。sh 和 tr 分别引用同一个对象;sh 和 tr 分别引用同一类型的不同的对象:sh 和 tr 分别引用不同类型的不同对象;sh 和 tr 分别引用同一个对象的不同备份:sh 和 tr 所引用的内存空间是相同的。(分数:5.00)_正确答案:()解析: (2).【问题 2】 写出下面消息对应的方法编号(如果该消息错误或者没有对应的方法调用,请填写“无”)。tr-height() U(1) /Ush-perimeter() U (2) /Usq-height() U(3) /Usq-perimeter() U (4) /Ush-height() U(5) /U tr-perimeter() U (6) /U(分数:5.00)_正确答案:()解析:(1)3 (2)5 (3)无 (4)4 (5)无 (6)5(3).【问题 3】 不考虑内存释放问题,下列赋值语句中哪两个是合法的(写出合法赋值语句的编号)。sq=sh; sh=tr; tr=sq; sq=tr; sh=sq;(分数:5.00)_正确答案:()解析

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试资料 > 职业资格

copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1