第十三章书馆管理黍就设计 在实际系统中,怎么样用面向对象的思想来编写系统是 很重要的,下面以建立一个〈图书馆管理系统〉为例子,看 看我们怎么样用学过的知识来组织数据、来设计程序。 1.数据的组织 对象的识别: 在一个信息管理系统内识别对象是数据组织中很重要的一 步,识别时候我们从问题中根据业务的流程,操作对象来进 行,识别出一个对象后,我们就可以把具有公共特性的对象 归纳为类。然后在类的基础,分析他们之间的关系,形成若 干个类的层次结构 在图书馆流通系统内,我们知道,有书、读者、借书证、 管理人员、借书还书行为等对象和事件,他们分别各是一个 群体。例如每个图书馆都有几万甚至几十万册图书,每册图 书都是一个对象,它们形成图书类(Book),在图书流通系 统内,还有以下类:
第十三章 图书馆管理系统设计 在实际系统中,怎么样用面向对象的思想来编写系统是 很重要的,下面以建立一个〈图书馆管理系统〉为例子,看 看我们怎么样用学过的知识来组织数据、来设计程序。 1. 数据的组织 对象的识别: 在一个信息管理系统内识别对象是数据组织中很重要的一 步,识别时候我们从问题中根据业务的流程,操作对象来进 行,识别出一个对象后,我们就可以把具有公共特性的对象 归纳为类。然后在类的基础,分析他们之间的关系,形成若 干个类的层次结构。 在图书馆流通系统内,我们知道,有书、读者、借书证、 管理人员、借书还书行为等对象和事件,他们分别各是一个 群体。例如每个图书馆都有几万甚至几十万册图书,每册图 书都是一个对象,它们形成图书类(Book),在图书流通系 统内,还有以下类:
13.1数据分析和组织 读者( Reader)类,图书借阅信息类(Loan),管理人员类 ( Manager),是借书还书行为的操作人。对于借书证对象 我们只记录它的编号,作为读者类的一个数据成员。同一个信 息系统,从不同的角度分析,或根据要求的不同,有不同的侧 重面,这样建立的对象模型不同,可能得出的分类方法也不同。 类数据属性的识别: 每个对象的情况称为对象的属性,同类型的对象具有共同 的属性,只是每个对象的属性值不一定相同。属性是对一个对 象状态的描述,如“在馆图书类”,从流通管理的角度来看, 图书类:书名Tite、作者名 Author、分类号 Indexcode、册 数 Number、条码号 BarCode等属性。 读者类:姓名Name、年龄Age、借书证编号 Bozid等。 个读者允许借阅若干册书,在此用一个Book类的 链表Bkp保存相应信息。另外对读者所借书册数要 统计,定义一个计数的成员 Count. 借阅信息类:所借书book、借书人 reader、操作员 manager
读者(Reader)类,图书借阅信息类(Loan),管理人员类 (Manager),是借书还书行为的操作人。对于借书证对象。 我们只记录它的编号,作为读者类的一个数据成员。同一个信 息系统,从不同的角度分析,或根据要求的不同,有不同的侧 重面,这样建立的对象模型不同,可能得出的分类方法也不同。 类数据属性的识别: 每个对象的情况称为对象的属性,同类型的对象具有共同 的属性,只是每个对象的属性值不一定相同。属性是对一个对 象状态的描述,如“在馆图书类”,从流通管理的角度来看, 图书类:书名Title、作者名Author、分类号IndexCode、册 数Number、条码号BarCode等属性。 读者类:姓名Name、年龄Age、借书证编号Bozid等。 一个读者允许借阅若干册书,在此用一个Book类的 链表Bkp保存相应信息。另外对读者所借书册数要 统计,定义一个计数的成员Count; 借阅信息类:所借书book、借书人reader、操作员manager 13.1 数据分析和组织
13.1数据分析和组织 管理人员类:姓名Name、年龄Age、工号code等; 同一个类(对象),从不同的角度分析,或根据要求的不同, 描述它的属性也可能不一致。 类成员函数的设计: 就是对象的操作,在图书馆流通管理系统内,图书类应包 含为各属性赋值(set)的操作、读取条码( Getcode)和显示图 书基本信息(Show)的操作,另外还定义了缺省构造函数和拷贝 构造函数。读者类,需定义为各属性赋值(set)的操作、读取 借书证号的操作,借书和还书需要向所借书数组中添加或减少 书,定义 AddBook和 DelBooki两个操作,还有显示所借书的操 作 Show Books。 类的层次结构设计: 对于图书来说,我们知道,在图书馆中,一般有两类:书 籍和杂志,书籍具有图书的一般属性(书名、条码等共性)之 外,还有作者、分类号等特性
13.1 数据分析和组织 管理人员类:姓名Name、年龄Age、工号Code等; 同一个类(对象),从不同的角度分析,或根据要求的不同, 描述它的属性也可能不一致。 类成员函数的设计: 就是对象的操作,在图书馆流通管理系统内,图书类应包 含为各属性赋值(Set…)的操作、读取条码(GetCode)和显示图 书基本信息(Show)的操作,另外还定义了缺省构造函数和拷贝 构造函数。读者类,需定义为各属性赋值(Set…)的操作、读取 借书证号的操作,借书和还书需要向所借书数组中添加或减少 书,定义AddBook和DelBook两个操作,还有显示所借书的操 作ShowBooks。 类的层次结构设计: 对于图书来说,我们知道,在图书馆中,一般有两类:书 籍和杂志,书籍具有图书的一般属性(书名、条码等共性)之 外,还有作者、分类号等特性
13.7 数据分祈和组织 而杂志也是图书的一种,对于现刊,是以期为借阅单位,对于 过刊以卷( Volume)为借阅单位,为简化问题,我们只处理 过刊借阅,即以卷为借阅单位,每卷分配一个条码。与书籍的 不同之处在于,杂志没有单一的作者,只以刊名和卷号借阅。 书籍和杂志图书都有书(杂志)名、条码等共性,都有设置 条码、读取条码及显示等接口,提取二者的共性和公共接口, 定义一个图书类Book,作为基类。然后派生出Item书籍和 Magazine杂志两个类。Item有作者、分类号等特性, Magazine有卷号、语言等特性。 Book Item Magazine
13.1 数据分析和组织 而杂志也是图书的一种,对于现刊,是以期为借阅单位,对于 过刊以卷(Volume)为借阅单位,为简化问题,我们只处理 过刊借阅,即以卷为借阅单位,每卷分配一个条码。与书籍的 不同之处在于,杂志没有单一的作者,只以刊名和卷号借阅。 书籍和杂志图书都有书(杂志)名、条码等共性,都有设置 条码、读取条码及显示等接口,提取二者的共性和公共接口, 定义一个图书类Book,作为基类。然后派生出Item书籍和 Magazine杂志两个类。Item有作者、分类号等特性, Magazine有卷号、语言等特性。 Book Item Magazine
13.2类的定义 class Book I ∥/图书基类 protected char Title[40]; ∥书名 long code: ∥条码 int number. ∥1书的册数 public Book: Book(char *title, long code, int nb); void SetCode long code)i Code code; J void SetTitle(char* tii strcpy (Title, tI);y char*GetTitle(i return Title; long Getcodeoi return Code; 1 int GetNumber( return Number; y void ChangeNumber(int d if(Number==0 &&d <o) return; Number + d; y irtual void show();∥显示函数定义为虚函数 friend ostream &operator <<(ostream &os, Book &bk t Show 0; ∥重载借阅信息类插入符 - return os,] <心
13.2 类的定义 class Book { // 图书基类 protected: char Title[40]; // 书名 long Code; // 条码 int number; // 书的册数 public: Book(); Book(char *title, long code, int nb); void SetCode(long code) { Code = code; } void SetTitle(char* tl) { strcpy(Title, tl); } char *GetTitle() { return Title; } long GetCode() { return Code; } int GetNumber( return Number; } void ChangeNumber(int d) { if(Number == 0 && d < 0) return; Number += d; } virtual void Show(); // 显示函数定义为虚函数 friend ostream &operator << (ostream &os, Book &bk){ Show(); // 重载借阅信息类插入符 return os; } };
13.2类的定义 class Item public Book t ∥书籍类 char Author[20] ∥作者 char Index Code[10] ∥1分类号 public Temo 缺省构造函数 Item(char *author, char *title, char *index int code): Book(title, code)t 众 strcpy( Author, autho); ndexcode≡ index;∥构造函数 m tem it)t ∥拷贝构造函数 strcpy (Title, it Title); Code it Code; strcpy(Author, it. Author); IndexCode= it Index Code; void SetAuthor(char *) void Setlndex Code(char * void Show(t ∥1重定义显示函数 cout<“书名:”<Ttle≤“,作者:”<< Author<< endla
13.2 类的定义 class Item :public Book { // 书籍类 char Author[20]; // 作者 char IndexCode[10]; // 分类号 public: Item(); // 缺省构造函数 Item(char *author, char *title, char *index, int code):Book(title, code) { strcpy(Author, author); IndexCode = index; // 构造函数 Item(Item & it) { // 拷贝构造函数 strcpy(Title, it.Title); Code = it.Code; strcpy(Author, it.Author); IndexCode = it.IndexCode; } void SetAuthor(char *); void SetIndexCode(char *); void Show() { // 重定义显示函数 cout << “书名:” << Title << “, 作者:” << Author << endl; } };
13.2类的定义 class Magazine: public Book{∥杂志类 int volume enum lanG{cH|NESE=1, ENGLISH}Lang;∥语言种类 public: Magazine ( Book i Volume =0; Lang CHINESE; Type =1; 1 Magazine(char title, int vol, LANG lang, int code): Book(titlem code i Volume=vol;Lang=lang;}∥构造函数 MagazineMagazine ma) ∥拷贝构造函数 void SetVolume (int voli Volume vol; y void SetLangint lang)i Lang =(LANG)lang; void show( ∥重定义显示函数 {cout<“杂志名:”< Title<“卷号:”< Volume ≤≤endl;} 读者类要存储所借书。现在图书类一个派生类体系,它们的公共基 类Book提供了统一接口。可定义一个单链表来同时存储读者所借书籍 Item和杂志 Magazine。Book类有一个指向Book类的指针Next, 用来构成箱表
13.2 类的定义 class Magazine: public Book { // 杂志类 int Volume; enum LANG {CHINESE=1, ENGLISH} Lang; // 语言种类 public: Magazine ():Book() { Volume = 0; Lang = CHINESE; Type = 1; } Magazine (char * title, int vol, LANG lang, int code):Book(titlem code) { Volume = vol; Lang = lang; } // 构造函数 Magazine (Magazine & ma); // 拷贝构造函数 void SetVolume (int vol) { Volume = vol; } void SetLang (int lang ) { Lang = (LANG)lang; } void Show ( ) // 重定义显示函数 {cout << “杂志名:”<< Title<< “, 卷号:”<<Volume <<endl;} }; 读者类要存储所借书。现在图书类一个派生类体系,它们的公共基 类Book提供了统一接口。 可定义一个单链表来同时存储读者所借书籍 Item和杂志Magazine 。Book类有一个指向Book类的指针Next, 用来构成链表
13.2类的定义 class Reader i ∥读者类 protected: char Name[40];∥书名 long Bozid; ∥借书证编号 int Age; ∥1年龄 int Count: ∥借书数目 BkNode* Bkp; ∥借的书单向链表头指针 public Reader0; Reader(char *n, long bd, int agei strcpy(Name, n); Bozid bd; Age s age books NULL, count =0; void SetCount(int c)i Count=C, long Get Bkidoi return Bozid; 1 long Getcounto return Count:3
13.2 类的定义 class Reader { // 读者类 protected: char Name[40]; // 书名 long Bozid; // 借书证编号 int Age; // 年龄 int Count; // 借书数目 BkNode * Bkp; // 借的书单向链表头指针 public: Reader(); Reader(char *n, long bd, int age) { strcpy(Name, n); Bozid = bd; Age = age; books = NULL; count = 0; } void SetCount(int c) { Count = c; } long GetBkid() { return Bozid; } long GetCount() { return Count; }
13.2类的定义 void add Book(Book*bk){∥添加书籍 BkNode *p= new BKNode; p->Data bk; if(Bkp)i p→>Next=Bkp;∥插入表头, tems= p, Count + else i Bkp= p p->Next= NULL
13.2 类的定义 void AddBook(Book * bk) { // 添加书籍 BkNode *p = new BKNode; p->Data = bk; if(Bkp) { p->Next = Bkp; // 插入表头, items = p; Count ++; } else { Bkp = p; p->Next = NULL; } }
13.2类的定义 void delBook( long code){∥删除书籍 BkNode*p1=Bkp, *p2, while(p1)i f(p1→>Data-> Getcode==code){∥找到条码的书 p2→>next=p1>next delete p1 else p2=p1; p1=p1->next void show(0;∥显示函数定义为虚函数
void DelBook(long code) { // 删除书籍 BkNode *p1 = Bkp, *p2; while(p1) { if(p1->Data->GetCode == code) { // 找到条码的书 p2->next = p1->next; delete p1; } else { p2 = p1; p1 = p1->next; } } } void Show(); // 显示函数定义为虚函数 }; 13.2 类的定义