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

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

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

1.程序填空题

请补充函数fun(),该函数的功能是:把数组aa中元素下标为奇数的元素按从大到小的顺序重新保存在原数组中,其他元素位置不变。

例如,输入“33、67、42、58、25、76、85、16、41、56”,则输出“33、76、42、67、25、58、85、56、41、16”。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:不得增行或删行,也不得更改程序的结构!

#include <stdio.h>‘’

#include <windows.h>

#define N 10

void fun(int aa[])

{

int I,j,t;

/**********found**********/

for(___1___; i<N; i=i+2)

{

for(j=I;j<N;j=j+2)

if(aa[i]<aa[j])

{

/**********found**********/

___2___;

aa[j]=aa[i];

/**********found**********/

___3___;

}

}

}

main()

{

int I;

int aa[N]={33,67,42,58,25,76,85,

16,41,56};

system("cls");

printf("\n***original list***\n");

for(i=0;i<N;i++) printf("%4d",aa[i]);

fun(aa);

printf("\n***new list***\n");

for(i=0;i<N;i++)

printf("%4d",aa[i]);

}

【答案】

(1)i=1 (2)t=aa[j] (3)aa[i]=t 

2.程序修改题

在给定程序中建立一个带头结点的单向链表,并用随机函数为各结点数据域赋值。函数fun()的作用是求出单向链表结点(不包括头结点)数据域中的最大值,并且作为函数值返回。

请改正程序中的错误,使其能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

#include <stdio.h>

#include <conio.h>

#include <windows.h>

#include <stdlib.h>

typedef struct aa

{ int data;

struct aa*next;

}NODE;

/**********found**********/

fun(NODE *h)

{

int max=-1;

NODE *p;

p=h->next;

while(p)

{

if(p->data>max)

max=p->data;

/**********found**********/

p=h->next;

}

return max;

}

outresult(int s,FILE *pf)

{ fprintf(pf,"The max in link :%d\n ",s); }

NODE *creatlink(int n, int m)

{

NODE *h,*p,*s,*q;

int I,x;

h=p=(NODE *)malloc(sizeof(NODE));

h->data=9999;

for(i=1;i<=n;i++)

{

s=(NODE*)malloc(sizeof(NODE));

s->data=rand()%m;

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,"\n The LIST :\n HEAD");

while(p)

{

fprintf(pf,"->%d",p->data);

p=p->next;

}

fprintf(pf,"\n");

}

main()

{

NODE *head; int m;

system("cls");

head=creatlink(12,100);

outlink(head,stdout);

m=fun(head);

printf("\nThe RESULT :\n");

outresult(m,stdout);

}

【答案】

(1)将 fun(NODE *h) 改为:int fun(NODE *h)

(2)将 p=h->next; 改为:p=p->next

3.程序设计题

请编写函数fun(),它的功能是计算s=(ln(1)+ln(2)+ ln(3)+…+ln(m))0.5的值。在C语言中可调用log(n)函数求ln(n)。

例如,若m的值为20,则fun()函数值为6.506583。

注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

#include <conio.h>

#include <stdio.h>

#include <math.h>

#include <windows.h>

double fun(int m)

{

 

}

main()

{

system("cls");

printf("%f\n",fun(20));

}

【答案】

double fun(int m)

{

int i;

double s=0.0;

for(i=1;i<=m;i++)

s=s+log((double)i);

return sqrt(s);

}

1.程序填空题

请补充函数fun(),该函数的功能是:求100(不包括100)以内能被2或5整除,但不能同时被2和5整除的自然数。结果保存在数组bb中,函数fun()返回数组bb元素的个数。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:不得增行或删行,也不得更改程序的结构!

#include <stdio.h>

#include <windows.h>

#define N 100

int fun(int bb[])

{

int I,j;

/**********found**********/

for(___1___;i<100;i++)

if((i%2!=0&&i%5==0)||(i%2==0&&i%5!=0))

/**********found**********/

___2___;

/**********found**********/

___3___;

}

main()

{

int I,n;

int bb[N];

system("cls");

n=fun(bb);

for(i=0;i<n;i++)

{

if(i%10==0) printf("\n");

printf("%4d",bb[i]);

}

}

【答案】

(1)i=1,j=0 (2)bb[j++]=i (3)return j 

2.程序修改题

下列给定程序中,函数fun()的作用是:将字符串tt中的小写字母都改为对应的大写字母,其他字符不变。例如,若输入“edS,dAd”,则输出“EDS,DAD”。

请改正程序中的错误,使其能得到正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

#include <stdio.h>

#include <string.h>

#include <conio.h>

#include <windows.h>

/**********found**********/

char fun(char tt[])

{

int I;

for(i=0;tt[i];i++)

{

/**********found**********/

if((tt[i]>='A')&&(tt[i]<= 'Z'))

tt[i]-=32;

}

return(tt);

}

main()

{

int I;

char tt[81];

system("cls");

printf("Please enter a string: ");

gets(tt);

printf("The result string is: \n%s",

fun(tt));

}

【答案】

(1)将char fun(char tt[]) 改为:

char*fun(char tt[])

(2)将 if((tt[i]>='A')&&(tt[i]<= 'Z')) 改为:if((tt[i]>='a')&&(tt[i]<= 'z')) 

3.程序设计题

请编写函数fun(),其功能是,计算并输出下列多项式值:

S=(1-1/2)+(1/3-1/4)+…+(1/(2n-1)-1/2n)

例如,若主函数从键盘给n输入8后,则输出为S=0.662872。

注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

#include <stdio.h>

double fun(int n)

{

 

}

main()

{

int n;

double s;

printf("Input n: ");

scanf("%d",&n);

s=fun(n);

printf("s=%f\n ",s);

}

【答案】

double fun(int n)

{

int i;

double s=0.0;

for(i=1; i<=n; i++)

s=s+(1.0/(2*i-1)-1.0/(2*i));

return s;

}

1.程序填空题

请补充fun函数,该函数的功能是求一维数组a[N]的平均值,并对所得结果进行四舍五入保留两位小数。例如,当a[10]={ 22.1,13.3,5.3,56.4,11.0,12.7,24.5,42,1.2,9.9}时,输出结果为:average=19.840000。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:不得增行或删行,也不得更改程序的结构!

#include <stdio.h>

#include <conio.h>

double fun(double a[10])

{

int I;

long temp;

double average=0.0;

double sum=0.0;

for(i=0;i<10;i++)

___1___;

average=sum/10;

average=___2___;

temp=___3___;

average=(double)temp/100;

return average;

}

main()

{

double average,a[10]={22.1,13.3,5.3, 56.4,11.0,12.7,24.5,42,1.2,9.9};

int I;

printf("\nThe data :\n");

for(i=0;i<10;i++)

printf("%6.1f",a[i]);

printf("\n\n");

average=fun(a);

printf("The average=%f\n\n",average);

}

【答案】

(1)sum+=a[i]

(2)average*1000

(3)(average+5)/10

2.程序修改题

下列给定程序中,函数fun()的功能是,根据以下公式求π的值,并作为函数值返回。

π/2=1+1/3+1/3*2/5+1/3*2/5*3/7+1/3*2/5*3/7*4/9?????

例如,给指定精度的变量eps输入0.0005时,应当输出Pi=3.140578。

请改正程序中的错误,使其能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

#include <conio.h>

#include <stdio.h>

#include <math.h>

double fun(double eps)

{

double s,t; int n=1;

s=0.0;

/**********found**********/

t=1;

/**********found**********/

while(t>eps)

{

s+=t;

t=t*n/(2*n+1);

n++;

}

/**********found**********/

return(s);

}

main()

{

double x;

printf("Please enter a precision: ");

scanf("%lf",&x);

printf("Pi=%1f\n",fun(x));

}

【答案】

(1)将 t=1; 改为:t=1.0;

(2)将 while(t>eps) 改为:while(t>=eps)

(3)将 return(s); 改为:return(2*s);或return(s*2);

3.程序设计题

请编写函数fun(),其功能是:计算并输出给定10个数的方差。

例如,给定的10个数为95.0、89.0、76.0、65.0、88.0、72.0、85.0、81.0、90.0、56.0,则输出为S=11.730729。

注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

#include <math.h>

#include <stdio.h>

double fun(double x[10])

{

 

}

main()

{

double s,x[10]={95.0,89.0,76.0,65.0,

88.0,72.0,85.0,81.0,90.0,56.0};

int I;

printf("\nThe original data is:\n");

for(i=0;i<10;i++)

printf("%6.1f ",x[i]);

printf("\n\n ");

s=fun(x);

printf("s=%f\n\n ",s);

}

【答案】

double fun(double x[10])

{

double x1=0.0,s=0.0;

int i;

for(i=0;i<10;i++)

x1=x1+x[i];

x1=x1/10;

for(i=0;i<10;i++)

s=s+(x[i]-x1)*(x[i]-x1);

return sqrt(s/10);

}

1.程序填空题

请补充函数fun(),该函数的功能是:交换数组aa中最大和最小两个元素的位置,结果依然保存在原数组中,其他元素位置不变。注意数组aa中没有相同元素。

例如,输入“33、67、42、58、25、76、85、16、41、56”,则输出“33、67、42、58、25、76、16、85、41、56”。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:不得增行或删行,也不得更改程序的结构!

#include <stdio.h>

#include <windows.h>

#define N 10

void fun(int aa[])

{

int I,j,t;

int max=0,min=0;

for(i=0;i<N;i++)

{

/**********found**********/

if(___1___)

max=I;

/**********found**********/

if(___2___)

min=I;

}

t=aa[max];

/**********found**********/

___3___;

aa[min]=t;

}

main()

{

int I;

int aa[N]={33,67,42,58,25,76,85,16,41,56};

system("cls");

printf("\n***original list***\n");

for(i=0;i<N;i++)

printf("%4d",aa[i]);

fun(aa);

printf("\n***new list***\n");

for(i=0;i<N;i++) printf("%4d",aa[i]);

}

【答案】

(1)aa[max]<aa[i]

(2)aa[min]>aa[i]

(3)aa[max]=aa[min] 

2.程序修改题

在给定程序中,函数fun()的功能是:求出两个数的最大公约数,并作为函数值返回。

例如,若给num1和num2输入49和21,则输出的最大公约数为7;若给num1和num2分别输入27和81,则输出最大公约数为27。

请改正函数fun()中的错误,使其能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

#include <stdio.h>

int fun(int a, int b)

{

int r,t;

if(a<b)

/**********found**********/

{ t=a; b=a; a=t; }

r=a%b;

while(r!=0)

{ a=b; b=r; r=a%b; }

/**********found**********/

return(a);

}

main()

{

int num1,num2,a;

printf("Input num1 num2: ");

scanf("%d%d",&num1,&num2);

printf("num1=%d num2=%d\n\n",

num1,num2);

a=fun(num1,num2);

printf("The maximun common divisor is

%d\n",a);

}

【答案】

(1)将 { t=a;b=a;a=t;} 改为:

{ t=a;a=b;b=t;}

(2)将 return(a); 改为:return (b);

3.程序设计题

请编写函数fun。它的功能是求出费波那其数列的第n项的值。

费波那其数列,1,1,2,3,5,8,13……

题目:

#include<stdio.h>

int fun(int n)

{

 

}

void main()

{

int I;

for(i=1;i<=10;i++)

printf("%d ",fun(i));

printf("\n");

}

【答案】

int fun(int n)

{

if(n==1||n==2)

return 1;

else return fun(n-1)+fun(n-2);

}

1.程序填空题

请补充函数fun(),该函数的功能是:把字符下标为非素数的字符从字符串str中删除,把字符下标为素数的字符重新保存在字符串str中。字符串str从键盘输入,其长度作为参数传入函数fun()。

例如,输入“abcdefghijkl”,输出“cdfhl”。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:不得增行或删行,也不得更改程序的结构!

#include <stdio.h>

#include <windows.h>

#define N 80

void fun(char s[],int n)

{

int I, j, k, flag;

/**********found**********/

___1___;

for(i=0;i<n;i++)

{

if(i>1)

s[k++]=s[i];

flag=1;

/**********found**********/

for(___2___;j<i&&flag;j++)

if(i%j==0)

{

flag=0;

/**********found**********/

___3___;

}

}

s[k]='\0';

}

main()

{

int i=0,strlen=0;

char str[N];

system("cls");

printf("Input a string:\n");

gets(str);

while(str[i]!='\0')

{ strlen++; i++; }

fun(str, strlen);

printf("\n*** display string ***\n");

puts(str);

}

【答案】

(1)k=0 (2)j=2 (3)k—

2.程序修改题

下列给定程序中,函数fun的功能是:计算n的5次方的值(规定2<n<8),通过形参指针传回主函数,并计算该值的个位、十位、百位上数字之和作为函数值返回。

请改正程序中的错误,使其能得到正确的结果。

注意:不要改动main函数,不能增行或删行,也不得更改程序的结构。

#include <stdio.h>

#include <math.h>

int fun(int n,int *q)

{

int b,c,I;

/********found********/

b=0;

/*******found********/

c=1;

for(i=1;i<=5;i++)

b=b*n;

*q=b;

for(i=1;i<=3;i++)

{

c=c+b%10;

/*******found*********/

c=c/10;

}

return c;

}

main()

{

int n,sum,a;

do

{

printf("\nEnter n(2<n<8):");

scanf("%d",&n);

}while(n<=2 || n>=8);

sum=fun(n,&a);

printf("\n\nThe result:\n value=%d sum=%d\n\n",a,sum);

}

【答案】

(1)将b=0;改为:b=1; (2)将c=1;改为:c=0; (3)将c=c/10;改为:b=b/10; 

3.程序设计题

请编写一个函数fun(),它的功能是:找出一维数组元素中最大的值和它所在的下标,最大值和它所在的下标通过形参传回。数组元素中的值已在主函数中赋予。

主函数中x是数组名,n是x中的数据个数,max存放最大值,index存放最大值所在元素的下标。

注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

#include <stdlib.h>

#include <stdio.h>

void fun(int a[],int n,int *max,int *d)

{

 

}

main()

{

int I,x[20],max,index,n=10;

randomize();

for(i=0;i<=n;i++)

{

x[i]=rand()%50;

printf("%4d",x[i]); /*输出一个随机数组*/

}

printf("\n");

fun(x,n,&max,&index);

printf("Max=%5d,Index=%4d\n",

max,index);

}

【答案】

void fun(int a[],int n,int *max,int *d)

{

int i;

*max=a[0];

*d=0;

for(i=0;i<n;i++)

if(*max<a[i])

{ *max=a[i];*d=i; }

}

1.程序填空题

请补充函数fun(),该函数的功能是:从键盘输入一个下标n,把数组aa中比元素aa[n]小的元素放在它的左边,比它大的元素放在它的右边,排列成的新数组仍然保存在原数组中。

例如,数组aa={33,67,42,58,25,76,85,16,41,56},输入3。

结果输出“33,42,25,16,41,56,58,67,76,85”。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:不得增行或删行,也不得更改程序的结构!

#include <stdio.h>

#include <windows.h>

#define N 10

void fun(int aa[],int n)

{

int I,j=0,k=0,t;

int bb[N];

t=aa[n];

for(i=0;i<N;i++)

{

if(aa[i]>t) bb[j++]=aa[i];

if(aa[i]<t) aa[k++]=aa[i];

}

/**********found**********/

___1___;

/**********found**********/

for(i=0;___2___;i++,k++)

aa[k]=bb[i];

}

main()

{

int I,n;

int aa[N]={33,67,42,58,25,76,85,16,41,56};

system("cls");

printf("\n*** original list ***\n");

for(i=0; i<N; i++)

printf("%4d",aa[i]);

printf("\n suffix n\n");

scanf("%d",&n);

fun(aa,n);

printf("\n*** new list ***\n");

for(i=0; i<N; i++)

printf("%4d",aa[i]);

}

【答案】

(1)aa[k++]=t (2)i<j

2.程序修改题

下列给定程序中函数fun()的功能是:从n个学生的成绩中统计出高于平均分的学生人数,人数由函数值返回,平均分存放在形参aver所指的存储单元中。

例如输入8名学生的成绩:85、65.5、69、95.5、87、55、62.5、75。则高于平均分的学生人数为4(平均分为74.312500)。

请改正程序中的错误,使其能得到正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

#include <stdio.h>

#include <conio.h>

#include <windows.h>

#define N 20

int fun(float *s,int n,float *aver)

{

/**********found**********/

int ave,t=0;

int count=0,k,I;

for(k=0;k<n;k++) t+=s[k];

ave=t/n;

for(i=0;i<n;i++)

/**********found**********/

if(s[i]<ave)

count++;

/**********found**********/

aver=ave;

return count;

}

main()

{

float s[30],aver;

int m,I;

system("cls");

printf("Please enter m: ");

scanf("%d",&m);

printf("Please enter %d mark :\n",m);

for(i=0;i<m;i++)

scanf("%f",s+i);

printf("\nThe number of students :%d\n",

fun(s,m,&aver));

printf("Ave=%f\n",aver);

}

【答案】

(1)将 int ave,t=0; 改为:

float ave, t=0.0;

(2)将 if(s[i]<ave) 改为:if(s[i]>ave)

(3)将 aver=ave; 改为:*aver=ave;

3.程序设计题

请编写函数fun,它的功能是:计算并输出m(包括m)以内能被3或7整除的所有自然数的倒数之和。

注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的花括号中填入所编写的若干语句。

#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",f);

out=fopen("outfile.dat","w");

for(m=0;m<10;m++)

fprintf(out,"%f\n",fun(m+20));

fclose(out);

}

【答案】

int i;

double sum=0.0;

for(i=1;i<=m;i++)

if(i%3==0||i%7==0)

sum+=1.0/i;

return sum;

1.程序填空题

给定程序中,函数fun的功能是:找出100至x(x≤999)之间各位上的数字之和为15的所有整数,然后输出;符合条件的整数个数作为函数值返回。

例如,当n值为500时,符合条件的整数共有26个。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:不得增行或删行,也不得更改程序的结构!

#include <stdio.h>

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("The result is: %d\n",fun(x));

}

【答案】

(1)0 (2)x (3)t++

2.程序修改题

在给定程序中,函数fun()的功能是:对N名学生的学习成绩,按从低到高的顺序找出前m(m≤10)名学生来,并将这些学生数据存放在一个动态分配的连续存储区中,此存储区的首地址作为函数值返回。

请改正程序中的错误,使它能得到正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

#include <conio.h>

#include <string.h>

#include <stdio.h>

#include <alloc.h>

#include <windows.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++)

{

/**********found**********/

for(i=j=0;i<N;j++)

if(b[i].s<b[j].s) j=I;

/**********found**********/

t[k].s=b[j].s;

b[j].s=100;

}

return t;

}

outresult(STU a[],FILE *pf)

{

int I;

for(i=0;i<N;i++)

fprintf(pf,"No=%sMark=%d\n",a[i].num,

a[i].s);

fprintf(pf,"\n\n");

}

main()

{

STU a[N]={{"A01",77},{"A02",85},

{"A03",96},{"A04",65},{"A05",75},

{"A06",96},{"A07",76},{"A08",63},

{"A09",69},{"A10",78}};

STU*pOrder;

int I,m;

system("cls");

printf("***THE RESULT***\n");

outresult(a,stdout);

printf("Give the number of the students

who have lower score: ");

scanf("%d",&m);

while(m>10)

{

printf("Give the number of the students

who have lower score: ");

scanf("%d",&m);

}

pOrder=fun(a,m);

printf("***THE RESULT***\n");

printf("The low :\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));改为:

t=calloc(m,sizeof(STU));

(2)将for (i=j=0;i<N;j++)改为:

for (i=j=0;i<N;i++)

(3)将t[k].s=b[j]. s;改为:t[k]=b[j]; 

3.程序设计题

下列程序定义了N×N的二维数组,并在主函数中自动赋值。请编写函数fun(int a[ ][N]),该函数的功能是:使数组左下半三角元素中的值全部置成0。例如a数组中的值为:

1 9 8

2 6 7

3 4 5

则返回主程序后a数组中的值应为:

0 9 8

0 0 7

0 0 0

注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

#include <conio.h>

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

#define N 5

int fun(int a[][N])

{

 

}

main()

{

int a[N][N],I,j;

system("cls");

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");

}

fun(a);

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 i,j;

for(i=0;i<N;i++)

for(j=0;j<=i;j++) a[i][j]=0;

}


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

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