资源描述
2017年全国计算机等级考试C语言上机考试题库
学生练习用第41套至第60套
第四十一套
1、程序填空
以下给定程序中,函数fun的功能是:将形参s所指字符串中的所有字母字符顺序前移,其他字符顺序后移,处理后将新字符串的首地址作为函数值返回。
例如,假设s所指字符串为:"asd123fgh543df",处理后新字符串为:"asdfghdf123543"。
请在程序的下画线处填入正确的容并将下画线删除,使程序得出正确的结果。
注意:局部源程序在文件BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
-----------------------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *fun(char *s)
{ int i, j, 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<n; i++)
{ if(((s[i]>='a')&&(s[i]<='z'))||((s[i]>='A')&&(s[i]<='Z'))) {
/**********found**********/
t[j]=__1__; j++;}
else
{ p[k]=s[i]; k++; }
}
/**********found**********/
for(i=0; i<__2__; i++) t[j+i]=p[i];
/**********found**********/
t[j+k]= __3__;
return t;
}
main()
{ char s[80];
printf("Please input: "); scanf("%s",s);
printf("\nThe result is: %s\n",fun(s));
}
-----------------------------------------------------------------------------------------------------------------
【参考答案】
(1)s[i] (2)k (3)'\0'或0
【考点分析】
此题考察:数组元素赋值操作;for循环语句中循环变量的取值围;字符串完毕标识'\0'。
【解题思路】
填空1:将字符串s中所有字母元素赋给数组t。
填空2:字符串中所有非字母元素放到字母元素后面,所以取值围是0~k。
填空3:最后给字符串参加完毕标识'\0'。
2、程序修改
以下给定程序中函数fun的功能是:将s所指字符串中最后一次出现的与t1所指字符串一样的子串替换成t2所指字符串,所形成的新串放在w所指的数组中。要求t1和t2所指字符串的长度一样。
例如,当s所指字符串中的容为:"abcdabfabc",t1所指串中的容为"ab",t2所指子串中的容为"99"时,结果在w所指的数组中的容应为"abcdabf99c"。
请改正程序中的错误,使它能得出正确的结果。
注意:局部源程序在文件MODI1.C中,不得增行或删行,也不得更改的程序的结构!
-----------------------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <string.h>
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 break;
if ( *r == '\0' ) a = w;
w++;
}
r = t2;
while ( *r ){ *a = *r; a++; r++; }
}
main()
{
char s[100], t1[100], t2[100], w[100];
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, t2, w);
printf("\nThe result is : %s\n", 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所指字符串中的容为:"ABCDEFG12345",其中字符A的ASCII码值为奇数,字符1的ASCII码值也为奇数,都应当删除,其它依此类推。最后t所指的数组中的容应是:"BDF24"。
注意:局部源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何容,仅在函数fun的花括号中填入你编写的假设干语句。
-----------------------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <string.h>
void fun(char *s, char t[])
{
}
main()
{
char s[100], t[100];void NONO ();
printf("\nPlease enter string S:"); scanf("%s", s);
fun(s, t);
printf("\nThe result is: %s\n", t);
NONO();
}
void NONO ()
{/* 本函数用于翻开文件,输入数据,调用函数,输出数据,关闭文件。 */
char s[100], t[100] ;
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, "%s\n", t) ;
}
fclose(rf) ;
fclose(wf) ;
}
#include <stdio.h>
#include <string.h>
void fun(char *s, char t[])
{
}
main()
{
char s[100], t[100];void NONO ();
printf("\nPlease enter string S:"); scanf("%s", s);
fun(s, t);
printf("\nThe result is: %s\n", t);
NONO();
}
void NONO ()
{/* 本函数用于翻开文件,输入数据,调用函数,输出数据,关闭文件。 */
char s[100], t[100] ;
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, "%s\n", t) ;
}
fclose(rf) ;
fclose(wf) ;
}
-----------------------------------------------------------------------------------------------------------------
【参考答案】
void fun(char *s,char t[])
{
int i,j=0,n;
n=strlen(s);
for(i=0;i<n;i++) /*找出ASCII码值为偶数的字符依次存入数组中*/
if(s[i]%2==0)
{
t[j]=s[i];
j++;
}
t[j]='\0';
}
【考点分析】
此题考察:ASCII码值为奇数或偶数的判定方法,同时掌握删除字符的思想,即重新保存非删除字符。
【解题思路】
要删除ASCII码值为奇数的字符,也就是要保存ASCII码值为偶数的字符,由于最终是要求出剩余字符形成的新串,所以此题的算法是对原字符串从头到尾扫描,并找出ASCII码值为偶数的字符依次存入数组中。
第四十二套
1、程序填空
给定程序中,函数fun的功能是将参数给定的字符串、整数、浮点数写到文本文件中,再用字符串方式从此文本文件中逐个读入,并调用库函数atoi和atof将字符串转换成相应的整数、浮点数,然后将其显示在屏幕上。
请在程序的下画线处填入正确的容并把下画线删除,使程序得出正确的结果。
注意:局部源程序在文件BLANK1.C中。
请勿改动main函数和其他函数中的任何容,仅在main函数的横线上填入所编写的假设干表达式或语句。
-----------------------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
void fun(char *s, int a, double f)
{
/**********found**********/
__1__ fp;
char str[100], str1[100], str2[100];
int a1; double f1;
fp = fopen("file1.txt", "w");
fprintf(fp, "%s %d %f\n", 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 result :\n\n%s %d %f\n", str, a1, f1);
}
main()
{ char a[10]="Hello!"; int b=12345;
double c= 98.76;
fun(a,b,c);
}
-----------------------------------------------------------------------------------------------------------------
【参考答案】
〔1〕FILE* 〔2〕fclose(fp) 〔3〕fp
【解题思路】
填空1:从使用fp=fopen("file1.txt","w")可知fp应该是文件类型指针,因此本空因该填写FILE*。
填空2:当对fp作翻开操作的时候,并进展不同的操作前,应该对其关闭,因为在第一次翻开时是对fp进展写操作,而在第二次翻开后进展的是读操作,因此应该先对fp进展关闭,本空填fclose(fp)。
填空3:fscanf()是把文本文件输出,因此本空只能填写fp。
2、程序修改
以下给定程序中,函数fun的功能是:对N名学生的学习成绩,按从高到低的顺序找出前m(m≤10)名学生来,并将这些学生的数据存放在一个动态分配的连续存储区中,此存储区的首地址作为函数值返回。
请改正程序中的错误,使它能得出正确的结果。
注意:局部源程序在文件MODI1.C中,不得增行或删行,也不得更改程序的结构。
-----------------------------------------------------------------------------------------------------------------
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <stdio.h>
#include <malloc.h>
#define N 10
typedef struct ss
{ char num[10];
int s;
} STU;
STU *fun(STU a[], int m)
{ STU b[N],*t;
int i, j,k;
/*************found**************/
*t=calloc(m,sizeof(STU));
for(i=0;i<N;i++) b[i]=a[i];
for(k=0;k<m;k++)
{ for (i=j=0;i<N;i++)
if(b[i].s>b[j].s) j=i;
/*************found**************/
t[k].num=b[j].num;
t[k].s=b[j].s;
b[j].s=0;
}
return t;
}
outresult(STU a[],FILE *pf)
{ int i;
for(i=0;i<N;i++)
fprintf(pf, "No=%s Mark=%d\n ",
a[i].num, a[i].s);
fprintf(pf, "\n\n ");
}
void main()
{ STU a[N]={{ "A01 ",81},{ "A02 ",89},{ "A03 ",66},{ "A04 ",87},{ "A05 ",77},
{ "A06 ",90},{ "A07 ",79},{ "A08 ",61},{ "A09 ",80},{ "A10 ",71}};
STU *pOrder;
int i, m;
system("CLS");
printf("*****THE RESULT*****\n");
outresult(a,stdout);
printf("\nGive the number of the students who have better score: ");
scanf("%d",&m);
while(m>10)
{ printf("\nGive the number of the students who have better score: ");
scanf("%d",&m);
}
pOrder=fun(a,m);
printf("***** THE RESULT*****\n");
printf("The top :\n");
for(i=0;i<m;i++)
printf("%s %d\n",pOrder[i].num, pOrder[i].s);
free(pOrder);
}
-----------------------------------------------------------------------------------------------------------------
【参考答案】
(1)t=calloc(m,sizeof(STU));
(2)t[k]=b[j];
【解题思路】
〔1〕calloc应用于分配存空间。调用形式为 (类型说明符*)calloc(n,size),功能:在存动态存储区中分配n块长度为"size"字节的连续区域,函数的返回值为该区域的首地址,(类型说明符*)用于强制类型转换。calloc函数与malloc 函数的区别在于calloc函数一次可以分配n块区域。例如,ps=(struct stu*) calloc(2,sizeof (struct stu));,其中的sizeof(struct stu)是求stu的结构长度。该语句的意思是:按stu的长度分配两块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。在此题中不用考虑那么复杂,根据定义类型STU b[N],*t;就可以看出*t=calloc(m,sizeof(STU))中的错误。
〔2〕t[k].num=b[j].num的错误旨在考察对结构体概念的掌握和灵活应用程度。
3、程序设计
请编写函数fun,该函数的功能是:删除一维数组中所有一样的数,使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。
例如,假设一维数组中的数据是:
2 2 2 3 4 4 5 6 6 6 6 7 7 8 9 9 10 10 10
删除后,数组中的容应该是:
2 3 4 5 6 7 8 9 10
注意:局部源程序在文件PROG1.C中。
请勿改动main函数和其他函数中的任何容,仅在函数fun的花括号中填入所编写的假设干语句。
-----------------------------------------------------------------------------------------------------------------
#include <stdio.h>
#define N 80
int fun(int a[], int n)
{
}
void main()
{
FILE *wf;
int a[N]={ 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=0; i<n; i++)
printf("%3d",a[i]);
n=fun(a,n);
printf("\n\nThe data after deleted :\n");
for(i=0; i<n; i++)
printf("%3d",a[i]);
printf("\n\n");
/******************************/
wf=fopen("out.dat","w");
for(i=0; i<n; i++)
fprintf(wf,"%3d",a[i]);
fclose(wf);
/*****************************/
}
-----------------------------------------------------------------------------------------------------------------
【参考答案】
int fun(int a[], int n)
{
int i,j=1;
for(i=1;i<n;i++)
if(a[j-1]!=a[i]) /*假设该数与前一个数不一样,那么要保存*/
a[j++]=a[i];
return j; /*返回不一样数的个数*/
}
【解题思路】
该程序的流程是:定义变量i和j,其中j用于控制删除后剩下的数在数组中的下标,i用于搜索原数组中的元素。j始终是新数组中最后一个元素的下一个元素的下标,所以if语句中的条件是a[j-1]!=a[i],其中a[j-1]就是新数组中的最后一个元素,假设条件成立,那么表示出现了不同的值,所以a[i]要保存到新数组中。注意此题中i和j的初值都要从1开场,该算法只能用于数组已排序的题目中。
第四十三套
1、程序填空
以下给定程序中,函数fun的功能是:计算N×N矩阵的主对角线元素和反向对角线元素之和,并作为函数值返回。要求先累加主对角线元素中的值,再累加反向对角线元素中的值。
例如,假设N=3,有以下矩阵:
首先累加1、5、9,然后累加3、5、7,函数返回值为30。
请在程序的下画线处填入正确的容并将下画线删除,使程序得出正确的结果。
注意:局部源程序在文件BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
-----------------------------------------------------------------------------------------------------------------
#include <stdio.h>
#define N 4
fun(int t[][N], int n)
{ int i, sum;
/**********found**********/
___1___;
for(i=0; i<n; i++)
/**********found**********/
sum+=___2___ ;
for(i=0; i<n; i++)
/**********found**********/
sum+= t[i][n-i-___3___] ;
return sum;
}
main()
{ int t[][N]={21,2,13,24,25,16,47,38,29,11,32,54,42,21,3,10},i,j;
printf("\nThe original data:\n");
for(i=0; i<N; i++)
{ for(j=0; j<N; j++) printf("%4d",t[i][j]);
printf("\n");
}
printf("The result is: %d",fun(t,N));
}
-----------------------------------------------------------------------------------------------------------------
【参考答案】
(1) sum=0 (2) t[i][i] (3) 1
【考点分析】
此题考察:变量初始化;N×N矩阵对角线下标如何表示;累加操作。
【解题思路】
填空1:变量sum用来储存"和"结果,所以将其初始化为0。
填空2:从题目中我们可以了解到,主对角线元素的行和列下标是一样的,所以应填入t[i][i]。
填空3:对于反向对角线元素的行和列的下标,它们的关系是相加和为n-1,所以应填入1。
2、程序修改
以下给定程序中函数fun和funx的功能是:用二分法求方程
的一个根,并要求绝对误差不超过0.001。
例如,假设给m输入-100,n输入90,那么函数求得的一个根为2.000。
请改正程序中的错误,使它能得出正确的结果。
注意:局部源程序在文件MODI1.C中,不得增行或删行,也不得更改程序的结构。
-----------------------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <math.h>
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=(m+n)/2;
/************found************/
while(fabs(n-m)<0.001)
{ if(funx(r)*funx(n)<0) m=r;
else n=r;
r=(m+n)/2;
}
return r;
}
main( )
{ double m,n, root;
printf("Enter m n : \n"); scanf("%lf%lf",&m,&n);
root=fun( m,n );
printf("root = %6.3f\n",root);
}
-----------------------------------------------------------------------------------------------------------------
【参考答案】
(1)double r;
(2)while (fabs(n-m)>0.001)
【考点分析】
此题考察:变量数据类型;while循环语句。
【解题思路】
(1)程序中我们会发现r=(m+n)/2,而m和n都是double型的,并且根据题意可知,变量r需要定义为double型。
(2)绝对误差不超过0.001,所以循环条件应为fabs(n-m)>0.001。
3、程序设计
规定输入的字符串中只包含字母和*号。编写函数fun,其功能是:除了字符串前导和尾部的*号外,将串中其它的*号全部删除。形参h已指向字符串中第一个字母,形参p指向字符串的中最后一个字母。在编写函数时,不得使用C语言提供的字符串函数。
例如,假设字符串中的容为****A*BC*DEF*G*******,删除后,字符串中的容应当是:****ABCDEFG********。
在编写函数时,不得使用C语言提供的字符串函数。
注意:局部源程序在文件PROG1.C中。
请勿改动主函数main和其他函数中的任何容,仅在函数fun的花括号中填入所编写的假设干语句。
-----------------------------------------------------------------------------------------------------------------
#include <stdio.h>
void fun( char *a, char *h,char *p )
{
}
main()
{ char s[81],*t, *f;
void NONO ( );
printf("Enter a string:\n");gets(s);
t=f=s;
while(*t)t++;
t--;
while(*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 s[81], *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--;
while(*t=='*')t--;
while(*f=='*')f++;
fun(s, f, t);
fprintf(out, "%s\n", s) ;
}
fclose(in) ;
fclose(out) ;
}
-----------------------------------------------------------------------------------------------------------------
【参考答案】
void fun( char *a, char *h,char *p )
{
int i=0;
char *q=a;
while(q<h)
{
a[i]=*q; q++;i++;
}
while(q<p)
{
if(*q!='*')
{
a[i]=*q;i++;
}
q++;
}
while(*q)
{
a[i]=*q; i++; q++;
}
a[i]='\0';
}
【考点分析】
此题考察:while循环语句,注意循环条件的设定;指针型变量。
【解题思路】
此题的重点是要选择好判断条件,首先是需要判断前导*的完毕,然后判断是否指向最后一个字母,最后补充尾部*,只要思路对了就可正确解答。
第四十四套
1、程序填空
以下给定程序中,函数fun的功能是:找出100到x(x≤999)之间各位上的数字之和为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个。
请在程序的下画线处填入正确的容并将下画线删除,使程序得出正确的结果。
注意:局部源程序在文件BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
-----------------------------------------------------------------------------------------------------------------
#include <stdio.h>
int fun(int x)
{ int n, s1, s2, s3, t;
/**********found**********/
n=__1__;
t=100;
/**********found**********/
while(t<=__2__)
{ s1=t%10; s2=(t/10)%10; s3=t/100;
if(s1+s2+s3==15)
{ printf("%d ",t);
n++;
}
/**********found**********/
__3__;
}
return n;
}
main()
{ int x=-1;
while(x>999||x<0)
{ printf("Please input(0<x<=999): "); scanf("%d",&x); }
printf("\nThe result is: %d\n",fun(x));
}
-----------------------------------------------------------------------------------------------------------------
【参考答案】
(1) 0 (2) x (3) t++
【考点分析】
此题考察:变量赋初值;while循环语句。
【解题思路】
填空1:变量n用于存放符合条件的整数的个数,应赋初值为0。
填空2:根据题目要求,确定循环变量t的取值围t<=x
展开阅读全文