图书管理数据结构课程设计.docx
《图书管理数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《图书管理数据结构课程设计.docx(33页珍藏版)》请在冰豆网上搜索。
![图书管理数据结构课程设计.docx](https://file1.bdocx.com/fileroot1/2023-2/23/cffe385a-8ca2-4681-83a4-40f080b1b878/cffe385a-8ca2-4681-83a4-40f080b1b8781.gif)
图书管理数据结构课程设计
潍坊学院计算机工程学院
课程设计说明书
课程名称:
______________________________________
设计项目:
______________________________________
学生姓名:
______________________________________
学号:
______________________________________
专业:
______________________________________
班级:
______________________________________
指导教师:
______________________________________
______年______月
一、任务与具体要求
1)图书管理(增加图书、查询图书、删除图书、图书借阅、还书);
2)会员管理(增加会员、查询会员、删除会员、借书信息);
二、设计说明书包括的内容
三、应完成的图纸
四、评语及成绩
指导教师(签字)_____________
________年____月____日
目录
1.问题描述1
2.需求分析4
3.结构设计4
4.算法设计4
4-1概要设计5
4-2详细设计6
5.测试分析4
6.总结4
7.参考文献4
8.附录:
带注释的源程序4
1.问题描述
我们本着自己的兴趣及挑战自己的态度,也为检验我们理论知识的熟练度,锻炼我们动手实践能力,我们选择了小型图书管理系统的编写。
因为我们生活在大学,图书馆是我们学习的天堂,借书和还书又是必不可少的,一个好的图书管理系统对于我们学生和管理人员都会为大家提供很多便利。
本着挑战和创新的思想,我们进行了此次课程设计程序编写及报告撰写。
我们本次实验的要求是
1)图书管理(增加图书、查询图书、删除图书、图书借阅、还书);
2)会员管理(增加会员、查询会员、删除会员、借书信息);
2.需求分析
图书数据类型:
typedefstructbookinfo
{
charnumber[15];/*图书编号*/
charname[30];/*图书名称*/
floatprice;/*单价*/
charauther[20];/*作者*/
intisExit;/*存在状态*/
}BOOKINFO;
会员数据类型:
typedefstructmemberinfo
{
charlendername[20];/*会员姓名*/
charlendersex[2];/*会员性别*/
charlendernum[15];/*会员编号*/
BOOKINFOborrowbook;/*所借图书*/
}MEMBERINFO;
系统主要分为两大部分:
一.图书管理
1)增加图书:
输入图书信息,写到外部文件中。
2)查询图书:
从外部文件中获取到图书信息,存入到数组中,输入书名在数组中,进行查找,如果找到输出详细信息。
如果没有找到输出“没有查找该书的任何信息”。
3)删除图书:
输入图书进行查找,如果找到进行重写。
如果没有找到输出“书库中没有任何信息”
4)借阅图书:
先找到图书返回结构体,修改图书数量,删除图书,添加修改后的图书;
5)归还图书:
找到图书,修改图书数量,删除图书,添加修改后的图书
6)显示全部:
遍历数组,输出所有图书信息
二.会员管理
1)增加会员:
输入会员信息,写到外部文件中。
2)查询会员:
从外部文件中获取到图书信息,存入到数组中,输入会员名在数组中,进行查找,如果找到输出详细信息。
如果没有找到返回菜单。
3)删除会员:
输入会员名,将信息从外部文件获取到数组中,找到会员进行重写。
4)借书信息:
利用查找图书和查找会员输出图书信息和会员信息
5)退出系统
3.数据结构设计
讲数据存储到结构体中,讲结构体存储到外部文件中;
取数据时,建立结构体数组;
将数据存储到结构体数组中在结构体数组中进行查找;
4.算法设计
4-1.概要设计
函数
功能
调用关系
voidmenu()
显示菜单
voiddeletebook(charsearch[20])
从文件中删除图书
BOOKINFOsearchbook(charsearch[20])
查找图书
voidaddbook(BOOKINFObook)
将图书写到文件中
MEMBERINFOsearchmember(charsearch[20])
在文件中查找会员
并返回会员信息
voiddeletemember(charsearch[20])
从文件中删除会员
voidaddmember(MEMBERINFOmember)
把会员信息写入
文件中
voidchoice_1_addnewbook()
得到图书信息
保存图书
addbook
voidchoice_2_search_according_name()
得到图书书名
查找图书
searchbook
voidchoice_3_delete_according_name()
得到图书名
删除图书
deletebook
voidchoice_4_borrow()
得到图书名
借阅图书
1.searchbook2.searchmember
3.deletemember4.deletebook
5.addbook6.addmember
voidchoice_5_return()
得到图书名
归还图书
1.searchmember2.searchbook
3.deletebook4.addbook
choice_6_display_all()
输出所有
图书信息
voidchoice_7_addmember()
得到会员信息
保存会员信息
addmember
voidchoice_8_searchmember()
得到会员姓名
查找会员
searchmember
voidchoice_9_deletemember()
得到会员姓名
删除会员
deletemember
voidchoice_0_borrowinf()
得到会员名
输出会员借书信息
searchmember
searchbook
voidmain()
主函数
4-2.详细设计
5.测试分析
6.总结
在编写这个图书管理系统中,遇到的最大问题是,对数据库文件信息的定向修
改。
原本试图通过文件指针的飘移与写入覆盖来实现数据库文件的定位修改,但是
不能成功。
后来还是采用的全文覆盖的方法;程序编写过程中多次存在无限循环的
情况,后来通过检查解决问题。
遗憾的是在本次编写程序中没有很好的学会动态链
表的使用,而是采用的结构体数组,以后需加强对链表的学习。
通过这次实践,我体会到了c语言学习的实用性。
将理论和实践结合在一起,
用先进的计算机工具方便人们的生活。
C语言程序的编写首先要从大局考虑,把自
己编写整个程序的思想都写在草稿上,这样有助于自己编写程序,在编写时要完善
注释,方便其他人理解程序。
编写的程序从理论上来说并没有错,但以上机就问题
不断。
甚至有些课本上的知识照搬不变,也不能得到正确的结果。
有时一个程序改
了一遍又一遍,但就是不能成功,编程显得枯燥乏味,看似简单的程序题,在调试
时却屡屡出错。
经反复的修改后,结果正确了,这时所有的乏味都显得那么无力,
一切都是值得的。
我认为,开发一套系统,最重要的是细心,并且思考要全面,结合实际,充分
考虑到客户的需求和现实意义。
不管什么系统,只用运用到实际应用中,才具有先
现实意义。
所以c语言程序的实用性很强,我们以后还要更加努力认真地学习编程
语言。
7.参考文献
《c语言程序设计---理论、方法与实践》
8.附录:
带注释的源程序
/*1.增加查询借阅还书*/
/*2.会员管理增加查询删除借书信息*/
#include
#include
#include
#include
typedefstructbookinfo
{
charnumber[15];/*产品编号*/
charname[30];/*产品名称*/
floatprice;/*单价*/
charauther[20];/*作者*/
intisExit;/*存在状态*/
}BOOKINFO;
typedefstructmemberinfo
{
charlendername[20];/*会员姓名*/
charlendersex[2];/*会员性别*/
charlendernum[15];/*会员编号*/
BOOKINFOborrowbook;/*所借图书*/
}MEMBERINFO;
voidmenu()
{
printf("\t\t---------------------------------------------------\n");
printf("\t\t\t\t图书管理系统\n");
printf("\t\t***************************************************\n");
printf("\t\t|\t\t\t一.图书管理|\n");
printf("\t\t|\t\t1:
新增图书|\n");
printf("\t\t|\t\t2:
查询图书|\n");
printf("\t\t|\t\t3:
删除图书|\n");
printf("\t\t|\t\t4:
借阅图书|\n");
printf("\t\t|\t\t5:
归还图书|\n");
printf("\t\t|\t\t6:
显示全部|\n");
printf("\t\t|\t\t\t二.会员管理|\n");
printf("\t\t|\t\t7:
增加会员|\n");
printf("\t\t|\t\t8:
查询会员|\n");
printf("\t\t|\t\t9:
删除会员|\n");
printf("\t\t|\t\t0:
借书信息|\n");
printf("\t\t|\t\tq:
退出系统|\n");
printf("\t\t***************************************************\n");
}
/****************************************************************/
/*******************图书辅助功能*************************/
//1.删除图书deletebook
//2.查找图书searchbook
//3.添加图书addbook
/****************************************************************/
voiddeletebook(charsearch[20])/*根据图书名称对图书信息进行删除*/
{
intn,i;
FILE*p;
BOOKINFObookinfo[100];
intbooknumber;
p=fopen("c:
\\bookinfo.txt","rb");
booknumber=0;
while(!
feof(p))
{
fread(&bookinfo[booknumber],sizeof(BOOKINFO),1,p);
booknumber++;
}
booknumber--;/*使用feof()函数会多读一行,因此需要booknumber自减一次,使书目的数量正确*/
fclose(p);
if(booknumber==0)
{
printf("书库中没有任何信息!
\n\n");
printf("按任意键回到主菜单!
\n\n");
getch();
}/*if结束*/
else
{
for(n=0;nif(strcmp(bookinfo[n].name,search)==0)
{
break;
}
if(n>=booknumber)
printf("没有查找该书的任何信息!
\n");
else
{
for(i=n;ibookinfo[i]=bookinfo[i+1];
booknumber--;
p=fopen("c:
\\bookinfo.txt","wb");
for(n=0;nfwrite(&bookinfo[n],sizeof(BOOKINFO),1,p);
fclose(p);
printf("成功获取图书!
\n");
}
}/*else结束*/
}
/*查找图书*/
BOOKINFOsearchbook(charsearch[20])/*根据图书名称显示图书的信息*/
{
FILE*p;
BOOKINFObookinfo[100];
BOOKINFObook;
intn;
intbooknumber=0;
p=fopen("c:
\\bookinfo.txt","rb");
while(!
feof(p))
{
fread(&bookinfo[booknumber],sizeof(BOOKINFO),1,p);
booknumber++;
}
booknumber--;/*使用feof()函数会多读一行,因此需要booknumber自减一次,使书目的数量正确*/
fclose(p);
if(booknumber==0)
{
printf("书库中没有任何信息!
\n\n");
printf("按任意键回到主菜单!
\n\n");
getch();
}/*if结束*/
else
{
for(n=0;nif(strcmp(bookinfo[n].name,search)==0)
{
printf("该书的详细信息如下:
\n");
printf("图书信息\n");
printf("编号名称单价作者所剩图书\n");
printf("%-6s%-12s%-8.1f%-8s%-9d",
bookinfo[n].number,bookinfo[n].name,bookinfo[n].price,
bookinfo[n].auther,bookinfo[n].isExit);
printf("\n");
book=bookinfo[n];
break;
}
if(n>=booknumber)
printf("没有查找该书的任何信息!
\n");
}/*else结束*/
returnbook;
}
/*添加图书*/
voidaddbook(BOOKINFObook)/*输入新进的图书信息*/
{
FILE*p;
p=fopen("c:
\\bookinfo.txt","ab");
fwrite(&book,sizeof(BOOKINFO),1,p);
fclose(p);
}
/****************************************************************/
/*************************会员辅助*****************************/
//1.查找会员searchmember
//2.删除会员deletemember
//3.添加会员addmember
/****************************************************************/
//查找会员
MEMBERINFOsearchmember(charsearch[20])/*根据姓名查找*/
{
FILE*p;
MEMBERINFOmemberinfo[100];
MEMBERINFOmember;
intmembernumber=0;
intn;
p=fopen("c:
\\memberinfo.txt","rb");
while(!
feof(p))
{
fread(&memberinfo[membernumber],sizeof(MEMBERINFO),1,p);
membernumber++;
}
membernumber--;/*使用feof()函数会多读一行,因此需要booknumber自减一次,使书目的数量正确*/
fclose(p);
if(membernumber==0)
{
printf("没有该会员信息!
\n\n");
printf("按任意键回到主菜单!
\n\n");
getch();
}/*if结束*/
else
{
for(n=0;nif(strcmp(memberinfo[n].lendername,search)==0)
{
printf("该会员信息如下:
\n");
printf("会员信息\n");
printf("姓名编号性别所借图书\n");
printf("%-15s%-8s%-6s%-10s%",memberinfo[n].lendername,memberinfo[n].lendernum,memberinfo[n].lendersex,memberinfo[n].borrowbook.name);
printf("\n");
member=memberinfo[n];
break;
}
if(n>=membernumber)
printf("没有查找该书的任何信息!
\n");
}/*else结束*/
returnmember;
}
voiddeletemember(charsearch[20])/*删除会员*/
{
intn,i;
FILE*p;
MEMBERINFOmemberinfo[100];
intmembernumber;
p=fopen("c:
\\memberinfo.txt","rb");
membernumber=0;
while(!
feof(p))
{
fread(&memberinfo[membernumber],sizeof(MEMBERINFO),1,p);
membernumber++;
}
membernumber--;/*使用feof()函数会多读一行,因此需要booknumber自减一次,使书目的数量正确*/
fclose(p);
if(membernumber==0)
{
printf("数据中没有任何信息!
\n\n");
printf("按任意键回到主菜单!
\n\n");
getch();
}/*if结束*/
else
{
for(n=0;nif(strcmp(memberinfo[n].lendername,search)==0)
{
break;
}
if(n>=membernumber)
printf("没有查找会员信息!
\n");
else
{
for(i=n;imemberinfo[i]=memberinfo[i+1];
membernumber--;
p=fopen("c:
\\memberinfo.txt","wb");
for(n=0;nfwrite(&memberinfo[n],sizeof(MEMBERINFO),1,p);
fclose(p);
}
}/*else结束*/
}
/*添加会员*/
voidaddmember(MEMBERINFOmember)/*输入新进的图书信息*/
{
FILE*p;
p=fopen("c:
\\memberinfo.txt","ab");
fwrite(&member,sizeof(MEMBERINFO),1,p);
fclose(p);
}
voidchoice_1_addnewbook()/*输入新进的图书信息*/
{
charchoice;
BOOKINFOnewbook;
system("cls");
while
(1)
{
printf("输入图书编号:
");
gets(newbook.number);
printf("输入图书名称:
");
gets(newbook.name);
printf("输入图书单价:
");
scanf("%f",&newbook.price);
//printf("%f",newbook.price);
while(getchar()!
='\n');
printf("输入图书的作者:
");
gets(newbook.auther);
printf("是否保存该条书目?
(Y/N)\n");
choice=getch();
while(choice!
='Y'&&choice!
='y'&&choice!
='N'&&choice!
='n')
choice=getch();
if(choice=='Y'||choice=='y')
{
newbook.isExit=1;/*将图书状态设置成1,表示没有借出*/
addbook(newbook);
printf("\n该信息已保存!
\n");
}
else
{
printf("\n本条书目未保存!
\n");
}
printf("\n是否继续添加书目?
(Y/N)\n");
choice=getch();
while(choice!
='Y'&&choice!
='y'&&choice!
='N'&&choice!
='n')
choice=getch();
if(choice=='