图书管理系统 课程设计.docx
《图书管理系统 课程设计.docx》由会员分享,可在线阅读,更多相关《图书管理系统 课程设计.docx(35页珍藏版)》请在冰豆网上搜索。
图书管理系统课程设计
重庆理工大学
课程设计
课程程序设计基础a
(2)
题目C语言综合程序设计
院系名称计算机科学与工程学院
班级112030703
学生姓名李洋学号14
指导教师卢玲
评阅教师卢玲
时间2013.1.5
1问题描述
1.1图书信息管理系统设计
题目的基本要求如下:
图书信息包括:
编号、书名、作者名、分类号、出版单位、出版时间、库存数量,价格等。
读者信息包括:
编号,借阅号,姓名,最大借阅额度,已借阅数量。
设计的图书信息管理系统,应以下功能:
(1)系统以菜单方式工作、图书信息录入功能、图书信息浏览功能、图书信息的删除与修改
(2)图书信息查询功能
查询方式:
可以按书名,按作者名,按出版单位,按出版时间进行查询。
(3)读者信息的录入,读者信息的保存,读者信息的查询与修改
(8)图书借阅
a)输入读者信息:
查看是否允许借阅
b)如果允许借阅,查看该书籍是否还有库存,进行图书借阅操作:
在借阅表中添加新记录,修改库存,修改读者信息。
(9)还书
要求:
使用二进制文件方式存储数据,系统以菜单方式工作
(10)记录借阅的信息,并可以进行查询
1.2学生学籍管理系统设计
题目的基本要求如下:
使用下面的数据,用C/C++设计一个简单的学籍管理系统,实现出最基本的功能。
(1)数据录入功能:
对A.TXT进行数据录入、对B.TXT进行数据录入,只录入每个学生的学号、课程编号、课程名称、学分、平时成绩、实验成绩、卷面成绩共7个数据。
综合成绩、学分由程序根据条件自动运算。
实得学分的计算:
采用等级学分制。
(2)查询功能:
分为学生基本情况查询和成绩查询两种
(3)删除功能:
当在A.TXT中删除一个学生时,自动地在B.TXT中删除此人所有信息。
(4)排序功能:
能实现选择按综合成绩或实得学分升序或降序排序并显示数据。
2系统分析
2.1图书信息管理系统设计
2.1.1
(一)图书管理
(1)系统以菜单方式工作:
通过菜单调用函数进入不同的模块。
(2)图书信息录入功能:
录入并储存:
图书编号、书名、作者名、分类号、出版单位、出版时间、库存数量、价格。
(3)图书信息浏览功能:
用浏览函数打开已储存的文件信息并打印在屏幕上。
(4)图书信息查询功能:
查询出需要的信息并打印在屏幕上。
查询方式:
可以按编号,按书名,按作者名,按出版单位,按出版时间进行查询。
按编号查询时会检测输入的编号是否合法。
如果没有文件会提示先创建,如果文件中没有相关信息会提示无该信息。
(5)图书信息的删除与修改:
先按编号查询出需要删除或修改的信息,如果出入的编号有误,会提示重新输入,如果文件中没有相关信息,会提示无该信息。
查询后再进行删除或修改,系统会再次问管理员是否删除,最后保存删除或修改之后的信息。
(二)用户管理部分
用户注册:
进行新用户的申请。
输入新的借阅号时,会检测输入是否合法。
然后再输入姓名,在使用者眼里就完成了一个新用户的创建。
而在系统内部,同时会为新用户借书链表的最大借阅量和已借阅量赋初始值。
然后存储这个用户。
借阅登录:
进行单个人的信息管理。
包括对借阅号,姓名,借书记录还书记录修改。
输入正确借阅号进入该功能块后,会显示个人基本信息,和所有已经借阅的书本的编号和借阅的时间,并且调用修改函数显示修改菜单。
借书还书操作:
借书时调用函数判断学生是否有借书权利。
再调用图书管理函数进行查询有关书籍信息,有库存之后就能进行借书操作。
对学生最大借阅量和已借阅量进行修改,对书本库存量进行修改。
时调用系统时间记录该生借阅书本的起始日期,然后存储信息。
还书时,调用函数判断该生有没有借阅那本书,确认要归还,就对该生最大借阅量、已借阅量和图书库存量进行修改,然后保存已修改的信息。
2.1.2算法设计
(1)菜单模块:
用printf语句格式化输出一个菜单界面,然后用switch语句实现调用不同功能的函数。
用while语句写一个死循环,用if语句控制break跳出死循环。
(2)图书信息录入模块:
载入已有的图书信息链表(用if语句判断是否有相关信息)或者创建一个新的链表,然后在结点的数据域录入数据,最后以文件形式保存文件(此处调用储存函数)。
(3)图书信息查询模块:
先载入文件数据,然后用strcmp函数比较输入的数据是否与文件中的数据相同则查询成功,输出该信息。
如果循环结束还没有找到对应信息则查询失败。
(4)图书信息储存模块:
把图书信息的链以文件形式储存在硬盘中,用while语句控制循环结束,用p->pnext控制继续。
(5)图书信息删除模块:
先查询出要删除的结点的前驱,然后把要删除的结点的后继连接在前驱上,最后用free语句释放内存实现删除。
(6)图书结构体链表:
头指针
数据域
指针域
头结点
2.1.3关键问题
系统实现过程中的关键点:
文件信息的载入与保存。
一开始数据只有在运行程序时才有,结束程序后在运行程序又要重新添加数据。
后来用文件的方式解决了这个问题,把数据信息储存在硬盘中。
系统实现过程中的难点:
图书信息删除。
一开始我找到需要删除的结点,但是不知道如何写删除函数,多想了想,要找到需要删除的结点的前驱。
在原有代码的基础上加了一个->next,就可以找到前驱,最后实现删除。
2.2题目二
2.2.1题目要求
两个数据录入模块:
学生基本信息录入模块,此模块能够创建新的学生基本信息数据链包括学号、寝室号、电话号码的输入,同时还会创建一个对应的成绩链表节点以准备成绩的录入。
成绩录入模块,在基本信息已经有了的情况下可以录入该学生多门选课的信息,包括课程编号,课程名称,学和卷面成绩等等,还能通过录入的信息,自动的计算总成绩和按等级给出单科学分。
而且还能统计学生所有选课的最终成绩。
查询模块有多个查询方式,以菜单操作模式工作,可以按照寝室号、姓名、学号查询一个学生的基本信息并按照规范的格式输出到屏幕,还可以查询一个学生的成绩信息并输出各科成绩的具体信息。
单个人的成绩查询:
实现单个人多科成绩的浏览。
在有多个选课成绩的时候,可以有不同的方式来排列显示:
按综合成绩升序或降序和按实得学分升序或降序排列显式选课信息。
删除模块:
实现在按学号和查找学生,并询问是否删除查找到的学生的基本信息。
当用户选择了删除时,系统会自动查找相应的成绩信息并且自动的将其删除。
存取模块:
加载模块在整个程序的开始运行,包括基本信息和成绩信息的导入。
存储模块以txt的格式存储录入的数据,其中成绩信息存储模块是每存储一个学生的简要信息的头结点后存储该生的所有选课信息。
实现链表中的链表存储,即实现
2.2.2算法设计
查找函数均采用户先输入一个查询信息,然后用循环函数把用户输入的信息与信息链表上的相应信息进行对比,如果找到了就跳出循环,同时用一个全局变量记住一查询到的信息的节点地址或节点前驱地址。
若没找到,则把全局变量置为空。
3系统实现
3.1题目一
typedefstructDATE
{
intyear,month,day;
}date;
typedefstructBOOK
{
charno[5],/*编号*/name[22]/*书名*/,witer[9]/*作者*/,classify[2]/*分类*/,press[22]/*出版社*/;
DATEtime;//出版时间
intstock;//库存数量
floatprince;//价格
structBOOK*next;
}book;
book*head1;//图书头结点的全局变量
charbookno[5]={'0','0','0','0'};//供noseatch()函数和change_rr()函数配合使用
intbi/*比较*/;
book*e;//图书的全局指针
user*head;//头结点的全局变量
charjieyuehao[7]={"000000"};//借阅号的全局变量,供给借阅登录和修改信息函数使用,方便两个函数的互相调用
voidbooksearch();//图书查询
voidbooksave();//图书信息存储
voidnosearch();//change_rr()函数调用查询有无库存
user*acount_search();//专门用来查找指定用户,并且返回指定用户信息的地址,如果没有找到则返回NULL
intcheck(char*a);//核对输入的学号是否已经存在和输入的借阅号的位数是否合法
voidchange_list(user*pos);
//********************************************************************图书管理子函数
voidbookload()//载入数据
{
FILE*fp;
book*p;
head1=(book*)malloc(sizeof(book));//创建一个链表头
head1->next=NULL;//空链表
if(fopen("bookinfor.dat","r")==NULL)//如果本地没有已存档的信息,则返回一个链表头
{
;
}
else
{
fp=fopen("bookinfor.dat","r");
while(!
feof(fp))
{
p=(book*)malloc(sizeof(book));
fread(p,sizeof(book),1,fp);
if(feof(fp))
{
free(p);
break;
}
p->next=head1->next;
head1->next=p;
}
fclose(fp);
}
}
voidbooksave()/////////////////////////图书信息存储
{
FILE*fp;
book*p;
p=head1->next;
if((fp=fopen("bookinfor.dat","w"))==NULL)
{
system("CLS");
printf("\n\n\n\n\n\n\n\n\t\t系统不能为您保存刚才的信息!
!
!
");
printf("\n\n\n\n\n\t\t\t按回车继续");
fclose(fp);
fflush(stdin);
charch;
ch=getchar();
}
else
{
fp=fopen("bookinfor.dat","w");
while(p!
=NULL)
{
fwrite(p,sizeof(book),1,fp);
p=p->next;
}
}
fclose(fp);
}
voidbookview()///////////////////////////////////////////图书浏览
{
bookload();
system("CLS");
book*p=head1->next;
if(head1->next!
=NULL)
{
printf("编号书名作者名分类号出版单位出版年月库存数量价格\n");
printf("-------------------------------------------------------------------------------\n");
for(;;)
{
printf("%-2s%-2s%-5s%s%-15s%d-%d%-2d%-2.2f\n",p->no,p->name,p->witer,p->classify,p->press,p->time.year,p->time.month,p->stock,p->prince);
p=p->next;
printf("-------------------------------------------------------------------------------\n");
if(p==NULL)
{
break;
}
}
printf("\n\n\n\n\n\t\t\t按回车继续");
fflush(stdin);
charch;
ch=getchar();
}
else
{
system("CLS");
printf("\n\n\n\n\n\n");
printf("\t\t");
printf("还没有相关数据,请先创建数据!
按回车继续");
charch;
fflush(stdin);
ch=getchar();
}
}
voidbookprn()///////////////////////////////////////////单本图书操作
{
//bookload();
printf("\n\n");
book*p;
p=e;
printf("编号书名作者名分类号出版单位出版年月库存数量价格\n");
printf("-------------------------------------------------------------------------------\n");
printf("%-2s%-2s%-5s%s%-15s%d-%d%-2d%-2.2f\n",p->no,p->name,p->witer,p->classify,p->press,p->time.year,p->time.month,p->stock,p->prince);
printf("\n\n\n\n\n\t\t\t按回车继续");
fflush(stdin);
charch;
ch=getchar();
}
intcheckbook(char*a)//核对输入的编号是否已经存在和输入的借阅号的位数是否合法
{
book*p=head1->next;
while(p!
=NULL)
{
if(strcmp(p->no,a)==0||strlen(a)!
=4)
{
return(0);
}
p=p->next;
}
return
(1);
}
voidbookadd()///////////////////////////////////////////添加图书信息
{
book*p;
bookload();//载入已有的图书信息链表或者创建一个新的链表
while
(1)//实现载入若干个书的信息
{
p=(book*)malloc(sizeof(book));
system("CLS");
printf("输入图书编号(4位):
");
while
(1)
{
fflush(stdin);
gets(p->no);
if(checkbook(p->no)==0)
{
system("CLS");
printf("该借编号有错误或已存在,请重新输入编号(4位):
");
}
else
break;
}
printf("输入图书名:
");
fflush(stdin);
gets(p->name);
printf("请输入作者名:
");
fflush(stdin);
gets(p->witer);
printf("请输入图书分类:
");
fflush(stdin);
gets(p->classify);
printf("请输入出版单位:
");
fflush(stdin);
gets(p->press);
printf("请输入出版时间年月:
");
scanf("%d%d",&(p->time.year),&(p->time.month));
printf("请输入库存量:
");
scanf("%d",&p->stock);
printf("请输入价格:
");
scanf("%f",&p->prince);
system("CLS");
p->next=head1->next;//将新图书信息添加到已有的图书信息链表上
head1->next=p;
booksave();//保存新录入的信息
printf("\n\n\n\n\n\n\n\n\t\t你已经添加了一个新图书信息,是否继续添加[y(yes)/n(no)]:
");
fflush(stdin);
if(getchar()=='n')
{
break;
}
system("CLS");
}
}
voidbookdel()///////////////////////////////////////////删除图书信息
{
system("CLS");
bookload();
book*p;
book*r;
p=head1;
if(strcmp(bookno,"0000")==0)
{
while
(1)
{
printf("\t\t\t请输入要删除的书本编号(4位):
");
fflush(stdin);
gets(bookno);
if(strlen(bookno)==4)
break;
else
{
system("CLS");
printf("\t\t\t输入有误,请重新输入\n");
}
}
}
while((p->next)!
=NULL)//寻找前驱
{
bi=strcmp((p->next->no),bookno);
if(bi==0)
{
r=p;
break;
}
p=p->next;
}
strcpy(bookno,"0000");
if(p->next==NULL)
{
e=NULL;
system("CLS");
printf("\n\n\n\n\n\n\n\n");
printf("\t\t\t");
printf("查询失败,无相应数据!
!
");
printf("\n\n\n\n\n\t\t\t按回车继续");
fflush(stdin);
charch;
ch=getchar();
}
else
{
e=r->next;//把本结点地址传给e
system("CLS");
bookprn();
printf("\t\t\t\t是否删除y/n");
fflush(stdin);
if(getchar()=='y')
{
r->next=e->next;
free(e);
booksave();
printf("\n\t\t\t删除完成\n");
printf("\n\n\n\n\n\t\t\t按回车继续");
fflush(stdin);
charch;
ch=getchar();
}
}
}
voidnosearch()//按编号查询
{
system("CLS");
book*p=head1->next;
intk=0;
if(strcmp(bookno,"0000")==0)
{
while
(1)
{
printf("\t\t请输入书本编号(4位):
");
fflush(stdin);
gets(bookno);
if(strlen(bookno)==4)
{
k=1;
break;
}
else
{
system("CLS");
printf("输入有误,请重新输入");
}
}
}
while(p!
=NULL)
{
bi=strcmp((p->no),bookno);
if(bi==0)
{
e=p;
break;
}
p=p->next;
}
//trcpy(bookno,"0000");
if(p==NULL)
{
e=NULL;
system("CLS");
printf("\n\n\n\n\n\n\n\n");
printf("\t\t\t");
printf("\t\t查询失败,无相应数据!
!
");
printf("\n\n\n\n\n\t\t\t按回车继续");
fflush(stdin);
charch;
ch=getchar();
}
else
{
if(k)
{
bookprn();
}
}
}
voidpresssearch()//按出版社查询
{
system("CLS");
book*p=head1->next;
charx[22];
inti=0;
printf("\t\t\t请输入要查询的书的出版社:
");
scanf("%s",x);
while(p!
=NULL)
{
bi=strcmp((p->press),x);
if(bi==0)
{
e=p;
bookprn();
i++;
}
p=p->next;
}
if(i==0)
{
system("CLS");
printf("\n\n\t\t\t查询失败,无相应数据!
!
");
printf("\n\n\n\n\n\t\t\t按回车继续");
fflush(stdin);
charch;
ch=getchar();
}
}
voidbookrevise()///////////修改图书信息
{
system("CLS");
bookload();
book*p=head1->next;
if(strcmp(bookno,"0000")==0)
{
while
(1)
{
printf("\t\t\t请输入要修改的书本编号(4位):
");
fflush(stdin);
gets(bookno);
if(strlen(bookno)==4)
break;
else
{
system("CLS");
printf("\t\t\t输入有误,请重新输入\n");
}
}
}
while(p!
=NULL)
{
bi=strcmp((p->no)