数据结构c语言图书系统.docx
《数据结构c语言图书系统.docx》由会员分享,可在线阅读,更多相关《数据结构c语言图书系统.docx(38页珍藏版)》请在冰豆网上搜索。
数据结构c语言图书系统
图书借阅管理是图书馆一个最基本的工作,这里用C语言的知识设计开发一个简单的图书借阅管理系统,系统主要实现图书信息和学生信息的管理,图书查询及图书借阅管理。
系统设计要求
系统主要实现以下六个功能:
①用户登录。
系统用户分为管理员和学生。
管理员登录时必须输入密码,密码正确才能进入系统;学生登录时无需密码,输入学号即可。
②图书信息管理。
图书信息包括:
书号、书名、作者、图书分类、出版社、出版时间、单价、总量和库存量。
图书信息管理包括:
输入图书信息<从键盘或从文件)、保存图书信息、修改图书信息、增加图书信息、删除图书信息和输出图书信息。
③学生信息管理。
学生信息包括:
学号、姓名、借书卡<借阅标记、书号、借阅时间)。
学生信息管理包括:
输入学生信息<从键盘或从文件)、保存学生信息、修改学生信息、增加学生信息、删除学生信息和输出学生信息。
④图书查询功能。
图书查询分为:
按书名查询、按作者查询、按图书分类查询、按出版社查询和按出版时间查询。
⑤借书功能。
借书时,先判断学生是否有空闲的借书卡,若没有则应输出提示信息;若有空闲的借书卡,则要求学生输入所借图书的书号,若该书库存量不为0,则将该书借出,同时在借书卡上记录该书的书号和借阅时间,并修改该书的库存量。
⑥还书功能。
还书时,先检查学生的借书卡,若借书卡都为空,则不能进行还书操作,若有借书卡不为空,则可以还书,此时要求学生输入所还图书的书号,将对应借书卡上的记录清零,并修改该书的库存量。
数据结构设计
系统共定义了四个结构体类型,包括日期类型、借书卡类型、图书类型和学生类型,其中在图书类型中要使用日期类型,而在学生类型中要使用日期和借书卡类型,定义如下:
typedefstructdate//日期类型
{shortyear。
//年
shortmonth。
//月
shortday。
//日
}SDATE。
typedefstructlibrary_card//借书卡类型
{Shortflag。
//是否借阅标记
CharISBN[20]。
//所借图书的书号
SDATEbor_time。
//借阅时间
}SLCARD。
typedefstructstudent//学生类型
{charnum[15]。
//学号
charname[20]。
//姓名
SLCARDcard[5]。
//借书卡<规定每人最多有5张)
}SSTUD。
typedefstructbook//图书类型
{charISBN[20]。
//书号
charbookname[40]。
//书名
charauthor[20]。
//作者
charpublisher[30]。
//出版社
charbookclass[20]。
//图书分类
shorttotal_num,stock_num。
//总量,库存量
floatprice。
//单价
SDATEpublish_time。
//出版时间
}SBOOK。
系统定义了两个全局变量数组,分别存放图书信息和学生信息,因数组大小是固定的,为使用方便在系统中定义两个符号常量,具体定义如下:
#defineBOOKNUM1000//BOOKNUM为系统允许的最大图书数量
#defineSTUDNUM100//STUDNUM为系统允许的最多学生人数
SSTUDstudent[STUDNUM]={0}。
//学生数组,初始化为0
SBOOKbook[BOOKNUM]={0}。
//图书数组,初始化为0
3.功能模块设计
(1>main函数的设计:
因为图书信息和学生信息都保存在文件中,系统运行的第一个工作是从文件中将图书信息和学生信息读入到内存数组book和数组student中,在读入信息的过程中同时统计出目前图书的数量和学生的人数,并将数据分别存放在整型变量bn和sn中,bn为图书数量,sn为学生人数。
如果bn=0或sn=0,系统会输出提示信息,让管理员输入图书信息和学生信息。
然后系统会显示主菜单,用户必须登录后才能使用系统提供的各种服务。
(2>用户登录管理模块包括2个函数:
ManagerLogin(>和StudentLogin(>,该模块由main函数调用。
函数ManagerLogin(>用来完成管理员登录工作,首先要求管理员用户输入密码,若密码错误,则直接返回主菜单界面;密码正确时将显示管理员用户的功能菜单,输入数字可执行相应的功能。
函数StudentLogin(>用来完成学生登录工作,要求学生输入学号,若学号错误则要求学生重新输入学号;输入学号正确则显示学生用户的功能菜单,输入数字可执行相应的功能。
(3>图书信息管理模块包括11个函数:
InputOnebook(>、LoadBooks(>、SaveOnebook(>、SaveAllbooks(>、OriginalBook(>、ModifyBook(>、AddBook(>、DelBook(>、OutputOnebook(>、OutputAllbooks(>和OutputBrief(>。
只有管理员用户可以调用图书信息管理模块。
函数InputOnebook(>用来实现从键盘输入一本图书的全部信息。
函数LoadBooks(>用来实现从文件“book.dat”中输入全部图书的信息,并将这些数据存放到内存数组book中。
函数SaveOnebook(>用来实现将一本图书的信息保存到文件“book.dat”中。
函数SaveAllbooks(>用来实现将全部图书的信息保存到文件“book.dat”中。
函数OriginalBook(>用来实现图书信息的初始化,在程序第1次运行时必须调用该函数,输入若干本图书的信息,并将这些信息保存在文件中。
该函数是通过循环多次调用InputOnebook(>函数实现多本图书信息的输入,然后调用SaveAllbooks(>函数将已输入的所有图书的信息保存在文件“book.dat”中。
函数ModifyBook(>用来实现对图书信息的修改,用户首先输入书号,书号错误则输出提示信息,要求用户重新输入;书号正确则用户可以选择要修改的数据项对图书信息进行修改<用switch结构实现),一本图书的信息修改完毕后,调用SaveOnebook(>函数,将修改后的信息保存到文件中。
然后询问用户是否继续修改其他图书的信息,用户选择‘y’,则重复上述的修改过程;用户选择‘n’,则结束函数,返回到管理员菜单界面。
函数AddBook(>用来实现添加图书信息,通过调用InputOnebook(>函数,从键盘输入一本图书的信息,然后将该信息写入文件。
然后询问用户是否继续添加其他图书的信息,用户选择‘y’,则重复上述过程;用户选择‘n’,则结束函数,返回到管理员菜单界面。
函数DelBook(>用来实现删除图书信息,用户首先输入书号,书号错误则输出提示信息,要求用户重新输入;书号正确则会先输出该书号对应图书的信息,然后询问用户是否确定要删除该书的信息,用户选择‘y’才能真正删除该书信息。
最后询问用户是否继续删除其他图书的信息,用户选择‘y’,则重复上述过程;用户选择‘n’,则结束函数,返回到管理员菜单界面。
函数OutputOnebook(>用来实现输出一本图书的全部信息。
函数OutputAllbooks(>通过多次调用OutputOnebook(>函数来实现输出全部图书的信息。
函数OutputBrief(>用来实现以列表方式输出全部图书的简要信息,简要信息包括:
书号、书名、作者和总量。
(4>学生信息管理模块包括10个函数:
InputOnestud(>、LoadStuds(>、SaveOnestud(>、SaveAllstuds(>、OriginalStud(>、ModifyStud(>、AddStud(>、DelStud(>、OutputOnestud(>和OutputAllstuds(>。
管理员用户可以使用学生信息管理模块的全部功能,学生用户只能使用该模块中的一个功能,即OutputOnestud(>函数<输出一个学生的信息)。
学生信息管理模块中函数的实现方法与图书信息管理中的类似,以下仅作简单说明。
函数InputOnestud(>用来实现从键盘输入一个学生的信息。
函数LoadStuds(>用来实现从文件“stud.dat”中输入全部学生的信息,并将这些数据存放到内存数组student中。
函数SaveOnestud(>用来实现将一各学生的信息保存到文件“stud.dat”中。
函数SaveAllstuds(>用来实现将全部学生的信息保存到文件“stud.dat”中。
函数OriginalStud(>用来实现学生信息的初始化,在程序第1次运行时必须调用该函数。
该函数是通过循环多次调用InputOnestud(>函数实现多个学生信息的输入,然后调用SaveAllstuds(>函数将已输入的所有学生的信息保存在文件“stud.dat”中。
函数ModifyStud(>用来实现学生信息的修改。
函数AddStud(>用来实现添加学生信息。
函数DelStud(>用来实现删除学生信息。
函数OutputOnestud(>用来实现输出一个学生的全部信息。
函数OutputAllstuds(>用来实现输出全部学生的基本信息<即学号和姓名)。
(5>图书信息查询模块包括6个函数:
SearchMenu(>、SearcBname(>、SearchAuthor(>、SearchBclass(>、SearchPublisher(>、SearchPubtime(>。
管理员和学生都可以使用图书信息查询模块。
函数SearchMenu(>用来显示图书查询服务菜单,用户输入数字可执行相应的查询服务。
函数SearcBname(>用来实现按书名进行图书信息的查询。
用户可以输入完整的书名进行精确查询<如输入“C语言程序设计”),精确查询是使用字符串比较函数strcmp(>,将输入的书名与已有图书的书名逐一进行比较,当该函数的返回值等于0,表示这两个书名完全相同,即找到要查询的图书。
另外,用户也可以输入书名中的几个字进行模糊查询<如输入“C语言”,或输入“程序设计”),模糊查询是使用求子串函数strstr(>,在已有图书的书名中寻找输入的字符串,如果该函数的返回值不为空,则说明该书名中包含这个字符串,那么就应该输出这本图书的信息。
通常,模糊查询会列出多个查询结果。
函数SearchAuthor(>用来实现按作者姓名进行图书信息的查询。
用户可以输入完整的姓名进行精确查询<如输入“谭浩强”),也可以只输入姓氏进行模糊查询<如只输入“张”),具体方法与按书名查询类似。
函数SearchBclass(>用来实现按图书分类进行图书信息的查询。
考虑到用户可能不能输入完全正确的图书分类名称,所以在该函数中只采用模糊查询方式。
函数SearchPublisher(>用来实现按出版社名称进行图书信息的查询。
用户在输入出版社名称时,一般不会输入“出版社”这三个字<如想查询清华大学出版社的图书,通常用户会输入“清华大学”),所以在该函数中也是只采用模糊查询方式。
函数SearchPubtime(>用来实现按出版日期进行图书信息的查询。
使用该函数必须注意要按系统规定的格式输入日期,若想查询2004年5月份出版的图书,则应输入“2004.5”;若想查询2004年出版的图书,则应输入“2004”。
假设输入日期为“2004.5”,进行查询时,先判断输入的年份与出版日期中的年份是否相等,若不相等则结束本次循环,若相等则用变量k记录其下标,然后再判断月份是否相等,月份若不相等则用continue结束本次循环,月份若相等则可输出这本书<即第k本书)的信息,然后再继续判断下一本图书。
(6>图书借阅管理模块包括2个函数:
BorrowBook(>和ReturnBook(>函数。
函数BorrowBook(>用来实现借书管理。
由学生类型定义可知,每个学生有5张借书卡,借书卡的信息包括:
借阅标记flag、所借图书的书号ISBN和借阅时间bor_time。
借书时,首先查找学生是否有空闲的借书卡<即判断该生借书卡的借阅标记flag是否为0),若flag为0,则可以借书,这时要求学生输入要借图书的书号,然后在图书数组book中查找该书,若在数组book中没找到该书,则提示“输入的书号有误,请重新输入!
”;若找到该书,则先判断该书的库存量是否为0,若库存量为0则提示"抱歉!
该书库存量为0,无法借阅!
”。
若库存量大于0,则将该书借给学生,此时需要进行以下6步操作:
step1将该书的库存量减1;
step2学生借书卡的借阅标记flag置1;
step3学生借书卡的书号填写上该书的书号;
step4学生借书卡的借阅时间赋值为系统时间;为了提取系统时间,首先定义一个结构体变量d:
structtmd。
结构体类型structtm定义在文件“time.h”中,具体定义如下:
structtm
{inttm_sec。
//secondsaftertheminute-[0,59]
inttm_min。
//minutesafterthehour-[0,59]
inttm_hour。
//hourssincemidnight-[0,23]
inttm_mday。
//dayofthemonth-[1,31]
inttm_mon。
//monthssinceJanuary-[0,11]
inttm_year。
//yearssince1900
inttm_wday。
//dayssinceSunday-[0,6]
inttm_yday。
//dayssinceJanuary1-[0,365]
inttm_isdst。
//daylightsavingstimeflag
}。
这里我们需要使用其中的3个成员:
tm_year、tm_mon和tm_mday。
通过调用函数_getsystime(&d>。
可以得到系统时间,假设用下面语句输出日期:
printf("%d.%d.%d",d.tm_year,d.tm_mon,d.tm_mday>。
若借书日期是1998.5.12,则会输出98.4.12,若借书日期为2005.5.12,则会输出105.4.12,这样的输出结果显然不好,为了正确输出1998.5.12或2005.5.12,必须对成员tm_year和tm_mon进行处理,对于tm_mon的处理比较简单,直接加1即可如果年份整除100等于0<即年份<2000),则年份=1900+d.tm_year;如果年份整除100等于1<即年份>=2000),则年份=2000+d.tm_year%100。
step5保存修改过的图书信息和学生信息;
step6提示用户借书成功。
最后询问学生是否"继续借书吗?
(y/n>",若学生输入‘y’,则重复上面的借书过程;若输入‘n’,则返回到学生功能选择菜单界面。
函数ReturnBook(>用来实现还书管理。
还书时,首先统计该生有几张已使用的借书卡,将数据存放在变量t中,若t为0,说明该生目前根本没有借阅的图书,无法进行还书操作;若t大于0,则可进行还书操作,先输入书号,在学生的借书卡中寻找,若没找到该书号,则提示"输入的书号有误,请重新输入!
";若找到该书号,则通过以下6个步骤进行还书:
step1学生借书卡的借阅标记flag置0;
step2学生借书卡的书号置空;
step3学生借书卡的借阅时间清0;
step4变量t减1;
step5在数组book中寻找该书号,找到后其库存量加1;
step6保存修改过的图书信息和学生信息。
最后询问学生是否"继续还书吗?
(y/n>",若学生输入‘y’,则重复上面的还书过程;若输入‘n’,则返回到学生功能选择菜单界面。
部分源程序代码
#include
#include
#include
#include
#include
//结构体类型的定义
typedefstructdate//日期类型
{shortyear。
//年
shortmonth。
//月
shortday。
//日
}SDATE。
typedefstructlibrary_card//借书卡类型
{shortflag。
//是否借阅标记
charISBN[20]。
//所借图书的书号
SDATEbor_time。
//借阅时间
}SLCARD。
typedefstructstud//学生类型
{charnum[15]。
//学号
charname[20]。
//姓名
SLCARDcard[5]。
//借书卡
}SSTUD。
typedefstructbook//图书类型
{charISBN[20]。
//书号
charbookname[40]。
//书名
charauthor[20]。
//作者
charpublisher[30]。
//出版社
charbookclass[20]。
//图书分类
shorttotal_num,stock_num。
//总量,库存量
floatprice。
//单价
SDATEpublish_time。
//出版时间
}SBOOK。
#defineSDATE_LENsizeof(SDATE>//SDATE_LEN为日期类型占用存储空间的大小
#defineSLCARD_LENsizeof(SLCARD>//SLCARD_LEN为借书卡类型占用存储空间的大小
#defineSSTUD_LENsizeof(SSTUD>//SSTUD_LEN为学生类型占用存储空间的大小
#defineSBOOK_LENsizeof(SBOOK>//SBOOK_LEN为图书类型占用存储空间的大小
#defineBOOKNUM1000//图书总数,可按需要更改其数值
#defineSTUDNUM100//学生总数,可按需要更改其数值
SSTUDstudent[STUDNUM]={0}。
//学生数组(全局变量>
SBOOKbook[BOOKNUM]={0}。
//图书数组(全局变量>
//函数声明
voidManagerLogin(int*pbn,int*psn>。
//管理员登录函数
voidStudentLogin(intbn,intsn>。
//学生登录函数
voidInputOnebook(inti>。
//输入一本图书信息的函数
intLoadBooks(void>。
//从文件载入全部图书信息的函数
voidSaveOnebook(inti>。
//保存一本图书信息的函数
voidSaveAllbooks(intbn>。
//保存全部图书信息的函数
intOriginalBook(void>。
//图书信息初始化的函数
voidModifyBook(intbn>。
//修改图书信息的函数
intAddBook(intbn>。
//添加图书信息的函数
intDelBook(intbn>。
//删除图书信息的函数
voidOutputOnebook(inti>。
//输出一本图书信息的函数
voidOutputAllbooks(intbn>。
//输出全部图书详细信息的函数
voidOutputBrief(intbn>。
//输出全部图书简要信息的函数
voidInputOnestud(inti>。
//输入一个学生信息的函数
intLoadStuds(void>。
//从文件载入全部学生信息的函数
voidSaveOnestud(inti>。
//保存一个学生信息的函数
voidSaveAllstuds(intsn>。
//保存全部学生信息的函数
intOriginalStud(void>。
//学生信息初始化的函数
voidModifyStud(intsn>。
//修改学生信息的函数
intAddStud(intsn>。
//添加学生信息的函数
intDelStud(intsn>。
//删除学生信息的函数
voidOutputOnestud(inti>。
//输出一个学生信息的函数
voidOutputAllstuds(intsn>。
//输出全部学生信息的函数
voidSearchMenu(intbn>。
//图书查询函数
voidSearcBname(intbn>。
//按书名查询函数
voidSearchAuthor(intbn>。
//按作者查询函数
voidSearchBclass(intbn>。
//按图书分类查询函数
voidSearchPublisher(intbn>。
//按出版社查询函数
voidSearchPubtime(intbn>。
//按出版时间查询函数
voidBorrowBook(intbn,intm>。
//借书函数
voidReturnBook(intbn,intm>。
//还书函数
voidmain(void>//main函数定义
{
intselect,bn,sn。
bn=LoadBooks(>。
//调用LoadBooks(>,返回值为图书数量,将其赋值给bn
if(bn==0>printf("图书信息为空!
\n\n">。
sn=LoadStuds(>。
//调用LoadStuds(>,返回值为学生人数,将其赋值给sn
if(sn==0>printf("学生信息为空!
\n\n">。
while(1>
{
printf("\n">。
printf("\t--------------------------------------\n">。
printf("\t**\n">。
printf("\t*图书借阅管理系统*\n">。
printf("\t**\n">。
printf("\t---------------------------------------\n\n">。
printf("\t1.管理员\n">。
printf("\t2.学生\n">。
printf("\t0.退出系统\n\n">。
printf("\t请选择用户:
">。
scanf("%d",&select>。
getchar(>。
//该函数用于读取回车符,消除对以后数据输入的影响
switch(select>
{
case1:
ManagerLogin(&bn,&sn>。
break。
case2:
StudentLogin(bn,sn>。
break。
case0:
printf("\n谢谢使用!
再见\n">。
exit(1>。
default:
printf("\n按键错误,请重新选择!
\n">。
}//endswitch
}//endwhile
}
//用