独家首发 名师解析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语言考试的解析就到此结束了,大家从这些考题的解析中学到了不少知识点的运用技巧吧。我们会在以后推出更多更好的且与二级考试相关的内容,欢迎大家继续关注。