图书管理系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
outfile<<dl->data.id<<endl;
lnode *p;
p=dl;
for(int i=1;i<=dl->data.id;i++)
{
p=p->next;
outfile<<p->data.id<<" "<<p->data.num<<" "<<p->data.year<<" "<<p->data.month<<" "<<p->data.date<<endl;
{
int id;
int num;
int year;
int month;
int date;
}student;//定义"student"这个结构体,包括借阅证号和归还日期
typedef struct lnode
{
student data;
struct lnode *next;
}lnode,*linklist;//定义单链表的节点
参考书籍
《数据结构(C语言版)》严蔚敏李冬梅吴伟民编著
《C++程序设计》谭浩强编著
源程序
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
using namespace std;
typedef struct
{
int num;
string name;
string author;
int nowbook;
int allbook;
}book;//定义"book"这个数据类型,包括书号、书名、著作者、现存量和库存量这5个内容
typedef struct
{
book *elem;
int length;
}sxlist;//顺序表的存储结构
void insertsxlist(sxlist &l,book e)
{
cout<<"请输入新购书的内容,按照书号、书名、著作者、现存量、库存量的顺序输入"<<endl;
cin>>e.num>>e.name>>e.author>>e.nowbook>>e.allbook;
int j=judge(l,e);
int initsxlist(sxlist &l)
{
l.elem=new book[100];
if(!l.elem)
{
cout<<"储存分配失败"<<endl;
}
l.length=0;
return 0;
}//顺序表初始化
void getbookfile(sxlist &l)
{
ifstream infile("d:/book.txt",ios::in);
同时考虑到不会过多的增删书的种数,使用顺序表来组织book数据类型比较合适;而学生借书还书比较频繁,即增删比较频繁,所以使用单链表来组织student数据类型。顺序表和单链表的存储结构具体定义如下:
typedef struct
{
book *elem;
int length;
}sxlist;//顺序表的存储结构
if(j!=0)
{
l.elem[j-1].allbook=l.elem[j-1].allbook+e.allbook;
l.elem[j-1].nowbook=l.elem[j-1].nowbook+e.nowbook;
}
else
{
l.elem[l.length].num=e.num;
l.elem[l.length].name=e.name;
信息科学与技术学院
《数据结构》课程设计报告
题目名称:图书管理系统
学生姓名:任志彬
学 号: 2012508019
专业班级:2012级计科1班
指导教师:高攀
2014 年 1月 7 日
3 调试分析
概要设计
图书管理系统共有三个主要功能:
1.采编入库:新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;
return p;
}//定位操作,目的是找到与借阅证号匹配的地址
void dlistdelete(linklist &dl,sxlist &l,book e)
{
student s;
lnode *n=locatedelem(dl,s);
lnode *q=n->next;
n->next=q->next;
typedef struct lnode
{
student data;
struct lnode *next;
}lnode,*linklist;//单链表的存储结构
算法流程
调试分析
程序运行之前先在D盘建立book.txt这个文件,第一行只有一个数字,代表了书的种数,第二行以后第一列代表书号,第二列为书名,第三列为作者,第四列为现存量,第五列为库存量,建立如图内容。
dl->data.id++;
}//单链表的插入,目的是登记借阅证号,书号和归还日期
void lendbook(sxlist &l,book e,linklist &dl)
{
student s;
cout<<"请输入书号"<<endl;
cin>>e.num;
int j=judge(l,e);
l.elem[j-1].nowbook--;
2.借阅:如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;
3.归还:注销对借阅者的登记,改变该书的现存量。
根据功能需求,首先设计定义了book和student两个结构体,具体定义如下:
typedef struct
{
int num;
string name;
string author;
在D盘打开student.txt,可以看到根据输入得到的相应的输出。
设计总结
1.书这个结构体,关于线性表的选择,顺序表还是链表,斟酌了一下还是用顺序表,并不需要大量增删数据,顺序表比较好。
2.学生这个结构体还是用链表组织比较好,增删比较频繁。
3.11月30日搞了一上午,输出始终有问题,下午终于发现2个问题,一个是文件的路径格式问题,该用d:/book.txt,而我程序里的却是d:\book.txt.;另一个问题是主程序中的循环结构,按0退出,该直接用break退出循环,而我却用了exit(1)直接退出程序,导致结束程序之前没有运行savebookfile()函数,所以程序无法正常输出。
e.num=q->data.num;
delete q;
dl->data.id--;
int j=judge(l,e);
l.elem[j-1].nowbook++;
}//归还函数
void savestudentfile(linklist dl)
{
ofstream outfile("d:/student.txt",ios::out);
dlistinsert(dl,s);
}//借阅函数
lnode *locatedelem(linklist dl,student s)
{
cout<<"请输入借阅证号"<<endl;
cin>>s.id;
lnode *p;
p=dl;
while(p&&p->next->data.id!=s.id)
p=p->next;
4.关于这次的课程设计,收获挺大,在面对一个实际问题时,应该从问题的功能需求入手,在头脑中先模拟出程序运行的过程,思考出整个问题具体需要什么样的数据类型,根据实际问题的特点,考虑用合适的数据结构去组织数据类型,之后根据头脑中模拟出的程序运行过程,思考具体需要设计哪些算法和函数,只有思路清晰,才能顺利完成程序的编写。
for(int i=1;i<=l.elem[0].num;i++)
{
outfile<<l.elem[i].num<<" "<<l.elem[i].name<<" "<<l.elem[i].author<<" "<<l.elem[i].nowbook<<" "<<l.elem[i].allbook<<endl;
程序运行之前先在D盘建立student.txt这个文件,第一行只有一个数字,代表了借书的总人数。第二行第一列为借书证号,第二列为所借之书的书号,第三列为归还年份,第四列为归还月份,第五列为归还日期。建立如图内容。
如图所示,输入信息。最终结束程序。
在D盘打开book.txt,可以看到根据输入得到的相应的输出。
5.这次的编程主要是运用了数据结构中的顺序表和单链表中的相关知识,在完成程序的过程中又再一次巩固了我这方面的知识。
6.最后再说一句,课程设计确实是一个很考验人耐心与细心的项目,从周四晚上12点拿到课程设计题目到周日中午,花了相当于一个周末的时间,我基本上有空就坐在电脑前编程,周六除了吃饭,上选修,基本没出过宿舍,确实没有一定的忍耐力无法在短时间内完成这项工作。同时程序自然免不了出现一堆错误,有格式上的,也有逻辑上的,没有细心也是完不成任务的。
lnode *p;
p=dl;
lnode *m=new lnode;
m->next=p->next;
p->next=m;
m->data.id=s.id;
m->data.num=s.num;
m->data.year=s.year;
m->data.month=s.month;
m->data.date=s.date;
l.elem[l.length].author=e.author;
l.elem[l.length].nowbook=e.nowbook;
l.elem[l.length].allbook=e.allbook;
l.elem[0].num++;
l.length++;
}
}//采编入库函数
typedef struct
}
outfile.close();
}//将单链表中的数据写入student.txt中
void display()
{
cout<<"1.采编入库"<<endl;
int initdlist(linklist &dl)
{
dl=new lnode;
dl->next=NULL;
return 0;
}//初始化单链表
void getstudentfile(linklist &dl)
{
ifstream infile("d:/student.txt",ios::in);
infile>>dl->data.id;//单链表的头结点储存借阅者的人数
int nowbook;
int allbook;
}book;//定义"book"这个数据类型,包括书号、书名、著作者、现存量和库存量这5个内容
typedef struct
{
int id;
int num;
int year;
int month;
int date;
}student;//定义"student"这个结构体,包括借阅证号和归还日期
lnode *p;
p=dl;
for(int i=1;i<=dl->data.id;i++)
{
lnode *m=new lnode;
infile>>m->data.id>>m->data.num>>m->data.year>>m->data.month>>m->data.date;
m->next=NULL;
p->next=m;
p=m;
}
infile.close();
}//将student.txt中的数据读入程序,同时创建单链表
void dlistinsert(linklist &dl,student s)
{
cout<<"请输入借阅者信息,按照借阅证号,书号,年,月,日的顺序输入"<<endl;
cin>>s.id>>s.num>>s.year>>s.month>>s.date;
l.length++;
}
infile.close();
}//从book.txt中读取数据,同时创建顺序表
void savebookfile(sxlist l)
{
ofstream outfile("d:/bookБайду номын сангаасtxt",ios::out);
outfile<<l.elem[0].num<<endl;
infile>>l.elem[0].num;//顺序表的0号位置存放书的种数
l.length++;
for(int i=1;i<=l.elem[0].num;i++)
{
infile>>l.elem[i].num>>l.elem[i].name>>l.elem[i].author>>l.elem[i].nowbook>>l.elem[i].allbook;
}
outfile.close();
}//将顺序表中的数据写入book.txt中
int judge(sxlist &l,book e)
{
for(int i=1;i<l.elem[0].num+1;i++)
if(l.elem[i].num==e.num)
return i+1;
return 0;
}//判断新书是否存在于表中
相关文档
最新文档