计算机二级试题_第1页
计算机二级试题_第2页
计算机二级试题_第3页
计算机二级试题_第4页
计算机二级试题_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

44-60【真题1】给定程序的功能是计算score中m个人的平均成绩aver,将低于aver

的成绩放在below中,通过函数名返回人数。

例如,当score={10,20,30,40,50,60,70,80,90},m=9时,函数返

回的人数应该是4,below={10,20,30,40}。

#include<stdio.h>#include<string.h>intfun(intscore[],intm,int

below[])

{inti,j=0;

floataver=0.0;

for(i=0;i<m;i++)aver+=score[i];

aver/=(float)m;

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

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

if(score[i]<aver)below[j++]=___1___;

returnj;

}

main()

{inti,n,below[9];

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

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

n=fun(score,9,___2___);

printf("\nBelowtheaveragescoreare:");

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

for(i=0;i<n;i++)printf("%d",___3___);

}

(2011年2月)

解析:本题的考核点是求平均值。

解题思路:

1、首先定义变量aver,用aver+=score[i]计算总分数,用aver/=(float)

m来计算平均分;

2、通过循环,计算出数组score[]中各个分数的总和,并放至aver中;

3、根据由主函数传过来的m,计算平均分,并放至aver中;

4、通过循环,让每个分数和平均分比较,低于平均分的分数给below[];

6、在以上循环的同时,定义了一个变量j,每当发现一个小于平均分的分数,j

便自动加1;

7、最后返回j值,即是数组score[]中低于平均分的元素个数。

答案:【1】score[i]【2】below【3】below[i]

【真题2】给定程序modi.c中,函数fun的功能是:计算输出high以内最大的

10个素数之和。high由主函数传给fun函数。

若high的值为:100,则函数的值为:732。

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

注意:不要改动main函数,

#include<conio.h>#include<stdio.h>#include<math.h>int

fun(inthigh)

{intsum=0,n=0,j,yes;

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

while((high>=2)&&(n<10)

{yes=1;

for(j=2;j<=high/2;j++)

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

if(high%j==0){yes=0;break}

if(yes){sum+=high;n++;}

high--;

}

returnsum;

}

main()

{clrscr();

printf("%d\n",fun(100));

}

(2011年2月)

解析:本题的考核点是C语言中一些规定的应用。

本题中的第一处错误是:在C语言中,"{"和"}"应成对出现,所以程序中的语

句"while((high>=2)&&(n<10)"应改为"while((high>=2)&&(n<

10))"或相同作用的语句。

本题中的第二处错误是:C语言中,";"是语句的一部分,是语句结束的标志,

不可缺少,所以,"if(high%j==0){yes=0;break}"应改为"if

(high%j==0){yes=0;break;}"或相同作用的语句。

【真题3】请编写函数fun,函数的功能是:实现B=A+A',即把矩阵A加上A的

转置,存放在矩阵B中。计算结果在main函数中输出。

例如,输入下面的矩阵:其转置矩阵为:

|123||147|

|456||258|

|789||369|

程序输出:|2610|

|61014|

|101418|

注意:部分源程序存在文件prog.c中。

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

写的若干语句。

#include<conio.h>#include<stdio.h>voidfun(inta[3][3],int

b[3][3])

{……}

main()/*主程序*/

{inta[3][3]={{1,2,3},{4,5,6},{7,8,9}},t[3][3];

inti,j;

clrscr();

fun(a,t);

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

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

printf("%7d",t[i][j]);

printf("\n");

}

}

(2011年2月)

解析:本题的考核点是矩阵A加上A的转置算法。

提示思路:A的转置即指原先在i行j列的元素现放置在j行i列上,通过一个

两重循环即可求得矩阵与其转置的和。

voidfun(inta[3][3],intb[3][3])

{inti,j;

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

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

b[i][j]=a[i][j]+a[j][i];/*按从行到列的顺序,求得矩阵与其转置的和*/

}【真题1】下列给定程序中,函数fun()的功能是:给定n个实数,输出平均值,

并统计平均值以上(含平均值)的实数个数。例如,n=8时,输入193.199,

195.673,195.757,196.051,196.092,196.596,196.579,196.763,

所得平均值为195.838745,在平均值以上的实数个数应为5。

试题程序:

#include<conio.h>#include<stdio.h>intfun(floatx[],intn)

intj,c=0;float__1__;

{for(j=0;j<n;j++)

__2__;

printf("ave=%f\n",xa);

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

if(__3__)

c++;

returnc;

}

main()

{float

x[100]={193.199,195.673,195.757,196.051,196.092,196.596,196.579,

196.763};

clrscr();

printf("%d\n",fun(x,8));

}

(2011年2月)

解析:填空1:这是一道语法题,这里对某个实型变量进行声明,在函数中找

一下就会发现xa就是这个变量,但是还要注意一下,xa是一个累加变量,其

初值应该设为0.0。

填空2:函数一共有两个循环体,可以很容易地看出第二个循环是计算有多少个

大于平均分的人数,这里的作用也自然就是求平均值,因为循环就这一条语

句,其后没有对累加值求均值的语句,所以在这里要对累加值一并进行除n运

算。

填空3:这里要将大于平均值的数字个数计算出来,利用循环和条件选择语句,

对x数组进行遍历,若某个值大于等于平均成绩,则将该元素累加计入c中。

答案:【1】xa=0.0【2】xa+=x[j]/n【3】x[j]>=xa

【真题2】给定程序modi.c中,函数fun的功能是:找出一个大于给定整数m且

紧随m的素数,并作为函数值返回。

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

注意:不要改动main函数,

#include<conio.h>#include<stdio.h>intfun(intm)

{inti,k;

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

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

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

if(i%k!=0)

break;

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

if(k<i)

return(i);

}

}

main()

{intn;

clrscr();

printf("\nPleaseentern:");

scanf("%d",&n);

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

}

(2011年2月)

解析:首先,我们必须先读懂题中程序的大致意思,这是发现并改正程序中错

误的重要前提。

程序中的重要思想如下:

1、首先,要了解素数的意思,素数是指只能被1和它自身整除的数;

2、题目中要求找出一个大于给定整数m且紧随m的素数。

本题中的第一个错误:在函数fun()的嵌套循环的循环体中,语句"if(i%k!=

0)break;"是不正确的,结合程序上下文,程序是为了判断当前离m最近的

整数是否可以为素数,如果它可以整除除了1和它自身以外其他任意一个整

数,就说明它不是素数,所以应当更改为"if(i%k==0)break;";

本题中的第二个错误:函数fun()中的第二个判断语句"if(k<i)"是不正确的,

应当更改为"if(i<=k)"。

【真题3】请编写一个函数fun,它的功能是:求出一个M×N二维数组每行元素的

和数,并依次放入一个一维数组中传回主函数。例如,若有以下二维数组:

61021016

17151586

418111912

012137

则输出:44616423

注意:部分源程序存在文件prog.c中。

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

写的若干语句。

#defineM4

#defineN5

#include<stdio.h>fun(inta[][N],intb[])

{……}

main()

{intx[M][N],y[M],i,j;

printf("The%dx%dArray:\n",M,N);

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

{for(j=0;j<N;j++){x[i][j]=rand()%20;printf("%4d",

x[i][j]);}

printf("\n");}

fun(x,y);

printf("Thesumofeachline:\n");

for(i=0;i<M;i++)printf("%4d",y[i]);printf("\n");

}

(2011年2月)

解析:本题的考核点是数组和循环语句的嵌套。

提示思路:通过外循环控制数组的行下标,再使用内循环依次对行数组中的所

有元素求和,内循环结束后,将行元素的和存入另外一个数组中。

fun(inta[][N],intb[])

{inti,j,sum=0,n=0;

for(i=0;i<M;i++){/*通过外循环控制数组的行下标*/

for(j=0;j<N;j++)/*使用内循环依次对行数组中的所有元素求和*/

sum+=a[i][j];

b[n++]=sum;/*将行元素的和存入数组b中*/

sum=0;

}

}【真题1】给定程序中,函数fun()的功能是:使数组中的元素的值增加10倍。

试题程序:

#include<stdio.h>#include<conio.h>intm[10];

__1__fun(void)

{

intj;

printf("Insubfuncaftercalling\n");

for(j=0;2__;j++)

{

m[j]=3__;

printf("%3d",m[j]);

}

}

main()

{inti;

printf("Inmainbeforecalling\n");

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

{

m[i]=i;

printf("%3d",m[i]);

}

fun();

printf("\nInmainaftercalling\n");

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

printf("%3d",m[i]);

getch();

}

(2011年2月)

解析:填空1:通过对C语言的学习我们知道这里要填一个函数类型,可以看

到这个函数没有返回语句,所以应该是void型的,要注意的是void虽然是空

类型,但必须写,因为不写时默认是整型。

填空2:这里问的是结束判断语句,函数的作用是将数组中每一个数乘以10,

可见这里应填j<10。

填空3:这个函数很简单,循环的作用就是依次处理每一个数据,这里要完成函

数对数组的操作。

答案:【1】void【2】j<10【3】m[j]*10

【真题2】给定程序modi.c的功能是:读入一个整数k(2≤k≤10000),打印它的

所有质因子(即所有为素数的因子)。例如,若输入整数:2310,则应输出:2、

3、5、7、11。

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

注意:不要改动main函数,

#include"conio.h"

#include"stdio.h"

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

Isprime(intn);

{inti,m;

m=1;

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

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

if!(n%i)

{m=0;break;}

return(m);

}

main()

{intj,k;

clrscr();

printf("\nPleaseenteranintegernumberbetween2and

10000:");scanf("%d",&k);

printf("\n\nTheprimefactor(s)of%dis(are):",k);

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

if((!(k%j))&&(Isprime(j)))printf("\n%4d",j);

printf("\n");

}

(2011年2月)

解析:本题的考核点是C语言的一些基本用法以及if语句的使用。

本题中Isprime(intn);是函数的定义,定义语句不应用分号结束。所以,

"Isprime(intn);"应改为"Isprime(intn)"。

根据if语句的语法规则,if后的表达式必须由括号括起来。由题意看出,n整

除i时,也就是说"n%i==0"时,循环才继续进行。因此,"if!(n%i)"应改

为"if(!(n%i))"或相同作用的语句。

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

fun(inta[][N]),函数的功能是:使数组中第一行元素中的值与倒数第一行元素中

的值对调、第二行元素中的值与倒数第二行元素中的值对调、……、其他依次类推。

例如:a数组中的值为

|0111279|

|19745|

|20131831|

a=|145682|

|1591741|

|1591741|

|145682|

则返回主程序后a数组中的值应为|20131831|

|19745|

|0111279|

注意:部分源程序存在文件prog.c中。

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

写的若干语句。

#include"stdio.h"

#include"conio.h"

#include"stdlib.h"

#defineN5

intfun(inta[][N])

{……}

main()

{inta[N][N],i,j;

clrscr();

printf("*****Thearray*****\n");

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

{for(j=0;j<N;j++)

{a[i][j]=rand()%30;printf("%4d",a[i][j]);}

printf("\n");

}

fun(a);

printf("*****THERESULT*****\n");

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

{for(j=0;j<N;j++)printf("%4d",a[i][j]);

printf("\n");

}

}

(2011年2月)

解析:本题的考核点是C语言中循环嵌套语句的使用。

提示思路:对于本题,我们给出的参考函数采取的算法是:使用嵌套循环,外

循环是行循环,内循环是列循环。将第一行各元素的值与倒数第一行各元素的

值对调,第二行元素中的值与倒数第二行元素中的值对调,……,因为一次互换

两个元素,所以for循环语句执行N/2次(N是数组行的长度)就可以把全部

元素值互换一遍。

intfun(inta[][N])

{inti,j,k;

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

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

{/*将a[i][j]与a[N-i-1][j]中的元素进行对换*/

k=a[i][j];

a[i][j]=a[N-i-1][j];

a[N-i-1][j]=k;

}/*按先行后列的顺序,对数组a中的元素以中间行为对称线进行倒置*/

}【真题1】给定程序的功能是把a数组中的n个数,和b数组中逆序的n个数一一

对应相乘、求平方,结果存在c数组中。

例如:当a数组中的值是:1、3、5、7、8,b数组中的值是:2、3、4、5、8

调用该函数后,c中存放的数据是:64、225、400、441、256

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

#include<stdio.h>voidfun(inta[],intb[],intc[],intn)

{inti;

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

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

___1___=(a[i]*b[n-1-i])*(a[i]*b[n-1-i]);

}

main()

{inti,a[100]={1,3,5,7,8},b[100]={2,3,4,5,8},c[100];

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

fun(___2___,5);

printf("Theresultis:");

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

for(i=0;i<5;i++)printf("%d",___3___);

printf("\n");

}

(2011年2月)

解析:本题的考核点是for循环的使用。

提示思路:本题通过for循环,使用公式c[i]=(a[i]*b[n-1-i])*(a[i]*

b[n-1-i]),求得数组a与数组b逆序之积的平方,将计算结果存在c数组中。

答案:【1】c[i]【2】a,b,c【3】c[i]

【真题2】给定程序modi.c是:计算S=f(f(-1.0)+f(5.0))的值。当程序正确

时,结果为:2488.000000。f(x)函数定义如下:

┌2x^2+3x+4(x<=2)

设f(x)=│

└-2x^2+3x-4(x>2)

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

注意:不要改动main函数,

#include<conio.h>#include<stdio.h>#include<math.h>double

f(doublex)

{doubley;

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

If(x<=2.0)

y=2.0*x*x+3.0*x+4.0;

else

y=-2.0*x*x+3.0*x-4.0;

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

returny

}

main()

{clrscr();

printf("%f\n",f(f(-1.0)+f(5.0)));

}

(2011年2月)

解析:本题着重考察考生对C语言中一些简单算法的掌握情况。

本题中的第一个错误:在C语言中,命令语句应为小写字母,所以程序中语句

"If(x<=2.0)"应改为"if(x<=2.0)";

本题中的第二个错误:在C语言中,应以分号作为语句的分隔符,所以程序中

语句"returny"应改为"returny;"。

【真题3】请编写函数fun,函数的功能是求出二维数组周边元素之和,作为函数值

返回。二维数组中的值在主函数中赋予。

例如:二维数组中的值为

13579

29994

69998

13570

则函数值为61。

注意:部分源程序存在文件prog.c中。

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

写的若干语句。

#include<conio.h>#include<stdio.h>#defineM4

#defineN5

intfun(inta[M][N])

{……}

main()

{intaa[M][N]={{1,3,5,7,9},

{2,9,9,9,4},

{6,9,9,9,8},

{1,3,5,7,0}};

inti,j,y;

clrscr();

printf("Theoriginaldatais:\n");

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

{for(j=0;j<N;j++)printf("%6d",aa[i][j]);

printf("\n");

}

y=fun(aa);

printf("\nThesum:%d\n",y);

printf("\n");

}

(2011年2月)

解析:本题的考核点是c语言中嵌套循环语句和条件判断语句的使用。

提示思路:二维数组的周边元素的特点是:它有一个下标为0或为数组上界。

所以我们只需判断数组的下标是否为0或数组上界即可。按行、列进行循环可

以保证符合条件的元素只被运算一次。

intfun(inta[M][N])

{inti,j,sum=0;

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

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

if((i==0)||(i==M-1)||(j==0)||(j==N-1))/*判断a[i][j]是否

为数组中的第一行或最后一行或第一列或最后一列*/

sum+=a[i][j];/*对a数组的周边元素求和*/

returnsum;

}【真题1】下列给定程序中,函数fun()的功能是:给一维数组a输入任意4个整

数,并按如下的规律输出。例如输入1,2,3,4,程序运行后输出以下方阵:

4123

3412

2341

1234

试题程序:

#include<stdio.h>#defineM4

voidfun(__1__)

{inti,j,k,m;

printf("Enter4number:");

for(i=0;i<M;i++)scanf("%d",__2__);

printf("\n\nTheresult:\n\n");

for(i=M;i>0;i--)

{k=a[M-1];

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

a[j]=a[j-1];

__3__;

for(m=0;m<M;m++)printf("%d",a[m]);

printf("\n");

}

}

main()

{inta[M];

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

}

解析:填空1:注意main函数对fun函数的调用语句,实参是一个整型指针

变量,所以这里也应该是一个指针变量,分析程序可知这个变量是a。

填空2:这里考查的是对scanf函数的掌握,由我们对C语言的学习可知,这

里应该是一个变量地址,再看题目要求可知这里要输入一个4元的一维数组,

就可以得到答案。

填空3:理解题目要求后,分析内层for循环可知每循环一次都将数组前一个值

赋给后一个,那么第一个元素的值是多少呢?注意外层for循环的第一条语句可

以知道将k赋给每行第一个元素。

答案:【1】int*a【2】&a[i]【3】a[0]=k

【真题2】文件modi.c中程序的功能是:读入整数m和n(0≤m,n≤3),按下

面的公式计算函数ACK的值并输出。

┌n+1,m=0

ACK(m,n)=┤ACK(m-1,1),n=0

└ACK(m-1,ACK(m,n-1))m,n>0

例如,若输入3和2,则应输出29。

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

注意:

#include<conio.h>#include<stdio.h>longACK(longm,longn)

{longk;

if(m==0)

k=n+1;

elseif(n==0)

k=ACK(m-1,1);

else

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

k=ACK(m-1,ACK(m-1,n-1));

return(k);

}

main()

{longm,n;

clrscr();

printf("\nPleaseenter2numbers:\n");

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

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

printf("\nThevalueofAckermanfunctionis&d\n",ACK(m,n));

}

解析:本题的考核点是C语言中if选择语句和printf输出函数的使用。

从题目的要求来看,如果m和n都不等于0时,ACK(m,n)=ACK(m-1,

ACK(m,n-1)),显然原程序给出的ACK函数中"k=ACK(m-1,

ACK(m-1,n-1))"是不符合条件的,应改成"k=ACK(m-1,ACK(m,n-

1));"或相同作用的语句。

另外,因为C语言中printf函数格式字符串的前缀应是%,而不是&,所以应

将原程序中的"printf("\nThevalueofAckermanfunctionis&d\n",

ACK(m,n));"改为"printf("\nThevalueofAckermanfunctionis

%d\n",ACK(m,n));"或相同作用的语句。

【真题3】编写程序,实现矩阵(3行3列)的转置(即行列互换)。

例如,输入下面的矩阵:

100200300

400500600

700800900

程序输出:

100400700

200500800

300600900

注意:部分源程序存在文件prog.c中。

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

写的若干语句。

#include<stdio.h>#include<conio.h>intfun(intarray[3][3])

{……}

main()

{inti,j;

intarray[3][3]={{100,200,300},

{400,500,600},

{700,800,900}};

clrscr();

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

{for(j=0;j<3;j++)

printf("%7d",array[i][j]);

printf("\n");

}

fun(array);

printf("Convertedarray:\n");

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

{for(j=0;j<3;j++)

printf("%7d",array[i][j]);

printf("\n");

}

}

(2011年2月)

解析:本题的考核点是3行3列矩阵转置算法。

提示思路:通过两重循环和一个中间数组完成转置。方法是通过循环将原数组

中的i行j列上的数赋值给中间数组的j行i列,最后再将中间数组的值赋给原

数组,形成转置后的矩阵。

intfun(intarray[3][3])

{inti,j;intb[3][3];

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

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

b[j][i]=array[i][j];/*将矩阵行列互换*/

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

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

array[i][j]=b[i][j];/*将b数组中的数据原封不动的保存在array数组中*/

}【真题1】给定程序的功能是:在x数组中放入n个采样值,计算并输出方差值。

N(XK-X')^2NXK

S=Σ─────,其中X'=Σ─

K=1NK=1N

例如n=8,输入:193.199、195.673、195.757、196.051、196.092、

196.596、196.579、196.763时,结果应为:1.135901。

#include<stdio.h>floatfun(floatx[],intn)

{intj;floatxa=0.0,s;

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

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

xa+=x[j]/n;

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

s=___2___;

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

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

s+=(x[j]-xa)*(x[j]-xa)/___3___;

returns;

}

main()

{floatx[100]={193.199,195.673,195.757,196.051,196.092,

196.596,196.579,196.763};

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

}

解析:本题着重考察考生对C语言中基本语法的掌握情况。

题中第一个空填"n":由程序可知,此处是设置循环的次数,其值是由主调函数

中的实参所确定。由于在主调函数中是以确定的值定义的,所以循环变量可以

由形参变量所确定也可以用主调函数中的确定值所确定。

题中第二个空填"0":由题意可知在此处为变量赋初值,根据题面公式设置

s=0。

题中第三个空填"n":此处是将题面中的公式转化为C程序中的公式。由于本程

序用的是固定个数的采样值,所以也可以填入固定值。

答案:【1】n【2】0【3】n

【真题2】给定程序modi.c中,函数fun的功能是:计算函数

F(x,y,z)=(x+y)/(x-y)+(z+y)/(z-y)的值。其中x和y的值不等,z和y的值不

等。

例如,当x的值为9、y的值为11、z的值为15时,函数值为-3.50。

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

注意:不要改动main函数,

#include<stdio.h>#include<math.h>#defineFU(m,n)(m/n)

floatfun(floata,floatb,floatc)

{floatvalue;

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

value=FU(a+b,a-b)+FU(c+b,c-b);

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

Return(Value);

}

main()

{floatx,y,z,sum;

printf("Inputxyz:");

scanf("%f%f%f",&x,&y,&z);

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

if(x==y||y==z){printf("Dataerror!\n");exit(0);}

sum=fun(x,y,z);

printf("Theresultis:%5.2f\n",sum);

}

(2011年2月)

解析:本题着重考察考生对C语言中自定义语句以及基本语法的掌握情况。

本题中的第一个错误:如果按照原程序中的语句调用自定义语句,那么

value=a+b/a-b+c+b/c-b,/运算高于+运算,很显然不符合题意,a+b应

作为一个整体传递给m,需为其加括号,所以程序中语句"value=FU(a+b,ab)+

FU(c+b,c-b);"应改为"value=FU((a+b),(a-b))+FU((c+b),(c-b));"或

相同作用的语句。

本题中的第二个错误:C语言中,命令单词应为小写,所以程序中语句

"Return(Value);"应改为"return(value);"或相同作用的语句。

【真题3】请编一个函数voidfun(inttt[M][N],intpp[N]),tt指向一个M行N

列的二维数组,求出二维数组每列中最小元素,并依次放入pp所指一维数组中。二

维数组中的数已在主函数中赋予。

注意:部分源程序存在文件prog.c中。

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

写的若干语句。

#include<conio.h>#include<stdio.h>#defineM3

#defineN4

voidfun(inttt[M][N],intpp[N])

{……}

main()

{intt[M][N]={{22,45,56,30},

{19,33,45,38},

{20,22,66,40}};

intp[N],i,j,k;

clrscr();

printf("Theoriginaldatais:\n");

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

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

printf("%6d",t[i][j]);

printf("\n");

}

fun(t,p);

printf("\nTheresultis:\n");

for(k=0;k<N;k++)printf("%4d",p[k]);

printf("\n");

}

(2011年2月)

解析:编写的若干语句:

inti,j,min;

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

{min=tt[0][i];/*将每列的第一个数赋值给min*/

for(j=0;j<M;j++)/*将min与该列中的每个数进行比较,并把最大的那

个数赋值给min*/

if(min>tt[j][i])

min=tt[j][i];

pp[i]=min;

}

本题的考核点是C语言中循环嵌套语句的使用。

提示思路:从题目的要求来看,我们应建立一个两重循环来按行、列寻找最小

元素。因为题目要求出每列中的最小元素,所以列循环应放在外面,行循环放

在里面。我们给出的参考函数中,定义了一个变量min来保存最小元素,在行

循环中比较出最小元素,并在行循环结束时赋给数组pp的相应元素。【真题1】函数fun的功能是:将形参a所指数组中的前半部分元素中的值和后半

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

素不动。

例如:若a所指数组中的数据依次为:1、2、3、4、5、6、7、8、9,则调换后

为:6、7、8、9、5、1、2、3、4。

#include<stdio.h>#defineN9

voidfun(inta[],intn)

{inti,t,p;

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

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

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

{

t=a[i];

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

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

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

___3___=t;

}

}

main()

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

printf("\nTheoriginaldata:\n");

for(i=0;i<N;i++)printf("%4d",b[i]);

printf("\n");

fun(b,N);

printf("\nThedataaftermoving:\n");

for(i=0;i<N;i++)printf("%4d",b[i]);

printf("\n");

}

(2011年2月)

解析:本题的考核点是c语言中循环语句的使用。

解题思路:本程序先通过n%2是否为0判断数组中元素的个数是奇数还是偶

数,然后再通过"t=a[i];a[i]=a[p+i];a[p+i]=t;"三个语句对换数组中的前

半部分元素中的值和后半部分元素中的值。

答案:【1】1【2】i【3】i

【真题2】给定程序modi.c中,函数fun的功能是:将十进制正整数m转换成

k(2≤k≤9)进制数,并按位输出。

例如,若输入8和2,则应输出1000(即十进制数8转换成二进制表示是

1000)。

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

注意:不要改动main函数,

#include<conio.h>#include<stdio.h>voidfun(intm,intk)

{intaa[20],i;

for(i=0;m;i++)

{/************found************/

aa[i]=m/k;

m/=k;

}

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

for(;i;i--)

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

}

main()

{intb,n;

clrscr();

printf("\nPleaseenteranumberandabase:\n");

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

fun(n,b);

printf("\n");

}

(2011年2月)

解析:本题的考核点是数制的转换。

k进制数有以下特点:

1.有0到k-1共k个数码。

2.逢k进1,借1当k。

k进制数某一位上的数码实际上代表该数码乘上该位上的权,如十进制数12,

1实际代表1*10。原程序给出的fun函数中,第一个for循环用来将十进制的

整型数据m转换为k进制数据,并将结果按从低位到高位的顺序保存在数组

aa中。在for循环之后,i即为转换成的k进制数的位数,所以根据题义要求,

第一处应改为"aa[i]=m%k;"或相同作用的语句。

第二个错误处为:从后往前打印存有i个数的数组中的值,其下标应该为[i-1]

到[0]。所以"for(;i;i--)"应当改为"for(i=i-1;i>=0;i--)"。

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

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

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

注意:部分源程序存在文件prog.c中。

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

写的若干语句。

本题的考核点是找出分数最高的学生数据的算法。

解题思路:先从所有的学生数据中找出最高的分值,然后将所有学生分数中与最高分

值相等的学生数据放到另一数组中,最后统计分数最高的学生人数并返回。

#include<stdio.h>#defineN16

typedefstruct

{charnum[10];

ints;

}STREC;

intfun(STREC*a,STREC*b)

{……}

main()

{

STREC

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

1},{"GA07",72},

{"GA08",64},{"GA06",87},{"GA015",85},{"GA013",91},{"GA012",64},{

"GA014",91},{"GA011",91},{"GA017",64},{"GA018",64},{"GA016",72}

};

STRECh[N];

inti,n;FILE*out;

n=fun(s,h);

printf("The%dhighestscore:\n",n);

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

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

printf("\n");

out=fopen("out15.dat","w");

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

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

fprintf(out,"%s%4d\n",h[i].num,h[i].s);

fclose(out);

}

(2011年2月)

解析:本评析仅供参考。

intfun(STREC*a,STREC*b)

{inti,j=0,max,k,f=0;

max=(*a).s;

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

if(a[i].s>max)max=a[i].s;/*从所有的学生数据中找出最高的分值*/

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

if(a[i].s==max)

{f++;/*统计分数最高的学生人数*/

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

b[j].num[k]=a[i].num[k];/*将所有学生分数中与最高分值相等的学生数据

放到另一数组b中*/

b[j].s=a[i].s;

j++;

}

return(f);/*返回分数最高的学生人数*/}【真题1】请补充函数fun(),该函数的功能是:把数给aa中元素下标为奇数的元

素按从大到小的顺序重新保存在原数组中,其它元素位置不变。

例如,输入“33,67,42,58,25,76,85,16,41,56”,则输出“33,76,

42,67,25,58,85,56,41,16”。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的横线上填入所编

写的若干表达式或语句。

试题程序:

#include<stdio.h>#defineN10

voidfun(intaa[])

{inti,j,t;

for(【1】;i<N;i=i+2)

{

for(j=i;j<N;j=j+2)

if(aa[i]<aa[j])

{

【2】;

aa[j]=aa[i];

【3】;

}

}

}

main()

{inti;

intaa[N]={33,67,42,58,25,76,85,16,

41,56};

clrscr();

printf("\n***originallist***\n");

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

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

fun(aa);

printf("\n***newlist***\n");

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

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

}

(2011年2月)

解析:填空1:本题采用选择法进行排序。因为题目要求将下标为奇数的元素

进行排序,所以下标为0的元素不用考虑,从下标为1的元素开始。填空2:

借助第三个变量t交换两数。首先将aa[j]赋给t暂存。填空3:然后将aa[i]

赋给aa[j],此时aa[j]中的数已经发生变化,而t中暂存了aa[j]原来的值,

所以最后将t赋给aa[i]。

答案:【1】i=1【2】t=aa[j]【3】aa[i]=t

【真题2】给定程序中,函数fun()的功能是:使数组中的元素的值缩小5倍。

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

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

试题程序:

#include<stdio.h>#include<conio.h>floatm[10];

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

intfun(void)

{intj;

printf(“\n”);

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

{/**********************found***********************/

printf("%f",m[j]/5);

}

}

main()

{inti;

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

{

m[i]=i+20;

printf("%f",m[i]);

}

fun();

}

(2011年2月)

解析:(1)错误:intfun(void)正确:voidfun(void)

(2)错误:printf("%f",m[j]/5);正确:printf("%f",m[j]/=5);

错误1:函数fun()没有返回值,所以定义函数类型为void。

错误2:此处考查的是除法运算符和取余运算符的区别。

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

体数组s中,请编写函数fun(),它的功能是:把指定分数范围之外的学生数据放在

b所指的数组中,分数范围之外的学生人数由函数值返回。

例如,输入的分数是80和89,则应当把分数低于80和高于89的学生数据进行输

出,不包含80分和89分的学生数据。主函数中把80放在low中,把89放在

heigh中。

注意:部分源程序给出如下。

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

写的若干语句。

试题程序:

#include<stdio.h>#defineN16

typedefstruct

{charnum[10];

ints;

}STREC;

intfun(STREC*a,STREC*b,intl,inth)

{……}

main()

{STREC

s[N]={{"GA005",55},{"GA003",96},{"GA002",80},{"GA004",68},

{"GA001",88},{"GA007",74},{"GA008",85},{"GA006",89},

{"GA015",90},{"GA013",53},{"GA012",66},{"GA014",82},

{"GA011",73},{"GA017",69},{"GA018",64},{"GA016",86}};

STRECh[N],tt;

FILE*out;

inti,j,n,low,heigh,t;

printf("Enter2integernumberlow&heigh:");

scanf("%d%d",&low,&heigh);

if(heigh<low)

{

t=heigh;

heigh=low;

low=t;

}

n=fun(s,h,low,heigh);

printf("Thestudent'sdataout%d--%d:\n",low,heigh);

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

printf("%s%4d\n",h[i].num,h[i].s);/*输出指定分数范围内的学生记录*/

printf("\n");

out=fopen("out23.dat","w");

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

n=fun(s,h,70,79);

for(i=0;i<n-1;i++)/*分数在70~79之外的学生记录按分数从低到高排列*/

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

if(h[i].s>h[j].s)

{

tt=h[i];

h[i]=h[j];

h[j]=tt;

}

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

fprintf(out,"%4d\n",h[i].s);

fprintf(out,"\n");

fclose(out);

}

(2011年2月)

解析:intfun(STREC*a,STREC*b,intl,inth)

{inti,j=0;

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

if((a[i].s>=0&&a[i].s<l)||(a[i].s>h&&a[i].s<=100))/*将分数低于

l,高于h的学生记录存于结构体数组b中*/

b[j++]=a[i];

returnj;/*返回分数范围内的学生人数*/

}

处理此类分段统计问题,可采用多分支选择语句或条件选择语句。此处采用条

件选择语句解答,具体见参考答案。使用条件选择语句进行分段统计时应当注

意分段范围。【真题1】给定程序BLANK1.C是建立一个带头结点的单向链表,并用随机函数为

各结点赋值。函数fun的功能是将单向链表结点(不包括头结点)数据域为偶数的值

累加起来,并且作为函数值返回。

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

#include<stdio.h>#include<stdlib.h>typedefstructaa

{intdata;structaa*next;}NODE;

intfun(NODE*h)

{intsum=0;

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

___1___*p;

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

p=___2___;

while(p)

{if(p->data%2==0)

sum+=p->data;

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

p=___3___;

}

returnsum;

}

NODE*creatlink(intn)

{NODE*h,*p,*s,*q;

inti,x;

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

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

{s=(NODE*)malloc(sizeof(NODE));

s->data=rand()%16;

s->next=p->next;

p->next=s;

p=p->next;

}

p->next=NULL;

returnh;

}

outlink(NODE*h,FILE*pf)

{NODE*p;

p=h->next;

fprintf(pf,"\n\nTHELIST:\n\nHEAD");

while(p)

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

fprintf(pf,"\n");

}

outresult(ints,FILE*pf)

{fprintf(pf,"\nThesumofevennumbers:%d\n",s);}

main()

{NODE*head;inteven;

head=creatlink(12);

head->data=9000;

outlink(head,stdout);

even=fun(head);

printf("\nTheresult:\n");outresult(even,stdout);

}

(2011年2月)

答案:1:NODE2:h->next3:p->next

【真题2】下列给定程序中,函数fun()的功能是:从n个学生的成绩中统计出高

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

中。例如输入8名学生的成绩:

8565.56995.5875562.575

则高于平均分的学生人数为4(平均分为74.312500)。

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

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

试题程序:

#include<stdio.h>#include<conio.h>#defineN20

intfun(float*s,intn,float*aver)

{/**********************found***********************/

intave,t=0;

intcount=0,k,i;

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

t+=s[k];

ave=t/n;

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

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

if(s[i]<ave)

count++;

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

aver=ave;

returncount;

}

main()

{floats[30],aver;

intm,i;

clrscr();

printf("\nPleaseenterm:");

scanf("%d",&m);

printf("\nPleaseenter%dmark:\n",m);

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

scanf("%f",s+i);

printf("\nThenumberofstudents:%d\n",fun(s,m,&aver));

printf("Ave=%f\n",aver);

}

(2011年2月)

解析:(1)错误:intave,t=0;正确:floatave,t=0.0;

(2)错误:if(s[i]<ave)正确:if(s[i]>ave)

(3)错误:aver=ave;正确:*aver=ave;

错误1:ave和t分别用来存放成绩的平均值和总分,应为实型数。

错误2:根据题意,找出高于平均分的数,所以此处的关系运算符应为">"

错误3:aver是指针,而ave是一个数,不能将一个数赋值给一个指针,而要

用符号'*'。

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

体数组s中,请编写函数fun(),它的功能是:按分数的高低排列学生的记录,低分

在前。

注意:部分源程序给出如下。

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

写的若干语句。

试题程序:

#include<stdio.h>#defineN16

typedefstruct

{charnum[10];

ints;

}STREC;

intfun(STRECa[])

{……}

main()

{STREC

s[N]={{"GA005",88},{"GA003",64},{"GA002",77},{"GA004",89},

{"GA001",54},{"GA007",72},{"GA008",72},{"GA006",65},

{"GA015",83},{"GA013",95},{"GA012",55},{"GA014",68},

{"GA011",78},{"GA017",53},{"GA018",92},{"GA016",82}};

inti;

FILE*out;

fun(s);

printf("Thedataaftersorted:\n");

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

{

if((i)%4==0)/*每行输出4个学生记录*/

printf("\n");

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

}

printf("\n");

out=fopen("out21.dat","w");

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

{

if((i)%4==0&&i)

fprintf(out,"\n");

fprintf(out,"%4d",s[i].s);

}

fprintf(out,"\n");

fclose(out);

}

(2011年2月)

解析:intfun(STRECa[])

{inti,j;

STRECt;

for(i=1;i<N;i++)/*用冒泡法进行排序,进行N-1次比较*/

for(j=0;j<N-1;j++)/*在每一次比较中要进行N-1次两两比较*/

if(a[j].s>a[j+1].s)/*按分数的高低排列学生的记录,低分在前*/

{

t=a[j];

a[j]=a[j+1];

a[j+1]=t;

}

}

【解析】冒泡法算法思路:如果有N个数,则要进行N-1次比较,在每一次比

较中要进行N-1次两两比较(这种算法较好理解但不是最精的)。所谓两两比较

就是从头到尾依次将相邻两个数进行比较并将其中大的数放在前或在后(若要求

从小到大排序,则大的数要放在后。反之则对调),即两两比较后这两个数要形

成题中所要求的顺序。由于总是从头到尾进行比较,所以第1次比较结束后,

最大(或最小)数肯定在最后,第2次比较结束后,次最大(或次最小)数肯定在倒

数的第2个数,依次类推,所以进行第一次比较时必须比较到最后一个数,而

进行第2次比较时只要比较到倒数的第2个数即可,所以进行第i次比较时只

需比较N-i次即可(这种算法较难理解,但它是最好的)。【真题1】给定程序中已建立一个带有头结点的单向链表,在main函数中将多次

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

点,使链表缩短。

#include<stdio.h>#include<stdlib.h>#defineN8

typedefstructlist

{intdata;

structlist*next;

}SLIST;

voidfun(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;inti;

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

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

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

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

}

p->next=0;

returnh;

}

voidoutlist(SLIST*h)

{SLIST*p;

p=h->next;

if(p==NULL)printf("\nThelistisNULL!\n");

else

{printf("\nHead");

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

printf("->End\n");

}

}

main()

{SLIST*head;

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

head=creatlist(a);

printf("\nOutputfromhead:\n");outlist(head);

printf("\nOutputfromtail:\n");

while(head->next!=NULL){

fun(head);

printf("\n\n");

printf("\nOutputfromheadagain:\n");outlist(head);

}

}

(2011年2月)

解析:本题的考核点是链表中的基本操作。

答案:1、next2、t->data3、t

【真题2】文件MODI.C中程序的功能是:读入一个整数m(4≤m≤10),

例如4,程序将自动在a[0]至a[3]四个数组元素中分别放入

14916,且按逆序输出此4个元素:16941。

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

注意:

#include<conio.h>#include<stdio.h>#defineM10

main()

{inta[M]={0},i=0,j,m;

clrscr();

printf("\nPleaseenteranintegernumberbetween4and10:");

scanf("%d",&m);

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

for(j=0;j<m;j++)a[j]=(i+1)*(i+1);

printf("\nTheoutput:\n");

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

for(i=m-1;i>=0;i--)

printf("%4f",*(a+i));

getch();

}

(2011年2月)

解析:(1)错误:for(j=0;j<m;j++)a[j]=(i+1)*(i+1);正确:

for(j=0;j<m;j++)a[j]=(j+1)*(j+1);

(2)错误:printf(“%4f”,*(a+i));正确:printf(“%4d”,a[i]);

【真题3】已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构

体数组中。请编写函数fun,函数的功能是:找出成绩最高的学生记录,通过形参返

回主函数。已给出函数的首部,请完成该函数。

注意:部分源程序存在文件prog.c中。

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

写的若干语句。

#include"stdio.h"

#include"string.h"

#include"conio.h"

#defineN10

typedefstructss

{charnum[10];ints;}STU;

fun(STUa[],STU*s)

{……}

main()

{STU

a[N]={{"A01",81},{"A02",89},{"A03",66},{"A04",87},{"A05",77},

{"A06",90},{"A07",

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论