《c++程序设计》第二版高等教育出版社课后习题答案5-11章

上传人:无*** 文档编号:206727051 上传时间:2023-05-04 格式:PDF 页数:138 大小:18.21MB
收藏 版权申诉 举报 下载
《c++程序设计》第二版高等教育出版社课后习题答案5-11章_第1页
第1页 / 共138页
《c++程序设计》第二版高等教育出版社课后习题答案5-11章_第2页
第2页 / 共138页
《c++程序设计》第二版高等教育出版社课后习题答案5-11章_第3页
第3页 / 共138页
资源描述:

《《c++程序设计》第二版高等教育出版社课后习题答案5-11章》由会员分享,可在线阅读,更多相关《《c++程序设计》第二版高等教育出版社课后习题答案5-11章(138页珍藏版)》请在装配图网上搜索。

1、当前位置:学习资源下载 课后习题答案第五章数组与指针习题一、.基本概念与基础知识自测题5.1 填充题5.1.1 数组定义时有三个要素:数组名,数 组 元 素 的(1)和 数 组 元 素 的(2)按元素在数组中的位置进行访问,是 通 过(3)进行的,称为 或(5)访问。为了使数组声明中数组的大小修改更为方便,总 是 将(6)用于声明数组长度。答案:(1)类型(2)数量(3)下标运算符(4)下标(5)索引(6)常变量5.1.2 C/C+中的多维数组用的是一个(1)的定义,即多维数组的基本定义是(2)构成的数组,三维数组的元素是答案:(1)嵌套(2)以数组作为元素(3)二维数组5.1.3 计算机内存

2、是一维编址的,多维数组在内存中的存储_(1)-C/C+多维在内存中的排列 是(2)方 式,即 越(3)的 下 标 变 化(4),设数组a有m行n歹I J,每个元素占内存u个字节,则 的 首 地 址 为(5)+(6)0答案:(1)必须要转化为一维方式,(2)按行方式(3)右(4)越快(5)a数组的首地址(6)(i*n+j)*u5.1.4 对于多维数组,(1)的大小是确定的,所谓“不检查数组边界”只 是 不 检 查(2)的边界,而(3)的边界是在控制之中的,所以多维数组名作为函数的参数只可以(4)缺省。答案:(1)较低各维的(2)最高维(第一维)(3)较低各维(4)最高维5.1.5 指针变量保存了

3、另一变量的值,不可以任意给指针变量赋个地址值,只能赋给它 和 0 的地址。使用变量名来访问变量,是 按(4)来直接存取变量称为(5)方式;而借助指针变量取得另一变量的地址,访问该变量称为(6)方式。答案:(1)地址(2)N U L L(3)已经分配了内存的变量的地址(4)按变量的地址(5)直接访问(6)间接访问5.1.6固定指向一个对象的指针,称 为(1),即_(2),定义时c o n s t放 在(3)o而指向“常量”的指针称为1 4),指针本身可以指向别的对象,但1 5),定义时-c o n s t放 在1 6)答案:(1)指针常量(2)指针本身是常量(3)c o n s t放在类型说明之

4、后,变量名之前(4)常量指针(5)不能通过该指针修改对象(6)c o n s t放在类型说明之前5.1.7 数组名在表达式中被自动转换为指向(1)的指针常量,数组名是地址,但数组名中放的地址是_(2),所以数组名_(3)这样数组名可以由(4)来代替,C+这样做使用时十分方便,但丢失了数组的另一要素_(5),数组名是指向数组(6)的指针,而不是指向数组(7)的。编译器按数组定义的大小分配内存,但运行时对 不加检测,这会带来无法预知的严重错误。答案:(1)数组第一个元素(2)不可改变的(3)称指针常量(4)指针(5)数组元素的数量(6)元素(7)整体(8)对数组的边界不加检测5.1.8 有一个三维

5、数组:i n t z 3 d 4;给出指向三维数组第i行第j列第k页 元 素 的 指 针 的 三 种 表 达 方 式 ,(3)。再给出这些元素的三种表达方式(4),,(6)。答案:z 3 d i皿+k或&z 3 d i 皿k(2)*(z 3 d i +j)+k(3)*(*(z 3 d+i)+j)+k(4)z 3 d i皿 k 或*(z 3 d i j +k)(5)*(*(z 3 d i +j)+k)(6)*(*(*(z 3 d+i)+j)+k)5.2简答题5.2.1 物理上,C+是怎样访问数组元素的?请对访问方法作简单介绍。答:物理上,C+语言的下标运算符口是以指针作为操作数的,a i 被编译

6、系统解释为*(a+i),即表示为a所指(固定不可变)元素向后第i个元素。无论我们是以下标方式或指针方式存取数组元素时,系统都是转换为指针方法实现。这样做对多维数组尤其方便。5.2.2 什么是回溯算法?答:回溯法是对枚举法的一种改进。回溯法的基本思想是,通过对问题的分析找出解决问题的线索,先在一个局部上找出满足问题条件的局部的解,然后逐步由局部解向整个问题的解的方向试探,若试探成功就得到问题的解,试探失败逐步向后退,改变局部解再向前试探。回溯法能避免枚举法的许多不必要的搜索,使问题比较快地得到解决。5.2.3 用数组名作为函数的参数时,可否加上数组的长度?如果需要加则怎样加?为什么?答:被调函数

7、中作为形式参数的一维数组不需要说明长度,即使说明了大小也不起作用,因为 C+只传递数组首地址,而对数组边界不加检查。5.2.4 需要编写一个对多维数组通用的算法(即各维的大小未定),怎样才能把实参多维数组的信息全部传递到函数中去?答:最佳方法是用函数模板,多维数组用模板类型参数传递,各维的大小作为参数传递。也可以用一维数组加各维的大小都作为参数传递。5.2.5 解释运算符“*”和“&”的作用,运 算 符 和“。”的作用。答:在应用指针变量时,“*”是间接引用(dereference)运算符,作用于一个指针类型的变量,访问该指针所指向的内存数据。因结果是内存中可寻址的数据。“&”是取地址运算符,

8、作用于内存中一个可寻址的数据(如:变量,对象和数组元素等等),操作的结果是获得该数据的地址。运 算 符 和 是 成 员 访 问 运 算 符(Member Access Oprator)。在对象或结构外部去访问公有的数据成员或函数成员时,是 在 对 象 名 后 加(点操作符),再加成员函数名或函数名就可以了。但是这些成员必须是公有的成员,只有公有成员才能在对象的外面对它进行访问。当用指向对象和结构变量的指针访问其公有成员时,则只要在指针变量名后加(箭头操作符),再加公有成员名就可以了。5.2.6 什么是this指针?简述它的作用。答:当我们在对象的外部访问该对象的公有成员时,必须指明是哪一个对象

9、。但是当我们用对象的成员函数来访问本对象的成员时,在成员函数中只要给出成员名就可以实现对该对象成员的访问。但同一个类创建的多个对象共用同份成员函数的拷贝。既然是同一份拷贝,那么成员函数又怎么知道是取哪一个对象的成员数据呢?其实每一个对象有一个隐藏的this指针,它始终指向该对象,并将该指针作为一个参数自动传递给该成员函数。这就是说,成员操作符总是要使用的,只不过在对象内是隐式的,即在对象内省略了 this指针。5.2.7 指针变量与整型量的加减运算代表什么意义?答:指针变量与整型量的加减表示移动指针,以指向当前目标前面或后面的若干个位置的目标。指针与整型量i 的加减等于指针值(地址)与 i*s

10、izeof(目标类型)积的加减,得出新的地址。5.2.8 设 a 为数组名,那么a+是否合法?为什么?答:非法。因为a 是指针常量。5.2.9 指针作为函数的参数时,它传递的是什么?实参要用什么?而使用引用时实参要用什么?何时只能用指针而不能用引用?答:是地址,是指针所指向的变量或对象的内存首地址,在物理上讲我们传的是指针的值,与传其它变量是没有差异的,函数获得的是另一个变量的地址,在逻辑上讲我们是把另一个变量的地址传过去了,可以看作传地址。实参要用变量或对象的地址。而使用引用时实参要用变量或对象本身。实参为数组时,只能用指针而不能用引用,因为数组的引用不存在。5.2.10指针作为函数的返回值

11、时,应该注意什么?答:指针指向的数据的生命期必须不仅仅在函数域中,函数消亡后,数据仍然存在。如果返回的指针,它所指的变量或对象已消亡,则该返回值无意义,这一点必须十分小心。总之直接使用指针不管是作为参数还是返回值,都要注意安全性。5 2 1 1 设有语句char*ps=,It,s a book.”;是否建立了一个字符串,并把”its a book.”作为其初值?随后又有语句:*ps=Tts a car”;这又代表什么?是否正确。答:没有建立字符串,只是让p s指向个放在代码区中的特殊字符串,而该字符串所在内存是不可写的。后一条语句要求把字符串赋给不可写的字符串空间是错的。二、编程与综合练习题5

12、.3 打印杨辉三角形(10行)。使用二维数组并利用每个系数等于其肩上两系数之和。解:好的算法无特例,二维数组共用11列,第1列全0,方便计算#includeusing namespace std;int main()inta10lll=0,l,i,j;初始化时写好第1行,其余各行全0for(i=l;i10;i+)为了全部算法无特例,共用11列,第1列全0,方便计算for(j=l;j=i+l;j+)aij=ai-lj-l+ai-lj;for(i=0;i10;i+)for(j=1 ;j=i+1 ;j+)coutaijAt;coutendl;)return 0;5.4 将 例5.5改用一维数组,附加

13、行、列参数,实现通用算法。解:用一维数组,附加行、列参数,实现通用算法难度大。#include#include using namespace std;void inverse(int,int 口,int,int);注意数组最高维可缺省,例5.5因初学未省void multi(int,int,int,int,int,int);void output(int J,int,int);int main()int middle6*3,result6*4;注意写作6*3等可清楚看出矩阵的行列int matrix 1 3*6=8,10,12,23,1,3,5,7,9,2,4,6,34,45,56,2,4,

14、6;int matrix23*4=3,2,1,0,-1,29,8,7,6,5,4;output(matrix 1,3,6);inverse(matrix 1,middle,3,6);output(middle,6,3);output(matrix2,3,4);multi(middle,matrix2,result,6,3,4);output(result,6,4);return 0;)void inverse(int matrix int middle_l,int a,int b)int i,j;for(i=0;ia;i+)for G=O;jb;j+)middle_l i+j*a=matrix

15、 1 _ 1 i*b+j;return;)void multi(int middle_l,int matrix2_l,inl result_l,int a,int b,int c)int i,j,k;for(i=0;ia;i+)for(j=O;jc;j+)resulti*c+j=0;for(k=0;kb;k+)result_l i*c+j+=middle_l i*b4-k*matrix2_l k*c+j;)return;)void output(int max_l,int a,int b)for(int i=0;ia;i+)for(int j=O;jb;j+)cout setw(4)max_l

16、 i*b+jjucoutvvn;)coutendl;return;)5.5 编写函数intatoi(charsU),将字符串s 转化为整型数返回。注意负数处理方法。解:用指针处理字符串非常方便。使用符号位来处理负数。#includeusing namespace std;int atoi(char s)int temp=0,f=l,i=0;while(si!=&si!=-,&(si,9)i+;去除串前部无效字符if(si=u)读负号f=-l;i+;)if(si9)cout=0&siv=9)/转换数字串temp=temp*10+si-48;i+;)return f*temp;)int main(

17、)char num20;cin.getline(num,19);coutatoi(num)n;return 0;(5.6 有如下定义:int ival=60021;int*ip;double*dp;卜面哪些赋值非法或可能带来错误,并加以讨论。ival=*ip;ival=ip;*ip=ival;ip=ival;*ip=&ival;ip=&ival;dp=ip;dp=*ip;*dp=*ip;解:ival=*ip滞,未确定指针ip 初值,用随机内存地址中的数据给ival赋值是危险的。但语法对。ival=ip;错,赋值类型错,指针型不能赋给整型。*ip=ival;错,未确定指针ip初值,用 ival给

18、随机内存赋值是危险的。但语法对。ip=ival;错,赋值类型错,整型不能赋给指针型。*ip=&ival;错,赋值类型错,地址(指针型)不能赋给整型。ip=&ival;对,地址赋给指针型。dp=ip;错,整型指针不能赋给双精度指针。dp=*ip;错,赋值类型错,整型不能赋给指针型。*dp=*ip;对,赋值类型转换5.7 编程定义一个整型、一个双精度型、-个字符型的指针,并赋初值,然后显示各指针所指目标的值与地址,各指针的值与指针本身的地址及各指针所占字节数(长度)。*其中地址用十六进制显示。解:注意:字符指针输出是字符串,必须强制转换为无类型指针#i ncludeusing namespace

19、std;int main()int*ip,ival=100;double*dp,dval=99.9;char*cp,cval=A;ip=&ival;dp=&dval;cp=&cval;cout*ipAt,&*ip ,sizeof(*ip)endl;coutv*dpvtv&*dptvvsizeof(*dp)vendl;cout*cp,t(void*)&*cpt,sizeof(*cp)endl;字符指针输出是字符串,必须强制转换为无类型指针cout*cp,t&:i:cpsizeof(*cp)endl;输出A 开头的字符串coutipA t,&ip ,sizeof(ip)endl;co u t dp

20、,t,&dptsizeof(dp)endi;cout(void*)cp,t,&cptsizeof(cp)endl;return 0;一个典型的运行结果:变量内容首地址长度(字节)eval公0 x0012ff641cp0 x0012ff640 x0012ff684dval99.90 x0012ff6c8dp0 x0012ff6c0 x0012ff744ival1000 x0012ff784ip0 x0012ff780 x0012ff7c4内存分配解释:速度优化时通常以字(4字节)为单位(开始地址可被4整除)给变量安排内存。ev al仅用一个字节,也安排了4个字节。5.8 分别编写下列字符串处理函

21、数(1)char*strcat 1 (char*s,const char*ct);将串ct接到串s 的后面,形成一个长串。【例6.7】以数组为参数,现用指针为参数。(2)int strlen 1 (const char*s);求字符串长度的函数,返回串长(不包括串结束符)。(3)char*reverse(char*);反置字符串s,即可将“break”成 为“kaerb”。(4)char*strchr(const char*cs,char c);查找字符C在串CS中第次出现的位置,返回指向该字符的指针,若没有出现则返回NULLo(5)char*strstr(const char*cs 1,co

22、nst char*cs2);返回串cs2作为子串在csl中第一次出现的位置,若没有出现则返回NULLo解:为了函数的通用性,有些可不要返回值的函数,也保留返回值。反置字符串函数,从串两头的指针同时向中间移动,重合或交错时停止。查找子串,先找子串的第个字符,再核对子串其他字符。#includeusing namespace std;char*strcat 1 (char*s,const char*ct)char*st=s;while(*s)s+;*s 作为条件,等效*s!=0while(*s+=*ct+);return st;)int strlenl(const char*s)int i=0;w

23、hile(*s+)i+;return i;char*reverse(char*s)char temp,*templ=s,*temp2=s;while(*temp2)temp2+;temp2-;指针移回串尾while(temp2-temp 1 0)注意此处,从串两头的指针同时向中间移动,重合或交错时停止temp=*templ;*templ=*temp2;*temp2=temp;templ+;temp2;)return s;)char*strchr(const charges,char c)while(*cs!=c&*cs)cs+;if(*cs=0)cs=NULL;未找至lj返回 NALLretu

24、rn(char*)cs;)char*strstr(const char*csl,const char*cs2)char*temp;char*temp 1 =(char*)cs2;while(*cs 1)只要主串还有字符未查,则继续while(*cs 1 !=*cs2&*cs 1)cs 1 +;找到主串含有子串的第一个字符,或主串查完停止temp=(char*)cs 1;temp 1 =(char*)cs2;if(*csl)核对子串其他字符while(*cs 1 +=*temp 1 +ll*temp 1);if(*templ=0)return temp;找到子串返回return NULL;未找至

25、I返回NAL)int main()chara40=李明;char b20=”是东南大学学生”;char c40=nSoutheast University;char*cp;coutaendl;coutbendl;strcat 1 (a,b);coutvv”字符串连接后:Hendl;coutaendl;打印字符数组acoutvv字符串长度为:vvstrlen l(a)endl;coutcendl;cp=strchr(c,U,);if(cp=NULL)coutvv”未找至 vendl;else coutcpendl;找到输出由该字符开始的剩余串cp=strchr(c,A,);if(cp=NULL)

26、coutn未找至 vvendl;else coutcpendl;coutreverse(c)endl;cp=strstr(a,东 南)if(cp!=NULL)coutcpendl;找到输出山该字符串开始的剩余串else coutvv”未找至vvendl;cp=strstr(a西北”);if(cp=NULL)coutw”未找至 endl;else coutcpendl;return 0;)5.9 使用递归和非递归的两种方法编写函数char*itoa(int n,char*string);将整数n 转换为十进制表示的字符串。(在非递归方法中,可使用reverse。函数。)解:递归方法分析。难度大,

27、可用图解法:每次调用除以1 0,以去除最后一位,以 n=3657为例。由此图可见,山 string指向应填入的字符数组的相应位置。由调用的最底层开始,回归时填入,每次回归,指针后移一位,由此得char*itoal(int n,char*string)if(n/l 0)string=itoal(n/l0,string);*string+=n%10+48;字符,ASCII 码return string;考虑,数字串结束符和负数,得完整的函数。char*itoal(int n,char*string)if(n0)*string+=_;n=-n;)if(n/10)string=itoal(n/10,s

28、tring);*string+=n%10+48;*string=,0,;return string;)源代码:#includeusing namespace std;char*reverse(char*s)char temp,*templ=s,*temp2=s;while(*temp2)temp2+;temp2-;指针移回串尾while(temp2-temp 1 0)注意此处,从串两头的指针同时向中间移动,重合或交错时停止temp=*templ;*templ=temp2;*temp2=temp;templ+;temp2;)return s;)char*itoa(int n,char*strin

29、g)char*temp=string;if(n0)%emp+=;n=-n;)do 注意个位放在前了*temp+=n%10+48;while(n=n/l 0);显式的循环*temp=,0,;if(*string=)temp=string+l;有负号仅反转数字部分else temp=string;re verse(lemp);个位放到后面return string;char*itoal(int n,char*string)if(n0)*string+=,-1;n=-n;)if(n/l 0)string=itoa l(n/l 0,string);隐式循环*string+=n%10+48;第一次是数字

30、最高位放串的最前面的字符(不含符号),注意指针移动在后*string=0;return string;注意返回的指针已后移字符)char*itoa0(int n,char*string)itoal(n,string);return string;)int main()int num;char st20;cinnum;couivv”输出数字串:nitoa(num,st)endl;cinnum;cout中定义一个日期时间的结构:struct tmint tm_sec;秒int tm_min;分int tm_hour;时int tm_mday;/Hint tm_mon;月int tm_year;年,

31、实际放的是与1970年的差,如1990年为20int lm_wday;星期int tm_yday;一年中的第几天int tm_isdst;是否夏时制;函 数 limetime(time_t*tp)是提取当前时间,time即长整型,代表从1970年1月1日00:00:00开始计算的秒数(格林尼治时间),放在首地址为tp 的单元内。函 数 tm*localtime(const*tp)将 tp地址单元中的时间转换为日期时间结构的当地时间;(函 数 tm*gmtime(const time_t*tp)转换为I I期时间结构的格林尼治时间;)函 数 char*asctime(tm%b)将 tb地址单元中

32、的tm 结构的日期时间转换为字符串(供显示),它有固有格式,如:Sun Sep 16 01:03:52 1973利用以上资源,重新设计一个日期时间类(DataTim e),要求定义对象时取当前时间进行初始化,显示时重取显示时刻的时间并显示出来。解:#include#includeusing namespace std;class datatimeftm*timedata;long allsecond;char*tmp;public:datatime()time(&allsecond);timedata=localtime(&allsecond);tmp=asctime(timedata);co

33、uttmpendl;)void gettime()allsecond=time(NULL);/time 种用法timedata=localtime(&allsecond);tmp=asctime(timedata);couttm pendl;);int main()char ch;datatime dt;coutv”需要知道现在的日期和时间吗?(Y 或 N)endl;cinch;if(ch=,yll ch=Y)dt.gettime();return 0;)5.1 1 完善自定义字符串类m ystring,函数包括:构造函数、拷贝构造函数、析构函数,并重载运算符 ,=(分别用 mystring

34、和 C 字符串拷贝),+(strcat),+=,=(strcmp)。解:此例既是对第4章的复习也是一个提高。拷贝构造函数的应用请参阅4.4.2节末尾两项说明,本例形参使用引用,仅在返回时调用了拷贝构造函数。运算符的重载请参阅4.5-4 4-下。#includeusing namespace std;const int n=256;class mystringchar strn;存放字符串的数组容器intmaxsize;最大可用元素数,可防止数组出界,提高健壮性int last;一用元素最大下标public:mystring()last=O;maxsize=n;strO=,O,;coutvv”缺

35、省构造函数”endl;)mystring(char*s)当C 字符串过长,初始化时采用截尾处理last=-l;maxsize=n;dolast+;strlast=slast;while(slast!=,0,&lastmaxsize-1);strlast=(r;截尾处理时,必须加串结束符coutvv”构造函数 vvendl;)mystring(mystring&ms)last=-l;maxsize=n;doIast+;strlast=ms.strlast;while(lastms.last);coutvv”拷贝构造函数 vvendl;)mystring()coutcv”析构函数 vvendl;)

36、void show。如需币:载last)last=i;下标运算符,可添加长度但不查边界return stri;)mystring operator=(mystring&);mystring&operatoi-(char*ms);这里重载的二是把C 风格字符串赋给mystringmystring operator4-(mystring&);mystring operator+=(mystring&);bool operator(mystring&);bool operator=(mystring&);mystring mystring:operator=(mystring&ms)last=-1;

37、dolast+;strlast=ms.strlast;while(lastms.last);return*this;)mystring&mystring:operator=(char*ms)这里返回值为引用,不调用拷贝构造函数last=-1;dolast+;strlast=mslast;while(mslast!=O,&lastmaxsize-l);strlast 截尾处理时,必须加串结束符return*this;mystring my stri ng:operator+(my s tri ng&ms)注意+和+二的不同mystring temp(*this);/+必须在一份拷贝上进行int

38、i=-l;temp.last-;串的结尾是结束符,连接时要覆盖掉dotemp.lasl4-+;i+;temp.strtemp.last=ms.stri;while(ims.last&temp.lastmaxsize-1);temp.strtemp.last=0;截尾处理时,必须加串结束符return temp;拷贝的临时变量生命期在调用它的表达式中)mystring mystring:operator+=(mystring&ms)+=在对象 自 身进行int i=-l;last-;串的结尾是结束符,连接时要覆盖掉dolast+;i+;strlast=ms.stri;while(ims.last

39、&lastmaxsize-1);strlast二 VT;截尾处理时,必须加串结束符return*this;)bool mystring:operator(mystring&ms)重载v 运算?守int i=0,k;dok=stril-ms.stri;i+;while(k=O&ilast&ims.last);if(k(mystring&ms)重载,运算符int i=0,k;dok=stri-ms.stri;i+;while(k=O&ilast&i0)return true;if(i=ms.last&i!=last)return true;return false;)bool mystring:o

40、peratoi*=(mystring&ms)int i=0,k;if(last!=ms.last)return false;dok=stri-ms.stri;i+;while(k=O&ims2)msl.show();coutvv应排在vvendl;ms2.show();cout”之后“vvendl;else msl.show();coutv应排在”vvendl;ms2.show();coutvv”之前 vvendl;ms6=msl;ms6赋值不是返回引用,必须调用拷贝构造函数建立临时对象if(msl=ms6)coutvv”串 msl与串 ms6相同vvendl;msl=C+programmin

41、g language;i=0;while(ms 1 i!=*0*)coutms 1 i+;读 1 1 1coutendl;msl i+=?;/写入msli=W;i=0;msl.show();return 0;)5.12将习题5.8中的字符串处理函数移植到mystring类中,其 中 strcat已重载为+运算符,请将其它4个转为成员函数。对比成员函数与独立函数构造上有何不同?解:这四个函数因mystring内部有串长,又要求下标索引,再加上str字符数组可直接使用,构造大不相同。#includeusing namespace std;const int n=256;class mystring

42、 char strfn;存放字符串的数组容器intmaxsize;最大可用元素数,可防止数组出界,提高健壮性int last;已用元素最大下标public:mystring()last=-1;maxsize=n;str小(T;coutvv”缺省构造函数vvendl;)mystring(char*s)当C 字符串过长,初始化时采用截尾处理last=-1;maxsize=n;doIast+;strlast=slast;while(slast!=0&lastmaxsize-1);strlast=W;截尾处理时,必须加串结束符cout构造函数 end 1;mystring(mystring&ms)la

43、st=-l;maxsize=n;dolast+;strlast=ms.strlast;while(lastms.last);coutvv”拷贝构造函数 vvendl;)mystring()coutvv”析构函数”last)last=i;下标运算符,可添加长度但不查边界return stri;)mystring&operator=(mystring&);mystring&operator=(char*ms);这里重载的二是把 C 风格,符串赋给 mystringmystring operator+(mystring&);这里返回不能用引用mystring&operator+=(mystring&

44、);bool operatori)注意此处,从事两头同时向中间移动,重合或交错时停止temp=stri;头尾交换stri=strj;strj=temp;i+;j-;)int mystring:strchr(char c)inti;fbr(i=O;i!=last;i+)if(stri=c)return i;return1;未找到返回.1)int mystring:strstr(mystring strl)int i=O,k=1;whi1e(stri!=VT)只要主串还有字符未杳,则继续while(stri!=str 1 0&stri!=W)i+;找到主串含有子串的第一个字符,或主串查完停止if(

45、stri!=()核对子串其他字符while(stri+k=str 1 .strk&kstrl.last)k+;字符串结束符不比较if(k=strl.last)return i,找到了串返回k=l;i+;)return-1;未找到返回-1)mystring&mystring:operator=(mystring&ms)这里返|可值改为引用,不调用拷贝构造函数last=-l;dolast+;strlast=ms.strlast;while(lastms.last);return*this;)mystring&mystring:operator=(char*ms)这里返回值为引用,不调用拷贝构造函数

46、last=-l;dolast+;strlast=mslast;while(mslast!=,0&lastmaxsize-1);strlast 截尾处理时,必须加串结束符return%his;)mystring mystring:operator4-(mystring&ms)注意+和+=的不同mystring temp(*this);+必须在一份拷贝上进行int i=-l;temp.last-;串的结尾是结束符,连接时要覆盖掉dotemp.last+;i+;temp.strftemp.last=ms.stri;while(ims.last&temp.lastmaxsize-1);temp.st中

47、emp.last 截尾处理时,必须加串结束符return lemp;拷贝的临时变量生命期在调用它的表达式中mystring&mystring:operator+=(mystring&01)+=在对象自 q 进行int i=-l;last-;串的结尾是结束符,连接时要覆盖掉dolast+;i+;strlast=ms.stri;while(ims.last&lastmaxsize-1);strlast 截尾处理时,必须加串结束符return*this;这里返回值改为引用,不调用拷贝构造函数bool mystring:operator(mystring&ms)重载 运算符int i=0,k;dok=

48、stri-ms.stri;i+;while(k=O&ilast&ims.last);if(k0)return true;if(i=last&i!=ms.last)return true;return false;)bool mystring:operator=(mystring&ms)int i=0,k;if(last!=ms.last)return false;dok=stril-ms.stri;i+;while(k=O&ilast);if(k!=O)return false;else return true;)int main()int i;char*spl=东南大学7 sp 2二”交通学

49、院7sp3二 学生7sp4=教师”;mystring ms l(sp 1 ),ms2(sp2),ms3(sp3);/ms 1 ,ms2,ms3是用构造函数生成mystring ms4(ms3),ms5=ms3,ms6;ms4,ms5用拷贝构造函数生成;ms6用缺省构造函数ms6=sp4;ms6赋值是返回引用,不用拷贝构造函数msl.show();ms2.show();ms3.show();ms4.show();ms5.show();ms6.show();m s 4=m s l+m s 2+m s 6;注意+中的t e m p和临时变量由拷贝构造函数生成m s 4.s h o w();m s 1

50、 +=m s 2+=m s 3;+=返回引用,不用拷贝构造函数m s l.s h o w();i f(m s 1 m s 4)m s 1 .s h o w();c o u tv v”应排在“v v e n d l;m s 4.s h o w();c o u tv v 之前v v e n d l;e l s e m s 1 .s h o w();c o u tv v”应排在“v v e n d l;m s 4.s h o w();c o u tv v 之后v v e n d l;m s 6=m s l;/m s 6赋值不是返回引用,必须调用拷贝构造函数建立临时对象i f(m s 1 =m s 6

51、)c o u t$m s l与串 m s 6相同 v v e n d l;m s l=C+p r o g r a m m i n g l a n g u a g e ;i=0;wh i l e(m s l i J!=O,)c o u t v v m s l i+;读出c o u t e n d l;m s l 0+=?写入i=0;m s l.s h o w();c o u t e n d l;c o u t m s l串长:v v m s l.s t r l e n()e n d l;c o u t v v 字符 1 在 m s l中的下标为:v v m s l.s t r c h r(T)v

52、 e n d l;m s 2=,i n g ;c o u t v m s 2在 m s l 中的起始下标 为:nms 1 .s t r s t r(m s 2)e n d l;m s l.r e v e r s e();m s l.s h o w();r e t u r n 0;当前位置:学习资源下载 课后习题答案第六章模板与数据结构习题一、.基本概念与基础知识自测题6.1 填充题6.1.1 模板是为了实现代码的(1),它把数据类型改为一 个 ,称 为(3)程序设v l,o模 板 包 括(4)和(5)。答案:(1)重用(2)设计参数(3)参数化(p a r a m e l e r i z e)

53、(4)函数模板(f u n c t i o n t e m p l a t e)(5)类模板(c l a s s t e m p l a t e)6.1.2 调用函数模板时,可以显式指定模板参数类型,也可以隐式进行,称 为(1),这是根据(2)来决定的。答案:(1)模板实参推演(t e m p l a t e a r g u m e n t d e d u c t i o n)(2)一组实际类型或(和)值6.1.3 顺序杳找可以用于(1)线性表,而对半杳找可以用于(2)线性表。答案:(1)无序的(所有)(2)有序的6.1.4 最常见的排序方式有(1)、和。如果现有一个已排好序的线性表,在表尾添

54、加了 个元素,采用,排序法使它重新成为有序的所需工作量最小。答案:(1)选择(2)插入(3)交换(4)交换(可利用原来的有序性)6.1.5 给出以下指针的说明方式:指向一个4元素整型数组的指针为(1);指向一个返回整型数,参数为两个整型数的函数的指针U;指向一个数组的指针,而该数组元素都是指向一个返回整型指针的无参函数(3)。答 案:(I )i n t(*p)4 J(2)i n t(*p)(i n t,i n t)(3)以指向6元素数组为例:i n t*(*)()(*p)6.2简答题6.2.1 需要编写一个对多维数组通用的算法(即各维的大小未定),怎样才能把实参多维数组的信息全部传递到函数中去

55、?答:最佳方法是用函数模板,多维数组用模板类型参数传递,各维的大小作为参数传递。也可以用一维数组加各维的大小都作为参数传递。6.2.2 什么叫函数模板?什么叫模板函数?什么叫类模板?什么叫模板类?答:不受数据类型限制的通用型的函数使代码的可重用性大大提高。把数据类型改为一个设计参数是一个可行的方案。这种程序设计类型称为参数化(P a r a m e t e r i z e)程序设计。这样的软件模块由模板(T emp l a t e)构造。包括函数模板和类模板。函数模板定义如下:t emp l a t ev模板参数表 返回类型函数名(形式参数表);/函数体模板参数主要是模板类型参数。模板类型参数

56、代表一种潜在的内置或用户定义的类型,由关 键 字t y p e n a m e或c l a s s后 加 一 个标 识 符 构 成。函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,简化重载函数的设计。由调用函数模板(f u n c t r o n t emp l a t e)而生成的函数,称为模板函数(t emp l a t e f u n c t i o n)。类模板定义如下:i c mp l a t ev模板参数表c l a s s类名;类声明体);模板参数有两种:模板类型参数和模板非类型参数。模板类型参数(t emp l a t e t y p e p a r a met e

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

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

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

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

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

62、ize=n;dolast+;strlast=ms.strlast;while(iastms.last);coutvv”拷贝构造函数 vvendl;)mystring()coutvv”析构函数 vvendl;)void show。如需而载v ,则请参见9.3行,暂时未学到,替代方法是改用show。函数coutstrendl;)mystring&operator=(char*ms);/这里重载的二是把C 风格字符串赋给mystringmystring&operator=(mystring&);bool operator(mystring&););mystring&mystring:operator

63、=(char*ms)用 C 字符串赋值白定义字符串last=-l;dolast+;strlast=msllast;while(mslast!=&lastmaxsize-1);strIast-O t 截尾处理时,必须加串结束符return*this;这里返回值为引用,不调用拷贝构造函数mystring&mystring:operator=(mystring&ms)last=-1;dolast+;strlast=ms.strlast;while(lastms.last);coutcv赋值函数 endl;retum*this;)bool mystring:operator(mystring&ms)i

64、nt i=0,k;dok=stri-ms.stri;i+;while(k=O&ilast&ims.last);if(k0)return true;if(i=last&i!=ms.last)return true;retum false;)template Groap max(Groap*r_array,int size)这里是个独立的函数模板Groap max_val=r_array 0;for(int i=l;isize;+i)if(max_valr_arrayi)max_val=r_arrayi;return max_val;)int main()int i;char sp610=“南京大

65、学东南大学丫 交通大学”,“清 华 大 学天津大学“,“复旦大学”;mystring ms6;对象数组fbr(i=0;i6;i+)msij=spi;coutcv”打印学校名称:Hendl;fbr(i=0;i6;i+)msij.show();coutvv”按字典序查找校名:uendl;(max(ms,6).show();return 0;)6.4 将自定义字符串类用于对半查找的函数模板。解1:为简化,使用独立的函数模板#includeusing namespace std;const int n=256;class mystring 为简单只保留用到的函数char strn;存放字符串的数组容器

66、int maxsize;最大可用元素数,可防止数组出界,提高健壮性int last;已用元素数public:mystring()last=-l;maxsize=n;strO=O,;coutvv”缺省构造函数endl;)mystring(char*s)当C 字符串过长,初始化时采用截尾处理last=-l;maxsize=n;dolast+;strlast=slast;while(slast!=0,&lastmaxsize-l);strlastj=VV;截尾处理时,必须加串结束符coutvv”构造函数”endl;)mystring(mystring&ms)last=-l;maxsize=n;dolast+;strlast=ms.strlast;while(lastms.last);coutvv”拷贝构造函数 vvendl;)mystring()coutvv”析构函数 vvendl;)void show。如需重载v v,则请参见9.3节,暂时未学到,替代方法是改用show。函数coutstrendl;)mystring&operator=(char*ms);这里重载的二是把C 风格字符串赋给

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!