ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:24.37KB ,
资源ID:10407534      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10407534.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C++第六章习题解答1.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

C++第六章习题解答1.docx

1、C+第六章习题解答1第六章 模板与数据结构习题一、.基本概念与基础知识自测题6.1 填充题6.1.1 模板是为了实现代码的 (1) ,它把数据类型改为一个 (2) ,称为 (3) 程序设计。模板包括 (4) 和 (5) 。答案:(1)重用(2)设计参数(3)参数化(parameterize)(4)函数模板(function template)(5)类模板(class template)6.1.2 调用函数模板时,可以显式指定模板参数类型,也可以隐式进行,称为 (1) ,这是根据 (2) 来决定的。答案:(1)模板实参推演(template argument deduction)(2)一组实际类

2、型或(和)值6.1.3 顺序查找可以用于 (1) 线性表,而对半查找可以用于 (2) 线性表。答案:(1)无序的(所有)(2)有序的6.1.4 最常见的排序方式有 (1) 、 (2) 和 (3) 。如果现有一个已排好序的线性表,在表尾添加了一个元素,采用 (4) 排序法使它重新成为有序的所需工作量最小。答案:(1)选择(2)插入(3)交换(4)交换(可利用原来的有序性)6.1.5 给出以下指针的说明方式:指向一个4元素整型数组的指针为 (1) ;指向一个返回整型数,参数为两个整型数的函数的指针 (2) ;指向一个数组的指针,而该数组元素都是指向一个返回整型指针的无参函数 (3) 。答案:(1)

3、int(*p)4(2)int(*p)(int,int)(3)以指向6元素数组为例:int*(*)() (*p)66.2简答题6.2.1 需要编写一个对多维数组通用的算法(即各维的大小未定),怎样才能把实参多维数组的信息全部传递到函数中去?答:最佳方法是用函数模板,多维数组用模板类型参数传递,各维的大小作为参数传递。也可以用一维数组加各维的大小都作为参数传递。6.2.2 什么叫函数模板?什么叫模板函数?什么叫类模板?什么叫模板类?答:不受数据类型限制的通用型的函数使代码的可重用性大大提高。把数据类型改为一个设计参数是一个可行的方案。这种程序设计类型称为参数化(Parameterize) 程序设计

4、。这样的软件模块由模板(Template) 构造。包括函数模板和类模板。函数模板定义如下:template 返回类型 函数名(形式参数表);/函数体模板参数主要是模板类型参数。模板类型参数代表一种潜在的内置或用户定义的类型,由关键字typename或class后加一个标识符构成。函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,简化重载函数的设计。由调用函数模板(functron template) 而生成的函数,称为模板函数(template function)。类模板定义如下:template class 类名;/类声明体;模板参数有两种:模板类型参数和模板非类型参数。模板类型参

5、数(template type parameter),它代表一种类型,由关键字 typename或class后加一个标识符。模板非类型参数由一个普通的参数声明构成。模板非类型参数表示该参数名代表了一个潜在的常量。如数组类模板,可以有一个数组长度的非类型参数。为通用的类模板定义中的模板类型参数指定了具体类型而生成的类称为模板类。6.2.3 什么叫线性表?其基本操作包括哪些?其中插入一个元素的关键在哪儿?答:线性表是数据结构中的概念:每两个相邻元素之间都有直接前驱和直接后继的关系。这里除第一个元素外,其他元素有且仅有一个直接前驱,第一个元素没有前驱;除最后一个元素外,其他元素有且仅有一个直接后继,

6、最后一个元素无后继。这样的特性称为线性关系。基本操作包括:计算表长度,寻找变量或对象x(其类型与表元素相同)在表中的位置(下标值),判断x是否在表中,删除x,将x插入列表中第i个位置,寻找x的后继,寻找x的前驱,判断表是否空,判断表是否满,取第i个元素的值等。当需要在顺序表的指定位置i插入一个数据x时,必须为它腾出这个位置,把从该位置开始向后的所有元素数据,后移一个位置,最后才插入。关键是后移时从最后一个元素开始。否则先移的数据会冲掉未移的数据。6.2.4 采用索引查找有哪些优点?它需要被查找数据有序吗?答:索引,就象一本书的目录,找到标题,再看一下页号,立即可以翻到。索引查找不要求被查找数据

7、有序,只要求索引有序。6.2.5 简单叙述阅读理解复杂指针的方法。设Node为类,下面两个标识符fa和pa分别代表什么?Node* (*fa(int)(); Node* (*(*pa)();答:理解和构造对象说明的方法是:先撇开标识符,按从右到左的顺序逐个解释每个说明符,如果有括号则改变解释的先后,先解释括号内再解释括号外。fa是有一个整型参数的函数,其返回值是指针,该指针是指向无参函数的指针,而该无参函数的返回值是指向Node类的指针。pa是指向数组的指针,该数组的元素均为函数指针,所指向的函数无参、返回值是指向Node类的指针。 二、.编程与综合练习题6.3 使用自定义字符串类,编写求数组

8、元素中最大值的函数模板。解:函数模板有三种应用方式:1类模板的成员函数,在模板类型参数中重载函数和运算符,直接访问私有数据成员,实现通用算法。这是标准的面向对象的方法。2函数模板处理模板类,以类模版为参数,用模板类型参数中重载的函数或运算符,实现通用算法。但调用类模板的接口函数间接访问私有数据成员,也是常见的。3函数模板处理普通数据,往往要用函数作为参数,实现通用算法。这是面向过程的方法。解:使用独立的函数模板,相对简单。#includeusing namespace std;const int n=256;class mystring/为简单只保留用到的函数 char strn; /存放字符

9、串的数组容器 int maxsize; /最大可用元素数,可防止数组出界,提高健壮性 int last; /已用元素数public: mystring() last=-1; maxsize=n; str0=0; cout缺省构造函数endl; mystring(char *s)/当C字符串过长,初始化时采用截尾处理 last=-1; maxsize=n; do last+; strlast=slast; while(slast!=0&lastmaxsize-1); strlast =0; /截尾处理时,必须加串结束符 cout构造函数endl; mystring(mystring & ms)

10、last=-1; maxsize=n; do last+; strlast=ms.strlast; while(lastms.last); cout拷贝构造函数endl; mystring() cout析构函数endl; void show()/如需重载,则请参见9.3节,暂时未学到,替代方法是改用show()函数 coutstrendl; mystring & operator=(char * ms);/这里重载的=是把C风格字符串赋给mystring mystring& operator=(mystring &); bool operator(mystring &);mystring &

11、mystring:operator=(char* ms) /用C字符串赋值自定义字符串 last=-1; do last+; strlast=mslast; while(mslast!=0&lastmaxsize-1); strlast =0; /截尾处理时,必须加串结束符 return *this;/这里返回值为引用,不调用拷贝构造函数mystring& mystring:operator=(mystring & ms) last=-1; do last+; strlast=ms.strlast; while(lastms.last); cout赋值函数endl; return *this;

12、bool mystring:operator(mystring & ms) int i=0,k; do k=stri-ms.stri; i+; while(k=0&ilast&ims.last); if(k0) return true; if(i=last&i!=ms.last) return true; return false;template Groap max(Groap *r_array,int size)/这里是一个独立的函数模板 Groap max_val=r_array0; for (int i=1;isize; +i) if(max_valr_arrayi) max_val=

13、r_arrayi; return max_val;int main() int i; char sp610=南京大学,东南大学,交通大学,清华大学,天津大学,复旦大学; mystring ms6;/ 对象数组 for(i=0;i6;i+) msi=spi; cout打印学校名称:endl; for(i=0;i6;i+) msi.show(); cout按字典序查找校名:endl; (max(ms,6).show(); return 0;6.4 将自定义字符串类用于对半查找的函数模板。解1:为简化,使用独立的函数模板#includeusing namespace std;const int n=

14、256;class mystring/为简单只保留用到的函数 char strn; /存放字符串的数组容器 int maxsize; /最大可用元素数,可防止数组出界,提高健壮性 int last; /已用元素数public: mystring() last=-1; maxsize=n; str0=0; cout缺省构造函数endl; mystring(char *s)/当C字符串过长,初始化时采用截尾处理 last=-1; maxsize=n; do last+; strlast=slast; while(slast!=0&lastmaxsize-1); strlast =0; /截尾处理时

15、,必须加串结束符 cout构造函数endl; mystring(mystring & ms) last=-1; maxsize=n; do last+; strlast=ms.strlast; while(lastms.last); cout拷贝构造函数endl; mystring() cout析构函数endl; void show()/如需重载,则请参见9.3节,暂时未学到,替代方法是改用show()函数 coutstrendl; mystring & operator=(char * ms);/这里重载的=是把C风格字符串赋给mystring mystring& operator=(mys

16、tring &); bool operator(mystring &);mystring & mystring:operator=(char* ms) /用C字符串赋值自定义字符串 last=-1; do last+; strlast=mslast; while(mslast!=0&lastmaxsize-1); strlast =0; /截尾处理时,必须加串结束符 return *this;/这里返回值为引用,不调用拷贝构造函数mystring& mystring:operator=(mystring & ms) last=-1; do last+; strlast=ms.strlast;

17、while(lastms.last); cout赋值函数endl; return *this;bool mystring:operator(mystring & ms) int i=0,k; do k=stri-ms.stri; i+; while(k=0&ilast&ims.last); if(k0) return true; if(i=last&i!=ms.last) return true; return false;template int BinarySearch(T *array,T & x,int size)/独立的函数模板 int high=size-1 ,low=0,mid;

18、 / size 当前有序表元素数量 while(low=high) mid=(low+high)/2; if(xarraymid) high=mid-1; /左缩查找区间,这里只有重载的小于号 else if(arraymidx) low=mid+1;/ 右缩查找区间 else return mid; return mid;int main()/此例为了简化未用对象数组类模板 int i; char sp610=东南大学,复旦大学,交通大学,南京大学,清华大学,天津大学; mystring ms6,x=交通大学,y=南京大学; for(i=0;i6;i+) msi=spi; for(i=0;i

19、6;i+) msi.show(); i=BinarySearch(ms,x,6); coutiendl; i=BinarySearch(ms,y,6); coutiendl; return 0;解2:函数模板使用成员函数(ep6_4_0.cpp)#includeusing namespace std;const int n=256;class mystring/为简单只保留用到的函数 char strn; /存放字符串的数组容器 int maxsize; /最大可用元素数,可防止数组出界,提高健壮性 int last; /已用元素数public: mystring() last=-1; max

20、size=n; str0=0; cout缺省构造函数endl; mystring(char *s)/当C字符串过长,初始化时采用截尾处理 last=-1; maxsize=n; do last+; strlast=slast; while(slast!=0&lastmaxsize-1); strlast =0; /截尾处理时,必须加串结束符 cout构造函数endl; mystring(mystring & ms) last=-1; maxsize=n; do last+; strlast=ms.strlast; while(lastms.last); cout拷贝构造函数endl; myst

21、ring() cout析构函数endl; void show()/如需重载,则请参见9.3节,暂时未学到,替代方法是改用show()函数 coutstr; mystring & operator=(char * ms);/这里重载的=是把C风格字符串赋给mystring mystring& operator=(mystring &); bool operator(mystring &);mystring & mystring:operator=(char* ms) /用C字符串赋值自定义字符串 last=-1; do last+; strlast=mslast; while(mslast!=0

22、&lastmaxsize-1); strlast =0; /截尾处理时,必须加串结束符 return *this;/这里返回值为引用,不调用拷贝构造函数mystring& mystring:operator=(mystring & ms) last=-1; do last+; strlast=ms.strlast; while(lastms.last); cout赋值函数endl; return *this;bool mystring:operator(mystring & ms) int i=0,k; do k=stri-ms.stri; i+; while(k=0&ilast&ims.la

23、st); if(k0) return true; if(i=last&i!=ms.last) return true; return false;template class Orderedlist int maxsize; int last; T slistsize;public: int getlast()return last; T getslist(int k)return slistk; void putslist(T t,int k)slistk=t; Orderedlist()last=-1;maxsize=size; bool Insert(T & elem,int i); v

24、oid print(); int BinarySearch(T); / 无关成员函数省略,缺省的=等不必定义;/再次指出分号不可少template bool Orderedlist:Insert(T & elem ,int i) if (ilast+1|last=maxsize-1) return false; else last+; for (int j=last;ji;j-) slistj=slistj-1; slisti=elem; return true; template void Orderedlist:print() int i; for(i=0;i=last;i+) slist

25、i.show(); if(i%5=4) coutendl; /打印5个名称换行 else coutt; coutendl;template int Orderedlist:BinarySearch(T x)/成员函数模板 int high=last,low=0,mid; /size当前有序表元素数量 while(low=high) mid=(low+high)/2; if(xslistmid) high=mid-1; /左缩查找区间,这里只有重载的小于号 else if(slistmidx) low=mid+1;/ 右缩查找区间 else return mid; return mid;int

26、main() const int h=8; int i; Orderedlist ordlist; mystring nh; char sph10=东南大学,复旦大学,交通大学,南京大学,清华大学, 天津大学,同济大学,浙江大学; for(i=0;ih;i+) ni=spi; for(i=0;ih;i+) ordlist.Insert(ni,i); /建立顺序表 cout排序表:endl; ordlist.print(); mystring x(交通大学),y(东南大学); i=ordlist.BinarySearch(x); coutiendl; i=ordlist.BinarySearch

27、(y); coutiendl; return 0;6.5 编一个冒泡排序的成员函数模板实现降序排序。可用小于比较,冒泡采用从上往下;也可用大于比较,冒泡采用从下往上。解:用小于比较,冒泡采用从上往下。使用字符串类string。#include#includeusing namespace std;template class Orderedlist int maxsize; int last; T slistsize;public: Orderedlist()last=-1;maxsize=size; void BubbleSort(); bool Insert(T & elem,int i); void print(); / 无关成员

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1