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

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

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

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;

}


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

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