全国计算机等级考试二级C语言练习题(十)
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;
}