C第六章习题解答1Word文件下载.docx
- 文档编号:20049602
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:26
- 大小:24.34KB
C第六章习题解答1Word文件下载.docx
《C第六章习题解答1Word文件下载.docx》由会员分享,可在线阅读,更多相关《C第六章习题解答1Word文件下载.docx(26页珍藏版)》请在冰豆网上搜索。
6.2简答题
6.2.1需要编写一个对多维数组通用的算法(即各维的大小未定),怎样才能把实参多维数组的信息全部传递到函数中去?
答:
最佳方法是用函数模板,多维数组用模板类型参数传递,各维的大小作为参数传递。
也可以用一维数组加各维的大小都作为参数传递。
6.2.2什么叫函数模板?
什么叫模板函数?
什么叫类模板?
什么叫模板类?
不受数据类型限制的通用型的函数使代码的可重用性大大提高。
把数据类型改为一个设计参数是一个可行的方案。
这种程序设计类型称为参数化(Parameterize)程序设计。
这样的软件模块由模板(Template)构造。
包括函数模板和类模板。
函数模板定义如下:
template<
模板参数表>
返回类型函数名(形式参数表){
……;
//函数体
}
模板参数主要是模板类型参数。
模板类型参数代表一种潜在的内置或用户定义的类型,由关键字typename或class后加一个标识符构成。
函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,简化重载函数的设计。
由调用函数模板(functrontemplate)而生成的函数,称为模板函数(templatefunction)。
类模板定义如下:
class类名{
//类声明体
};
模板参数有两种:
模板类型参数和模板非类型参数。
模板类型参数(templatetypeparameter),它代表一种类型,由关键字typename或class后加一个标识符。
模板非类型参数由一个普通的参数声明构成。
模板非类型参数表示该参数名代表了一个潜在的常量。
如数组类模板,可以有一个数组长度的非类型参数。
为通用的类模板定义中的模板类型参数指定了具体类型而生成的类称为模板类。
6.2.3什么叫线性表?
其基本操作包括哪些?
其中插入一个元素的关键在哪儿?
线性表是数据结构中的概念:
每两个相邻元素之间都有直接前驱和直接后继的关系。
这里除第一个元素外,其他元素有且仅有一个直接前驱,第一个元素没有前驱;
除最后一个元素外,其他元素有且仅有一个直接后继,最后一个元素无后继。
这样的特性称为线性关系。
基本操作包括:
计算表长度,寻找变量或对象x(其类型与表元素相同)在表中的位置(下标值),判断x是否在表中,删除x,将x插入列表中第i个位置,寻找x的后继,寻找x的前驱,判断表是否空,判断表是否满,取第i个元素的值等。
当需要在顺序表的指定位置i插入一个数据x时,必须为它腾出这个位置,把从该位置开始向后的所有元素数据,后移一个位置,最后才插入。
关键是后移时从最后一个元素开始。
否则先移的数据会冲掉未移的数据。
6.2.4采用索引查找有哪些优点?
它需要被查找数据有序吗?
索引,就象一本书的目录,找到标题,再看一下页号,立即可以翻到。
索引查找不要求被查找数据有序,只要求索引有序。
6.2.5简单叙述阅读理解复杂指针的方法。
设Node为类,下面两个标识符fa和pa分别代表什么?
Node*(*fa(int))();
Node*(*(*pa)[])();
理解和构造对象说明的方法是:
先撇开标识符,按从右到左的顺序逐个解释每个说明符,如果有括号则改变解释的先后,先解释括号内再解释括号外。
fa是有一个整型参数的函数,其返回值是指针,该指针是指向无参函数的指针,而该无参函数的返回值是指向Node类的指针。
pa是指向数组的指针,该数组的元素均为函数指针,所指向的函数无参、返回值是指向Node类的指针。
二、.编程与综合练习题
6.3使用自定义字符串类,编写求数组元素中最大值的函数模板。
解:
函数模板有三种应用方式:
1.类模板的成员函数,在模板类型参数中重载函数和运算符,直接访问私有数据成员,实现通用算法。
这是标准的面向对象的方法。
2.函数模板处理模板类,以类模版为参数,用模板类型参数中重载的函数或运算符,实现通用算法。
但调用类模板的接口函数间接访问私有数据成员,也是常见的。
3.函数模板处理普通数据,往往要用函数作为参数,实现通用算法。
这是面向过程的方法。
使用独立的函数模板,相对简单。
#include<
iostream>
usingnamespacestd;
constintn=256;
classmystring{//为简单只保留用到的函数
charstr[n];
//存放字符串的数组容器
intmaxsize;
//最大可用元素数,可防止数组出界,提高健壮性
intlast;
//已用元素数
public:
mystring(){
last=-1;
maxsize=n;
str[0]='
\0'
;
cout<
<
"
缺省构造函数"
endl;
}
mystring(char*s){//当C字符串过长,初始化时采用截尾处理
do{
last++;
str[last]=s[last];
}while(s[last]!
='
&
last<
maxsize-1);
str[last]='
//截尾处理时,必须加串结束符
构造函数"
mystring(mystring&
ms){
str[last]=ms.str[last];
}while(last<
ms.last);
拷贝构造函数"
~mystring(){
析构函数"
voidshow(){//如需重载<
,则请参见9.3节,暂时未学到,替代方法是改用show()函数
str<
mystring&
operator=(char*ms);
//这里重载的=是把C风格字符串赋给mystring
mystring&
operator=(mystring&
);
booloperator<
(mystring&
mystring&
mystring:
:
operator=(char*ms){//用C字符串赋值自定义字符串
last=-1;
do{
last++;
str[last]=ms[last];
}while(ms[last]!
str[last]='
return*this;
}//这里返回值为引用,不调用拷贝构造函数
mystring&
operator=(mystring&
str[last]=ms.str[last];
}while(last<
cout<
赋值函数"
boolmystring:
operator<
inti=0,k;
k=str[i]-ms.str[i];
i++;
}while(k==0&
i<
last&
if(k<
0)returntrue;
if(i==last&
i!
=ms.last)returntrue;
returnfalse;
template<
typenameGroap>
Groapmax(Groap*r_array,intsize){//这里是一个独立的函数模板
Groapmax_val=r_array[0];
for(inti=1;
size;
++i)if(max_val<
r_array[i])max_val=r_array[i];
returnmax_val;
intmain(){
inti;
charsp[6][10]=
{"
南京大学"
"
东南大学"
交通大学"
清华大学"
天津大学"
复旦大学"
mystringms[6];
//对象数组
for(i=0;
6;
i++)ms[i]=sp[i];
打印学校名称:
i++)ms[i].show();
按字典序查找校名:
(max<
mystring>
(ms,6)).show();
return0;
6.4将自定义字符串类用于对半查找的函数模板。
解1:
为简化,使用独立的函数模板
,则请参见9.3节,暂时未学到,替代方法是改用show()函数
typenameT>
intBinarySearch(T*array,T&
x,intsize){//独立的函数模板
inthigh=size-1,low=0,mid;
//size当前有序表元素数量
while(low<
=high){
mid=(low+high)/2;
if(x<
array[mid])high=mid-1;
//左缩查找区间,这里只有重载的小于号
elseif(array[mid]<
x)low=mid+1;
//右缩查找区间
elsereturnmid;
returnmid;
intmain(){//此例为了简化未用对象数组类模板
mystringms[6],x="
y="
i=BinarySearch(ms,x,6);
i=BinarySearch(ms,y,6);
解2:
函数模板使用成员函数(ep6_4_0.cpp)
str;
typenameT,intsize>
classOrderedlist{
Tslist[size];
intgetlast(){returnlast;
Tgetslist(intk){returnslist[k];
voidputslist(Tt,intk){slist[k]=t;
Orderedlist(){last=-1;
maxsize=size;
boolInsert(T&
elem,inti);
voidprint();
intBinarySearch(T);
//无关成员函数省略,缺省的=等不必定义
//再次指出分号不可少
boolOrderedlist<
T,size>
Insert(T&
elem,inti){
if(i<
0||i>
last+1||last==maxsize-1)returnfalse;
else{
for(intj=last;
j>
i;
j--)slist[j]=slist[j-1];
slist[i]=elem;
returntrue;
voidOrderedlist<
print(){
=last;
i++){
slist[i].show();
if(i%5==4)cout<
//打印5个名称换行
elsecout<
'
\t'
intOrderedlist<
BinarySearch(Tx){//成员函数模板
inthigh=last,low=0,mid;
//size当前有序表元素数量
slist[mid])high=mid-1;
elseif(slist[mid]<
constinth=8;
Orderedlist<
mystring,h>
ordlist;
mystringn[h];
charsp[h][10]={"
"
同济大学"
浙江大学"
h;
i++)n[i]=sp[i];
i++)ordlist.Insert(n[i],i);
//建立顺序表
排序表:
ordlist.print();
mystringx("
),y("
i=ordlist.BinarySearch(x);
i=ordlist.BinarySearch(y);
6.5编一个冒泡排序的成员函数模板实现降序排序。
可用小于比较,冒泡采用从上往下;
也可用大于比较,冒泡采用从下往上。
用小于比较,冒泡采用从上往下。
使用字符串类string。
string>
voidBubbleSort();
//无关成员函
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第六章习题解答1 第六 习题 解答