C语言实现的图书管理系统
/*
作品:图书管理系统v1.0
作者:黄xx
时间:2019/11/20
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Book
{
char name[32]; //书名
int count; //书数
int flag; //是否可借
};
typedef struct Book book;
struct Student
{
char name[32]; //学生姓名
int id; //学号
char *book[5]; //借的书
int count; //借书数目
};
typedef struct Student stu;
book *g_book[1024] = {0}; //图书馆所有书
stu *g_student[1024] = {0}; //图书馆记录的所有借书的学生
int g_BookCount = 0; //图书馆书的本数
int g_StudentCount = 0; //借书的人数
/*
函数描述:图书馆初始化,存放一些图书
函数参数:无
函数返回值:无
*/
void Init()
{
int i;
for (i = 0; i < 3; i++) //开启内存空间
{
g_book[i] = (book *)malloc(sizeof(book) * 1);
if (NULL == g_book[i])
{
printf("malloc failrue!\n");
}
g_book[i]->flag = 1; //可借
g_BookCount++;
}
strcpy(g_book[0]->name, "数学"); //书名
strcpy(g_book[1]->name, "英语");
strcpy(g_book[2]->name, "语文");
g_book[0]->count = 3; //本数
g_book[1]->count = 5;
g_book[2]->count = 1;
}
/*
函数描述:显示菜单
函数参数:无
函数返回值:无
*/
void menu() //显示菜单
{
system("clear");
printf("\t\t------------------------------\n");
printf("\t\t 1、增加图书 2、删除图书\n");
printf("\t\t 3、查看图书 4、查找图书\n");
printf("\t\t 5、借书 6、还书 \n");
printf("\t\t 7、借书情况 8、退出系统\n");
printf("\t\t------------------------------\n");
}
/*
函数描述:根据id查找学生是否存在
函数参数:学号
函数返回值:学生存在返回下标 学生不存在返回-1
*/
int TraverseStudent(int id)
{
int i;
for (i = 0; i < g_StudentCount; i++)
{
if (id == g_student[i]->id)
{
return i;
}
}
return -1;
}
/*
函数描述:根据书名判断书是否存在
函数参数:书名
函数返回值:存在则返回书本的下标,不存在返回-1
*/
int TraverseBook(char *n)
{
int i;
for (i = 0; i < g_BookCount; i++)
{
if (strcmp(n, g_book[i]->name) == 0)
{
return i;
}
}
return -1;
}
/*111111111111111111111111111111111111111111111111
函数描述:添加图书
函数参数:无
函数返回值:无
*/
void Add()
{
printf("\t\t请输入添加图书的名字!\n");
char name[32] = {0};
int num;
scanf("%s",name);
int result = TraverseBook(name);
if (result != -1) //添加已有图书
{
printf("\t\t该书已存在,请输入你要增加的数量:\n");
scanf("%d",&num);
g_book[result]->count += num;
printf("书籍增加成功,该书现在有%d本\n",g_book[result]->count);
return;
}
else
{
g_BookCount++;
g_book[g_BookCount - 1] = (book *)malloc(sizeof(book) * 1);
if (NULL == g_book[g_BookCount - 1])
{
printf("malloc fialure!\n");
}
g_book[g_BookCount - 1]->flag = 1;
}
strcpy(g_book[g_BookCount - 1]->name, name);
printf("\t\t请输入要增加的本数:\n");
scanf("%d", &num);
g_book[g_BookCount - 1]->count = num;
printf("\t\t添加成功,%s 目前已有 %d 本!\n",name, num);
sleep(1);
}
/*2222222222222222222222222222222222
函数描述:删除图书
函数参数:无
函数返回值:无
*/
void DelBook()
{
printf("\t\t请输入要删除的书籍名称:\n");
char name[32] = {0};
int i;
scanf ("%s",name);
int result = TraverseBook(name);
//判断是否有此书
if(-1 == result)
{
printf("图书馆没有此书!\n");
return;
}
//查到此书
else
{
free(g_book[result]); //释放空间
g_BookCount--;
printf("\t\t %s 删除成功!\n", name);
sleep(1);
}
}
/*333333333333333333333333333333333
函数描述:删除图书
函数参数:无
函数返回值:无
*/
void ShowBook()
{
printf("\t\t书本情况:\n");
int i;
for (i = 0; i < g_BookCount; i++)
{
printf("\t\t 书名:%s 本数 %d 是否可借 %s\n",
g_book[i]->name, g_book[i]->count,
(g_book[i]->flag == 1) ? "可借" : "不可借");
}
sleep(3);
}
/*4444444444444444444444444444444
函数描述:查找图书
函数参数:无
函数返回值:无
*/
void SearchBook()
{
printf("\t\t请输入要查找的书籍名称:\n");
char name[32] = {0};
int i;
scanf ("%s",name);
int result = TraverseBook(name);
//判断是否有此书
if(-1 == result)
{
printf("图书馆没有此书!\n");
return;
}
//查到此书,显示详细信息
else
{
printf("\t\t搜索成功!\n");
printf("\t\t 书名:%s 本数 %d 是否可借 %s\n", g_book[result]->name, g_book[result]->count,
(g_book[result]->flag == 1) ? "可借" : "不可借");
sleep(3);
}
}
/*555555555555555555555555555555
函数描述:借书部分
函数参数:无
函数返回值:无
*/
void BorrowBook()
{
int id = 0;
printf("\t\t请输入学号:\n");
scanf("%d", &id);
//遍历g_student数组,判断学生是否借过书
int result = TraverseStudent(id);//判断id是否存在
if (result == -1) //不存在,给新学生申请内存
{
g_StudentCount++;
g_student[g_StudentCount - 1] = (stu *)malloc(sizeof(stu) * 1);
if(NULL == g_student[g_StudentCount - 1])
{
printf("malloc fialure!\n");
return;
}
printf("\t\t要借哪本书:\n");
char name[32] = {0};
scanf("%s", name);
//判断书在不在
result = TraverseBook(name);
if (-1 == result) //书本不存在
{
printf("\t\t书本不存在,借书失败\n");
return;
}
else
{
if (g_book[result]->flag == 0)
{
printf("\t\t该书已经被借完!\n");
}
else
{
g_book[result]->count--;
if (0 == g_book[result]->count)
{
g_book[result]->flag = 0; //书本不可借
}
g_student[g_StudentCount - 1]->id = id; //记录学生的学号
g_student[g_StudentCount - 1]->book[g_student[g_StudentCount - 1]->count] = (char *)malloc(sizeof(char) * 128);
if (NULL == g_student[g_StudentCount - 1]->book)
{
printf("malloc failure!\n");
return;
}
strcpy(g_student[g_StudentCount - 1]->book[g_student[g_StudentCount - 1]->count], name); //保存书名
g_student[g_StudentCount - 1]->count++; //借书的本数加一
printf("\t\t借书成功\n");
}
}
}
else
{
if (g_student[result]->count == 3 )
{
printf("借书已达上限!\n");
sleep(1);
return;
}
else
{
printf("\t\t要借哪本书?\n");
char name1[32]={0};
scanf("%s",name1);
//判断书是否存在
int result1 = TraverseBook(name1);
{
if (-1 == result1)//书本不存在
{
printf("\t\t书本不存在,借书失败!\n");
return;
}
else
{
if (g_book[result1]->flag == 0)
{
printf("\t\t该书已经被借完!\n");
}
else //书本存在
{
g_book[result1]->count--;
if (0 == g_book[result1]->count)
{
g_book[result]->flag = 0; //书本不可借
}
//给这个学生的书名分配内存
g_student[result]->book[g_student[result]->count] = (char*)malloc(sizeof(char)*128);
if (NULL == g_student[result]->book)
{
printf("malloc failure!\n");
return;
}
strcpy(g_student[result]->book[g_student[result]->count],name1);
g_student[result]->count++;
printf("\t\t借书成功!\n");
sleep(1);
}
}
}
}
}
}
/*666666666666666666
函数描述:还书
函数参数:无
函数返回值:无
*/
void ReturnBook()
{
int id = 0;
printf("\t\t请输入学号: \n");
scanf("%d", &id);
printf("\t\t请输入要还的书籍名称:\n");
char name[32] = {0};
int i;
scanf ("%s",name);
int result = TraverseBook(name);
if (-1 == result) //书本不存在
{
printf("\t\t书本不存在,结束失败\n");
return;
}
else //书本存在
{
if (0 == g_book[result]->count)
{
g_book[result]->flag = 1; //书本可借
}
g_book[result]->count++;
printf("\t\t还书成功\n");
sleep(1);
}
}
/*77777777777777777777777777777777777777
函数描述:借书情况
函数参数:无
函数返回值:无
*/
void BorrowCon()
{
int id, i;
printf("\t\t请输入学号: \n");
scanf("%d", &id);
int result = TraverseStudent(id);
if (-1 == result) //没查询到此人
{
printf("没有此人\n");
}
else //查询到此人
{
printf("\t\t借书数量:%d\n",g_student[result]->count);
for(i = 0; i < g_student[result]->count; i++)
{
printf("\t\t书名:%s\n",g_student[result]->book[i]);
}
sleep(5);
}
}
int main()
{
char choice[2] = {0};
Init();
while(1)
{
menu();
scanf("%c", &choice);
switch(choice[0])
{
case '1':
Add();
break;
case '2':
DelBook();
break;
case '3':
ShowBook();
break;
case '4':
SearchBook();
break;
case '5':
BorrowBook();
break;
case '6':
ReturnBook();
break;
case '7':
BorrowCon();
break;
case '8':
exit(0);
break;
default:
printf("输入有误!\n");
break;
}
}
return 0;
}