c语言图书管理系统Word下载.docx
《c语言图书管理系统Word下载.docx》由会员分享,可在线阅读,更多相关《c语言图书管理系统Word下载.docx(28页珍藏版)》请在冰豆网上搜索。
系统完成情况(30分)
答辩情况(40分)
总分
20分
规范程度
5分
程序测试
基本功能20分
扩展功能10分
自述情况10分
答辩情况
30分
成绩评定教师:
1需求分析
图书管理系统
图书的信息包括:
序号,名称,作者,价格,出版社,出版时间。
设计图书管理系统有以下功能:
1、系统以菜单形式工作;
2、图书信息录入功能(用文件保存图书信息);
3、图书信息浏览功能;
4、图书的删除功能;
可根据图书的序号,名称,作者,名称和作者就行删除。
5、图书的排序和查询功能;
可根据图书的序号和价格排序,按照图书的名称,作者,出版时间进行查询。
6、图书信息的修改;
7、图书的增添;
在该部分中叙述:
对题目中要求的功能进行的简单的叙述分析,把题目内容给介绍一下。
2概要设计
(1)数据结构
数组用结构体实现
结构类型的层次结构:
structbook_node{intnum;
//图书序号整型
charname[20];
//图书名称字符串
charauther[20];
//作者字符串
chartype[20];
//类型字符串
intprice;
//价格整型
charpress[20];
//出版社字符串
charpublishdate[20];
//出版时间字符串
structbook_node*next;
//节点
}
#include<
stdio.h>
string.h>
stdlib.h>
(2)模块划分
voidmain()
{intb;
structbook_node*head;
head=NULL;
while
(1){showmeau();
scanf("
%d"
&
b);
switch(b){case1:
head=inputbook();
break;
//录入图书
case2:
if(head==NULL)printf("
请先录入图书"
);
elsehead=deletebook(head);
//删除图书,可根据图书序号,名称,作者,名称和作者进行删除。
case3:
elseinsertbook(head);
//增添图书。
case4:
elsemodifybook(head);
//修改图书信息。
case5:
elseserchbook(head);
//查询图书。
case6:
elserank(head);
//为图书排序。
case7:
elseshowall(head);
break;
//图书的遍历。
case0:
printf("
byebye\n"
exit(0);
//退出系统。
default:
输入有误!
"
}
}
函数名:
showmeau
参数:
空
功能:
显示菜单
save
structbook_node*head
将链表存入文件
showall
structbook_node*pl
显示链表
inputbook
创建链表,并将信息存入链表
deletebynum
structbook_node*head
按序号删除图书
deletebookbyname
按书名删除图书
deletebookbyauther
按作者删除
deletebookbynameandauther
按书名和作者删除
searchbyname
按书名查找
searchbyauther
按作者查找
searchbypress
按出版社查询
serachbypress
按类别查询
insertbook
增添图书
modifybook
修改图书信息
swap
structbook_node*p1,structbook_node*p2
交换p1和p2所指向的图书的所有信息。
deletebook
删除图书
searchbook
查找图书
rank
图书排序
(3)程序总体框架
该程序需要实现众多功能,需要一个一个的执行程序,所以需要将程序分成几个模块,有选择的执行程序。
大致框架如图所示:
Main
7
图书库
6
5
4
修改图书
3
2
1
录入图书
退出
3详细设计
菜单函数:
(1)函数名:
showmeau()
(2)源程序:
voidshowmeau()
{printf("
\n"
printf("
欢迎使用图书管理系统\n"
**************************************************************\n"
*1:
录入图书*\n"
*2:
删除图书*\n"
*3:
增添图书*\n"
*4:
修改图书*\n"
*5:
查询图书*\n"
*6:
图书排序*\n"
*7:
图书库*\n"
*0:
取消*\n"
文件写入功能
(1)函数名称:
voidsave(structbook_node*pl)
{FILE*fp;
if((fp=fopen("
a.txt"
"
w"
))==NULL)
{printf("
cannotopenfile"
}
while(pl->
next!
=NULL){
fprintf(fp,"
%d%s%s%lf%s%s\n"
pl->
num,pl->
name,pl->
auther,pl->
price,pl->
press,pl->
publishdate);
pl=pl->
next;
fclose(fp);
交换功能
voidswap(structbook_node*p1,structbook_node*p2)
{intk;
doublel;
chara[20];
k=p1->
num;
p1->
num=p2->
p2->
num=k;
strcpy(a,p1->
name);
strcpy(p1->
name,p2->
strcpy(p2->
name,a);
l=p1->
price;
price=p2->
price=l;
auther);
auther,p2->
auther,a);
strcpy(a,p1->
type);
type,p2->
type,a);
strcpy(a,p1->
publishdate,p2->
publishdate,a);
press);
press,p2->
press,a);
输入功能
structbook_node*inputbook()
{structbook_node*p1,*head;
注意:
当图书序号为0时输入结束\n\n"
p1=(structbook_node*)malloc(sizeof(structbook_node));
//为链表的节点申请内存空间
head=p1;
Whlie(pl->
num!
=0)
请输入图书的序号:
scanf("
p1->
num);
if(p1->
num==0)
break;
printf("
请输入图书的名称:
%s"
p1->
请输入图书作者:
请输入类型:
请输入图书价格:
%lf"
price);
请输入出版社:
请输入出版时间:
\n"
p1->
next=(structbook_node*)malloc(sizeof(structbook_node));
p1=p1->
next=NULL;
图书录入输入结束!
save(head);
returnhead;
读取功能
voidshowall(structbook_node*pl)
{structbook_node*p;
图书序号名称作者类别价格出版社出版时间\n"
for(p=pl;
p->
=NULL;
p=p->
next)
%6d%13s%8s%6s%.2lf%17s%8s\n"
p->
num,p->
name,p->
auther,p->
type,p->
price,p->
press,p->
增添功能
voidinsertbook(structbook_node*head)
{structbook_node*p,*p1;
intn=0;
p=head;
while(p->
=NULL)p=p->
//找到链表的尾指针
当图书学号为0时输入结束\n\n"
p1=p;
do
while
(1);
删除功能
structbook_node*deletebookbyauther(structbook_node*head)(暂取一例,其他略)
源程序:
structbook_node*deletebookbyauther(structbook_node*head)
{structbook_node*p,*q;
charauther[20];
intcount=0;
intflag=0;
//标志是否找到
p=head->
q=head;
请输入要删除图书的作者:
scanf("
auther);
if(strcmp(head->
auther,auther)==0){while(strcmp(head->
auther,auther)==0){
head=head->
//判断头指针是否为要删除的节点
}
flag=1;
else{
while(p!
=NULL){//遍历链表,删除符合条件的记录
if(strcmp(p->
auther,auther)==0){
flag=1;
q->
next=p->
free(p);
}
p=p->
q=q->
}}
if(flag==0)//没有找到要删除的结点
printf("
\n对不起,没有符合条件的记录!
\n\n"
else{//找到要删除的结点
删除成功!
}
save(head);
//保存链表
returnhead;
修改功能
voidmodifybook(structbook_node*head)
{inta;
structbook_node*p;
请输入您要修改的图书序号:
a);
while(p!
=NULL){if(p->
num==a){printf("
请重新输入图书的名称:
请重新输入图书作者:
请重新输入类型:
scanf("
printf("
请重新输入图书价格:
printf("
请重新输入出版社:
请重新输入出版时间:
break;
}
p=p->
}
查询功能
voidserchbyname(structbook_node*head)//(暂取一例,其他略)
voidserchbyname(structbook_node*head)
charname[20];
voidsearchbook(structbook_node*head);
请输入书名:
name);
图书序号名称作者价格出版社出版时间\n"
=NULL){if(strcmp(p->
name,name)==0){printf("
flag=1;
}
p=p->
}
if(flag==0)printf("
对不起,找不到您要查询的图书\n"
serchbook(head);
//重新查询
排序功能
voidrankbynum(structbook_node*head)//排序
{
structbook_node*p,*p1,*p2;
inti,j;
=NULL){n++;
}//统计链表中元素个数
for(i=1;
i<
n;
i++)
{p1=head;
for(j=0;
j<
n-i;
j++)
{
p2=p1->
if((p1->
num)>
(p2->
num))//按照序号
{
swap(p1,p2);
//利用冒泡排序法来排序
showall(head);
4调试分析
(1)刚开始时不知道整个程序该怎样做,就听从老师的提醒,一个一个模块的做,一个一个的调试,最终将这些模块组合在一起,又经过不断的调试,终于将调试成功,消除错误。
(2)没有错误不代表程序就完美啦,在运行中我发现存在着诸多问题,譬如删除函数,最初是我设计的删除函数返回值为空,这时我发现链表的头指针所指向的内容不能删除,后来我将函数值的返回值改为头指针,又经过进一步的修改,调试,最终解决了这个问题,但我又发现,如果两本书的名字或者作者一样,那么如果使用按名称或作者删除就会同时把两本书删掉,故我又增加了一个按名称和作者删除,最终解决了删除函数的问题。
(3)在设计过程中遇到的另一个棘