全国计算机二级C题库第91--100套

 

 

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

 

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

 

91套:

函数fun的功能是:计算

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

果。

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

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

给定源程序:

#include

#include

double fun(double x)

{ double f, t; int n;

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

f = 1.0+___1___;

t = x;

n = 1;

do {

n++;

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

t *= x/___2___;

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

f += ___3___;

} while (fabs(t) >= 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);

}

解题思路:

第一处:根据公式可知,此处应填:x

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

第三处:计算的结果进行累加并赋值给变量f,所以应填:t

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

给定程序MODI1.C中函数fun的功能是: 计算n5次方的值(规定n的值大于2

小于8),通过形参指针传回主函数;并计算该值的个位、十位、百位上数字之和

作为函数值返回。

例如,75次方是16807, 其低3位数的和值是15

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

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

给定源程序:

#include

#include

int fun( int n ,int *value )

{ int d,s,i;

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

d=0; s=0;

for(i=1; i<=5; i++) d=d*n;

*value=d;

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

{ s=s+d;

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

d=d\10;

}

return s;

}

main()

{ int n, sum, v;

do

{ printf("\nEnter n( 2

while(n<=2||n>=8);

sum=fun( n,&v );

printf("\n\nThe result:\n value=%d sum=%d\n\n",v,sum);

}

解题思路:

第一处:变量d的初始值应为1

第二处:整除的符号是/

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

请编写函数fun, 其功能是: 计算并输出给定数组(长度为9)中每相邻两个元

素之平均值的平方根之和。

例如, 给定数组中的9个元素依次为12.034.04.023.034.045.0

18.03.011.0, 输出应为: s=35.951014

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

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

你编写的若干语句。

 

 

 

 

给定源程序:

#include

#include

double fun(double x[9])

{

}

main()

{ double s,a[9]={12.0,34.0,4.0,23.0,34.0,45.0,18.0,3.0,11.0};

int i;

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

for(i=0;i<9;i++)printf("%6.1f",a[i]); printf("\n\n");

s=fun(a);

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

NONO();

}

 

解题思路:

本题是计算并输出给定数组中每相邻两个元素之平均值的平方根之和。

参考答案:

double fun(double x[9])

{

int i ;

double avg=0.0,sum=0.0;

for (i=0;i<8;i++) {

avg=(x[i]+x[i+1])/2;

sum+=sqrt(avg);

}

return sum;

}

 

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

92套:

函数fun的功能是:计算

的前n项。若x=2.5,函数值为:12.182340

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

果。

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

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

给定源程序:

#include

double fun(double x, int n)

{ double f, t; int i;

f = 1.0;

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

t = ___1___;

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

for (i=___2___; i

{

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

t *= x/___3___;

f += t;

}

return f;

}

main()

{ double x, y;

x=2.5;

y = fun(x, 12);

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

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

}

解题思路:

第一处:t是处理公式中每一项中间项,所以应填:1

第二处:根据公式可知,for循环变量的初始值应从1开始。

第三处:每做一次循环均要除以变量i的值,所以应填:i

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

给定程序MODI1.C中函数fun的功能是: 找出100n(不大于1000)之间三位数

字相等的所有整数, 把这些整数放在s所指数组中, 个数作为函数值返回。

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

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

给定源程序:

#include

#define N 100

int fun(int *s, int n)

{ int i,j,k,a,b,c;

j=0;

for(i=100; i

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

k=n;

a=k; k/=10;

b=k; k/=10;

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

c=k

if( a==b && a==c ) s[j++]=i;

}

return j;

}

main()

{ int a[N], n, num=0, i;

do

{ printf("\nEnter n( <=1000 ) : "); scanf("%d",&n); }

while(n > 1000);

num = fun( a,n );

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

for(i=0; i

printf("\n\n");

}

解题思路:

第一处:k应该取循环变量i的值,所以应改为:k=i;

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

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

请编写函数fun, 其功能是: 计算并输出给定10个数的方差:

例如,给定的10个数为95.089.076.065.088.072.085.081.0

90.056.0,输出为s=11.730729

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

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

你编写的若干语句。

给定源程序:

#include

#include

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

NONO();

}

 

解题思路:

本题是根据公式进行计算。

参考答案:

double fun(double x[10])

{

int i;

double avg=0.0, sum=0.0, abs=0.0, fc;

for (i=0;i<10;i++) sum+=x[i];

avg=sum/10; /* 计算平均值 */

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

abs+=(x[i]-avg)*(x[i]-avg);

fc=sqrt(abs/10) ;

return fc;

}

 

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

93套:

给定程序中已建立一个带有头结点的单向链表,main函数中将多次调用fun

函数,每调用一次fun函数,输出链表尾部结点中的数据,并释放该结点,使链表

缩短。

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

果。

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

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

给定源程序:

#include

#include

#define N 8

typedef struct list

{ int data;

struct list *next;

} SLIST;

void fun( SLIST *p)

{ SLIST *t, *s;

t=p->next; s=p;

while(t->next != NULL)

{ s=t;

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

t=t->___1___;

}

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

printf(" %d ",___2___);

s->next=NULL;

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

free(___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("\nThe list is NULL!\n");

else

{ printf("\nHead");

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

printf("->End\n");

}

}

main()

{ SLIST *head;

int a[N]={11,12,15,18,19,22,25,29};

head=creatlist(a);

printf("\nOutput from head:\n"); outlist(head);

printf("\nOutput from tail: \n");

while (head->next != NULL){

fun(head);

printf("\n\n");

printf("\nOutput from head again :\n"); outlist(head);

}

}

解题思路:

本题是对已经建立的链表,通过调用一次函数就输出链表尾部的数据。程序中共有三处要

填上适当的内容,使程序能运行出正确的结果。

第一处:由于本题要求输出链表尾部的数据,函数是利用while循环语句找出链表尾部的指

针并存入临时变量s中,那么每循环一次就要判断链表是否已结束位置,如果是,则退出循环,

进行输出,由于是通过t指针变量进行操作的,因此,都要取tnext指针重新赋给t来实现,所

以本处应填next

第二处:输出最后一个结点的数据,所以应填t->data(*t).data

第三处:输出出最后一个结点数据后,并把此结点删除了,程序要求释放内存,所以应填t

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

给定程序MODI1.C中函数fun的功能是:将字符串中的字符按逆序输出,但不改

变字符串中的内容。

例如,若字符串为abcd,则应输出:dcba

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

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

给定源程序:

#include

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

fun (char a)

{ if ( *a )

{ fun(a+1) ;

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

printf("%c" *a) ;

}

}

main( )

{ char s[10]="abcd";

printf("处理前字符串=%s\n处理后字符串=", s);

fun(s); printf("\n") ;

}

解题思路:

第一处:形参a应定义为字符串指针。

第二处:语句中缺少逗号。

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

请编写一个函数fun,它的功能是:比较两个字符串的长度,(不得调用C语言

提供的求字符串长度的函数),函数返回较长的字符串。若两个字符串长度相同,

则返回第一个字符串。

例如,输入beijing shanghai 为回车键),

函数将返回shanghai

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

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

你编写的若干语句。

给定源程序:

#include

char *fun ( char *s, char *t)

{

}

main( )

{ char a[20],b[20];

 printf("Input 1th string:") ;

gets( a);

printf("Input 2th string:") ;

gets( b);

printf("%s\n",fun (a, b ));

NONO ();

}

 

解题思路:

本题是比较两个字符串的长度并按要求返回字符串。

我们给出的程序是使用for循环来判断两个字符串中哪一个比较长或相等,循环的终止值为

两个字符串中是否字符串结束符,如果有,则退出循环体。接下来再判断两个字符串是否同时

出现结束符,则返回第一个字符串s,如果不没有同时出现,则判断哪一个字符串先有结束符,

则按要求返回指定的字符串。

参考答案:

char *fun ( char *s, char *t)

{

int i;

char *p=s, *q=t;

for(i=0;*p && *q; i++) {

p++; q++;

}

if(*p == 0 && *q == 0) return s ;

if(*p) return s ;

else return t ;

}

 

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

94套:

函数fun的功能是:计算

的前n项之和。若x=2.5n=15时,函数值为:1.917914

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

果。

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

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

给定源程序:

#include

#include

double fun(double x, int n)

{ double f, t; int i;

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

f = ___1___;

t = -1;

for (i=1; i

{

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

t *= (___2___)*x/i;

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

f += ___3___;

}

return f;

}

main()

{ double x, y;

x=2.5;

y = fun(x, 15);

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

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

}

解题思路:

第一处:根据公式可知,变量f的初值为1

第二处:根据公式可知,此处是正负号的变换,所以应填:-1

第三处:计算的结果进行累加并赋值给变量f,所以应填:t

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

给定程序MODI1.C中函数fun的功能是: 3个红球,5个白球, 6个黑球中任意

取出8个作为一组,进行输出。在每组中,可以没有黑球,但必须要有红球和白球。

组合数作为函数值返回。正确的组合数应该是15。程序中i的值代表红球数, j

值代表白球数,k的值代表黑球数。

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

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

给定源程序:

#include

int fun()

{ int i,j,k,sum=0;

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

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

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

{ for(j=1; j<=5; j++)

{ k=8-i-j;

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

if(K>=0 && K<=6)

{ sum=sum+1;

printf("red:M white:M black:M\n",i,j,k);

}

}

}

return sum;

}

main()

{ int sum;

sum=fun();

printf("sum =M\n\n",sum);

}

解题思路:

第一处:外for循环的初始变量i的值应为1

第二处:变量k写成了大写K了。

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

请编写函数fun, 其功能是: 计算并输出下列多项式的值:

例如, 在主函数中从键盘给n输入15, 则输出为:s=2.718282

注意: 要求n的值大于1但不大于100

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

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

你编写的若干语句。

给定源程序:

#include

double fun(int n)

{

}

main()

{ int n; double s;

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

s=fun(n);

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

NONO();

}

 

解题思路:

本题是根据给定的公式计算结果。使用for循环语句依次求出每一项的值,分别进行累加并

把结果存入变量s中,最后把s作为函数值返回。

参考答案:

double fun(int n)

{

double s=1 ;

long t=1;

int i;

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

t=t*i; /* 计算阶乘 */

s+=1./t; /* 计算每项的值并累加至变量s */

}

return s; /* 返回多项式的值 */

}

 

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

95套:

给定程序中,函数fun的功能是:计算N×N矩阵的主对角线元素和反向对角线

元素之和,并作为函数值返回。注意:要求先累加主对角线元素中的值,然后累

加反向对角线元素中的值。例如,若N=3,有下列矩阵:

1 2 3

4 5 6

7 8 9

fun函数首先累加159,然后累加357,函数的返回值为30

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

果。

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

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

给定源程序:

#include

#define N 4

fun(int t[][N], int n)

{ int i, sum;

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

___1___;

for(i=0; i

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

sum+=___2___ ;

for(i=0; i

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

sum+= t[i][n-i-___3___] ;

return sum;

}

main()

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

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

for(i=0; i

{ for(j=0; j

printf("\n");

}

printf("The result is: %d",fun(t,N));

}

解题思路:

第一处:变量sum是用来存放主对角线元素和反向对角线元素之和,要对其进行初始化,所

以应填:sum=0

第二处:对主对角线元素值累加,所以应填:t[i][i]

第三处:对反向对角线元素值累加,所以应填:t[i][n-i-1]

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

例如,若给m输入 -100,给n输入90,则函数求得的一个根值为2.000

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

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

给定源程序:

#include

#include

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(r)*funx(n)<0) m=r;

\TAB else n=r;

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

}

解题思路:

第一处:变量r应该定义为实数型double或浮点型float变量。

第二处:while必须先满足条件,才做循环体的内容,所以应改为:while(fabs(m-n)>0.001)

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

假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是: 除了

字符串前导和尾部的*号之外,将串中其它*号全部删除。形参h已指向字符串中第

一个字母,形参p已指向字符串中最后一个字母。在编写函数时,不得使用C语言

提供的字符串函数。

例如,字符串中的内容为:****A*BC*DEF*G********,删除后,字符串中的内

容应当是:****ABCDEFG********。在编写函数时,不得使用C语言提供的字符串

函数。

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

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

你编写的若干语句。

给定源程序:

#include

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

NONO();

}

 

解题思路:

本题是考察字符串的操作。

1. r指针左边的字符仍存放字符串a首地址开始的位置上。

2. r指针和p指针中间的字符进行判断,其字符是否是'*',如果不是'*',则把这些字符

放到第1步操作字符串a的后面。

3. p指针右边的字符放到第2步操作字符串a的后面。

4. 最后给字符串a加上结束符。

参考答案:

void fun( char *a, char *h,char *p )

{

int j=0;

char *q=a;

while(*q && q < h) a[j++] = *q++ ;

while(*h && *p && h < p) {

if(*h != '*') a[j++] = *h ;

h++;

}

while(*p) a[j++] = *p++ ;

a[j] = 0 ;

}

 

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

96套:

给定程序中,函数fun的功能是:N×N矩阵,将矩阵的外围元素顺时针旋转。

操作顺序是:首先将第一行元素的值存入临时数组r,然后使第一列成为第一行,

最后一行成为第一列,最后一列成为最后一行,临时数组中的元素成为最后一列。

例如,若N=3,有下列矩阵:

1 2 3

4 5 6

7 8 9

计算结果为

7 4 1

8 5 2

9 6 3

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

果。

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

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

给定源程序:

#include

#define N 4

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

{ int j ,r[N];

for(j=0; j

for(j=0; j

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

t[0][N-j-1]=t[j][___1___ ];

for(j=0; j

t[j][0]=t[N-1][j];

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

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

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

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

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

t[j][N-1]=r[___3___];

}

main()

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

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

}

}

解题思路:

第一处:把第1列上的数存放到第1行上,所以应填:0

第二处:for循环的增量值,由于循环是从大到小递减,所以应填:j--

第三处:把临时数组中的元素成为最后一列,所以应填:j

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

给定程序MODI1.C中函数 fun 的功能是:计算

S = f(-n) + f(-n+1) +…+ f(0) + f(1) + f(2) +…+ f(n)

的值。例如,当n5时,函数值应为:10.407143f(x)函数定义如下:

(x+1)/(x-2) x>0 x2

f(x) = 0 x=0 x=2

(x-1)/(x-2) x<0

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

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

给定源程序:

#include

#include

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

f( double x)

{

if (x == 0.0 || x == 2.0)

return 0.0;

else if (x < 0.0)

return (x -1)/(x-2);

else

return (x +1)/(x-2);

}

double fun( int n )

{ int i; double s=0.0, y;

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

{y=f(1.0*i); s += y;}

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

return s

}

main ( )

{

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

}

解题思路:

第一处:由于返回值是实数型值,所以在函数名前加上double

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

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

编写函数fun,它的功能是计算:

s作为函数值返回。

C语言中可调用log ( n )函数求ln (n)log函数的引用说明是:

double log(double x)

例如,若m的值为: 20fun函数值为: 6.506583

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

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

你编写的若干语句。

给定源程序:

#include

#include

double fun( int m )

{

}

main()

{

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

NONO();

}

 

解题思路:

本题是根据给定的公式计算结果。使用for循环语句依次求出每一项的值,分别进行累加并

把结果存入变量s中,循环结束后再对s求平方根,结果仍存入s中,最后返回s

参考答案:

double fun( int m )

{

double s = 0.0 ;

int i ;

for(i = 1 ; i <= m ; i++) s += log(1.0 * i) ;

s = sqrt(s) ;

return s ;

}

 

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

97套:

函数fun的功能是:逆置数组元素中的值。例如:若a所指数组中的数据依次

为:123456789,则逆置后依次为:98765432

1。形参n给出数组中数据的个数。

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

果。

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

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

给定源程序:

#include

void fun(int a[], int n)

{ int i,t;

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

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

{

t=a[i];

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

a[i] = a[n-1-___2___];

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

___3___ = t;

}

}

main()

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

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

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

printf("M ", b[i]);

printf("\n");

fun(b, 9);

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

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

printf("M ", b[i]);

printf("\n");

}

解题思路:

第一处:利用for循环语句,对数组中的各元素进行逆置,所以终止值为n/2

第二处:进行交换数组中元素的值,由于是依次是首和尾交换,所以应填:i

第三处:使用中间变量t来交换的,所以应填:a[n-i-1]

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

给定程序MODI1.C中函数fun的功能是:将一个由八进制数字字符组成的字符

串转换为与其面值相等的十进制整数。规定输入的字符串最多只能包含5位八进制

数字字符。

例如,若输入:77777,则输出将是:32767

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

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

给定源程序:

#include

int fun( char *p )

{ int n;

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

n= *P-'o';

p++;

while( *p!=0 ) {

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

\TAB n=n*8+*P-'o';

\TAB p++;

}

return n;

}

main()

{ char s[6]; int i; int n;

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

if(strlen(s)>5){ printf("Error: String too longer !\n\n");exit(0); }

for(i=0; s[i]; i++)

if(s[i]<'0'||s[i]>'7')

{ printf("Error: %c not is ocatal digits!\n\n",s[i]);exit(0); }

printf("The original string: "); puts(s);

n=fun(s);

printf("\n%s is convered to integer number: %d\n\n",s,n);

}

解题思路:

第一和第二处:*p错写成*P'0'错写成'o'

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

学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组

s,请编写函数fun,它的功能是:函数返回指定学号的学生数据,指定的学号在主

函数中输入。若没找到指定学号,在结构体变量中给学号置空串,给成绩置-1,作

为函数值返回。(用于字符串比较的函数是strcmp)。

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

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

你编写的若干语句。

给定源程序:

#include

#include

#define N 16

typedef struct

{ char num[10];

int s;

} STREC;

STREC fun( STREC *a, char *b )

{

}

main()

{ STREC s[N]={{"GA005",85},{"GA003",76},{"GA002",69},{"GA004",85},

\TAB \TAB {"GA001",91},{"GA007",72},{"GA008",64},{"GA006",87},

\TAB \TAB {"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},

\TAB \TAB {"GA011",77},{"GA017",64},{"GA018",64},{"GA016",72}};

STREC h;

char m[10];

int i;FILE *out ;

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

for(i=0; i

{ if(i%4==0) printf("\n");

printf("%s = ",s[i].num,s[i].s);

}

printf("\n\nEnter the number: ");gets(m);

h=fun( s,m );

printf("The data : ");

printf("\n%s M\n",h.num,h.s);

printf("\n");

out = fopen("c:\\test\\out.dat","w") ;

h=fun(s,"GA013");

fprintf(out,"%s M\n",h.num,h.s);

fclose(out);

}

解题思路:

本题是从学生记录体中找出给定的学号。具体操作请看答案程序中的说明。

参考答案:

STREC fun( STREC *a, char *b )

{

STREC c ;

int i ;

c.num[0] = '\0' ; /* 置初始空串 */

c.s = -1 ; /* 置成绩为-1 */

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

if(strcmp(a[i].num, b)==0) { /* 判断学号是否相等 */

strcpy(c.num, a[i].num) ; /* 相等,则对学号进行赋值 */

c.s=a[i].s; /* 相等,则对成绩进行赋值 */

break ; /* 退出循环体 */

}

return c ; /* 返回结构体变量 */

}

 

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

98套:

给定程序中,函数fun的功能是:在带有头结点的单向链表中,查找数据域中

值为ch的结点。找到后通过函数值返回该结点在链表中所处的顺序号;若不存在

 值为ch的结点,函数返回0值。

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

果。

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

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

给定源程序:

#include

#include

#define N 8

typedef struct list

{ int data;

struct list *next;

} SLIST;

SLIST *creatlist(char *);

void outlist(SLIST *);

int fun( SLIST *h, char ch)

{ SLIST *p; int n=0;

p=h->next;

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

while(p!=___1___)

{ n++;

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

if (p->data==ch) return ___2___;

else p=p->next;

}

return 0;

}

main()

{ SLIST *head; int k; char ch;

char a[N]={'m','p','g','a','w','x','r','d'};

head=creatlist(a);

outlist(head);

printf("Enter a letter:");

scanf("%c",&ch);

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

k=fun(___3___);

if (k==0) printf("\nNot found!\n");

else printf("The sequence number is : %d\n",k);

}

SLIST *creatlist(char *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("\nThe list is NULL!\n");

else

{ printf("\nHead");

do

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

while(p!=NULL);

printf("->End\n");

}

}

解题思路:

本题是在给定的链表中要求找出指定的值。

第一处:判断p是否结束,所以应填:NULL

第二处:在函数fun中,使用n来计算结点的位置,当找到ch值,则返回结点的位置n,所以

应填:return n

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

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

给定程序MODI1.C中函数fun的功能是:删除p所指字符串中的所有空白字符(

括制表符、回车符及换行符)

输入字符串时用'#'结束输入。

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

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

给定源程序:

#include

#include

#include

fun ( char *p)

{ int i,t; char c[80];

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

For (i = 0,t = 0; p[i] ; i++)

if(!isspace(*(p+i))) c[t++]=p[i];

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

c[t]="\0";

strcpy(p,c);

}

main( )

{ char c,s[80];

int i=0;

printf("Input a string:");

c=getchar();

while(c!='#')

{ s[i]=c;i++;c=getchar(); }

s[i]='\0';

 

 

 

 

fun(s);

puts(s);

}

解题思路:

第一处:保留字for错写成For

第二处:置字符串结束符错误,应该是:'\0'

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

请编写一个函数fun,它的功能是:将ss所指字符串中所有下标为奇数位置上

的字母转换为大写(若该位置上不是字母,则不转换)

例如, 若输入"abc4EFg",则应输出"aBc4EFg"

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

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

你编写的若干语句。

给定源程序:

#include

#include

void fun ( char *ss )

{

}

main( )

{ char tt[81] ;

printf( "\nPlease enter an string within 80 characters:\n" ); gets( tt );

printf( "\n\nAfter changing, the string\n \"%s\"", tt );

fun( tt );

printf( "\nbecomes\n \"%s\"\n", tt );

NONO ( );

}

 

解题思路:

本题是考察考生对字母按要求进行转换。其中大小字母的ASCII值相差32

参考答案:

void fun ( char *ss )

{

int i ;

for(i = 1 ; i < strlen(*ss) ; i+=2) {

if(ss[i] >= 'a' && ss[i] <= 'z') ss[i] -= 32 ;

}

}

 

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

99套:

函数fun的功能是:将形参a所指数组中的前半部分元素中的值和后半部分元

素中的值对换。形参n中存放数组中数据的个数,若n为奇数,则中间的元素不动。

例如:若a所指数组中的数据依次为:123456789,则调换后

为:678951234

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

果。

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

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

给定源程序:

#include

#define N 9

void fun(int a[], int n)

{ int i, t, p;

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

p = (n%2==0)?n/2:n/2+___1___;

for (i=0; i

{

t=a[i];

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

a[i] = a[p+___2___];

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

___3___ = t;

}

}

main()

{ int b[N]={1,2,3,4,5,6,7,8,9}, 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");

}

解题思路:

第一处:如果n是奇数,则中间的元素不动,所以应填:1

第二处:使用for循环语句来交换数组元素的值,所以应填:i

第三处:使用中间变量t来交换的,所以应填:a[p+i]

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

给定程序MODI1.C中函数fun的功能是:把主函数中输入的3个数,最大的放在

a中,最小的放在c中,中间的放在b中。

例如,输入的数为:55 12 34

输出结果应当是:a=55.0 , b=34.0 , c=12.0

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

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

给定源程序:

#include

void fun(float *a,float *b,float *c)

{

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

float *k;

if( *a<*b )

{ k=*a; *a=*b; *b=k; }

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

if( *a>*c )

{ k=*c; *c=*a; *a=k; }

if( *b<*c )

{ k=*b; *b=*c; *c=k; }

}

main()

{ float a,b,c;

printf("Input a b c: "); scanf("%f%f%f",&a,&b,&c);

 printf("a = %4.1f, b = %4.1f, c = %4.1f\n\n",a,b,c);

fun(&a,&b,&c);

printf("a = %4.1f, b = %4.1f, c = %4.1f\n\n",a,b,c);

}

解题思路:

第一处:在函数fun体中,k是一个浮点型变量,所以应改为:float k;

第二处:三个数比较大小,第1个条件是第1个比第2个小,则交换。第3个条件是第2个比第

3个小,则也交换。第2个条件是应该第1和第3个小,则交换就符合题意了,所以应改为:

if(*a<*c)

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

学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组

s,请编写函数fun,它的功能是:把分数最高的学生数据放在b所指的数组中,

意:分数最高的学生可能不止一个,函数返回分数最高的学生的人数。

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

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

你编写的若干语句。

给定源程序:

#include

#define N 16

typedef struct

{ char num[10];

int s;

} STREC;

int fun( STREC *a, STREC *b )

{

}

main()

{ STREC s[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},

{"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87},

{"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},

{"GA011",77},{"GA017",64},{"GA018",64},{"GA016",72}};

STREC h[N];

int i,n;FILE *out ;

n=fun( s,h );

printf("The %d highest score :\n",n);

for(i=0;i

printf("%s M\n",h[i].num,h[i].s);

printf("\n");

out = fopen("c:\\test\\out.dat","w") ;

fprintf(out, "%d\n",n);

for(i=0;i

fprintf(out, "M\n",h[i].s);

fclose(out);

}

解题思路:

本题是找出最高成绩,再把N名学生的成绩等于最高成绩的记录存入b所指的数组中。具体操作请看答案程序中的说明。

参考答案:

int fun( STREC *a, STREC *b )

{

int i, max = a[0].s, n=0;

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

if(max < a[i].s) max = a[i].s ; /* 找出最高成绩 */

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

if(max==a[i].s) b[n++] = a[i] ; /* 找相等的最高成绩并存入数组b */

return n; /* 返回符合条件的人数 */

}

 

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

100套:

给定程序中,函数fun的功能是:在形参s所指字符串中寻找与参数c相同的字符,并在其后插入一个与之相同的字符,若找不到相同的字符则函数不做任何处理。

例如,s所指字符串为:baacdac中的字符为:a

执行后s所指字符串为:baaaacdaa

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

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

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

给定源程序:

#include

void fun(char *s, char c)

{ int i, j, n;

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

for(i=0; s[i]!=___1___ ; i++)

if(s[i]==c)

{

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

n=___2___ ;

while(s[i+1+n]!='\0') n++;

for(j=i+n+1; j>i; j--) s[j+1]=s[j];

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

s[j+1]=___3___ ;

i=i+1;

}

}

main()

{ char s[80]="baacda", c;

printf("\nThe string: %s\n",s);

printf("\nInput a character: "); scanf("%c",&c);

fun(s,c);

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

}

解题思路:

第一处:在for循环中终止值要判断字符串是否结束符,所以应填:'\0'

第二处:n用于统计参数c后还有多少个字符,要对其进行初始化,所以应填:0

第三处:要求插入相同的字符c,所以应填:c

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

在主函数中从键盘输入若干个数放入数组中, 0结束输入并放在最后一个

元素中。给定程序MODI1.C中函数fun的功能是:计算数组元素中值为正数的平均

(不包括0)

例如:数组中元素中的值依次为:39,-47,21,2,-8,15,0

则程序的运行结果为:19.250000

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

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

给定源程序:

#include

double fun ( int x[])

{

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

int sum = 0.0;

int c=0, i=0;

while (x[i] != 0)

{ if (x[i] > 0) {

sum += x[i]; c++; }

i++;

}

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

 sum \= c;

return sum;

}

main( )

{ int x[1000]; int i=0;

printf( "\nPlease enter some data (end with 0): " );

do

{ scanf("%d", &x[i]); }

while (x[i++] != 0);

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

}

解题思路:

第一处:由于sum是存放实数值,因此不能定义为整型,所以应改为double sum=0.0;float

sum=0.0;

第二处:除的运算符是“/”。

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

编写函数fun,函数的功能是:根据以下公式计算s,计算结果作为函数值返

回;n通过形参传入。

   1       1              1

S=1 + ── + ─── + ... + ──────

   1+2    1+2+3         1+2+3+...+n

例如:若n的值为11时,函数的值为:1.833333

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

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

你编写的若干语句。

给定源程序:

#include

float fun(int n)

{

}

main()

{ int n; float s;

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

s = fun(n);

printf("the result is: %f\n", s);

NONO();

}

 

解题思路:

本题是根据给定的公式计算结果。使用for循环语句依次求出每一项的值,分别进行累加并

把结果存入变量s中,最后返回s

参考答案:

float fun(int n)

{

int i,j,t;

float s=0;

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

t=0;

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

s=s+1./t;

}

return s;

}