试题三(共15分)
阅读以下说明和C函数,回答问题 l和问题 2,将解答填入答题纸的对应栏内。
【说明】
对于具有n个元素的整型数组a,需要进行的处理是删除a中所有的值为 0的数组元素,并将a中所有的非 O元素按照原顺序连续地存储在数组空间的前端。下面分别用函数CompactArr_v1 和CompactArr v2来实现上述处理要求,函数的返回值为非零元素的个数。 函数CompactArr_vl(int a[],int n)的处理思路是:先申请一个与数组a的大小相同的动态数组空间,然后顺序扫描数组a的每一个元素,将遇到的非O元素依次复制到动态数组空间中,最后再将动态数组中的元素传回数组a中。
函数CompactArr_v2(int a[],int n)的处理思路是:利用下标i(初值为 0)顺序扫描数组a的每一个元素,下标k(初值为0)表示数组 a中连续存储的非0元素的下标。扫描时,每遇到一个数组元素,i就增 1,而遇到非 0元素并将其前移后k才增 1。
【问题1】 (12分)
请根据说明中函数CompactArr_v1的处理思路填补空缺(1)~(3),根据CompactArr_v2的处理
思路填补空缺(4)。
【问题2】(3分)
请说明函数CompactArr vl存在的缺点。
第1题:
使用语句Dim A(2) As Integer 声明数组A之后,以下说法正确的是( )。
A.A数组中的所有元素都为0
B.A数组中的所有元素值不确定
C.A数组中所有元素值都为Empty
D.执行Erase A后,A数组中所有元素值都不为0
第2题:
阅读以下说明和C语言函数,将应填入(n)处。
[说明]
函数int find_Max_Min(int a[],int n)的功能是:找出n个元素的数组a中的最大元素和最小元素并输出,返回查找过程中元素的比较次数。查找方法如下:比较a[0]和a[n-1],若a[0]大,则交换a[0]和a[n-1]的值:再比较a[1]和a[n-2],若a[1]大,则交换a[1]和a[n-2]的值;以此类推,直到所有的元素都比较完。然后在数组的前半区从前往后找出小元素,在后半区从后往前找出大元素。
[函数]
int find_Max_Min(int a[],int n)
{/*找出n个元素的数组a的最大、最小元素并输出,返回查找过程元素中的比较次数*/
int i,Count=0;
int temp,Maxnum,Minnum;
for(i=0; i<n/2; i++){
Count=Count+1 /*元素比较次数计数*/
if(a[i]>a[(1)])
{/*数组元素交换代码略*/}
}
Maxnum=a[n-1]; Minnum=a[0];
for(i=1;i<n/2+n%2;i++){
Count=(2); /*元素比较次数计数*/
Minnum=(3)? a[i]:Minnum; /*找最小元素*/
Maxnum=(4)?(5):Maxnum; /*找最大元素*/
}
printf("Max=%d\n",Maxnum);
printf("Min=%d\n",Minnum);
return Count;
}
第3题:
●在C语言中,若函数调用时实参是某个数组元素,则传递给对应形参的是 (40) 。
(40) A.数组空间的首地址
B.数组中第一个元素的元素值
C.数组中元素的个数
D.数组中所有的元素
第4题:
阅读以下说明和流程图,填补流程图中的空缺(1)~(9),将解答填入对应栏内。
【说明】
假设数组A中的各元素A(1),A(2),…,A(M)已经按从小到大排序(M≥1);数组B中的各元素B(1),B(2),…,B(N)也已经按从小到大排序(N≥1)。执行下面的流程图后,可以将数组A与数组B中所有的元素全都存入数组C中,且按从小到大排序 (注意:序列中相同的数全部保留并不计排列顺序)。例如,设数组A中有元素:2,5, 6,7,9;数组B中有元素2,3,4,7:则数组C中将有元素:2,2,3,4,5,6,7, 7, 9。
【流程图】
第5题:
阅读以下说明和流程图,将应填入(n)处的字句写在对应栏内。
【说明】
在一个矩阵中,如果其零元素的个数远远多于其非零元素的个数时,称这样的矩阵为稀疏矩阵。稀疏矩阵通常采用三元组数组表示。每个非零元素用一个三元组来表示,即非零元素的行号、列号和它的值。然后按某种顺序将全部非零元素的三元组存于一个数组中。例如,对于以下二维数组:
int x[3][4]={{1,0,0,0},{0,5,0,0),{0,0,7,2}};
可用以下数组a来表示:
int a[][3]={{3,4,4},{0,0,1},{1,1,5),{2,2,7},{2,3,2}};
其中三元数组a的第1行元素的值分别存储稀疏矩阵×的行数、列数和非零元素的个数。
下面的流程图描述了稀疏矩阵转换的过程。
【流程图】
第6题:
在C语言中,若函数调用时实参是某个数组元素,则传递给对应形参的是(55)。
A.数组空间的首地址
B.数组中此元素的元素值
C.数组中元素的个数
D.数组中所有的元素
第7题:
阅读以下说明和流程图,回答问题将解答填入对应栏。
[说明]
本流程图实现采用递归函数来求一个整数数组中从元素0到元素n中的最小值。该算法思想是这样的,首先我们假设有一个求数组中最小元素的函数,然后,在求某一具有n的元素的数组的最小值时,只要求将前n-1的元素的最小值与第n个元素比较即可。不断地重复这一过程,直到数组中只剩下一个元素,那么它必定是最小值。
注:int min(int X,int y)为返回两数中最小数的函数。
int minInArray(int a[],int n)为返回数组中最小数的函数。
minA为数组中最小值。
[问题l]
将流程图的(1)~(4)处补充完整。
[问题2]
min()函数的定义为(5)。
第8题:
●试题三
阅读下列函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
函数move(int*a,int n)用于整理数组a[]的前n个元素,使其中小于0的元素移到数组的前端,大于0的元素移到数组的后端,等于0的元素留在数表中间。
令a[0]~a[low-1]小于0(初始为空);a[low]~a[i-1]等于0(初始为空);a[i]~a[high]还未考察,当前考察元素为a[i]。a[high+1]~a[n-1]大于0(初始为空)。
【函数】
move(int*a,int n)
{
int i,low,high,t;
low=i=0;high=n-1;
while( (1) )
if(a[i]<0)
{
t=a[i];a[i]=a[low];a[low]=t;
(2) ;i++;
}
else if( (3) )
{t=a[i];a[i]=a[high];a[high]=t;
(4) ;
}
else (5) ;
}
●试题三
【答案】(1)i<=high(2)low++(3)a[i]>0(4)high--(5)i++
【解析】程序的说明已经对程序的功能和相关变量解释得很清楚了,这儿就不再重复了。由变量i、变量low和变量high的含义和初值可以判断,i至high之间的元素还未处理,因此while循环条件是"i<=high"或其等价形式,这就是(1)空所填写的内容。
(2)空所在语句块是处理当a[i]<0的情况,显然这时需要将a[i]与a[low]进行交换,交换后需要将i和low都要向后移动,因此(2)空处应填写"low++"或其等价形式。
(3)空需要填写执行(4)空所在语句块的条件,由(4)空所在语句块的可以判断,它是处理当a[i]>0的情况,因此(3)空处应填写"a[i]>0"或其等价形式。当a[i]>0时,需要将a[i]与a[high]进行交换,交换后需要将high都要向前移动,因此(4)空处应填写"high--"或其等价形式。注意这时i不能向后移动,因为交换后的a[i]还没有处理,需要循环的下一趟进行处理。
当a[i]=0情况,当a[i]=0时,不需要进行元素交换,只需将i向后移动就可以了,因此(5)空处应填写"i++"或其等价形式。
第9题:
阅读以下函数说明和C语言函数,将应填入(n)处的字句写在答题纸的对应栏内。
【函数2.1说明】
递归函数sum(int a[], int n)的返回值是数组a[]的前n个元素之和。
【函数2.1】
int sum (int a[],int n)
{
if(n>0) return (1);
else (2);
}
【函数2.2说明】
有3个整数,设计函数compare(int a,int b,int c)求其中最大的数。
【函数2.2】
int compare (int a, int b, int c )
{ int temp, max;
(3) a:b;
(4) temp:c;
}
【函数2.3说明】
递归函数dec(int a[],int n)判断数组a[]的前n个元素是否是不递增的。不递增返回 1,否则返回0。
【函数2.3】
int dec( int a[], int n )
{
if(n<=1) return 1;
if(a[0]<a[1]) return 0;
return (5);
}
第10题:
●在C语言中,若函数调用时实参是数组名,则传递给对应形参的是(51)。
(51)
A.数组空间的首地址
B.数组的第一个元素值
C.数组中元素的个数
D.数组中所有的元素