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
23、; pstrn+1=s; U(2) /U; elseif(pstrn-1=s|pstrn-1=h pstrn+1=s; pstrn+2=/0; elsepstrn=s; pstrn+1=/0; U (4) /U; main( ) int i; char *ps; char wc910=“chair“, “dairy“, “boss“, “circus“, “fly“, “dog“, “church“, “clue“, “dish“); for(i=0; i9; i+) ps=U (5) /U; printf(“%s: %s/n“, wci, ps); /*输出单词及其复数形式*/free(ps
24、); /*释放空间*/system(“pause“); (分数:5.00)(1).(分数:1.00)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_程序员-C 语言程序设计答案解析(总分:35.01,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:5.00)阅读以下说明和 C 语言函数,回答问题。说明下面待修改的 C 程序完成的功能是:对于给定的一个长正整数,从其个位数开始,每隔一位取一个数字(即取其个位、百位、万位等数字),形成一个新的整数并输出。例如,将该程序修改正确后,运行时若输入“14251382”,则输出的整数为“4532”。下面给出的 C 程序代码中
25、有 5 个错误,请指出所有的错误。C 程序代码01 #include stdio.h0203 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 (分数
26、:5.00)(1).(分数:1.00)填空项 1:_ (正确答案:变量 k 没有定义。)解析:填空项 1:_ (正确答案:变量 num 应初始化为 0。)解析:填空项 1:_ (正确答案:第 10 行 n 之前应加取地址符号。)解析:填空项 1:_ (正确答案:第 13 行 n 应大于 0。)解析:填空项 1:_ (正确答案:第 14 行 if 语句条件错误,应该将“=”改为“=”。)解析:解析 本题中有如下 5 个错误:(1)变量 k 没有定义就使用。(2)变量 num 没有初始值就使用。(3)第 10 行输入变量时没有使用取地址符号。(4)第 13 行循环条件设置错误,造成无穷循环。(5)
27、第 14 行误把赋值符号“=”当做关系运算符“等于”。二、B试题二/B(总题数:1,分数:5.00)阅读以下说明和 C 程序代码,将程序补充完整。说明下面 C 程序代码的功能是:对于输入的一个正整数 n(100n1000),先判断其是否是回文数(正读反读都一样的数)。若不是,则将 n 与其反序数相加,再判断得到的和数是否为回文数,若还不是,再将该和数与其反序数相加并进行判断,依此类推,直到得到一个回文数为止。例如,278 不是回文数,其反序数为 872,相加后得到的 1150 还不是回文数,再将 1150 与其反序数 511 相加,得到的 1661 是回文数。函数 int isPalm(lon
28、g m)的功能是:将正整数 m 的各位数字取出存入数组中,然后判断其是否为回文数。若 m 是回文数则返回 1,否则返回 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: “)
29、; scanf(“%ld“, if(n100|n=1000)return -1; while(U (3) /U) 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:_ (正确答案:m%10 或其他等价形式)解析:填空项 1:_ (正确答案:k-i-1)解析:填空项 1:_ (正确答案:!isPalm(n),或 isPalm(n)!=1 或 i
30、sPalm(n)=0)解析:填空项 1:_ (正确答案:a)解析:填空项 1:_ (正确答案:n+a)解析:解析 函数 isPalm(long m)的功能是判断 m 是否为回文数,其方法是将 m 的各位数字依次取出并转换为对应的数字字符保存在数组 str 中,然后再判断 str 中的字符中序列是否对称。将 m 的个位数取出可以采用如下公式“m%10”,即对 10 取余数。所以(1)处应为 m%10 或其他等价形式。若判断数组 str 中的字符序列是否对称,即比较 str(i)与 str(k-1-i)是否相等,所以(2)应为 k-1-i。函数 isPalm(long m)的功能是判断 m 是否为
31、回文数,(3)处应该是对它的调用,同时取反,即“!isPalm(n)”。(4)处为“a”,(5)处应该是数 n 与反序数 a 相加得到的新数,即“n+a”。三、B试题三/B(总题数:1,分数:5.00)阅读以下说明和 C 语言函数,填补空缺。说明已知 1900 年 1 月 1 日是星期一,下面的函数 count_5_13(int year)用于计算给定的年份 year 中有几个“黑色星期五”。“黑色星期五”指既是 13 日又是星期五的日期。函数 count_5_13(int year)首先算出年份 year 的 1 月 13 日是星期几,然后依次计算每个月的 13 日是星期几,若是星期五,则计
32、数。程序中使用了函数 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=1
33、900; 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: case 10: case 12: days=31; break; case 4: case 6: case 9: case 11: days=30; break; case 2: days=28; if(U
34、(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:_ (正确答案:days=days+1 或其他等价形式)解析:填空项 1:_ (正确答案:date=5 或其他等价形式)解析:填空项 1:_ (正确答案:m12 或其他等价形式)解析:填空项 1:_ (正确答案:isLeapYear(year)或其他等价形式)解析:填空项 1:_ (正确答案:date)解析:解析 对于 2 月份
35、,需要考虑所在年份是否为闰年,如果不是,则按 365 天计算,否则天数要加1,所以(1)处应为 days=days+1 或其他等价形式。程序中 date 变量表示的是星期几,如果是星期五(即date=5)则 c 取值为 1,否则为 0,所 PA(2)处应为 date=5。因为要考虑到每个月的 13 日是否为周五,所以要对其进行遍历,但是 1 月份之前己考虑过,所以就要考虑 2 到 12 月,那么 m 就应该从 1 到 11,所以(3)处应为 m12 或 m=11,或其他等价形式。同时也很容易得出(4)处是判断年份是否为闰年,因此需要调用相应的判断函数,即(4)处应为 isLeapYear(ye
36、ar)或其他等价表示。通过之前的代码分析,不难得到(5)处为 date。四、B试题四/B(总题数:1,分数:5.00)阅读以下说明和 C 语言程序,填补空缺。说明某电信公司记录了每个用户的详细通话情况(每次通话数据记录在一行),现将某用户某月的通话数据存入一个文本文件“dial.txt”中,其数据格式如下:拨入或拨出标记通话开始时间通话结束时间对方号码注 1:数据字段以一个空格作为分隔符。注 2:拨入和拨出标记均为小写字母。拨入标记为“i”,表示其他用户呼叫本机,本机用户不需付费;拨出标记为“o”,表示本机呼叫其他用户,此时本机用户需要付费。注 3:通话开始和结束时间的格式均为:HH:MM:S
37、S。其中 HH 表示小时,取值 0023;MM 表示分钟,取值0059;SS 表示秒,取值 0059。从通话开始到结束这段时间称为通话时间,假定每次通话时间以秒为单位,最短为 1 秒,最长不超过 24 小时。注 4:跨月的通话记录计入下个月的通话数据文件。例如“o 23:01:12 00:12:15”表示本次通话是本机呼叫其他用户,时间从 23 时 01 分 12 秒至次日的 0时 12 分 15 秒,通话时间为 71 分 03 秒。下面程序的功能是计算并输出该用户本月电话费(单位:元)。通话计费规则为:(1)月通话费按每次通话费累加;(2)每次的通话费按通话时间每分钟 0.08 元计算,不足
38、 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:15 13356789001C 语句程序代码#includestdio.hFILE *fin; int main( )char str80;
39、 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(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-
40、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) /*若通话开始和结束时间跨日*/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);
41、 printf(“fee=%.21f/n“, fee); return 0; (分数:5.00)(1).(分数:1.00)填空项 1:_ (正确答案:str0=i或其他等价形式)解析:填空项 1:_ (正确答案:t_endt_stail 或其他等价形式)解析:填空项 1:_ (正确答案:24*60*60 或其他等价形式)解析:填空项 1:_ (正确答案:interval/60)解析:填空项 1:_ (正确答案:C+或其他等价形式)解析:解析 对于读入的每一条记录,首先要判断是拨入还是拨出,如果是拨入则不计费,然后继续下一条记录,所以(1)处应为 str0=i。对于 0 点之前到 0 点整的通话
42、长度就是全天的秒数减去开始时间的秒数,即 24*60*60-t_start。因此,(2)处应为 t_endt_start,而(3)处应为 24*60*60 或其他等价形式。由于 interval 是以秒为单位的通话长度,而话费是以分钟为单位的,所以(4)处应为interval/60,剩余时间应该是按分钟计费,所以(5)处应为 C+。五、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,。函数 fib
43、1 和 fib2 分别用递归方式和迭代方式求解菲波那契数列的第 n 项(调用 fib1、fib2 时可确保参数 n 获得一个正整数 1。C 函数代码(分数:5.01)(1).函数 fib1 和 fib2 存在错误,只需分别修改其中的一行代码即可改正错误。 (1)函数 fib1 不能通过编译,请写出 fib1 中错误所在行修改正确后的完整代码。 (2)函数 fib2 在 n2 时不能获得正确结果,请写出 fib2 中错误所在行修改正确后的完整代码。(分数:1.67)填空项 1:_ (正确答案:(1)return fibl(n-1)+fibl(n-2) (2)longf=1 或 long f=(l
44、ong)1 或 longf=1L)解析:(2).将函数 fib1 和 fib2 改正后进行测试,发现前 46 项都正确,而第 47 项的值是一个负数,请说明原因。(分数:1.67)填空项 1:_ (正确答案:溢出)解析:(3).函数 fib1、fib2 求得菲波那契数列第 n 项(n40)的速度并不相同,清指出速度慢的函数名,并简要说明原因。(分数:1.67)填空项 1:_ (正确答案:函数 fibl。原因是递归算法时间消耗大。)解析:解析 问题 1(1)函数 fibl 不能通过编译,是因为语句“fibl(n)=fibl(n-1)+fibl(n-2)”出错,正确应该为“return fibl(n-1)+fibl(n-2)”。 (2)for 循环中 i 从 3 开始递增,对于 i