数据结构课程设计--修道士野人问题和西文图书管理系统
- 格式:doc
- 大小:294.50 KB
- 文档页数:28
用C++语言实现图书管理系统摘要图书管理系统主要是对图书的录入、读者借阅、读者归还等功能进行实现.本课程设计的系统开发平台为Windows XP,程序设计语言为C++,程序运行平台为Windws98/2000/XP/Seven。
在程序设计中采用了B-树方法提高书籍的查找速度。
关键词程序设计;图书管理系统;C++;数据结构;B-树1 索引1.1课程设计目的设计一个小型的图书管理系统,可以实现新增图书,读者借阅,读者归还等功能。
1。
2。
系统性能要求能较快的查到所要查找的图书;能准确统计当前每种书的库存,以确定此书是否可以外借;并且对外借的图书进行管理,记录借出时间、应还时间等。
1.3。
功能的实现1)新书入库:确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;2) 借阅:如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;3)归还:注销对借阅者的登记,改变该书的现存量.2 系统详细设计及实现1.所用的知识体系在整个程序的设计过程当中,用到了C++的一些基础知识,面向对象的思想和结构化的程序设计思想.数据结构的B—树建立索引,用索引提高查找的效率等。
2。
系统功能组成框图3 . 系统功能模块划分4。
流程图 4。
1录入图书信息4.2借阅图书4。
3归还图书输入图书和读者信息处理归还图书功能,清读者的借阅记录,将图书的在库数加一5 功能实现5.1 运行程序的主界面图5—1 操作界面5。
2 新书入库功能的操作界面图5—2新书入库5.3 查询数据的界面图5-3查询书籍5。
4 查询所有书籍的界面图 5—4显示库存5.5 图书借阅的界面图5-5借阅书籍5。
6 还书的界面图5—6还书3 参考文献[1]谭浩强C语言设计(第三版)清华大学出版社[2] 严蔚敏吴伟民数据结构(C语言版)清华大学出版社[3] 谭浩强 C++ 程序设计清华大学出版社[4]参考网址/manual/zh/function。
数据结构课程设计图书管理系统在当今数字化的时代,图书管理系统对于图书馆的高效运作和管理至关重要。
作为数据结构课程设计的一部分,设计一个功能齐全、操作便捷的图书管理系统,不仅能够巩固我们所学的数据结构知识,还能提高我们解决实际问题的能力。
一、需求分析一个完善的图书管理系统应具备以下基本功能:1、图书信息管理:包括图书的书名、作者、出版社、出版年份、ISBN 号、分类号、库存数量等信息的录入、修改、查询和删除。
2、读者信息管理:记录读者的姓名、性别、身份证号、联系电话、借阅证号、借阅记录等,同时支持读者信息的增删改查。
3、借阅管理:实现读者的借书、还书操作,能够记录借阅日期和应还日期,并自动计算逾期天数和罚款金额。
4、图书查询:提供多种查询方式,如按书名、作者、出版社、分类号等进行精确或模糊查询,以便读者快速找到所需图书。
5、统计分析:能够统计图书的借阅次数、热门图书排行、读者借阅情况等,为图书馆的管理决策提供数据支持。
二、数据结构选择为了实现上述功能,我们需要选择合适的数据结构来存储和管理图书和读者的信息。
1、图书信息和读者信息可以使用结构体数组来存储。
结构体可以包含图书或读者的各项属性,数组则方便进行批量操作和遍历。
2、对于图书的分类和索引,可以使用二叉查找树或哈希表。
二叉查找树可以保证有序性,便于中序遍历获取排序后的图书信息;哈希表则能够快速定位特定的图书或读者,提高查询效率。
3、借阅记录可以使用链表来存储,便于动态地添加和删除借阅信息。
三、系统功能模块设计1、登录模块系统管理员和读者分别拥有不同的登录入口和权限。
管理员可以进行所有操作,读者只能进行查询和借阅相关操作。
2、图书管理模块图书录入:管理员输入图书的详细信息,将其添加到图书信息数组中。
图书修改:根据图书的 ISBN 号或其他唯一标识,修改图书的相关信息。
图书删除:按照指定条件删除图书记录。
图书查询:提供多种查询条件,快速检索图书信息。
数据库原理及应用——图书馆管理系统数据库设计一.需求分析需求分析的任务是调查应用领域,对应用领域中各应用的信息要求和操作要求进行详细分析,形成需求分析说明书。
重点是调查,收集与分析用户在数据管理中的信息要求、处理要求、数据的安全性与完整性要求。
功能模块设计将图书管理系统业务分为四个大的方面:学生数据管理、图书征订管理、藏书管理、图书流通管理。
功能模块图功能模块分析办卡、挂失、注销学生在图书馆中必须持卡办理一切业务,新生必须首先办理借书卡,当借书卡丢失时需办理挂失业务,毕业生或中途退学者必须办理注销卡业务,以防止借书卡的流失。
查询、借书、环书、注销学生在图书馆中持卡可以进行以下业务:查询自己借书状态,借书,还书,当所借书籍丢失时需办理注销业务。
图书查询、缺书登记学生需要查询自己所需书籍时,若馆中有则直接借书;若馆中没有,可以进行缺书登记。
数据流程分析与设计数据流程图数据字典的建立数据字典数据字典是我在数据流程图中选取的一些中层数据流,我把我所抽去的数据列出以下表来。
数据项二.概念结构设计E-R图根据前面的需求分析,可以将图书管理系统数据库实体划分为图书信息实体集、学生信息实体集、馆藏地实体集、借书卡信息实体集、缺书信息实体集,各实体集里还包含不同的实体以下包括所有的实体。
学生:{学号,姓名,性别,年级,学院,专业,班级}图书:{条码号,书名,作者,出版社,定价,馆藏地编号,图书状态,借阅状态}馆藏地:{馆藏地编号,馆藏地名称}借书卡:{卡号,卡状态,学号}缺书:{书名,作者,出版社,定价,搜索频率}学生日常事务信息:{卡号,时间,欠书状态,超时罚款} E-R图三.逻辑结构设计概念模型向关系模型的转变将E-R图转换为关系模型,即将实体、实体的属性和实体之间的联系转化为关系模式,为应用程序建立专门的视图而不必要应用程序直接访问数据表关系模式的设计StudentBookJieyue(应还时间—借书时间)等于一个月PlaceRountin对时间的检查,当借还书中的还书时间小于应还时间时,超时罚款为零;当超过应还时间未还书时,开始计费,超时罚款=(时间-应还时间)*0.01;当借还书中的还书时间确定时,超时罚款=(还书时间-应还时间)*0.01。
一、设计题目与要求【问题描述】设计一个计算机管理系统完成图书管理基本业务。
【基本要求】(1) 每种书的登记内容包括书号、书名、著作者、现存量和库存量;(2) 对书号建立索引表(线性表)以提高查找效率;(3) 系统主要功能如下:①采编入库:新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;②借阅:如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;③归还:注销对借阅者的登记,改变该书的现存量。
二、小组分工小组成员:小组分工:图书初始化、新书入库、登记读者信息、文件保存借书系统、还书系统图书信息查询、读者信息查询三、需求分析图书管理系统共需要八个模块,分别是1图书初始化、2新书入库、3添加读者信息、4借书模块、5还书模块、6查询图书信息、7查询读者信息、8退出。
我负责其中的四个模块,如下所示:1)图书初始化输入图书的一些信息,编号、作者、书名、数量,使有一定的库存。
2)新书入库新书采编入库,输入编号后如果有次数只需输入数量,没有则继续输入书名、作者、数量。
3)添加读者信息读者信息初始化,输入读书证号和姓名,只有输入书证号和姓名才能进行借书还书4)退出和文件保存退出读书管理系统并保存读者和图书信息。
四、概要设计图书信息和读者信息都采用结构体类型保存。
图书信息里面包括:图书编号、图书名称、作者、现有量、库存量、指向下一节点的指针。
读者信息里面包括:读者编号、读者姓名、借书数量、可借图书数量、指向下一节点的指针。
所有图书和读者都分别以链表的形式存储,并以编号为唯一主键。
采用链表形式便于数据的添加与删改。
主要的操作为:系统初始化,图书入库,读者信息登记,图书信息和读者信息文件的保存。
五、详细设计数据结构的定义:图书信息:typedef struct book{char book_num[10];char book_name[20];char book_writer[10];int book_xy;int book_kc;struct book *next;}BK;读者信息:typedef struct reader{char reader_num[10];char reader_name[10];int right;BO borrow[Max];struct reader *next;}RD;算法描述:进入系统后首先进行图书初始化,输入图书的信息。
数据结构课程设计图书管理系统设计图书管理系统一、引言图书管理系统是为了方便图书馆进行图书的管理、借阅和归还而开发的软件系统。
本文将详细介绍设计一个图书管理系统所需的标准格式文本。
二、系统概述本图书管理系统旨在提供一个高效、便捷的图书管理平台,帮助图书馆实现图书的分类、借阅、归还、查询等功能。
系统主要包括以下模块:图书管理模块、借阅管理模块、读者管理模块、系统管理模块。
三、图书管理模块1. 图书录入功能a. 系统管理员可以录入新书籍的相关信息,包括书名、作者、出版社、ISBN 号、价格等。
b. 系统应提供图书信息的校验功能,确保录入的图书信息准确无误。
c. 系统应提供图书封面图片上传功能,以便读者更直观地了解图书。
2. 图书查询功能a. 读者和管理员可以根据关键字、作者、出版社等条件进行图书查询。
b. 系统应提供模糊查询和精确查询两种方式,以满足不同用户的需求。
3. 图书借阅功能a. 读者可以通过系统查询图书的借阅情况,并选择借阅。
b. 系统应记录借阅信息,包括借阅时间、归还时间等。
4. 图书归还功能a. 读者在归还图书时,系统应自动计算借阅天数,并生成相应的借阅费用。
b. 系统应提供归还图书的操作记录,以便管理员查看。
四、借阅管理模块1. 借阅记录查询功能a. 管理员可以查询所有借阅记录,并根据条件进行筛选。
b. 系统应提供按照借阅时间、归还时间等进行排序的功能,方便管理员进行统计分析。
2. 借阅统计功能a. 系统应提供借阅数量、借阅率等统计功能,方便管理员对图书馆的借阅情况进行分析。
五、读者管理模块1. 读者注册功能a. 读者可以通过系统进行注册,并填写个人信息。
b. 系统应提供校验功能,确保读者信息的准确性。
2. 读者信息修改功能a. 读者可以通过系统修改个人信息,如联系方式、密码等。
3. 读者信息查询功能a. 读者可以查询自己的借阅记录、借阅情况等。
六、系统管理模块1. 管理员管理功能a. 系统管理员可以管理其他管理员的账号和权限。
数据结构课程设计图书管理系统Revised on November 25, 2020数据结构课程设计图书管理系统一需求分析该程序是模拟图书馆管理系统,实现图书采编入库、借书、还书、查询等基本业务。
此程序规定:(1) 管理员能够向系统中输入每种书的基本信息,包括书号、书名、作者、现存量和库存量、借阅记录,并保存记录;(2) 用户(读者)能够按书号、书名、作者查询图书信息;(3) 管理员能够实现图书采编入库(新购入一本书,经分类和确定书号之后登记到图书账目中去。
如果这种书在帐中已有,则只将总库存量增加)、借阅(如果书的现存量大于0,则借出一本,登记借阅者的图书证号和归还期限)、归还(删除对借阅者的登记,改变该书的现存量)、销毁(将图书从账目中删除)等操作。
二概要设计系统用到的抽象数据类型定义:1、ADT LinearList{数据元素:D={a i|a i∈D0,i=1,2,…,n,n≥0,D0为某一数据对象}关系:S={<a i,a i+1>|a i,a i+1∈D0,i=1,2,…,n-1}基本操作:(1)InitList(L)(2)DestroyList(L)(3)ClearList(L)(4)EmptyList(L)(5)ListLength(L)(6)Locate(L,e)(7)GetData(L,i)(8)InsList(L,i,e)(9)DelList(L,i,&e) }ADT LinearList2、ADT String{数据对象:D={ai |ai∈CharacterSet,i=1,2,…,n;n≧0}数据关系:R={<ai-1,ai>|ai-1,ai∈D,i=2,…,n;n≧0}基本操作:(1) StrAsign(S,chars)(2) StrInsert(S,pos,T)(3) StrDelete(S,pos,len)(4) StrCopy(S,T)(5) StrEmpty(S)(6) StrCompare(S,T)(7) StrLength(S)(8) StrClear(S)(9) StrCat(S,T)(10)SubString(Sub,S,pos,len)(11)StrIndex(S,pos,T)(12)StrReplace(S,T,V)(13)StrDestroy(S)}ADT String系统中的子程序和功能说明:InitBo(Book &boo);初始化图书信息InitRe(lend &Lin);初始化借阅者信息BinarySearch(Book boo,char SearchNum[]);二分法查找比较书号Buy(Book &boo, char BuyNum[]);新书采编入库系统Delete(Book &boo,char DeleteNum[]);清除图书信息系统Borrow(Book &boo,lend &Lin,char BorrowNum[],char CaNum[]);借阅图书处理系统Return(Book &boo,lend &Lin,char ReturnNum[],char BorrowerNum[]);归还图书系统SearchByNum(Book &boo,char SeaNum[]);按书号查找系统SearchByName(Book &boo);按书名查找系统SearchByAuth(Book &boo);按作者查询系统Menu();主菜单显示系统Search();查询系统子菜单main();主函数●系统程序功能结构图三详细设计●功能实现过程bool BinarySearch(Book boo,char SearchNum[]) ext=NULL;total++;/*总量加1*/}}void Delete(Book &boo,char DeleteNum[])/*清除图书信息*/{if(书库中没有此书)输出“无此书”;if(书库中有此书){strcpy(连续两本书的相关信息);现存量减1;库存量减1;}else 输出“此书已有借阅者,无法删除!”;}void Borrow(Book &boo,lend &Lin,char BorrowNum[],char CaNum[])/*借阅图书信息*/{if(没有找到此书) 输出“书库中无此书!”;if(书库中有此书){借出一本书后,该书的现存量减1;并在借阅记录链表中插入该条记录;再对应读者信息记录链表,如果已有该读者证号信息,直接在该链表中插入此次借阅记录;如果无该读者证号信息,申请新单链表存放借阅记录。
数据结构课程设计报告课程名称:数据结构课程设计课设题目: 西文图书管理系统教师姓名:郭艳本科生姓名:王瑞林本科生学号:20121002932班号:191124日期:2014年6月20日题号:十题目:西文图书管理1.需求分析图书管理系统对象有两个,包括读者和管理员。
读者的需求:借书,还书,续借,查询当前所借书籍还书截至日期,查询借阅历史,修改登陆密码。
其中借书可以根据书号和书名两种方式查询借阅。
管理员的需求:采编入库,清除库存,注册读者,删除读者,根据书号查询书籍,修改管理员用户名和密码。
2.设计2.1设计思想(1)数据与操作特性:有搜索,插入,删除操作。
而数据有:读者信息,书籍信息,读者借阅书籍历史信息,书籍读者借阅历史信息,读者当前所借书籍信息。
(2)数据结构设计:数据的逻辑结构有线性结构和树形结构。
根据书号和书名建立两个B-树,便于读者查询借阅,其中关键字设置为书籍指针,便于找到书籍后直接进行修改书籍信息。
读者和书籍的信息从文件中读取,由于会不断注册和删除读者以及新增删除书籍,因此书籍和读者的信息采用单链表存储。
读者的借阅历史和书籍的读者历史,都采用数组的形式存储,为了节省存储空间,每个借阅历史数组最大空间为15。
超过15个借阅历史,则删除最早的借阅历史。
2.2设计表示(1)数据类型定义typedef struct//日期结构体类型{int year;//记录年int month;//记录月int day;//记录日}Date;//记录借阅者所借书籍的信息结构体typedef struct{char bookID[15];//书号char name[15];//书名char writer[15];//作者Date bordate;//借阅时间Date backdate;//还书时间int flag;//是否续借,续借为1.否则为0}BookHistory;//记录借阅者当前所借书籍的信息结构体typedef struct{char bookID[15];//书号char name[15];//书名char writer[15];//作者Date bordate;//借阅时间Date lastdate;//最后还书期限int flag;//是否续借,续借为1.否则为0}BookRec;//记录书籍被借阅的读者记录typedef struct{char readerID[15];//记录读者的借阅证号char readername[15];//读者的名字Date bor;//记录读者的借书日期Date back;//记录读者的还书日期int flag;//借阅者是否有续借迹象(flag取值0或者1)}ReaderHistory;//记录读者信息的结构体类型(允许读者同时借阅五本书,每本书支持续借一次)typedef struct{char readerID[12];//记录读者的借书证号,一般是学号char name[15];//读者的名字char password[16];//读者登陆密码int bn;//读者现在所借书籍数量,最大数量为5本BookRec rec[5];//读者现在所借书籍int hn;//总借阅数量//R_LQueue *R_LQH;BookHistory bh[15];//记录读者的借阅记录,规定链式队列的最大节点个数为15,来节省空间}Reader;//记录书的信息的结构体类型typedef struct{char bookID[15];//书号char title[15];//记录书名char writer[15];//记录著者int currentnum;//书现存量int totalnum;//书总存量int bortimes;//被借的历史总次数//B_LQueue *B_LQH;ReaderHistory RH[15];//借书者记录,规定链式队列的最大节点个数为15,来节省空间}Book;//根据书名为关键字的B-树的结构体类型typedef struct Namenode//根据书名为关键字建立的B树{int n;//记录结点中的关键字(即书号)个数Book *key[MAXM];//key[0...n-1],Maxsize个关键字(即书名)域struct Namenode *par;//指向父结点的指针域struct Namenode *chd[MAXM];//ptr[0...n],MAXM个指向子结点的指针域}BTNamenode;typedef struct///根据书名建立的B树的搜索结果{BTNamenode *pt;////指向找到的节点指针int i;//所找关键字在节点里的位置int tag;//查找成功值为1,查找失败值为0}NameResult;//根据书号为关键字的B-树的结构体类型typedef struct IDnode//根据书号为关键字建立的B树{int n;//记录结点中的关键字(即书号)个数Book *key[MAXM];//key[0...n-1],Maxsize个关键字(即书号)域struct IDnode *par;//指向父结点的指针域struct IDnode *chd[MAXM];//ptr[0...n],MAXM个指向子结点的指针域}BTIDnode;typedef struct///根据书号建立的B树的搜索结果{BTIDnode *pt;////指向找到的节点指针int i;//所找关键字在节点里的位置int tag;//查找成功值为1,查找失败值为0}IDResult;//从文件中读取书籍数据后存储在单链表里typedef struct BookNode{Book SLbook;struct BookNode *next;}BookSLNode;//从文件中读取学生数据后存储在单链表里typedef struct ReaderNode{Reader SLreader;struct ReaderNode *next;}ReaderSLNode;2.3详细设计(1)登陆界面login():有管理员和读者登陆,都必须输入密码和用户名。
数据结构修道士野人渡河问题c语言代码以下是一个使用C语言解决修道士野人渡河问题的代码示例: ```c#include <stdio.h>#include <stdbool.h>#define MAX 100int num_of_missionaries;int num_of_cannibals;int num_of_boats;int left_missionaries;int left_cannibals;int right_missionaries;int right_cannibals;bool left_bank;void initialize() {left_missionaries = num_of_missionaries;left_cannibals = num_of_cannibals;right_missionaries = 0;right_cannibals = 0;left_bank = true;}bool is_valid_state(int missionaries, int cannibals) {if (missionaries < 0 || cannibals < 0) {return false;}if (missionaries > 0 && cannibals > missionaries) {return false;}if (left_bank) {int new_left_missionaries = left_missionaries - missionaries;int new_left_cannibals = left_cannibals - cannibals;int new_right_missionaries = right_missionaries + missionaries;int new_right_cannibals = right_cannibals + cannibals; if ((new_left_missionaries >= 0 && new_left_cannibals >= 0) ||(new_right_missionaries >= 0 && new_right_cannibals >= 0)) {if ((new_left_missionaries == 0 ||new_left_missionaries >= new_left_cannibals) &&(new_right_missionaries == 0 || new_right_missionaries >= new_right_cannibals)) {return true;}}}else {int new_left_missionaries = left_missionaries + missionaries;int new_left_cannibals = left_cannibals + cannibals;int new_right_missionaries = right_missionaries - missionaries;int new_right_cannibals = right_cannibals - cannibals; if ((new_left_missionaries >= 0 && new_left_cannibals >= 0) ||(new_right_missionaries >= 0 && new_right_cannibals >= 0)) {if ((new_left_missionaries == 0 ||new_left_missionaries >= new_left_cannibals) &&(new_right_missionaries == 0 || new_right_missionaries >= new_right_cannibals)) {return true;}}}return false;}void move(int missionaries, int cannibals) {if (left_bank) {left_missionaries -= missionaries;left_cannibals -= cannibals;right_missionaries += missionaries;right_cannibals += cannibals;}else {left_missionaries += missionaries;left_cannibals += cannibals;right_missionaries -= missionaries;right_cannibals -= cannibals;}left_bank = !left_bank;}void print_state() {printf("Left Bank: %d missionaries, %d cannibals" " left_missionaries, left_cannibals);printf("Right Bank: %d missionaries, %d cannibals" "" right_missionaries, right_cannibals);}void solve(int missionaries, int cannibals, int depth) { if (missionaries == 0 && cannibals == 0) {print_state();return;}for (int i = 0; i <= num_of_boats; i++) {if (is_valid_state(missionaries, cannibals) &&is_valid_state(i, num_of_boats - i)) {move(missionaries, cannibals);solve(missionaries - i, cannibals - (num_of_boats - i), depth + 1);move(-missionaries, -cannibals);}}}int main() {printf("Enter the number of missionaries: " scanf("d" &num_of_missionaries);printf("Enter the number of cannibals: " scanf("d"&num_of_cannibals);printf("Enter the number of boats: " scanf("d"&num_of_boats);initialize();printf("nSolution:""n"" solve(num_of_missionaries, num_of_cannibals, 0);return 0;}```这个代码使用了回溯法来解决修道士野人渡河问题。
课程设计报告课设课题:课程设计——图书管理系统学院:电子信息学院专业:网络工程姓名:班级学号:BX1213指导教师:张艳报告日期:2013.12.12目录一、需求分析 (1)1.1 系统开发背景和意义 (1)1.2 设计题目与要求 (1)二、总体结构设计 (2)三、各子模块设计 (3)3.1 初始化图书信息 (3)3.2 系统主界面 (3)3.3 采编入库 (4)3.4 输入读者信息 (4)3.5 借阅图书 (4)3.6 归还图书 (6)3.7 查询图书信息 (7)3.8 查询读者信息 (8)四、程序设计调试情况分析 (9)五、测试结果 (11)5.1 欢迎界面 (11)5.2 初始化图书信息 (11)5.3 系统主界面 (11)5.4 采编入库 (12)5.5 输入读者信息 (13)5.6 借阅图书 (14)5.7 归还图书 (15)5.8 查询图书信息 (15)5.9 查询读者信息 (16)5.10 保存文件,退出 (18)六、总结 (19)七、参考文献 (20)八、附录(源代码) (21)一、需求分析1.1 系统开发背景和意义图书管理作为计算机应用的一个分支,有着手工管理无法比拟的优点,如检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。
这些优点能够极大地提高图书管理的效率。
因此,开发一套能够为用户提供充足的信息和快捷的查询手段的图书管理系统,将是非常必要的,也是十分及时的。
图书管理系统需要满足来自图书馆工作人员、普通用户和借阅者三方面人员的需求。
图书馆工作人员对图书借阅者的借阅及还书要求进行操作,同时还可通过图书编号等查询相应的借阅情况;普通用户的需求是查询图书馆所存的图书的相关情况;图书借阅者的需求是查看自己的相关信息及查询自己的借阅情况。
1.2 设计题目与要求【问题描述】设计一个计算机管理系统完成图书管理基本业务。
【基本要求】1) 每种书的登记内容包括书号、书名、著作者、现存量和库存量;2) 对书号建立索引表(线性表)以提高查找效率;3) 系统主要功能如下:*采编入库:新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;*借阅:如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;*归还:注销对借阅者的登记,改变该书的现存量。
一、需求分析1. 图书管理系统中图书管理模块包括图书类型定义:书号、现存量、总存量,出版时间为整型,定价为浮点型,书名、著者名为字符型,借阅指针、预约指针为读者类型;读者类型定义:证号为整型、姓名为字符型,另外借阅类型和预约类型组合成其中的共用体类型。
B树(2-3树)类型定义:关键字个数和关键字数组为整型、另外还有指向双亲的指针、指向子树的指针、记录单元指针;B树查找结果类型定义:节点指针、关键字序号和查找标志变量为整型。
2. 演示程序以用户和计算机的对话方式进行,在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,相应的输入数据和运算结果显示在后面。
该演示系统,没有使用文件,全部数据放在内存存放。
四项基本业务都以书号为关键字进行的,采用了B树(2-3树)对书号建立索引,以提高效率。
3.图书管理系统实现功能:①采编入库:新书购入,将书号、书名、著者、册数、出版时间添加入图书账目中去,如果这种书在帐中已有,则只将总库存量增加,每新增一个书号则以凹入表的形式显示B树现状。
②清除库存:实现某本书的全部信息删除操作,每清除一个书号则已以凹入表的形式显示B树现状。
③图书借阅:如果书的库存量大于零时则执行出借,登记借阅者的图书证号和姓名,系统自动抓取当前借阅时间和计算归还时间。
④图书预约:如果某书库存为零,则记录预约者姓名和证号,系统自动抓取当前预约时间和取书时间。
⑤图书归还:注销借阅者信息,并改变该书的现存量。
⑥作者专区:输入作者名字,系统将查找相应作者全部著作并显示出来。
⑦图书信息:可以根据书号查阅此书基本信息、借阅信息和预约信息,亦可以查找全部图书基本信息。
二、概要设计1.抽象数据类型B树定义:ADT BTree{数据对象:D是具有相同特性的数据元素的集合。
各个数据元素均含有类型相同,可惟一标识数据元素的关键字。
数据关系:数据元素同属于一个集合并且:一棵m阶的B树,或为空,或为满足下列特性的m叉树:树中每个结点至多有m棵子树;若根结点不是叶子结点,则至少有两棵子树;除根之外的所有非终端结点至少有m/2(取上限)棵子树;所有的非终端结点包含下列信息数据:(n,A0,K1,A1,K2,A2,K3,……,Kn,An)其中:Ki(i=1,2,……n)为关键字,且Ki<Ki+1(i=1,2,……n-1);Ai(i=0,……n)为指向子树根结点的指针,且指针Ai-1所指子树中所有结点的关键字均小于Ki(i=1,2,……n),An所指子树中所有结点的关键字均大于Kn,n(m/2(取上限)-1<=n<=m-1)为关键字的个数基本操作:SearchBTree(T ,key);初始条件:B树T存在,key为和关键字类型相同的给定值。
广东某某学院《数据结构课程设计》题目:图书馆管理系统学号:姓名:年级:学院:专业:指导教师:目录一、问题描述与基本要求1.1问题描述1.2基本要求二、数据结构的设计2.1数据结构的选择三、软件模块结构图3.1大体模块关系图3.2各模块具体分析四、程序流程图五、源程序六、调试分析6.1程序错误修改及完善的过程6.2最终程序所有功能运行结果6.3测试数据七、用户使用手册八、心得体会一、问题描述与基本要求1.1问题描述设计一个计算机管理系统完成图书管理基本业务。
1.2基本要求1、每种书的登记内容包括书的编号、书名、著作者、现存量、库存量、书证号和归还日期。
2、建立空链表,以提高查找效率3、系统功能如下:图书入库:新购一种书,确定书号后,登记到图书账目表中,如果表中已有,则只将库存量增加;借阅:如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;归还:注销对借阅者的登记,改变该书的现存量。
二、数据结构设计2.1数据结构的选择用单链表的结构,通过编写相应功能函数来实现建立新结点、删除结点、修改结点中数据域的内容、输出结点数据域中的内容等功能。
2.2单链表的定义先定义单链表结点的数据域,数据域包括书的编号、书名、作者、现存量、库存量、书证号和归还日期;链表结点包括结点数据域和结点链域,最后再定义指向链表结点的指针。
以下为单链表的相关定义:typedef struct bookdata//定义结点数据域{int id;//书的编号char title[15];//书名char author[6];//作者int count;//现存量int stock;//库存量char figure[20];//书证号char deadline[10];//归还时期}bookdata;typedef struct node//定义链表结点{bookdata Data;//结点数据域struct node *next;//结点链域}booknode;typedef booknode *booklist;//指向链表结点的指针2.3重要函数的定义及说明1、void initlist(booklist &l)//建立空链表2、void insertlist(booklist &l)//插入链表结点,实现登陆功能(需要输入书的编号,以确定登陆书名)3、void deletelist(linklist &l)//删除链表结点,实现删除功能(需要输入书的编号,以确定删除的书名)4、void find(booklist l)//查找书的编码,实现查找功能(需要输入书的编号,以确定查找的书名)5、void lend(booklist l)//借阅图书,实现借阅功能(需要输入书的编号,以确定借阅的书名)6、void dele(booklist l)//删除录入借书的信息,实现删除录入借书的功能(需要输入书的编号,以确定删除录入的书名)7、void add(booklist l)//查找有没有相同的书籍8、void begin()//开始进入图书管理系统9、void Introduction()//介绍图书管理系统的功能10、void About()//图书管理系统的相关开发内容11、void welcome()//欢迎进入图书管理系统以下为重要函数的定义;void initlist(booknode *&l)//建立空链表{l=new booknode;l->next=NULL;}void insert(booknode *&l)//图书馆添加书籍(定刚开始图书馆零本书){booknode *q;booknode *p=l;int k=1;for(;p->next!=NULL;p->next){}//移动指针找到最后一个节点while(k==1){q=new booknode;cout<<"请输入书的编号(书号为0结束):"<<endl;cin>>q->id;if(p->id!=0){cout<<"请输入书名"<<endl;cin>>q->title;cout<<"请输入作者"<<endl;cin>>q->author;cout<<"请输入图书数量"<<endl;cin>>q->stock;q->next=p->next;p->next=q;}cout<<"请输入是否继续(1.继续/0.退出)"<<endl;cin>>k;}}void find(booknode *&l)//查找书的编码{int x,mark=0;booknode *p=l;cout<<"请输入该书的编号"<<endl;cin>>x;for(;p!=NULL;p=p->next){if(p->id==x){cout<<"查找成功!"<<endl;cout<<"此书的名称为:"<<p->title<<endl;cout<<"此书的作者是:"<<p->author<<endl;cout<<"此书的数量为:"<<p->stock<<endl;mark=1;}}if(mark==0){cout<<"对不起,图书馆没有这本书"<<endl;}}void lend(booknode *&l)//借阅图书{booknode *p=l;booknode *p2;p2=new booknode;int num,mark=0;char bookname[10];cout<<"请输入要查找书的名称"<<endl;cin>>bookname;for(;p!=NULL;p=p->next){if(strcmp(p->title,bookname)==0){cout<<"查找成功"<<endl;cout<<"请输入书证号"<<endl;cin>>p2->figure;cout<<"请输入归还日期"<<endl;cin>>p2->deadline;num=p->count;num=num-1;p->count=num;mark=1;}}if(mark==0){cout<<"对不起,图书馆没有这本书"<<endl;}}void dele(booknode *&l)//删除录入借书的信息{booknode *p=l,*q;char stuname[15];cout<<"请输入书证号"<<endl;cin>>stuname[15];while(p!=NULL){if(strcmp(p->figure,stuname)==0){q->next=p->next;delete p;p=q->next;//p=p->next;}}//q=p->next;//p->next=q->next;cout<<"注销成功"<<endl;}/*void add(booknode *&l)//查找有没有相同的书籍,{int r,mark=0;booknode *p=l;cout<<"请输入该书的编号"<<endl;cin>>r;while(p!=NULL){if(p->id=r)//表示有同种书就只增加库存量{int number=0,o;number=p->stock;cout<<"请输入添加书的数量"<<endl;cin>>o;number=number+o;p->stock=number;cout<<"该书的库存量为:"<<endl;cout<<p->stock;p=p->next;mark=1;}else//表示没有同种书就开辟空间存入信息{booknode *p1;p1=new booknode;cout<<"请输入书的编号"<<endl;cin>>p1->id;cout<<"请输入作者"<<endl;cin>>p1->author;cout<<"请输入书的数量"<<endl;cin>>p1->count;p1->next=p->next;p->next=p1;}}}*/三、软件模块结构图3.2各模块具体分析链表插入模块具体分析如下:链表删除模块具体分析如下:主函数链表插入模块链表删除模块 链表查找、借阅、模块链表显示模块InsertList(L) scanf( )p ->book.nodeP ->P ->book.authorP ->book.stockDeleteList(L)scanf( )s,stuname链表查找、借阅模块链表输出模块具体分析如下:Search(L) scanf( )i,booknodem,nP ->book.stockp -> P ->book.authoP2->figure P2->deadline Booknode(L)scanf( )p ->book.node,P -> P ->book.author,P ->book.count四、程序流程图输入5,谢谢使用输入4,删除借阅图书信息输入3,借阅图书输入2,查找图书信息输入6,退出管理系统输入1,录入图书信息结束D4C3BA 21输入数字,选择功能功能表与编号选择1-6InitList(B)主函数main( )开始1—>A4—>D五源程序#include<iostream>#include<string>#include<string.h>using namespace std;typedef struct node//定义链表节点{int id;//书的编号char title[10];//书名char author[10];//作者int count;//现存量int stock;//库存量char figure[20];//书证号char deadline[10];//归还时期struct node *next;}booknode;//typedef booknode *booklist;void initlist(booknode *&l)//建立空链表{l=new booknode;l->next=NULL;}void insert(booknode *&l)//图书馆添加书籍(定刚开始图书馆零本书){booknode *q;booknode *p=l;int k=1;for(;p->next!=NULL;p->next){}//移动指针找到最后一个节点while(k==1){q=new booknode;cout<<"请输入书的编号(书号为0结束):"<<endl;cin>>q->id;if(p->id!=0){cout<<"请输入书名"<<endl;cin>>q->title;cout<<"请输入作者"<<endl;cin>>q->author;cout<<"请输入图书数量"<<endl;cin>>q->stock;q->next=p->next;p->next=q;}cout<<"请输入是否继续(1.继续/0.退出)"<<endl;cin>>k;}}void find(booknode *&l)//查找书的编码{int x,mark=0;booknode *p=l;cout<<"请输入该书的编号"<<endl;cin>>x;for(;p!=NULL;p=p->next){if(p->id==x){cout<<"查找成功!"<<endl;cout<<"此书的名称为:"<<p->title<<endl;cout<<"此书的作者是:"<<p->author<<endl;cout<<"此书的数量为:"<<p->stock<<endl;mark=1;}}if(mark==0){cout<<"对不起,图书馆没有这本书"<<endl;}}void lend(booknode *&l)//借阅图书{booknode *p=l;booknode *p2;p2=new booknode;int num,mark=0;char bookname[10];cout<<"请输入要查找书的名称"<<endl;cin>>bookname;for(;p!=NULL;p=p->next){if(strcmp(p->title,bookname)==0){cout<<"查找成功"<<endl;cout<<"请输入书证号"<<endl;cin>>p2->figure;cout<<"请输入归还日期"<<endl;cin>>p2->deadline;num=p->count;num=num-1;p->count=num;mark=1;}}if(mark==0){cout<<"对不起,图书馆没有这本书"<<endl;}}void dele(booknode *&l)//删除录入借书的信息{booknode *p=l,*q;char stuname[15];cout<<"请输入书证号"<<endl;cin>>stuname[15];while(p!=NULL){if(strcmp(p->figure,stuname)==0){q->next=p->next;delete p;p=q->next;//p=p->next;}}//q=p->next;//p->next=q->next;cout<<"注销成功"<<endl;}/*void add(booknode *&l)//查找有没有相同的书籍,{int r,mark=0;booknode *p=l;cout<<"请输入该书的编号"<<endl;cin>>r;while(p!=NULL){if(p->id=r)//表示有同种书就只增加库存量{int number=0,o;number=p->stock;cout<<"请输入添加书的数量"<<endl;cin>>o;number=number+o;p->stock=number;cout<<"该书的库存量为:"<<endl;cout<<p->stock;p=p->next;mark=1;}else//表示没有同种书就开辟空间存入信息{booknode *p1;p1=new booknode;cout<<"请输入书的编号"<<endl;cin>>p1->id;cout<<"请输入作者"<<endl;cin>>p1->author;cout<<"请输入书的数量"<<endl;cin>>p1->count;p1->next=p->next;p->next=p1;}}}*/void begin(){booknode *l;initlist(l);int k;do{cout<<"******************************************"<<endl;cout<<" 欢迎您使用图书管理系统"<<endl;cout<<" 请选择"<<endl;cout<<"1. 添加图书信息"<<endl;cout<<"2. 查找图书信息"<<endl;cout<<"3. 借阅图书"<<endl;cout<<"4. 删除借阅图书信息"<<endl;cout<<"5. 增加图书"<<endl;cout<<"6. 退出系统"<<endl;cout<<"请选择"<<endl;cin>>k;switch(k){case 1:insert(l);break;case 2:find(l);break;case 3:lend(l);break;case 4:dele(l);break;case 5://add(l);//break;case 0:cout<<"******谢谢使用,再见******"<<endl;exit(0);default:cout<<"输入有误!!"<<endl;break;}}while(k!=0);}void Introduction(){cout<<" 系统介绍"<<endl;cout<<"****************************"<<endl;cout<<" 本系统主要实现图书信息"<<endl;cout<<" 增加添加查找借阅显示"<<endl;cout<<"****************************"<<endl;}void About(){cout<<" 开发人员"<<endl;cout<<"****************************"<<endl;cout<<"********** 冯翔**********"<<endl;cout<<"********** 李建超**********"<<endl;cout<<"********** 陈宥君**********"<<endl;cout<<"********** 袁美琪**********"<<endl;cout<<"****************************"<<endl;}void welcome(){while(1){int y;cout<<"************************************************"<<endl;cout<<" 欢迎使用图书管理系统"<<endl;cout<<"1. 管理系统"<<endl;cout<<"2. 开发人员"<<endl;cout<<"3. 系统简介"<<endl;cout<<"4. 退出"<<endl;cout<<"************************************************"<<endl;cin>>y;switch(y){case 1:begin();break;case 2:About();break;case 3:Introduction();break;case 4:exit(0);default:cout<<"输入有误"<<endl;system("pause");}}}int main(){welcome();return 0;}6.1程序错误修改及完善的过程我这次的课程设计题目是根据我们小组选择的,当看到这个题目时,我觉得还算比较简单,因为我之前数据结构实验就做过单链表的插入、删除、查找、输出,而这次活期图书管理系统要求的录入、查找、借阅、归还、库存量信息等功能,即可用单链表的相关功能函数来实现,于是我修改了之前写过的单链表的一些函数,以满足这次题目的要求,但在实验过程中仍出现了一些错误。
图书管理信息系统一、课程设计题目:图书管理信息系统二、课程设计内容:实现图书管理信息系统的设计。
这是一个数据结构的综合使用,涉及的知识比较全面,特别是对文件的使用更为全面。
进入系统后,操作员可进行系统维护、读者管理、图书管理、图书流通、退出系统等操作。
系统维护:有“初始化”和“读盘”两个重要操作。
第一次开始运行时,必须选择“初始化”,使有关文件指针、计数器等初始化为0;而在以后的每次操作开始时,选择“读盘”,将保存过的相关图书信息磁盘文件读入,以便进行各类操作。
读者管理:可实现读者信息的追加一项输入。
需要输入读者号、读者名、可借书数。
输入“y”可连续输入信息,若输入“n”则结束输入,退出读者管理。
图书管理:有“图书信息输入”和“图书信息查询”两个重要操作。
若选“图书信息输入”,就进入相关子模块,在输入信息的同时建立相应的索引及索引文件和索引链头文件,输入书号、书名、作者名、出版社、分类号、藏书量等信息,根据提示输入“y”实现连续输入,若输入“n”则结束输入,退出图书管理;有了图书信息数据之后,就可以进行图书信息的查询以及图书借阅等操作了。
若选“图书信息查询”,可根据提示按书号、书名、作者、出版社等进行查询,系统会将查询结果输出。
图书流通:有“借书处理”和“还书处理”两个重要操作。
当选择“借书处理”,系统接受输入信息后,首先查询读者文件。
若没查到,显示“非法读者!”,若查到,则再检查该读者书是否已借满,如果未借满,则继续检查图书文件;否则显示“书已借满!”。
检查图书文件如发现书号不存在或书已借出,都会提示读者“非法书号!”或“书已借出”,否则,进行借出处理,修改借阅文件、读者文件以及图书主文件的相关数据项,并显示“借书成功!”。
当选择“还书处理”,系统在接受输入信息之后,首先用书号查询借还书文件,若找到,则填入还书日期,然后再用书号查询图书主文件,修改借出数,用读者号查找读者文件,修改读者的借书数,而后显示“还书成功!”,否则显示“非法书号!”并返回主控菜单。
数据结构课程设计课程设计说明书个人书籍管理系统起止日期:2010年6月1日至2011年6月20日目录一.问题分析—————————————————— 3 二.功能函数—————————————————— 4 三.程序基本框架图—————-—————————— 5 四.总结与心得——————————————-——— 6 五.程序截图—————————————-————— 7 六.源代码——————————————————-— 9问题分析学生在自己的学习和生活中会拥有很多的书籍,对所购买的书籍进行统计和分类是一种良好的习惯。
可以便于对这些知识资料的整理和查找使用。
如果用文件来存储相关的各种信息,包括分类,购买日期,价格,出版社信息等。
辅之一程序来使用这些文件对里面的书籍信息进行统计和查询的工作使得书籍管理工作变得轻松而有趣。
简单的个人书籍管理系统的开发就是为了解决这个实际的问题。
这个程序具备如下的功能:1.存储书籍各种相关的信息,可以随时增加书籍。
2.提供查找功能,按多种关键码查找需要的书籍。
3.提供排序的功能,按多种关键码对所有的书籍进行排序,例如按照购买日期进行排序。
4.提供删除的功能,可以把一些已丢失的从书籍库中删除。
5.为软件设置打开密码。
功能函数Check()函数:软件打开时检查E盘中的code.txt文件来进行密码验证。
Menu()函数:主菜单函数。
包含以下子函数:1.input函数:录入。
2.print函数:显示已录入的信息。
3.add函数:追加录入。
4.search函数:查询功能(包括search_name和search_price函数)。
5.delete函数:删除记录。
6.rank函数:排序功能(包括rank_data和rank_price函数)。
7.password函数:设置软件打开密码。
8.write函数:作者信息。
程序基本框架图书籍录入追加显示查询删除排序加密作者信息按书名查按价格查按书价排按购买日期排密码验证总结与心得数据结构一向是一门难学难懂的课程,其课程设计也一直是一件头疼的事,虽然如此,但是在我们做课程设计的过程中,感觉学到了许多的东西。
题号题目3、修道士与野人问题1、需求分析n个修道士和n个野人渡河,只有一条小船,能容纳c人,两种人都会划船,建立过河方式。
满足:野人无法侵犯修道士。
这就要求无论在何处,修道士的个数不得少于野人的人数(除非修道士个数为0)。
设计程序模拟该过程。
程序的输入为修道士(野人)的个数以及每条船容纳人的个数。
输出为判断是否可以安全渡河。
如果能,则给出一个小船来回次数最少的最佳方案。
要求:(1)用一个三元组(x1,x2,x3)表示渡河过程中各个状态。
其中,x1表示起始岸上修道士个数,x2表示起始岸上野人个数,x3表示小船位置(0——在目的岸,1——在起始岸)。
例如(5,3,0)表示起始岸上有5个修道士,3个野人,小船在目的岸一边。
(2)采用邻接表做为存储结构。
最短路径搜索采用广度搜索法。
(3)输出最优解若问题有解(能渡过河去),则输出一个最佳方案。
用三元组表示渡河过程中的状态,并用箭头指出这些状态之间的迁移:目的状态←…中间状态←…初始状态。
若问题无解,则给出“渡河失败”的信息。
(4)求出所有的解。
2、设计2.1设计思想(1)数据结构设计:根据题目要求,用图形结构,用邻接表来存储结点,以及结点之间的关系,同时在广度优先遍历中利用到队列。
(2)算法设计:先定义一个图利用邻接表储存结构,再举出在船上修道士和野人的所有情况,然后判断其修道士是否处于安全的状态,如果安全则将该点添加到图中,点添加完后在看两点之间是否连通如果连通则可将边添加到图中,这样就创建出了图,然后分别利用广度搜索和深度搜索来完成题目的要求。
2.2(1(2)函数接口规则说明int Search(AdjLGraph *G,int x,int y,int m ) /*查找起始和最后的结点,其中x,y,m分别表示起始岸修道士人数,野人人数和船的状态*/int Checking(DataType x) /*检查修道士是否安全,x表示邻接表中的一个结点*/int Connect(AdjLGraph *G,int i,int j) /*将能走通的点连接起来,i,j为图中的两个结点*/ void Creat(AdjLGraph *G) /*图的创建*/int Print(AdjLGraph G) /*从后向前打印最短路径*/int BroadFSearch(AdjLGraph G,int u,int v) /*用广度优先遍历搜索最短路径,u表示起始结点,v表示最后的结点*/void Print1(AdjLGraph G) /*打印输出所有最短路径*/void DFS(AdjLGraph G,int u,int v ,int visited[]) /*利用深度搜索找出所有最短路径,u表示起始结点,v表示最后的结点,visited[]用来标记结点是否被访问*/2.3详细设计首先是定义邻接表typedef struct{int daoshi; //道士int yeren; //野人int ship; //船的位置}DataType;typedef struct Node //边结点的结构体{int dest; //邻接边的弧头顶点序号struct Node *next; //单链表的下一个结点指针}Edge;typedef struct{DataType data; //顶点数据元素int source; //弧尾顶点序号Edge *adj; //邻接边的头指针}AdjLHeight;typedef struct{AdjLHeight a[200]; //邻接表数组int numOfVerts; //顶点个数int numOfEdges; //边个数}AdjLGraph; //邻接表结构体同时定义了几个全局变量,便于函数的直接利用int n,c;//修道士和野人人数为n,船能容纳人数为cint Path[200]; //保存结点的后驱结点int Path1[200]; //保存结点的前驱结点利用上述结构和相关函数可以构造出图,然后对图进行利用;然后在广度优先遍历搜索中用到了队列typedef struct{int queue[200];int rear;int front;int count;}SeqCQueue;最后通过主函数main调用各函数得到相关信息int main(){AdjLGraph G;int visited[200]; //标记结点是否被访问printf("输入小船可装的人数:\n");while(scanf("%d",&c)!=EOF){memset(Path,0,sizeof(0));memset(visited,0,sizeof(visited));memset(Path1,0,sizeof(Path1));N=0;printf("输入野人或修道士的个数:\n");scanf("%d",&n);AdjInitiate(&G);Creat(&G);v1=Search(&G,n,n,1);v2=Search(&G,0,0,0);if(BroadFSearch( G,v1, v2)==0)printf("渡河失败\n");else{printf("输出所有最短路径的情况:\n");DFS(G,v1,v2,visited);printf("共有%d种情况\n",N);}printf("输入小船可装的人数:\n");}return 0;}3、调试分析在进行运行的时候,曾出现了打印输出错误,经过一步一步调试,发现在插入结点的时候出现了插入错误,即没有考虑到结点后驱的改变,通过改正,重新运行检测,运行结果正确,在排版时通过一步步调试,能够使输出结果很明显的表示的船的方案。
河南科技大学课程设计说明书课程名称数据结构课程设计题目个人书籍管理系统的设计与实现院系_____班级___学生姓名__指导教师日期___数据结构课程设计任务书指导教师:时间:个人书籍管理系统的设计与实现一、简介1.设计目的:进一步理解查找和排序在实际系统要使用的数据结构以及施加在这些数据结构上的算法,锻炼自己运用所学数据结构的知识来解决实际问题的综合能力。
2.问题的描述:学生在自己的学习和生活中会拥有很多的书籍,对所购买的书籍进行分类和统计是一种良好的习惯。
可以便于对这些知识资料的整理和查找使用。
如果用文件来存储相关书籍的各种信息,包括分类、购买日期、价格、简介等等,辅之以程序来使用这些文件对里面的书籍信息进行统计和查询的工作将使得这种书籍管理工作变的轻松而有趣。
简单个人书籍管理系统的开发就是为了解决这个实际问题的。
二、数据结构的设计:typedef struct{char name[20]; //书名int data; //购买书的日期char author[10]; //作者int idnumber; //书的编号int price; //书的价格char publish[15]; //出版社char remarks[30]; //备注}BOOK;三、功能(函数)设计:功能函数模块划分void main() //主函数void input() //输入书的信息void print() //显示全部书的信息void search() //查找书的信息void deleted() //删除书的信息void sort() //对书的信息进行排序四、界面设计:这是进入系统时的界面,四周用*围起来使得程序中间的文字显的比较突出,也比较美观。
五、程序设计:(1)主函数main()的的流程图:(2)输入函数input()流程图(3)显示函数print()流程图(4)查找函数search()的流程图(5)排序函数sort()的流程图六、运行与测试:1、测试的数据及其结果:2、运行与测试期间遇到的问题及其解决办法(1)在处理排序这个函数的时候,一开始排序的结果一直出不来,我看了好久都没有发现错误,当我进行单步调试后,我才发现我其中有个for循环陷入了死循环,发现错误后我再把for 循环中的参数稍微的进行了修改,然后排序的结果就能出来,我发现其实那个结果其实我马虎造成的,以后一定要避免这种情况的发生。
题号题目3、修道士与野人问题1、需求分析n个修道士和n个野人渡河,只有一条小船,能容纳c人,两种人都会划船,建立过河方式。
满足:野人无法侵犯修道士。
这就要求无论在何处,修道士的个数不得少于野人的人数(除非修道士个数为0)。
设计程序模拟该过程。
程序的输入为修道士(野人)的个数以及每条船容纳人的个数。
输出为判断是否可以安全渡河。
如果能,则给出一个小船来回次数最少的最佳方案。
要求:(1)用一个三元组(x1,x2,x3)表示渡河过程中各个状态。
其中,x1表示起始岸上修道士个数,x2表示起始岸上野人个数,x3表示小船位置(0——在目的岸,1——在起始岸)。
例如(5,3,0)表示起始岸上有5个修道士,3个野人,小船在目的岸一边。
(2)采用邻接表做为存储结构。
最短路径搜索采用广度搜索法。
(3)输出最优解若问题有解(能渡过河去),则输出一个最佳方案。
用三元组表示渡河过程中的状态,并用箭头指出这些状态之间的迁移:目的状态←…中间状态←…初始状态。
若问题无解,则给出“渡河失败”的信息。
(4)求出所有的解。
2、设计2.1设计思想(1)数据结构设计:根据题目要求,用图形结构,用邻接表来存储结点,以及结点之间的关系,同时在广度优先遍历中利用到队列。
(2)算法设计:先定义一个图利用邻接表储存结构,再举出在船上修道士和野人的所有情况,然后判断其修道士是否处于安全的状态,如果安全则将该点添加到图中,点添加完后在看两点之间是否连通如果连通则可将边添加到图中,这样就创建出了图,然后分别利用广度搜索和深度搜索来完成题目的要求。
2.2(1(2)函数接口规则说明int Search(AdjLGraph *G,int x,int y,int m ) /*查找起始和最后的结点,其中x,y,m分别表示起始岸修道士人数,野人人数和船的状态*/int Checking(DataType x) /*检查修道士是否安全,x表示邻接表中的一个结点*/int Connect(AdjLGraph *G,int i,int j) /*将能走通的点连接起来,i,j为图中的两个结点*/ void Creat(AdjLGraph *G) /*图的创建*/int Print(AdjLGraph G) /*从后向前打印最短路径*/int BroadFSearch(AdjLGraph G,int u,int v) /*用广度优先遍历搜索最短路径,u表示起始结点,v表示最后的结点*/void Print1(AdjLGraph G) /*打印输出所有最短路径*/void DFS(AdjLGraph G,int u,int v ,int visited[]) /*利用深度搜索找出所有最短路径,u表示起始结点,v表示最后的结点,visited[]用来标记结点是否被访问*/2.3详细设计首先是定义邻接表typedef struct{int daoshi; //道士int yeren; //野人int ship; //船的位置}DataType;typedef struct Node //边结点的结构体{int dest; //邻接边的弧头顶点序号struct Node *next; //单链表的下一个结点指针}Edge;typedef struct{DataType data; //顶点数据元素int source; //弧尾顶点序号Edge *adj; //邻接边的头指针}AdjLHeight;typedef struct{AdjLHeight a[200]; //邻接表数组int numOfVerts; //顶点个数int numOfEdges; //边个数}AdjLGraph; //邻接表结构体同时定义了几个全局变量,便于函数的直接利用int n,c;//修道士和野人人数为n,船能容纳人数为cint Path[200]; //保存结点的后驱结点int Path1[200]; //保存结点的前驱结点利用上述结构和相关函数可以构造出图,然后对图进行利用;然后在广度优先遍历搜索中用到了队列typedef struct{int queue[200];int rear;int front;int count;}SeqCQueue;最后通过主函数main调用各函数得到相关信息int main(){AdjLGraph G;int visited[200]; //标记结点是否被访问printf("输入小船可装的人数:\n");while(scanf("%d",&c)!=EOF){memset(Path,0,sizeof(0));memset(visited,0,sizeof(visited));memset(Path1,0,sizeof(Path1));N=0;printf("输入野人或修道士的个数:\n");scanf("%d",&n);AdjInitiate(&G);Creat(&G);v1=Search(&G,n,n,1);v2=Search(&G,0,0,0);if(BroadFSearch( G,v1, v2)==0)printf("渡河失败\n");else{printf("输出所有最短路径的情况:\n");DFS(G,v1,v2,visited);printf("共有%d种情况\n",N);}printf("输入小船可装的人数:\n");}return 0;}3、调试分析在进行运行的时候,曾出现了打印输出错误,经过一步一步调试,发现在插入结点的时候出现了插入错误,即没有考虑到结点后驱的改变,通过改正,重新运行检测,运行结果正确,在排版时通过一步步调试,能够使输出结果很明显的表示的船的方案。
4、用户手册在VC下运行,很简单的输入,只需输入野人和道士的人数N和船能承载的人的个数C即可。
5、测试数据及测试结果(1)输入修道士和野人的人数n=6,船能容纳的人c=2,;不能安全渡河;测试结果:(2)输入修道士和野人人数为n=3,船能容纳的人c=2;渡河成功测试结果:输出一种最短路径输出所有最短路径输出最短路径数目:6、源程序清单#include <stdio.h>#include <stdlib.h>#include <string.h>#include <malloc.h>int n,c;//修道士和野人人数为n,船能容纳人数为c int Path[200];//保存结点的后驱结点int Path1[200];//保存结点的前驱结点typedef struct{int daoshi; //道士int yeren; //野人int ship; //船的位置}DataType;typedef struct Node //边结点的结构体{int dest; //邻接边的弧头顶点序号struct Node *next; //单链表的下一个结点指针}Edge;typedef struct{DataType data; //顶点数据元素int source; //弧尾顶点序号Edge *adj; //邻接边的头指针}AdjLHeight;typedef struct{AdjLHeight a[200]; //邻接表数组int numOfVerts; //顶点个数int numOfEdges; //边个数}AdjLGraph; //邻接表结构体void AdjInitiate(AdjLGraph *G) //初始化{int i;G->numOfEdges=0; //图的边数G->numOfVerts=0; //顶点数for(i=0;i<200;i++){G->a[i].source=i;G->a[i].adj=NULL;}}void InsertVertex(AdjLGraph *G,int i,DataType x) //插入顶点{if (i>=0&&i<200){G->a[i].data.daoshi=x.daoshi;//修道士人数G->a[i].data.yeren=x.yeren;//野人人数G->a[i].data.ship=x.ship;//船的状态G->numOfVerts++;}else printf("顶点越界\n");}void InsertEdge(AdjLGraph *G,int i,int j) //插入边{Edge *p;if(i<0||i>=G->numOfVerts||j<0||j>=G->numOfVerts){printf("参数i或j越界出错!\n");return;}p=(Edge*)malloc(sizeof(Edge));//申请邻接边单链表结点空间p->dest=j;//置邻接边弧头序号p->next=G->a[i].adj;//G->a[i].adj=p;G->numOfEdges++;}void AdjDestroy(AdjLGraph *G)//释放指针内存空间{int i;Edge *p,*q;for(i=0;i<G->numOfVerts;i++) //依次释放内存空间{p=G->a[i].adj;while(p!=NULL){q=p->next;free(p);p=q;}}}//队列typedef struct{int queue[200];int rear;int front;int count;}SeqCQueue;//初始化void QueueInitiate(SeqCQueue *Q){Q->rear=0;Q->front=0;Q->count =0;}//非空否int QueueNotEmpty(SeqCQueue Q){if(Q.count!=0) return 1;else return 0;}//入队列int QueueAppend(SeqCQueue *Q,int x){if(Q->count>0&&Q->rear==Q->front){printf("队列已满无法插入!\n");return 0;}else{Q->queue[Q->rear]=x;Q->rear=(Q->rear+1)%200;Q->count++;return 1;}}//出队列int QueueDelete(SeqCQueue *Q,int *d){if(Q->count==0){printf("队列已空无数据元素出队列!\n");return 0;}else{*d=Q->queue[Q->front];Q->front=(Q->front+1)%200;Q->count--;return 1;}}//取队头数据元素int QueueGet(SeqCQueue Q,int *d){if(Q.count==0){printf("队列已空无数据元素可取!\n");return 0;}else{*d=Q.queue[Q.front];return 1;}}//查找起始和最后的结点int Search(AdjLGraph *G,int x,int y,int m ){int i;for(i=0;i<G->numOfVerts;i++)if(G->a[i].data.daoshi==x&&G->a[i].data.yeren==y&&G->a[i].data.ship==m)return i;return -1;}int Checking(DataType x)//检查修道士是否安全{if((x.daoshi>=x.yeren||x.daoshi ==0)&&((n-x.daoshi)>=(n-x.yeren)||x.daoshi ==n)&& x.daoshi >=0&&x.daoshi <=n&&x.yeren >=0&&x.yeren<=n)return 1;else return 0;}//将能走通的点连接起来int Connect(AdjLGraph *G,int i,int j){int m;m=(G->a[i].data.daoshi-G->a[j].data.daoshi)+(G->a[i].data.yeren-G->a[j].data.yeren);if(G->a[i].data.ship==0&&G->a[j].data.ship==0||G->a[i].data.ship==1&&G->a[j].data.ship==1) return 0; //两个结点都在此岸或都在对岸,不连通else if(G->a[i].data.ship==1&&G->a[j].data.ship==0) //从起始岸到目的岸人数要减少{if(G->a[j].data.daoshi>G->a[i].data.daoshi||G->a[j].data.yeren>G->a[i].data.yeren)//----------如果J结点的道士或野人的个数比开始船没从I开到J时还大时return 0;if(G->a[j].data.daoshi==G->a[i].data.daoshi&&G->a[j].data.yeren==G->a[i].data.yeren) return 0;if(m>c)return 0;//------------船上的人超重return 1;}else if(G->a[i].data.ship==0&&G->a[j].data.ship==1){//-----------------------从终点到起始最后人应该有所增加if(G->a[j].data.daoshi<G->a[i].data.daoshi||G->a[j].data.yeren<G->a[i].data.yeren) //----------如果J结点的道士或野人的个数比开始船没从I开到J时还小时return 0;if(G->a[j].data.daoshi==G->a[i].data.daoshi&&G->a[j].data.yeren==G->a[i].data.yeren)return 0;if((-1)*m>n)return 0;//------------船上的人超重return 1;}return 0;}//创建图void Creat(AdjLGraph *G){int i,j,k,m;m=0;DataType x;for(k=0;k<=1;k++)//船有两种情况,在对岸和在起始岸{for(i=0;i<=n;i++)for(j=0;j<=n;j++){x.daoshi=i;x.yeren=j;x.ship=k;if(Checking(x)==1){InsertVertex(G,m,x);m++;}}}for(i=0;i<G->numOfVerts;i++)for(j=0;j<G->numOfVerts;j++)if(Connect(G,i,j)){InsertEdge(G,i,j);}}int N; //渡河成功的总次数int M; //最短路径int v1; //起始点int v2; //终点//从后向前打印最短路径int Print(AdjLGraph G){int k,i=0;printf("(%d %d %d)<-----",G.a[v2].data.daoshi,G.a[v2].data.yeren,G.a[v2].data.ship);for(k=Path1[v2];k!=v1;k=Path1[k]){i++;printf("(%d %d %d)<------",G.a[k].data.daoshi,G.a[k].data.yeren,G.a[k].data.ship);}printf("(%d %d %d)\n",G.a[v1].data.daoshi,G.a[v1].data.yeren,G.a[v1].data.ship);return i;}//用广度优先遍历搜索最短路径int BroadFSearch(AdjLGraph G,int u,int v){Edge *p;int visit[200];//标记点是否被访问int w,z;memset(visit,0,sizeof(visit)); //对数组visit[200]清零SeqCQueue Q;visit[u]=1;QueueInitiate(&Q);QueueAppend(&Q,u);while(QueueNotEmpty(Q)){QueueDelete(&Q,&w);p=G.a[w].adj;while(p!=NULL){z=p->dest;if(z==v){Path1[z]=w;//---------------保存前驱printf("输出一种最短路径的情况\n");M=Print(G);return 1;}else if(!visit[z]) //结点j未被访问过{Path1[z]=w;visit[z]=1;QueueAppend(&Q,z);}p=p->next;}}return 0;}void Print1(AdjLGraph G){int k,j;int i=0;DataType a1[200];memset(a1,0,sizeof(a1));for(k=Path[v1];k!=v2;k=Path[k]){a1[0]=G.a[v1].data;a1[i+1]=G.a[k].data;i++;}if(i==M){a1[i+1]=G.a[v2].data;N++;printf("(%d %d %d)",G.a[v1].data.daoshi,G.a[v1].data.yeren,G.a[v1].data.ship);for(j=1;j<=M+1;j++){printf("-->(%d %d)-->(%d %d %d)",abs(a1[j].daoshi-a1[j-1].daoshi),abs(a1[j].yeren-a1[j-1].yeren) ,a1[j].daoshi,a1[j].yeren,a1[j].ship);}printf("\n");}}//利用深度搜索找出所有最短路径void DFS(AdjLGraph G,int u,int v ,int visited[]){Edge *p;int w;visited[u]=1;p=G.a[u].adj;while(p!=NULL){w=p->dest;if(w==v){Path[u]=w;//-----记下当前结点的后驱Print1(G);}else if(visited[w]==0) {Path[u]=w;//找后驱,保存下来DFS(G,w,v,visited);}p=p->next;}visited[u]=0;}int main(){AdjLGraph G;int visited[200]; //标记结点是否被访问printf("输入小船可装的人数:\n");while(scanf("%d",&c)!=EOF){memset(Path,0,sizeof(0));memset(visited,0,sizeof(visited));memset(Path1,0,sizeof(Path1));N=0;printf("输入野人或修道士的个数:\n");scanf("%d",&n);AdjInitiate(&G);Creat(&G);v1=Search(&G,n,n,1);v2=Search(&G,0,0,0);if(BroadFSearch( G,v1, v2)==0)printf("渡河失败\n");else{printf("输出所有最短路径的情况:\n");DFS(G,v1,v2,visited);printf("共有%d种情况\n",N);}printf("输入小船可装的人数:\n");}return 0;}题号题目6、西文图书管理系统1、需求分析图书管理基本业务活动包括:对一本书的采编入库、清除库存、借阅和归还等等。