基于C语言图书管理系统包含源代码.docx
《基于C语言图书管理系统包含源代码.docx》由会员分享,可在线阅读,更多相关《基于C语言图书管理系统包含源代码.docx(44页珍藏版)》请在冰豆网上搜索。
![基于C语言图书管理系统包含源代码.docx](https://file1.bdocx.com/fileroot1/2023-7/5/78dc7ebb-4707-489a-b9aa-a0199d4a7511/78dc7ebb-4707-489a-b9aa-a0199d4a75111.gif)
基于C语言图书管理系统包含源代码
图书馆管理系统设计报告
(数据结构)
山东科技大学
小组分工说明
小组编号题目:
____图书馆管理系统
小组分工情况:
徐倩:
用户模块的主要设计
徐振华:
管理员模块的设计以及用户注册模块的设计
组长签字:
指导教师对课程设计的评价
成绩:
指导教师签字:
年月日
1、需求分析
1.1、系统概述
一直以来人们使用传统的人工方式管理图书馆的日常工作,对于图书馆的借书和还书过程,想必大家都已很熟悉。
在计算机尚未在图书馆广泛使用之前,借书和还书过程主要依靠手工。
一个最典型的手工处理还书过程就是:
读者将要借的书和借阅证交给工作人员,工作人员将每本书上附带的描述书的信息的卡片和读者的借阅证放在一个小格栏里,并在借阅证和每本书贴的借阅条上填写借阅信息。
这样借书过程就完成了。
还书时,读者将要还的书交给工作人员,工作人员根据图书信息找到相应的书卡和借阅证,并填好相应的还书信息,这样还书过程就完成了。
以上所描述的手工过程的不足之处显而易见,首先处理借书、还书业务流程的效率很低,其次处理能力比较低,一段时间内,所能服务的读者人数是有限的。
利用计算机来处理这些流程无疑会极大程度地提高效率和处理能力。
我们将会看到排队等候借书、还书的队伍不再那么长,工作人员出错的概率也小了,读者可以花更多的时间在选择书和看书上。
为方便对图书馆书籍、读者资料、借还书等进行高效的管理,特编写该程序以提高图书馆的管理效率。
使用该程序之后,工作人员可以查询某位读者、某种图书的借阅情况,还可以对当前图书借阅情况进行一些统计,给出统计表格,以便全面掌握图书的流通情况。
图书管理系统是一种基于集中统一规划的数据库数据管理新模式。
在对图书、读者的管理,其实是对图书、读者数据的管理。
本系统的建成无疑会为管理者对图书管理系统提供极大的帮助。
图书管理系统是图书馆的重要组成部分,一般分为两大部分,流通系统和采购系统。
采购系统分为订单管理、图书入库、图书著录、图书上架、新书上报和书目审查、系统设置。
流通系统分为图书管理、读者管理、借阅证管理、图书借阅、图书归还、系统设置等模块。
其中,图书借阅、图书归还等。
核心模块为采购系统:
图书入库、图书上架;流通系统:
图书管理、读者管理、借阅证管理。
1.2实现功能
(1)管理员模块
建立一个图书馆管理信息数据库文件,输入若干图书的记录,建立一个以书号为关键字的索引文件以及相关的索引链头文件。
实现a:
采编入库,新采购一种书,经分类和确定书号后登陆图书账目中去。
如果这种书已经存在,则在数目存量加入增加数量。
b:
清除入库。
某种书已无保留价值,将它将图书账目中删去。
c:
增加用户及注销用户(本人所作的附加内容,绝无抄袭)
d:
发布公告(本人所作的附加内容,绝无抄袭)
e:
修改密码(本人所作的附加内容,绝无抄袭)
(2)用户模块
建立关于书号,书名,作者及出版社的图书馆查询。
实现图书的借还子系统,包括建立书的读者文件,借还文件,读者管理及图书借还等相关出处理。
实现a:
借阅,如果一种书的现存大于零,则借出一本书,登记借书的帐号和还书日期。
b:
归还:
注销对借还读者的登记,改变该书的现存量。
c:
查询书目及个人借书情况(附加内容)
d:
查看公告(附加内容)
e:
修改密码及个人信息(附加内容)
(3)用户注册(附加内容)
让用户建立自己的账号
1.3模块结构
由上述内容的实现功能,作出如下结构图:
1.4程序流程图
(1)主函数流程图
(2)管理员模块流程图
(3)用户模块流程图
2.设计概要
2.1.数据结构体设计
typedefstructBook{//书目种类结构体,内容存储在book.txt文件
charnum[10];//书目种类编号
charname[20];//书名
charwritor[20];//作者
charpub[30];//出版社
chartotal[3];//总数量
charleft[3];//在馆数量
};
typedefstructNum{//书目详细结构体,根据书目种类而生成的详细书目信息,存储////在booknum.txt文件内
charbkid[15];//书目ID如果一书书目种类编号是001,总数量是3,则自动//、、//生成书目ID为001001、001002、001003而入库
charname[20];//对应于书名
charlocation[10];//该书的在馆位子如5445-667
charpid[20];//如果该书被借出,则存储借书的用户编号否则为“在馆”状态
chartime1[10];//若该书被借出,存储最晚还书时间否则为“在馆”
charstatus[15];//在馆状态
};
typedefstructBlist{//书目种类信息的链表
structBookbook;
structBlist*next;
};
typedefstructNlist{//详细书目信息链表
structNumnum;
structNlist*next;
};
typedefstructPerson//用户信息结构体,存储在person..txt文件内
{
charpid[20];//用户ID、主键
charpname[20];//用户名字
charphone[15];//用户电话
charaddress[40];//用户地址
charcounter[2];//已经借书数量
charpassword[12];//登入密码
};//
typedefstructPlist{//用户信息链表
structPersonperson;
structPlist*next;
};//
typedefstructAdmin{//管理员信息结构体存储在admin.txt文件内
charname[20];//管理员名字,也是登入账号
charcode[20];//登入密码
};//
typedefstructNew{//公告信息结构体存储在new.txt文件内
charnewid[8];//公告编号
chartitle[20];//公告主题
};
typedefstructAlist{//管理员信息链表
structAdminadmin;
structAlist*next;
};//
2.2.函数功能、参数说明
(1)管理员模块的函数
intadmcode();//管理员登录密码验证
intAddperson();//管理员增加用户
intAddbook();//管理员增加书目信息
voidadminmenu();//管理员主菜单
voidAdminSeek();//管理员查询书目
voidModifybk();//管理员修改书目信息
voidAdModifycode();//管理员修改密码
voidPubnews();//管理员发布信息
voidDeletbk();//管理员删除书目信息
voidDeletp();//管理员删除用户信息
intFindpid(char*num);//查找用户id
(2)用户模块的函数
char*Deadline();//得到用户还书时间
intusercode();//用户登录密码验证
voidBorrow(char*num,structNlist*head2);//用户借书操作
voidMyinfo();//用户查看借书信息
voidusermenu();//用户主菜单
voidSeekborrow();//用户查找书目信息
intFind(char*num,char*pass);//用户登录认证信息
intshownew();//用户查看公告列表
voidreadnew();//用户查看公告
voidMdmyinfo();//用户修改个人信息
voidModifycode();//用户修改信息
voidReturn();//用户还书操作
voidGiveback(char*num);//用户个人还书细节函数
(3)注册用户模块函数
intRegperson();//注册新用户
(4)公共函数
structBlist*Initbooklist();//初始化书目种类信息列表
structNlist*Initnumlist();//初始化书目详细信息列表
structAlist*Initadminlist();//初始化管理员信息列表
structPlist*Initpersonlist();//初始化用户信息列表
structNewlist*Initnewlist();//初始化公告列表
intSavebknum(structNlist*head);//保存书目详细信息
intSavebk(structBlist*head);//保存书目种类信息
voidMenulog();//主菜单
intFindnum(char*num);//查找图书书号
intShowdail(char*num);//显示图书编号为num的详细信息
intFindbkname(char*bkname);//查找图书书名
intFindpub(char*bkname);//查找图书出版社
intFindwriter(char*bkname);//查找图书作者
intSavepeople(structPlist*head);//保存用户信息
2.3主函数程序
voidmain()
{while
(1)
{
Menulog();//主菜单:
管理员登入、用户登入、注册用户
}
}
3.详细设计
3.1管理员模块主要函数的实现
intadmcode()//管理员登录密码验证,用户登录密码验证同理不做过多解释
{
FILE*fp;
charinputname[20],inputcode[20],c;
intflag=0,j=0;
structAdminadmin;
printf("\t\t*********************************************\n");
printf("\n");
printf("\t\t\t请输入你的用户名:
");
scanf("%s",inputname);//输入登录用户名
printf("\n\t\t*********************************************\n");
printf("\n\n");
printf("\t\t\t请输入密码:
");
c=getch();//输入登录密码
if(c!
='\r')printf("*");
while(c!
='\r')
{
inputcode[j++]=c;
c=getch();
if(c!
='\r')printf("*");//实现用‘*’来隐藏真实密码
elseinputcode[j]='\0';
}
printf("\n");
fp=fopen("admincode.txt","r");
while(!
feof(fp))
{
fscanf(fp,"%s%s",admin.name,admin.code);
if(strcmp(admin.name,inputname)==0&&strcmp(admin.code,inputcode)==0){flag=1;strcpy(idname,inputname);strcpy(code,admin.code);break;}//用户名密码进行比较
}
fclose(fp);
returnflag;//返回登录结果
}
intAddperson()//管理员增加用户
{
FILE*in;
inti,n;
structPersonp;
in=fopen("person.txt","a");
printf("\n\n\t\t\t\t请输入你要加入的用户个数:
");//管理员本次输入用户的个数
scanf("%d",&n);
for(i=0;iprintf("\t\t\t*输入用户ID:
");
scanf("%s",p.pid);
while(Findpid(p.pid)==1)//查看这个用户ID是否已经存在
{
puts("\t\t\tID号已经存在!
");
printf("\t\t\t*重新输入ID:
");
scanf("%s",p.pid);
}
printf("\t\t\t*输入用户的名字:
");
scanf("%s",p.pname);
printf("\t\t\t*输入用户电话:
");
scanf("%s",p.phone);
printf("\t\t\t*输入用户地址:
");
scanf("%s",p.address);
strcpy(p.password,p.phone);
strcpy(p.counter,"0");
fprintf(in,"%s%s%s%s%s",p.pid,p.pname,p.phone,p.address,p.password,p.counter);
}
fclose(in);
return1;
}
intAddbook()//管理员增加书目信息
{
FILE*in1,*in2;
inti,n,j,total;
charch[4];
charnu[15];
structBookb;
structNumnm;
in1=fopen("book.txt","a");
in2=fopen("booknum.txt","a");
printf("\n\t\t请输入你要加入书目的种数:
");
scanf("%d",&n);
for(i=0;iprintf("\t\t\t第%d本书的信息\n\n",i+1);
printf("\t\t\t*输入书本ID:
");
scanf("%s",b.num);
while(Findnum(b.num)==1)//查看这个书目种类编号是否已经存在
{
puts("\t\t\tID号已经存在!
");
printf("\t\t\t*重新输入ID:
");
scanf("%s",b.num);
}
printf("\t\t\t*输入书名:
");
scanf("%s",b.name);
printf("\t\t\t*输入书的数量:
");
scanf("%s",b.total);
printf("\t\t\t*输入书的出版社:
");
scanf("%s",b.pub);
printf("\t\t\t*输入书的作者:
");
scanf("%s",b.writor);
printf("\t\t\t*输入书所在位置:
");
scanf("%s",nm.location);
strcpy(nm.pid,"无人借阅");
strcpy(nm.status,"在馆");
strcpy(nm.time1,"在馆");
strcpy(nm.name,b.name);
strcpy(b.left,b.total);
total=atoi(b.total);
fprintf(in1,"%s%s%s%s%s%s\n",b.num,b.name,b.writor,b.pub,b.total,b.left);
for(j=1;j<=total;j++){
ch[0]=j/100+'0';
j=j%100;
ch[1]=j/10+'0';
ch[2]=j%10+'0';
ch[3]='\0';
strcpy(nu,ch);
strcpy(nm.bkid,b.num);
strcat(nm.bkid,nu);
fprintf(in2,"%s%s%s%s%s%s\n",nm.bkid,nm.name,nm.status,nm.location,nm.pid,nm.time1);
}
}
fclose(in1);
fclose(in2);
return1;
}
voidModifybk(){//管理员修改书目信息
charnum[15];
charbkname[20];
charwriter[20];
charpub[30];
intflag=0;
intl,t,ad;
charch[3];
structNlist*head2,*p2;
structBlist*head,*p;
head=Initbooklist();
head2=Initnumlist();
p2=head2;
p=head;
printf("\n\t\t\t请要修改的书目编号:
");
scanf("%s",num);
while(head!
=NULL)
{
if(strcmp(num,head->book.num)==0)
{
flag=1;
puts("--------------------------该书的原始信息----------------");
printf("编号\t书名\t\t作者\t\t出版社\t剩余数量\n");
puts("------------------------------------------");
printf("%-12s%-16s%-12s%-12s\t%-3s\n",head->book.num,head->book.name,head->book.writor,head->book.pub,head->book.left);
puts("\n--------------------------开始输入的新的信息----\n");
printf("\n\t\t\t请输入新的书名:
");
scanf("%s",bkname);
printf("\n\t\t\t请输入新的作者名:
");
scanf("%s",writer);
printf("\n\t\t\t请输入新的出版社名:
");
scanf("%s",pub);
printf("\n\t\t\t请输入新增的数量:
");
scanf("%d",ad);
l=atoi(head->book.left);
t=atoi(head->book.total);
t=t+ad;
l=l+ad;
itoa(1,ch,10);
strcpy(head->book.left,ch);
itoa(t,ch,10);
strcpy(head->book.total,ch);
strcpy(head->book.name,bkname);
strcpy(head->book.writor,writer);
strcpy(head->book.pub,pub);
while(head2!
=NULL)
{
if(strncmp(num,head2->num.bkid,strlen(head2->num.bkid)-3)==0)
{
strcpy(head2->num.name,bkname);
}
head2=head2->next;
}
puts("\n------------------------信息修改成功--\n");
}
head=head->next;
}
if(flag==0)
{printf("\n\n\t\t\t编号为%s的书不存在!
!
!
!
!
!
\n\n",num);}
Savebk(p);
Savebknum(p2);
}
voidAdModifycode(){//管理员修改密码,用户修改密码同理不做过多解释
charcode1[20];
charcode2[20];
charc;
intj=0;
structAlist*head,*head2;
head=Initadminlist();
head2=head;
puts("\n\n\t\t\t开始修改密码\n\n");
printf("\n\n\t\t\t请输入原始密码:
");
scanf("%s",code1);
if(strcmp(code,code1)==0)
{
printf("\n\n\t\t\t请输入新密码:
");
c=getch();
if(c!
='\r')printf("*");
while(c!
='\r')
{
code1[j++]=c;
c=getch();
if(c!
='\r')printf("*");
elsecode1[j]='\0';
}
printf("\n\n\t\t\t请再一次输入新密码:
");
c=getch();
j=0;
if(c!
='\r')printf("*");
while(c!
='\r')
{
code2[j++]=c;
c=getch();
if(c!
='\r')printf("*");
elsecode2[j]='\0';
}
if(strcmp(code1,code2)==0)
{
while(head!
=NULL)
{
if(strcmp(idname,head->admin.name)==0){
strcpy(hea