第五章作业

一、填空题

 (1)C++的两种联编方式为: 静态 联编和 动态 联编。

 (2)C++支持两种多态性,静态联编所支持的多态性被称为 编译时的多态性 、动态联编所支持的多态性被称为 运行时的多态性 。

 (3)重载函数在编译时表现出多态性,就是 静态 联编;而虚函数则在运行时表现出多态性是 动态 联编。

 (4)为了区分重载函数,把一个派生类中重定义基类的虚函数称为 覆盖 。

 (5)如果派生类与基类的虚函数仅仅返回类型不同,其余相同,则C++认为是 使用不恰当的虚函数 。

 (6)在构造函数和析构函数中调用虚函数时,采用 静态 联编。

 (7)纯虚函数的定义是在虚函数定义的基础上,再让函数等于 0 。

 (8)对于包含有纯虚函数的类被称为 抽象类 。

二、选择题(至少选一个,可以多选) 
 (1)用关键字( A )标记的函数被称为虚函数。 
A. virtual B. private C. public D. protected 
 (2)在C++中,要实现动态联编,必须使用( D )调用虚函数。 
A. 类名 B. 派生类指针 C. 对象名 D. 基类指针 
 (3)下列函数中,可以作为虚函数的是( BD )。 
A. 普通函数 B. 非静态成员函数 C. 构造函数 D. 析构函数 
 (4)在派生类中,重载一个虚函数时,要求函数名、参数的个数、参数的类型、参数的顺序和函数的返回值( B )。 
A. 不同 B. 相同 C. 相容 D. 部分相同 
 (5)使用虚函数保证了在通过一个基类类型的指针(含引用)调用一个虚函数时,C++系统对该调用进行( A ),但是,在通过一个对象访问一个虚函数时,使用( B )。 
A. 动态联编 B. 静态联编 C. 动态编译 D. 静态编译 
 (6)下面函数原型声明中,( B )声明的func()为纯虚函数。 
A. void func()=0; B. virtual void func()=0; 
C. vitual void func(); D. virtual void func(){}; 
 (7)若一个类中含有纯虚函数,则该类称为( C )。 
A. 基类 B. 虚基类 C. 抽象类 D. 派生类

 (8)假设Myclass为抽象类,下列声明( CD )是错误的。

A. Myclass& func(int); B. Myclass * pp;

C. int func(Myclass); D. Myclass Obj; 
 (9)下面描述中,( BD )是正确的。 
A. 虚函数是没有实现的函数 B. 纯虚函数的实现是在派生类中定义

C. 抽象类是只有纯虚函数的类 D. 抽象类指针可以指向不同的派生类

三、判断题 
(1)抽象类中只能有一个纯虚数。 ( 错 ) 
(2)构造函数和析构函数都不能说明为虚基数。 ( 错 ) 
(3)程序中可以说明抽象类的指针或引用。 ( 对 ) 
(4)一个类中的虚基数说明不仅对基类中的同名函数有影响,而且对它的派生类中的重定义的函数也有影响 ( 错 ) 
(5)在构造函数和析构函数中调用虚函数时,采用动态联编,即它们所调用的虚函数时是在派生类中重定义的虚函数。 ( 错 ) 
(6)因为没有为纯虚函数定义代码,所以在构造函数和析构函数内均不可调用纯虚函数。 ( 对 )

四、简答题 
(1)什么叫做多态性?在C++中是如何实现多态的?

答:多态性就是同一符号或名字在不同情况下具有不同解释的现象,即是指同一个函数的多种形态。C++可以支持两种多态性,编译时的多态性和运行时的多态性。

多态性有两种变现形式:一种是不同的对象在收到相同的消息时,产生不同的动作,主要通过虚函数来实现;另一种是同一对象收到相同的消息却产生不同的函数调用,主要通过函数重载来实现。 
(2)虚函数与一般重载函数有哪些区别?

答:虚函数与一般重载函数的区别,主要有以下几点:

 重载函数只要求函数有相同的函数名,并且重载函数是在相同作用域中定义的名字相同的不同函数。而虚函数不仅要求函数名相同,而且要求函数的签名、返回类型也相同。也就是说函数原型必须完全相同,而且虚函数特性必须是体现在基类和派生类的类层次结构中。

  重载函数可以是成员函数或友元函数,而虚函数只能是非静态成员函数。

  构造函数可以重载,析构函数不能重载。正好相反,构造函数不能定义为虚函数,析构函数能定义为虚函数。

  重载函数的调用是以所传递参数序列的差别作为调用不同函数的依据,而虚函数是根据对象的不同去调用不同类的虚函数。

 重载函数在编译时表现出多态性,是静态联编;而虚函数则在运行时表现出多态性是动态联编,因此说动态联编是C++的精髓。

(3)什么叫做抽象类?抽象类有何作用?抽象类的派生类是否一定要给出纯虚函数的实现?

答:一个类可以说明多个纯虚函数,对于包含有纯虚函数的类被称为抽象。抽象类用来描述一组子类的共同的操作接口,它用作基类。抽象类的派生类不一定要给出纯虚函数的实现。如果没有在派生类中给出纯虚函数的实现,则需在派生类中仍将它说明为纯虚函数,否则编译器将给出错误信息。说明了纯虚函数的派生类仍是抽象类。

(4)能否声明虚析构函数?有何用途?

答:能声明虚析构函数。如果一个类中定义了虚函数,析构函数也应说明为虚函数。delete运算符和析构函数一起工作,当使用delete删除一个对象时,delete隐含着对析构函数的一次调用,这样保证了使用基类类型的指针能够调用适当的析构函数针对不同的对象进行清除工作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.两个串相等的充要条件是( )。A.串长度相等B.串长度任意 C.串各位置字符任意 D.串各位置字符均对应相等 2.对称矩阵的压缩存储:以行序为主序存储下三角的元素,包括对角线上的元素。二维下标为( i, j ),存储空间的一维下标为k,给出k与 i, j (i<j)的关系k=( ) (1<= i, j <= n , 0<= k < n*(n+1)/2)。 A.i*(i-1)/2+j-1 B.i*(i+1)/2+j C.j*(j-1)/2+i-1 D.j*(j+1)/2+i 3.二维数组A[7][8]以列序为主序的存储,计算数组元素A[5][3] 的一维存储空间下标 k=( )。 A.38 B.43 C.26 D.29 4.已知一维数组A采用顺序存储结构,每个元素占用4个存储单元,第9个元素的地址为144,则第一个元素的地址是( )。A.108 B.180 C.176 D.112 5. 下面( )不属于特殊矩阵。 A.对角矩阵 B. 三角矩阵C. 稀疏矩阵 D. 对称矩阵 6. 假设二维数组M[1..3, 1..3]无论采用行优先还是列优先存储,其基地址相同,那么在两种存储方式下有相同地址的元素有( )个。 A. 3 B. 2 C. 1 D. 0 7. 若Tail(L)非空,Tail(Tail(L))为空,则非空广义表L的长度是( )。(其Tail表示取非空广义表的表尾) A. 3 B. 2 C. 1 D. 0 8.串的长度是( )。 A.串不同字母的个数 B.串不同字符的个数C.串所含字符的个数,且大于0 D.串所含字符的个数 9.已知广义表(( ),(a), (b, c, (d), ((d, f)))),则以下说法正确的是( )。A.表长为3,表头为空表,表尾为((a), (b, c, (d), ((d, f))))B.表长为3,表头为空表,表尾为(b, c, (d), ((d, f)))C.表长为4,表头为空表,表尾为((d, f)) D.表长为3,表头为(()),表尾为((a), (b, c, (d), ((d, f))))10.广义表A=(a,b,c,(d,(e,f))),则Head(Tail(Tail(Tail(A))))的值为( )。(Head与Tail分别是取表头和表尾的函数) A.(d,(e,f)) B.d C.f D.(e,f)二、填空题(每空 2 分,共 8 分)。 1.一个广义表为 F = (a, (a, b), d, e, (i, j), k),则该广义表的长度为________________。GetHead(GetTail(F))= _______________。 2.一个n*n的对称矩阵,如果以行或列为主序压缩存放入内存,则需要 个存储单元。 3.有稀疏矩阵如下: 0 0 5 7 0 0 -3 0 0 0 4 0 0 2 0 它的三元组存储形式为: 。 三、综合题(共 22 分)。 1.(共8分)稀疏矩阵如下图所示,描述其三元组的存储表示,以及转置后的三元组表示。 0 -3 0 0 0 4 0 6 0 0 0 0 0 0 7 0 15 0 8 0 转置前(4分): 转置后(4分): 2. (共14分)稀疏矩阵M的三元组表如下,请填写M的转置矩阵T的三元组表,并按要求完成算法。 (1)写出M矩阵转置后的三元组存储(6分): M的三元组表: T的三元组表: i j e 2 1 3 3 2 4 4 2 5 4 3 5 5 1 6 5 3 6 i j e (2)如下提供了矩阵采用三元组存储时查找指定行号(m)和列号(n)元素值的算法框架,将代码补充完整(每空2分,共8分)。 typedefstruct{ inti,j; ElemType e; }Triple; typedefstruct{ Triple data[MAXSIZE+1]; //data[0]未用 intmu,nu,tu; //矩阵的行数,列数和非零元的个数 }TSMatrix; voidFind_TSMatrix(TSMatrix M, int m, int n, ElemType&e) //M为要查找的稀疏矩阵三元组存储,m为要查找的元素的行号,n为列号,e为查找后得到的值。 { for ( i=1 ; i<=M.tu ;i++) if( && ) { e=M.data[i].e; ; } if( ) e=0; }
1. 顺序存储结构数据数据元素之间逻辑关系是由( )表示的,链接存储结构的数据元素之间的逻辑关系是由( )表示的。 A.线性结构 B.非线性结构 C.存储位置 D.指针 2. 线性表是( )。 A.一个有限序列,可以为空 B. 一个有限序列,不能为空 C. 一个无限序列,可以为空 D. 一个无限序列,不能为空 3. 已知一维数组A采用顺序存储结构,每个元素占用4个存储单元,第9个元素的地址为144,则第一个元素的地址是( )。 A. 108 B. 180 C. 176 D. 112 4. 在单链表删除指针p所指结点的后继结点,则执行( )。 A. p->next= p->next->next B. p->next= p->next C. p= p->next->next D. p= p->next; p->next= p->next->next 5. 若某链表最常用的操作是在最后一个结点之后插入一个结点删除最后一个结点,则采用( )存储方式最节省时间。 A. 单链表 B. 双链表 C. 带头结点的双循环链表 D. 单循环链表 6.二维数组A[7][8]以列序为主序的存储, 计算数组元素A[5][3] 的一维存储空间下标 k=( )。 A. 38 B. 43 C. 26 D. 29 二、完成下列填空题(每空3分,共9分)。 1.在顺序表L第i个位置上插入一个新的元素e: Status ListInsert_Sq(SqList &L , int i , ET e){ if ( iL.length+1) return ERROR; if(L.length >= L.listsize){ p=(ET*)realloc(L.elem,(L.listsize+10)*sizeof(ET)); if (p==NULL) exit(OVERFLOW); L.elem=p; } for( j=L.length ; j>=i ; --j ) L.elem[j]=L.elem[j-1] ; L.elem[j]=e ; ++L.length ; return OK; } 2. 删除双向链表p所指向的节点算法: status delete(DuLinkList L, DuLinkList p) { if (p= =L) return ERROR; else { p->prior->next=p->next; p->next->prior=p->prior ; } free(p); return OK; } 三、编程题(共27分)。 1. (共12分)用顺序表表示集合,设计算法实现集合的求差集运算,要求不另外开辟空间。 顺序表的存储结构定义如下: #define Maxsize 100 typedef struct { ElemType data[MaxSize]; // ElemType表示不确定的数据类型 int length; // length表示线性表的长度 }SqList; 将如下函数,伪码补充完整(8分),代码前先用文字描述自己的算法思想(4分)。 文字描述算法:略(4分) void Difference(SqList A, SqList B) {//参考代码如下如下(8分) for (i=0;i<A.length;i++) for(j=0;j<B.length;j++) if(A.data[i]==B.data[j]) { A.data[i]=’#’; break; } for (k=0,i=0;inext == L) return; p = L; while (p->next != L)   { if (p->next->data != e) P = p->next; else { q = p->next;p->next = q->next; free(q);} } } 时间复杂度分析:(2分) 时间复杂度为O(n)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值