江苏省高校计算机等级考试命题研究院 江苏省高校计算机等级考试辅导
全国计算机二级C题库第51--60套

 

 

本题目如果下载后发现有错误的地方,请联系网站管理员:QQ121431055

 

考试时,上机操作题目有三套,基本操作题、简单应用题、综合应用题

 

51套:

给定程序中,函数fun的功能是:计算出形参s所指字符串中包含的单词个数,

作为函数值返回。为便于统计,规定各单词之间用空格隔开。

例如,形参s所指的字符串为:This is a C language program.,函数

的返回值为6

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

果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

 

 

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

给定源程序:

#include

int fun(char *s)

{ int n=0, flag=0;

while(*s!='\0')

{ if(*s!=' ' && flag==0) {

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

__1__ ; flag=1;}

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

if (*s==' ') flag= __2__ ;

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

__3__ ;

}

return n;

}

main()

{ char str[81]; int n;

printf("\nEnter a line text:\n"); gets(str);

n=fun(str);

printf("\nThere are %d words in this text.\n\n",n);

}

解题思路:

本题是统计字符串中包含的单词个数。

第一处:单词个数用变量n来统计,当当前字母不是空格且flag状态标志为0时,则单词数

就加1,将状态标志flag置为1,所以应填:n++

第二处:当当前字符是空格时,flag状态标志置0,所以应填:0

第三处:到字符串下一个位置,所以应填:s++

***************************************************

给定程序MODI1.C中函数 fun 的功能是:从n(形参)个学生的成绩中统计出低

于平均分的学生人数,此人数由函数值返回,平均分存放在形参aver所指的存储单

元中。

例如,若输入 8 名学生的成绩:80.5 60 72 90.5 98 51.5 88 64

则低于平均分的学生人数为: 4 (平均分为:75.5625 )。

请改正程序中的错误,使它能统计出正确的结果。

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

给定源程序:

#include

#define N 20

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

{ float ave, t = 0.0 ;

int count = 0, k, i ;

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

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

t = s[k] ;

ave = t / n ;

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

 

 

if ( s[ i ] < ave ) count++ ;

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

*aver = Ave ;

return count ;

}

main()

{ float s[30], aver ;

int m, i ;

printf ( "\nPlease enter m: " ) ; scanf ("%d", &m ) ;

printf ( "\nPlease 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 ) ;

}

解题思路:

第一处:应求累加和,而不赋值,所以应改为t+=s[k];

第二处:ave不需要取地址,直接赋给*aver就可以了。

***************************************************

请编写函数fun,其功能是求出数组的最大元素在数组中的下标并存放在k

指的存储单元中。

例如, 输入如下整数: 876 675 896 101 301 401 980 431 451 777

则输出结果为: 6, 980

注意: 部分源程序在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

int fun(int *s, int t, int *k)

{

}

main( )

{

int a[10]={876,675,896,101,301,401,980,431,451,777}, k ;

fun(a, 10, &k) ;

printf("%d, %d\n", k, a[k]) ;

NONO( ) ;

}

 

解题思路:

本题是考察考生如何在指定的数组找出最大元素值的下标,通过形参*k返回到主程序中。

给出的程序是使用for循环语句进行处理的,在循环之前,首先把数组的第一个元素值赋给

最大值变量max,位置pos0,然后通过循环依次判断下一元素值是否大于最大值max,如果大

于,那么把这个数重新赋给max,位置i赋给pos,循环结果,即可得到最大值的位置pos,最后

执行语句*k=pos就可以实现返回了。

参考答案:

int fun(int *s, int t, int *k)

{

int i, pos = 0, max = *s ;

for(i = 1 ; i < t ; i++) {

if(max < *(s + i)) {

max = *(s + i) ;

pos = i ;

}

}

*k = pos ;

}

 

※※※※※※※※※※※※※※※※※※※※※※※※※

52套:

给定程序中,函数fun的功能是:将N×N矩阵中元素的值按列右移1个位置,

 

 

右边被移出矩阵的元素绕回左边。例如,N=3,有下列矩阵

1 2 3

4 5 6

7 8 9

计算结果为

3 1 2

6 4 5

9 7 8

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

果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

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

给定源程序:

#include

#define N 4

void fun(int (*t)[N])

{ int i, j, x;

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

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

{

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

x=t[i][___2___] ;

for(j=N-1; j>=1; j--)

t[i][j]=t[i][j-1];

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

t[i][___3___]=x;

}

}

main()

{ int t[][N]={21,12,13,24,25,16,47,38,29,11,32,54,42,21,33,10}, i, j;

printf("The original array:\n");

for(i=0; i

{ for(j=0; jprintf("\n");

}

fun(t);

printf("\nThe result is:\n");

for(i=0; i

{ for(j=0; jprintf("\n");

}

}

解题思路:

第一处:函数fun是对N×N矩阵进行操作,for循环的终止值为N

第二处:把最后一列的元素值赋值给临时变量x保存用来交换,所以应填:N-1

第三处:第1列元素值使用x替换,由于C语言的下标是从0开始的,所以应填:0

***************************************************

 

 

例如,若q的值为: 50.0,则函数值为: 49.394948

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

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

给定源程序:

#include

double fun( double q )

{ int n; double s,t;

n = 2;

s = 2.0;

while (s<=q)

{

t=s;

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

s=s+(n+1)/n;

n++;

}

printf("n=%d\n",n);

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

return s;

}

main ( )

{

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

}

解题思路:

第一处:如果两个整数类型相除,结果仍为整数,所以必须转换其中一个数的类型,所以

应改为:s+=(float)(n+1)/n;

第二处:返回结果错误,应改为:return t;

***************************************************

编写函数fun,它的功能是:求Fibonacci数列中大于t的最小的一个数,结果

由函数返回。其中Fibonacci数列F(n)的定义为:

F(0)0F(1)1

F(n)F(n1)F(n2)

例如:当t = 1000时,函数值为:1597

注意: 部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

#include

int fun( int t)

 

 

{

}

main() /* 主函数 */

{ int n;

n=1000;

printf("n = %d, f = %d\n",n, fun(n));

NONO();

}

 

解题思路:

本题是考察考生用递推算法来求出斐波那契数列中每项的值。给出的程序就是用变量ff0

f1来表示递推的过程,给变量f0f1最初分别置数列中第1项和第2项的值01,然后进入循

环,执行语句f=f0+f1;将所得和值存入f中,这就是数列的第3项,把f1的值移入f0中,将f

值移入f1中,为求数列的下一列作好准备;接着进入下一次循环,通过语句f=f0+f1求得数列的

4项,不断重复以上步骤,每重复一次就依次求得数列的下一项,直至某项满足要为止。

参考答案:

int fun( int t)

{

int f0 = 0, f1 = 1, f ;

do {

f = f0 + f1 ;

f0 = f1 ;

f1 = f ;

} while(f < t) ;

return f ;

}

 

※※※※※※※※※※※※※※※※※※※※※※※※※

53套:

函数fun的功能是:计算

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

果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

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

给定源程序:

#include

#include

double fun(double x)

{ double f, t; int n;

f = 1.0 + x;

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

t = ___1___;

n = 1;

do {

n++;

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

t *= (-1.0)*x/___2___;

f += t;

}

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

while (___3___ >= 1e-6);

return f;

}

 

 

main()

{ double x, y;

x=2.5;

y = fun(x);

printf("\nThe result is :\n");

printf("x=%-12.6f y=%-12.6f\n", x, y);

}

解题思路:

第一处:根据公式可知,变量t的值为x

第二处:根据公式可知,此处应该除以n,所以应填:n

第三处:根据试题中条件的要求,所以应填:fabs(t)

***************************************************

给定程序MODI1.C中函数fun的功能是: 求整数xy次方的低3位值。例如,

56次方为15625, 此值的低3位值为625

请改正函数fun中指定部位的错误, 使它能得出正确的结果。

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

给定源程序:

#include

long fun(int x,int y,long *p )

{ int i;

long t=1;

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

for(i=1; 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("\n\nx=%d, y=%d, r=%ld, last=%ld\n\n",x, y,r,t );

}

解题思路:

第一处:错误在for循环语句上,根据试题要求,终止条件应该是i<=y

第二处:要取低3位的值时,应模1000取余数,而不是整除1000取商。

***************************************************

例如, 在主函数中从键盘给x输入0.21,输出为:s=1.100000

注意: 部分源程序在文件PROG1.C中。

 

 

请勿改动主函数main和其他函数中的任何内容, 仅在函数fun

花括号中填入你编写的若干语句。

给定源程序:

#include

#include

double fun(double x)

{

}

main()

{ double x,s;

printf("Input x: "); scanf("%lf",&x);

s=fun(x);

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

NONO();

}

解题思路:

本题是根据给定的公式进行计算。具体操作请看答案程序中的说明。

参考答案:

double fun(double x)

{

int n=1; /* 循环计数*/

double sn=1; /* 累计数*/

double xn=1,xn1=0; /*xn,以及xn-1;*/

while(fabs(xn-xn1)>=0.000001)/*绝对值是否满足条件*/

{

xn=xn*x*(0.5-n+1)/n; /*表达式分解以后xn=(xn-1)*x*(0.5-n+1)/n*/

n+=1;

sn+=xn; /*sn累加上xn*/

}

return(sn);

}

 

※※※※※※※※※※※※※※※※※※※※※※※※※

54套:

给定程序中,函数fun的功能是:计算出带有头结点的单向链表中各结点数据

域中值之和作为函数值返回。

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

果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

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

给定源程序:

#include

#include

#define N 8

typedef struct list

{ int data;

struct list *next;

} SLIST;

SLIST *creatlist(int *);

void outlist(SLIST *);

int fun( SLIST *h)

{ SLIST *p; int s=0;

p=h->next;

while(p)

{

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

s+= p->___1___;

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

p=p->___2___;

}

return s;

}

 

 

 

 

main()

{ SLIST *head;

int a[N]={12,87,45,32,91,16,20,48};

head=creatlist(a); outlist(head);

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

printf("\nsum=%d\n", fun(___3___));

}

SLIST *creatlist(int a[])

{ SLIST *h,*p,*q; int i;

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

for(i=0; i

{ q=(SLIST *)malloc(sizeof(SLIST));

q->data=a[i]; p->next=q; p=q;

}

p->next=0;

return h;

}

void outlist(SLIST *h)

{ SLIST *p;

p=h->next;

if (p==NULL) printf("The list is NULL!\n");

else

{ printf("\nHead ");

do

{ printf("->%d", p->data); p=p->next; }

while(p!=NULL);

printf("->End\n");

}

}

解题思路:

本题是计算出带有头结点的单向链表中各结点数据域中值之和。

第一处:累加数据域中的值,所以应填:data

第二处:指定p的下一个指针,所以应填:next

第三处:函数调用,在主函数中已经给出了head,所以应填:head

***************************************************

给定程序MODI1.C中函数fun的功能是:s所指字符串中出现的与t1所指字符

串相同的子串全部替换成t2所指字符串,所形成的新串放在w所指的数组中。在此

处,要求t1t2所指字符串的长度相同。

例如,当s所指字符串中的内容为:"abcdabfab"t1所指子串中的内容为:

"ab"t2所指子串中的内容为:"99"时, 结果在w所指的数组中的内容应为:

"99cd99f99"

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

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

给定源程序:

#include

#include

int fun (char *s, char *t1, char *t2 , char *w)

 

 

 

 

{

int i; char *p , *r, *a;

strcpy( w, s );

while ( *w )

{ p = w; r = t1;

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

while ( r )

if ( *r == *p ) { r++; p++; }

else break;

if ( *r == '\0' )

{ a = w; r = t2;

while ( *r ){

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

*a = *r; a++; r++

}

w += strlen(t2) ;

}

else w++;

}

}

main()

{

char s[100], t1[100], t2[100], w[100];

printf("\nPlease enter string S:"); scanf("%s", s);

printf("\nPlease enter substring t1:"); scanf("%s", t1);

printf("\nPlease enter substring t2:"); scanf("%s", t2);

if ( strlen(t1)==strlen(t2) ) {

fun( s, t1, t2, w);

printf("\nThe result is : %s\n", w);

}

else printf("Error : strlen(t1) != strlen(t2)\n");

}

解题思路:

第一处:判断字符串当前字符是否是字符串结束符,所以应改为:while(*r)

第二处:语句后缺少分号。

***************************************************

函数fun的功能是:将s所指字符串中下标为偶数的字符删除,串中剩余字符

形成的新串放在t所指数组中。

例如,当s所指字符串中的内容为:"ABCDEFGHIJK"

t所指数组中的内容应是:"BDFHJ"

注意: 部分源程序存在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

#include

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

NONO();

}

 

解题思路:

本题是从一个字符串按要求生成另一个新的字符串。我们使用for循环语句来解决这个问

题。

参考答案:

void fun(char *s, char t[])

{

int i, j = 0 ;

for(i = 1 ; i < strlen(s); i+=2) t[j++] = s[i] ;

t[j] = 0 ;

}

 

※※※※※※※※※※※※※※※※※※※※※※※※※

55套:

给定程序中,函数fun的功能是:判断形参s所指字符串是否是"回文"

Palindrome),若是,函数返回值为1;不是,函数返回值为0"回文"

是正读和反读都一样的字符串(不区分大小写字母)。

例如,LEVELLevel"回文",而LEVLEV不是"回文"

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

果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

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

给定源程序:

#include

#include

#include

int fun(char *s)

{ char *lp,*rp;

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

lp= __1__ ;

rp=s+strlen(s)-1;

while((toupper(*lp)==toupper(*rp)) && (lp

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

lp++; rp __2__ ; }

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

if(lp

else return 1;

}

main()

{ char s[81];

printf("Enter a string: "); scanf("%s",s);

if(fun(s)) printf("\n\"%s\" is a Palindrome.\n\n",s);

else printf("\n\"%s\" isn't a Palindrome.\n\n",s);

}

解题思路:

本题是判断字符串是否是“回文”。

 

 

 

 

第一处:根据函数体fun中,对变量lp的使用可知,lp应指向形参s,所以应填:s

第二处:rp是指向字符串的尾指针,当每做一次循环rp指向就要指向前一个字符,所以应

填:--

第三处:当lprp相等时,则表示字符串是回文并返回1,否则就返回0,所以应填:return

0

***************************************************

给定程序MODI1.Cfun函数的功能是:求出以下分数序列的前n项之和。

2 3 5 8 13 21

┄┄ , ┄┄ , ┄┄ , ┄┄ , ┄┄ , ┄┄ , ……

1 2 3 5 8 13

和值通过函数值返回main函数。

例如,若 n = 5,则应输出: 8.391667

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

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

给定源程序:

#include

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

fun (int n )

{ int a = 2, b = 1, c, k ;

double s=0.0 ;

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

{ s = s + 1.0 * a / b ;

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

c = a; a += b; b += c;

}

return(s) ;

}

main( )

{ int n = 5 ;

printf( "\nThe value of function is: %lf\n", fun ( n ) ) ;

}

解题思路:

第一处:由于计算的实型值要通过函数返回,所以必须定义函数的返回类型,只要intvoid

可以省略,其他都要定义类型。由于返回是实型值,所以应在数名前加上doublefloat等定义。

第二处:根据公式可知,在for循环内b的值应是c

***************************************************

请编写函数fun,函数的功能是:将大于形参m且紧靠mk个素数存入xx所指

的数组中。例如,若输入17, 5,则应输出:19, 23, 29, 31, 37。函数fun中给

出的语句仅供参考。

注意: 部分源程序在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

void fun(int m, int k, int xx[])

{

/* 以下代码仅供参考 */

 

 

 

 

int i, j=1, t=m+1;

while(j<=k)

{

/* 以下完成判断素数,并存放到数组xx */

}

}

main()

{

int m, n, zz[1000] ;

printf( "\nPlease enter two integers:") ;

scanf("%d%d", &m, &n ) ;

fun( m, n, zz) ;

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

printf("%d ", zz[m]) ;

printf("\n") ;

NONO( ) ;

}

 

解题思路:

本题是考察考生如何判断一个数是素数,再判断所求出的素数是否符合题义要求,如果符

合,则存入指定的数组xx中保存,最后由形参xx返回。

本题是用while循环语句分别求出5个符合题义的素数。其中,j是控制变量,m是所求素数

要大于这个数且还要紧靠这个数,k是所求素数的个数,j是当前所求第几个素数。其中while

循环体中的for循环语句是判断t是否是素数。

参考答案:

void fun(int m, int k, int xx[])

{

/* 以下代码仅供参考 */

int i, j=1, t=m+1;

while(j<=k)

{

/* 以下完成判断素数,并存放到数组xx */

 

 

 

 

for(i = 2 ; i < t; i++)

if(t % i==0) break;

if(i==t) {

xx[j-1] = i;

j++;

}

t++;

}

}

}

 

※※※※※※※※※※※※※※※※※※※※※※※※※

56套:

给定程序的功能是:从键盘输入若干行文本(每行不超过80个字符),写到

文件myfile4.txt,-1作为字符串输入结束的标志。然后将文件的内容读出显

示在屏幕上。文件的读写分别由自定义函数ReadTextWriteText实现。

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

果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

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

给定源程序:

#include

 

 

 

 

#include

#include

void WriteText(FILE *);

void ReadText(FILE *);

main()

{ FILE *fp;

if((fp=fopen("myfile4.txt","w"))==NULL)

{ printf(" open fail!!\n"); exit(0); }

WriteText(fp);

fclose(fp);

if((fp=fopen("myfile4.txt","r"))==NULL)

{ printf(" open fail!!\n"); exit(0); }

ReadText(fp);

fclose(fp);

}

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

void WriteText(FILE ___1___)

{ char str[81];

printf("\nEnter string with -1 to end :\n");

gets(str);

while(strcmp(str,"-1")!=0) {

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

fputs(___2___,fw); fputs("\n",fw);

gets(str);

}

}

void ReadText(FILE *fr)

{ char str[81];

printf("\nRead file and output to screen :\n");

fgets(str,81,fr);

while( !feof(fr) ) {

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

printf("%s",___3___);

fgets(str,81,fr);

}

}

解题思路:

本题要求是把键盘上输入的内容写到指定的文件中。程序中共有三处要填上适当的内容,

使程序能运行出正确的结果。

第一处:要求填写文件流的自变量名,在这个函数中,已有的语句fputs("\n",fw);分析可

知:由于文件流变量fw在函数体没有定义过,所以本处应填*fwfw[]

第二处:通过while循环语句,把键盘上输入的内容,要写入到指定的文件中,键盘上输入

的内容已存入字符串str变量中,因此,本处应填写str

第三处:要把已存入文件中的内容,再从文件中读出且已存入字符串变量str中,最后在屏

幕显示出来,因此,此处应填写str

***************************************************

给定程序MODI1.C中函数fun的功能是:从低位开始取出长整型变量s中奇数位

 

 

 

 

上的数,依次构成一个新数放在t中。高位仍在高位,低位仍在低位。

例如,当s中的数为:7654321时,t中的数为:7531

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

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

给定源程序:

#include

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

void fun (long s, long t)

{ long sl=10;

*t = s % 10;

while ( s > 0)

{ s = s/100;

*t = s * sl + *t;

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

\TAB sl = sl*100;

}

}

main()

{ long s, t;

printf("\nPlease enter s:"); scanf("%ld", &s);

fun(s, &t);

printf("The result is: %ld\n", t);

}

解题思路:

第一处:在函数fun中使用了*t,但在函数定义时没有使用*t,所以应改为:void fun(long

s,long *t)

第二处:每循环一次,sl的值就乘以10,所以应改为:sl=sl*10;

***************************************************

函数fun的功能是:将两个两位数的正整数ab合并形成一个整数放在c中。

合并的方式是:将a数的十位和个位数依次放在c数的个位和百位上, b数的十位

和个位数依次放在c数的千位和十位上。

例如,当a45b=12时,调用该函数后,c=1524

注意: 部分源程序存在文件PROG1.C中。数据文件IN.DAT中的数据不得修改。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

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: %ld\n", c);

NONO();

 

 

 

 

}

 

解题思路:

本题是给出两个两位数的正整数分别取出各位上的数字,再按条件组成一个新数。

a十位数字的方法:a/10

a个位数字的方法:a

参考答案:

void fun(int a, int b, long *c)

{

*c=(b/10)*1000+(a)*100+(b)*10+(a/10);

}

 

※※※※※※※※※※※※※※※※※※※※※※※※※

57套:

函数fun的功能是:把形参a所指数组中的最小值放在元素a[0]中,接着把

形参a所指数组中的最大值放在a[1]元素中;再把a所指数组元素中的次小值放

a[2]中,把a所指数组元素中的次大值放在a[3];其余以此类推。例如:若a

所指数组中的数据最初排列为:914236587;则按规则移动

后,数据排列为:192837465。形参n中存放a所指数组中数

据的个数。

注意:规定fun函数中的max存放当前所找的最大值,px存放当前所找最大

值的下标。

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

果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

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

给定源程序:

# include

#define N 9

void fun(int a[], int n)

{ int i,j, max, min, px, pn, t;

for (i=0; i

{

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

max = min = ___1___;

px = pn = i;

for (j=i+1; j

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

if (max<___2___)

{ max = a[j]; px = j; }

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

if (min>___3___)

{ min = a[j]; pn = j; }

}

if (pn != i)

{ t = a[i]; a[i] = min; a[pn] = t;

if (px == i) px =pn;

}

if (px != i+1)

{ t = a[i+1]; a[i+1] = max; a[px] = t; }

}

}

main()

{ int b[N]={9,1,4,2,3,6,5,8,7}, i;

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

for (i=0; iprintf("\n");

fun(b, N);

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

 

 

 

 

for (i=0; iprintf("\n");

}

解题思路:

第一处:外循环每循环一次均把数组a当前位置的值,分别赋值给maxmin变量,所以应填:

a[i]

第二处:判断max是否小于a[j],若小于,则把a[j]赋值给max,所以应填:a[j]

第三处:判断min是否大于a[j],若大于,则把a[j]赋值给min,所以应填:a[j]

***************************************************

给定程序MODI1.C中函数fun的功能是:用递归算法计算斐波拉契数列中第n

项的值。从第1项起,斐波拉契数列为:1123581321、……

例如,若给n输入7,该项的斐波拉契数值为:13

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

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

给定源程序:

#include

long fun(int g)

{

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

switch(g);

{ case 0: return 0;

/**********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\n",fib);

}

解题思路:

第一处:switch后有多余的分号。

第二处:case 1后没有返回语句,也应该为return 1;。所以应改为:case 1: return 1; case

2:return 1;

***************************************************

某学生的记录由学号、8门课程成绩和平均分组成,学号和8门课程的成绩已

在主函数中给出。请编写函数fun,它的功能是:求出该学生的平均分放在记录的

ave成员中。

例如,学生的成绩是:85.5,76,69.5,85,91,72,64.5,87.5,他的平均分应当

是:78.875

注意: 部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun部位中填入你编

写的若干语句。

给定源程序:

#include

 

 

 

 

#define N 8

typedef struct

{ char num[10];

double s[N];

double ave;

} STREC;

void fun(STREC *a)

{

}

main()

{ STREC s={"GA005",85.5,76,69.5,85,91,72,64.5,87.5};

int i;

fun( &s );

printf("The %s's student data:\n", s.num);

for(i=0;i

printf("%4.1f\n",s.s[i]);

printf("\nave=%7.3f\n",s.ave);

NONO();

}

 

解题思路:

本题是求记录结构中学生课程成绩的平均值,其结果仍放在该记录结构中。

参考答案:

void fun(STREC *a)

{

int i ;

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

a->ave = a->ave + a->s[i] ;

a->ave /= N ;

}

 

※※※※※※※※※※※※※※※※※※※※※※※※※

58套:

给定程序中,函数fun的功能是:把形参s所指字符串中最右边的n个字符复制

到形参t所指字符数组中,形成一个新串。若s所指字符串的长度小于n,则将整个

 

 

 

 

字符串复制到形参t所指字符数组中。

例如,形参s所指的字符串为:abcdefghn的值为5,程序执行后t所指字符数

组中的字符串应为:defgh

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

果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

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

给定源程序:

#include

#include

#define N 80

void fun(char *s, int n, char *t)

{ int len,i,j=0;

len=strlen(s);

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

if(n>=len) strcpy(__1__);

else {

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

for(i=len-n; i<=len-1; i++) t[j++]= __2__ ;

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

t[j]= __3__ ;

}

}

main()

{ char s[N],t[N]; int n;

printf("Enter a string: ");gets(s);

printf( "Enter n:"); scanf("%d",&n);

fun(s,n,t);

printf("The string t : "); puts(t);

}

解题思路:

本题是根据要求来复制字符串。

第一处:当给定的长度n大于该字符串s的长度,那么把该字符串直接拷贝到t就可以了,所

以应填:t,s

第二处:使用for循环语句,把最右边n个字符依次添加到t中,所以应填:s[i]

第三处:字符串操作结束,需要到t加一个字符串结束符,所以应填:'\0'

***************************************************

给定程序MODI1.C中函数fun的功能是:找出一个大于形参m且紧随m的素数,

并作为函数值返回。

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

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

给定源程序:

#include

int fun(int m)

{ int i, k ;

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

for (k = 2 ; k < i ; k++)

 

 

 

 

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

if (i % k != 0)

break ;

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

if (k < i)

return(i);

}

}

void main()

{

int n ;

n = fun(20) ;

printf("n=%d\n", n) ;

}

解题思路:

第一处:判断素数的条件是一个数i除自身或1除外不被任何数k整除的数,如果一个数i

另一个数k取模,模值等于零,那么这个不是素数并退出循环体,所以应改为if(i%k==0)

第二处:如果i不被循环中任一个k值不整除,那么循环结束后k的值应该等于i,所以应改

if(k==i)if(k>=i)也可以。

***************************************************

请编写函数fun,它的功能是:求出能整除形参x且不是偶数的各整数,并按从

小到大的顺序放在pp所指的数组中,这些除数的个数通过形参n返回。

例如,若 x 中的值为: 35,则有 4 个数符合要求,它们是: 1, 5, 7, 35

注意: 部分源程序在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

void fun ( int x, int pp[], int *n )

{

}

main( )

{ int x, aa[1000], n, i ;

printf( "\nPlease enter an integer number:\n" ) ; scanf("%d", &x) ;

fun(x, aa, &n ) ;

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

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

printf("\n") ;

NONO( ) ;

}

 

解题思路:

本题是求出能整除形参x且不是偶数的各整数,并按从小到大的顺序放在pp所指的数组中,

这些除数的个数通过形参n返回。

参考答案:

void fun ( int x, int pp[], int *n )

{

int i;

*n=0;

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

if((x % i== 0) && (i % 2)) pp[(*n)++]=i;

}

 

※※※※※※※※※※※※※※※※※※※※※※※※※

59套:

给定程序中,函数fun的功能是:在3×4的矩阵中找出在行上最大、在列上最

小的那个元素,若没有符合条件的元素则输出相应信息。

例如,有下列矩阵:

1 2 13 4

7 8 10 6

 

 

 

 

3 5 9 7

程序执行结果为:find: a[2][2]=9

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

果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

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

给定源程序:

#include

#define M 3

#define N 4

void fun(int (*a)[N])

{ int i=0,j,find=0,rmax,c,k;

while( (i

{ rmax=a[i][0]; c=0;

for(j=1; j

if(rmax

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

rmax=a[i][j]; c= __1__ ; }

find=1; k=0;

while(k

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

if (k!=i && a[k][c]<=rmax) find= __2__ ;

k++;

}

if(find) printf("find: a[%d][%d]=%d\n",i,c,a[i][c]);

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

__3__ ;

}

if(!find) printf("not found!\n");

}

main()

{ int x[M][N],i,j;

printf("Enter number for array:\n");

for(i=0; i

for(j=0; j

printf("The array:\n");

for(i=0; i

{ for(j=0; jprintf("\n\n");

}

fun(x);

}

解题思路:

本题是在矩阵中找出在行上最大、在列上最小的那个元素。

第一处:找出行上最大的数,并该位置j(列)保存在c中,所以应填:j

第二处:使用while循环语句和控制变量find,如果该数不是列是最小数,那么把find0

所以应填:0

 

 

 

 

第三处:iwhile的控制变量,所以每做一次循环,该数均要加1,所以应填:i++

***************************************************

给定程序MODI1.C中函数fun的功能是:根据整型形参m的值,计算如下公式的

值。

1 1 1

t = 1 - ----- - ----- - …… - -----

2*2 3*3 m*m

例如,若 m 中的值为: 5,则应输出: 0.536389

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

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

给定源程序:

#include

double fun ( int m )

{ double y = 1.0 ;

int i ;

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

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

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

y -= 1 /(i * i) ;

return( y ) ;

}

main( )

{ int n = 5 ;

printf( "\nThe result is %lf\n", fun ( n ) ) ;

}

解题思路:

第一处:使用for循环计算公式,必须计算到m,所以应改为for(i=2; i<=m; i++)

第二处:在除法运算中,如果除数和被除数都是整数,所么所除结果也是整数,因此应改

y-=1./(i*i)

***************************************************

m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平均

分的人数作为函数值返回,将低于平均分的分数放在below所指的数组中。

例如,当score数组中的数据为:102030405060708090时,

函数返回的人数应该是4, below中的数据应为: 10203040

注意: 部分源程序在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

#include

int fun(int score[], int m, int below[])

{

}

main( )

{ int i, n, below[9] ;

int score[9] = {10, 20, 30, 40, 50, 60, 70, 80, 90} ;

n = fun(score, 9, below) ;

 

 

 

 

printf( "\nBelow the average score are: " ) ;

for (i = 0 ; i < n ; i++) printf("%d ", below[i]) ;

NONO() ;

}

 

解题思路:

本题是计算平均成绩,再把低于平均成绩的分数存入依次数组below中。

参考答案:

int fun(int score[], int m, int below[])

{

float av=0.0 ;

int i, j=0 ;

for(i=0; i

av /= m;

for(i=0; i

if(av>score[i]) below[j++]=score[i];

return j;

}

 

※※※※※※※※※※※※※※※※※※※※※※※※※

60套:

给定程序中,函数fun的功能是:将形参指针所指结构体数组中的三个元素按

num成员进行升序排列。

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

果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

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

给定源程序:

#include

typedef struct

{ int num;

char name[10];

}PERSON;

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

void fun(PERSON ___1___)

{

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

___2___ temp;

if(std[0].num>std[1].num)

{ temp=std[0]; std[0]=std[1]; std[1]=temp; }

if(std[0].num>std[2].num)

{ temp=std[0]; std[0]=std[2]; std[2]=temp; }

if(std[1].num>std[2].num)

{ temp=std[1]; std[1]=std[2]; std[2]=temp; }

}

main()

{ PERSON std[ ]={ 5,"Zhanghu",2,"WangLi",6,"LinMin" };

int i;

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

fun(___3___);

printf("\nThe result is :\n");

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

printf("%d,%s\n",std[i].num,std[i].name);

}

解题思路:

本题是要求对结构体数组中的三个元素按num成员升序排列。

 

 

 

 

第一处:由于在函数体fun中,已经使用了std变量,所以应填:*std

第二处:由于temp是存放交换记录的中间变量,所以应填:PERSON

第三处:函数的调用,所以应填:std

***************************************************

给定程序MODI1.C中函数fun的功能是: m1m10)个字符串连接起来,

组成一个新串,放入pt所指存储区中。

例如:把3个串:"abc","CD","EF"连接起来,结果是 "abcCDEF"

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

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

给定源程序:

#include

#include

int fun ( char str[][10], int m, char *pt )

{

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

Int k, q, i ;

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

{ q = strlen ( str [k] );

for (i=0; i

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

pt[i] = str[k,i] ;

pt += q ;

pt[0] = 0 ;

}

}

main( )

{ int m, h ;

char s[10][10], p[120] ;

printf( "\nPlease enter m:" ) ;

scanf("%d", &m) ; gets(s[0]) ;

printf( "\nPlease enter %d string:\n", m ) ;

for ( h = 0; h < m; h++ ) gets( s[h]) ;

fun(s, m, p) ;

printf( "\nThe result is : %s\n", p) ;

}

解题思路:

第一处:保留字int错写成Int

第二处:字符数组的字符串书写格式错误。

***************************************************

程序定义了N×N的二维数组,并在主函数中自动赋值。请编写函数

fun( int a[][N]),函数的功能是:使数组左下三角元素中的值全部置成0

例如:a 数组中的值为

| 1 9 7 | | 0 9 7 |

a = | 2 3 8 | 则返回主程序后a数组中的值应为 | 0 0 8 |

| 4 5 6 | | 0 0 0 |

注意: 部分源程序存在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

 

 

 

 

你编写的若干语句。

给定源程序:

#include

#include

#define N 5

int fun ( int a[][N] )

{

}

main ( )

{ int a[N][N], i, j;

printf("***** The array *****\n");

for ( i =0; i

{ for ( j =0; j

{ a[i][j] = rand(); printf( "M", a[i][j] ); }

printf("\n");

}

fun ( a );

printf ("THE RESULT\n");

for ( i =0; i

{ for ( j =0; j

printf("\n");

}

NONO( );

}

 

解题思路:

本题是利用两重循环给二维数组左下三角元素中的值全部置成0

参考答案:

int fun ( int a[][N] )

{

int i, j;

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

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

a[i][j] = 0 ;

}