C++数据结构习题含答案.docx
《C++数据结构习题含答案.docx》由会员分享,可在线阅读,更多相关《C++数据结构习题含答案.docx(86页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1-4.什么是抽象数据类型?试用C+的类声明定义“复数”的抽象数据类型。要求(1)在复数内部用浮点数定义它的实部和虚部。(2)实现3个构造函数:缺省的构造函数没有参数;第二个构造函数将双精度浮点数赋 给复数的实部,虚部置为:第三个构造函数将两个双精度浮点数分别赋给复数的实部和虚 部。(3)定义获取和修改复数的实部和虚部,以及十、*等运算的成员函数。(4)定义重载的流函数来输出个复数。【解答】抽象数据类型通常是指由用户定义,用以表示应用问题的数据模型。抽象数据类型由基 本的数据类型构成,并包括一组相关的服务。在头文件complex.h中定义的复数类#ifndef _complex_h_#defi
2、ne _complex_h_#include class comlex 不带参数的构造函数只置实部的构造函数分别置实部、虚部的构造函数取复数实部取复数虚部修改复数实部修改复数虚部bn = ob.hn; 复数赋值重载函数:复数四则运算public:complex () Re = Im = 0; complex ( double r)Re = r; hn = 0;complex ( double r, double i) Re = r; bn = z; double getReal ( ) return Re; double getbnag () return bn; void setReal (
3、 double r ) Re = r; void setlmag ( double i) bn = i; complex& operator = ( complex& oh) Re = ob.Re; complex& operator + ( complex& ob );coniplex& operator - ( complex& ob );complex& operator * ( complex& ob );complex& operator / ( complex& ob );friend ostream& operator ( ostream& os, complex& c );友元
4、函数:重载vvprivate:复数的实部与虚部double Re, bn;);#endif复数类complex的相关服务的实现放在C+源文件complcx.cpp中#include #include #include complex.hMcomplex& complex : operator + ( complex & ob) 重载函数:复数加法运算。complex * result = new complex (Re + ob.Re, bn + ob.bn ); return *result;complexSc complex : operator - ( complex& ob ) 重载函
5、数:复数减法运算complex * result = new complex ( Re - ob.Re, Im - ob.Im );return * result;complex& complex : operator * ( complex& ob ) 重载函数:复数乘法运算complex result =new complex (Re * ob.Re - Im * ob.Im, Im * ob.Re + Re * ob.Im );return *result;)complex& complex : operator / ( complex& ) 重载函数:复数除法运算double d =
6、ob.Re * ob.Re + ob.Im * ob.Im;complex * result = new complex (Re * ob.Re + Im * ob.Im ) / J,(Im * ob. Re - Re * ob.Im )/= 0.0 ) ?“+”:- fabs ( ob.Im ) i;1-7试编写个函数计算!*2的值,结果存放于数组a/roySize的第个数组元素中,0 4 n array Size 若设计算机中允许的整数的最大值为maxlnt,则当arraySize或者对于某 个k (04k 4),使得k!*21ax/,时,应按出错处理。可有如下三种不同的出错处理方 式:(
7、1)用cerrvv及exit (1)语句来终止执行并报告错误;(2)用返回整数函数值0, 1来实现算法,以区别是正常返回还是错误返回;(3)在函数的参数表设置个引用型的整型变量来区别是正常返回还是某种错误返回。 试讨论这三种方法各自的优缺点,并以你认为是最好的方式实现它。【解答】#include ioslream.h#define arraySize 100#define Maxlnt Ox7fffffffint calc (int T , int n ) int /, value = 1;if(w !=0)int edge = Maxlnt I n 12;for (i = 1; / edge
8、 ) return 0;)value *= n * 2;)Tn = value;cout MAH n Tn endl;return 1;void main () int AarraySize;int i;for (/ = 0; / arraySize; /+ )if ( Icalc (4, i) cout failed at i n .H endl;break;)1-9(1)在下面所给函数的适当地方插入计算count的语句:void d (Array Element x |,int n ) int i = 1;dox/ += 2; i +=2; while (i = n );;i= 1;whi
9、le (/= (n/2) xi +=x/+l; /+;)(2)将由(1)所得到的程序化简。使得化简后的程序与化简前的程序具有相同的co“”值。(3)程序执行结束时的值是多少?(4)使用执行频度的方法计算这个程序的程序步数,画出程序步数统计表。【解答】(1)在适当的地方插入计算count语句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 (i=(n/2)count -H-;
10、针对 while 语句xi +=x/+l;count +;i+;count +;)count +;针对最后一次while语句(2)将由(1)所得到的程序化简。化简后的程序与原来的程序有相同的co“”值:void d ( Array Element x , int )int / = 1;docount += 3; i += 2; while (i = n );=1;while (/ = (n / 2 ) count += 3; i +;)count += 3;(3)程序执行结束后的值为3n+ 3。当 n 为偶数时,count = 3*(n/2) + 3*(n/2) + 3 = 3*n + 3当
11、n 为奇数时,count = 3*(n+l)/2) + 3*(n-l)/2) + 3 = 3*n + 3(4)使用执行频度的方法计算程序的执行步数,画出程序步数统计表:行号程序语句一次执行步数执行频度程序步数1void d (Array Element 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 (Z=(n/2)1Ln/2+lJLn/2+lJ9xi +
12、=x/+l;1Ln/2jLn/210+;1Ln/2jLn/211)0Ln/2j012010(n*0)3n + 32-1设个人围坐在个圆桌周围,现在从第s个人开始报数,数到第机个人,让他出局; 然后从出局的下一个人重新开始报数,数到第m个人,再让他出局,如此反复直到 所有的人全部出局为止。下面要解决的Josephus问题是:对于任意给定的s和m,求出这 个人的出局序列。请以 =9,s=l,机=5为例,人工模拟Josephus的求解过程以求得问题 的解。【解答】出局人的顺序为5, 1,7,4,3, 6, 9, 2, 8。2-2试编写个求解Josephus问题的函数。用整数序列1,2, 3,n表示顺
13、序围坐在圆桌 周围的人,并采用数组表示作为求解过程中使用的数据结构。然后使用 = 9,s= 1,5=5, 以及=9, s = I, m = 0,或者=9, s = 1,机=10作为输入数据,检查你的程序的正确性和健 壮性。最后分析所完成算法的时间复杂度。【解答】函数源程序清单如下:void Josephus( int A , int ) int ,k, imp;if(m=0)(:01117 = 0是无效的参数!”!11;return;)for (/ = 0; / 1; i) if(i=k)i = O;i = (i + m- )%k;if(i !=A-1 )tmp = Ai;/初始化,执行“次/
14、报名起始位置/逐个出局,执行T次/*寻找出局位置/出局者交换到第hl位置/for (j = i;j k-l;j+) Aj =A/+1;A 伙-=tmp;)for(k = 0;kn/2; k+ ) /全部逆置,得到出局序列/tmp = Ak;Ak = An-k+; An-k+1 = tmp;)伊:n = 9, 5 = 1, /n = 5012345678 k = 9k = 8k = lk = 6 k = 5k = 4 k = 3k = 2逆置例:n = 9,5 = l,/n = 0报错信息 团=0是无效的参数!例:? = 9,5 = 1,m = 10012345678k = 9234 567 1
15、 819 第 1 人出局,i = 0Jt = 8234567891第3人出局,i=lk = l245678931第6人出局,i = 3k = 6245789631第2人出局,i = 0k = 5457892631第9人出局,i = 4k = 4457892631第5人出局,i= 1k = 3478592631第7人出局,i= 1k = 2487592631第4人出局,i =。847592631第8人出局,i 二 0逆置36295748最终出局顺序当! 二 1时,时间代价最大。达至(T ) + ( “-2 ) + 4-1 = n(n- 1 )/2 0(。2-3设有一个线性表(细约,e.2,“)存
16、放在个维数组Size中的前个数组 元素位置。请编写个函数将这个线性表原地逆置,即将数组的前个原址内容置换为(如, 呢2,白,4)。【解答】templateclass Typo void inverse ( Type A , int n ) Type tmp;for (int i = 0; i j,数组元素在数组B中没有存放,可以找它的对称元素AUHi。在数组B的第(2n-j)*(jT)/2 + i位置中找到。如果第。行第。列也计入,数组B从。号位置开始存放,则数组元素在数组B 中的存放位置可以改为当 i4j 时,=(2n-i+l)*i/2+j- i = ( 2n - i - 1 ) * i /
17、2 + j当 ij 时,=(2n-j- l)*j/2 + i(3)只存下三角部分时,若i2j,则数组元素前面有iT行(1i-1,第。行第。 列不算),第1行有1个元素,第2行有2个元素,第iT行有i-1个元素。在第1行 中,第j号元素排在第j个元素位置,因此,数组元素在数组B中的存放位置为1 +2 + (i-l) + j = (i-l)*i/2+j若ij,数组元素在数组B中没有存放,可以找它的对称元素AjHi。在数组B的第(j-l)*j/2 + i位置中找到。如果第。行第。列也计入,数组B从。号位置开始存放,则数组元素在数组B 中的存放位置可以改为当 i2j 时,=i*(i+l)/2+j当 i
18、j 时,=j*(j+l)/2 + i2-10设4和8均为下三角矩阵,每一个都有行。因此在下三角区域中各有(+1)/2个元 素。另设有一个二维数组C,它有行+1歹。试设计个方案,将两个矩阵A和B中的 下三角区域元素存放于同一个C中。要求将A的下三角区域中的元素存放于C的下三角区 域中,B的下三角区域中的元素转置后存放于C的上三角区域中。并给出计算A的矩阵元 素旬和B的矩阵元素与在C中的存放位置下标的公式。【解答】iu11b 1UI I%-10an-an-n-)10n-11 a b b.u 10.b n 一 203-io a 10a ii即 ,bn-2-11C =。!o。2ia 22b n-22b
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 数据结构 习题 答案
限制150内