C语言设计的图书管理系统设计实践报告.docx
《C语言设计的图书管理系统设计实践报告.docx》由会员分享,可在线阅读,更多相关《C语言设计的图书管理系统设计实践报告.docx(56页珍藏版)》请在冰豆网上搜索。
C语言设计的图书管理系统设计实践报告
C语言设计的图书管理系统设计实践报告
1问题描述
图书管理系统作为一个应用软件将为学校的老师和学生提供一个与学校图书馆图书以及个人信息进行交互的平台。
根据系统界面的提示信息,操作者就可以对图书信息进行查询,借阅,还书,登陆个人账户则可以个人账户信息,管理员通过登陆管理员账户可以整理和修改书籍和学生信息。
2开发环境
visualC++6.0
3功能分析
角色1:
管理员
序号
功能描述
备注
1
书籍借阅
——
2
书籍归还
账户状态有提示
3
查询书籍信息
能按书名、作者、编号查找
4
修改账户密码
——
5
修改学生数据
仅管理员有此权限
6
修改图书数据
仅管理员有此权限
7
查询账户状态
会提示还书
角色2:
学生
序号
功能描述
备注
1
书籍借阅
——
2
书籍归还
账户状态有提示
3
查询书籍信息
能按书名、作者、编号查找
4
修改账户密码
——
7
查询账户状态
会提示还书
4项目设计
4.1程序结构设计
管理权限
4.2数据结构设计
程序中用到的特殊数据结构(非标准C的基本数据类型)。
存储学生数据的结构体:
typedefstructinformation
{
charbookNum[10];
charbookNam[50];
charbookAut[20];
floatbookPri;
intstatus;
structinformation*next;
}info;
存储图书数据的结构体:
typedefstructstudent
{
charstuNam[20];
charnumber[10];
charpassKey[20];
intborrowSta;
charkey;
structstudent*next;
}studentDat;
4.3主要算法
(1)查询书籍函数:
findBo
12340
(2)登录函数:
checkAcc
Y
N
(3)更改书籍函数:
changeBo
12340
(4)删除书籍函数:
delBook
Y
N
(5)添加书籍信息函数:
addBook
Y
N
5程序运行及调试
(1)进入系统
(2)创建数据
(3)主菜单
(4)实现的主要功能
6总结
首先说说系统运用的原理,主要是是图书数据和学生数据的动态存储与调用,通过函数之间的相互调用实现系统各级菜单的层次递进。
操作者运行系统时需要先检查是否存在相应的数据文件,如果没有则说明系统首次运行,待初始化数据后,需要建立针对图书数据和学生数据的两个不同的独立链表,并且将链表数据存储到文件中,随后向各个函数传入链表首地址(首地址固定),根据各个函数功能的不同,如果需要更改学生或者图书数据,则直接通过对链表的删除、增加和查询实现对学生信息以及图书信息的访问、修改和调用操作。
随后系统将修改后的链表数据再次存入固定文件中,操作者每次运行系统时,重复以上对链表和文件的操作,以此实现外界和系统存储数据的动态交互,提高系统运行效率。
另外图书数据和学生数据都以结构体数据块的形式存储,以便于操作。
这个图书管理系统几乎里面所有的东西都是C语言课程所讲的,比如说链表的创建、删除、排序、添加,结构体的正确使用,文件的创建、存储、读取,指针的操作,函数之间参数的传递等等。
在开始着手完成整个系统之前,我先写出了所有会用到的函数声明,同时根据系统的各级之间嵌套关系和调用关系确定了所有必须用到的和需要传递的参数,甚至预先还画出了流程图,我觉得这样的话思路会比较清晰,而不是写一点代码,再想想会用到的东西。
虽然这样,最后我还是发现了代码存在一些问题,因为写每个函数时没有单独调试,到最后还是稍显麻烦,同时也是因为层层嵌套的原因,导致一个地方改动的话,很多地方都要稍加改动,这些以后都可以稍加注意,可以提高自己的工作速率。
对于自己着手的这个图书管理系统,我觉得功能实现的还是比较完善的,本参照一个真正的系统的使用情况,我对多方面都进行了考虑,也从用户自身的角度来对代码进行了相应的优化,比如每个一些函数结束之后会自动弹出功能菜单来提示操作者接下来可能要执行的各种操作,还有就是如果用户某一项操作没有成功之后,会清楚地提示让用户做出正确的选择,而不是程序死在一个地方或是毫无提示信息。
不过仍然有一些东西我觉得还有点欠缺,函数之间的嵌套关系导致了很多函数需要传入更多的参数、系统从链表读取数据之后是以二进制的形式来存入文件中的,这样虽然在数据量大的情况下能够提高程序的运行效率,但是操作者却不能像修改TXT文件那样直接在文件中修改数据,管理员要想更改数据还必须在运行系统之后调用相应的系统功能函数来实现更改操作,这样的话在数据量巨大的情况下略显繁琐。
7主要源代码
#include
#include
#include
#include
#defineSTUsizeof(studentDat)
#defineBOKsizeof(info)
#definestuNUM10
#defineboNUM10
typedefstructinformation
{
charbookNum[10];
charbookNam[50];
charbookAut[20];
floatbookPri;
intstatus;
structinformation*next;
}info;
typedefstructstudent
{
charstuNam[20];
charnumber[10];
charpassKey[20];
intborrowSta;
charkey;
structstudent*next;
}studentDat;
voidsysMenu();//系统初级主菜单
voidchoMenu();//登录账号界面
studentDat*loadStu();//载入学生数据
Info*loadBo();//载入图书数据
voidmenuFir(charstuNumber[],studentDat*Shead,info*Bhead,charmanaLimit);//主要功能界面
voidborRet(info*Bhead,charstuNumber[],studentDat*Shead,charmanaLimit);//借还书界面
voidfindBo(info*Bhead,charstuNumber[],studentDat*Shead,charmanaLimit);//查询书籍
studentDat*creatStu();//创建学生数据
Info*creatInfo();//创建图书数据
voidstuDat(studentDat*Shead,charstuNumber[]);//学生状态信息
voidcheckAcc(charstuNumber[],studentDat*Shead,info*Bhead,charmanaLimit);//登录账户检查
voidbottowBo(charnumber[],info*Bhead,studentDat*Shead,charmanaLimit);//借书系统
voidreturnBo(charnumber[],info*Bhead,studentDat*Shead,charmanaLimit);//还书系统
voidprint(info*Bhead);//全部显示
voidchangeDat(info*Bhead,studentDat*Shead,charmanaLimit,charstuNumber[]);//更改系统数据
voiddelStu(info*Bhead,studentDat*Shead,charmanaLimit,charstuNumber[]);//删除学生
voidaddStu(info*Bhead,studentDat*Shead,charmanaLimit,charstuNumber[]);//增添学生
voiddelBook(info*Bhead,studentDat*Shead,charmanaLimit,charstuNumber[]);//删除书籍
voidaddBook(info*Bhead,studentDat*Shead,charmanaLimit,charstuNumber[]);//增添书籍
voidchangeBo(info*Bhead,studentDat*Shead,charmanaLimit,charstuNumber[]);//更改图书数据
voidchangeStu(info*Bhead,studentDat*Shead,charmanaLimit,charstuNumber[]);//更改学生数据
voidchangeAcc(charstuNumber[],studentDat*Shead,info*Bhead,charmanaLimit);//更改账户密码
voidcheckNam(info*Bhead);//按书名查找
voidcheckNum(info*Bhead);//按编号查找
voidcheckAut(info*Bhead);//按作者查找
Intsystem(constchar*string);//清屏操作
intmain(void)
{
sysMenu();
return0;
}
voidsysMenu()//系统初级菜单
{
intchoise1;
printf("\n欢迎使用图书管理系统\n");
printf("-------------------------------------------------------------------\n");
printf("----\n");
printf("--1.进入系统|0.退出系统--\n");
printf("----\n");
printf("-------------------------------------------------------------------\n");
printf("\n请选择:
");
scanf("%d",&choise1);
while(choise1!
=0)
{
if(choise1==1)
{
system("cls");
choMenu();
}
else
{
printf("输入数据有误!
请重输:
");
scanf("%d",&choise1);
}
}
if(choise1==0)
{
exit(0);
}
}
voidchoMenu()//登录账号界面
{
intchoise2;
charmanaLimit,number[10];
studentDat*Shead;
info*Bhead;
printf("\n系统登录\n");
printf("--------------------------------------------------------------------\n");
printf("----\n");
printf("--1.管理员登录--\n");
printf("--2.普通账号登录--\n");
printf("--0.退出系统--\n");
printf("----\n");
printf("-----------------------------------------------------------------\n");
printf("请选择:
");
scanf("%d",&choise2);
while(choise2!
=0)
{
if(choise2==1)
{
manaLimit='1';
checkAcc(number,Shead,Bhead,manaLimit);
}
else
{
if(choise2==2)
{
manaLimit='0';
checkAcc(number,Shead,Bhead,manaLimit);
}
else
{
printf("输入数据有误!
请重输:
");
scanf("%d",&choise2);
}
}
}
exit(0);
}
studentDat*loadStu()//载入学生数据
{
intn;
FILE*fp;
studentDat*head,*p1,*p2;
fp=fopen("Account.dat","rb+");
n=0;
p1=p2=(studentDat*)malloc(STU);
fread(p1,STU,1,fp);
head=NULL;
while(!
feof(fp))
{
if(n==0)
{
head=p1;
n=n+1;
}
else
{
p2->next=p1;
p2=p1;
}
p1=(studentDat*)malloc(STU);
fread(p1,STU,1,fp);
}
p2->next=NULL;
fclose(fp);
returnhead;
}
Info*loadBo()//载入图书数据
{
FILE*fp;
info*head,*p1,*p2;
intn;
fp=fopen("bookInfo.dat","rb+");
n=0;
p1=p2=(info*)malloc(BOK);
fread(p1,BOK,1,fp);
head=NULL;
while(!
feof(fp))
{
if(n==0)
{
head=p1;
n=n+1;
}
else
{
p2->next=p1;
p2=p1;
}
p1=(info*)malloc(BOK);
fread(p1,BOK,1,fp);
}
p2->next=NULL;
fclose(fp);
returnhead;
}
voidmenuFir(charstuNumber[],studentDat*Shead,info*Bhead,charmanaLimit)//主要功能界面
{
intchoise2;
printf("|功能菜单|\n");
printf("---------------------------------------------\n");
printf("----\n");
printf("--1.查询书籍信息--\n");
printf("--2.借书与还书--\n");
printf("--3.个人账户状态--\n");
printf("--4.修改账户信息--\n");
printf("--5.修改数据【权限】--\n");
printf("--0.返回上级菜单--\n");
printf("--6.注销登录--\n");
printf("----\n");
printf("---------------------------------------------\n");
printf("注:
“1”---[yes]“0”---[no]\n");
printf("\n请选择:
\n");
scanf("%d",&choise2);
if(choise2==6)
{
exit(0);
}
while(choise2!
=0)
{
if(choise2==1)
{
system("cls");
findBo(Bhead,stuNumber,Shead,manaLimit);
}
if(choise2==2)
{
system("cls");
borRet(Bhead,stuNumber,Shead,manaLimit);
}
if(choise2==3)
{
system("cls");
stuDat(Shead,stuNumber);
}
if(choise2==4)
{
system("cls");
changeAcc(stuNumber,Shead,Bhead,manaLimit);
}
if(choise2==5)
{
if(manaLimit=='0')
{
system("cls");
printf("很抱歉,你没有管理权限!
系统返回登录界面\n");
choMenu();
}
else
{
system("cls");
changeDat(Bhead,Shead,manaLimit,stuNumber);
}
}
if(choise2==6)
{
exit(0);
}
printf("\n\n\n");
printf("|功能菜单|\n");
printf("------------------------------------------------\n");
printf("----\n";
printf("--1.查询书籍信息--\n");
printf("--2.借书与还书--\n");
printf("--3.个人账户状态--\n");
printf("--4.修改账户信息--\n");
printf("--5.修改数据【权限】--\n");
printf("--0.返回上级菜单--\n");
printf("--6.注销登录--\n");
printf("----\n");
printf("-----------------------------------------------\n");
printf("注:
“1”---[yes]“0”---[no]\n");
printf("\n请选择:
");
scanf("%d",&choise2);
}
system("cls");
choMenu();
}
voidborRet(info*Bhead,charstuNumber[],studentDat*Shead,charmanaLimit)//借还书界面
{
intchoise4;
printf("\n|借书与还书|\n");
printf("------------------------------------------------------------------\n");
printf("----\n");
printf("--1.书籍借阅--\n");
printf("--2.书籍归还--\n");
printf("--0.返回上级菜单--\n");
printf("----\n");
printf("-----------------------------------------------------------------\n");
printf("\n请选择:
\n");
scanf("%d",&choise4);
while(choise4!
=0)
{
if(choise4==1)
{
system("cls");
bottowBo(stuNumber,Bhead,Shead,manaLimit);
}
if(choise4==2)
{
system("cls");
returnBo(stuNumber,Bhead,Shead,manaLimit);
}
}
system("cls");
menuFir(stuNumber,Shead,Bhead,manaLimit);
}
voidfindBo(info*Bhead,charstuNumber[],studentDat*Shead,charmanaLimit)//查询书籍
{
intchoise3;
printf("\n|查询书籍|\n");
printf("-----------------------------------------------------------------n");
printf("----\n");
printf("--1.显示所有信息--\n");
printf("--2.按书名查找--\n");