C语言实现的图书馆里系统,用到了结构体相关知识,代码如下:
#include <stdio.h>
#include <string.h>
#include <time.h>
typedef struct StuInfo {
char ID[11];
char Faculty[32];
char Profession[32];
char Name[32];
char Sex[8];
char Phone[12];
char Passwd[32];
char Email[32];
char BookList[3][64];
int flag;
} STUINFO;
typedef struct BookInfo {
char ID[7];
char Name[64];
char Author[32];
float Price;
char PubHouse[64];
char PubDate[64];
char BookIntro[1024];
int Count;
char Index[64];//书架
char BrowDate[64];
char RetDate[64];//还书日期
int ReBrowCount;//续借次数
int BrowCount;//借书次数
} BOOKINFO;
typedef struct BookManager {
char ID[11];
char Name[64];
char Passwd[32];
char Email[32];
} BOOKMANAGER;
typedef struct BroInfo {
char ID[11];
char Name[32];
char Profess[64];
char ReDate[64];
} BROINFO;
typedef struct BookInfoCount {
char Name[64];
int count;
} BOOKINFOCOUNT;
typedef struct ProfessBookInfo {
char Profession[32];
BOOKINFOCOUNT Book[1024];
} PROFESSBOOKINFO;
STUINFO g_StuInfo[1024];
BOOKINFO g_BookInfo[1024];
BROINFO g_BroInfo[1024];
BOOKMANAGER g_BookManager[1024];
PROFESSBOOKINFO g_ProfessBookInfo[1024];
char g_StuID[11];
char g_ManaID[11];
int g_BookCount;
void UpdateStuInfo();
int CheckBookTime(int year, int month, int day, int hour, int min);
void UpdateBookInfo();
void Sort();
int CalSumDays(int year, int month, int day);
int CheckEmail(char *email);
void QueryAllBookBorrowInfo();
void QueryStuBorrowInfo();
int CheckBookTime(int year, int month, int day, int hour, int min)//验证输入的借书时间格式是否正确
{
if (month < 1 || month > 12)
{
printf("输入错误!\n");
return -1;
}
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
{
if (day < 1 || day > 31)
{
printf("输入错误!\n");
return -1;
}
}
if (month == 4 || month == 6 || month == 9 || month == 11)
{
if (day < 1 || day > 30)
{
printf("输入错误!\n");
return -1;
}
}
if (month == 2)
{
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
{
if (day < 1 || day > 29)
{
printf("输入错误!\n");
return -1;
}
}
else
{
if (day < 1 || day > 28)
{
printf("输入错误!\n");
return -1;
}
}
}
if (hour < 0 || hour > 23)
{
printf("输入错误\n");
return -1;
}
if (min < 0 || min > 59)
{
printf("输入错误\n");
return -1;
}
return 0;
}
int ManagerLogin()//管理员登陆
{
char t_ID[32] = {0};
char t_Passwd[32] = {0};
int i = 0;
FILE *fp = NULL;
printf("\t\t\t\t管理员登录\n");
printf("\n\t\t\t\t请输入账号:");
scanf("%s", t_ID);
printf("\n\t\t\t\t请输入密码:");
scanf("%s", t_Passwd);
fp = fopen("Manager.txt", "r");
if (fp == NULL)
{
printf("文件不存在!\n");
return -1;
}
while (strlen(g_BookManager[i].ID) != 0)//当存在管理员ID时
{
if (!strcmp(t_ID, g_BookManager[i].ID) && !strcmp(t_Passwd, g_BookManager[i].Passwd))//密码和ID都对
{
strcpy(g_ManaID, g_BookManager[i].ID);//将此ID存入全局变量
fclose(fp);
return 0;
}
i++;
}
fclose(fp);
return -1;
}
int LoadManagerInfo()//将manager文件里的内容存入到数组里
{
int i = 0;
FILE *fp = fopen("Manager.txt", "r");
if (fp == NULL)
{
printf("文件不存在!\n");
return -1;
}
char str[1024] = {0};
while(fgets(str, 1024, fp))//fgets读取一行内容
{
str[strlen(str)-1] = '\0';//方便解析字符串,去掉换行符
sscanf(str, "%s %s %s %s", g_BookManager[i].ID, g_BookManager[i].Name, g_BookManager[i].Passwd, g_BookManager[i].Email);
i++;
memset(str, 0, 1024);
}
fclose(fp);
return 0;
}
int LoadBrowInfo()
{
int i = 0;
FILE *fp = fopen("BrowRecord.txt", "r");
if (fp == NULL)
{
printf("文件不存在!\n");
return -1;
}
char str[1024] = {0};
while(fgets(str, 1024, fp))
{
str[strlen(str)-1] = '\0';
sscanf(str, "%s %s %s %s", g_BroInfo[i].ID, g_BroInfo[i].Name, g_BroInfo[i].Profess, g_BroInfo[i].ReDate);
i++;
memset(str, 0, 1024);
}
fclose(fp);
return 0;
}
int LoadStuInfo()
{
FILE *fp = NULL;
int i = 0;
fp = fopen("Student.txt", "r");
if (fp == NULL)
{
printf("文件不存在!\n");
return -1;
}
while(fscanf(fp, "%s %s %s %s %s %s %s %s %s %s %s %d\n", g_StuInfo[i].ID, g_StuInfo[i].Faculty, g_StuInfo[i].Profession, g_StuInfo[i].Name, g_StuInfo[i].Sex, g_StuInfo[i].Phone, g_StuInfo[i].Passwd, g_StuInfo[i].Email, g_StuInfo[i].BookList[0], g_StuInfo[i].BookList[1], g_StuInfo[i].BookList[2], &g_StuInfo[i].flag) == 12)//12是为了结束读取文件
{
i++;
}
fclose(fp);
return 0;
}
int CheckIndex(char *index)//检查是否同一个书架放了2本书
{
int i = 0;
for (i = 0; i < g_BookCount; i++)
{
if (strcmp(index, g_BookInfo[i].Index) == 0)//如果相同,返回-1
{
return -1;
}
}
return 0;
}
int CheckSameID(char *ID)//检查书是否用了同一个编号
{
int i = 0;
for (i = 0; i < g_BookCount; i++)
{
if (strcmp(ID, g_BookInfo[i].ID) == 0)
{
return -1;
}
}
return 0;
}
void AddBook()//添加图书
{
int year, month, day;
int i = 0;
while(1)
{
printf("请输入图书编号: ");
scanf("%s", g_BookInfo[g_BookCount].ID);//增加书的编号
if (strlen(g_BookInfo[g_BookCount].ID) != 7)//判断编号长度是否为6位
{
printf("编号格式不正确!\n");
continue;
}
if (CheckSameID(g_BookInfo[g_BookCount].ID) == -1)//判断是否用了同一个ID
{
printf("图书编号已存在!\n");
continue;
}
break;
}
printf("请输入图书名称: ");
scanf("%s", g_BookInfo[g_BookCount].Name);
printf("请输入图书作者: ");
scanf("%s", g_BookInfo[g_BookCount].Author);
printf("请输入图书价格: ");
scanf("%f", &g_BookInfo[g_BookCount].Price);
printf("请输入图书出版社: ");
scanf("%s", g_BookInfo[g_BookCount].PubHouse);
while(1)
{
printf("请输入图书出版日期: ");
printf("年 : ");
scanf("%d", &year);
printf("月 : ");
scanf("%d", &month);
printf("日 : ");
scanf("%d", &day);
if (-1 == CheckBookTime(year, month, day, 5, 5))
{
continue;
}
sprintf(g_BookInfo[g_BookCount].PubDate, "%d年%d月%d日", year, month, day);
break;
}
printf("请输入图书简介: ");
scanf("%s", g_BookInfo[g_BookCount].BookIntro);
printf("请输入图书数量: ");
scanf("%d", &g_BookInfo[g_BookCount].Count);
while(1)
{
int row, col;
printf("请输入图书书架位置: \n");
printf("排: ");
scanf("%d", &row);
printf("列: ");
scanf("%d", &col);
sprintf(g_BookInfo[g_BookCount].Index, "%d排%d列", row, col);
if (CheckIndex(g_BookInfo[g_BookCount].Index) == -1)//判断书架位置
{
printf("书架位置已经有书!\n");
continue;
}
break;
}
strcpy(g_BookInfo[g_BookCount].BrowDate, "xx");//将借书世界显示一下
strcpy(g_BookInfo[g_BookCount].RetDate, "xx");
g_BookInfo[g_BookCount].ReBrowCount = 0;//续借次数为0
g_BookInfo[g_BookCount].BrowCount = 0;//借书次数也为0
g_BookCount++;
printf("添加成功!\n");
UpdateBookInfo();
}
int DelBook()
{
int i = 0;
int j = 0;
char t_BookID[7] = {0};
printf("请输入要删除的图书ID: ");
scanf("%s", t_BookID);
for (i = 0; i < g_BookCount; i++)
{
if (!strcmp(t_BookID, g_BookInfo[i].ID))//判断是否有这本书
{
if (g_BookInfo[i].BrowCount != 0)//如果这本书的借书次数不为0
{
printf("书已经借出!不能删除\n");
return 0;
}
for (j = i; strlen(g_BookInfo[j].ID) != 0; j++)//后边的书的信息覆盖掉删除图书的信息
{
g_BookInfo[j] = g_BookInfo[j+1];
}
g_BookCount--;
UpdateBookInfo();
printf("删除成功!\n\n");
return 1;
}
}
printf("ID不存在!\n");
return 0;
}
void ModifyBook()
{
char t_BookID[7] = {0};
printf("请输入要修改的图书ID: ");
scanf("%s", t_BookID);
int i = 0;
int sel = 0;
int t_Count = 0;
char str[1024] = {0};
for (i = 0; i < g_BookCount; i++)
{
if (!strcmp(t_BookID, g_BookInfo[i].ID))
{
if (g_BookInfo[i].BrowCount == 0)//在这本书并没有借走的情况,可以修改三个选项
{
printf("\t\t\t\t请问你要修改什么 ?\n");
printf("1、图书简介\n");
printf("2、图书总数量\n");
printf("3、图书书架位置\n");
printf("4、返回\n");
printf("请输入: ");
scanf("%d", &sel);
if (sel == 1)
{
printf("请输入修改的内容:\n");
scanf("%s", g_BookInfo[i].BookIntro);
}
else if (sel == 2)
{
printf("请输入修改的总数量:\n");
scanf("%d", &t_Count);
if (t_Count < 0)
{
printf("数量设置不正确!\n");
return;
}
g_BookInfo[i].Count = t_Count;
}
else if (sel == 3)
{
printf("请输入修改的书架位置:\n");
int row, col;
printf("排: ");
scanf("%d", &row);
printf("列: ");
scanf("%d", &col);
sprintf(str, "%d排%d列", row, col);
if (CheckIndex(str) == -1)
{
printf("书架位置已经有书!\n");
return;
}
strcpy(g_BookInfo[i].Index, str);//修改书架位置
}
else
{
return;
}
}
else//当此书被别人借走的时候
{
printf("请输入修改的总数量:\n");
scanf("%d", &t_Count);
if (t_Count < 0)
{
printf("数量设置不正确!\n");
return;
}
g_BookInfo[i].Count = t_Count;
}