欢迎光临散文网 会员登陆 & 注册

全国计算机等级考试二级C语言练习题(四)

2021-02-12 09:02 作者:朝颜晚扶桑  | 我要投稿

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;


全国计算机等级考试二级C语言练习题(四)的评论 (共 条)

分享到微博请遵守国家法律