图书管理系统是数据结构常见的课设题,在这里写一个简单的c语言实现代码。没有使用指针,链表。第一次需要写一些内容到程序中,之后注释掉creat(),creat2()两个函数即可从文件中读取。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#define M 1
typedef struct node//图书信息的结构体
{
char bookid[10];
char bookname[50];
char author[20];
int leibie;
int sum;
int now;
}book;
typedef struct//用于存放所有的图书的结构体
{
book book1[1000];
int len;
}books;
typedef struct xcv
{
char book2[10];
char shijian[30];
}yijie;
typedef struct node1//借书证信息的结构体
{
char cardid[10];
char studentname[10];
char studentclass[10];
yijie yijieshu[10];
int len3;
}card;
typedef struct//用于存放所有的借书卡的结构体
{
card card1[100];
int len1;
}cards;
books s;
cards p;
char *t2;
void fun()//显示系统当前时间函数
{
time_t t1;
t1=time(NULL);
t2=ctime(&t1);
printf("现在的时间是:%s\n",t2);
printf(" 自现在起一个月后请归还图书\n");
}
void print()//屏幕前空格
{
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
}
void save()//保存文件用于创建图书
{
FILE *fp;
int i;
if((fp=fopen("book.dat","wb"))==NULL)
{
printf("cannot open this file\n");
return ;
}
for(i=0;i<s.len;i++)
if(fwrite(&(s.book1[i]),sizeof(book),1,fp)!=1)
printf("file write error\n");
fclose(fp);
}
void creat(int n)//创建图书
{
s.len=0;
int i;
for(i=0;i<n;i++)
{
printf("请输入书号\n");
scanf("%s",s.book1[i].bookid);
printf("请输入书名\n");
scanf("%s",s.book1[i].bookname);
printf("请输入作者\n");
scanf("%s",s.book1[i].author);
printf("请输入书籍类别:1:文学 2:科技 3:历史 4:其他\n");
scanf("%d",&s.book1[i].leibie);
printf("请输入书的总数\n");
scanf("%d",&s.book1[i].sum);
printf("请输入书的现量\n");
scanf("%d",&s.book1[i].now);
s.len++;
}
save();
}
void save1()//保存文件用于创建书卡
{
FILE *fp;
int i;
if((fp=fopen("card.dat","wb"))==NULL)
{
printf("cannot open file\n");
return ;
}
for(i=0;i<p.len1;i++)
if(fwrite(&(p.card1[i]),sizeof(card),1,fp)!=1)
printf("file write error!\n");
fclose(fp);
}
void creat2(int n)//创建书卡
{
p.len1=0;
int i;
for(i=0;i<n;i++)
{
printf("请输入卡号\n");
scanf("%s",p.card1[i].cardid);
printf("请输入姓名\n");
scanf("%s",p.card1[i].studentname);
printf("请输入班级\n");
scanf("%s",p.card1[i].studentclass);
p.card1[i].len3 = 0;
p.len1++;
}
save1();
}
int find(char *str)
{
int i = 0;
for( ; i < s.len ; ++i)
{
if(!strcmp(str , s.book1[i].bookid))
{
return i;
}
}
return i;
}
int findpeo(char *str)
{
int i = 0;
for( ; i < p.len1 ;++i)
{
if(!strcmp(str , p.card1[i].cardid))
{
return i;
}
}
return i;
}
void findbook()//查找图书
{
char str[10];
int a,b,i,c;
print();
printf(" 请选择您的查找方式:\n");
printf(" ************************\n");
printf(" 1:按书号查找\n 2:按类别显示\n");
printf(" ************************\n ");
getchar();
scanf("%d",&b);
system("cls");
if(b==2)
{
print();
printf(" 请输入您想查找的图书类别:\n ***********************\n 1:文学 2:科技\n 3:历史 4:其他\n ************************\n");
printf(" ");
getchar();
scanf("%d",&c);
system("cls");
print();
printf(" 该类别的图书有\n");
printf(" ********************************************\n");
printf(" 书号 书名 作者 总量 现量\n");
for(i=0;i<s.len;i++)
{
if(c==s.book1[i].leibie)
printf(" %-7s%-12s%-10s %-10d%d\n",s.book1[i].bookid,s.book1[i].bookname,s.book1[i].author,s.book1[i].sum,s.book1[i].now);
}
printf(" ********************************************\n");
}
else if(b==1)
{
print();
printf(" 请输入要查找的书的书号\n");
printf(" ");
scanf("%s",str);
a=find(str);
if(a == s.len)
{
puts(" 抱歉您查找的图书不存在");
printf(" 请按任意键返回\n ");
getchar();
getchar();
return ;
}
if(!s.book1[a].now)
{
puts(" 该图书已经借光了");
printf(" 请按任意键返回\n ");
getchar();
getchar();
return ;
}
printf(" 该书的名字是<<%s>>,\n 该书一共有%d本,\n 现在还有%d本可以借阅.\n",s.book1[a].bookname,s.book1[a].sum,s.book1[a].now);
}
else
{
print();
printf(" 输入错误,按任意键返回上一层\n ");
getchar();
getchar();
return ;
}
printf(" 查询结束.请按任意键返回上一层\n ");
getchar();
getchar();
}
void borrow()//借阅图书
{
char str[10];
char peo[10];
char d;
print();
printf(" 请输入要查找的书号\n");
int t, tpeo ,i;
printf(" ");
scanf("%s" ,str);
t = find(str);
if(t == s.len)
{
puts(" 抱歉您要借的图书不存在");
printf(" 请按任意键返回\n ");
getchar();
getchar();
return ;
}
if(!(s.book1[t].now))
{
puts(" 该图书已经借光了");
printf(" 请按任意键返回\n ");
getchar();
getchar();
return ;
}
printf(" 请输入您的卡号\n");
printf(" ");
scanf("%s",peo);
tpeo = findpeo(peo);
if(tpeo==p.len1)
{
printf(" 您输入的卡号不存在,按任意键返回上一层\n ");
getchar();
getchar();
return ;
}
if(p.card1[tpeo].len3>=10)
{
printf(" 您的借书证借书数量已经达到上限,不允许再借书.按任意键返回上一层\n ");
getchar();
getchar();
return ;
}
printf(" 查询成功,确定要借这本书吗?(y/n)\n");
getchar();
printf(" ");
scanf("%c",&d);
if(!(d=='Y'||d=='y'))
{
printf(" 操作失败.按任意键返回上一层\n ");
getchar();
getchar();
return ;
}
printf(" 您借书的开始时间为:\n ");
fun();
strcpy(p.card1[tpeo].yijieshu[p.card1[tpeo].len3].shijian,t2);
s.book1[t].now--;
strcpy(p.card1[tpeo].yijieshu[p.card1[tpeo].len3].book2, s.book1[t].bookid);
p.card1[tpeo].len3++;
printf(" 借阅成功,库存量减少一,当前书变为:%-d本,\n 此书的书号为:%s.\n",s.book1[t].now,s.book1[t].bookid);
printf(" 操作成功.按任意键返回上一层\n ");
getchar();
getchar();
}
void returnbook()//归还图书
{
char str[10];
char str2[10];
char c;
int i,j,k,a,b,flag=0;
print();
printf(" 请输入要归还的书号:\n");
printf(" ");
scanf("%s",str);
a=find(str);
if(a == s.len)
{
puts(" 抱歉您要归还的图书不存在");
printf(" 请按任意键返回\n ");
getchar();
getchar();
return ;
}
printf(" 请输入您的借书证号:\n");
printf(" ");
scanf("%s",str2);
b=findpeo(str2);
if(b==p.len1)
{
printf(" 您输入的卡号不存在.按任意键返回上一层\n ");
getchar();
getchar();
return ;
}
for(i=0;i<p.card1[b].len3;i++)
{
//printf("%s ",p.card1[b].book2[i]);
if(strcmp(p.card1[b].yijieshu[i].book2,str)==0)
flag=1;
}
if(flag==0)
{
printf(" 借书证并没有借这本图书.按任意键返回上一层\n ");
getchar();
getchar();
return ;
}
printf(" 查询成功,确定要归还这本书吗?(y/n)\n");
getchar();
printf(" ");
scanf("%c",&c);
if(!(c=='Y'||c=='y'))
{
printf(" 操作失败.按任意键返回上一层\n ");
getchar();
getchar();
return ;
}
s.book1[a].now++;
for(j=0;j<p.card1[b].len3;j++)
if(strcmp(p.card1[b].yijieshu[j].book2,str)==0)
for(k=j;k<p.card1[b].len3-1;k++)
{
strcpy(p.card1[b].yijieshu[k].book2,p.card1[b].yijieshu[k+1].book2);
strcpy(p.card1[b].yijieshu[k].shijian,p.card1[b].yijieshu[k+1].shijian);
}
p.card1[b].len3--;
printf(" 还书成功,库存量增加一,当前书变为:%d本,\n 此书的书号是:%s.\n",s.book1[a].now,s.book1[a].bookid);
printf(" 操作成功.按任意键返回上一层\n ");
getchar();
getchar();
}
void addbook()//添加
{
char str[10];
char c,e='y';
int a,b;
do
{ print();
printf(" 请输入要添加的图书编号\n");
getchar();
printf(" ");
scanf("%s",str);
a=find(str);
if(a==s.len)
{
printf(" 这本书是新书\n");
printf(" 请选择书的类型\n");
printf(" *********************\n");
printf(" 1.文学\n 2.科技\n 3.历史\n 4.其他\n");
printf(" *********************\n");
getchar();
printf(" ");
scanf("%d",&b);
switch(b)
{
case 1:s.book1[s.len].leibie=1;break;
case 2:s.book1[s.len].leibie=2;break;
case 3:s.book1[s.len].leibie=3;break;
case 4:s.book1[s.len].leibie=4;break;
default:printf(" 您输入的类别有误.按任意键返回上一层\n ");getchar();return ;
}
//printf("请输入这本书的书号\n");
//scanf("%s",s.book1[s.len].bookid);
system("cls");
strcpy(s.book1[s.len].bookid,str);
print();
printf(" 请输入这本书的书名:\n");
printf(" ");
scanf("%s",s.book1[s.len].bookname);
printf(" 请输入这本书的作者:\n");
printf(" ");
scanf("%s",s.book1[s.len].author);
printf(" 请输入要添加的书的总量:\n");
printf(" ");
scanf("%d",&s.book1[s.len].sum);
s.book1[s.len].now=s.book1[s.len].sum;
s.len++;
}
else if(a<s.len)
{
printf(" 这本书已经有记录了,若添加则其总量加一.\n 是否要继续添加工作?(y/n)\n");
getchar();
printf(" ");
scanf("%c",&c);
if(!(c=='y'||c=='Y'))
{
printf(" 操作失败.按任意键返回上一层\n ");
getchar();
getchar();
return ;
}
s.book1[a].sum++;
s.book1[a].now++;
printf(" 现在此书的总数为%d.\n",s.book1[a].sum);
}
printf(" 请问还要继续添加图书吗?(y/n)\n");
getchar();
printf(" ");
scanf("%c",&e);
}while(e=='y'||e=='Y');
printf(" 操作完毕.按任意键返回上一层\n ");
getchar();
return ;
}
void deletebook()//删除图书
{
char str[10];
char b,c,e='y';
int a,i;
do
{ print();
printf(" 请输入要删除的图书编号\n");
getchar();
printf(" ");
scanf("%s",str);
a=find(str);
if(a==s.len)
{
printf(" 您要删除的书不存在\n");
}
else if(s.book1[a].sum!=s.book1[a].now)
{
printf(" 该书仍有人借阅未归还,还要继续删除这本书吗?(y/n)\n");
getchar();
printf(" ");
scanf("%c",&b);
if(!(b=='y'||b=='Y'))
{
printf(" 操作失败.按任意键结束返回上一层\n ");
getchar();
return ;
}
printf(" 删除成功!\n");
for(i=a;i<s.len-1;i++)
s.book1[i]=s.book1[i+1];
s.len--;
}
else
{
printf(" 确定要删除这本书吗?(y/n)\n");
getchar();
printf(" ");
scanf("%c",&b);
if(!(b=='y'||b=='Y'))
{
printf(" 操作失败.按任意键结束返回上一层\n ");
getchar();
return ;
}
printf(" 删除成功!\n");
for(i=a;i<s.len-1;i++)
s.book1[i]=s.book1[i+1];
s.len--;
}
printf(" 请问还要继续删除图书吗?(y/n)\n");
getchar();
printf(" ");
scanf("%c",&e);
}while(e=='y'||e=='Y');
printf(" 操作完毕.按任意键返回上一层\n ");
getchar();
return ;
}
void tongji()//统计图书
{
int i;
system("cls");
print();
printf(" 图书输出为:\n");
printf(" ********************************************************\n");
printf(" 书号 书名 作者 类别 总量 现量\n");
for(i=0;i<s.len;i++)
{
printf(" %-7s%-12s%-10s",s.book1[i].bookid,s.book1[i].bookname,s.book1[i].author);
switch(s.book1[i].leibie)
{
case 1:printf("文学 ");break;
case 2:printf("科技 ");break;
case 3:printf("历史 ");break;
case 4:printf("其它 ");break;
}
printf(" %-10d%d\n",s.book1[i].sum,s.book1[i].now);
}
printf(" ********************************************************\n");
printf(" 显示完毕.按任意键返回上一层\n ");
getchar();
}
void tongji2()//统计书卡
{
int i,b;
char h;
char str2[10];
system("cls");
print();
printf(" 借书卡输出为:\n");
printf(" ************************************************\n");
printf(" 借书卡id 持卡人姓名 班级 已借总数\n");
for(i=0;i<p.len1;i++)
{
printf(" %-15s%-14s%-12s%-15d\n",p.card1[i].cardid,p.card1[i].studentname,p.card1[i].studentclass,p.card1[i].len3);
}
printf(" ************************************************\n");
printf(" 请问要显示某位同学所借书的详细信息吗?(y/n)\n ");
getchar();
scanf("%c",&h);
if(h=='y'||h=='Y')
{
printf(" 请输入您要查找的借书证号:\n");
printf(" ");
getchar();
scanf("%s",str2);
b=findpeo(str2);
if(b==p.len1)
{
printf(" 您输入的卡号不存在.按任意键返回上一层\n ");
getchar();
getchar();
return ;
}
printf(" 卡号为%s的借书内容显示如下:\n",p.card1[b].cardid);
printf(" *********************************\n");
printf(" 书号 借书日期\n");
for(i=0;i<p.card1[b].len3;i++)
{
printf(" %-10s%s\n",p.card1[b].yijieshu[i].book2,p.card1[b].yijieshu[i].shijian);
}
printf(" ********************************\n");
}
printf(" 显示完毕.按任意键返回上一层\n ");
getchar();
}
int main()
{
system("color F0");
int a,b;
int i=0,x;
FILE *fp,*fp1;
FILE *fq,*fq1;
//creat(2);
//creat2(2);
system("cls");
s.len=0;
p.len1=0;
if((fp=fopen("book.dat","rb"))==NULL)
{
printf("cannot open this file\n");
exit(0);
}
while(fread(&(s.book1[i]),sizeof(book),1,fp)!=0)
{
s.len++;
i++;
}
fclose(fp);
i=0;
if((fp1=fopen("card.dat","rb"))==NULL)
{
printf("cannot open this file\n");
exit(0);
}
while(fread(&(p.card1[i]),sizeof(card),1,fp1)!=0)
{
p.len1++;
i++;
}
fclose(fp1);
do
{
print();
printf(" 您好,欢迎使用图书管理系统\n");
printf(" *****************************\n");
printf(" 1:查找图书\n 2:借阅图书\n 3:归还图书\n 4:管理系统\n 5:退出系统\n");
printf(" *****************************\n");
printf(" 请选择您想进行的操作是:\n");
printf(" ");
scanf("%d",&a);
while(!(a==1||a==2||a==3||a==4||a==5))
{
printf(" 输入错误,请重新输入\n ");
getchar();
scanf("%d",&a);
}
system("cls");
switch(a)
{
case 1:findbook();break;
case 2:borrow();break;
case 3:returnbook();break;
case 4:print();
printf(" 请输入六位管理员密码\n");
getchar();
printf(" ");
scanf("%d",&x);
if(!(x==M))
{
printf(" 您的密码输入错误.按任意键返回上一层\n ");
getchar();
getchar();
break;
}
do
{
system("cls");
print();
printf(" 欢迎进入管理系统\n");
printf(" **********************\n");
printf(" 1:添加图书\n 2:删除图书\n 3:图书统计\n 4:书卡统计\n 5:返回上层\n");
printf(" **********************\n");
printf(" 您想进行的操作是:\n");
printf(" ");
scanf(" %d",&b);
while(!(b==1||b==2||b==3||b==4||b==5))
{
printf(" 输入错误,请重新输入\n ");
getchar();
scanf("%d",&b);
}
switch(b)
{
case 1:system("cls");addbook();getchar();break;
case 2:system("cls");deletebook();getchar();break;
case 3:system("cls");tongji();getchar();break;
case 4:system("cls");tongji2();getchar();break;
}
system("cls");
} while(b!=5);break;
case 5:break;
//default:printf(" 输入有误,请重新输入\n ");break;
}
system("cls");
}while(a!=5);
if((fq=fopen("book.dat","wb"))==NULL)
{
printf("cannot open this file\n");
exit(0);
}
for(i=0;i<s.len;i++)
if(fwrite(&(s.book1[i]),sizeof(book),1,fq)!=1)
printf("file write error!\n");
fclose(fq);
if((fq1=fopen("card.dat","wb"))==NULL)
{
printf("cannot open this file\n");
exit(0);
}
for(i=0;i<p.len1;i++)
if(fwrite(&(p.card1[i]),sizeof(card),1,fq1)!=1)
printf("file write error!\n");
fclose(fq1);
print();
printf(" 谢谢您的使用,再见!\n");
printf(" ");
return 0;
}