填空题阅读以下说明和C函数,将应填入(n)处的字句写在对应栏内。[说明]若一个矩阵中的非零元素数目很少且分布没有规律,则称之为稀疏矩阵。对m行n列的稀疏矩阵M,进行转置运算后得到n行m列的矩阵MT,如图3-1所示为了压缩稀疏矩阵的存储空间,用三元组(即元素所在的行号、列号和元素值、表示稀疏矩阵中的一个非零元素,再用一维数组逐行存储稀疏矩阵中的所有非零元素也称为三元组顺序表)。例如,图3-1所示的矩阵M相应的三元组顺序表如表3-1所示。其转置矩阵MT的三元组顺序表如表3-2所示。函数TransposeMatrix(MatrixM)的功能是对用三元组顺序表表示的稀疏矩阵M进行转置运算。对M实施转置运算时,为了将M中的每个非零元素直接存入其转置矩阵MT三元组顺序表的相应位置,需先计算M中每一列非零元素的数目(即MT中每一行非零元素的数目),并记录在向量num中;然后根据以下关系,计算出矩阵M中每列的第一个非零元素在转置矩阵MT三元组顺序表中的位置:cpot[0]=0cpot[j]=cpot[j-1]+num[j-1])/*j为列号*/类型ElemType,Triple和Matrix定义如下:typedefintElemType;typedefstruct/*三元组类型*/intr,c;/*矩阵元素的行号、列号*/ElemTypee;/*矩阵元素的值*/Triple;typedefstruct/*矩阵的元组三元组顺序表存储结构*/introws,cols,elements;/*矩阵的行数、列数和非零元素数目*/Tripledata[MAXSIZE];Matrix;[C语言函数]intTransposeMatrix(MatrixM)intj,q,t;int*num,*cpot;MatrixMT;/*MT是M的转置矩阵*/num=(int*)malloc(M.cols*sizeof(int));cpot=(int*)malloc(M.cols*sizeof(int));if(!num||cpot)returnERROR;MT.rows=(1);/*设置转置矩阵MT行数、列数和非零元素数目*/MT.cols=(2);MT.elements=M.elements;if(M.elements>0)for(q=0;q<M.cols;q++)num[q]=0;for(t=0;t<M.elements;++t)/*计算矩阵M中每一列非零元素数目*/num[M.data[t].c]++;/*计算矩阵M中每列第一个非零元素在其转置矩阵三元组顺序表中的位置*/(3);for(j=1;j<M.cols;j++)cpot[j]=(4);/*以下代码完成转置矩阵MT三元组顺序表元素的设置*/for(t=0;t<M.elements;t++)j=(5);/*取矩阵M的一个非零元素的列号存入j*//*q为该非零元素在转置矩阵MT三元组顺序表中的位置(下标)*/q=cpot[j];MT.data[q].r=M.data[t].c;MT.data[q].c=M.data[t].r;MT.data[q].e=M.data[t].e;++cpot[j];/*计算M中第j列的下一个非零元素的目的位置*//*for*//*if*/free(num);free(cpot);/*此处输出矩阵元素,代码省略*/returnOK;/*TransposeMatrix*/
填空题[说明] 本程序求3~100之间的所有素数(质数)并统计个数;同时将这些素数从小到大依次写入顺序文件E: /dataout.txt;素数的个数显示在窗体Form1上。 [Visual Basic 代码] Private Sub Command1_ Click ( ) Dim count as integer, flag as Boolean Dim t1 as Integer, t2 as Integer (1) Count=0 For t1=3 to 100 Flag=Tree For t2=2 to Int( Sqr ( t1 ) ) If (2) Then flag=False Next t2 (3) count= (4) write #1, t1 End if Next t1 (5) Close #1 End Sub
填空题阅读以下函数说明和C语言函数,将应填入 (n) 处的字句写在对应栏内。 [说明1] 函数int factors(int n)的功能是判断整数n(n>=2)是否为完全数。如果n是完全数,则函数返回0,否则返回-1。 所谓“完全数”是指整数n的所有因子(不包括n)之和等于n自身。例如:28的因子为1,2,4,7,14,而28=1+2+4+7+14,因此28是“完全数”。 [C函数1] int factors(int n) int i,S; for(i=l,s=0;i<=n/2;i++) if(n%i==O) (1) ; if( (2) )return 0; rerurn -1; [说明2] 函数int maxint(int a[],int k)的功能是用递归方法求指定数组中前k个元素的最大值,并作为函数值返回。 [C函数2] int maxint(int a[],int k) int t; if( (3) )return (4) ; t=maxint(a+1, (5) )j return(a[0]t) ? a[0] :t;
填空题【说明】
找一个最小的自然数,使它等于不同的两组三个自然数的三次幂之和,即找最小的x,使得:x=a*a*a+b*b*b+c*C*c+d*d*d+e*e*e+f*f*f,其中,a、b、c、d、e、f者是是自然数,a≤b≤C≤d≤e≤f; [a,b,c]!=[d,e,f)
【C++程序】
#include<stdio.h>
#define N 100
void main ()
{
int i,j,il,ih,i0,j0,k0,il,j 1,k1;
int j1[N],jh[N];/*第i层平面的行的变化范围,自jl[i]至jh[i]*/
int k[N][N];/*第i层平面中,对应行j,当前的列号值为k[i][j]*/
int p[N], min;/*p[i]=i*i*i*/
i1=1;j1=1;k1=1;/*首先只局限下三角棱体的顶点*/
i1=1;ih=1;/*预置i的变化范围初值i1<=i<=ih*/
j1[1]=1;jh[1]=1;/*对应i层平面的行的变化范围*/
k[i1][j1[i1>=1;/*第i层平面中,对应行的列的初值*/
p[1]=1;
do
{
min=p[i1]+p[j1]+p[k1];
i0=i1;j0=j1;k0=k1;
if ( i1==ih ) /*当前候选者在ih平面, 则ih增1*/
{
ih++;
{{U}} (1) {{/U}};
/*为ih平面设定j的变化范围和对应k值*/
j1[ih]=1;jh[ih]=1;k[ih][1]=1;
}
if ( i1==i1/*在i1平面最下角点找到候选者,i1增1*/
else
{
if ( k1==1
k[i1][jh[i1>=1;
}
if( k1==j1/*调整i1平面当前行的列号*/
}
i1=i1;/*预定最上平面的最小行的当前列为下一个候选者*/
j1=j1[i1];
k1=k[i1][j1];
for ( i=i1;i<=ih;i++ ) /*寻找最小值所在平面号、行号和列号*/
{
for ( j=j1[i];j<=jh[i];j++ )
if ( p[i]+p[j]+p[k[i][j><{{U}} (4) {{/U}})
{
i1=i;j 1=j;k1=k[i][j];
}
}
}while ( p[i1]+p[j1]+p[k1]!=min
if ( p[i1]+p[j1]+p[k1]==min )
printf ( "%4d=%2d^3+%d^3+%dA3=%2d^3+%d^3+%d^3/n",min,i0,j0,k0,i1,j1,k1 );
else printf ( "The %d is too small./n",N );
}
填空题【说明】 下面程序的功能是:在含有10个元素的数组中查找最大数,及最大数所在位置(即下标值),最大数可能不止一个。 例如:若输入 2 8 5 7 8 4 8 3 2 8 则应输出 The max:8 Total:4 //最大数出现次数 The positions:1 4 6 9 【函数】 #include<stdio.h> #define M 10 int fun(int* a,int * n,int pos[ ]) int i, k max = - 32767; (1) for(i=0;i<M;i++) if( (2) )max=a[i]; for(i=0;i<M;i++) if( (3) )pos[k++]=i; *n=k; return max; main() int a[M],pos[M],i=0j,n; printf("Enter 10umber:") for(i=0,i<M;i++)scanf("%d", (4) ); j=fun( (5) ); printf("The max:%d/n",j); printf("Total: %d", n); printf("The position:") for (i=0; i<n;i++) printf ("%4d", pos[i]); printf("/n");
填空题[函数2.1说明] 函数fun1 (int m, int k, int xx [])的功能是:将大于整数m且紧靠m的k个素数存入数组xx中传回。例如:若输入17,5,则应输出:19,23,29,31,37。 [函数2.1] fun1 (int m, int k, int xx [] ) inti, j, s=0; for ( i=m+1; k>0; i++ ) for (j=2; j<i; j++ ) if ( i %j=0 ) (1) if( i==j ) (2) k--; [函数2.2说明] 函数void fun 2 ()的功能是:打印出杨辉三角形(要求打印出10行)。 [函数2.2] void fun2 ( ) int i, j; int a[10][10]; printf ("/n" ); for (i=0; i<10; i++ a [i] [0]=1; (3) ) for (i=2; i<l0; i++ ) for (j=1; j<i; j++) (4) for (i=0; i<10; i++ ) for (j=0; j<=i; j++ ) (5) printf ( "/n" );
填空题【说明】
以下程序的功能是计算正方体、球体和圆柱体的表面积和体积并输出。
程序由4个类组成:类cube、sphere和cylinder分别表示正方体、球体和圆柱体;抽象类 container为抽象类,提供了两个纯虚拟函数surface_area()和volum(),作为通用接口。
【C++程序】
#include<iostream.h>
#define pi 3.1416
class container{
protected:
double radius;
public:
container(double radius) {container::radius=radius;}
virtual double surface_area()=0;
virtual double velum()=0;
};
class cube:{{U}} (1) {{/U}}{ //定义正方体类
public:
cube(double radius):container(radius){};
double surface_area () {return 6 * radius * radius;}
double volum() {return radius * radius * radius;}
};
class sphere:{{U}} (2) {{/U}}{ //定义球体类
public:
sphere(double radius): container(radius){};
double surface_area() { return{{U}} (3) {{/U}};}
double volum() {return pi * radius * radius * radius * 4/3;}
};
class cylinder:{{U}} (4) {{/U}}{ //定义圆柱体类
double height;
public:
cylinder(double radius,double height):container(radius)
{
container::height=height;
}
double surface_are a () { return 2 * pi * radius * (height+radius); }
double volum () {return{{U}} (5) {{/U}};}
};
void main()
{
container * p;
cube obj1 (5);
sphere obj2(5);
cylinder obj3(5,5);
p=
cout<<“正方体表面积”(<<p->surface_area()<<end1;
cont<<“正方体体积”<<p->volume()<<end1;
p=
cout<<“球体表面积”<<p->surface_area()<<end1;
cout<<“球体体积”<<p->volume()<<end1;
p=
cout<<“球体表面积”<<p->surface_area()<<end1;
cout<<“球体体积”<<p->volume()<<end1;
}
填空题[说明]下面的流程图,用来完成求字符串t在s中最右边出现的位置。其思路是:做一个循环,以s的每一位作为字符串的开头和t比较,如果两字符串的首字母是相同的,则继续比下去,如果一直到t的最后一个字符也相同,则说明在s中找到了一个字符串t;如果还没比较到t的最后一个字符,就已经出现字符串不等的情况,则放弃此次比较,开始新一轮的比较。当在s中找到一个字符串t时,不应停止寻找(因为要求的是求t在s中最右边出现的位置),应先记录这个位置pos,然后开始新一轮的寻找,若还存在相同的字符串,则更新位置的记录,直到循环结束,输出最近一次保存的位置。如果s为空或不包含t,则返回-1。注:返回值用pos表示。[问题]将流程图的(1)~(5)处补充完整。
填空题阅读以下说明和Java程序,将应填入 (n) 处的字句写在对应栏内 [说明] 以下程序的功能时三角形、矩形和正方形的面积输出。 程序由5个类组成:areatest是主类,类Triangle,Rectangle和Square分别表示三角形、矩形和正方形,抽象类Figure提供了一个计算面积的抽象方法。 [Java程序] public class areatest public static viod main(string args[]) Figure[]Figures= New triangle(2,3,3),new rectangle(5,8),new square(5) ; for(int i=0; i<Figures.length;i++) system.out.println(Figures+"area="+Figures.getarea()); public abstract class figure public abstract double getarea(); public class rectangle extends (1) double height; double width; public rectangle (double height,double width) this.height=height; this.width=width; public string tostring() return"rectangle:height="+height+",width="+width+":"; public double getarea() return (2) public class square exends (3) public square(double width) (4) ; public string tostring() return"square:width="+width":"; public class triangle entends (5) double la; double lb; double lc; public triangle(double la,double lb,double lc) this.la=la;this.lb=lb;this.lc=lc; public string tostring()( return"triangle:sides="+la+","+lb+","+lc+":"; public double get area() double s=(la+lb+lc)/2.0; return math.sqrt(s*(s-la)*(s-lb)*(s-lc));
填空题【说明2.1】
以下C语言函数用二分插入法实现对整型数组a中n个数的排序功能。
【函数2.1】
void fun1 (int a[])
{ int i,j,k,r,x,m;
for(i=2;i<=n;i++)
{ {{U}} (1) {{/U}};
k=1;r=i-1;
while(k<=r)
{ m=(k+r)/2;
if(x<a[m])r=m-1;
else{{U}} (2) {{/U}};
}
for(j=i-1;j>=k;j--)
a[j+l]=a[j];
{{U}} (3) {{/U}};
}
}
【说明2.2】
以下程序可以把从键盘上输入的十进制数(long型)以二~十六进制形式输出。
【程序2.2】
#include<stdio.h>
main()
{ charb[16]={'0','l','2','3 ,4,'5','6','7','8','9','A','B','C','D','E','F'};
int c[64],d,i=0,base;
long n;
printf("enter a number:/n");
scanf("%1d",
printf("enter new basc:/n");
scanf("%d",
do
{ c[i]={{U}} (4) {{/U}};
i++; n=n/base;
} while(n!=0);
printf("transmite new base:/n");
for(--i;i>=0;--i)
{ d=c[i];
printf("%c",{{U}} (5) {{/U}});
}
}
填空题阅读以下说明和流程图回答问题,将解答填入对应栏。[说明]“直接插入法”排序是一种N2运算量的例程,只能用在N较小的时候,其方法是:挑出第二个数将它按与第一个数大小的顺序插入,然后挑出第三个数将它按大小顺序插入到前两个数中,如此下去,一直到最后一个也插入。注:流程中循环开始的说明按照“循环变量:循环初值,循环终值,增量”格式描述。[问题]将流程图的(1)~(5)处补充完整。
填空题[说明]如图所示的一圆圈上分布6个环,请在每个环中填一个数字,使得从任一环开始按顺时针所得的六位数与按逆时针所得的6位数都为素数。[函数]main(){inti,j,a,b,k;longm,m1,n,t,u,v;for(n=100001;n<999999;n+2)/*n穷举所有6位奇数*/{a=0;{{U}}(1){{/U}};/*设m为一个顺转6位数*/for(i=1;i<=6;i++){t=-m/1000000;{{U}}(2){{/U}};for(v=u,m1=0,k=1;k<=5;k++){b=v%10;v=v/10;m1=m1*m1*10+b;}{{U}}(3){{/U}};/*m1为相应的逆转6位数*//*m为顺圈数,m1为逆圈数*/for(j=2;j<=999;j++)if(m%j==0||.{{U}}(4){{/U}})/*判别m,m1是否为素数*/{a=1;break;}{{U}}(5){{/U}};/*原m转一环得新顺转数m*//*原m转一环得新顺圈数m*/if(a==1)break;}if(a==0){prinff("%1d/n",n);break;}}}
填空题阅读以下说明和流程图,回答问题将解答填入对应栏。
[说明]
本流程图实现采用递归函数来求一个整数数组中从元素0到元素n中的最小值。该算法思想是这样的,首先我们假设有一个求数组中最小元素的函数,然后,在求某一具有n的元素的数组的最小值时,只要求将前n-1的元素的最小值与第n个元素比较即可。不断地重复这一过程,直到数组中只剩下一个元素,那么它必定是最小值。
注:int min(int X,int y)为返回两数中最小数的函数。
int minInArray(int a[],int n)为返回数组中最小数的函数。
minA为数组中最小值。
[问题l]
将流程图的(1)~(4)处补充完整。
[问题2]
min()函数的定义为{{U}} (5) {{/U}}。
填空题从下列2道试题(试题5至试题6)中任选1道解答。如果解答的试题数超过1道,则题号小的1道解答有效。阅读下列说明、图和C++代码,将应填入{{U}}(n){{/U}}处的字句写在答题纸的对应栏内。[说明]已知对某载客车辆(Car)进行类建模,如图5-1所示,其中类Engine表示发动机引擎,类Wheel表示车轮,类Body表示车身,类Driver表示司机,类Passenger表示乘客。[C++代码]constint{{U}}(1){{/U}}=7;//定义最多载客数constintMAXWHEELS=5;//定义最多轮胎数classBody{//此处代码省略};//车身类classPassenger{//此处代码省略};//乘客类classWheel{//此处代码省略};//车轮类classDriver{//司机类public:stringname;//表示第几路公交车司机Driver(stringdriverName):name({{U}}(2){{/U}}){};//构造函数};classEngine{//引擎类public:stringengineNo;//引擎编号Engine(stringengineNo){{{U}}(3){{/U}}->engineNo=engineNo;}//构造函数};classCar{//汽车类protected:Engine*engine;Driver*driver;Bodybody;Wheel*wheels[MAX_HEELS];Passenger*passengers[MAX_PASSENGERS];public:Car(Driver*driver){//构造函数this->driver=driver;engine=newEngine("TX6536型号引擎");intindex;for(index=0;index<MAX_HEELS;index++){wheels[index]=newWheel();}for(index=0;index<MAX_PASSENGERS;index++){passengers[index]=NULL;}}virtual~Car(){//析构函数for(intindex=0;index<MAX_WHEELS;index++)deletewheels[index];delete{{U}}(4){{/U}};}intgetPassengerNumber(){//获取车上乘客数量//此处代码省略}voidgetOnPassenger(Passenger*aPassenger){//乘客上车//此处代码省略}voidrun(){//开车if(driver==NULL){cout<<"司机尚未上车!";return;}//此处代码省略});voidmain(){Driverdriver("第五路公交车司机");Carcar({{U}}(5){{/U}});Passengerpassengers[MAX_PASSENGERS];for(intindex=0;index<MAXPASSENGERS;index++)//乘客上车处理car.getOnPassenger(car.run();}
填空题1说明] 函数int circle(int n,int d)判定正整数n的d进制表示形式是否是回文数。 [函数2.1] int circle(int n,int d) int s=0,m=n; while (m) (1) ; m/=d; return (2) ; [函数2.2说明] 函数int trans(unsigned n,int d,char s[])将一个无符号整数转换为任意d进制数(2≤d≤16)。 [函数2.2] #define M sizeof(unsigned int)*8 int trans (unsigned n,int d,char s[]) static char digits[]="0123 456789ABCDEF"; char buf [M+1]; int j,i=M; if (d<2 ||d>16) s[0]='/0'; return 0; (3) ; do (4) ; n/=d; while (n) ; for( (5) ); (s(j)=buf[j]!='/0';j++); return j;
填空题[说明]一个数如果恰好等于它的因子之和,这个数就是“完数”,如6=1+2+3,下面流程图完成寻找1000以内的完数,并将其因子存放在k[n]中,最后打印结果。注:流程中循环开始的说明按照“循环变量:循环初值,循环终值,增量”格式描述。[问题]将流程图的(1)~(5)处补充完整。
填空题[函数2.1说明] 函数void sort(int arry[],int n)的功能是对数组a中的arry[0]~arry[n-1]这n个元素进行排序。排序过程如下:第一趟对所有的偶数下标x,比较arr[x]和arry [x+1],若arry[x]>arry[x+1],则将两者交换; 第二趟对所有的奇数下标y,比较arry[y]和arry[y+1],若arry[y]>arry[y+1],则将两者交换; 第三趟对偶数下标,第四趟对奇数下标,……,依次类推,直至整个数组元素有序排列为止。 [函数2.1] void sort (int arry[],int n) int i,j,tag=1; for(j=0; j<n; j++) for(i= (1) ;i<n-1; (2) ) if (arry [i] >arry [i+1]) t=arry [i] ; arry [il =arry [i+1] ; arry [i+1] =t ; tag=0 ; tag++; if( (3) )break; [函数2.2说明] 这是一棵二叉树排序查找元素的程序,查找的方法是:首先与树的根结点的元素进行比较,若相等则找到,返回此结点的地址; 若要查找的元素小于根结点的元素值,则指针指向此结点的左子树,继续查找; 若要查找的元素大于根结点的元素值,则指针指向此结点的右子树,继续查找。直到指针为空,表示此树中不存在所要查找的元素。本题使用递归方法实现。 [函数2.2] typedef struct node int data; struct node *left; struct node *right; NODE; NODE *SearchSortTree(NODE *tree,int e) if (tree ! =NULL) if (tree->data<e) (4) ; else if(tree->data>e) (5) ; else return tree; return tree;
填空题阅读以下函数说明和C语言函数,将应填入{{U}} (n) {{/U}}处的字句写在对应栏内。
[说明1]
L为一个带头结点的循环链表。函数LinkList deletenode(LinkList L,int c)的功能是删除L中数据域data的值大于C的所有结点,并由这些结点组建成一个新的带头结点的循环链表,其头指针作为函数的返回值。
[C函数1]
LinkList deletenode(LinkList L,int c)
{LinkList Lc,P,pre;
pre=L;
p={{U}} (1) {{/U}};
Lc=(LinkList)malloc(sizeof(Listnode));
Lc->next=Lc;
while(P!=L)
if(p->data>C){
{{U}} (2) {{/U}};
{{U}} (3) {{/U}};
Lc->next=p;
p=pre->next;
}
else{
pre=p;
p=pre->next;
}
return Lc;
}
[说明2]
递归函数dec_to_k_2(int n,int k)的功能是将十进制正整数n转换成进制数,并打印。
[C函数2]
dec to k 2(int n,int k)
{ if(n!=O){
dec to k 2({{U}} (4) {{/U}},k);
printf("%d", {{U}}(5) {{/U}});
}
}
填空题阅读以下函数说明和C语言函数,将应填入 (n) 处的字句写在对应栏内。 [说明] 已知r[1...n]是n个记录的递增有序表,用折半查找法查找关键字为k的记录。若查找失败,则输出“failure",函数返回值为0;否则输出“success”,函数返回值为该记录的序号值。 [C函数] int binary search(struct recordtype r[],int n,keytype k) intmid,low=1,hig=n; while(low<=hig) mid= (1) ; if(k<r[mid].key) (2) ; else if(k==r[mid].key) printf("succesS/n"); (3) ; else (4) ; printf("failure/n"); (5) ;
填空题[说明] 函数diff的功能是:根据两个由整数(都大于-32768)按升序构成的单链表L1和L2(分别由A,B指向)构造一个单链表L3(由*r指向),要求L3中的所有整数都是L1并且不是L2中的整数,还要求L3中的所有整数都两两不等。 [函数] #include <malloc.h> typedef struct node int d; struct node *next Node; void diff (Node *A, Node *B, Node **r) int lastnum; Node *p; * r=NULL ; if (!A) return; while( (1) ) if (A->d lastnum=A->d; p=(Node*) malloc (sizeof (Node)) ; p->d=lastnum; p->next=*r; (2) ; do A=A->next ; while( (3) ); else if (A->d> B->d) B=B->next ; else (4) ; lastnum=A->d; while (A&&A->d==last num) A=A->next ; while (A) lastnum=A->d; p=(Node*) malloc (sizeof (Node)) ; p->d=lastnum; (5) ; *r=p; while(A&&A->d==lastnum) A=A->next;
