国家计算机等级考试2级C语言机试答案.docx
第1套:一、程序填空题下列给定程序中,函数fun的功能是:计算如下公式并且把计算结果作为函数值返回。例如:若形参e的值为le-3,函数的返回值为0.551690。请在下面划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:部分源程序在文件BLANK1.C中。不得增行或删行,也不得更改程序的结构!试题程序:#include <stdio.h> double fun(double e) int i, k; double s, t, x;s=0; k=l; i=2;/* * ou nd * */ x=_1_/4;/* fou nd */ while(x _2_e) s=s+k*x;k=k* (-1);t=2*i;/* * fou nd */x=_3_/(t*t);i+;return s;main() double e=le-3;printfC'XnThe result is: %fn",fun(e);程序改错题 下列给定程序中函数fun的功能是:求出以下分数序列的前n项之和。和值通过函数值返 回。例如,若n = 5,则应输出:8.391667»请改正程序中的错误,使它能计算出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!试题程序:# include <stdlib.h># include <conio.h># include <stdio.h>/不 *found*/void fun (int n ) int a=2,b=l,c,k; double s=0.0; for(k=l ;k<=n;k+) (/* found* * * * * */ s = s + (Double)a / b; c = a; a = a + b; b = c; ) return (s);Void main() (int n = 5;system(4kCLSM);printf( MnThe value of function is:fun ( n );) 三、 程序设计题请编写一个函数fun,其功能是:找出2XM整型二维数组中最大元素的值,并将此值返回调 用函数。注意:部分源程序给出去下。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若 干语句。给定源程序:#define M 4#include <stdio.h>Int fun (int aM) ( void main() (int arr2M=5,8,3,45,76,-4,12,82); printf("max =%dn,', fun(arr);)第1套【参考答案】 一、程序填空题(1)3.0 或(double(2)>(3) (t+1)二、 程序改错题1 )double fun(int n) (2)s=s+(double)a/b; 三、程序设计题int fun (int aM) (int i,j,max=a00;for(i=0;i<2;i+)for(j=0;j<M;j+)if(max<aij) max=aij;return max;I第2套:一、程序填空题下列给定程序中,函数fun的功能是:计算如下公式前n项的和,并作为函数值返回。例如,当形参n的值为的时,函数返回值为:9.612558o请在程序的下划线处填入正确的内容并把卜.划线删除,使程序得出正确的结果。注意:部分源程序给出去下。不得增行或删行,也不得更改程序的结构!试题程序:#include <stdio.h>double fun(int n) int i; double s, t;/* * found*/s=_1_;/* * fou nd */for(i=l; i<=_2_; i+) t=2.0*i;/字* found */s=s+(2.0*i-l)*(2.0*i+1)/_3_;)return s;Void main() int n=-l;while(n<0) printf(MPlease input(n>0): "); scanf(M%dn,&n); printf("nThe result is: %fn",fun(n);二、 程序改错题下列给定程序中函数fun的功能是:统计substr所指子字符串在str所指的字符串中出现的 次数。例如,若字符串为aaaslkaaas,子字符串为as,则应输出2。请改正程序中的错误,使它能计算出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!试题程序:#include <stdio.h>int fun (char * str,char *substr) int i,j,k,num=0;/*found*/for(i = 0, stri, i+)fbr(j=i,k=O;substrk=strj ;k+j+)/* *ound*/If(substrk+l=W) num+;break;return num;)main()(char str80,substr80;printf(nInput a string:");gets(str);printf("Input a substring:'1);gets(substr);printf(n%dn'fun(str,substr);)三、 程序设计题请编写一个函数fun,其功能是:根据以下公式求“的值(要求满足精度0.0005,即某项小于0.0005时停止迭代):程序运行后,如果输入精度0.0005,则程序输出为3.14。注意:部分源程序给出去下。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若 干语句。给定源程序:#include <stdio.h>#include <conio.h>#include <math.h>double fun ( double eps)Void main() double x;printf(nInput eps:");scanf(H%lf;&x);printf(Mneps = %lf, PI=%lfnH, x, fun(x);)第2套【参考答案】-、程序填空题(DO (2)n(3) (t*t)二、程序改错题l)for(i=0;stri;i+)(2)if(substrk+1 = *0)三、程序设计题double fun (double eps)(double s= 1.0,s 1 = 1.0;int n=l;while(sl>=eps)/*当某项大于精度要求时,继续求下一项*/sl=sl*n/(2*n+l);/* 求多项式的每一项*/s=s+sl;/* 求和*/n+;return 2*s;第3套:一、 程序填空题给定程序中,函数fun的功能是:统计形参s所指字符串中数字字符出现的次数,并存放在 形参t所指的变量中,最后在主函数中输出。例如,形参s所指的字符串为: uabcdef35adgh3kjsdf7",则输出结果为:4。请在下面划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:部分源程序给出去如下。不得增行或删行,也不得更改程序的结构!试题程序:#include <stdio.h>void fun(char *s, int *t) int i, n;n=0;/萃* found * */for(i=0;1!=0; i+)/字字* found* */if(si>='O,&&si<= 2) n+;/不*found*/3;main() char s80=,abcdef35adgh3kjsdf7M;int t;printf("nThe original string is : %snM,s);fun(s,&t);printf(unThe result is : %dn't);)二、程序改错题下列给定程序中函数fun的功能是:实现两个变量值的交换,规定不允许增加语句和表达 式。例如变量a中的值原为8, b中的值原为3,程序运行后a中的值为3, b中的值为8。 请改正程序中的错误,使它能计算出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构! 试题程序:# include <stdlib.h># include <conio.h># include <stdio.h>int fun(int *x,int y) int t;/* *found*/I*found*/ retum(y);)void main() int a = 3, b = 8 ;printf("%d %dn", a, b); b = fun(&a, b);printf(n%d %dnM, a, b);三、程序设计题编写函数fun,它的功能是:求出1至IJ 1000之间能被7或11整除、但不能同时被7和II 整除的所有整数,并将它们放在a所指的数组中,通过n返回这些数的个数。注意:部分源程序给出去下。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若 干语句。给定源程序:# include <stdlib.h># include <conio.h># include <stdio.h>void fun (int *a, int *n) void main() int aa1000, n, k ; system( “CLS”); fun ( aa, &n );for ( k = 0 ; k < n ; k+ ) if(k + 1)% 10= 0) printf("5d",aak);printf(“n"); elseprintf("5d”, aakj)第3套【参考答案】一、程序填空题(l)si(2) '9'(3)*t=n二、程序改错题l)t = *x ; *x = y ;(2)return(t);或 return t;二、程序设计题void fun (int *a, int *n)(int i,j=0;for(i=l;i<=1000;i+)/*求1到1000之内能被7或11整除、但不能同时被7和11整除的所有整数,并放入数组a中*/if(i%7=0lli%l l=0)&&i%77!=0) aj+=i;*n=j;)第4套:一、程序填空题下列给定程序中,函数fun的功能是:把形参a所指数组中的奇数按原顺序依次存放到a0, al, a2、中,把偶数从数组中删除,奇数个数通过函数值返回。例如:若a所指数组中的数据最初排列为:9、1、4、2、3、6、5、8、7,删除偶数后a所指数组 中的数据为:9、1、3、5、7,返回值为5。请在下面划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:部分源程序给出去下。不得增行或删行,也不得更改程序的结构!试题程序:#include <stdio.h> #define N 9 int fun(int a, int n) int i,j;j = 0;for (i=0; i<n; i+)/* * fou nd */ if(ai%2=-1)/字 * found* */ aj = ai; 2一;)/* fou nd */return3;main() int bN=9J,4,23,6,5,8,7), i,n; printf(nnThe original data :nM);for (i=0; i<N; i+) printf(n%4d bi);printf(MnM);n = fun(b, N);printf("nThe number of odd : %d nM, n);printf(nnThe odd number :nn);for (i=0; i<n; i+) printf("%4d H, bi);printf(nnH);二、程序改错题下列给定程序中函数fun的功能是:求出两个非零正整数的最大公约数,并作为函数值返 回。例如,若给numl和num2分别为49和21,则输出的最大公约数为7:若numl和num2分 别为27和81,则输出的最大公约数为27。请改正程序中的错误,使它能计算出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!试题程序:#include <stdio.h>int fun(int ajnt b) int r,t;if(a<b) /字* found * /t=a; b=a; a=t;r=a%b;while(r!=0) a=b; b=r; r=a%b; /豕* found */retum(a);)main() int numl, num2,a;printf(uInput numl num2: "); scanf("%d%dn,&num 1 ,&num2);printf("numl= %d num2= %dnnu,num 1 ,num2);a=fun(num l,num2);printf("The maximun common divisor is %dnn",a);)三、程序设计题规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:删除字符串中所有 的*号。在编写函数时,不得使用C语言提供的字符串函数。例如,字符串中的内容为:*A*BC*DEF*G*,删除后,字符串中的内容应当是:ABCDEFGo注意:部分源程序给出去下。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若 干语句。给定源程序:# include <conio.h>#include <stdio.h> void fun( char *a ) (void main() char s81;printf(MEnter a string:nH);gets(s);fun( s);printf("The string after deleted:nH);puts(s);第4套【参考答案】一、程序填空题(1)1(2)j+(3)j二、程序改错题1)t=a;a=b;b=t;(2)return(b);或 return b;三、程序设计题 void fun( char *a ) (int i,j=O;for(i=0;ai !=、0'i+)if(ai !='*')a|j+=ai;/*若不是要删除的字符则留下*/a|j='O'第5套:一、程序填空题下列给定程序中,函数fun的功能是:将形参n中,各位上为偶数的数取出,并按原来从高 位到低位相反的顺序组成一个新的数,并作为函数值返回。例如,输入一个整数:27638496,函数返回值为:64862。请在下面划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:部分源程序给出去下。不得增行或删行,也不得更改程序的结构! 试题程序:#include <stdio.h>unsigned long fun(unsigned long n) unsigned long x=0; int t; while(n) t=n%10;/不 * found* */if(t%2=_l_)/* * fou nd */ x=2+1;/* * fou nd */ n=_3_;return x;)main() unsigned long n=-l;while(n>99999999lln<0) printf("Please input(0<n< 100000000): "); scanf(,%ld'&n); printf(unThe result is: %ldn",fun(n);二、程序改错题下列给定程序中函数fun的功能是:将长整型数中每一位上为奇数的数依次取出,构成一 个新数放在t中。高位仍在高位,低位仍在低位。例如,当s中的数为:87653142时,t中的数为:753k请改正程序中的错误,使它能计算出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!试题程序:#include <stdio.h>#include <stdio.h>#include <conio.h>void fun (long s, long *t)(int d;long sl=l;/¥*found*/t = 0;while ( s > 0) d = s%10;/不* found* Iif(d%2 = 0) *t = d * si + *t;TAB si *= 10;s/= 10;main() long s, t;clrscr();printf(MnPlease enter s:M); scanf(n%ldn, &s);fun(s, &t);printf("The result is: %ldnM, t);三、程序设计题编写函数fun,其功能是:实现两个字符串的连接(不使用库函数strcat),即把p2所指的字符串连 接到pl所指的字符串后。例如,分别输入下面两个字符串:FirstStringSecondString 程序输出: FirstStringSecondString 注意:部分源程序给出去下。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若 干语句。给定源程序:#include <stdio.h>#include <stdio.h>#include <conio.h>void fun(char pl , char p2)(void main() charsl80,s240;systemC'CLS");printf("Enter si and s2:nn);scanf(n%s%sH, s 1, s2);printf(nsl=%snn, si);printf(Ms2=%snM, s2);printf(nInvoke fun(sl,s2):nn);fun(sl, s2);printf("After invoking:n");printf(n%snn, si);)第5套【参考答案】-、程序填空题(1)0(2) 10*x (3) n/10二、程序改错题(l)*t=0;(2)if(d%2!=0)或 if(d%2=l) 三、程序设计题void fun(char pl, char p2)(int i,j;for(i=0;pl i!=A0'i+);forO=0;p2j!='0'j+)pli+J=p2j;pli=W;)第6套:一、程序填空题下列给定程序中,函数fun的功能是:把形参a所指数组中的最小值放在元素a0中,接着 把a所指数组中的最大值放在al元素中;再把a所指数组元素中的次小值放在a2中,把a 数组元素中的次大值放在a3中;依次类推。例如1:,若a所指数组中的数据最初排列为: 9,1,4,2,3,658,7,则按规则移动后,数据排列为:1,9,2,8,3,7,4,65。形参n中存放a所指数 组中数据的个数。规定fun函数中的max存放当前所找的最大值,px存放当前所找最大值的下标。请在下面划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:部分源程序给出去下。不得增行或删行,也不得更改程序的结构!试题程序:# include <stdio.h>#define N 9void fun(int a, int n) int i,j, max, min, px, pn, t;for (i=0; i<n-l; i+=2)/* * fou nd */max = min =1;px = pn = i;for(j=i+l;j<n;j+) /不 * fou nd* */if (max<_2) max = aj;px=j; /豕* found */if (min>3) min = aj;pn=j; if (pn != i) t = ai; ai = min; apn = t; if (px = i) px =pn;if (px != i+1) t = ai+l; ai+l = max; apx = t; ) void main() int bN=9,l,4,2,3,6,5,8,7,i;printf("nThe original data :nu);for (i=0; i<N; i+) printf(M%4d ”, bi);printf(MnM);fun(b, N);printf(MnThe data after moving :n");for (i=0; i<N; i+) printf(M%4d ",bi);printfCXn11);)二、程序改错题下列给定程序中函数fun的功能是:用递归算法计算斐波拉契数列中第n项的值。从第1 项起,斐波拉契数列为:1、1、2, 3、5、8、13、21、例如,若给n输入7,该项的斐波拉契数值为:13。请改正程序中的错误,使它能得出正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 给定源程序:#include <stdio.h> long fun(int g) (/* found */ switch(g); case 0: return 0;/* found * */case 1 ;case 2 : return 1 ;retum( fun(g-l)+fun(g-2);) main() long fib; int n; printfC'Input n: "); scanf("d”,&n); printf(Mn = %dn”,n); fib=fun(n);printf(nfib = %dnn",fib);) 三、程序设计题 某学生的记录由学号、8门课程成绩和平均分组成,学号和8门课程的成绩已在主函数中给 出。请编写函数fun,它的功能是:求出该学生的平均分并放在记录的ave成员中。例如,学生的成绩是:85.5,76,69.5,85,91,72,64.5,87.5,他的平均分应当是:78.875« 注意:部分源程序给出去下。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若 干语句。给定源程序:#include <stdio.h>#define N 8 typedef struct char num10;double sN;double ave;STREC;void fun(STREC *a) main() STREC s="GA005”,85.5,76,69.5,85,91,72,64.5,87.5; int i;fun( &s);printf("The %s's student data:nn, s.num);for(i=0;i<N; i+)printf("4.1fn”,s.si);printf(',nave=%7.3fn,s.ave);)第6套【参考答案】一、程序填空题 ai (2) aj (3)aj二、程序改错题(1)去掉分号(2)case 1 :case 2:retum 1;三、程序设计题void fun(STREC *a)inti;a->ave=0.0;for(i=0;i<N;i+)a->ave=a->ave+a->si; /* 求各门成绩的总和 */a->ave/=N;/* 求平均分*/1第7套:一、程序填空题下列给定程序中,函数fun的功能是进行数字字符转换。若形参ch中是数字字符0-9,则,9转换成O;若是其它字符则保持不变;并将O转换成9,T转换成8, 2转换成7, 转换后的结果作为函数值返回。请在下面划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:部分源程序给出去下。不得增行或删行,也不得更改程序的结构!试题程序:#include <stdio.h>/* found* */1fun(char ch)/不 * found* */ if(ch>='0' &&2)* found * */ return '9'" (ch-3一);return ch ;main() char c 1, c2;printf(HnThe result :nu);cl =2; c2 = fun(cl);printf("cl=%c c2=%cnH, cl, c2);cl=8; c2 = fun(cl);printf(ucl=%c c2=%cnM, cl, c2);cl=,a'c2 = fun(cl);printf(ucl=%c c2=%cn", cl, c2);二、程序改错题下列给定程序中函数fun的功能是:将p所指字符串中的所有字符复制到b中,要求每复 制三个字符之后插入一个空格。例如,若给a输入字符串:ABCDEFGHIJK,调用函数之后,字符数组b中的内容则为:ABCDEF GHI JKo请改正程序中的错误,使它能计算出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!试题程序:#include <stdio.h>void fun(char *p, char *b) int i, k=0;while(*p) i=l;while( i<=3 && *p ) /萃* fou nd */bk=p;k+; p+; i+;/不 * found* */ bk+=" bk='O'main() char a80,b80;printf("Enter a string: "); gets(a);printf(nThe original string: "); puts(a);fun(a,b);printf(unThe string after insert space: "); puts(b); printf(nnn");)三、程序设计题N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。请编写 函数fun,它的功能是:求出平均分,由函数值返回。例如,若学生的成绩是:85, 76, 69, 85, 91, 72, 64, 87,则平均分应当是:78.625。 注意:部分源程序给出去下。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若 干语句。给定源程序:#include <stdio.h>#include <stdlib.h>#define N 8struct slist(double s;struct slist *next;;typedef struct slist STREC;double fun( STREC *h )STREC * creat( double *s)/ *创建链表* /(STREC *h,*p,*q;int i=0;h=p=(STREC*)malloc(sizeof(STREC);p->s=0; while(i<N) q=(STREC*)malloc(sizeof(STREC);q->s=si; i+; p->next=q; p=q;)p->next=0;return h;outlist( STREC *h) STREC *p;p=h->next; printfChead1');do printf(M->%4.1 f',p->s);p=p->next;while(p!=0);printfCAnXn");main() double sN= 85,76,69,85,91,72,64,87 ,ave;STREC *h;h=creat( s); outlist(h);ave=fun( h);printf(nave= %6.3fn'ave);)第7套【参考答案】一、程序填空题(l)char (2) ch<='9' (3)'O'二、程序改错题(l)bk=*p;(2)bk="k+;三、程序设计题double fun( STREC *h )(double ave=0.0;STREC *p=h->next;while(p!=NULL) ave=ave+p->s;p=p->next;)return ave/N;第8套:一、程序填空题下列给定程序中,函数fun的功能是:求出ss所指字符串数组中长度最短的字符串所在的行 下标,作为函数值返回,并把其串长放在形参n所指的变量中。ss所指字符串数组中共有M 个字符串,且串长小于N。请在下画划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:部分源程序给出去下。不得增行或删行,也不得更改程序的结构!试题程序:#include <stdio.h>#include <string.h>#define M 5#define N 20Int fun(char (*ss)N, int*n) int i,k=0, len=N;/* fou nd * */for(i=0; i<_1_ i+) len=strlen(ssi);if(i=0) *n=len;/* * fou nd */if(len_2_*n)*n =len;K=i; /* found* */Return (_3_); main() char ssMN= Hshanghain,guangzhou,nbeijing'';'tianjing,;,cchongqing,);int n, k, i;printf("nThe original strings are :nn);for(i=0; i<M; i+) printf(M%sn',ssi);k=fun (aa,&n);printf(nnthe length of shortese string is:%d/nM,n);printf("The shortese string is : %sn M,ssk);1二、程序改错题下列给定程序中函数fun的功能是:将tt所指字符串中的小写字母都改为对应的大写字母, 其他字符不变。例如,若输入” Ab,cD”,则输出“AB,CD”。试题程序:#include <conio.h>#include <stdio.h>#include <string.h>char *fun(char ttJ) inti;for(i=0;tti;i+)/豕* found */ if(tti>='a') I I (tti<='z') /* fou nd * */tti+=32;return (tt);main() char tt81;printf("nPlease enter a string:");gets(tt);printf("nThe result string is: n%sM, fun(tt);三、程序设计题请编写函数fun,其功能是:将所有大于1小于