全国计算机等级考试二级C语言练习题(一)
1.程序填空题
程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。所有学生数据均以二进制方式输出到student.dat文件中。函数fun的功能是从指定文件中找出指定学号的学生数据,读入此学生数据,对该生的分数进行修改,使每门课的分数加3分,修改后重写文件中该学生的数据,即用该学生的新数据覆盖原数据,其他学生数据不变;若找不到,则什么都不做。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#define N 5
typedef struct student
{long sno;
char name[10];
float Score[3];
}STU;
void fun(char *filename, long sno)
{
FILE *fp;
STU n; int I;
fp=fopen(filename,"rb+");
/**********found**********/
while(!___1___)
{
fread(&n,sizeof(STU),1,fp);
/**********found**********/
if(n.sno___2___) break;
}
if(!feof(fp))
{
for(i=0;i<3;i++) n.Score[i]+=3;
/**********found**********/
fseek(fp,1L*___3___,SEEK_CUR);
fwrite(&n, sizeof(STU), 1, fp);
}
fclose(fp);
}
main(
{
STU t[N]={{10001,"MaChao",91,92,77},{10002,"CaoKai",75,60,88},{10003,"LiSi",85,70,78},{10004,"FangFang",90,82,87},{10005,"ZhangSan",95,80,88}},ss[N];
int I,j; FILE *fp;
fp=fopen("student.dat","wb");
fwrite(t, sizeof(STU), N, fp);
fclose(fp);
printf("\nThe original data :\n");
fp=fopen("student.dat","rb");
fread(ss, sizeof(STU), N, fp);
fclose(fp);
for(j=0; j<N; j++)
{
printf("\nNo:%ld Name:%-8sScores: ",
ss[j].sno,ss[j].name);
for(i=0;i<3;i++)
printf("%6.2f ",ss[j].Score[i]);
printf("\n");
}
fun("student.dat",10003);
fp=fopen("student.dat","rb");
fread(ss,sizeof(STU),N,fp);
fclose(fp);
printf("\nThe data aftermodifying :\n");
for(j=0;j<N;j++)
{
printf("\nNo:%ld Name: %-8s Scores:",
ss[j].sno,ss[j].name);
for(i=0;i<3;i++)
printf("%6.2f",ss[j].Score[i]);
printf("\n");
}
}【答案】
(1)feof(fp) (2)==sno (3)sizeof(STU)
2.程序修改题
给定程序中,函数fun的功能是:求出s所指字符串中最后一次出现的t所指子字符串的地址,通过函数值返回,在主函数中输出从此地址开始的字符串;若未找到,则函数值为NULL。
例如,当字符串中的内容为“abcdabfabcdx”、t中的内容为“ab”时,输出结果应是abcdx。当字符串中的内容为“abcdabfabcdx”、t中的内容为“abd”时,则程序输出未找到信息not be found!。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <string.h>
char *fun(char *s,char *t)
{
char *p,*r,*a;
/**********found**********/
a=Null;
while(*s)
{
p=s;r=t;
while(*r)
/**********found**********/
if(r==p)
{r++;p++;}
else break;
if(*r=='\0') a=s;
s++;
}
return a ;
}
main()
{
char s[100],t[100],*p;
printf("\nPlease enter string S :");
scanf("%s",s);
printf("\nPlease enter substring t :");
scanf("%s",t);
p=fun(s,t);
if(p) printf("\nThe result is :%s\n",p);
else printf("\nNot found !\n");
}
【答案】
(1)将a=Null; 改为:a=NULL;
(2)将if(r==p) 改为:if(*r==*p)
3.程序设计题
程序定义了N×N的二维数组,并在主函数中自动赋值。请编写函数fun(int a[][N], int n),函数的功能是:使N×N的二维数组左下三角元素中的值乘以n。
例如:若n的值为3,a数组中的值为:
1 9 7
2 3 8
4 5 6
则返回主程序后a数组中的值应为:
3 9 7
6 9 8
12 15 18
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
#include <stdlib.h>
#define N 5
int fun(int a[][N],int n)
{
}
main()
{
int a[N][N],n,I,j;
printf("***The array***\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
a[i][j]=rand()%10;
printf( "%4d", a[i][j] );}
printf("\n");
}
do n=rand()%10; while(n>=3);
printf("n=%4d\n",n);
fun(a,n);
printf ("***THE RESULT***\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
【答案】
int fun(int a[][N],int n)
{
int j,k;
for(j=0;j<N;j++)
for(k=0;k<j+1;k++)
a[j][k]*=n;
}
1.程序填空题
给定程序中,函数fun的功能是:找出N×N矩阵中每列元素中的最大值,并按顺序依次存放于形参b所指的一维数组中。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#define N 4
void fun(int(*a)[N],int *b)
{
int I,j;
for(i=0; i<N; i++)
{
/**********found**********/
b[i]=___1___;
for(j=1;j<N;j++)
/**********found**********/
if(b[i]___2___a[j][i])
b[i]= a[j][i];
}
}
main()
{
int x[N][N]={{12,5,8,7},{6,1,9,3},{1,2,3,4},{2,8,4,3}},y[N],I,j;
printf("\nThe matrix :\n");
for(i=0;i<N;i++)
{
for(j=0; j<N; j++)
printf("%4d",x[i][j]);
printf("\n");
}
/**********found**********/
fun(___3___);
printf("\nThe result is:");
for(i=0; i<N; i++) printf("%3d",y[i]);
printf("\n");
}【答案】
(1)a[0][i] (2) <=或< (3)x, y
3.程序设计题
编写函数fun,它的功能是:利用以下所示的简单迭代方法求方程cos(y)-y=0的一个实根。
Yn+1=cos(yn)
迭代步骤如下:
(1)取y1初值为0.0。
(2)y0=y1,把y1的值赋给y0。
(3)y1=cos(y0),求出一个新的y1。
(4)若y0-y1的绝对值小于0.000001,则执行步骤(5),否则执行步骤(2)。
(5)所求y1就是方程cos(x)-y=0的一个实根,作为函数值返回。
程序将输出结果Result=0.739085。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的花括号中填入所编写的若干语句。
#include <conio.h>
#include <math.h>
#include <stdio.h>
float fun()
{
}
main()
{
FILE *out;
float cos=fun();
printf("Result=%f\n",cos);
out=fopen("outfile.dat","w");
fprintf(out,"%f",cos);
fclose(out);
}
【答案】
float y1=0.0,y0;
do
{
y0=y1;
y1=cos(y0);
}
while(fabs(y0-y1)>=1e-6);
return y1;
1.程序填空题
在主函数中从键盘输入若干个数放入数组a中,用0结束输入但不计入数组。下列给定程序中,函数fun的功能是:输出数组元素中小于平均值的元素。
例如,数组中元素的值依次为34、54、675、456、453、121,则程序的运行结果为34、54、121。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <conio.h>
#include <stdio.h>
void fun(___1___,int n)
{
double count=0.0;
double average=0.0;
int i=0;
for(i=0;i<n;i++)
___2___;
average=___3___;
for(i=0;i<n;i++)
if(a[i]<average)
{
if(i%5==0)
printf("\n");
printf("%d,",a[i]);
}
}
main()
{
int a[1000];
int i=0;
printf("\nPlease enter datas(end with 0):");
do
{
scanf("%d",&a[i]);
}while(a[i++]!=0);
fun(a,i-1);
}
【答案】
(1) int a[] (2)count+=a[i]或count=count+a[i] (3)count/n
2.程序修改题
给定程序中,函数fun的功能是:根据整型形参m,计算如下公式的值:
y=1+1/(2*2)+1/(3*3)+1/(4*4)+…+1/(m*m)
例如:若m中的值为5,则应输出1.463611。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
double fun(int m)
{
double y=1.0;
int I;
/**********found**********/
for(i=2;i<m;i++)
/**********found**********/
y+=1/(i*i);
return(y);
}
main()
{
int n=5;
printf("\nThe result is %lf\n", fun(n));
}
【答案】
(1)将for(i=2;i<m;i++) 改为:
for(i=2;i<=m;i++)
(2)将y+=1/(i*i); 改为:y +=1.0/(i*i);
3.程序设计题
函数fun的功能是:将s所指字符串中除了下标为偶数、同时ASCII值也为偶数的字符外,其余的全都删除;串中剩余字符所形成的一个新串放在t所指的数组中。
例如,若s所指字符串中的内容为“ABCDEFG 123456”,其中字符A的ASCII码值为奇数,因此应当删除;其中字符B的ASCII码值为偶数,但在数组中的下标为奇数,因此也应当删除;而字符2的ASCII码值为偶数,所在数组中的下标也为偶数,因此不应当删除,其他依此类推。最后,t所指的数组中的内容应是“246”。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
#include <string.h>
void fun(char *s, char t[])
{
}
main()
{
char s[100],t[100];
printf("\nPlease enter string S:");
scanf("%s", s);
fun(s,t);
printf("\nThe result is: %s\n",t);
}
【答案】
void fun(char *s,char t[])
{
int k,n=0;
for(k=0;k<strlen(s);k++)
if(k%2==0 && s[k]%2==0)
t[n++]=s[k];
t[n]= '\0';
}
1.程序填空题
请补充函数fun,该函数的功能是:统计所有小于等于x(x>2)的素数的个数,素数的个数作为函数值返回。例如,输入x=20,结果:2,3,5,7,11,13,17,19。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
int fun(int x)
{
int I,j,count=0;
printf("\nThe prime number between 2 to %d\n",x);
for(i=2;i<=x;i++)
{
for(___1___;j<I;j++)
if(__2___%j==0)
break;
if(___3___>=i)
{
count++;
printf(count%15 ? "%5d" : "\n%5d",i);
}
}
return count;
}
main()
{
int x=20,result;
result=fun(x);
printf("\nThe number of prime is : %d\n",result);
}
【答案】
(1)j=2 (2)i (3)j
2.程序修改题
给定程序中,函数fun的功能是:依次取出字符串中所有数字字符,形成新的字符串,并取代原字符串。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
void fun(char *s)
{
int I,j;
for(i=0,j=0;s[i]!='\0';i++)
if(s[i]>='0'&&s[i]<='9')
/**********found**********/
s[j]=s[i];
/**********found**********/
s[j]="\0";
}
main()
{
char item[80];
printf("\nEnter a string:");
gets(item);
printf("The string is:%s\n",item);
fun(item);
printf("The string of changing is:%s\n",item);
}
【答案】
(1)将s[j]=s[i]; 改为:s[j++]=s[i];
(2)将s[j]="\0"; 改为:s[j]= '\0';
3.程序设计题
请编写函数fun,它的功能是:计算n门课程的平均分,计算结果作为函数值返回。
例如,若有5门课程的成绩是90.5、72、80、61.5、55,则函数的值为:71.80。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
float fun(float *a,int n)
{
}
main()
{
float Score[30]={90.5,72,80,61.5,55},
aver;
aver=fun(Score,5);
printf("Average Score is:%5.2f\n",
aver);
}
【答案】
float fun(float *a,int n)
{
float s=0.0;
int I;
for(i=0; i<n; i++)
s+=a[i];
return s/n;
}
1.程序填空题
给定程序中,函数fun的功能是:计算下式前n项的和作为函数值返回:
S=1*3/2*2+3*5/4*4+5*7/6*6+…+(2n-1)*(2n+2)/
(2n)*(2n)
例如:当行参n的值为10时,函数返回9.612558。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:部分源程序已给出。不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
double fun(int n)
{
int I; double s,t;
/**********found**********/
s=___1___;
/**********found**********/
for(i=1;i<=___2___;i++)
{
t=2.0*I;
/**********found**********/
s=s+(2.0*i-1)*(2.0*i+1)/___3___;
}
return s;
}
main()
{
int n=-1;
while(n<0)
{
printf("Please input(n>0): ");
scanf("%d",&n);
}
printf("The result is: %f\n",fun(n));
}
【答案】
(1)0 (2)n (3)(t*t)
2.程序修改题
在给定程序中,fun函数的功能是:将n个无序整数从小到大排序。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <stdlib.h>
fun(int n,int*a)
{
int I,j,p,t;
for(j=0;j<n-1;j++)
{
p=j;
/**********found**********/
for(i=j+1;i<n-1;i++)
if(a[p]>a[i])
/**********found**********/
t=I;
if(p!=j)
{t=a[j];a[j]=a[p];a[p]=t;}
}
}
putarr(int n,int *z)
{
int I;
for(i=1;i<=n;i++,z++)
{
printf("%4d",*z);
if(!(i%10)) printf("\n");
}
printf("\n");
}
main()
{
int aa[20]={9,3,0,4,1,2,5,6,8,10,7},
n=11;
printf("Before sorting%d numbers:\n",n);
putarr(n,aa);
fun(n, aa);
printf("After sorting%d numbers:\n",n);
putarr(n,aa);
}
【答案】
(1)将for(i=j+1;i<n-1;i++) 改为:
for(i=j+1;i<n;i++)或for(i=j+1;i<=n-1;i++)
(2)将t=i;改为:p=i;
3.程序设计题
请编写一个函数unsigned fun(unsigned n),n是一个大于10的无符号整数,若n是m(m≥2)位的整数,则函数求出n的后m-1位的数作为函数值返回。
例如,若n的值为1234,则fun()函数值为234。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的花括号中填入所编写的若干语句。
#include <conio.h>
#include <stdio.h>
unsigned fun(unsigned m)
{
}
main()
{
unsigned n;
FILE *out;
printf("Enter a unsigned integer data : ");
scanf ("%u",&n);
printf("The original data is : %u\n",n);
if(n<10)
printf("Data error!");
else
printf("The result : %u\n",fun(n));
out=fopen("outfile.dat","w");
fprintf(out,"%u",fun(28));
fclose(out);
}
【答案】
unsigned t,s=0,s1=1,p=0;
t=m;
while(t>10)
{
if(t/10)
p=t%10;
s=s+p*s1;
s1=s1*10;
t=t/10;
}
return s;
1.程序填空题
给定程序中,函数fun的功能是:将形参s所指字符串中的所有字母字符顺序前移,其他字符顺序后移,处理后新字符串的首地址作为函数值返回。
例如,s所指字符串为:asd123fgh543df,处理后新字符串为:asdfghdf12543。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#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("The result is:%s\n",fun(s));
}
【答案】
(1)s[i] (2)k (3)'\0'
2.程序修改题
下列给定程序中,函数fun的功能是:求三个数的最小公倍数。例如,给变量a、b、c分别输入15、11、2,则输出结果应当是330。
请改正程序中的错误,使其能得到正确的结果。
注意:不要改动main函数,不能增行或删行,也不得更改程序的结构。
#include <stdio.h>
int fun(int x,int y,int z)
{
int I,temp,n,m;
/*******found*********/
i=1;
temp=m=n=1;
/********found********/
while(temp!=0 && m!=0 && n!=0)
{
i=i+1;
temp=i%x;
m=i%y;
n=i%z;
}
return I;
}
main()
{
int a,b,c,I;
printf("Input a b c: ");
scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d \n",a,b,c);
i=fun(a,b,c);
printf("The minimal common multipleis:%d\n",i);
}
【答案】
(1)将i=1;改为:i=0;
(2)将while(temp!=0 && m!=0 && n!=0)改为:while(temp!=0 || m!=0 || n!=0)
3.程序设计题
编写函数fun,其功能是:根据以下公式计算s,将结果作为函数值返回;n通过形参传入:
S=1+1/(1+2)+1/(1+2+3)+…+1/(1+2+3+…n)
例如:若n的值为11时,函数的值为:1.833333
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
float fun(int n)
{
}
main()
{
int n;
float s;
printf("\nPlease enter N:");
scanf("%d", &n);
s=fun(n);
printf("the result is: %f\n", s);
}
【答案】
float fun(int n)
{
float s=0.0;
int t=0, k;
for(k=1; k<=n; k++)
{ t+=k; s+=1.0/t; }
return s;
}
1.程序填空题
程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。函数fun的功能是将形参a所指结构体变量中的数据赋给函数中的结构体变量b,并修改b中的学号和姓名,最后输出修改后的数据。
例如:a所指变量中的学号、姓名、和三门课的成绩依次是:10001、“ZhangSan”、95、80、88,则修改后输出b中的数据应为:10002、“LiSi”、95、80、88。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <string.h>
struct student
{long sno;
char name[10];
float Score[3];
};
void fun(struct student a)
{
struct student b; int I;
/**********found**********/
b=___1___;
b.sno=10002;
/**********found**********/
strcpy(___2___,"LiSi");
printf("The data after modified:\n");
printf("No:%ld Name:%s\n Scores: ",b.sno,b.name);
for(i=0;i<3;i++)
/**********found**********/
printf("%6.2f",b.___3___);
printf("\n");
}
main()
{
struct student
s={10001,"ZhangSan",95,80,88};
int I;
printf("The original data :\n");
printf("No:%ld Name:%s\nScores: ",s.sno,s.name);
for(i=0;i<3;i++)
printf("%6.2f", s.Score[i]);
printf("\n");
fun(s);
}
【答案】
(1)a (2)b.name (3)Score[i]
2.程序修改题
给定程序是建立一个带头结点的单向链表,并用随机函数为各结点赋值。函数fun的功能是将单向链表结点(不包括头结点)数据域为偶数的值累加起来,并且作为函数值返回。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <stdlib.h>
typedef struct aa
{int data; struct aa*next;}NODE;
int fun(NODE*h)
{
int sum=0;
NODE *p;
/***********found**********/
p=h;
while(p)
{
if(p->data%2==0)
sum+=p->data;
/***********found**********/
p=h->next;
}
return sum;
}
NODE *creatlink(int n)
{
NODE *h,*p,*s,*q;
int I,x;
h=p=(NODE *)malloc(sizeof(NODE));
for(I=1;I<=n;I++)
{
s=(NODE*)malloc(sizeof(NODE));
s->data=rand()%16;
s->next=p->next;
p->next=s;
p=p->next;
}
p->next=NULL;
return h;
}
outlink(NODE *h,FILE *pf)
{
NODE *p;
p=h->next;
fprintf(pf,"THE LIST :\n HEAD");
while(p)
{
fprintf(pf,"->%d",p->data);
p=p->next;
}
fprintf(pf,"\n");
}
outresult(int s,FILE *pf)
{
fprintf(pf,"The sum of even numbers :
%d\n",s);
}
main()
{
NODE *head; int even;
head=creatlink(12);
head->data=9000;
outlink(head,stdout);
even=fun(head);
printf("The result :\n");
outresult(even, stdout);
}
【答案】
(1)将p=h; 改为:p= h->next;
(2)将p=h->next; 改为:p=p->next;
3.程序设计题
请编写函数fun,其功能是:计算并输出3到m之间所有素数的平方根之和。
例如,若主函数从键盘给m输入50后,则输出为s=63.665791。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的花括号中填入所编写的若干语句。
#include <math.h>
#include <stdio.h>
double fun(int m)
{
}
main()
{
int m;
double s;
FILE *out;
printf("\n\nInput m: ");
scanf("%d",&m);
s=fun(m);
printf("\n\ns=%f\n\n",s);
out=fopen("outfile.dat","w");
for(m=0;m<10;m++)
fprintf(out,"%f\n",fun(m+80));
fclose(out);
}
【答案】
int n,k,i;
double sum=0.0;
for(n=3;n<=m;n++)
{
k=sqrt(n);
for(i=2;i<=k;i++)
if(n%i==0) break;
if(i>=k+1)
sum+=sqrt(n);
}
return sum;