北京理工大学 数据结构实验报告 实验四图书管理系统.docx
- 文档编号:11634136
- 上传时间:2023-03-29
- 格式:DOCX
- 页数:17
- 大小:160.13KB
北京理工大学 数据结构实验报告 实验四图书管理系统.docx
《北京理工大学 数据结构实验报告 实验四图书管理系统.docx》由会员分享,可在线阅读,更多相关《北京理工大学 数据结构实验报告 实验四图书管理系统.docx(17页珍藏版)》请在冰豆网上搜索。
北京理工大学数据结构实验报告实验四图书管理系统
实验四图书管理系统
姓名:
任子龙学号:
1120140167班级:
05111451
一.需求分析
(1)问题描述
有一个小型书库保管了大量图书,关于图书有大量信息需要处理,这些信息包括图书的分类、书名、作者名、购买日期、价格等。
现要求编写一个程序以便于对图书的管理。
(2)基本要求:
a.建立图书信息。
b.提供查找功能,按照多种关键字查找需要的书籍。
例如按书名查找,输入书名后,将显示出该图书的所有信息,或显示指定信息。
c.提供排序功能,按照多种关键字对所有的书籍进行排序,例如按出版日期进行排序。
d.提供维护功能,可以对图书信息进行添加、修改、删除等功能。
(3)数据结构与算法分析
将每一本书看作是一个基本单元。
由于涉及添加、修改操作,这里使用了链表作为数据存储结构;同时,考虑到排序功能,尝试使用双向链表。
其中,每本书作为一个结点,数据域包含char型变量,指针域含有左右指针left和right。
二.概要设计
1.抽象数据类型的定义
为实现上述功能,程序中使用了双向链表,只需要定义一种数据类型:
typedefstructbook
{
charnumber[10];
chartitle[20];
charauthor[10];
chardate[15];
charprice[10];
structbook*right;
structbook*left;
}BK;
注意结点的指针域有left和right两个。
2.本程序包含两个模块
(1)主程序模块
主函数只包含了Menu_select()函数。
目的是进入主菜单界面,进行功能选择;直到输入操作码0,退出系统;
(2)双向链表单元模块——实现书籍信息的链式存储的抽象数据类型。
各函数之间的调用关系:
三.详细设计
1.结点类型
typedefstructbook
{
charnumber[10];
chartitle[20];
charauthor[10];
chardate[15];
charprice[10];
structbook*right;
structbook*left;
}BK;
2.子函数
(1)功能菜单调用函数Menu_select()
使用户进入主菜单界面,进行功能选择;先进入无限循环,输入操作码进行系统管理工作,直到输入操作码0,退出系统;
(2)各种功能函数
Initialize()//初始化图书系统信息;
Insert()//添加新的图书信息;
Sort()//对图书进行排序,本程序可以实现按“图书编号”、“出版日期”、“图书价格”多种关键字进行排序;
Search()//实现对图书的查找功能,本程序可以实现按“图书编号”、“出版日期”、“图书价格”多种关键字进行查找;
deletebook()//删除无效的图书信息;
Print_book()//打印全部图书信息。
3.主函数
Main函数十分的简单,目的只有一个,就是进入功能选择菜单。
intmain()
{/*主函数*/
Menu_select();/*调用主菜单*/
}
四.调试分析
1.为了提高程序的健壮性,在menu函数中,考虑如果操作码超出0-7的范围,进行错误提示。
2.刚开始使用的其实是单链表,然后很快就发现了问题,当编写排序部分的时候,很难再进行下去;考虑过使用顺序表,但是由于有删除、添加的操作,所以也放弃了顺序表,最终决定用双向链表,这还是第一次。
过程中发现双向链表用起来很方便!
3.排序函数sort()中为了保证程序的正确性,使用了自己较为熟练的冒泡排序法,没有考虑时间复杂度。
4.在编写的过程中也更加熟悉了switch函数,free函数,goto函数(当然尽量少用),还有学会了清屏,system(“cls”);
五.测试结果
1.建立图书信息及添加功能
2.查找功能
A.按编号查找:
B.按日期查找
3.修改功能
4.删除功能
5.排序功能
为了说明问题,这里又添加了两本书《简爱》、《余罪》
测试只提供按编号和日期排序
A.按编号排序:
B.按出版日期排序
六、附录
#include
#include
#include
#include
typedefstructbook
{
charnumber[10];
chartitle[20];
charauthor[10];
chardate[15];
charprice[10];
structbook*right;
structbook*left;
}BK;
BK*h_book;
/*函数申明*/
voidStart()
{system("cls");
printf("\n\n\n\t\t***************************************\n");
printf("\n\n\n\t\t\t欢迎使用图书管理系统\n");
printf("\n\n\n\t\t***************************************\n");
printf("\n\n\n\t\t按任意键进入系统...");
getch();
system("cls");}
voidInsert()/*新书入库*/
{BK*p,*p0,*p1;p=p1=h_book;
printf("\n新书入库模块...\n");
printf("\n请输入新书信息..\n包括书号、书名、数量...\n");
p0=(BK*)malloc(sizeof(BK));
printf("图书编号:
");
scanf("%s",p0->number);
while(strcmp(p0->number,p1->number)!
=0&&p1->right!
=NULL)
p1=p1->right;
if(strcmp(p0->number,p1->number)==0)/*此处分两种情况,若图书编号存在,则直接进库,只须输入书的数量*/
{printf("\n此编号图书已存在!
!
直接入库!
\n");
}
else/*若不存在,则需要输入其他的信息,然后在进行插入操作*/
{printf("图书名称:
");
scanf("%s",p0->title);
printf("图书作者:
");
scanf("%s",p0->author);
printf("图书出版日期:
");
scanf("%s",p0->date);
printf("图书价格:
");
scanf("%s",p0->price);
while(p->right)
{p=p->right;}
if(h_book==NULL)h_book=p0;/*此处分两种情况,链表中没有
数据,head直接指向p0处*/
else{p->right=p0;p0->left=p;}/*此处分两种情况,链表中有数据,
链表中最后元素的right指向p0处*/
p0->right=NULL;
}
printf("\n新书入库完毕!
按任意键继续下一步操作..\n");
getch();system("cls");}
voidPrint_book()/*打印所有图书信息*/
{
BK*p;p=h_book;
printf("\n图书信息如下:
\n\n");
printf("图书编号\t图书名称\t图书作者\t出版日期\t价格\n");
while(p!
=NULL){
printf("%s\t\t%s\t\t%s\t\t%s\t%s\n",p->number,p->title,p->author,p->date,p->price);
p=p->right;}
printf("\n图书信息打印完毕!
按任意键继续下一步操作..");
getch();system("cls");}
voidInitialize()/*初始化*/
{BK*p0;
printf("\n图书初始化开始,请输入图书信息..\n包括编号.书名.数量..\n");
p0=(BK*)malloc(sizeof(BK));
h_book=p0;
printf("\n请输入图书信息:
\n");
printf("图书编号:
");/*输入图书编号(唯一)*/
scanf("%s",p0->number);
printf("图书名称:
");/*输入图书名称*/
scanf("%s",p0->title);
printf("图书作者:
");/*输入图书作者*/
scanf("%s",p0->author);
printf("图书出版日期:
");/*输入图书出版日期*/
scanf("%s",p0->date);
printf("图书价格:
");/*输入图书价格*/
scanf("%s",p0->price);
p0->right=NULL;
p0->left=NULL;
printf("\n图书信息初始化完毕!
按任意键继续下一步操作..\n");
getch();
system("cls");}
voidSort()
{/*按多种关键词排序*/
BK*p,*front,*rear,*temp;
intx;
printf("\n图书排序开始..\n");
printf("\n请选择关键字进行排序:
\n");
printf("1.书籍编号\n2.出版日期\n3.书籍价格\n");
scanf("%d",&x);
temp=(BK*)malloc(sizeof(BK));
front=h_book;
p=front;
while(p->right)p=p->right;
rear=p;
while
(1)
{if(front==rear)break;
else
{p=front;
while
(1)
{if(p==rear)break;
switch(x)
{
case1:
if(strcmp(p->number,p->right->number)>0)//按编号冒泡排序
{strcpy(temp->number,p->number);strcpy(p->number,p->right->number);strcpy(p->right->number,temp->number);
strcpy(temp->author,p->author);strcpy(p->author,p->right->author);strcpy(p->right->author,temp->author);
strcpy(temp->title,p->title);strcpy(p->title,p->right->title);strcpy(p->right->title,temp->title);
strcpy(temp->date,p->date);strcpy(p->date,p->right->date);strcpy(p->right->date,temp->date);
strcpy(temp->price,p->price);strcpy(p->price,p->right->price);strcpy(p->right->price,temp->price);
}break;
case2:
if(strcmp(p->date,p->right->date)>0)//按出版日期冒泡排序
{strcpy(temp->number,p->number);strcpy(p->number,p->right->number);strcpy(p->right->number,temp->number);
strcpy(temp->author,p->author);strcpy(p->author,p->right->author);strcpy(p->right->author,temp->author);
strcpy(temp->title,p->title);strcpy(p->title,p->right->title);strcpy(p->right->title,temp->title);
strcpy(temp->date,p->date);strcpy(p->date,p->right->date);strcpy(p->right->date,temp->date);
strcpy(temp->price,p->price);strcpy(p->price,p->right->price);strcpy(p->right->price,temp->price);
}break;
case3:
if(strcmp(p->price,p->right->price)>0)//按价格冒泡排序
{strcpy(temp->number,p->number);strcpy(p->number,p->right->number);strcpy(p->right->number,temp->number);
strcpy(temp->author,p->author);strcpy(p->author,p->right->author);strcpy(p->right->author,temp->author);
strcpy(temp->title,p->title);strcpy(p->title,p->right->title);strcpy(p->right->title,temp->title);
strcpy(temp->date,p->date);strcpy(p->date,p->right->date);strcpy(p->right->date,temp->date);
strcpy(temp->price,p->price);strcpy(p->price,p->right->price);strcpy(p->right->price,temp->price);
}break;
default:
break;
}
p=p->right;
}
rear=rear->left;
}
}
printf("\n排序完毕!
按任意键继续下一步操作..\n");
getch();system("cls");
}
voidSearch()
{/*多种关键词查找*/
BK*p;
intx;
chart[20]={0};
printf("\n图书查找开始..\n");
k:
printf("\n请选择关键字进行查找:
\n");
printf("1.书籍编号\n2.出版日期\n3.书籍价格\n");
scanf("%d",&x);
printf("\n请输入关键字:
\n");
scanf("%s",t);
p=h_book;
while(p)
{
switch(x)
{
case1:
if(strcmp(p->number,t)==0)
{printf("%s\t%s\t%s\t%s\t%s\n",p->number,p->title,p->author,p->date,p->price);
}break;
case2:
if(strcmp(p->date,t)==0)
{printf("%s\t%s\t%s\t%s\t%s\n",p->number,p->title,p->author,p->date,p->price);
}break;
case3:
if(strcmp(p->price,t)==0)
{printf("%s\t%s\t%s\t%s\t%s\n",p->number,p->title,p->author,p->date,p->price);
}break;
default:
printf("请输入正确的操作码!
\n");gotok;
}
p=p->right;
}
printf("\n查找完毕!
按任意键继续下一步操作..\n");
getch();system("cls");
}
voiddeletebook()/*删除图书信息*/
{BK*p;
chart[20]={0};
printf("\n请输入需要删除书籍编号:
");
scanf("%s",t);
p=h_book->right;
while(p)
{if(strcmp(p->number,t)==0)
{p->left->right=p->right;
p->right->left=p->left;
free(p);break;
}
p=p->right;
}
printf("\n删除完毕!
按任意键继续下一步操作..\n");
getch();system("cls");
}
voidModify()/*修改图书信息*/
{BK*p;
chart[20]={0};
printf("\n请输入需要修改书籍编号:
");
scanf("%s",t);
p=h_book;
while(p)
{if(strcmp(p->number,t)==0)break;
p=p->right;
}/*指针p指向需要修改的结点*/
printf("\n请重新输入图书信息:
\n");
printf("图书编号:
");/*输入图书编号(唯一)*/
scanf("%s",p->number);
printf("图书名称:
");/*输入图书名称*/
scanf("%s",p->title);
printf("图书作者:
");/*输入图书作者*/
scanf("%s",p->author);
printf("图书出版日期:
");/*输入图书出版日期*/
scanf("%d",&p->date);
printf("图书价格:
");/*输入图书价格*/
scanf("%d",&p->price);
printf("\n修改完毕!
按任意键继续下一步操作..\n");
getch();system("cls");
}
intMenu()/*主菜单*/
{intdm;
printf("\n\t\t欢迎使用图书管理系统\n");
printf("=================================================\n");
printf("\t\t0----退出系统\n");
printf("\t\t1----数据初始化\n");
printf("\t\t2----新书入库\n");
printf("\t\t3----图书排序\n");
printf("\t\t4----搜索图书\n");
printf("\t\t5----删除信息\n");
printf("\t\t6----修改信息\n");
printf("\t\t7----全部图书信息\n");
printf("=================================================\n");
printf("请输入相应的操作码:
");
for(;;)
{scanf("%d",&dm);//dm输入的数字
if(dm<0||dm>7)
printf("\n错误!
请重新输入:
");
elsebreak;}
returndm;}
voidMenu_select()/*主菜单选择函数*/
{for(;;)
{
switch(Menu())/*功能选择*/
{
case0:
system("cls");
printf("\n\n\t欢迎下次使用本系统!
(按任意键退出...)\n");
getch();
exit(0);
case1:
Initialize();break;
case2:
Insert();break;
case3:
Sort();break;
case4:
Search();break;
case5:
deletebook();break;
case6:
Modify();break;
case7:
Print_book();break;
default:
printf("\n错误!
");
exit(0);
}
}
}
intmain()
{/*主函数*/
Menu_select();/*调用主菜单*/
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北京理工大学 数据结构实验报告 实验四 图书管理系统 数据结构 实验 报告 图书 管理 系统