收藏 分享(赏)

3-数据结构的adt和类.ppt

上传人:cjc2202537 文档编号:980530 上传时间:2018-05-12 格式:PPT 页数:47 大小:329.50KB
下载 相关 举报
3-数据结构的adt和类.ppt_第1页
第1页 / 共47页
3-数据结构的adt和类.ppt_第2页
第2页 / 共47页
3-数据结构的adt和类.ppt_第3页
第3页 / 共47页
3-数据结构的adt和类.ppt_第4页
第4页 / 共47页
3-数据结构的adt和类.ppt_第5页
第5页 / 共47页
点击查看更多>>
资源描述

1、算法与数据结构,第2讲 数据结构的ADT和实现,数据结构:是指一个数据元素的集合,数据元素之间存在着某种特定的关系结构,从逻辑上可以分为 具有线性关系的表结构 具有非线性关系的树结构和图结构 还有无关系的集合结构在物理上按照存储方式又分为 顺序存储 - 数组(结点之间的逻辑关系通过相邻表达) 链式存储 - 链表(结点之间的逻辑关系通过存储的指针表示) 索引存储 - 不仅要存储数据信息还要存储索引表 哈希(散列)存储 - 通过映射计算确定存储位置,无需存储逻辑关系,数据结构不只是存储结构,还包括对数据的各种操作,例如:一个线性表结构,我们可以用数组顺序存储,也可以用链表链式存储,但是,我们更关心

2、的是这个线性表结构可以进行哪些操作(如插入、删除、查找等),这些操作该怎么用计算机实现这就是算法要回答的,每个算法可以一个或多个函数来表达对树结构和图结构也是要做同样的事情,数据结构的抽象表示,ADT(abstract data type) 抽象数据类型 它可以把数据的描述(数据元素的定义和它们之间的关系的定义)和它所支持的各种操作封装到一起 抽象是指ADT强调数据的逻辑结构,以及它们可以进行哪些操作,不关心这种数据类型怎么实现,相当于只对数据规定了操作接口,抽象数据类型的一般形式,ADT 抽象数据类型名 数据对象数据对象的定义 数据关系数据关系的定义 基本操作基本操作的定义 ADT 抽象数据

3、类型名,例如 24小时的时间ADT,ADT time24 数据对象 h:m|h是 023的整数 m是059的整数 各种操作: addTime(m) 给当前时间增加m分钟 duration(t) 计算当前时间与同一天某个未来时间t之的时间长度,返回值是time24类型的值 readTime()使用格式hh:mm从键盘输入时间 writeTime()以hh:mm格式显示时间到屏幕 getHour() 返回当前时间的小时值 getMinute() 返回当前时间分钟值 ADT time24,time24的C语言结构体定义与实现,typedef struct int hour; int minute;

4、time24; /可以用大写TIME24,用一组函数表达各种操作,time24 addTime( time24 t, int m); time24 duration( time24 t0, time24 t ); time24 readTime(); void writeTime( time24 t ); int getHour( time24 t ); int getMinute( time24 t ); time24 t0, time24 t代表当前时间,addTime的定义,time24 addTime(time24 t,int m) time24 t0; t0.hour = t.hou

5、r; t0.minute = t.minute+m; if (t0.minute=60) t0.hour+; t0.minute-=60; return t0; ,duration的定义,time24 duration (time24 t0, time24 t) time24 t1;int t0Time = t0.hour * 60 + t0.minute;int tTime = t.hour * 60 + t.minute;t1.hour =(tTime - t0Time)/60;t1.minute =(tTime- t0Time)-t1.hour*60; return t1;,time24

6、 readTime() time24 t; char c; cint.hourct.minute; return t; void writeTime(time24 t) coutt.hour:t.minuteendl; int getHour(time24 t) return t.hour; int getMinute(time24 t) return t.minute; ,测试,int main() time24 t1,t2,t3; t1.hour= 10; t1.minute=40; writeTime(t1); t2=addTime(t1,25); writeTime(t2); t3=r

7、eadTime(); writeTime(t3); coutgetHour(t1)endl; coutgetMinute(t2)hour; cinc; cinminute; ;,函数在结构体外定义,void time24:addTime(int m) minute = minute+m; if (minute=60) hour+; minute-=60; ,time24 time24:duration(time24 t) time24 t1; int h,m; int currTime = hour * 60 + minute; int tTime = t.hour * 60 + t.minu

8、te; h=(tTime-currTime)/60; m=(tTime-currTime)-h*60; t1.hour = h; t1.minute = m; return t1;,测试,int main() time24 t1,t2,t3,t4; t1.hour= 10; t1.minute=40; t1.writeTime(); t1.addTime(25); t1.writeTime(); t3.readTime(); t3.writeTime(); coutt1.getHour()endl; coutt3.getMinute()endl; t4=t3.duration(t1); t4.

9、writeTime(); return 0;,创建结构体对象变量,结构体对象变量访问数据成员,结构体对象变量访问成员函数,只有public成员才可以在这里访问,注意内联函数和外部定义的类成员函数在编译时的不同,time24含有私有数据成员的结构体定义,struct time24public: /默认是public,可以省略 void addTime( int m ); time24 duration( time24 t ); void readTime( ); void writeTime( ); int getHour( ); int getMinute( );priate: int hou

10、r; int minute; ;,测试,int main() time24 t1,t2,t3,t4; t1.hour= 10; t1.minute=40; t1.writeTime(); t1.addTime(25); t1.writeTime(); t3.readTime(); t3.writeTime(); coutt1.getHour()endl; coutt3.getMinute()=60) hour+; minute-=60; 其它成员函数的外部定义见代码文件,注意:各个成员函数中的hour和minute是类自身的数据成员,构造函数的定义,time24(int h=0, int m=

11、0); 构造函数的名字同类名相同 构造函数无返回类型 构造函数的参数可以使用默认值 构造函数是创建对象的时候调用,用于初始化数据成员,创建类的对象,int main() time24 t1(10,30), t2(12,50), t3, t4; t1.writeTime(); t2.writeTime(); t3.writeTime(); t4.writeTime(); return 0;在创建对象时调用了构造函数,注意:创建对象时构造函数初始化了对象的数据成员hour和minute,构造函数的另一种实现 -使用初始化列表,构造函数的原型:time24(int h=0, int m=0);但有时

12、不允许用赋值语句修改属性,只能使用初始化列表time24:time24(int h, int m) : hour(h), minute(m) /其它代码,目前为空: hour(h), minute(m)的效果 相当于hour = h; minute=m;,time24:time24 (int h, int m) hour = h; minute = m;,常量成员必须用初始化列表,class Increment public: Increment:Increment( int c, int i ) : count( c ), /相当于count=c, increment( i ) /但不能用i

13、ncrement=i,因为这是常量不允许的 /count = c; /increment = i; 这是错误的 private: int count; const int increment; ;,创建对象时用户输入超出范围的数,构造函数怎么初始化数据?,time24:time24 (int h, int m) : hour(h), minute(m) /把小时数和分钟数调整到正确范围之内059,023normalizeTime(); 函数normalizeTime()仅供构造函数使用,因此把它定义成私有的,这种函数叫工具函数void time24:normalizeTime() / 把时间数

14、据规范化 int extraHours = minute / 60; minute %= 60; / 把分钟数规范到059之间 hour = (hour + extraHours) % 24; /把小时数规范到023之间,含有私有函数的time24类,class time24public: time24(int h=0, int m=0); void addTime( int m ); time24 duration( time24 t ); void readTime( ); void writeTime( ); int getHour( ) return hour; int getMinu

15、te( ) return minute; priate: void normalizeTime(); int hour; int minute; ;,测试举例,time32 t(32,150); t.writeTime(); /? 10:30,可以把time24的接口和实现分离,类的public成员函数是为对外服务的接口 类的成员函数的代码称为类的实现 把time24类的定义(或者叫声明) 放在一个头文件中,如 time24.h 把time24类成员函数的实现放在一个.cpp文件中,如time24.cpp测试的时候需要建立工程,也可以在类的头文件中包含所有成员函数的实现,教材提供了一套.h,均

16、已d开始,每个头文件中都包含成员函数的实现代码。教材还提供了完整的例题代码 例如 time24类的头文件是d_time24.h 使用的时候只需包含头文件即可 教材给定的头文件都比较规范,完整 打开d_time.h查看,例 程序1-1 停车库费用,设有一个公共停车场,假定停车费用为每小时6元,使用time24类写一个程序,对前来停车的用户进行管理,程序要求当用户输入进入时间和离开时间之后经过计算,输出一张收据,其中包括到达时间、离开时间、汽车停放的时间长度和总费用。 比较理想的解决方案应该是进入时输入进入的时间,离开时再输入离开的时间,然后程序从进入的记录表中找出进入的时间,再经过计算,输出一张

17、收据,其中包括到达时间、离开时间、汽车停放的时间长度和总费用。,#include #include d_time24.husing namespace std;int main()const double PERHOUR_PARKING = 6.00;time24 enterGarage, exitGarage, parkingTime;double billingHours; cout Enter the times the car enters and exists the garage: ;enterGarage.readTime();exitGarage.readTime();park

18、ingTime = enterGarage.duration(exitGarage);,billingHours = parkingTime.getHour() + parkingTime.getMinute()/60.0;cout Car enters at: ;enterGarage.writeTime();cout endl;cout Car exits at: ;exitGarage.writeTime();cout endl;cout Parking time: ;parkingTime.writeTime();cout endl;cout Cost is $ billingHour

19、s * PERHOUR_PARKING endl;,再看一个例子:矩形类的定义与实现,#ifndef RECTANGLE_CLASS#define RECTANGLE_CLASSclass rectanglepublic: rectangle(double len = 0.0, double wid = 0.0) : length(len), width(wid) double area() const return length * width; double perimeter() const return 2 * (length + width); ,void setSides(doub

20、le len, double wid)length = len;width = wid;double getLength() const return length; double getWidth() const return width; private:double length, width;#endif,const 对象与const 成员函数,可以定义类的对象为const对象常对象 常对象是不可以被修改的,因此它不可以调用它的有可能修改其属性的成员函数,除非把成员函数定义为常成员函数例如 以get开始命名的获取函数和显示信息的函数都可以定义为常成员函数注意:常对象的常量性质是在构造函

21、数初始化对象之后。,const rectangle r1(10,5), r2(20,10); r1.setSides(15,10); /是错误的 cout r1.getLength(); /是正确的,应用程序编程接口API,现在数据结构的ADT用C+的类表达并实现之后,我们就可以使用类创建对象,并用类的公共接口来解决各种问题啦通常程序员把类的构造函数+类的公共接口函数放在一起做成开发文档,称之为API,供其它开发者使用对于任何类库,我们只要知道了它的API,就可以使用它了,当然在编译时要用到它的头文件,链接时要用它的库,随机数randomNumber类的 API,randomNumber 类:

22、初始化随机数的构造函数:默认参数0表示以系统时钟为种子randomNumber(long s = 0); 生成一个32个二进制位的随机整数函数m, 1 = m = 231-2long random();生成一个32个二进制位的随机整数函数m, 0 = m = n-1, n = 231-1long random(long n);生成一个随机实数x ,0 = x 1double frandom();,例2 掷骰(tou)子游戏,问题描述:掷两个骰子,如果总点数是2、3或12,则庄家赢,如果总点数是7或11,则玩家赢,如果总点数是4、5、6、8、9或10,则以这个点数为目标点数,游戏继续,如果下一次

23、掷中了第一次投掷的目标点数,则玩家赢,否则如果掷出的是7点则庄家赢。问题分析:两个骰子可能出现的点数用随机数表示,可以利用随机函数类创建一个随机对象die,使用随机对象的random函数,产生两个1到6之间的随机数,第一次投掷之和为 initToss = (1 +random(6) + (1 +random(6) 判断它是否为2、3、12或7、11,如果不是做下一次投掷 nextToss = (1 +random(6) + (1 +random(6) 判断它是否为initToss 或7 不是重复投掷直掷中为止,骰子游戏的求解程序,#include #include d_random.h/ ra

24、ndomNumber classusing namespace std; int main() randomNumber die;int initToss, nextToss;initToss = (1 + die.random(6) + (1 + die.random(6); if (initToss = 2 | initToss = 3 | initToss = 12) cout Initial toss is initToss House wins endl; else if (initToss = 7 | initToss = 11) cout Initial toss is initToss Player wins endl;,else cout Target is initToss Play on endl;do nextToss = (1 + die.random(6) + (1 + die.random(6); cout Next toss nextToss endl;while (nextToss != 7 ,小结、作业,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 教育学

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报