问答题

【说明】 下面待修改的C程序完成的功能是:对于给定的一个长正整数,从其个位数开始,每隔一位取一个数字(即取其个位、百位、万位等数字),形成一个新的整数并输出。例如,将该程序修改正确后,运行时若输入“14251382”,则输出的整数为“4532”。 下面给出的C程序代码中有五个错误,请指出所有的错误。【C程序代码】01 #include <stdio.h>0203 int main()04 {05 long n, num;06 int i;0708 do {09 printf("请输入一个正整数:");10 scanf("%ld", n);11 }while(n <= 0);12 k = 1;13 for (i = 1; n >= 0; i++) {14 if (i % 2 = 1) {15 num= num+ (n % 10) * k;16 k = k * 10;17 }18 n = n / 10;19 }20 printf("新数据为: %d \n",num);21 return 0;22 }

【参考答案】

错误1:变量k没有声明(或定义)。
错误2:变量num没有初始化,或者num应初始化为0。
错误3:......

(↓↓↓ 点击下方‘点击查看答案’看完整答案、解析 ↓↓↓)
热门 试题

问答题
【说明】 函数count months(DATE start,DATE end)的功能是:计算两个给定日期之间所包含的完整月份数。 该函数先算出起止日期中所含的完整年数,再计算余下的完整月份数。 规定两个相邻年份的同月同日之间的间隔为1年。例如,2007.5.30—2008.5.30的间隔为1年。若相邻两年中前一年是闰年,并且日期是2月29日,则到下一年的2月28日为1年,即2008.2.29—2009.2.28的间隔为1年。 规定两个相邻月份的相同日之间的间隔为1个月,但需要特别考虑月末的特殊情况。例如,2007.1.29—2007.2.28的间隔为1个月,同理,2007.1.30—2007.2.28、2007.1.31—2007.2.28的间隔都是1个月。 计算起止日期间隔不足一年的完整月份数时,分如下两种情况。 (1)起止日期不跨年度。先用终止日期的月号减去起始日期的月号得到月份数,然后再根据情况进行修正。例如,起止日期为2008.3.31—2008.9.20,通过月号算出月份数为6。修正时,通过调用函数makevalid将2008.9.31改为2008.9.30,与终止日期2008.9.20比较后,将月份数修正为5。 (2)起止日期跨年度。计算方法如下例所示:对于起止日期2008.7.25—2009.3.31,先计算2008.7.25—2008.12.25的月份数为5,再算出2008.12.25—2009.3.25的月份数为 3,因此2008.7.25—2009.3.31之间的完整月份数为8。 日期数据类型定义如下: typedef struct{ int year; int month; int day; *日期的年号(4位)、月和口号* }DATE; 程序中使用的函数cmp_date()、isLeap Year()和makevalid()说明如下。 【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.year < end.year) { *跨年度时,先计算到12月的月份数* months = (2) ; r.month = 12; } months += (end.month + 12 - r.month) % 12; r.year = end.year; r.month = end.month; makevalid ( (3) ); *将日期r修正为有效日期* if (cmp_date(r,end) > 0) *修正月份数* (4) ; months += (5) ; *计算总月份数* return months; }