动态排序DynamicArray-class.doc_第1页
动态排序DynamicArray-class.doc_第2页
动态排序DynamicArray-class.doc_第3页
动态排序DynamicArray-class.doc_第4页
动态排序DynamicArray-class.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

动态数组(Dynamic Array)类的封装练习程序环境学习使用Visual C+ 6.0环境开始编程:学习最简单的使用Win32 Console Project (类似于Turbo C中的环境),使用说明可见:/ligangliu/Courses/DataStructure_2005-2006/SourceCodes/C2C+/NewConsole.htm编程规范编写程序一定要养成良好的代码习惯。“程序不是写给自己看的,是写给别人看的”。学习规范化编程,养成良好的习惯。可参考编程规范及技巧的文档:/ligangliu/ForStudents/C+/CodingSkills.rar /ligangliu/_download/Training/Documents/Talks/Coding/CodingBasicSkills.rar 注意:不同的团体、公司都有各自的编程规范,没有统一的编程规范。在编程训练的初期,只要选择自己喜欢的一套比较统一的编程规范来写即可,不必追求与上述文档完全一致的编程规范。以后随着编程水平的提高以及查看其他规范的代码后,可根据自己的喜好和合作团队的要求来不断调整自己的编程规范。动态数组类的演示过程使用固定大小的数组,如double a100;有使用不方便的地方:数组大小固定,不灵活;如果程序使用的情况数组元素的个数多于100,则要改数组大小,然后重新编译程序;如果程序使用的情况数组元素的个数很少,则有大量的空间被浪费。为了解决这个矛盾,可以使用动态分配内存空间的方法(需要对内存的动态分配的机制和原理了解和熟悉),即,采用一个指针p记录数组的头地址;采用一个整数n记录数据元素的个数程序运行时,用多少个元素n,就从内存中申请多少空间来存储数组p;p所指向的内存空间的数组元素总是n。n一旦变化,p即申请新的空间用来存储数组(当然需释放掉以前的内存空间,以免造成内存泄漏)。这样,对数组的操作是通过一些函数来操作:这些函数就是对操作这个数组的“接口”。上述的程序大概形式可见:/ligangliu/Courses/DataStructure_2005-2006/SourceCodes/C2C+/Array0.rar由于p 和 n之间有强烈的逻辑关系,自然可以用struct将它们“包”在一起处理,见:/ligangliu/Courses/DataStructure_2005-2006/SourceCodes/C2C+/Array1.0.rar/ligangliu/Courses/DataStructure_2005-2006/SourceCodes/C2C+/Array1.1.rar这时发现那些操作数组的接口函数,都是操作struct的数据,自然可以想到将这些函数“放”到struct里面。在struct中放函数在C中是不行的,但是在C+中是可以的。这样大概如下形式:/ligangliu/Courses/DataStructure_2005-2006/SourceCodes/C2C+/Array2.rar此时发现,数据p,n及处理它们的函数都“包”在一起,放在一个struct中,这就是对它们的一种封装。用户只要操作这个struct的函数,就可以操作一个“数组”。我们将关键词struct改为class,然后将函数的类型改为public,其他不变,这个程序就可以编译运行。这事实上就是一个简单的C+的程序,并且大致完成了一个class!见:/ligangliu/Courses/DataStructure_2005-2006/SourceCodes/C2C+/Array3.rar在写C+程序时,一般一个类需要2个文件,一个头文件*.h(定义了这个类的接口),一个实现文件*.cpp(具体这个类的实现),见:/ligangliu/Courses/DataStructure_2005-2006/SourceCodes/C2C+/Array4.rar希望上述过程好好体会一下。注意:上述的代码都不太符合编程规范,只是演示了大致的一个过程。你需按照严格的编程规范来完成该练习。作业及要求现在要求动态数组的类的接口如下:class CDArrayprivate:double*m_pData;/ 存放数组的动态内存指针intm_nSize;/ 数组的元素个数private:voidInit();/ 初始化voidFree();/ 释放动态内存inlineintInvalidateIndex(int nIndex);/ 判断下标的合法性public:CDArray();/ 缺省构造函数CDArray(int nSize, double dValue = 0);/ 其他构造函数,设置一定数组大小,并设置所有元素为0;当然还可以定义其他不同参数的构造函数,以方便用户使用CDArray(const DArray& arr);/ 拷贝构造函数(最好为所有包含动态分配成员的类都提供拷贝构造函数)CDArray();/ 析构函数voidPrint();/ 输出显示所有数组元素的值intGetSize();/ 获取数组大小(元素个数)intSetSize(int nSize);/ 重新设置数组的大小。注:若nSize小于原数组大小,可截断取前nSize个元素作为新数组的元素;若nSize大于原数组大小,新增的元素的值设置缺省值0即可doubleGetAt(int nIndex);/ 获取某个元素double operator (int nIndex) const; / 重载操作符,以便像传统数组那样通过ak来获取元素值intSetAt(int nIndex, double dValue);/ 设置某个元素的值intPushBack(double dValue);/ 追加一个新的元素到数组末尾intDeleteAt(int nIndex);/ 从数组中删除一个元素intInsertAt(int nIndex, double dValue);/ 插入一个新的元素到数组中CDArray &CDArray:operator = (const CDArray& array); / 重载赋值操作符号=;其他:#define SAFEDELETE(p) if(p) delete p; p=NULL;#define SAFEDELETES(p) if(p) delete p; p=NULL;测试代码:void main()CDArray a;a.InsertAt(0, 2.1);a.Print();a.Pushback(3.0);a.Pushback(3.1);a.Pushback(3.2);a.Print();a.DeleteAt(0);a.Print();a.InsertAt(0, 4.1);a.Print();CDArray acopy = a; /此处用到了拷贝构造函数acopy.Print();CDArray acopy2 (a); /该语句等同于上面的语句,都是初始化acopy2.Print();CDArray acopy3; acopy3 = a;/此处用到了赋值操作符号=的重载acopy3.Print();CDArray b;b.Pushback(21);b.Print();b.DeleteAt(0);b.Print();b.Pushback(22);b.SetSize( 5 );b.Print();CDArray c;c.Pushback(a);c.Pushback(b);c.Pushback(c);c.InsertAt(0, d);c.Print();要求:l 完成满足上述接口的动态数组(Dynamic array)的程序,递交整个工程源文件(*.dsw, *.dsp, *.h, *.cpp);l 需要遵循基本的编程规范和风格;l 动态分配内存用C+的函数new/delete,不用malloc/free;l 处理好动态分配的运用,不要出现内存泄漏;l 了解C+类的构造函数和析构函数的作用;l 熟悉C+类的写法(*.h, *.cpp);l 在头文件(*.h)中使用“预编译#define #ifdef #endif”等来避免重复编译;l 各种情况考虑周到,不要出现程序崩溃(需通过测试代码);l 学习使用VC6的debugger工具的基本功能(”代码编辑效率及技巧”PPT的12-13页)来调试程序;l 作业完成后,整个工程目录中的debug目录删除掉,其他文件压缩打包发给我。通过完成该作业需达到的目标:l 了解和掌握C+的基本语法;l 掌握和熟悉类的定义和语法,包括构造函数(缺省构造函数,重载构造函数,拷贝构造函数),析构函数,函数的重载;l 理解和使用预编译头的机制;l 熟悉指针的操作和使用;l 熟悉动态内存的操作原理及其分配和释放,学会使用new/delete;l 赋值操作符号=的重载,操作符(如”)的重载;l 学会利用VC6.0的debug工具来调试程序;l 务必体会类(对象)的抽象和封装特性:数组抽象为通过各种操作来完成的一个“容器”。对象的特性完全是通过其“接口”(public函数)来表达的;l 学会构造各种情况和极端情况来测试程序的鲁棒性。学习编程的有效方法及TIPS:l 编程是很有用的,不论你以后是否从事计算机相关的工作,请相信:较强的编程能力都能对你未来有所帮助!因为它所提供的不仅是个思维的训练,而且还是解决问题的方法的训练。另外,编程能力能帮助你实现你的很多想法。如果你不能实现你的想法,就等于没有想法!l 如果你对编程没有兴趣,甚至对编程有抵制情绪,请尽早告知(否则是在浪费你的时间,也是在浪费我的时间),我建议你别学C+编程了,做你自己喜欢做的事。生活中没有C+,也同样美好。l 如果你觉得编程还挺有意思,首先需要有这个信念:学习编程比学习数学容易得多得多!能学好数学的同学一定能学好编程。l 学习编程有一定的方法,需掌握好方法才能快速提高编程的能力!“方法不对,努力白费”!l 不要像学数学那样来学习编程,即不要花很多时间(比如,花很多周,甚至12个月来研读某教材)来研究C+的各种语法特性;只要初步了解一定的基本语法,就可以开始动手写程序;通过边做边查找来体会各种知识。没有必要去研究(i+i)这种钻牛角尖的语句,因为没人会写出这种代码的!l 学习编程一定要有足够的时间(最好能在12个月之内集中)。如果你时间不够,先暂时不要学。l 通过各种任务及目标的设定来学习编程是最有效的方法,如果,要相信我布置给你的一系列练习会在短时间给你很大的提高,甚至精通面向对象(C+)编程思想!(该方法的有效性已得到充分的验证)l 正如骑自行车、游泳、说英语一样,编程是一种技能学习,而不能把它当作知识来学。只有通过动手来学习是正确的方法,光看书不动手是学不会的!l 对于某个困难点,可通过自己的努力去解决;若一个问题长久时间还得不到解决,可能是陷入到一个思维定势,或者方法不正确,这时可寻求比你更有经验的人来帮助解决。在找人帮助解决的时候,最好能坐在他/她边上看他是如何解决的(包括设置断点、调试过程等),这样学到的东西最多。注意:不要太依赖与他人的帮助,不经过思考和失败而寻求他人的帮助对你是无效的!l 学习方法:首先找本较好的C+教材(比如你学习的教材,或者谭浩强编的教材),快速浏览且大致了解一下C+语言的语法,在脑子内有个大致印象;然后将教材当作参考书,按照训练作业的要求一步一步去完成任务;若在参考书中找不到的话,可通过google或百度

温馨提示

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

评论

0/150

提交评论