独家首发 名师解析2008二级C之上机题

技术与开发

笔试好过,上机难过,这是很多学生朋友的感受。这次考试上机题你觉得难吗?有把握过吗?来看看孙顾天老师对考题的解析,你就心中有底了(上机题全部答案请到http://www.cpcw.com/bzsoft下载)。

程序修改题

给定程序MODI1.C中函数fun的功能是:从低位开始取出长整型变量s中偶数位上的数,依次构成一个新数放在t中。高位仍在高位,低位仍在低位。请改正程序中的错误,使它能得出正确的结果。

#include <stdio.h>

/************found************/

void fun (long s, long t)

{ long sl=10;

s /= 10;

*t = s % 10;

/************found************/

while ( s <0)

{ s = s/100;

*t = s%10*sl + *t;

sl = sl * 10;

}

}

main()

{ long s, t;

printf("\nPlease enter s:"); scanf("%ld", &s);

fun(s, &t);

printf("The result is: %ld\n", t);

}

本题难度:中等

涉及知识点:形参定义、循环次数控制

名师解析:在做程序修改题时,考生要注意错误的语句已经指出:/******found******/注释语句的下一条就是错误语句。第一个错误是函数的定义语句,这类语句的错误往往出现在与实参/调用处的不相符。

在main( )中fun的调用语句为fun(s, &t);,其中实参为s变量与&t地址,故对应的第一个形参为long型的变量,第二个形参为指向long型的指针变量。第二个错误是循环控制语句中的循环条件语句,要看清楚题中要求的循环执行次数,循环体中有一条趋向于循环结束的语句s = s/100;,则得出s的最终值为0,即循环的执行条件为非0。

程序设计题

编写函数fun,它的功能是:计算并输出下列级数和。

例如,当n=10时,函数值为:0.909091。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

#include <stdio.h>

double fun(int n )

{

}

main() /* 主函数 */

{ void NONO ();

printf("%f\n", fun(10));

NONO();

}

void NONO ()

{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */

FILE *fp, *wf ;

int i, n ;

double s ;

fp = fopen("K:\\k49\\24000121\\in.dat","r") ;

wf = fopen("K:\\k49\\24000121\\out.dat","w") ;

for(i = 0 ; i < 10 ; i++) {

fscanf(fp, "%d", &n) ;

s = fun(n) ;

fprintf(wf, "%f\n", s) ;

}

fclose(fp) ;

fclose(wf) ;

}

本题难度:较难

涉及知识点:数值累加

名师解析:本题是上机题中程序设计题数值类的典型题型,主要对数列进行前n项的求和计算。在进行此类编程时,要注意几点:1.题中形参n表示计算的前N项的值。2.计算时,要设置结果变量的类型并进行初始化,函数的返回值为double类型,所以double s=0;。

3.在进行除的运算时,要区分整除与浮点除的操作。C语言中,int/int结果也为int,所以s+=1.0/(n*(n+1));。4.循环次数指定明确(for(I=1 ;I<=n;I++))。5.返回值语句:return s;。

修改题答案:

1.错误:void fun (long s, long t) 正确:void fun(long s, long *t)

2.错误:while ( s < 0) 正确:while(s!=0)

设计题答案:

double fun( int n )

{

double s=0;

int I;

for(I=1 ;I<=n;I++)

s+=1.0/(n*(n+1));

return s;

}

编后:

2008年上半年二级C语言考试的解析就到此结束了,大家从这些考题的解析中学到了不少知识点的运用技巧吧。我们会在以后推出更多更好的且与二级考试相关的内容,欢迎大家继续关注。