全国计算机等级考试二级C语言练习题(六)
1.程序填空题
请补充函数fun(),该函数的功能是:寻找两个整数之间的的所有素数(包括这两个整数),把结果保存在数组bb中,函数返回素数的个数。
例如,输入6和21,则输出为:7、11、13、17、19
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#define N 1000
int fun(int n,int m,int bb[N])
{
int I,j,k=0,flag;
for(j=n;j<=m;j++)
{
/**********found**********/
___1___;
for(i=2;i<j;i++)
/**********found**********/
if(___2___)
{flag=0; break;}
/**********found**********/
if(___3___) bb[k++]=j;
}
return k;
}
main()
{
int n=0,m=0,I,k;
int bb[N];
system("cls");
printf("Input n\n");
scanf("%d",&n);
printf("Input m\n");
scanf("%d",&m);
for(i=0;i<m-n;i++) bb[i]=0;
k=fun(n,m,bb);
for(i=0;i<k;i++)
printf("%4d",bb[i]);
}
【答案】
(1)flag=1 (2)j%i==0 (3)flag==1
2.程序修改题
下列给定程序中,函数fun()的功能是:通过某种方式实现两个变量值的交换,规定不允许增加语句和表达式。例如变量a中的值原为8,b中的值原为3;程序运行后a中的值为3,b中的值为8。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <conio.h>
#include <stdio.h>
#include <windows.h>
int fun(int *x,int y)
{
int t;
/**********found**********/
t=x;x=y;
/**********found**********/
return(y);
}
main()
{
int a=3,b=8;
system("cls");
printf("%d %d\n",a,b);
b=fun(&a,b);
printf("%d %d\n",a,b);
}
【答案】
(1)将t=x;x=y; 改为:t=*x;*x=y;
(2)将return (y); 改为:return (t);
3.程序设计题
请编写函数fun(),该函数的功能是:统计一行字符串中单词的个数,作为函数值返回。一行字符串在主函数中输入,规定所有单词由小写字母组成,单词之间有若干个空格隔开,一行的开始没有空格。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <string.h>
#include <stdio.h>
#define N 80
int fun(char *s)
{
}
main()
{
char line[N];
int num=0;
printf("Enter a string:\n ");
gets(line);
num=fun(line);
printf("The number of word is:%d\n ",
num);
}
【答案】
int fun(char *s)
{
int i,j=0;
for(i=0;s[i]!='\0';i++)
if(s[i]!=' '&&(s[i+1]==''||
s[i+1]=='\0'))
j++;
return j;
}
1.程序填空题
函数的功能是:把文本文件B中的内容追加到文本文件A的内容之后。
例如,文件B的内容为“I’m ten.”,文件A的内容为“I’m a student!”,追加之后文件A的内容为“I’m a student ! I’m ten.”
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#define N 80
main()
{
FILE *fp,*fp1,*fp2;
int I;
char c[N],t,ch;
system("cls");
if((fp=fopen("A.dat","r"))==NULL)
{
printf("file A cannot be opened\n");
exit(0);
}
printf("A contents are : \n");
for(i=0;(ch=fgetc(fp))!=EOF;i++)
{ c[i]=ch; putchar(c[i]); }
fclose(fp);
if((fp=fopen("B.dat","r"))==NULL)
{
printf("file B cannot be opened\n");
exit(0);
}
printf(&qu
Chapter_4
ot;B contents are : \n");
for(i=0;(ch=fgetc(fp))!=EOF;i++)
{ c[i]=ch; putchar(c[i]); }
fclose(fp);
/**********found**********/
if((fp1=fopen("A.dat","a"))___1___
(fp2=fopen("B.dat","r")))
{
while((ch=fgetc(fp2))!=EOF)
/**********found**********/
___2___;
}
else printf("Can not open A B !\n");
fclose(fp2);
fclose(fp1);
printf("\n***new A contents***\n\n");
if((fp=fopen("A.dat","r"))==NULL)
{
printf("file A cannot be opened\n");
exit(0);
}
for(i=0;(ch=fgetc(fp))!=EOF;i++)
{ c[i]=ch; putchar(c[i]); }
/**********found**********/
___3___;
}
【答案】
(1)&& (2)fputc(ch,fp1) (3)fclose(fp)
2.程序修改题
N个有序整数数列已放在一维数组中,给定下列程序中,函数fun()的功能是:利用折半查找算法查找整数m在数组中的位置。若找到,则返回其下标值;反之,则返回-1。
折半查找的基本算法是:每次查找前先确定数组中待查的范围:low和high(low<high),然后把m与中间位置(mid)中元素的值进行比较。如果m的值大于中间位置元素中的值,则下一次的查找范围放在中间位置之后的元素中;反之,下次查找范围落在中间位置之前的元素中。直到low>high,查找结束。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio.h>
#define N 10
/**********found**********/
void fun(int a[],int m)
{
int low=0,high=N-1,mid;
while(low<=high)
{
mid=(low+high)/2;
if(m<a[mid]) high=mid-1;
/**********found**********/
else if(m>=a[mid])
low=mid+1;
else return(mid);
}
return(-1);
}
main()
{
int I,a[N]={-3,4,7,9,13,24,67,89,
100,180},k,m;
printf("a数组中的数据如下:");
for(i=0;i<N;i++) printf("%d",a[i]);
printf("Enter m: "); scanf("%d",&m);
k=fun(a,m);
if(k>=0) printf("m=%d,index=%d\n",m,k);
else printf("Not be found!\n");
}
【答案】
(1)将void fun(int a[],int m) 改为:
int fun(int a[],int m)
(2)将else if(m>=a[mid])改为:
else if(m>a[mid])
3.程序设计题
请编写函数fun(),该函数的功能是:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放在主函数的age数组中。要求函数把0~9岁年龄段的人数在d[0]中,把10~19岁年龄段的人数放在d[1]中,把20~29岁年龄段的人数放在d[2]中,依次类推,把100岁(含100)以上年龄的人数都放在d[10]中。结果在主函数中输出。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
#define N 50
#define M 11
void fun(int *a,int *b)
{
}
double rnd()
{
static t=29,c=217,m=1024,r=0;
r=(r*t+c)%m;
return((double)r/m);
}
main()
{
int age[N],I,d[M];
for(i=0;i<N;i++)
age[i]=(int)(115*rnd());
/*产生一个随机的年龄数组*/
printf("The original data :\n");
for(i=0;i<N;i++)
printf((i+1)%10==0?"%4d\n":"%4d",
age[i]);
printf("\n\n");
fun(age,d);
for(i=0;i<10;i++)
printf("%4d--%4d:%4d\n",i*10,
i*10+9,d[i]);
printf("Over 100 : %4d\n",d[10]);
}
【答案】
void fun(int *a,int *b)
{
int i,j;
for(j=0;j<M;j++)
b[j]=0;
for(i=0;i<N;i++)
if(a[i]>=100) b[10]++;
else b[a[i]/10]++;
}
1.程序填空题
数组xx[N]保存着一组4位无符号整数,其元素的个数通过变量num传入函数fun()。请补充函数fun(),该函数的功能是:从数组xx中找出个位和百位的数字相等的所有无符号整数,结果保存在数组yy中,其个数由函数fun()返回。
例如:xx[8]={1111,2413,2321,2222,4245,3333,1414,5335}时,
bb[6]={1111,2321,2222,4245,3333,1414}。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#define N 1000
int fun(int xx[],int bb[],int num)
{
int I,n=0;
int g,b;
for(i=0;i<num;i++)
{
/**********found**********/
g=___1___;
b=xx[i]/100%10;
if(g==b)
/**********found**********/
___2___;
}
/**********found**********/
return___3___;
}
main()
{
int xx[8]={1111,2413,2321,2222,4245,3333,1414,5335};
int yy[N];
int num=0,n=0,i=0;
num=8;
system("cls");
printf("***original data ***\n ");
for(i=0;i<num;i++)
printf("%u ",xx[i]);
printf("\n\n");
n=fun(xx,yy,num);
printf("yy= ");
for(i=0;i<n;i++)
printf("%u ",yy[i]);
}
【答案】
(1)xx[i]%10 (2)bb[n++]=xx[i] (3)n
2.程序修改题
下列给定程序中,函数fun()的功能是:根据形参m的值(2≤m≤9),在m行m列的二维数组中存放如下所示的数据,由main()函数输出。
例如,若输入2,则输出
1 2
2 4
输入4,则输出
1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#define M 10
int a[M][M]={0};
/**********found**********/
fun(int **a,int m)
{
int j,k;
for(j=0;j<m;j++)
for(k=0;k<m;k++)
/**********found**********/
a[j][k]=k*j;
}
main()
{
int I,j,n;
system("cls");
printf("Enter n\n"); scanf("%d",&n);
fun(a,n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%4d ",a[i][j]);
printf("\n");
}
}
【答案】
(1)将fun( int **a, int m) 改为:
void fun( int (*a)[M], int m)
(2)将a[j][k]=k*j; 改为:
a[j][k]=(k+1)*(j+1);
3.程序设计题
请编写函数fun(),该函数的功能是:删去一维数组中所有相同的数,使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。
例如,若一维数组中的数据是:
2 2 2 3 4 4 5 6 6 6 6 7 7 8 9 9 10 10 10 10
删除后,数组中的内容应该是:
2 3 4 5 6 7 8 9 10。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
#include <windows.h>
#define N 80
int fun(int a[], int n)
{
}
main()
{
int a[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,
8,9,9,10,10,10,10},I,n=20;
printf("The original data :\n");
for(I=0;I<n;I++)
printf("%3d",a[I]);
n=fun(a,n);
printf("The data after deleted :\n");
for(I=0;I<n;I++)
printf("%3d",a[I]);
printf("\n\n");
}
【答案】
int fun(int a[],int n)
{
int i,j=1;
for(i=1;i<n;i++)
if(a[j-1]!=a[i])
a[j++]=a[i];
return j;
}
1.程序填空题
请补充main()函数,该函数的功能是求n的阶乘。例如:6!=720。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <conio.h>
main()
{
int I,n;
long f=1;
system("cls");
printf("Input n: ");
/**********found**********/
scanf("%d",___1___);
/**********found**********/
for(___2___;i<=n;i++)
/**********found**********/
___3___;
printf("%d!=%ld\n",n,f);
}
【答案】
(1)&n (2)i=1 (3)f*=i
2.程序修改题
已知一个数列从0项开始的前3项:0、0、1,以后的各项都是其相邻的前3项之和。下列给定的程序中,函数fun()的功能是:计算并输出该数列前n项的平方根之和sum。N的值通过形参传入。例如,当n=10时,程序的输出结果应为23.197745。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#include <math.h>
/**********found**********/
fun(int n)
{
double sum,s0,s1,s2,s;int k;
sum=1.0;
if(n<=2) sum=0.0;
s0=0.0;s1=0.0;s2=1.0;
for(k=4;k<=n;k++)
{
s=s0+s1+s2;
sum+=sqrt(s);
s0=s1;s1=s2;s2=s;
}
/**********found**********/
return sum
}
main()
{
int n;
system("cls");
printf("Input N=");
scanf("%d",&n);
printf("%f\n",fun(n));
}
【答案】
(1)将fun(int n) 改为:double fun(int n)
(2)将return sum 改为:return sum ;
3.程序设计题
请编写函数void fun(int y,int b[],int*m),它的功能是:求出能整除y且是奇数的各整数,并按从小到大的顺序放在b所指的数组中,这些除数的个数通过形参m返回。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的花括号中填入所编写的若干语句。
#include <conio.h>
#include <stdio.h>
void fun(int y,int b[],int *m)
{
}
main()
{
int y,a[500],m,j;
FILE *out;
printf("\nPlease input an integer number:\n");
scanf("%d",&y);
fun(y,a,&m);
for(j=0;j<m;j++)
printf("%d ",a[j]);
printf("\n");
fun(730,a,&m);
out=fopen("outfile.dat","w");
for(j=0;j<m;j++)
fprintf(out,"%d\n",a[j]);
fclose(out);
}
【答案】
int j=1,i=0,k=0,*s=b;
for(j=0;j<=y;j++)
if(j%2!=0)
{
s[i]=j;
i++;
}
for(j=0;j<i;j++)
if(y%s[j]==0)
{
b[k]=s[j];
k++;
}
*m=k;
1.程序填空题
请补充main()函数,该函数的功能是:计算两个自然数n和m(m<10000)之间所有数的和(n和m从键盘输入)。
例如:当n=1、m=100时,sum=5050;
当n=100、m=1000时,sum=495550。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意;不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <conio.h>
#include <windows.h>
main()
{
int n,m;
long sum;
/**********found**********/
___1___;
system("cls");
printf("Input n,m\n");
scanf("%d,%d",&n,&m);
while(n<=m)
{
/**********found**********/
___2___;
n++;
}
/**********found**********/
printf("sum=%___3___\n",sum);
}
【答案】
(1)sum=0 (2)sum+=n (3)ld
2.程序修改题
下列给定程序中,函数fun()的功能是:从N个字符串中找出最长的那个串,并将其地址作为函数值返回。各字符串在主函数中输入,并放入一个字符串数组中。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <string.h>
#include <stdio.h>
#define N 5
#define M 81
/**********found**********/
fun(char (*sq)[N])
{
int I; char *sp;
sp=sq[0];
for(i=0;i<N;i++)
if(strlen(sp)<strlen(sq[i]))sp=sq[i];
/**********found**********/
return sq;
}
main()
{
char str[N][M],*longest; int I;
printf("Enter %d lines:\n ",N);
for(i=0;i<N;i++) gets(str[i]);
printf("The %d string :\n ",N);
for(i=0;i<N;i++) puts(str[i]);
longest=fun(str);
printf("The longest string :\n ");
puts(longest);
}
【答案】
(1)将fun(char (*sq)[N]) 改为:
char *fun(char (*sq)[M])
(2)将return sq; 改为:return sp;
3.程序设计题
请编写函数fun,它的功能是计算并输出给定整数n的所有因子(不包括1与自身)的平方和(规定n的值不大于100)。
例如:主函数从键盘给输入n的值为56,则输出为sum=1113。
注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
long fun(int n)
{
}
main()
{
int n;
long sum;
printf("Input n:");
scanf("%d",&n);
sum=fun(n);
printf("sum=%ld\n",sum);
}
【答案】
long fun(int n)
{
int i;
long s=0;
for(i=2;i<n;i++)
if(n%i==0) s+=i*i;
return s;
}
1.程序填空题
函数fun()的功能是把数组bb中的数按从小到大排列(数组的值及元素个数从主函数中输入)。
例如,输入 2 3 5 4 1,结果为1 2 3 4 5。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <windows.h>
#define N 100
void fun(int bb[],int n)
{
int I,j,t;
/**********found**********/
for(i=0;___1___;i++)
/**********found**********/
for(j=0;___2___;j++)
if(bb[j]>bb[j+1])
{ t=bb[j];bb[j]=bb[j+1];bb[j+1]=t; }
}
main()
{
int i=0,n=0;
int bb[N];
system("cls");
printf("Input n: \n");
scanf("%d",&n);
printf("Input data: \n");
while(i<n)
{
printf("bb[%d]=",i);
scanf("%d",&bb[i]);
i++;
}
fun(bb,n);
printf("\n*** the result ***\n");
for(i=0;i<n;i++) printf("%4d",bb[i]);
}
【答案】
(1)i<n或i<=n-1
(2)j<n-1或j<=n-2
2.程序修改题
下列给定程序中,函数fun()的功能是:用递归算法计算斐波拉契级数列中第n项的值。从第一项起,斐波拉契级数序列为1、1、2、3、5、8、13、21、……例如,若给n输入7,该项的斐波拉契级数值为13。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio.h>
long fun(int g)
{
/**********found**********/
switch(g);
{
case 0:return 0;
switch(g)
/**********found**********/
case 1; case 2:return 1;
}
return (fun(g-1)+fun(g-2));
}
main()
{
long fib; int n;
printf("Input n:");
scanf("%d",&n);
printf("n=%d\n",n);
fib=fun(n);
printf("fib=%d\n",fib);
}
【答案】
(1)将switch(g); 改为:switch(g)
(2)将case 1;case 2: return 1;改为:
case 1:case2:return 1;
3.程序设计题
假定输入的字符串中只包含字母和*号。请编写函数fun(),它的功能是:除了尾部的*号之外,将字符串中其他*号全部删除。形参p已指向字符串中最后一个字母。在编写函数时,不得使用C语言的字符串函数。
例如,若字符串中的内容为****A*BC*DEF*G* *****,删除后,字符串中的内容应当是ABCDEFG* *****。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <conio.h>
#include <stdio.h>
void fun(char *a,char *p)
{
}
main()
{
char s[81],*t;
printf("Enter a string:\n ");
gets(s);
t=s;
while(*t) t++;
t--; /*指针t指向字符串尾部*/
while(*t=='*')
t--; /*指针t指向最后一个字母*/
fun(s,t);
printf("The string afterdeleted:\n");
puts(s);
}
【答案】
void fun(char *a,char *p)
{
char *t=a;
for(;t<=p;t++)
if(*t!='*') *(a++)=*t;
for(;*t!='\0';t++)
*(a++)=*t;
*a='\0'; /*在字符串尾加上结束标记符*/
}
1.程序填空题
请补充main函数,该函数的功能是:从键盘输入一组字符串,以“*”结束输入,并显示出这个字符串。
例如,输入abcdefghi*,结果显示adcdefghi。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <windows.h>
#define N 80
main()
{
int i=-1,j=0;
char str[N];
system("cls");
printf("\n Input a string \n");
do
{
i++;
/**********found**********/
scanf(___1___);
/**********found**********/
}while(___2___);
printf("\n**display the string** \n");
while(j<i)
{
/**********found**********/
printf(___3___);
j++;
}
}
【答案】
(1)"%c",&str[i] (2)str[i]!='*'
(3)"%c", str[j]
2.程序修改题
下列给定程序中,函数fun()的功能是:用冒泡法对6个字符串按由小到大的顺序进行排序。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#define MAXLINE 20
/**********found**********/
fun(char *pstr[6])
{
int I, j;
char *p;
for(i=0;i<5;i++)
{
for(j=i+1;j<6;j++)
/**********found**********/
{if(strcmp(*(pstr+i),pstr+j)>0)
{
p=*(pstr+i);
/**********found**********/
*(pstr+i)=pstr+j;
*(pstr+j)=p;
}
}
}
}
main()
{
int I;
char *pstr[6],str[6][MAXLINE];
system("cls");
for(i=0;i<6;i++) pstr[i]=str[i];
printf("Enter 6 string(1 string at each
line):\n ");
for(i=0;i<6;i++) scanf("%s",pstr[i]);
fun(pstr);
printf("The strings after sorting:\n ");
for(i=0;i<6;i++)
printf("%s\n",pstr[i]);
}
【答案】
(1)将fun(char *pstr[6]) 改为:
void fun(char *pstr[6])
(2)将if(strcmp(*(pstr+i),pstr+j)>0) 改为:if(strcmp(*(pstr+i),*(pstr+j))>0)
(3)将*(pstr+i)=pstr+j; 改为:
*(pstr+i)= *(pstr+j);
3.程序设计题
学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun(),它的功能是:把低于平均分的学生数据放在b所指的数组中,低于平均分的学生人数通过形参n传回,平均分通过函数值返回。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
#define N 8
typedef struct
{char num[10];
double s;
}STREC;
double fun(STREC *a,STREC *b,int *n)
{
}
main()
{
STREC s[N]={{"GA05",85},{"GA03",76},
{"GA02",69},{"GA04",85},{"GA01",91},
{"GA07",72},{"GA08",64},{"GA06",87}};
STREC h[N],t;
FILE *out;
int I,j,n;
double ave;
ave=fun(s,h,&n);
printf("The %d student data which is
lower than %7.3f:\n ", n,ave);
for(i=0;i<n;i++)
/*输出成绩低于平均值的学生记录*/
printf("%s %4.1f\n",h[i].num,h[i].s);
printf("\n");
out=fopen("out.dat","w");
fprintf(out,"%d\n%7.3f\n",n,ave);
/*输出平均值*/
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(h[i].s>h[j].s)
{ t=h[i]; h[i]=h[j]; h[j]=t; }
/*将成绩由低至高排列*/
for(i=0;i<n;i++)
fprintf(out,"%4.1f\n",h[i].s);
fclose(out);
}
【答案】
double fun(STREC *a,STREC *b,int *n)
{
int i,j=0;
double av=0.0;
for(i=0;i<N;i++)
av=av+a[i].s;
av=av/N;
for(i=0;i<N;i++)
if(a[i].s<av) b[j++]=a[i];
*n=j;
return av;
}