C语言图书管理系统论文.docx
《C语言图书管理系统论文.docx》由会员分享,可在线阅读,更多相关《C语言图书管理系统论文.docx(30页珍藏版)》请在冰点文库上搜索。
C语言图书管理系统论文
数据结构实习报告
题目:
图书馆管理系统
学号:
20081514311
班级:
计科083
姓名:
陈阳光
完成时间:
2010-4-21
一、需求分析
1.依据题目要求以及现实中图书馆的需求,应将该系统分为两大模块:
图书管理和会员管理。
图书管理模块中包括对图书的增加、修改、删除、查询、统计等操作,以及对图书借入借出服务。
会员管理包括对会员卡号的申请、删除、统计等操作。
2.界面应该具有友善、直观、易操作等特点,本系统采用数字输入选择操作。
二、概要设计
1.整体设计
经过需求分析,本系统分为两大模块:
书籍管理模块和会员管理模块。
但是从易用性方面考虑,将书籍管理模块中的借书和还书模块放到主界面中。
结构图如下所示:
2.详细设计
2.1结构体设计流程图
structstudent/*定义会员类型,用于存放借出的书籍*/
{
intcardnum;//卡号
charlendbook[10];//借书数组最多借书十本
}student[1000];
structbook/*定义书的类型*/
{否
intbooknum;//书号
charbookname[20];//书名
charauthor[10];//作者
intbookcount;//书的剩余数量是
}book[1000];
structcard/*借书卡的数据类型*/
{
intcardnum;//卡号
charstudentname[10];//会员姓名
charstudentclass[10];//会员班级
}card[1000];
2.2主函数
主函数要求设计比较简洁,只提供设输入,处理和输出部分的函数调用。
其中各功能模块用菜单方式选择。
HWNDhwnd=GetForegroundWindow();
SetWindowText(hwnd,"★图书管理系统★");
intch1,ch2,ch3;
do
{SetConsoleTextAttribute(h,FOREGROUND_RED);//设置字体颜色为红色
printf("\n\t\t★欢★迎★进★入★图★书★管★理★系★统★\n\n");
printf("\t※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n");
printf("\t※※\n");
printf("\t※★图书管理系统★※\n");
printf("\t※※\n");
printf("\t※1:
<借书系统>2:
<还书系统>※\n");
printf("\t※3:
<会员管理>4:
<书籍管理>※\n");
printf("\t※0:
<退出>※\n");
printf("\t※※\n");
printf("\t※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n\n\n");
printf("\t\t请选择操作类型(0-4):
");
scanf("%d",&ch1);
switch(ch1)
{case1:
lendbook();break;
case2:
returnbook();break;
case3:
{
do
{SetConsoleTextAttribute(h,FOREGROUND_GREEN);//设置字体颜色为绿色
printf("\n\n");
printf("\t※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n");
printf("\t※※\n");
printf("\t※★欢迎进入会员管理系统★※\n");
printf("\t※※\n");
printf("\t※1:
<申请新卡>2:
<删除卡号>※\n");
printf("\t※3:
<借书统计>4:
<会员统计>※\n");
printf("\t※0:
<返回>※\n");
printf("\t※※\n");
printf("\t※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n\n\n");
printf("\t\t请选择操作类型(0-4):
");
scanf("%d",&ch3);
switch(ch3)
{case1:
addcard();break;
case2:
delcard();break;
case3:
lendcount();break;
case4:
cardcount();break;
case0:
break;
default:
printf("\n\t\t无效操作,按任意键返回...\n");getch();break;
}
}while(ch3!
=0);
}break;
case4:
{
do{
SetConsoleTextAttribute(h,FOREGROUND_GREEN);//设置字体颜色为绿色
printf("\n\n");
printf("\t※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n");
printf("\t※※\n");
printf("\t※★欢迎进入书籍管理系统★※\n");
printf("\t※※\n");
printf("\t※1:
<增加图书>2:
<删除图书>※\n");
printf("\t※3:
<查询图书>4:
<书籍统计>※\n");
printf("\t※5:
<修改图书资料>0:
<返回主菜单>※\n");
printf("\t※※\n");
printf("\t※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n\n\n");
printf("\t\t请选择操作类型(0-5):
");
scanf("%d",&ch2);
switch(ch2)
{case1:
addbook();break;
case2:
delbook();break;
case3:
searchbook();break;
case4:
bookcount();getch();break;
case5:
modifybook();break;
case0:
break;
default:
printf("\n\t\t无效操作,按任意键返回...\n");getch();break;
}
}while(ch2!
=0);
}break;
case0:
break;
default:
printf("\n\t\t无效操作,按任意键返回...\n");getch();break;
}
}while(ch1!
=0);
2.3借书模块流程图
voidlendbook()
{//借书功能函数
HANDLEh=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(h,FOREGROUND_GREEN);
FILE*fp,*fp2;
inti,n;
intcardnum;
printf("\n\t\t请你输入你的卡号:
");
scanf("%d",&cardnum);
fp=fopen("card.txt","r");
for(i=0;fread(&card[i],sizeof(structcard),1,fp)!
=0;i++)否
{
if(card[i].cardnum==cardnum)
{是
n=i;
fclose(fp);
printf("\n\t\t请输入你要借阅的书的名字:
");
scanf("%s",student[n].lendbook);
fp=fopen("book.txt","r");否
for(i=0;fread(&book[i],sizeof(structbook),1,fp)!
=0;i++)
{
if(strcmp(book[i].bookname,student[n].lendbook)==0)是
{
if(book[i].bookcount==0)
{
printf("\t\t对不起,此书有人借出,请借其他书.按任意键返回...\n");
fclose(fp);
getch();
return;
}else{
//book[i].bookcount--;
fclose(fp);
}
fp=fopen("record.txt","a+");//以读写方式打开record.txt
student[n].cardnum=cardnum;
fwrite(&student[n],sizeof(structstudent),1,fp);
fclose(fp);
fp=fopen("book.txt","r");
fp2=fopen("booktemp.txt","w");
for(i=0;fread(&book[i],sizeof(structbook),1,fp)!
=0;i++)
{
if(strcmp(book[i].bookname,student[n].lendbook)==0)
{
book[i].bookcount--;
fwrite(&book[i],sizeof(structbook),1,fp2);
continue;
}
fwrite(&book[i],sizeof(structbook),1,fp2);
}
fclose(fp);
fclose(fp2);
fp=fopen("book.txt","w");
fp2=fopen("booktemp.txt","r");
for(i=0;fread(&book[i],sizeof(structbook),1,fp2)!
=0;i++)
{
fwrite(&book[i],sizeof(structbook),1,fp);
}
fclose(fp);
fclose(fp2);
fopen("booktemp.txt","w");
fclose(fp2);
printf("\n\t\t借书完毕,按任意键返回...");
getch();
return;
}
}
printf("\n\t\t很抱歉,不存在这本书,按任意键返回...");
fclose(fp);
getch();
return;
}
}
printf("\n\t\t你的卡号不存在,请申请新卡,按任意键返回...");
fclose(fp);
getch();
}
2.4还书模块
voidreturnbook()/*还书函数*/
{
HANDLEh=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(h,FOREGROUND_GREEN);//设置字体颜色为绿色
FILE*fp,*fp2;/*定义两个文件指针,fp2用于修改数据时设立临时文件用,防止数据遭破坏*/
inti,temp;
intcardexit=0,bookexit=0;//卡号书籍是否存在(借阅)标志存在(借阅)为1不存在为0
intcardnum;
charlendbook[10];
printf("\n\t\t请你输入你的卡号:
");
scanf("%d",&cardnum);
fp=fopen("card.txt","r");/*读取卡号记录*/
for(i=0;fread(&card[i],sizeof(structcard),1,fp)!
=0;i++)/*for循环判断卡号是否存在*/
{
if(card[i].cardnum==cardnum)/*卡号存在,进入下一循环*/
{
cardexit=1;
temp=i;
fclose(fp);
printf("\n\t\t请输入你要还的书的名字:
");
scanf("%s",lendbook);
fp=fopen("record.txt","r");
for(i=0;fread(&student[i],sizeof(structstudent),1,fp)!
=0;i++)/*判断是否借阅了输入的书*/
{
if(student[i].lendbook==lendbook)/*借阅了该书,进入下一循环,否则出错显示*/
{
bookexit=1;
fclose(fp);
fp=fopen("record.txt","r");
fp2=fopen("booktemp.txt","w");
for(i=0;fread(&student[i],sizeof(structstudent),1,fp)!
=0;i++)
{
if(student[i].lendbook==lendbook)
{
continue;/*删除还掉的书的借书记录*/
}
fwrite(&student[i],sizeof(structstudent),1,fp2);/*写入原来没还的书的记录*/
}
fclose(fp);
fclose(fp2);
fp=fopen("record.txt","w");
fp2=fopen("booktemp.txt","r");
for(i=0;fread(&student[i],sizeof(structstudent),1,fp2)!
=0;i++)
{
fwrite(&student[i],sizeof(structstudent),1,fp);/*将借书记录信息写回*/
}
fclose(fp);
fclose(fp2);
fopen("booktemp.txt","w");/*清临时文件的记录*/
fclose(fp2);
fp=fopen("book.txt","r");
fp2=fopen("booktemp.txt","w");
for(i=0;fread(&book[i],sizeof(structbook),1,fp2)!
=0;i++)/*将书的记录写入临时文件,防止因为修改信息破坏以前的记录*/
{
if(i==temp)
{
book[i].bookcount++;
fwrite(&book[i],sizeof(structbook),1,fp);/*将还的书的可借数量加1*/
continue;
}
fwrite(&book[i],sizeof(structbook),1,fp2);
}
fclose(fp);
fclose(fp2);
fp=fopen("book.txt","w");
fp2=fopen("booktemp.txt","r");
for(i=0;fread(&book[i],sizeof(structbook),1,fp2)!
=0;i++)
{
fwrite(&book[i],sizeof(structbook),1,fp);/*将临时文件写回*/
}
fclose(fp);
fclose(fp2);
fopen("booktemp.txt","w");/*清临时文件*/
fclose(fp2);
printf("\n\t\t还书完毕,按任意键返回...\n");
}
}
fclose(fp);
}
}
fclose(fp);
if(cardexit==0)
printf("\n\t\t系统没此卡号,请和管理员联系,按任意键返回...\n");/*出错提示*/
elseif(bookexit==0)
printf("\n\t\t你没有借这本书,按任意键返回...\n");/*出错提示*/
getch();
}
2.5会员管理模块
会员管理有四个功能:
申请新卡、删除卡号、借书统计、卡号统计,分别对应以下四个函数:
voidaddcard()
{//增加新卡函数
FILE*fp;
inti=0,tempcard,temp=0;
fp=fopen("card.txt","a+");
printf("\n\t\t请输入卡号:
");
scanf("%d",&tempcard);
for(i=0;fread(&card[i],sizeof(structcard),1,fp)!
=0;i++)//判断卡号是否存在
if(tempcard==card[i].cardnum)
temp=1;
if(temp==1)//如果卡号存在,返回
{
printf("\n\t\t此卡号已经存在,按任意键返回...");
getch();
}
elseif(temp==0){//如果卡号不存在,继续下面操作
card[i].cardnum=tempcard;
printf("\n\t\t请输入学生姓名:
");
scanf("%s",card[i].studentname);
printf("\n\t\t请输入班级:
");
scanf("%s",&card[i].studentclass);
fwrite(&card[i],sizeof(structcard),1,fp);
fclose(fp);
printf("\n\t\t输入完毕,任意键返回...\n");
getch();
}
}
voiddelcard()
{//删除卡号记录函数
FILE*fp,*fp2;
inti;
intcardnum;
charchoice;
fp=fopen("card.txt","r");
fp2=fopen("booktemp.txt","w");
printf("\n\t\t提示:
如果你输入的卡号存在,系统自动删除该信息.");
printf("\n\t\t如果不存在,系统不做任何改动.");
printf("\n\t\t请输入你要删除的卡号:
");
scanf("%d",&cardnum);
for(i=0;fread(&card[i],sizeof(structcard),1,fp)!
=0;i++)
{
if(card[i].cardnum!
=cardnum)
{
fwrite(&card[i],sizeof(structcard),1,fp2);
}
}
fclose(fp);
fclose(fp2);
printf("\n\t\t是否真的要删除该卡?
删除后该书籍的所有信息将无法恢复:
");
scanf("%s",&choice);
if(choice=='y'||choice=='Y')
{
fp=fopen("card.txt","w");
fp2=fopen("booktemp.txt","r");
for(i=0;fread(&card[i],sizeof(structcard),1,fp2)!
=0;i++)
{
fwrite(&card[i],sizeof(structcard),1,fp);
}
fclose(fp);
fclose(fp2);
fp2=fopen("booktemp.txt","w");
fclose(fp2);
printf("\t\t按任意键返回...\n");
getch();
}
else
{
printf("\t\t按任意键返回...\n");
getch();
}
}
intlendcount()
{//会员借书统计函数
FILE*fp;
inti,n=0;
fp=fopen("record.txt","r");
for(i=0;fread(&student[i],sizeof(structstudent),1,fp)!
=0;i++)
{
printf("\t\t卡号:
%d借出的书籍:
%s\n",student[i].cardnum,student[i].lendbook);
n=n+1;
}
fclose(fp);
printf("\t\t目前共有%d本书借出\n",n);
printf("\t\t按任意键返回...\n");
getch();
returnn;
}
voidcardcount()
{//会员卡号统计函数
FILE*fp;
inti,n=0;
fp=fopen("card.txt","r");
printf("\t\t卡号姓名班级\n");
for(i=0;fread(&card[i],sizeof(structcard),1,fp)!
=0;i++)
{
printf("\n\t\t%-10d%-10s%-2s\n",card[i].cardnum,card[i].studentname,card[i].studentclass);
n=n+1;
}
fclose(fp);
printf("\n\t\t目前共有%d个会员\n",n);
printf("\t\t按任意键返回...\n");
getch();
}
2.6书籍管理模块
书籍管理模块有五个功能