数据结构与算法基础项目报告.docx
《数据结构与算法基础项目报告.docx》由会员分享,可在线阅读,更多相关《数据结构与算法基础项目报告.docx(29页珍藏版)》请在冰豆网上搜索。
数据结构与算法基础项目报告
《数据结构与算法基础》课程项目
实施方案
题目:
虚拟智慧图书馆
组号:
任课教师:
组长:
成员:
成员:
成员:
成员:
联系方式:
一、项目要求
1.1设计要求
模拟现有图书馆的借阅、续借、归还,图书入库、出库,查询、排序等功能,实现电子图书馆的智慧综合管理,要求:
(1)掌握抽象数据类型的定义;
(2)实现数据结构查找算法;
(3)实现数据结构排序算法;
(4)使用简单数据库操作;
(5)友好、易操作的用户交互界面。
1.2评分依据
(1)功能实现;
(2)性能指标;
(3)工程规范(规范、安全性、可靠性、性价比等);
(4)理论水平;
(5)团队分工合作情况。
1.3实验室提供条件
(1)微机;
(2)C/C++,C#/JAVA等。
、
二、课程项目实施方案
2.1设计思想
本虚拟智慧图书馆系统软件针对管理人员与用户两个群体,从需求出发,设计图书信息录入、图书信息管理、借阅图书管理等系列模块。
开发工具是MicrosoftVisualC++和Win32界面。
2.1.1功能结构图
2.1.2系统模块
(1)管理员登录系统:
实现对图书在库及借阅信息、学生信息的管理
(2)学生登陆系统:
实现对图书查询及借阅功能的处理
2.1.3开发环境
(1)MicrosoftVisualC++(简称VisualC++、MSVC、VC++或VC)是微软公司的C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。
(2)微软基础类库(英语:
MicrosoftFoundationClasses,简称MFC)是微软公司提供的一个类库(classlibraries),以C++类的形式封装了WindowsAPI,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。
其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。
2.2关键技术
(1)界面的设计与实现
(2)存储、删除、查找、保存等处理数据
三、项目的制作过程
3.1原理分析
3.1.1从文件中读出信息并建立单链表
structtushu*head=NULL,*p,*p1,*p2;
if((fp=fopen("tushu_list.txt","r"))==NULL)/*先安全打开目录文件*/
{
printf("Fileopenerror!
\n");
exit(0);
}
while(!
feof(fp))/*读取并创建链表*/
{
p=(structtushu*)malloc(sizeof(structtushu));
p->price=-1;
fscanf(fp,"%s%s%s%s%s%lf%lf",p->num,p->name,p->writer,p->press,p->kind,&p->time,&p->price);
if(p->price==-1)
{
free(p);
break;
}
if(head==NULL)
{
head=p;
p1=p;
p1->next=NULL;
}
else
{
p1->next=p;
p2=p1;
p1=p;
p1->next=NULL;
}
}
fclose(fp);
returnhead;
3.1.2遍历并写入文件
for(p1=head;p1!
=NULL;p1=p1->next)/*遍历*/
fprintf(fp,"%s\t%s\t%s\t%s\t%s\t%.0lf\t%lf\n",p1->num,p1->name,p1->writer,p1->press,p1->kind,p1->time,p1->price);/*将图书信息写入文件*/
fclose(fp);
3.1.3链表插入(图书添加)
p1=(structtushu*)malloc(sizeof(structtushu));
head=p1;
p1->price=-1;
while(i!
=1)
{
printf("请输入编号,以'#'结束\n");
scanf("%s",p1->num);
if(strcmp(p1->num,"#")==0)
i=1;
while(i!
=1)
{
printf("请依次输入书名作者出版社类别出版时间价格\n");
scanf("%s%s%s%s%lf%lf",p1->name,p1->writer,p1->press,p1->kind,&p1->time,&p1->price);
p2=p1;
p1=(structtushu*)malloc(sizeof(structtushu));
p2->next=p1;
break;
}
}
if(p1->price!
=-1)
p2->next=NULL;
else
head=NULL;
3.1.4链表查找
(以书名查找为例)
voidFindofname(structtushu*head)/*按书名查询图书*/
{
inti=0,n;
charb[20];
structtushu*p;
p=head;
printf("\n请输入要查询的书籍名称:
");
scanf("%s",b);
while(p!
=NULL)
{
if(strcmp(p->name,b)==0)
{
printf("\n编号书名作者出版社类别出版时间价格\n");
printf("%-10s%-20s%-20s%-20s%-20s%-15.0lf%-10.2lf\n",p->num,p->name,p->writer,p->press,p->kind,p->time,p->price);
i++;
}
p=p->next;
}
if(i==0)
{
system("cls");
printf("\n对不起!
没有找到名为《%s》的书籍!
\n",b);
system("pause");
}
printf("\n\n\n\t\t\t是否继续查找书籍信息?
(1.是/其他.返回):
");
scanf("%d",&n);
if(n==1)
gfind();
else
{
system("cls");
menu();
}
}
3.1.5排序(冒泡排序)
voidSort_num(structtushu*head)
{
structtushu*p1,*p2,*p3,*p4=NULL,*p5;
intx;
for(p1=head;p1->next!
=p4;)//对链表进行从大到小排序(这里用冒泡法)
//p1使之总是指向头结点,p4使之总是指向已排序好的最前面的结点
//p3作为中介,保存p2的上一个结点
{
for(p2=p1;p2->next!
=p4;)
{
if(strcmp(p2->num,p2->next->num)>0)//p2的值大于p2->next的值,交换
{
if(p2==p1)//头结点要交换
{
p1=p2->next;
p2->next=p1->next;
p1->next=p2;
p3=p1;
}
else
{
p3->next=p2->next;
p3=p2->next;
p2->next=p3->next;
p3->next=p2;
}
}
else//不需要交换,则p2、p3前进1位
{
p3=p2;
p2=p2->next;
}
}
p4=p2;
}
for(p5=p1;p5!
=NULL;p5=p5->next)
printf("%-10s%-20s%-20s%-20s%-20s%-15.0lf%-10.2lf\n",p5->num,p5->name,p5->writer,p5->press,p5->kind,p5->time,p5->price);
system("pause");
system("cls");
printf("\n\n\n\t\t\t是否保存书籍信息?
(1.是/2.否(返回)):
");
scanf("%d",&x);
if(x==1)
fprint_(p1);
else
system("cls");
printf("\n\n\n\t\t\t没有被保存到文件!
\n\n\n\n");
system("pause");
system("cls");
menu();
return;
}
3.1.6删除结点
voidDelete(structtushu*head,charm[15])
{
structtushu*ptr1,*ptr2;
intx,n=0;
if((strcmp(head->num,m)==0)&&head->next==NULL)
{
printf("删除成功!
\n");
system("pause");
system("cls");
head=NULL;
fprint_(head);
}
while((strcmp(head->num,m)==0)&&head!
=NULL)
{
ptr2=head;
head=head->next;
n++;
free(ptr2);
}
if(head==NULL)
{
printf("已无书籍信息!
\n");
menu();
}
ptr1=head;
ptr2=head->next;
while(ptr2!
=NULL){
if(strcmp(ptr2->num,m)==0)
{
ptr1->next=ptr2->next;
n++;
free(ptr2);
}
else
ptr1=ptr2;
ptr2=ptr1->next;
}
if(n==0)
{
system("cls");
printf("没有删除你要删除的书籍!
\n");
system("pause");
system("cls");
menu();
return;
}
else
printf("\n编号为‘%s’目标书籍已被删除,并保存至文件!
\n",m);
printf("\n\n\n\t\t\t是否保存书籍信息?
(1.是/2.否(返回)):
");
scanf("%d",&x);
if(x==1)
fprint_(head);
else
system("cls");
printf("\n\n\n\t\t\t并没有被保存到文件!
\n\n\n\n");
system("pause");
system("cls");
menu();
return;
}
3.1.7借书
voidborrow(structtushu*head)//借书
{
structtushu*ptr1,*ptr2;
charm[15];
intn=0;
printf("请输入你借书籍的编号!
\n");
scanf("%s",m);
if((strcmp(head->num,m)==0)&&head->next==NULL)
{
printf("借书成功!
\n");
system("pause");
system("cls");
head=NULL;
jfprint_(head);
}
while((strcmp(head->num,m)==0)&&head!
=NULL)
{
ptr2=head;
head=head->next;
free(ptr2);
n++;
}
if(head==NULL)
{
system("pause");
system("cls");
printf("无书籍信息!
\n");
xmenu();
}
ptr1=head;
ptr2=head->next;
while(ptr2!
=NULL)
{
if(strcmp(ptr2->num,m)==0)
{
ptr1->next=ptr2->next;
free(ptr2);
n++;
}
else
ptr1=ptr2;
ptr2=ptr1->next;
}
if(n==0)
{
printf("无书籍信息!
\n");
system("pause");
system("cls");
xmenu();
}
else
printf("借书成功\n");
system("pause");
system("cls");
jfprint_(head);
}
3.1.8还书
voidhuanshu()
{
structtushu*p1,*p2,*head,*ptr;
charnum;
intx,i=0;
intk=0;
system("cls");
p1=(structtushu*)malloc(sizeof(structtushu));
head=p1;
p1->price=-1;
while(i!
=1)
{
printf("请输入还书编号,以'#'结束\n");
scanf("%s",p1->num);
if(strcmp(p1->num,"#")==0)
i=1;
while(i!
=1)
{
printf("请依次输入书名作者出版社类别出版时间价格\n");
scanf("%s%s%s%s%lf%lf",p1->name,p1->writer,p1->press,p1->kind,&p1->time,&p1->price);
k++;
p2=p1;
p1=(structtushu*)malloc(sizeof(structtushu));
p2->next=p1;
break;
}
}
if(p1->price!
=-1)
p2->next=NULL;
else
{
head=NULL;
printf("还书失败!
\n");
system("pause");
system("cls");
xmenu();
}
system("cls");
printf("\n\n\n\t\t\t是否确认?
(1.是/2.否):
");
scanf("%d",&x);
printf("\n\n还书成功,你共还了%d本书!
\n\n\n",k);
system("pause");
system("cls");
if(x==1)
hfprint(head);
else
system("cls");
printf("\n\n\n\t\t\t还书没有成功!
\n\n\n\n");
system("pause");
system("cls");
xmenu();
}
3.2界面设计
3.2.1初始选择界面
用户可以选择不同的系统登录来完成不同的操作
3.2.2登陆界面
登陆界面中,用户分别输入“用户名”和“密码”进行登录,限制三次错误,用户名与密码不匹配提示重新输入。
3.2.3管理员模式
管理员模式下,分别有基础设置、查询出借书籍、浏览图书、统计图书数目、查询在库书籍、添加入库、排序书籍、修改、删除、修改账号及密码、学生信息等功能。
查询在库书籍
统计图书数目
可根据书名、作者和类别进行图书查找
可根据时间、价格、编号进行排序,下例如:
由价格排序
排序后可保存至图书信息文件中
存书入库操作
保存完成之后的tushu_list文件里可以看到新保存的书籍信息
同样,使用修改和删除也可以修改图书库信息
学生的学号和密码可以通过管理员模式查询
管理员的帐号和密码可修改
3.2.4学生模式
学生模式下,分别有基础设置、借阅信息查看、浏览图书、查询、借书、还书、修改密码等功能
学生系统下浏览、查询图书与管理员系统下相同
学生可输入编号进行借阅书籍
如果书籍编号错误或者已被借出,则显示借阅失败
学生系统也可以修改密码(图)
3.3mfc版本实现
3.3.1主界面显示
3.3.2图书查询界面
图书查询可以通过对图书编号的查询显示书籍的信息,同时可显示所有书籍的数据库信息。
3.3.3借书系统
借书系统会显示读者信息,图书信息等。
3.3.4还书界面
还书界面会显示图书的基本信息,图书归还信息等。
3.3.5读者信息查询
3.4mfc版本
3.4.1主页界面
主页面以上海大学图书馆的照片作为背景
3.4.2登录界面
可在登录界面选择学生或者管理员登录,输入账号和密码进行登录。
同时可实现新用户的注册,当忘记密码时可以进行密码的找回。
3.4.3读者操作界面
读者操作界面可以实现证件信息显示,已借书刊显示,和修改密码信息的窗口,同时可以实现书籍的检索。
3.4.4管理员操作界面
管理员界面可以实现对书记的管理包括:
添加书籍,检索书籍,删除书籍,显示所有书籍。
同时可以实现对于读者的信息管理:
检索读者,修改读者数据,删除读者等。
三、项目的结果分析
预期目标基本实现。
通过几周不懈努力,项目已经初步成型。
由于时间关系,我们的项目并没有完全到位。
该系统功能范围比较窄,只简单的包括对图书信息和读者信息的增加、删除、修改、查询,读者借阅和归还的管理,无较大的商业价值,但该系统优点在于简洁明了,容易上手,操作简单规范,适用于任何级别的使用者使用该系统,该系统又过于简单,无法全面的对图书信息进行管理,适应范围局限于小型图书馆,无法满足大中型图书馆的需求。
四、心得与感受
首先介绍我们项团的分工:
组长翟梦娟负责分配任务,统领项目任务的进程以及中期报告和程序的编写;刘芝浍、阎瑾负责最终报告的编写记录程序查错;组员陆嘉豪、杨震威负责主要程序的编写和统合。
通过这次的系统设计,让我们对数据结构有了更加深刻了解,通过网上搜集资料,图书馆资料不断的查询总结,完成了这次系统设计,提升了分析问题的能力和思考问题的逻辑能力。
从这次设计学到的东西,相信会对我们日后的学习作起到很大的指导作用。
这次综合模拟实习,充分的把数据结构与我们以前学习的C语言融会贯通,并且整个设计中学到了许多以前在课堂上面学不到的知识,很大程度的加强了自己的实践能力。
我们组主要是运用C语言进行编程,发现在我们的能力范围内通过C语言编程可以实现的功能最完全,而且C语言能够实现信息的及时更新。
但是我们发现仅仅通过C语音设计出的界面没有足够的完美。
所以好奇心和好学心驱使我们继续进行资料的查找。
通过查阅资料我们发现通过使用mfc可以构造比较完美的界面(如图中所示),而且能够实现界面的美化的同时优化C语言设计中存在的部分不足。
比如使用C语言设计很难实现与数据库的联动,这就大大限制了我们设计系统的适用范围。
但是给出的第一个mfc编程能够实现数据库的查询等,十分的方便。
但是囿于所学的只是限制和时间的限制,我们目前并不能够完全的在保证界面美化的同时,实现项目设计要求。
不能完成联动,这也是我们的美中不足。
但是我们的采用展示的C语言版本,完美的完成了项目设计要求中的功能,这也是令我们最满意的地方。