上海2009年C二级考题(共16页).doc
精选优质文档-倾情为你奉上2009年C语言测试题1一、 选择题二、 填空题1、 表达式 sizeof(“C2009”) 的值是_2、 在C语言中,标识符只能由字母、数字和下划线字符组成,并且第一个字符不能是_ 字符。3、定义 int b=7; float a=5.2, c=6.9; 则表达式 b*(int)(a+c)/2 的值为_4、设x、y均为整型变量,完成以下语句,以实现不借助任何其它变量将x、y的值进行交换:x = x + y; y = x - _ ; x = x - _ ;5、设有如下定义,并且结构体数组student中的元素都已有值,若要将这些元素写到 fp 指向的文件中,请将函数调用语句 fwrite( student, sizeof(struct st), 50, _ ); 补充完整。struct st char name8; int num; float s3; student50; 6、写出下列程序的输出结果_ #include <stdio.h>long fac( int n ) if ( n=1 ) return 1; return n*fac(n-1);main() printf( "5!=%ldn", fac(5) );7、假定建立了以下链表结构,如图所示。指针p与q指向2个不同的结点,t为与data同类型的数据变量,则交换2结点数据的语句为:t=p->data; _;和_;三、 程序填空题1、以下程序按每行5个数的格式输出1至n范围内能被7或17 整除的整数,并求出其和。如输入:50则输出:7 14 17 21 2834 35 42 49Sum=247源程序:#include <stdio.h>void main()int i, n, ct=0, sum=0;scanf( "%d", &n );for ( i=1; i<=n; i+ )if ( _(1)_ )printf( "%dt", i );_(2)_;ct+;if ( _(3)_ )printf( "n" );printf( "nSum=%dn", sum );2、以下程序输入10个整数到a数组,找到并输出其中最大的整数及其下标。如输入:80 290 150 520 330 -160 -99 0 200 9则输出:a3=520源程序:#include <stdio.h>#define N 10int get_max_index( int a, int n )int i, k=0;for ( i=1; i<n; i+ )if ( _(1)_ )k = i;return _(2)_;void main()int i, k, aN;for ( i=0; i<N; i+ )scanf( "%d", &ai );k = _(3)_;printf( "a%d=%dn", k, ak );3、以下程序从文件“student.txt”读取学生的学号、姓名、平时成绩和考试成绩,从键盘上输入平时成绩在总成绩中所占比重,计算每个学生的总成绩(四舍五入为整数)后输出到屏幕上。文件的最后一行为0表示学生数据结束。设文件student.txt的内容为101 Zhao9558103 Qian7581105 Sun9991107 Li 80670运行时键盘输入:0.1则屏幕输出:101 Zhao 95 58 62103 Qian 75 81 80105 Sun 99 91 92107 Li 80 67 68源程序:#include <stdio.h>void calc( FILE *fp, float x )int num, score1, score2;float score3;char name20;while ( !feof(fp) ) /* 文件还有未读数据时 */num = 0;fscanf( fp, "%d%s%d%d", &num, name, &score1, &score2 );if ( num > 0 ) /* 学生数据有效时 */score3 = score1 * x + score2 * (1-x);/* 计算总成绩 */printf( "%3d %-7s %3d %3d %3dn", num, name, score1, score2, _(1)_ ); /* 总成绩四舍五入为整数 */void main()FILE *fp;float x;fp = fopen( "student.txt", "r" );if ( _(2)_ )/* 如果文件打开失败 */printf( "File Open Error!n" );return;scanf( "%f", &x );calc( _(3)_ );/* 调用calc函数 */fclose( _(4)_ );/* 关闭文件 */四、 操作题四、程序调试题(本大题2小题,第1题4分,第2题6分,共10分)1. 程序调试题1(B_3_1.C)调试要求:下列程序不能得到正确的结果,请按题中的功能要求,调试并修改该程序(在所修改语句后加/*/字样的注释),使其运行能得到正确的结果。将结果(包括B_3_1.c文件和B_3_1.exe文件)保存到目录C:KS中。功能说明:程序计算并输出1! + 2! + + n!(1至n阶乘的累加和),其中函数fact(n)计算n!的值,返回类型为double。如输入:10则输出:1!+2!+10! = 原程序(见C:KSB_3_1.C):#include <stdio.h>double fact( int n ) int i; double result = 1; for ( i=1; i<n; i+ ) result = result * i; return result;void main() int i, n; double sum = 0; scanf( "%d", &n ); for ( i=1 ; i<=n; i+ ) sum += fact(int i); printf( "1!+2!+.+%d! = %.0lfn", n, sum );2. 程序调试题2(B_3_2.C)调试要求:下列程序有3处错误,请按题中的功能要求,在不改变程序结构(不增加、删除语句,不调整语句顺序)的情况下调试并修改该程序(在所修改语句后加/*/字样的注释),使其运行能得到正确的结果。将结果(包括B_3_2.c文件和B_3_2.exe文件)保存到目录C:KS中。功能说明:程序输入任意一行字符串(设字符数不大于20),提取该字符串中的数字字符并组成一个整数,输出该整数及其两倍的值。如输入:abc12e3fgh4i则输出:1234 2468原程序(见C:KSB_3_2.C):#include <stdio.h>void main() int i, n=0; char str80; gets(str80); for ( i=0; stri!='0' i+ ) if ( stri>=0 && stri<=9 ) n = n*10 + stri;printf("%d %dn", n, 2*n);五、编程题(本大题2小题,每题18分,共36分)1编程题1(B_5_1.C)编程要求:请按题中的功能要求,编写程序并能得到正确的结果。将结果(包括B_5_1.C文件和B_5_1.exe文件)保存到目录C:KS中。功能说明:输入5个整数,输出其中正整数的累加和与正整数的平均值,输入输出格式如以下示例。如输入:10 0 20 -5 31则输出:Sum=61, Average=20.32编程题2(B_5_2.C)编程要求:请按题中的功能要求,编写程序并能得到正确的结果。将结果(包括B_5_2.C文件和B_5_2.exe文件)保存到目录C:KS中。功能说明:输入正整数m和n(设100mn999),输出m到n之间满足下列条件的三位数:它的个位数的立方加十位数的平方再加上百位数等于该数的本身(例如13513*35*5*5)。如输入:135 555则输出:135 175 518答案:第1套 参考答案注:C语言场次从B场开始,共3场单选题1. D2. B3. C4. B5. A6. B7. B8. D9. B10. D填空题1. 【6】2. 【数字】3. 【42】4. 1)【y】2)【y】5. 【fp】6. 【5!=120】7. 1)【p->data=q->data】2)【q->data=t】程序填空题1. 1)【i%7=0|i%17=0】2)【sum+=i】3)【ct%5=0】2. 1)【ai>ak】【ai>=ak】2)【k】3)【get_max_index(a,N)】3. 1)【(int)(score3+0.5)】【(int)(10*score3+5)/10】2)【fp=NULL】3)【fp,x】4)【fp】三、程序调试题 第1题(B_3_1.C)参考答案#include <stdio.h>double fact( int n ) int i; double result = 1; for ( i=1; i<=n; i+ ) /*modified*/ result = result * i; return result;void main() int i, n; double sum = 0; scanf( "%d", &n ); for ( i=1 ; i<=n; i+ ) sum += fact(i); /*modified*/ printf( "1!+2!+.+%d! = %.0lfn", n, sum );第2题(B_3_2.C)参考答案#include <stdio.h>void main() int i, n=0; char str80; gets(str); /*modified*/ for ( i=0; stri!='0' i+ ) if (stri>='0'&&stri<='9') /*modified*/ n = n*10 + stri - '0' /*modified*/printf("%d %dn", n, 2*n);五、编程题第1题(B_5_1.C),参考程序#include <stdio.h>main() int i, x, n, sum; float ave; sum = 0; n = 0; for ( i=0; i<5; i+ ) scanf( "%d", &x ); if ( x>0 ) sum += x; n+; ave = (float)sum / n; printf( "Sum=%d, Average=%4.1fn", sum, ave );第2题(B_5_2.C),参考程序#include <stdio.h>main() int m,n,i,a,b,c; scanf( "%d%d", &m, &n ); for ( i=m; i<=n; i+ ) a = i%10; b = i/10%10; c = i/100%10; if ( i=c+b*b+a*a*a ) printf( "%d ", i ); 专心-专注-专业