“程序设计专周”报告
实验题目: 模拟图书馆管理系统
班 级:
学 号: 30号
姓 名:
指导教师:
日 期: 19周一 ~ 周五
一、题目:模拟图书馆管理系统
模拟图书管理系统:图书管理的基本业务包括对一本书的入库、清除、查询、借出、归还等,设书的内容至少包括书号、书名、作者、库存总量和现存量等。
二、算法基本思想描述:
将整个程序划分为五个模块,分别定义了五个函数来实现管理系统的功能,采用单链表的结构进行数据操作。
三、设计
1.数据结构的设计
typedef struct BookList
{ char num[10];
char name[20];
char author[20];
int total;
int leavings;
struct BookList *next;
}Book;
采用链表的结构来进行数据操作,一本书的数据包括:书号、书名、作者、库存总量、现存量以及指针区域.
2.算法的设计
(1)关键算法设计思路描述
在构思图书馆管理系统的结构时,我将整个程序划分为五个模块,分别定义了五个函数来实现管理系统的功能,除此之外在对程序的界面设计上加入了一些动画效果.在数据结构上采用单链表的结构方式,这样在读取文件中数据的时候能够节省内存空间。
设计主菜单时,用while(1)和switch()来实现功能的选择以及运行一项功能后返回主菜单。
在整个程序中,统一采用了以输入0的方式返回或退出,并在模块有需要键盘输入地方加入了防错误输入的功能,防止输入错误导致程序错误运行,此功能采用判断输入值的ASCII码或字符串的比较.
入库模块:首先判断数据文件是否存在,如存在以追加的方式打开,如不存在以写入的方式打开.输入图书的具体数据(在输入过程中,如输入的书号为0则返回主菜单)、存盘,判断存盘成功则打印“成功添加”,如存盘失败打印“添加失败”.最后返回入起始界面(入库模块)。
清除模块:进入清除模块则将文件中的全部数据用单链表的结构读入内存,提示输入要删除的书号,在内存中寻并删除,删除后可以马上存盘或是直到全部删除完成后再选择操作,在防止操作后忘记存盘,在程序中加入了自动判断操作过的数据是否己经进行过存盘的功能。
查询模块:本模块分为三个子模块:以书号方式查询、以书名的方式查询、以作者的方式查询。前两个查询功能只要到符合条件的数据时就停止,以作者方式因为考虑到一个作者不止一本作品,所以对全部的数据进行查,并打印出所有符合条件的数据。如果未到则打印“没有到”,最后返回子功能模块起始,直到输入0返回上一级。
借出、还书模块:这两个功能的思路完全一样,不同的是对数据中的现存量的运算。两个功能都是先建立一个图书类型的数据指针,逐条将文件中的数据读入内存,并与输入的数据进
行比较,如果一致则先对内存中的数据进行操作,再将文件中的fp指针后退sizeof(Book)个字节,将内存中的经过修改过的数据写入文件.完成一条操作后,提示进行下一条操作,输入0时返回主菜单。
(2)程序结构及模块名称描述
主程序
界面初始化
入 库
清 除
查 询
借 出
归 还
书号 查询
书名 查询
作者 查询
全部 列表
a ) void main() //主程序
b ) void s(long) //时间延迟函数
c ) void sta() //界面初始效果
d ) void wel() //界面初始效果
e ) void bookadd() //入库
f ) void sa_ve(sqtype) //清除函数中保存文件函数
g ) void del() //清除
h ) void r() //查询
j ) void s_1() //查询功能中以书号方式查询
sizeof 指针k ) void s_2() //以书名方式查询
l ) void s_3() //以作者方式查询
m ) void readall() //列出全部图书
n ) void borrow() //借出
o ) void back() //归还
p ) void bye() //退出效果
(3)主要模块算法描述
/*添加*/
void bookadd() /*添加图书*/
{
FILE *fp; Book finger; char temp[10];
fp=fopen(”blist.db",”rb");/*读方式打开文件*/
if(fp==NULL)
fp=fopen(”blist。db",”wb"); /*写方式打开文件*/
else/*如果有书就添加*/
{
fclose(fp);
fp=fopen(”blist.db","ab");/*追加方式打开文件*/
}
clrscr();
while(1)
{
printf(”\n请输入数据:\n”);/*逐个输入新图书的资料*/
printf("请输入书号(输入0结束添加):”);
gets(temp);
if(strcmp(temp,"0")) strcpy(finger.num,temp);
else break;
printf("请输入书名: ”);
scanf(”%s”,finger.name);
printf(”请输入书的作者: ");
scanf(”%s",finger.author);
printf(”请输入书的总数: ");
scanf(”%d”,&finger。total);b=getchar();
finger。al;
finger。next=NULL;
if(fwrite(&finger,sizeof(Book),1,fp))/*块写*/
{
printf("--——————--—-—-——-—--————----—-——-—---—---—————--—-———-----———-———-————----—--\n");
printf(”己成功添加:\n书号:%s 书名:%s 作者:%s 库存总量:%d 现存量:%d\n”,finger。num,finger。name,finger。al,finger。leavings);
printf(”--—--————-—------—-—---—--———-——-——-—-——---———-——-———----——--—-—----—---———-—”);
}
else printf(”对不起,数据写入文件错误!”);
}
fclose(fp);
clrscr();
}
/*删除*/
del() /*删除功能函数*/
{ FILE *fp;Book *head,*p,*q,*temp;char a[10],s;int flag=0,flag2,flag3=0;
fp=fopen("blist。db",”rb”);
head=p=q=(Book*)malloc(sizeof(Book));
fread(p,sizeof(Book),1,fp);
while(!feof(fp))
{ q=p; p=(Book*)malloc(sizeof(Book));
fread(p,sizeof(Book),1,fp); q—>next=p;
}
p->next=NULL;
del_re:
flag2=0; clrscr();
gotoxy(1,3);textcolor(4);cprintf("提示:");
textcolor(7);gotoxy(6,4);printf(”您可以逐次操作后存盘,也可以完成全部”);
gotoxy(6,5);printf(”操作后退出时存盘,不进行存盘您所有删");gotoxy(6,6);printf("除操作对文件无效!");
gotoxy(1,23);printf(”请输入要删除的书号(0退出,00存盘):");gets(a);
if(!strcmp(a,”0")) goto del_end;
else if(!strcmp(a,"00”))
{ if(flag==0) {gotoxy(50,24);textcolor(4);cprintf(”您还未进行任何删除操作!");textcolor(7);getch();clreol
();goto del_re;}
else {flag3+=sa_ve(head);goto del_re;}
}
p=head;
while(p!=q—>next)
{ if(!strcmp(a,p-〉num))
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论