全国计算机等级考试二级C语言练习题(三)
1.程序填空题
请补充函数fun,该函数的功能是建立一个带头结点的单向链表并输出到文件file.dat和屏幕上,各结点的值为对应的下标,链表的结点数及输出的文件名作为参数传入。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include<stdio.h>
#include<stdlib.h>
typedef struct s
{
int data;
struct s *next;
}NODE;
void fun(int n,char *filename)
{
NODE *h,*p,*s ;
FILE *f;
int I;
h=p=(NODE *)malloc(sizeof(NODE));
h->data=0;
for(i=1;i<n;i++)
{
s=(NODE *)malloc(sizeof(NODE));
s->___1___;
___2___;
p=___3___;
}
p->next=NULL;
if((f=fopen(filename,"w"))==NULL)
{
printf("Can not open file.dat!");
exit(0);
}
p=h;
fprintf(f,"THE LIST\n");
printf("THE LIST\n");
while(p)
{
fprintf(f,"%3d",p->data);
printf("%3d",p->data);
if(p->next!=NULL)
{
fprintf(f,"->");
printf("->");
}
p=p->next;
}
fprintf(f,"\n");
printf("\n");
fclose(f);
p=h;
while(p)
{
s=p;
p=p->next;
free(s);
}
}
main()
{
char *filename="file.dat";
int n;
printf("\nPlease input n:");
scanf("%d",&n);
fun(n,filename);
}
【答案】
void fun(int a,int b,long *c)
{
*c=a/10*1000+a%10*10+b/10*100+b%10;
}
2.程序修改题
下面程序中函数fun的功能是:将长整数s中每个十进制位上为奇数的数取出,形成一个新数在t中,t中数字顺序按原整数中数字的逆序排列。
例如,当s=87653142时,t=1357。
请改正函数fun中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include <conio.h>
#include <stdio.h>
#include <windows.h>
/**********found**********/
void fun(long s,long t)
{
int d;
*t=0;
while(s>0)
{
/**********found**********/
d=s/10;
if(d%2==1)
*t=*t*10+d;
s/=10;
}
}
main() /* 主函数 */
{
long s, t;
system("cls");
printf("\nPlease enter s:");
scanf(“%ld”,&s);
fun(s,&t);
printf("the result is: %ld\n",t);
}
【答案】
(1)将void fun(long s, long t) 改为:
void fun(long s, long *t)
(2)将d = s/10; 改为:d = s%10;
3.程序设计题
给定程序中,函数fun的功能是:将两个两位数的正整数a、b合并形成一个整数放在c中。合并的方式是:将a数的十位和个位数依次放在c数的千位和十位上,b数的十位和个位数依次放在c数的百位和个位上。
例如,当a=45,b=12。调用该函数后,c=4152。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
void fun(int a,int b,long *c)
{
}
main()
{
int a,b; long c;
printf("Input a,b:");
scanf("%d%d",&a,&b);
fun(a,b,&c);
printf("The result is: %d\n", c);
}
【答案】
void fun(int a,int b,long *c)
{
*c=a/10*1000+a%10*10+b/10*100+b%10;
}
1.程序填空题
给定程序中,函数fun的功能是计算下式:
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
double fun(double e)
{
int I; double s,x;
/**********found**********/
s=0; i=___1___;
x=1.0;
while(x>e)
{
/**********found**********/
___2___;
/**********found**********/
x=(2*i-1)*(2*i+1)/(___3___*(2*i));
s=s+x;
}
return s;
}
main()
{
double e=1e-6;
printf("The result is: %f\n",fun(e));
}
【答案】
(1)0
(2)i++
(3)(2.0*i)或(float)(2*i)或 (double)(2*i)
2.程序修改题
给定程序中,函数fun的功能是:判断ch中的字符是否与str所指串中的某个字符相同;若相同,什么也不做,若不同,则将其插在串的最后。
请改正程序中的错误,使其能进行正确的操作。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <string.h>
/**********found**********/
void fun(char str,char ch)
{
while(*str&&*str!=ch) str++;
/**********found**********/
if(*str==ch)
{
str[0]=ch;
/**********found**********/
str[1]='0';
}
}
main()
{
char s[81],c ;
printf("Please enter a string:\n");
gets(s);
printf("Please enter the character to
search: ");
c=getchar();
fun(s,c);
printf("The result is %s\n", s);
}
【答案】
(1)将void fun(char str,char ch) 改为:
void fun(char *str,char ch )
(2)将if(*str==ch) 改为:if(*str!=ch)
(3)将str[1]='0'; 改为:str[1]='\0';
3.程序设计题
下列程序定义了N×N的二维数组,并在主函数中赋值。请编写函数fun,函数的功能是:求出数组周边元素的平均值并作为函数值返回给主函数中的变量r。
例如,若c数组中的值为:
则返回主程序后r的值应为4.625000。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的花括号中填入所编写的若干语句。
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define N 3
double fun(int b[][N])
{
}
main()
{
int c[N][N]={1,8,4,7,5,3,3,9,2};
int I,j;
FILE *out;
double r;
printf("**********\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("%4d",c[i][j]);
}
printf("\n");
}
r=fun?;
printf("THE RESULT\n");
printf("The r is %lf\n",r);
out=fopen("outfile.dat","w");
fprintf(out,"%lf",r);
fclose(out);
}
【答案】
int i,j,k=0;
double r=0.0;
for(j=0;j<N;j++)
{
r+=b[0][j];
k++;
}
for(j=0;j<N;j++)
{
r+=b[N-1][j];
k++;
}
for(i=1;i<=N-2;i++)
{
r+=b[i][0];
k++;
}
for(i=1;i<=N-2;i++)
{
r+=b[i][N-1];
k++;
}
return r/=k;
1.程序填空题
给定程序中,函数fun的功能是:计算x所指数组中N个数的平均值(规定所有数均为正数),平均值通过形参返回主函数,将小于平均值且最接近平均值的数作为函数值返回,在主函数中输出。
例如,有10个正数:46、30、32、40、6、17、45、15、48、26,平均值为:30.500000
主函数中输出:m=30.0
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdlib.h>
#define N 10
double fun(double x[],double *av)
{
int I,j;
double d,s=0;
for(i=0;i<N;i++) s=s+x[i];
/**********found**********/
___1___=s/N;
d=32767;
for(i=0;i<N; i++)
if(x[i]<*av && *av-x[i]<=d){
/**********found**********/
d=*av-x[i]; j=___2___;}
/**********found**********/
return___3___;
}
main()
{
int I;
double x[N],av,m;
for(i=0; i<N; i++)
{ x[i]=rand()%50;
printf("%4.0f ",x[i]);}
printf("\n");
m=fun(x,&av);
printf("\nThe average is: %f\n",av);
printf("m=%5.1f ",m);
printf("\n");
}
【答案】
(1)*av (2)i (3)x[j] 或(x[j])
2.程序修改题
给定程序中,fun函数的功能是:求s = aa…aa - … - aaa - aa – a(此处aa…aa表示n个a,a和n的值在1至9之间)。
例如a=3,n=6,则以上表达式为:
s=333333 - 33333 - 3333 - 333 - 33 – 3
其值是:296298
a和n是fun函数的形参,表达式的值作为函数值传回main函数。
请改正程序中的错误,使其能计算出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
long fun(int a,int n)
{
int j;
/**********found**********/
long s=0,t=1;
for(j=0;j<n;j++)
t=t*10+a;
s=t;
for(j=1;j<n;j++)
{
/**********found**********/
t=t%10;
s=s-t;
}
return(s);
}
main()
{
int a,n;
printf("\nPlease enter a and n:");
scanf("%d%d", &a, &n);
printf("The value of function is:%ld\n",
fun(a,n));
}
【答案】
(1)将long s=0,t=1; 改为:long s=0,t=0;
(2)将t=t%10; 改为:t=t/10;
3.程序设计题
请编写一个函数void fun(char *tt, int pp[]),统计在tt所指字符串中'a'到'z' 26个小写字母各自出现的次数,并依次放在pp所指数组中。
例如,当输入字符串:abcdefgabcdeabc 后,程序的输出结果应该是:
3 3 3 2 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
#include <string.h>
void fun(char *tt,int pp[])
{
}
main()
{
char aa[1000];
int bb[26],k,n;
printf("Please enter a char string:");
scanf("%s", aa);
fun(aa,bb);
for(k=0;k<26;k++) printf("%d",bb[k]);
printf("\n");
}
【答案】
void fun(char *tt,int pp[])
{
int n;
for(n=0; n<26; n++)
pp[n]=0;
while(*tt!='\0')
{
if(*tt>='a' && *tt <='z')
pp[*tt-'a']++;
tt++;
}
}
1.程序填空题
给定程序中,函数fun的功能是:调用随机函数产生20个互不相同的整数放在形参a所指数组中(此数组在主函数中已置0)。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdlib.h>
#define N 20
void fun(int *a)
{
int I,x,n=0;
x=rand()%20;
/**********found**********/
while (n<___1___)
{
for(i=0; i<n; i++)
/**********found**********/
if(x==a[i])___2___;
/**********found**********/
if(i==___3___){a[n]=x; n++;}
x=rand()%20;
}
}
main()
{
int x[N]={0},I;
fun(x);
printf("The result : :\n");
for(i=0;i<N;i++ )
{
printf("%4d",x[i]);
if((i+1)%5==0) printf("\n");
}
printf("\n\n");
}
【答案】
(1)20 或 N (2)break (3)n
2.程序修改题
用二分法求方程2x3-4x2+3x-6 =0在区间[m,n]上的根。例如,若给m输入-100,给n输入90,则函数求得的一个根值为2.000。
请改正程序中的错误,使其能得出正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio.h>
#include <math.h>
double funx(double x)
{return(2*x*x*x-4*x*x+3*x-6);}
double fun(double m,double n)
{
/**********found**********/
int r;
r=(m+n)/2;
/**********found**********/
while(fabs(n-m)<0.001)
{
if(funx?*funx(n)<0) m=r;
else n=r;
r=(m+n)/2;
}
return r;
}
main()
{
double m,n,root;
printf("Enter m n : \n");
scanf("%lf%lf",&m,&n);
root=fun(m,n);
printf("root=%6.3f\n",root);
}
【答案】
(1)把int r; 改为:double r;
(2)将while(fabs(n-m)<0.001) 改为:
while(fabs(n-m)>0.001)
3.程序设计题
假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:除了字符串前导和尾部的*号之外,将串中其他*号全部删除。形参h已指向字符串中第一个字母,形参p已指向字符串中最后一个字母。在编写函数时,不得使用C语言提供的字符串函数。
例如,字符串中的内容为:****A*BC*DEF*G ******,删除后,字符串中的内容应当是:****ABCDEFG******。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
void fun(char *a,char *h,char *p)
{
}
main()
{
char s[81],*t,*f;
printf("Enter a string:\n");
gets(s);
t=f=s;
while(*t)t++;
t--;
while(*t=='*')t--;
while(*f=='*')f++;
fun(s,f,t);
printf("The string after deleted:\n");
puts(s);
}
【答案】
void fun( char *a,char *h,char *p )
{
char *q=h;
int n=0;
while(q<=p)
{ if(*q!='*') h[n++]=*q; q++; }
while(*q)
{ h[n++]=*q; q++; }
h[n]='\0';
}
1.程序填空题
给定程序中,函数fun的功能是:将a所指3×5矩阵中第k列的元素左移到第0列,第k列以后的每列元素依次左移,原来左边的各列依次绕到右边。
例如,有下列矩阵:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
若k为2,程序执行结果为
3 4 5 1 2
3 4 5 1 2
3 4 5 1 2
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#define M 3
#define N 5
void fun(int (*a)[N],int k)
{
int I,j,p,temp;
/**********found**********/
for(p=1;p<=___1___;p++)
for(i=0;i<M;i++)
{
temp=a[i][0];
/**********found**********/
for(j=0;j<___2___;j++)
a[i][j]=a[i][j+1];
/**********found**********/
a[i][N-1]=___3___;
}
}
main()
{
int x[M][N]={{1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5}},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");
}
fun(x,2);
printf("The array after moving:\n");
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
printf("%3d",x[i][j]);
printf("\n");
}
}
【答案】
(1)k (2)N-1 (3)temp
2.程序修改题
给定程序中,函数fun的功能是:求整数x的y次方的低3位值。
例如,整数5的6次方为15625,此值的低3位值为625。
请改正函数fun中指定部位的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
long fun(int x,int y,long *p)
{
int I;
long t=1;
/**********found**********/
for(i=1;i<y;i++)
t=t*x;
*p=t;
/**********found**********/
t=t/1000;
return t;
}
main()
{
long t,r;
int x,y;
printf("\nInput x and y: ");
scanf("%ld%ld",&x,&y);
t=fun(x,y,&r);
printf("x=%d,y=%d,r=%ld,last=%ld\n",
x,y,r,t);
}
3.程序设计题
请编写函数fun,其功能是:计算并输出当x<0.97时如下多项式的值,直到|Sn - Sn-1|<0.000001为止:
例如,在主函数中从键盘给x输入0.21后,输出为:s= 1.100000。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
#include <math.h>
double fun(double x)
{
}
main()
{
double x,s;
printf("Input x: ");
scanf("%lf",&x);
s=fun(x);
printf("s=%f\n",s);
}
【答案】
double fun(double x)
{
int n=1;
double s0,s1=1.0,t=1.0;
do
{
s0=s1;
t=t*(0.5-n+1)*x/n;
s1=s0+t;
n++;
}while(fabs(s1-s0)>=0.000001);
return s1;
}
1.程序填空题
给定程序中,函数fun的功能是:将形参s所指字符串中的数字字符转换成对应的数值,计算出这些数值的累加和作为函数值返回。
例如,形参s所指的字符串为:abs5def126jkm8,程序执行后的输出结果为:22。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int fun(char *s)
{
int sum=0;
while(*s) {
/**********found**********/
if(isdigit(*s)) sum+=*s-___1___;
/**********found**********/
___2___;
}
/**********found**********/
return___3___;
}
main()
{
char s[81]; int n;
printf("\nEnter a string:\n\n");
gets(s);
n=fun(s);
printf("\nThe result is: %d\n\n",n);
}
【答案】
(1)'0' 或 48 (2)s++ (3)sum 或(sum)
2.程序修改题
下列给定程序中,计算如下公式的值:
函数fun的功能是:根据整型形参m的值,计算上面公式。
请改正程序中的错误,使其能得到正确的结果。
注意:不要改动main函数,不能增行或删行,也不得更改程序的结构。
#include <conio.h>
#include <stdio.h>
double fun(int m)
{
double c=1.0;
int k;
/*******found*********/
for(k=2;k<m;k++)
/*******found*********/
c-=1/(k*k);
return?;
}
main()
{
int para=10;
printf("\nThe result is %1f\n",fun(para));
}
【答案】
(1)将for(k=2;k<m;k++)改为:
for(k=2;k<=m;k++)或for(k=2;k<m+1;k++)
(2)将c-=1/(k*k);改为:c-=1.0/(k*k);
3.程序设计题
请编写函数fun,它的功能是:将一个数字字符串转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数)。
例如,若输入字符串"-1234",则函数把它转换为整数值-1234。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
#include <string.h>
long fun(char *p)
{
}
main()
{
char s[6];
long n;
printf("Enter a string:\n") ;
gets(s);
n=fun(s);
printf("%ld\n",n);
}
【答案】
long fun(char *p)
{
long t=0;
int flag=1;
if(*p=='-')
{ flag=-1; p++; }
while(*p)
{ t=t*10+(*p-'0'); p++; }
return flag*t;
}
1.程序填空题
人员的记录由编号和出生年、月、日组成,N名人员的数据已在主函数中存入结构体数组student中,且编号唯一。函数fun的功能是:找出指定编号人员的数据,作为函数值返回,由主函数输出,若指定编号不存在,返回数据中的编号为空串。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <string.h>
#define N 8
typedef struct
{
char num[10];
int year,month,day;
}STUDENT;
___1___fun(STUDENT *student,char *num)
{
int I;
STUDENT a={"000003",1979,9,1};
for(i=0;i<N;i++)
if(strcmp(___2___,num)==0)
return (___3___);
return a;
}
main()
{
STUDENT student[N]=
{
{"000001",1978,2,15},{"000002",1981,9,21},{"000003",1979,9,1},{"000004",1982,7,15},{"000005",1980,9,28},{"000006",1983,11,15},{"000007",1983,6,22},{"000008",1984,8,19}
};
STUDENT s;
char n[10]="666666";
s=fun(student,n);
if(s.num[0]==0)
{
printf("\nNot found!\n");
}
else
{
printf("\nSucceed!\n ");
printf("%s %d-%d-%d\n",s.num,s.year,s.month,s.day);
}
}
【答案】
(1)STUDENT (2)student[i].num (3)student[i]
2.程序修改题
下列给定程序中,函数fun的功能是:将s所指字符串中最后一次出现的s1所指子串替换成s2所指子串,所形成的新串放在str所指的数据中。在此处,要求s1和s2所指字符串的长度相同。
例如,当s所指字符串中的内容为abcdabfabc,s1所指子串中的内容为ab,s2所指子串中的内容为99时,则在str所指的数组中的内容为abcdabf99c。
请改正程序中的错误,使其能得到正确的结果。
注意:不要改动main函数,不能增行或删行,也不得更改程序的结构。
#include <conio.h>
#include <stdio.h>
#include <string.h>
/********found*********/
void fun(char*s,s1,s2,str)
{
char *p,*r,*a;
strcpy(str,s);
/********found*********/
while(str)
{
p=str;
r=s1;
while(*r)
if(*r==*p)
{
r++;
p++;
}
else
{
break;
}
if(*r=='\0')
a=str;
str++;
}
r=s2;
while(*r)
{
*a=*r;
a++;
r++;
}
}
main()
{
char s[100],s1[100],s2[100],str[100];
printf("\nPlease enter string S:");
scanf("%s",s);
printf("\nPlease enter substring s1:");
scanf("%s",s1);
printf("\nPlease enter substring s2:");
scanf("%s",s2);
if(strlen(s1)==strlen(s2))
{
fun(s,s1,s2,str);
printf("\nThe result is : %s\n",str);
}
else
{
printf("\nError : strlen(s1)!=strlen(s2)\n");
}
}
【答案】
(1)将void fun(char*s,s1,s2,str)改为:void fun(char *s,char *s1,char *s2,char *str)
(2)将while(str)改为:while(*str)
3.程序设计题
函数fun的功能是:将s所指字符串中下标为偶数同时ASCII值为奇数的字符删除,s所指串中剩余的字符形成的新串放在t所指的数组中。
例如,若s所指字符串中的内容为“ABCDEFG 12345”,其中字符C的ASCII码值为奇数,在数组中的下标为偶数,因此必须删除;而字符1的ASCII码值为奇数,在数组中的下标也为奇数,因此不应当删除,其他依此类推。最后t所指的数组中的内容应是“BDF12345”。
注意:部分源程序已给出。请勿改动主函数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!=1)
t[n++]=s[k];
t[n]='\0';
}