1、 2017年全国计算机等级考试C语言上机考试题库学生练习用第41套至第60套第四十一套1、程序填空以下给定程序中,函数fun的功能是:将形参s所指字符串中的所有字母字符顺序前移,其他字符顺序后移,处理后将新字符串的首地址作为函数值返回。例如,假设s所指字符串为:asd123fgh543df,处理后新字符串为:asdfghdf123543。请在程序的下画线处填入正确的容并将下画线删除,使程序得出正确的结果。注意:局部源程序在文件BLANK1.C中。不得增行或删行,也不得更改程序的结构!-#include #include #include char *fun(char *s) int i, j,
2、 k, n; char *p, *t; n=strlen(s)+1; t=(char*)malloc(n*sizeof(char); p=(char*)malloc(n*sizeof(char); j=0; k=0; for(i=0; i=a)&(si=A)&(si=Z) /*found*/ tj=_1_; j+; else pk=si; k+; /*found*/ for(i=0; i_2_; i+) tj+i=pi;/*found*/ tj+k= _3_; return t;main() char s80; printf(Please input: ); scanf(%s,s); prin
3、tf(nThe result is: %sn,fun(s);-【参考答案】(1)si(2)k(3)0或0【考点分析】此题考察:数组元素赋值操作;for循环语句中循环变量的取值围;字符串完毕标识0。【解题思路】填空1:将字符串s中所有字母元素赋给数组t。填空2:字符串中所有非字母元素放到字母元素后面,所以取值围是0k。填空3:最后给字符串参加完毕标识0。2、程序修改以下给定程序中函数fun的功能是:将s所指字符串中最后一次出现的与t1所指字符串一样的子串替换成t2所指字符串,所形成的新串放在w所指的数组中。要求t1和t2所指字符串的长度一样。例如,当s所指字符串中的容为:abcdabfabc,t
4、1所指串中的容为ab,t2所指子串中的容为99时,结果在w所指的数组中的容应为abcdabf99c。请改正程序中的错误,使它能得出正确的结果。注意:局部源程序在文件MODI1.C中,不得增行或删行,也不得更改的程序的结构!-#include #include void fun (char *s, char *t1, char *t2 , char *w) char *p , *r, *a; strcpy( w, s );/*found*/ while ( w ) p = w; r = t1; while ( *r )/*found*/ IF ( *r = *p ) r+; p+; else b
5、reak; if ( *r = 0 ) a = w; w+; r = t2; while ( *r ) *a = *r; a+; r+; main() char s100, t1100, t2100, w100; printf(nPlease enter string S:); scanf(%s, s); printf(nPlease enter substring t1:); scanf(%s, t1); printf(nPlease enter substring t2:); scanf(%s, t2); if ( strlen(t1)=strlen(t2) ) fun( s, t1, t
6、2, w); printf(nThe result is : %sn, w); else printf(nError : strlen(t1) != strlen(t2)n);-【参考答案】(1)while(*w)(2)if(*r=*p)【考点分析】此题考察:while循环语句,C语言中的关键字。【解题思路】(1)这里要判断的是值的真假,而不是地址,所以改为while(*w)。(2)C语言中关键字区分大小写,只需运行程序,就可以根据错误提示找到。3、程序设计编写函数fun,其功能是:将s所指字符串中ASCII值为奇数的字符删除,剩余字符形成的新串放在t所指数组中。例如,假设s所指字符串中的容为
7、:ABCDEFG12345,其中字符A的ASCII码值为奇数,字符1的ASCII码值也为奇数,都应当删除,其它依此类推。最后t所指的数组中的容应是:BDF24。注意:局部源程序在文件PROG1.C中。请勿改动主函数main和其它函数中的任何容,仅在函数fun的花括号中填入你编写的假设干语句。-#include #include void fun(char *s, char t)main() char s100, t100;void NONO (); printf(nPlease enter string S:); scanf(%s, s); fun(s, t); printf(nThe res
8、ult is: %sn, t); NONO();void NONO ()/* 本函数用于翻开文件,输入数据,调用函数,输出数据,关闭文件。 */ char s100, t100 ; FILE *rf, *wf ; int i ; rf = fopen(in.dat,r) ; wf = fopen(out.dat,w) ; for(i = 0 ; i 10 ; i+) fscanf(rf, %s, s) ; fun(s, t) ; fprintf(wf, %sn, t) ; fclose(rf) ; fclose(wf) ;#include #include void fun(char *s,
9、char t)main() char s100, t100;void NONO (); printf(nPlease enter string S:); scanf(%s, s); fun(s, t); printf(nThe result is: %sn, t); NONO();void NONO ()/* 本函数用于翻开文件,输入数据,调用函数,输出数据,关闭文件。 */ char s100, t100 ; FILE *rf, *wf ; int i ; rf = fopen(in.dat,r) ; wf = fopen(out.dat,w) ; for(i = 0 ; i 10 ; i+
10、) fscanf(rf, %s, s) ; fun(s, t) ; fprintf(wf, %sn, t) ; fclose(rf) ; fclose(wf) ;-【参考答案】voidfun(char*s,chart)inti,j=0,n;n=strlen(s);for(i=0;in;i+)/*找出ASCII码值为偶数的字符依次存入数组中*/if(si%2=0)tj=si;j+;tj=0;【考点分析】此题考察:ASCII码值为奇数或偶数的判定方法,同时掌握删除字符的思想,即重新保存非删除字符。【解题思路】要删除ASCII码值为奇数的字符,也就是要保存ASCII码值为偶数的字符,由于最终是要求出
11、剩余字符形成的新串,所以此题的算法是对原字符串从头到尾扫描,并找出ASCII码值为偶数的字符依次存入数组中。第四十二套1、程序填空给定程序中,函数fun的功能是将参数给定的字符串、整数、浮点数写到文本文件中,再用字符串方式从此文本文件中逐个读入,并调用库函数atoi和atof将字符串转换成相应的整数、浮点数,然后将其显示在屏幕上。请在程序的下画线处填入正确的容并把下画线删除,使程序得出正确的结果。注意:局部源程序在文件BLANK1.C中。请勿改动main函数和其他函数中的任何容,仅在main函数的横线上填入所编写的假设干表达式或语句。-#include #include void fun(ch
12、ar *s, int a, double f)/*found*/ _1_ fp; char str100, str1100, str2100; int a1; double f1; fp = fopen(file1.txt, w); fprintf(fp, %s %d %fn, s, a, f);/*found*/ _2_ ; fp = fopen(file1.txt, r);/*found*/ fscanf(_3_,%s%s%s, str, str1, str2); fclose(fp); a1 = atoi(str1); f1 = atof(str2); printf(nThe resul
13、t :nn%s %d %fn, str, a1, f1);main() char a10=Hello!; int b=12345; double c= 98.76; fun(a,b,c);-【参考答案】1FILE*2fclose(fp)3fp【解题思路】填空1:从使用fp=fopen(file1.txt,w)可知fp应该是文件类型指针,因此本空因该填写FILE*。填空2:当对fp作翻开操作的时候,并进展不同的操作前,应该对其关闭,因为在第一次翻开时是对fp进展写操作,而在第二次翻开后进展的是读操作,因此应该先对fp进展关闭,本空填fclose(fp)。填空3:fscanf()是把文本文件输出,
14、因此本空只能填写fp。2、程序修改以下给定程序中,函数fun的功能是:对N名学生的学习成绩,按从高到低的顺序找出前m(m10)名学生来,并将这些学生的数据存放在一个动态分配的连续存储区中,此存储区的首地址作为函数值返回。请改正程序中的错误,使它能得出正确的结果。注意:局部源程序在文件MODI1.C中,不得增行或删行,也不得更改程序的结构。-#include #include #include #include #include #define N 10typedef struct ss char num10; int s; STU;STU *fun(STU a, int m) STU bN,*
15、t; int i, j,k;/*found*/ *t=calloc(m,sizeof(STU); for(i=0;iN;i+) bi=ai; for(k=0;km;k+) for (i=j=0;ibj.s) j=i;/*found*/ tk.num=bj.num; tk.s=bj.s; bj.s=0; return t;outresult(STU a,FILE *pf) int i; for(i=0;i10) printf(nGive the number of the students who have better score: ); scanf(%d,&m); pOrder=fun(a,
16、m); printf(* THE RESULT*n); printf(The top :n); for(i=0;im;i+) printf(%s %dn,pOrderi.num, pOrderi.s); free(pOrder);-【参考答案】(1)t=calloc(m,sizeof(STU);(2)tk=bj;【解题思路】1calloc应用于分配存空间。调用形式为(类型说明符*)calloc(n,size),功能:在存动态存储区中分配n块长度为size字节的连续区域,函数的返回值为该区域的首地址,(类型说明符*)用于强制类型转换。calloc函数与malloc函数的区别在于calloc函数一
17、次可以分配n块区域。例如,ps=(structstu*)calloc(2,sizeof(structstu);,其中的sizeof(structstu)是求stu的结构长度。该语句的意思是:按stu的长度分配两块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。在此题中不用考虑那么复杂,根据定义类型STUbN,*t;就可以看出*t=calloc(m,sizeof(STU)中的错误。2tk.num=bj.num的错误旨在考察对结构体概念的掌握和灵活应用程度。3、程序设计请编写函数fun,该函数的功能是:删除一维数组中所有一样的数,使之只剩一个。数组中的数已按由小到大的顺序排列,函数返
18、回删除后数组中数据的个数。例如,假设一维数组中的数据是:2223445666677899101010删除后,数组中的容应该是:2345678910注意:局部源程序在文件PROG1.C中。请勿改动main函数和其他函数中的任何容,仅在函数fun的花括号中填入所编写的假设干语句。-#include #define N 80int fun(int a, int n)void main() FILE *wf; int aN= 2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10, i, n=20; printf(The original data :n); for(i
19、=0; in; i+) printf(%3d,ai); n=fun(a,n); printf(nnThe data after deleted :n); for(i=0; in; i+) printf(%3d,ai); printf(nn);/*/ wf=fopen(out.dat,w); for(i=0; in; i+) fprintf(wf,%3d,ai); fclose(wf);/*/-【参考答案】intfun(inta,intn)inti,j=1;for(i=1;in;i+)if(aj-1!=ai)/*假设该数与前一个数不一样,那么要保存*/aj+=ai;returnj;/*返回不一样
20、数的个数*/【解题思路】该程序的流程是:定义变量i和j,其中j用于控制删除后剩下的数在数组中的下标,i用于搜索原数组中的元素。j始终是新数组中最后一个元素的下一个元素的下标,所以if语句中的条件是aj-1!=ai,其中aj-1就是新数组中的最后一个元素,假设条件成立,那么表示出现了不同的值,所以ai要保存到新数组中。注意此题中i和j的初值都要从1开场,该算法只能用于数组已排序的题目中。第四十三套1、程序填空以下给定程序中,函数fun的功能是:计算NN矩阵的主对角线元素和反向对角线元素之和,并作为函数值返回。要求先累加主对角线元素中的值,再累加反向对角线元素中的值。例如,假设N3,有以下矩阵:首
21、先累加1、5、9,然后累加3、5、7,函数返回值为30。请在程序的下画线处填入正确的容并将下画线删除,使程序得出正确的结果。注意:局部源程序在文件BLANK1.C中。不得增行或删行,也不得更改程序的结构!-#include #define N 4fun(int tN, int n) int i, sum;/*found*/ _1_; for(i=0; in; i+)/*found*/sum+=_2_ ; for(i=0; in; i+)/*found*/ sum+= tin-i-_3_ ; return sum;main() int tN=21,2,13,24,25,16,47,38,29,1
22、1,32,54,42,21,3,10,i,j; printf(nThe original data:n); for(i=0; iN; i+) for(j=0; jN; j+) printf(%4d,tij); printf(n); printf(The result is: %d,fun(t,N);-【参考答案】(1)sum=0(2)tii(3)1【考点分析】此题考察:变量初始化;NN矩阵对角线下标如何表示;累加操作。【解题思路】填空1:变量sum用来储存和结果,所以将其初始化为0。填空2:从题目中我们可以了解到,主对角线元素的行和列下标是一样的,所以应填入tii。填空3:对于反向对角线元素的
23、行和列的下标,它们的关系是相加和为n1,所以应填入1。2、程序修改以下给定程序中函数fun和funx的功能是:用二分法求方程的一个根,并要求绝对误差不超过0.001。例如,假设给m输入-100,n输入90,那么函数求得的一个根为2.000。请改正程序中的错误,使它能得出正确的结果。注意:局部源程序在文件MODI1.C中,不得增行或删行,也不得更改程序的结构。-#include #include double funx(double x) return(2*x*x*x-4*x*x+3*x-6); double fun( double m, double n)/*found*/ int r; r=
24、(m+n)/2;/*found*/ while(fabs(n-m)0.001) if(funx(r)*funx(n)0.001)【考点分析】此题考察:变量数据类型;while循环语句。【解题思路】(1)程序中我们会发现r(mn)/2,而m和n都是double型的,并且根据题意可知,变量r需要定义为double型。(2)绝对误差不超过0.001,所以循环条件应为fabs(nm)0.001。3、程序设计规定输入的字符串中只包含字母和*号。编写函数fun,其功能是:除了字符串前导和尾部的*号外,将串中其它的*号全部删除。形参h已指向字符串中第一个字母,形参p指向字符串的中最后一个字母。在编写函数时,
25、不得使用C语言提供的字符串函数。例如,假设字符串中的容为*A*BC*DEF*G*,删除后,字符串中的容应当是:*ABCDEFG*。在编写函数时,不得使用C语言提供的字符串函数。注意:局部源程序在文件PROG1.C中。请勿改动主函数main和其他函数中的任何容,仅在函数fun的花括号中填入所编写的假设干语句。-#include void fun( char *a, char *h,char *p )main() char s81,*t, *f; void NONO ( ); printf(Enter a string:n);gets(s); t=f=s; while(*t)t+; t-; whi
26、le(*t=*)t-; while(*f=*)f+; fun( s , f,t );printf(The string after deleted:n);puts(s); NONO();void NONO()/* 本函数用于翻开文件,输入数据,调用函数,输出数据,关闭文件。 */ FILE *in, *out ; int i ; char s81, *t, *f ; in = fopen(in.dat,r) ; out = fopen(out.dat,w) ; for(i = 0 ; i 10 ; i+) fscanf(in, %s, s) ; t=f=s; while(*t)t+; t-;
27、while(*t=*)t-; while(*f=*)f+; fun(s, f, t); fprintf(out, %sn, s) ; fclose(in) ; fclose(out) ;-【参考答案】voidfun(char*a,char*h,char*p)inti=0;char*q=a;while(qh)ai=*q;q+;i+;while(qp)if(*q!=*)ai=*q;i+;q+;while(*q)ai=*q;i+;q+;ai=0;【考点分析】此题考察:while循环语句,注意循环条件的设定;指针型变量。【解题思路】此题的重点是要选择好判断条件,首先是需要判断前导*的完毕,然后判断是否
28、指向最后一个字母,最后补充尾部*,只要思路对了就可正确解答。第四十四套1、程序填空以下给定程序中,函数fun的功能是:找出100到x(x999)之间各位上的数字之和为15的所有整数,并在屏幕输出;将符合条件的整数的个数作为函数值返回。例如,当n值为500时,各位数字之和为15的整数有:159、168、177、186、195、249、258、267、276、285、294、339、348、357、366、375、384、393、429、438、447、456、465、474、483、492。共有26个。请在程序的下画线处填入正确的容并将下画线删除,使程序得出正确的结果。注意:局部源程序在文件BL
29、ANK1.C中。不得增行或删行,也不得更改程序的结构!-#include int fun(int x) int n, s1, s2, s3, t;/*found*/ n=_1_; t=100;/*found*/ while(t999|x0) printf(Please input(0x=999): ); scanf(%d,&x); printf(nThe result is: %dn,fun(x);-【参考答案】(1)0(2)x(3)t+【考点分析】此题考察:变量赋初值;while循环语句。【解题思路】填空1:变量n用于存放符合条件的整数的个数,应赋初值为0。填空2:根据题目要求,确定循环变量t的取值围tx