欢迎来到麦多课文档分享! | 帮助中心 海量文档,免费浏览,给你所需,享你所想!
麦多课文档分享
全部分类
  • 标准规范>
  • 教学课件>
  • 考试资料>
  • 办公文档>
  • 学术论文>
  • 行业资料>
  • 易语言源码>
  • ImageVerifierCode 换一换
    首页 麦多课文档分享 > 资源分类 > DOC文档下载
    分享到微信 分享到微博 分享到QQ空间

    【计算机类职业资格】程序员-C语言程序设计(一)及答案解析.doc

    • 资源ID:1336133       资源大小:74.50KB        全文页数:17页
    • 资源格式: DOC        下载积分:5000积分
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    二维码
    微信扫一扫登录
    下载资源需要5000积分(如需开发票,请勿充值!)
    邮箱/手机:
    温馨提示:
    如需开发票,请勿充值!快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如需开发票,请勿充值!如填写123,账号就是123,密码也是123。
    支付方式: 支付宝扫码支付    微信扫码支付   
    验证码:   换一换

    加入VIP,交流精品资源
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    【计算机类职业资格】程序员-C语言程序设计(一)及答案解析.doc

    1、程序员-C 语言程序设计(一)及答案解析(总分:35.01,做题时间:90 分钟)一、试题一(总题数:1,分数:5.00)说明下面待修改的 C 程序完成的功能是:对于给定的一个长正整数,从其个位数开始,每隔一位取一个数字(即取其个位、百位、万位等数字),形成一个新的整数并输出。例如,将该程序修改正确后,运行时若输入“14251382”,则输出的整数为“4532”。下面给出的 C 程序代码中有 5 个错误,请指出所有的错误。C 程序代码01 #include stdio.h0203 int main( )04 05 long n, num; 06 int i; 0708 do 09 printf

    2、(“清输入一个正整数: “); 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:_填空项 1:_填空项 1:_填空项 1:_二、试题二(总题数:1,分数:5.00)说明下面 C 程序代码的功能是:对于输入的一个正整数 n(100n1000),先判断其

    3、是否是回文数(正读反读都一样的数)。若不是,则将 n 与其反序数相加,再判断得到的和数是否为回文数,若还不是,再将该和数与其反序数相加并进行判断,依此类推,直到得到一个回文数为止。例如,278 不是回文数,其反序数为 872,相加后得到的 1150 还不是回文数,再将 1150 与其反序数 511 相加,得到的 1661 是回文数。函数 int isPalm(long m)的功能是:将正整数 m 的各位数字取出存入数组中,然后判断其是否为回文数。若 m 是回文数则返回 1,否则返回 0。C 程序代码#includestdio.h#includestdlib.hint isPalm(long m

    4、)int i=0, k=0; char str32; while(m0) strk+= (1) +0; m=m/10; for(i=0; ik/2; i+)if(stri!=str (2) )return 0; return 1; int main( )long n, a, t; printf(“input a positive integer: “); scanf(“%ld“, if(n100|n=1000)return -1; while( (3) ) printf(“%id-“, n); for(a=0, t=n; t0; )a= (4) *10+t%10; t=t/10; n= (5)

    5、 ; printf(“%id/n“, n); system(“pause“); return 0;(分数:5.00)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_三、试题三(总题数:1,分数:5.00)说明已知 1900 年 1 月 1 日是星期一,下面的函数 count_5_13(int year)用于计算给定的年份 year 中有几个“黑色星期五”。“黑色星期五”指既是 13 日又是星期五的日期。函数 count_5_13(int year)首先算出年份 year 的 1 月 13 日是星期几,然后依次计算每个月的 13 日是星期几,若是星期五,则计数。程序中使用了

    6、函数 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 月 1 日起,至给定年份 year 的 1 月 13 日间隔的天数*/days=12;for(y=1900; yye

    7、ar; y+) days +=365; if (iSLeapYear(Y) (1) ; date=(days%7)+1)%7; /*算出给定年份 year 的 1 月 13 日是星期几+/c=( (2) )?1:0; for(m=1; (3) ; 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 11: days=30; break; case 2: days=28; if( (4) )days=29; brea

    8、k; /*end of switch*/date=(days%7)+ (5) )%7; if (date=5) c+; /*end of for*/return c; (分数:5.00)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_四、试题四(总题数:1,分数:5.00)说明某电信公司记录了每个用户的详细通话情况(每次通话数据记录在一行),现将某用户某月的通话数据存入一个文本文件“dial.txt”中,其数据格式如下:拨入或拨出标记通话开始时间通话结束时间对方号码注 1:数据字段以一个空格作为分隔符。注 2:拨入和拨出标记均为小写字母。拨入标记为“i”,表示其他用户呼叫

    9、本机,本机用户不需付费;拨出标记为“o”,表示本机呼叫其他用户,此时本机用户需要付费。注 3:通话开始和结束时间的格式均为:HH:MM:SS。其中 HH 表示小时,取值 0023;MM 表示分钟,取值0059;SS 表示秒,取值 0059。从通话开始到结束这段时间称为通话时间,假定每次通话时间以秒为单位,最短为 1 秒,最长不超过 24 小时。注 4:跨月的通话记录计入下个月的通话数据文件。例如“o 23:01:12 00:12:15”表示本次通话是本机呼叫其他用户,时间从 23 时 01 分 12 秒至次日的 0时 12 分 15 秒,通话时间为 71 分 03 秒。下面程序的功能是计算并输

    10、出该用户本月电话费(单位:元)。通话计费规则为:(1)月通话费按每次通话费累加;(2)每次的通话费按通话时间每分钟 0.08 元计算,不足 1 分钟时按 1 分钟计费。对于每次的拨出通话,程序中先分别计算出通话开始和结束时间相对于当日 0 点 0 分 0 秒的时间长度(以秒为单位),然后算出本次通话时间和通话费。例如,若输入文件 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:1

    11、5 13356789001C 语句程序代码#includestdio.hFILE *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“)j; if (!fin)return -1; while(!feof(fin) if(!fgets(str, 80, fin) break; if( (1) ) continue; h1=(str2-48)*10+str3-48; m1=(str

    12、5-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( (2) ) /*若通话开始和结束时间跨日*/interval= (3) -t_start+t_end; elseinterval=t_end-t_start;c= (4) ; /*计算完整分钟数表示的

    13、通话时间*/if(interval%60)(5) ; fee+=c*0.08; fclose(fin); printf(“fee=%.21f/n“, fee); return 0; (分数:5.00)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_五、试题五(总题数:1,分数:5.00)说明著名的菲波那契数列定义式为: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 时可确保参数

    14、 n 获得一个正整数 1。C 函数代码(分数:5.01)(1).函数 fib1 和 fib2 存在错误,只需分别修改其中的一行代码即可改正错误。(1)函数 fib1 不能通过编译,请写出 fib1 中错误所在行修改正确后的完整代码。(2)函数 fib2 在 n2 时不能获得正确结果,请写出 fib2 中错误所在行修改正确后的完整代码。(分数:1.67)填空项 1:_(2).将函数 fib1 和 fib2 改正后进行测试,发现前 46 项都正确,而第 47 项的值是一个负数,请说明原因。(分数:1.67)填空项 1:_(3).函数 fib1、fib2 求得菲波那契数列第 n 项(n40)的速度并

    15、不相同,清指出速度慢的函数名,并简要说明原因。(分数:1.67)填空项 1:_六、试题六(总题数:1,分数:5.00)说明函数 count months(DATE start, DATE end)的功能是:计算两个给定日期之间所包含的完整月份数。该函数先算出起止日期中所含的完整年数,再计算余下的完整月份数。规定两个相邻年份的同月同日之间的问隔为 1 年。例如,2007.5.302008.5.30 的间隔为 1 年。若相邻两年中前一年是闰年,并且日期是 2 月 29 日,则到下一年的 2 月 28 日为 1 年,即 2008.2.292009.2.28 的间隔为 1 年。规定两个相邻月份的相同日

    16、之间的间隔为 1 个月,但需要特别考虑月末的特殊情况。例如,2007.1.292007.2.28 的间隔为 1 个月,同理,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

    17、。(2)起止日期跨年度。计算方法如下例所示:对于起止日期 2008.7.252009.3.31,先计算 2008.7.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 函数说明函数

    18、名 参数 返回值 说明cmp_date DATE startDATE end-1:startend 比较两个日期的大小,例如,0:start=end1:startend2007.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 日,则将其日期改为

    19、当月最后C 语言函数int count_months(DATE start, DATE end)int years=0, 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) /*修正年数*/(1) ; r.year-; if(r. yearend. year) /*跨年度时,先计算到 12 月的月份数*/months= (2) ; r. m

    20、onth= (12) ; months+=(end. month+12-r. month)%12; r. year=end. year; r. month=end. month; makeva!id( (3) ); /*将日期 r 修正为有效日期*/if(cmp_date(r, end)0) /*修正月份数*/(4) ; months+= (5) ; /*计算总月份数*/return months; (分数:5.00)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_七、试题七(总题数:1,分数:5.00)说明下面的程序按照以下规则输出给定名词的复数形式。(1)若名词以“y

    21、”结尾,则删除 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( (1) )pstrn-1=i; pstrn

    22、=e; pstrn+1=s; (2) ; elseif(pstrn-1=s|pstrn-1=h pstrn+1=s; pstrn+2=/0; elsepstrn=s; pstrn+1=/0; (4) ; main( )int i; char *ps; char wc910=“chair“, “dairy“, “boss“, “circus“, “fly“, “dog“, “church“, “clue“, “dish“); for(i=0; i9; i+) ps= (5) ; printf(“%s: %s/n“, wci, ps); /*输出单词及其复数形式*/free(ps); /*释放空间

    23、*/system(“pause“); (分数:5.00)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_程序员-C 语言程序设计(一)答案解析(总分:35.01,做题时间:90 分钟)一、试题一(总题数:1,分数:5.00)说明下面待修改的 C 程序完成的功能是:对于给定的一个长正整数,从其个位数开始,每隔一位取一个数字(即取其个位、百位、万位等数字),形成一个新的整数并输出。例如,将该程序修改正确后,运行时若输入“14251382”,则输出的整数为“4532”。下面给出的 C 程序代码中有 5 个错误,请指出所有的错误。C 程序代码01 #include stdio.h

    24、0203 int main( )04 05 long n, num; 06 int 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:_ (正确答案:变量 k 没有定义。)解析:填空项 1:_

    25、(正确答案:变量 num 应初始化为 0。)解析:填空项 1:_ (正确答案:第 10 行 n 之前应加取地址符号。)解析:填空项 1:_ (正确答案:第 13 行 n 应大于 0。)解析:填空项 1:_ (正确答案:第 14 行 if 语句条件错误,应该将“=”改为“=”。)解析:解析 本题中有如下 5 个错误:(1)变量 k 没有定义就使用。(2)变量 num 没有初始值就使用。(3)第 10 行输入变量时没有使用取地址符号。(4)第 13 行循环条件设置错误,造成无穷循环。(5)第 14 行误把赋值符号“=”当做关系运算符“等于”。二、试题二(总题数:1,分数:5.00)说明下面 C 程

    26、序代码的功能是:对于输入的一个正整数 n(100n1000),先判断其是否是回文数(正读反读都一样的数)。若不是,则将 n 与其反序数相加,再判断得到的和数是否为回文数,若还不是,再将该和数与其反序数相加并进行判断,依此类推,直到得到一个回文数为止。例如,278 不是回文数,其反序数为 872,相加后得到的 1150 还不是回文数,再将 1150 与其反序数 511 相加,得到的 1661 是回文数。函数 int isPalm(long m)的功能是:将正整数 m 的各位数字取出存入数组中,然后判断其是否为回文数。若 m 是回文数则返回 1,否则返回 0。C 程序代码#includestdio

    27、.h#includestdlib.hint isPalm(long m)int i=0, k=0; char str32; while(m0) strk+= (1) +0; m=m/10; for(i=0; ik/2; i+)if(stri!=str (2) )return 0; return 1; int main( )long n, a, t; printf(“input a positive integer: “); scanf(“%ld“, if(n100|n=1000)return -1; while( (3) ) printf(“%id-“, n); for(a=0, t=n; t

    28、0; )a= (4) *10+t%10; t=t/10; n= (5) ; printf(“%id/n“, n); system(“pause“); return 0;(分数:5.00)填空项 1:_ (正确答案:m%10 或其他等价形式)解析:填空项 1:_ (正确答案:k-i-1)解析:填空项 1:_ (正确答案:!isPalm(n),或 isPalm(n)!=1 或 isPalm(n)=0)解析:填空项 1:_ (正确答案:a)解析:填空项 1:_ (正确答案:n+a)解析:解析 函数 isPalm(long m)的功能是判断 m 是否为回文数,其方法是将 m 的各位数字依次取出并转换为

    29、对应的数字字符保存在数组 str 中,然后再判断 str 中的字符中序列是否对称。将 m 的个位数取出可以采用如下公式“m%10”,即对 10 取余数。所以(1)处应为 m%10 或其他等价形式。若判断数组 str 中的字符序列是否对称,即比较 str(i)与 str(k-1-i)是否相等,所以(2)应为 k-1-i。函数 isPalm(long m)的功能是判断 m 是否为回文数,(3)处应该是对它的调用,同时取反,即“!isPalm(n)”。(4)处为“a”,(5)处应该是数 n 与反序数 a 相加得到的新数,即“n+a”。三、试题三(总题数:1,分数:5.00)说明已知 1900 年 1

    30、 月 1 日是星期一,下面的函数 count_5_13(int year)用于计算给定的年份 year 中有几个“黑色星期五”。“黑色星期五”指既是 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 表示星期日

    31、,为 16 分别表示星期一至星期六*/long days=0; /*days 记录天数*/int m, y, c=0; /*c 用于表示黑色星期五的个数*/if(year1900) return-1; /*计算从 1900 年 1 月 1 日起,至给定年份 year 的 1 月 13 日间隔的天数*/days=12;for(y=1900; yyear; y+) days +=365; if (iSLeapYear(Y) (1) ; date=(days%7)+1)%7; /*算出给定年份 year 的 1 月 13 日是星期几+/c=( (2) )?1:0; for(m=1; (3) ; m+

    32、) 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 11: days=30; break; case 2: days=28; if( (4) )days=29; break; /*end of switch*/date=(days%7)+ (5) )%7; if (date=5) c+; /*end of for*/return c; (分数:5.00)填空项 1:_ (正确答案:days=days+1 或其他等价形式

    33、)解析:填空项 1:_ (正确答案:date=5 或其他等价形式)解析:填空项 1:_ (正确答案:m12 或其他等价形式)解析:填空项 1:_ (正确答案:isLeapYear(year)或其他等价形式)解析:填空项 1:_ (正确答案:date)解析:解析 对于 2 月份,需要考虑所在年份是否为闰年,如果不是,则按 365 天计算,否则天数要加1,所以(1)处应为 days=days+1 或其他等价形式。程序中 date 变量表示的是星期几,如果是星期五(即date=5)则 c 取值为 1,否则为 0,所 PA(2)处应为 date=5。因为要考虑到每个月的 13 日是否为周五,所以要对其

    34、进行遍历,但是 1 月份之前己考虑过,所以就要考虑 2 到 12 月,那么 m 就应该从 1 到 11,所以(3)处应为 m12 或 m=11,或其他等价形式。同时也很容易得出(4)处是判断年份是否为闰年,因此需要调用相应的判断函数,即(4)处应为 isLeapYear(year)或其他等价表示。通过之前的代码分析,不难得到(5)处为 date。四、试题四(总题数:1,分数:5.00)说明某电信公司记录了每个用户的详细通话情况(每次通话数据记录在一行),现将某用户某月的通话数据存入一个文本文件“dial.txt”中,其数据格式如下:拨入或拨出标记通话开始时间通话结束时间对方号码注 1:数据字段

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

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

    37、o 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; double fee=0; fin=fopen(“dial. txt“, “r“)j; if (!fin)return -1; while(!feof(fin) if(!fgets(str, 80, fin) break; if( (1

    38、) ) 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( (2) ) /*若通话开始和结束时间跨日*/interval= (3) -t_start+t_end; el

    39、seinterval=t_end-t_start;c= (4) ; /*计算完整分钟数表示的通话时间*/if(interval%60)(5) ; fee+=c*0.08; fclose(fin); printf(“fee=%.21f/n“, fee); return 0; (分数:5.00)填空项 1:_ (正确答案:str0=i或其他等价形式)解析:填空项 1:_ (正确答案:t_endt_stail 或其他等价形式)解析:填空项 1:_ (正确答案:24*60*60 或其他等价形式)解析:填空项 1:_ (正确答案:interval/60)解析:填空项 1:_ (正确答案:C+或其他等价形

    40、式)解析:解析 对于读入的每一条记录,首先要判断是拨入还是拨出,如果是拨入则不计费,然后继续下一条记录,所以(1)处应为 str0=i。对于 0 点之前到 0 点整的通话长度就是全天的秒数减去开始时间的秒数,即 24*60*60-t_start。因此,(2)处应为 t_endt_start,而(3)处应为 24*60*60 或其他等价形式。由于 interval 是以秒为单位的通话长度,而话费是以分钟为单位的,所以(4)处应为interval/60,剩余时间应该是按分钟计费,所以(5)处应为 C+。五、试题五(总题数:1,分数:5.00)说明著名的菲波那契数列定义式为:f1=1,f 2=1,f

    41、 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 不能通过编译,请写出 fib1 中错误所在行修改正确后的完整代码。(2)函数 fib2 在 n2 时不能获得正确结果,请写出 fib2 中错误所在行修改正确后的完整代码。(分数:1.67)填空项 1:

    42、_ (正确答案:(1)return fibl(n-1)+fibl(n-2) (2)longf=1 或 long f=(long)1 或 longf=1L)解析:(2).将函数 fib1 和 fib2 改正后进行测试,发现前 46 项都正确,而第 47 项的值是一个负数,请说明原因。(分数:1.67)填空项 1:_ (正确答案:溢出)解析:(3).函数 fib1、fib2 求得菲波那契数列第 n 项(n40)的速度并不相同,清指出速度慢的函数名,并简要说明原因。(分数:1.67)填空项 1:_ (正确答案:函数 fibl。原因是递归算法时间消耗大。)解析:解析 问题 1(1)函数 fibl 不能

    43、通过编译,是因为语句“fibl(n)=fibl(n-1)+fibl(n-2)”出错,正确应该为“return fibl(n-1)+fibl(n-2)”。(2)for 循环中 i 从 3 开始递增,对于 i=1 或 2 并不会执行,因此,只需给 f 赋初值 1 即可。问题 2由于 long 数据类型是有范围限制的,当 n 超过某个值时,函数结果就会溢出,接下来的计算结果也就不会准确了。问题 3两个函数一个采用的是递归算法,另一个是迭代算法,通常情况下,前者的计算时间更长。因为递归会造成大量的函数调用和数据返回,需要很多的时间,效率较低。六、试题六(总题数:1,分数:5.00)说明函数 count

    44、 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 个月,同理,2007.1.

    45、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.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


    注意事项

    本文(【计算机类职业资格】程序员-C语言程序设计(一)及答案解析.doc)为本站会员(orderah291)主动上传,麦多课文档分享仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知麦多课文档分享(点击联系客服),我们立即给予删除!




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

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

    收起
    展开