数据结构课程设计--修道士野人问题和西文图书管理系统
数据结构课程设计-图书管理系统

用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语言解决修道士野人渡河问题的代码示例: ```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;}```这个代码使用了回溯法来解决修道士野人渡河问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题号题目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、需求分析图书管理基本业务活动包括:对一本书的采编入库、清除库存、借阅和归还等等。