C语言课设之图书管理系统.docx
《C语言课设之图书管理系统.docx》由会员分享,可在线阅读,更多相关《C语言课设之图书管理系统.docx(36页珍藏版)》请在冰豆网上搜索。
C语言课设之图书管理系统
C语言课程设计
目录
1、需求分析;
2、系统总框图;
3、每个模块的设计分析;
4、列出所有定义的函数及说明;
5、举例说明1、2个比较有特点的算法;
6、数据分析。
7、存在的问题与不足及对策;
8、使用说明(操作手册);
9、学习心得。
图书管理系统设计
一.题目要求:
图书管理信息包括:
图书名称、图书编号、单价、作者、存在状态、借书人姓名、性别、学号等。
程序还有以下功能:
新近图书基本信息的输入;图书基本信息的查询;对撤销图书信息的删除;办理借书手续;办理还书手续。
二.系统总框图
图书管理系统
归还图书
管理系统
查询图书
借阅图书
按书名找
增加图书
按作者找
删除图书
修改图书
图书统计
会员管理
卡号统计
借书统计
定义会员
删除会员
三.每个模块的设计分析和所有定义的函数及说明
1、数据结构
//图书的数据结构:
structbook
{
intbooknum;//书号
charbookname[20];//书名
charbookcreat[10];//书的作者
intturefalse;//用于借书和还书模块判断一本书是否借出的条件
}book[1000];//定义一个比较大的1000本书
//会员卡的数据类型
structcar
{
intcarnum;//卡号
charstudentsex[4];//性别
charstudentname[20];//姓名
intstudentclass;//所在班级
}car[1000];//定义一千个会员
//定义学生类型,用于存放借出的书籍
structstudent
{
intcarnum;//卡号
charlendbook[10];//借出的书数
}student[1000];//定义一千个学生
2、main()主函数模块
主函数是程序入口,采用模块化设计。
首先在主程序中打印欢迎界面,定义一些必要变量,作一无限循环程序,循环体为一开关语句,该语句设置一个断点,其条件值是通过调用主菜单函数得到的返回值,根据该值,调用相应的功能函数,同时设置一个断点,当返回值为一定条件时结束程序。
3、chabook()查询图书函数模块
在这个模块中又分为两个子模块:
按书名查找模块和按作者查找。
1)按书名查找模块:
在这个子函数里使用指向文件的指针变量,定义指针变量fp,fp指向文件名为“book.txt”的首地址,如果不存在,则自动建立。
从键盘输入书名,依次移动指针地址,直到找到输入的文件名,找到后显示图书信息,再判断状态值是否为1,真的话就显示“此书现在无人借阅”,假就显示“这本书已经有人借出!
”,关闭文件,然后按任意键返回。
如果找到最后一个地址仍没找到,就显示“没有你要查询的书籍!
”。
关闭文件。
2)按作者查找,原理同按书名查找。
4、lendbook()借书函数模块
定义文件指针变量fp,fp2。
fp指向“car.txt(会员卡记录文件)”首地址,从键盘输入卡号,与文件中保存的依次比较,如果一致,就找到这个地址,并赋给变量i。
关闭这个文件。
开始借书,输入要借的书,这时指针地址指向“book.txt”,以只读的方式打开,依次找与输入书名一致的图书,如果找到,又分两种情况:
状态值为1,则把书借出,把此书的状态值改为0.否则,显示“书已被借出”。
如果找不到,显示“不存在这样的书”,关闭文件。
返回。
5、huanbook()还书函数模块
同样定义两个指针变量:
fp,fp2。
先从键盘输入要还图书者会员卡卡号,然后是还书人名字,与文件中的相对照,都一致就进入还书过程,删除掉所还图书的借书记录,将还的书的原来状态设为无人借阅的。
如果没找到图书就显示“你没有借这样的书,任意键返回...”,如果没找到所输卡号,则显示“没这样的卡,和管理员联系,按任意键返回...”。
还书过程结束。
6、lendcount()借书统计函数模块
定义指向文件的指针变量fp,并使fp指向“record.txt”,以只写的方式打开文件,从首地址读取,找到借书信息,就把统计借出书个数的变量i的值加1。
并显示借出的每一本书的信息。
7、addcar()增加会员卡函数模块
定义指向文件的指针变量fp,并使fp指向“car.txt”的首地址,以追加的方式打开文件“car.txt”,从键盘输入会员信息,并写入文件。
8、delcar()删除会员卡函数模块
定义指向文件的指针变量fp,和fp2。
分别以写入的方式打开“car.txt”,和“bookl.txt”。
从键盘输入要删除的会员卡卡号,然后把有关信息删除。
9、carcount()会员统计函数模块
定义指向文件的指针变量fp,使其指向“car.txt”,以只读的方式打开,依次读取里面数据,把会员个数赋给表示会员个数的变量n,并输出每个会员信息。
10、addbook()增加图书函数模块
定义指向文件的指针变量fp,使其指向“book.txt”
并以追加的方式打开文件,依次从键盘读入图书的各个信息,写入文件,然后关闭文件。
11、delbook()删除图书函数模块
定义两个文件指针,fp,fp2.从键盘输入图书名字。
然后在文件中查找,找到后删除掉有关记录,找不到则报错。
12、changebook()修改图书信息函数模块
定义两个文件指针,fp,fp2.从键盘输入要修改的图书名。
然后从文件中找一致的,找到后询问修改哪一部分。
在进入修改。
完成后关闭文件。
13、bookcount()图书统计函数模块
定义文件指针fp,并使之指向“book.txt”依次从里面读取数据,并输出。
14、end()结束函数模块
定义退出界面。
四.举例说明2个比较有特点的算法
算法一:
查询图书函数
在这个算法的特点在于:
模块中又分为两个子模块:
按书名查找模块和按作者查找,以满足读者的不同需求。
11、算法二:
借书统计函数模
特点在于:
能够统计借出的书的信息。
定义指向文件的指针变量fp,并使fp指向“record.txt”,以只写的方式打开文件,从首地址读取,找到借书信息,就把统计借出书个数的变量i的值加1。
并显示借出的每一本书的信息。
五:
数据分析
#include
#include
#include
#include
#include
#defineSTACK_INIT_SIZE10
#defineOK1
#defineTRUE1
#defineERROR0
/*定义学生类型,用于存放借出的书籍*/
structstudent{
intcarnum;
charlendbook[10];
}student[1000];
/*定义书的类型*/
structbook
{
intbooknum;
charbookname[20];
floatbookprice;
charbookcreat[20];
intturefalse;/*用于借书和还书模块判断一本书是否借出的条件*/
}book[1000];
/*借书卡的数据类型*/
structcar
{
intcarnum;
charsex[5];
charstudentname[20];
intstudentclass;
}car[1000];
//////////////////////////////////查询图书信息模块//////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
//////
(1)按书名查找
findbook()
{
FILE*fp;
charbookname[10];
inti;
fp=fopen("book.txt","r");
printf("请输入你要查找的书名:
\n");
scanf("%s",bookname);
for(i=0;fread(&book[i],sizeof(structbook),1,fp)!
=0;i++)
{
if(strcmp(bookname,book[i].bookname)==0)
{
if(book[i].turefalse==1)
{
printf("书号书名作者\n%d%s%s\n",book[i].booknum,book[i].bookname,book[i].bookcreat);
printf("此书现在无人借阅\n按任意键返回\n");}
else{printf("这本书已经有人借出\n");fclose(fp);return0;}
fclose(fp);
return0;
}
}
printf("没有你要查询的书籍!
\n");
fclose(fp);
return0;
}
//////////
(2)按作者查找
findbook1()
{
FILE*fp;
charbookcreat[10];
inti;
fp=fopen("book.txt","r");
printf("请输入你要查找的作者名:
\n");
scanf("%s",bookcreat);
for(i=0;fread(&book[i],sizeof(structbook),1,fp)!
=0;i++)
{
if(strcmp(bookcreat,book[i].bookcreat)==0)
{
if(book[i].turefalse==1)
{
printf("书号书名作者\n%d%s%s\n",book[i].booknum,book[i].bookname,book[i].bookcreat);
printf("此书现在无人借阅\n按任意键返回\n");
}
else{printf("这本书已经有人借出!
\n");
fclose(fp);
return0;
}
fclose(fp);
return0;
}
}
printf("没有你要查询的书籍\n");
fclose(fp);
return0;
}
chabook()/////查找图书主模块
{
charch5;
do
{
printf("◎◎◎欢迎进入图书查询系统◎◎◎\n");
printf("1:
按书名查找\n");
printf("2:
按作者查找\n");
printf("0:
返回\n");
printf("请输入0━2:
\n");
ch5=getch();
switch(ch5)
{
case'1':
findbook();getch();break;
case'2':
findbook1();getch();break;
case'0':
break;
default:
printf("无此操作!
\n");getch();break;
}
}while(ch5!
='0');
return0;
}
/////////////////////////////////////////////////////////////////
//////////借书与还书模块
/////
(1).借书模块
lendbook()
{
FILE*fp,*fp2;
inti,n;
intcarnum;
system("cls");
printf("\t\t◎◎◎欢迎进入借书系统◎◎◎\n\n");
printf("请输入借书人的:
\n卡号:
\n");
scanf("%d",&carnum);
fp=fopen("car.txt","r");
for(i=0;fread(&car[i],sizeof(structcar),1,fp)!
=0;i++)
{
if(car[i].carnum==carnum)
{
n=i;
fclose(fp);
printf("书名:
\n");
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].turefalse==0){printf("对不起,此书有人借出,请借其他书\n");fclose(fp);getch();return0;}
else
fclose(fp);
fp=fopen("record.txt","a+");
student[n].carnum=carnum;
fwrite(&student[n],sizeof(structstudent),1,fp);
fclose(fp);
fp=fopen("book.txt","r");
fp2=fopen("bookl.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].turefalse=0;
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("bookl.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("bookl.txt","w");
fclose(fp2);
printf("借书完毕,按任意键返回...\n");
getch();
return0;
}
}
printf("不存在这样的书,任意键返回...\n");
fclose(fp);
getch();
return0;
}
}
printf("你的卡号不存在,请申请新卡,按任意键返回...\n");
fclose(fp);
getch();
return0;}
///////
(2).还书函数
huanbook()
{
FILE*fp,*fp2;/*定义两个文件指针,fp2用于修改数据时设立临时文件用,防止数据遭破坏*/
inti,n;
intcarnum;
charlendbook[10];
system("cls");
printf("\t\t◎◎◎欢迎进入还书界面◎◎◎");
printf("\n请你输入你的\n卡号:
\n");
scanf("%d",&carnum);
fp=fopen("car.txt","r");/*读取卡号记录*/
for(i=0;fread(&car[i],sizeof(structcar),1,fp)!
=0;i++)/*for循环判断卡号是否存在*/
{
if(car[i].carnum==carnum)/*卡号存在,进入下一循环*/
{
n=i;
fclose(fp);
printf("请输入你要还的书的名字:
\n");
scanf("%s",lendbook);
fp=fopen("record.txt","r");
for(i=0;fread(&student[i],sizeof(structstudent),1,fp)!
=0;i++)/*判断是否借阅了输入的书*/
{
if(strcmp(student[i].lendbook,lendbook)==0)/*借阅了该书,进入下一循环,否则出错显示*/
{
fclose(fp);
fp=fopen("record.txt","r");
fp2=fopen("bookl.txt","w");
for(i=0;fread(&student[i],sizeof(structstudent),1,fp)!
=0;i++)
{
if(strcmp(student[i].lendbook,lendbook)==0)
{
continue;/*删除还掉的书的借书记录*/
}
fwrite(&student[i],sizeof(structstudent),1,fp2);/*写入原来没还的书的记录*/
}
fclose(fp);
fclose(fp2);
fp=fopen("record.txt","w");
fp2=fopen("bookl.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("bookl.txt","w");/*清临时文件的记录*/
fclose(fp2);
fp=fopen("book.txt","r");
fp2=fopen("bookl.txt","w");
for(i=0;fread(&book[i],sizeof(structbook),1,fp)!
=0;i++)/*将书的记录写入临时文件,防止因为修改信息破坏以前的记录*/
{
if(i==n)
{
book[i].turefalse=1;
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("bookl.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("bookl.txt","w");/*清临时文件*/
fclose(fp2);
printf("还书完毕,按任意键返回...\n");
getch();
return1;
}
}
printf("你没有借这样的书,任意键返回...\n");/*出错提示*/
fclose(fp);
getch();
return0;
}
}
printf("没这样的卡,和管理员联系,按任意键返回...\n");/*出错提示*/
fclose(fp);
getch();
return0;}
////////(3).借书统计
lendcount()
{
FILE*fp;
inti,n=0;
fp=fopen("record.txt","r");
if((fp=fopen("record.txt","r"))==0)
{printf("文件中没有数据!
\n");
printf("按任意键返回...\n");
getch();
return(0);
}
for(i=0;fread(&student[i],sizeof(structstudent),1,fp)!
=0;i++)
{
printf("卡号借出的书籍\n");
printf("%d%s\n",student[i].carnum,student[i].lendbook);
n=n+1;
}
fclose(fp);
printf("目前共有%d本书借出\n",n);
printf("按任意键...\n");
getch();
returnn;
}
//////////////////////////////////会员卡管理模块/////
//////////
(1).增加会员卡
addcar()
{
FILE*fp;
inti=0;
fp=fopen("car.txt","a+");
printf("卡号:
\n");
scanf("%d",&car[i].carnum);
printf("性别:
\n");
scanf("%s",car[i].sex);
printf("姓名:
\n");
scanf("%s",car[i].studentname);
printf("班级:
\n");
scanf("%d",&car[i].studentclass);
fwrite(&car[i],sizeof(structcar),1,fp);
fclose(fp);
printf("输入完毕,任意键返回...\n");
getch();
}
//////////
(2).删除会员卡
delcar()
{
FILE*fp,*fp2;
inti;
intcarnum;
charchoice;
fp=fopen("car.txt","r");
fp2=fopen("bookl.txt","w");