清华大学-数据结构课后答案.docx
《清华大学-数据结构课后答案.docx》由会员分享,可在线阅读,更多相关《清华大学-数据结构课后答案.docx(85页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1-4.什么是抽象数据类型?试用C+的类声明定义“复数”的抽象数据类型。要求(1)在复数内部用浮点数定义它的实部和虚部。(2)实现3个构造函数:缺省的构造函数没有参数;第二个构造函数将双精度浮点数赋 给复数的实部,虚部置为0:第三个构造函数将两个双精度浮点数分别赋给复数的实部和虚 部。(3)定义获取和修改复数的实部和虚部,以及+、-、*、/等运算的成员函数。(4)定义重载的流函数来输出一个复数。【解答】抽象数据类型通常是指由用户定义,用以表示应用问题的数据模型。抽象数据类型由基 本的数据类型构成,并包括一组相关的服务。在头文件complex.h中定义的复数类#ifndef _complex_h
2、_#define _complex_h_#include class coinlex 不带参数的构造函数只置实部的构造函数分别置实部、虚部的构造函数取复数实部取复数虚部修改复数实部修改复数虚部public:complex () Re = Im = 0; complex ( double r) Re = hn = 0; complex ( double r, double i) Re = r; Im = /; double getReal () return Re; double gelhnag () return hn; void setReal ( double r) Re - r void
3、 setlmag ( double i) bn = z; complex& operator = ( complex& ob) Re - ob.Re; hn = ob.hn; 复数赋值重载函数:复数四则运算complex& operator + ( complex& ob );coniplex& operator - ( complex&. ob );complex& operator * ( contplex& ob );complex, operator / ( complex& oh );friend ostream& operator ( ostream& os, complex& c
4、 ); 友元函数:重载vv private:double Re, bn;复数的实部与虚部);#endif复数类complex的相关服务的实现放在C+源文件complex.cpp中#include #include #include complex.hcomplex& complex : operator + ( complex & ob) 重载函数:复数加法运算。complex * result = new complex (Re + ob.Re, bn + ob.lin ); return *result;complex& complex : operator - ( complex& ob
5、) 重载函数:复数减法运算complex * result = new complex ( Re - ob.Re, Im - ob.bn ); return * result;co nip I ex & complex : operator * ( complex& oh ) 重载函数:复数乘法运算complex * result =new complex (Re * ob.Re - Im * ob.Im, Im * oh. Re Re * ob.lm );return *result;)complex& complex : operator / ( complex& ) 重载函数:复数除法运
6、算double d = ob.Re * ob.Re + ob.lm * ob.lm;complex * result = new complex ( Re * ob.Re + Im * ob.lm ) / d,(Im * ob. Re - Re * ob.bn )/= 0.0 ) ? “+” :- fabs ( ob.lm ) i;11-7试编写一个函数计算!*2的值,结果存放于数组4arraySize的第个数组元素中,0 4 n arraySize或者对于某一个k (0 4% 4),使得A!*2*znox/W时,应按出错处理。可有如下三种不同的出错处理方 式:(1)用cerrvv及exit
7、(1)语句来终止执行并报告错误;(2)用返回整数函数值0,1来实现算法,以区别是正常返回还是错误返回;(3)在函数的参数表设置-个引用型的整型变量来区别是正常返回还是某种错误返回。 试讨论这三种方法各自的优缺点,并以你认为是最好的方式实现它。【解答】#include iostream.h1#define arraySize 100#define Maxlnt Ox7fffffffint calc (int T , int n ) int i, value = 1;if(w !=0)int edge = Maxlnt / n / 2;for (i = 1; / edge ) return 0;v
8、alue *= * 2;)Tn = value;cout MAH n M=H Tn endl;return 1;void main () int AarraySize;int i;for (/ = 0; / array Size; /+ )if ( lealc (A, /) cout failed ati vv endl;break;)1-9(1)在下面所给函数的适当地方插入计算count的语句:void d (ArrayElement x , int n ) int i = 1;do xi += 2; i +=2; while (i = n );; =1;while (i = (n/2) x
9、/ += x/+l; /+;)(2)将由(1)所得到的程序化简使得化筒后的程序与化简前的程序具有相同的count值。(3)程序执行结束时的co”值是多少?(4)使用执行频度的方法计算这个程序的程序步数,画出程序步数统计表。【解答】(1)在适当的地方插入计算以皿语句void d (ArrayElement x , int n ) int i = 1;count +;do xi += 2; count +;i += 2; count +;count +;针对 while 语句 while (i = n );/=1;count +;/针对while语句while (i=(n/2)count +;xi
10、 +=x/+l;count +;i +;count +;count +;针对最后一次while语句)(2)将由所得到的程序化简。化简后的程序与原来的程序有相同的cam,值: void d (ArrayElement x , int n ) int / = 1;docount += 3; i += 2; while (/ = n );i=l;while (/ = ( n / 2 ) count += 3; i -H-;)count += 3;(3)程序执行结束后的值为3n + 3o当 n 为偶数时.count = 3*(n/2) + 3*(n/2) + 3 = 3*n + 3当 n 为奇数时,c
11、ount = 3 * ( n + 1 )/2) + 3*(n-l)/2) + 3 = 3*n + 3(4)使用执行频度的方法计算程序的执行步数,画出程序步数统计表:行号程序语句一次执行步数执行频度程序步数1void d (ArrayElement x , int )0102int / = 1;1113do0L(n+l)/2j04xi+=2;1L(n+l)/2jL(n+l)/2j5i+=2;1L(n+l)/2jL(n+l)/2j6 while ( / = n );1L(n+l)/2jL(n+l)/2j7i=l;1118while (/ = ( n / 2 ) ILn/2+lJLn/2+lJ9xi
12、 +=x/+l;1Ln/2jLn/210I+;1Ln/2jLn/2110Ln/2j012010(nO)3n + 32-1设“个人围坐在一个圆桌周围,现在从第s个人开始报数,数到第m个人,让他出局; 然后从出局的下一个人重新开始报数,数到第m个人,再让他出局,如此反复直到 所有的人全部出局为止。卜面要解决的Josephus问题是:对于任意给定的”,s和求出这 个人的出局序列。请以 = 9,s=l,机=5为例,人工模拟Josephus的求解过程以求得问题 的解。【解答】出局人的顺序为5, 1,7,4, 3, 6, 9, 2, 8。2-2试编写一个求解Josephus问题的函数。用整数序列1,2,
13、3,,表示顺序围坐在圆桌 周围的人,并采用数组表示作为求解过程中使用的数据结构。然后使用 = 9,s=1,/m = 5, 以及=9, s = 1, m = 0,或者 =9, s = 1, m = 10作为输入数据,检查你的程序的正确性和健 壮性。最后分析所完成算法的时间复杂度。【解答】函数源程序清单如下:void Josephus int A , int n, s,m)int i、j, k, tmp;if( m = = 0 ) coutvv/n = 0 是无效的参数! vvendl;return;)for (/ = 0; i 1; i) if(i=L)i = O; i = (i + m - 1
14、 )%;if(i!=I ) tmp = Ai;/*初始化,执行次*/*报名起始位置*/*逐个出局,执行nT次*/*寻找出局位置*/*出局者交换到第&T位置*/for (7 = i;i void inverse ( Type A , int n ) Type imp;for (int i = 0; / j,数组元素在数组B中没有存放,可以找它的对称元素AUHi。在数组B的第(2n-j)*(j-l)/2 + i位置中找到。如果第0行第0列也计入,数组B从。号位置开始存放,则数组元素在数组B 中的存放位置可以改为当 i4j 时,=(2n-i+l)*i/2+j- i = ( 2n - i - 1 )
15、* i / 2 + j当 ij 时,=(2n-j- l)*j/2 + i(3)只存下三角部分时,若i2j,则数组元素前面有iT行(1i-1,第0行第0 列不算),第1行有1个元素,第2行有2个元素,第i-1行有iT个元素。在第i行 中,第j号元素排在第j个元素位置,因此,数组元素在数组B中的存放位置为1 +2 + (i-l) + j = (i-l)*i/2+j若ij,数组元素在数组B中没有存放,可以找它的对称元素在数组B的第(j-l)*j / 2 + i位置中找到。如果第0行第0列也计入,数组B从。号位置开始存放,则数组元素在数组B 中的存放位置可以改为当 i2j 时,=i*(i+l)/2+j
16、当 ij 时,=j*0+l)/2 + i2-10设4和8均为下三角矩阵,每一个都有行。因此在下三角区域中各有0(+1 )/2个元 素。另设有一个二维数组C,它有n行n+l歹试设计一个方案,将两个矩阵4和8中的 下三角区域元素存放于同一个C中。要求将4的下三角区域中的元素存放于C的下三角区 域中,B的下三角区域中的元素转置后存放于C的上三角区域中。并给出计算A的矩阵元 素旬和B的矩阵元素与在C中的存放位置下标的公式。【解答】c =a 00a 10a 20b ooa 11a 21b ioa 22b n-20216 一22b n - io、-11b n-12t n-10an-a n-12*a n-l
17、n-ln-ln-l )计算公式Rr.ir . Jc4i + 1, B/ j= 当i当ij时 ,时2-14字符串的替换操作replace (String &s, String &/, String &p)是指:若f是s的子串,则用 串v替换串t在串s中的所有出现;若,不是s的子串,则串s不变。伊IJ如,若串s为 “aabbabcbaabaaacbab”,串/为bab”,串v为abdc”,则执行rep/ace操作后,串$中的结果 为“aababdccbaabaaacabdc。试利用字符串的基本运算实现这个替换操作。【解答】String & Siring : Replace ( String & t
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 清华大学 数据结构 课后 答案
限制150内