全国计算机等级考试二级C语言练习题(四)
1.程序填空题
给定程序中,函数fun的功能是:在形参ss所指字符串数组中,将所有串长超过k的字符串中右边的字符删除,只保留左边的k个字符。Ss所指字符串数组中共有N个字符串,且串长小于M。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <string.h>
#define N 5
#define M 10
/**********found**********/
void fun(char (*ss)___1___int k)
{
int i=0 ;
/**********found**********/
while(i<___2___){
/**********found**********/
ss[i][k]=___3___; i++; }
}
main()
{
char x[N][M]={"Create","Modify","Sort","skip","Delete"};
int I;
printf("The original string\n");
for(i=0;i<N;i++) puts(x[i]);
printf("\n");
fun(x,4);
printf("The string after deleted :\n");
for(i=0;i<N;i++) puts(x[i]);
printf("\n");
}
【答案】
(1)[M],或[10], (2)N或=N-1 (3)'\0'
2.程序修改题
给定程序中,函数fun的功能是:先从键盘上输入一个3行3列矩阵的各个元素的值,然后输出主对角线元素之和。
请改正函数fun中的错误或在横线处填上适当的内容并把横线删除,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
int fun()
{
int a[3][3],sum;
int I,j;
/*********found**********/
1 ;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
/*********found**********/
scanf("%d",a[i][j]);
}
for(i=0;i<3;i++) sum=sum+a[i][i];
printf("sum=%d\n",sum);
}
main()
{
fun();
}
【答案】
(1)填sum=0;
(2)将scanf("%d",a[i][j]); 改为:
scanf("%d",&a[i][j]);
3.程序设计题
编写函数fun,其功能是实现矩阵(3行3列)的转置(即行列互换)。
例如,输入下面的矩阵:
100 200 300
400 500 600
700 800 900
程序输出:
100 400 700
200 500 800
300 600 900
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
int fun(int array[3][3])
{
}
main()
{
int I,j;
int array[3][3]={{100,200,300},
{400,500,600},{700,800,900}};
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%7d",array[i][j]);
printf("\n");
}
fun(array);
printf("Converted array:\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%7d",array[i][j]);
printf("\n");
}
}
【答案】
int fun(int array[3][3])
{
int j,k,t;
for(j=0;j<3;j++)
for(k=0;k<j;k++)
{
t=s[j][k];
s[j][k]=s[k][j];
s[k][j]=t;
}
}
1.程序填空题
请补充fun函数,该函数的功能是求能整除k且是偶数的数,把这些数保存在数组a,并按从大到小输出。
例如,当k=20时,依次输出20 10 8 4 2。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <conio.h>
#include <stdio.h>
void fun(int k,int a[])
{
int I;
int j=0;
for(___1___;i<=k;i++)
if(k%i==0___2___i%2==0)
a[j++]=I;
printf("\n\n ");
for(i=___3___;i>=0;i--)
printf("%d ",a[i]);
}
main()
{
int k=1;
int a[100];
printf("\nPlease input k\n");
scanf("%d",&k);
fun(k,a);
}
【答案】
(1)i=1 (2)&& (3)--j
2.程序修改题
给定程序中,fun函数的功能是:求出以下分数序列的前n项之和。
2/1、3/2、5/3、8/5、13/8、21/13、……和值通过函数值返回main函数。
例如,若n=5,则应输出:8.391667。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
/**********found**********/
fun(int n)
{
int a=2,b=1,c,k;
double s=0.0;
for(k=1;k<=n;k++)
{
s=s+1.0*a/b;
/**********found**********/
c=a;a+=b;b+=c;
}
return(s);
}
main()
{
int n=5;
printf("The value of function is:%lf\n",
fun(n));
}
【答案】
(1)将fun(int n) 改为:double fun(int n)
(2)将c = a;a += b;b += c; 改为:
c = a;a += b;b = c;
3.程序设计题
请编写函数fun,函数的功能是:将大于形参m且紧靠m的k个素数存入xx所指的数组中。例如,若输入17、5,则应输出:19、23、29、31、37。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
void fun(int m,int k,int xx[])
{
}
main()
{
int m,n,zz[1000] ;
printf( "Please enter two integers:");
scanf("%d%d",&m,&n);
fun(m,n,zz);
for(m=0;m<n;m++) printf("%d ",zz[m]);
printf("\n");
}
【答案】
void fun(int m,int k,int xx[])
{
int j,n=0;
while(n<k)
{
m++;
for(j=2; j<m; j++)
if(m%j==0) break;
if(j>=m) xx[n++]=m;
}
}
1.程序填空题
给定程序中,函数fun的功能是将带头结点的单向链表逆置。即若原链表中从头至尾结点数据域依次为:2、4、6、8、10,逆置后从头至尾结点数据域依次为:10、8、6、4、2。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <stdlib.h>
#define N 5
typedef struct node
{int data;
struct node *next;
}NODE;
void fun(NODE *h)
{
NODE *p,*q,*r;
/**********found**********/
p=___1___;
/**********found**********/
if(___2___)return;
q=p->next;
p->next=NULL;
while(q)
{
r=q->next;q->next=p;
/**********found**********/
p=q;q=___3___;
}
h->next=p;
}
NODE*creatlist(int a[])
{
NODE *h,*p,*q; int I;
h=(NODE*)malloc(sizeof(NODE));
h->next=NULL;
for(i=0;i<N;i++)
{
q=(NODE*)malloc(sizeof(NODE));
q->data=a[i];
q->next=NULL;
if(h->next==NULL) h->next=p=q;
else { p->next=q; p=q; }
}
return h;
}
void outlist(NODE *h)
{
NODE *p;
p=h->next;
if(p==NULL)
printf("The list isNULL!\n");
else
{
printf("Head ");
do
{
printf("->%d",p->data);
p=p->next;
}while(p!=NULL);
printf("->End\n");
}
}
main()
{
NODE *head;
int a[N]={2,4,6,8,10};
head=creatlist(a);
printf("The original list:\n");
outlist(head);
fun(head);
printf("The list after inverting :\n");
outlist(head);
}
【答案】
(1)h->next
(2)p==NULL 或p==0 或h->next==NULL
(3)r
2.程序修改题
假定整数数列中的数不重复,并存放在数组中。给定程序中,函数fun的功能是:删除数列中值为x的元素变量,变量n存放的是数列中元素的个数。
请改正程序中的错误,使其能得出正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio.h>
#define N 20
fun(int *a,int n,int x)
{
int p=0,I;
a[n]=x;
while(x!=a[p])
p=p+1;
/**********found**********/
if(P==n) return-1;
else
{
for(i=p;i<n;i++)
/**********found**********/
a[i+1]=a[i];
return n-1;
}
}
main()
{
int w[N]={-3,0,1,5,7,99,10,15,30,90},
x,n,I;
n=10;
printf("The original data :\n");
for(i=0;i<n;i++) printf("%5d",w[i]);
printf("Input x(to delete): ");
scanf("%d",&x);
printf("Delete : %d\n",x);
n=fun(w,n,x);
if(n==-1)
printf("***Not be found!***\n");
else
{
printf("The data after deleted:\n");
for(i=0;i<n;i++) printf("%5d",w[i]);
printf("\n");
}
}
【答案】
(1)将if(P==n) return -1; 改为:
if(p==n) return -1;
(2)将a[i+1]=a[i]; 改为:a[i]=a[i+1];
3.程序设计题
学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:把分数最低的学生数据放在b所指的数组中。注意,分数最低的学生可能不止一个,函数返回分数最低的学生的人数。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
#define N 16
typedef struct
{charnum[10];
int s;
}STREC;
intfun(STREC *a,STREC *b)
{
}
main()
{
STREC s[N]={{"GA05",85},{"GA03",76},
{"GA02",69},{"GA04",85},
{"GA01",91},{"GA07",72},
{"GA08",64},{"GA06",87},
{"GA015",85},{"GA013",91},
{"GA012",64},{"GA014",91},
{"GA011",91},{"GA017",64},
{"GA018",64},{"GA016",72}};
STREC h[N];
int I,n;
FILE *out ;
n=fun(s,h);
printf("The %d lowest Score :\n",n);
for(i=0;i<n; i++)
printf("%s %4d\n",h[i].num,h[i].s);
printf("\n");
out=fopen("out24.dat","w");
fprintf(out,"%d\n",n);
for(i=0;i<n;i++)
fprintf(out,"%4d\n",h[i].s);
fclose(out);
}
【答案】
int fun(STREC *a,STREC *b)
{
int j,n=0; double min=100.0;
for(j=0;j<N;j++)
if(min>a[j].s)
min=a[j].s;
for(j=0;j<N;j++)
if(a[j].s==min)
b[n++]=a[j];
return n;
}
1.程序填空题
程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。所有学生数据均以二进制方式输出到文件中。函数fun的功能是重写形参filena me所指文件中最后一个学生的数据,即用新的学生数据覆盖该学生原来的数据,其他学生的数据不变。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#define N 5
typedef struct student
{
long sno;
char name[10];
float Score[3];
}STU;
void fun(char*filename,STU n)
{ FILE *fp;
/**********found**********/
fp=fopen(___1___,""rb+"");
/**********found**********/
fseek(fp,-1L*sizeof(STU),___2___);
/**********found**********/
fwrite(___3___,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}};
STU n={10006,""ZhaoSi"",55,70,68},ss[N];
int I,j;FILE *fp;
fp=fopen(""student.dat"",""wb"");
fwrite(t,sizeof(STU),N,fp);
fclose(fp);
fp=fopen(""student.dat"",""rb"");
fread(ss, sizeof(STU), N, fp);
fclose(fp);
printf(""\nThe original data :\n\n"");
for(j=0;j<N;j++)
{
printf(""No:%ld Name:%-8s Scores: "",ss[j].sno,ss[j].name);
for(i=0;i<3;i++)
printf(""%6.2f"",ss[j].Scor
Chapter_3
e[i]);
printf(""\n"");
}
fun(""student.dat"", n);
printf(""The data after modifing :\n"");
fp=fopen(""student.dat"",""rb"");
fread(ss,sizeof(STU),N,fp);
fclose(fp);
for(j=0;j<N;j++)
{
printf(""No:%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)filename (2)SEEK_END或2 (3)&n
2.程序修改题
给定程序中,函数fun的功能是:在字符串的最前端加入n个*号形成新串,并且覆盖原串。注意:字符串的长度最长允许为79。
请改正函数fun中指定位置的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <string.h>
void fun(char s[],int n)
{
char a[80],*p;
int I;
/**********found***********/
s=p;
for(i=0;i<n;i++) a[i]='*';
do
{
a[i]=*p; i++;
}
/**********found***********/
while(*p);
a[i]=0;
strcpy(s,a);
}
main()
{
int n;char s[80];
printf("\nEnter a string : ");
gets(s);
printf("The string %s\n",s);
printf("Enter n ( number of * ) : ");
scanf("%d",&n);
fun(s,n);
printf("The string after inster:%s",s);
}
【答案】
(1)将s=p; 改为:p=s;
(2)将while(*p); 改为:while(*p++);
3.程序设计题
N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。请编写函数fun,其功能是:找出学生的最低分,由函数值返回。
注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
#include <stdlib.h>
#define N 8
struct 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));
p->s=s[i]; i++; p->next=q; p=q;
}
p->next=NULL;
return h; /*返回链表的首地址*/
}
outlist(STREC *h)
{
STREC *p;
p=h;
printf("head");
do
{printf("->%2.0f ",p->s);p=p->next;}
while(p!=NULL);
printf("\n\n");
}
main()
{
double s[N]={56,89,76,95,91,68,75,85},
min;
STREC *h;
h=creat(s);
outlist(h);
min=fun(h);
printf("min=%6.1f\n",min);
}
【答案】
double fun(STREC *h)
{
double min=h->s;
while(h!=NULL)
{
if(min>h->s) min=h->s;
h=h->next;
}
return min;
}
1.程序填空题
给定程序中,函数fun的功能是将a和b所指的两个字符串转换成面值相同的整数,并进行相加作为函数值返回,规定字符串中只含9个以下数字字符。
例如,主函数中输入字符串:32486和12345,在主函数中输出的函数值为:44831。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define N 9
long ctod(char *s )
{
long d=0;
while(*s)
if(isdigit(*s)) {
/**********found**********/
d=d*10+*s-___1___;
/**********found**********/
___2___; }
return d;
}
long fun(char *a,char *b)
{
/**********found**********/
return___3___;
}
main()
{
char s1[N],s2[N];
do
{
printf("Input string s1 : ");
gets(s1);
}while(strlen(s1)>N);
do
{
printf("Input string s2 : ");
gets(s2);
}while(strlen(s2)>N);
printf("The result is: %ld\n",fun(s1,s2));
}
【答案】
(1)'0'或48
(2)s++
(3)ctod(a)+ctod(b)
2.程序修改题
给定程序中,函数fun的功能是:计算函数F(x,y,z)=(x+y)/(x-y)+(z+y)/(z-y)的值。其中x和y的值不等,z和y的值不等。
例如,当x的值为9、y的值为11、z的值为15时,函数值为-3.50。
请改正程序中的错误,使其能得出正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
/**********found**********/
#define FU(m,n) (m/n)
float fun(float a,float b,float c)
{
float value;
value=FU(a+b,a-b)+FU(c+b,c-b);
/**********found**********/
Return(Value);
}
main()
{
float x,y,z,sum;
printf("Input x y z: ");
scanf("%f%f%f",&x,&y,&z);
printf("x=%f,y=%f,z=%f\n",x,y,z);
if(x==y||y==z)
{printf("Data error!\n");exit(0);}
sum=fun(x,y,z);
printf("The result is : %5.2f\n",sum);
}
【答案】
(1)将FU(m,n)(m/n) 改为:FU(m,n)((m)/(n))
(2)将Return(Value); 改为:return(value);
3.程序设计题
规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:将字符串中的前导*号全部删除,中间和尾部的*号不删除。
例如,字符串中的内容为:*******A*BC*DEF *G****,删除后,字符串中的内容应当是:A*BC*D EF*G****。在编写函数时,不得使用C语言提供的字符串。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
voidfun(char *a)
{
}
main()
{
char s[81];
printf("Enter a string:\n");
gets(s);
fun(s);
printf("The string after deleted:\n");
puts(s);
}
【答案】
fun(char *s)
{
int k=0,j=0,n=strlen(s);
while(s[k]=='*')
k++;
for( ; k<n+1; k++)
s[j++]=s[k];
}
1.程序填空题
给定程序中函数fun的功能是:将a所指4×3矩阵中第k行的元素与第0行元素交换。
例如,有下列矩阵:
1 2 3
4 5 6
7 8 9
10 11 12
若k为2,程序执行结果为:
7 8 9
4 5 6
1 2 3
10 11 12
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#define N 3
#define M 4
/**********found**********/
void fun(int(*a)[N],int___1___)
{
int I,j,temp;
/**********found**********/
for(I=0;I<___2___;I++)
{
temp=a[0][I];
/**********found**********/
a[0][I]=___3___;
a[k][I]=temp;
}
}
main()
{
int x[M][N]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}},I,j;
printf("The array before moving:\n");
for(I=0;I<M;I++)
for(j=0;j<N;j++)
printf("%3d",x[I][j]);
printf("\n\n");
fun(x,2);
printf("The array after moving:\n\n");
for(I=0;I<M;I++)
{
for(j=0;j<N;j++)
printf("%3d",x[I][j]);
printf("\n\n");
}
}
【答案】
(1)k (2)N 或 =N-1 (3)a[k][i]
2.程序修改题
给定程序中,函数fun的功能是:给一维数组a输入任意4个整数,并按下例的规律输出。例如,输入1、2、3、4程序运行后将输出以下方阵:
4 1 2 3
3 4 1 2
2 3 4 1
1 2 3 4
请改正函数fun中指定部位的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#define M 4
/**********found**********/
void fun(int a)
{
int I,j,k,m;
printf("Enter 4 number : ");
for(i=0;i<M;i++) scanf("%d",&a[i]);
printf("The result :\n");
for(i=M;i>0;i--)
{
k=a[M-1];
for(j=M-1;j>0;j--)
/**********found**********/
aa[j]=a[j-1];
a[0]=k;
for(m=0;m<M;m++) printf("%d ",a[m]);
printf("\n");
}
}
main()
{
int a[M];
fun(a);
printf("\n\n");
}
【答案】
(1)将void fun(int a) 改为:
void fun(int a[])
(2)将aa[j]=a[j-1]; 改为:a[j]=a[j-1];
3.程序设计题
请编写函数fun,其功能是计算并输出下列多项式的值:
Fn=1+1/1!+1/2!+1/3!+1/4!+…+1/m!
例如,若主函数从键盘给m输入5,则输出为F=2.716667。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的花括号中填入所编写的若干语句。
#include <stdio.h>
double fun(int m)
{
}
main()
{
int m;
double f;
printf("Input m: ");
scanf("%d",&m);
f=fun(m);
printf("F=%f\n",f);
}
【答案】
double t,s=1.0;
int i,j;
for(i=1;i<=m;i++)
{
t=1.0;
for(j=1;j<=i;j++)
t*=j;
s+=1.0/t;
}
return s;
1.程序填空题
给定程序中,函数fun的功能是:把形参s所指字符串中最右边的n个字符复制到形参t所指字符数组中,形成一个新串。若s所指字符串的长度小于n,则将整个字符串复制到形参t所指字符数组中。
例如,形参s所指的字符串为:abcdefgh,n的值为5,程序执行后t所指字符数组中的字符串应为:defgh。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <string.h>
#define N 80
void fun(char *s,int n,char *t)
{
int len,I,j=0;
len=strlen(s);
/**********found**********/
if(n>=len) strcpy(___1___);
else
{
for(i=len-n;i<=len-1;i++)
/**********found**********/
t[j++]=___2___;
/**********found**********/
t[j]=___3___;
}
}
main()
{
char s[N],t[N];
int n;
printf("Enter a string: "); gets(s);
printf("Enter n:"); scanf("%d",&n);
fun(s,n,t);
printf("The string t : ");
puts(t);
}
【答案】
(1)t, s (2)s[i] (3)'\0'
2.程序修改题
给定程序中,函数fun的功能是:统计一个无符号整数中各位数字值为零的个数,通过形参传回主函数;并把该整数中各位上最大的数字值作为函数值返回。例如,若输入无符号整数30800,则数字值为零的个数为3,各位上数字值最大的是8。
请改正函数fun中指定部位的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
int fun(unsigned n,int *zero)
{
int count=0,max=0,t;
do
{
t=n%10;
/**********found**********/
if(t=0)
count++;
if(max<t) max=t;
n=n/10;
}while(n);
/**********found**********/
zero=count;
return max;
}
main()
{
unsigned n; int zero,max;
printf("Input n(unsigned): ");
scanf("%d",&n);
max=fun(n,&zero);
printf("The result:max=%d zero=%d\n",
max,zero);
}
【答案】
(1)将 if(t=0) 改为:if(t==0)
(2)将 zero=count; 改为:*zero=count;
3.程序设计题
请编写函数fun,其功能是:计算并输出:
例如,若主函数从键盘给m输入10后,则输出为F=104.478749。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的花括号中填入所编写的若干语句。
#include <math.h>
#include <stdio.h>
double fun(int m)
{
}
main()
{
int m;
double f;
FILE *out;
printf("\nInput m: ");
scanf("%d",&m);
f=fun(m);
printf("\n\nf=%f\n\n",f);
out=fopen("outfile.dat","w");
for(m=0;m<10;m++)
fprintf(out,"%f\n",fun(m+20));
fclose(out);
}
【答案】
int i;
double f=1.0,p=1.0;
for(i=2;i<=m;i++)
{
p+=pow(i,0.5);
f+=p;
}
return f;