【计算机类职业资格】程序员-C语言程序设计及答案解析.doc
《【计算机类职业资格】程序员-C语言程序设计及答案解析.doc》由会员分享,可在线阅读,更多相关《【计算机类职业资格】程序员-C语言程序设计及答案解析.doc(17页珍藏版)》请在麦多课文档分享上搜索。
1、程序员-C 语言程序设计及答案解析(总分:35.01,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:5.00)阅读以下说明和 C 语言函数,回答问题。说明下面待修改的 C 程序完成的功能是:对于给定的一个长正整数,从其个位数开始,每隔一位取一个数字(即取其个位、百位、万位等数字),形成一个新的整数并输出。例如,将该程序修改正确后,运行时若输入“14251382”,则输出的整数为“4532”。下面给出的 C 程序代码中有 5 个错误,请指出所有的错误。C 程序代码01 #include stdio.h0203 int main( )04 05 long n, num; 06 int
2、i; 0708 do 09 printf(“清输入一个正整数: “); 10 scanf(“%id“, n); 11 while(n=0); 12 k=1; 13 for(i=1; n=0; i+) 14 if(i io 2=1) 15 Rum=num+(n%10)*k; 16 k=k * 10; 17 18 n=n/10; 19 20 printf(“新数据为: %d/n“, num); 21 return 0; 22 (分数:5.00)(1).(分数:1.00)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_二、B试题二/B(总题数:1,分数:5.00)阅读以下说明和
3、 C 程序代码,将程序补充完整。说明下面 C 程序代码的功能是:对于输入的一个正整数 n(100n1000),先判断其是否是回文数(正读反读都一样的数)。若不是,则将 n 与其反序数相加,再判断得到的和数是否为回文数,若还不是,再将该和数与其反序数相加并进行判断,依此类推,直到得到一个回文数为止。例如,278 不是回文数,其反序数为 872,相加后得到的 1150 还不是回文数,再将 1150 与其反序数 511 相加,得到的 1661 是回文数。函数 int isPalm(long m)的功能是:将正整数 m 的各位数字取出存入数组中,然后判断其是否为回文数。若 m 是回文数则返回 1,否则
4、返回 0。C 程序代码#includestdio.h#includestdlib.hint isPalm(long m)int i=0, k=0; char str32; while(m0) strk+=U (1) /U +0; m=m/10; for(i=0; ik/2; i+)if(stri!=strU (2) /U)return 0; return 1; int main( )long n, a, t; printf(“input a positive integer: “); scanf(“%ld“, if(n100|n=1000)return -1; while(U (3) /U)
5、printf(“%id-“, n); for(a=0, t=n; t0; )a=U (4) /U*10+t%10; t=t/10; n=U (5) /U; printf(“%id/n“, n); system(“pause“); return 0; (分数:5.00)(1).(分数:1.00)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_三、B试题三/B(总题数:1,分数:5.00)阅读以下说明和 C 语言函数,填补空缺。说明已知 1900 年 1 月 1 日是星期一,下面的函数 count_5_13(int year)用于计算给定的年份 year 中有几个“黑色星期五
6、”。“黑色星期五”指既是 13 日又是星期五的日期。函数 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; /*
7、c 用于表示黑色星期五的个数*/if(year1900) return-1; /*计算从 1900 年 1 月 1 日起,至给定年份 year 的 1 月 13 日间隔的天数*/days=12;for(y=1900; yyear; 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: c
8、ase 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; (分数:5.00)(1).(分数:1.00)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_四、B试题四/B(总题数:1,分数:5.00)阅读以下说明和 C
9、 语言程序,填补空缺。说明某电信公司记录了每个用户的详细通话情况(每次通话数据记录在一行),现将某用户某月的通话数据存入一个文本文件“dial.txt”中,其数据格式如下:拨入或拨出标记通话开始时间通话结束时间对方号码注 1:数据字段以一个空格作为分隔符。注 2:拨入和拨出标记均为小写字母。拨入标记为“i”,表示其他用户呼叫本机,本机用户不需付费;拨出标记为“o”,表示本机呼叫其他用户,此时本机用户需要付费。注 3:通话开始和结束时间的格式均为:HH:MM:SS。其中 HH 表示小时,取值 0023;MM 表示分钟,取值0059;SS 表示秒,取值 0059。从通话开始到结束这段时间称为通话时
10、间,假定每次通话时间以秒为单位,最短为 1 秒,最长不超过 24 小时。注 4:跨月的通话记录计入下个月的通话数据文件。例如“o 23:01:12 00:12:15”表示本次通话是本机呼叫其他用户,时间从 23 时 01 分 12 秒至次日的 0时 12 分 15 秒,通话时间为 71 分 03 秒。下面程序的功能是计算并输出该用户本月电话费(单位:元)。通话计费规则为:(1)月通话费按每次通话费累加;(2)每次的通话费按通话时间每分钟 0.08 元计算,不足 1 分钟时按 1 分钟计费。对于每次的拨出通话,程序中先分别计算出通话开始和结束时间相对于当日 0 点 0 分 0 秒的时间长度(以秒
11、为单位),然后算出本次通话时间和通话费。例如,若输入文件 dialtxt 的数据如下所示,则输出 fee=7.44。o 14:05:23 14:11:25 82346789i 15:10:00 16:01:15 13890000000o 10:53:12 11:07:05 63000123o 23:01:12 00:12:15 13356789001C 语句程序代码#includestdio.hFILE *fin; int main( )char str80; int h1, h2, m1, m2, s1, s2; long t_start, t_end, interval; int c; d
12、ouble fee=0; fin=fopen(“dial. txt“, “r“)j; 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=(str14-48)*10+str15-48; s2=(str17-48)*10+str18-48; t_start=h1
13、*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; elseinterval=t_end-t_start;c=U (4) /U; /*计算完整分钟数表示的通话时间*/if(interval%60)U (5) /U; fee+=c*0.08; fclose(fin); printf(“fee=%.21f/n“, fee); return 0; (分数:5.00)(1).(分数:1.00)填空项 1:_
14、填空项 1:_填空项 1:_填空项 1:_填空项 1:_五、B试题五/B(总题数:1,分数:5.00)阅读以下说明和 C 函数代码,回答问题。说明著名的菲波那契数列定义式为:f1=1,f 2=1,f n=fn-1+fn-2(n=3,4,)因此,从第 1 项开始的该数列为 1,1,2,3,5,8,13,21,。函数 fib1 和 fib2 分别用递归方式和迭代方式求解菲波那契数列的第 n 项(调用 fib1、fib2 时可确保参数 n 获得一个正整数 1。C 函数代码(分数:5.01)(1).函数 fib1 和 fib2 存在错误,只需分别修改其中的一行代码即可改正错误。 (1)函数 fib1
15、不能通过编译,请写出 fib1 中错误所在行修改正确后的完整代码。 (2)函数 fib2 在 n2 时不能获得正确结果,请写出 fib2 中错误所在行修改正确后的完整代码。(分数:1.67)填空项 1:_(2).将函数 fib1 和 fib2 改正后进行测试,发现前 46 项都正确,而第 47 项的值是一个负数,请说明原因。(分数:1.67)填空项 1:_(3).函数 fib1、fib2 求得菲波那契数列第 n 项(n40)的速度并不相同,清指出速度慢的函数名,并简要说明原因。(分数:1.67)填空项 1:_六、B试题六/B(总题数:1,分数:5.00)阅读以下说明和 C 语言函数,填补空缺。
16、说明函数 count months(DATE start, DATE end)的功能是:计算两个给定日期之间所包含的完整月份数。该函数先算出起止日期中所含的完整年数,再计算余下的完整月份数。规定两个相邻年份的同月同日之间的问隔为 1 年。例如,2007.5.302008.5.30 的间隔为 1 年。若相邻两年中前一年是闰年,并且日期是 2 月 29 日,则到下一年的 2 月 28 日为 1 年,即 2008.2.292009.2.28 的间隔为 1 年。规定两个相邻月份的相同日之间的间隔为 1 个月,但需要特别考虑月末的特殊情况。例如,2007.1.292007.2.28 的间隔为 1 个月,
17、同理,2007.1.302007.2.28、2007.1.312007.2.28 的间隔都是 1 个月。计算起止日期间隔不足一年的完整月份数时,分两种情况:(1)起止日期不跨年度。先用终止日期的月号减去起始日期的月号得到月份数,然后再根据情况进行修正。例如,起止日期为 2008.3.312008.9.20,通过月号算出月份数为 6。修正时,通过调用函数 makevalid将 2008.9.31 改为 2008.9.30,与终止日期 2008.9.20 比较后,将月份数修正为 5。(2)起止日期跨年度。计算方法如下例所示:对于起止日期 2008.7.252009.3.31,先计算 2008.7.
18、252008.12.25 的月份数为 5,再算出 2008.12.252009.3.25 的月份数为 3,因此 2008.7.252009.3.31之间的完整月份数为 8。日期数据类型定义如下:typedef struct int year; int month; int day; /*日期的年号(4 位)、月和日号*/DATE; 程序中使用的函数 cmp_date( )、isLeapYear( )和 makevalid( )说明如表 11-8 所示。 表 11-8 函数说明函数名 参数 返回值 说明cmp_date DATE startDATE end-1:startend0:start=e
19、nd1:startend比较两个日期的大小,例如,2007.1.30 小于 2007.5.152008.11.23 等于 2008.11.232008.1.31 大于 2007.5.15isLeap Yearint year 1:year 表示的年号是闰年0:year 表示的年号不是闰年判断给定年号是否为闰年makevalid DATE *r 无 若日期*r 是非法的,即*r 不是闰年时其日期为 2 月 29 日,或者其 4、6、9、11 等月份出现了 31 日,则将其日期改为当月最后C 语言函数int count_months(DATE start, DATE end)int years=0
20、, months=0;DATE r; if (cmp_date(start, end)0) r=start; start=end; end=r; years=end.year-start.year; /*计算年数*/r=start; r.year=end.year; if (cmp_date(r, end)0) /*修正年数*/U (1) /U; r.year-; if(r. yearend. year) /*跨年度时,先计算到 12 月的月份数*/months=U (2) /U; r. month=U (12) /U; months+=(end. month+12-r. month)%12;
21、 r. year=end. year; r. month=end. month; makeva!id(U (3) /U); /*将日期 r 修正为有效日期*/if(cmp_date(r, end)0) /*修正月份数*/U (4) /U; months+=U (5) /U; /*计算总月份数*/return months; (分数:5.00)(1).(分数:1.00)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_七、B试题七/B(总题数:1,分数:5.00)阅读以下说明和 C 程序,填补空缺。说明下面的程序按照以下规则输出给定名词的复数形式。(1)若名词以“y”结尾,则
22、删除 y 并添加“ies”。(2)若名词以“s”、“ch”或“sh”结尾,则添加“es”。(3)其他所有情况,直接添加“s”。C 程序#includestdio.h#includestring.hchar *plural(char *word)int n; char *pstr; n=strlen(word); /*求给定单词的长度*/pstr=(char*)malloc(n+3); /*申请给定单词的复数形式存储空间*/if(!pstr | n2)return NULL; strcpy(pstr, word); /*复制给定单词*/if(U (1) /U)pstrn-1=i; pstrn=e
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
5000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 职业资格 程序员 语言程序设计 答案 解析 DOC
