C项目---图书管理系统

head.h

#pragma once 
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <assert.h>
#define N 2
#define MULT 2
#define BOOK_DATA sp->data[i].B_Num,sp->data[i].B_Name, sp->data[i].B_Author, sp->data[i].B_Press, sp->data[i].B_Stock
#define MaxBROOW 2
#define READ_DATA sp->infor[i].R_Name,sp->infor[i].R_StuNum,sp->infor[i].R_Sex

struct Book
{
	int  B_Stock;
	char B_Num[6];
	char B_Author[7];
	char B_Press[11];
	char B_Name[17];

};

struct Reader
{
	char R_Sex[3];
	int R_Max;       //最大借阅量
	int CurBorrow;   //当前已借阅量
	char R_Name[7];
	char R_StuNum[11]; //学号
	char BorrowBookName[2][20]; //读者所借书籍
};


struct ManageBooks
{
	int cursize;   //当前书类
	int Maxsize;   //书的最大种类
	int CurReader; //当前读者数量
	int MaxReader; //最大读者数量

	struct Book*data;
	struct Reader*infor;
};

void ShowMainMenu();
void ManageBooks(struct ManageBooks*sp);
void ShowSubMenu();
void AddBook(struct ManageBooks*sp);
void SaveBookInfor(struct ManageBooks*sp);
void InitBooks(struct ManageBooks*sp);
void ReadBookInfor(struct ManageBooks*sp);
void ShwBook(struct ManageBooks*sp);
void DelBook(struct ManageBooks*sp);
void FreeManageBooks(struct ManageBooks*sp);
bool BookCheck_Duplicate(struct ManageBooks*sp);
void ModBook(struct ManageBooks*sp);
void LokBook(struct ManageBooks*sp);
void Managereaders(struct ManageBooks*sp);
void ShwReadsMenu();
bool ReaderCheck_Duplicate(struct ManageBooks*sp);
void NewReaders(struct ManageBooks*sp);
void SaveReaderInfor(struct ManageBooks*sp);
void ReadReaderInfor(struct ManageBooks*sp);
void DelReaders(struct ManageBooks*sp);
void ShwReaders(struct ManageBooks*sp);
void ModReaders(struct ManageBooks*sp);
void LokReaders(struct ManageBooks*sp);
void Borrow_Return(struct ManageBooks*sp);
void BorrowReturnMenu();
void BorrowBook(struct ManageBooks*sp);
void ReturnBook(struct ManageBooks*sp);

test.cpp

#include "head.h"

void ShowMainMenu()
{
	printf("***************欢迎使用图书管理系统**************\n");
	printf("*************************************************\n");
	printf("****************** 1. 图书管理  *****************\n");
	printf("*************************************************\n");
	printf("****************** 2. 读者管理  *****************\n");
	printf("*************************************************\n");
	printf("****************** 3. 借书还书  *****************\n");
	printf("*************************************************\n");
	printf("****************** 0. 退  出    *****************\n");
	printf("*************************************************\n");
}

void ShowSubMenu()
{
	printf("***************** 1. 增加图书  ********************\n");
	printf("***************** 2. 删除图书  ********************\n");
	printf("***************** 3. 修改图书  ********************\n");
	printf("***************** 4. 查询图书  ********************\n");
	printf("***************** 5. 显示图书  ********************\n");
	printf("***************** 0.返回主菜单 ********************\n");
}

void ManageBooks(struct ManageBooks*sp)
{
	ShowSubMenu();
	int choice = 0;
	scanf("%d", &choice);
	while (choice != 0)
	{
		switch (choice)
		{
		case 1:
			AddBook(sp);
			break;
		case 2:
			DelBook(sp);
			break;
		case 3:
			ModBook(sp);
			break;
		case 4:
			LokBook(sp);
			break;
		case 5:
			ShwBook(sp);
			break;
		default:
			printf("亲,没有这个选线哦,请您重新选择\n");
			Sleep(1000);
		}
		ShowSubMenu();
		scanf("%d", &choice);
	}
}

void InitBooks(struct ManageBooks*sp)
{
	assert(sp != NULL);
	sp->cursize = 0;
	sp->Maxsize = N;
	sp->CurReader = 0;
	sp->MaxReader = N;
	struct Book*kp = (struct Book*)calloc(N, sizeof(struct Book));
	struct Reader*rp = (struct Reader*)calloc(N, sizeof(struct Reader));
	if (kp != NULL && rp != NULL)
	{
		sp->data = kp;
		sp->infor = rp;
	}
	rp[0].CurBorrow = 0;
	rp[0].R_Max = N;
	rp[1].CurBorrow = 0;
	rp[1].R_Max = N;
}

bool BookCheck_Duplicate(struct ManageBooks*sp)
{
	for (int i = 0; i < sp->cursize; i++)
	{
		if (!strcmp(sp->data[sp->cursize].B_Num, sp->data[i].B_Num))
		{
			return true;
		}
	}
	return false;
}

bool ReaderCheck_Duplicate(struct ManageBooks*sp)
{
	for (int i = 0; i < sp->CurReader; i++)
	{
		if (!strcmp(sp->infor[sp->CurReader].R_StuNum, sp->infor[i].R_StuNum))
		{
			return true;
		}
	}
	return false;
}

void AddBook(struct ManageBooks*sp)
{
	assert(sp != NULL);
	while (1)
	{
		printf("请输入需要添加的书名\n");
		char tmp[16] = { 0 };
		scanf("%s", tmp);
		for (int i = 0; i < sp->cursize; i++)
		{
			if (!strcmp(tmp, sp->data[i].B_Name))
			{
				sp->data[i].B_Stock += 1;
				printf("此书已收录,库存+1\n");
				goto Tag;
			}
		}
		if (sp->Maxsize == sp->cursize)
		{
			struct Book*bp = (struct Book*)realloc(sp->data, sizeof(struct Book)*sp->Maxsize * MULT);
			if (bp != NULL)
			{
				sp->data = bp;
			}
			sp->Maxsize *= 2;
		}
		strcpy(sp->data[sp->cursize].B_Name, tmp);
		printf("请输入出版社\n");
		scanf("%s", sp->data[sp->cursize].B_Press);
		printf("请输入图书编号(5位数),例如:00001\n");

		scanf("%s", sp->data[sp->cursize].B_Num);
		while (BookCheck_Duplicate(sp))
		{
			printf("输入重复!请重新输入!\n");
			scanf("%s", sp->data[sp->cursize].B_Num);
		}

		printf("请输入作者\n");
		scanf("%s", sp->data[sp->cursize].B_Author);

		sp->data[sp->cursize].B_Stock = 1;
		sp->cursize += 1;
	Tag:printf("是否继续录入?,是请输入Y\\y, 否请则输入其他\n");
		char judg = 0;
		fflush(stdin);
		scanf("%c", &judg);
		if (!(judg == 'Y' || judg == 'y'))
		{
			break;
		}
	}
	SaveBookInfor(sp);
}

void NewReaders(struct ManageBooks*sp)
{
	while (1)
	{
		if (sp->CurReader == sp->MaxReader)
		{
			sp->infor = (struct Reader*)realloc(sp->infor, sizeof(struct Reader)*sp->MaxReader*MULT);
			sp->MaxReader *= 2;
		}
		sp->infor[sp->CurReader].CurBorrow = 0;
		sp->infor[sp->CurReader].R_Max = MaxBROOW;
		printf("请输入读者的名字!\n");
		scanf("%s", sp->infor[sp->CurReader].R_Name);
		printf("请输入读者的性别!\n");
		scanf("%s", sp->infor[sp->CurReader].R_Sex);
		printf("请输入读者的学号!例如:2020032000\n");
		scanf("%s", sp->infor[sp->CurReader].R_StuNum);
		while (ReaderCheck_Duplicate(sp))
		{
			printf("学号重复,请重新输入学号!,例如:2020032000\n");
			scanf("%s", sp->infor[sp->CurReader].R_StuNum);
		}
		sp->CurReader += 1;
		printf("是否继续录入?,是请输入Y\\y, 否请则输入其他\n");
		char judg = 0;
		fflush(stdin);
		scanf("%c", &judg);
		if (!(judg == 'Y' || judg == 'y'))
		{
			break;
		}
	}
	SaveReaderInfor(sp);
}


void SaveReaderInfor(struct ManageBooks*sp)
{
	FILE*fp = fopen("读者基本信息.txt", "w");
	if (NULL == fp)
	{
		printf("打开失败!");
		exit(1);
	}
	fprintf(fp, "%d ", sp->CurReader);
	for (int i = 0; i < sp->CurReader; i++)
	{
		fprintf(fp, "%s ", sp->infor[i].R_Name);
		fprintf(fp, "%s ", sp->infor[i].R_StuNum);
		fprintf(fp, "%s ", sp->infor[i].R_Sex);
		fprintf(fp, "%d ", sp->infor[i].CurBorrow);
		for (int j = 0; j < sp->infor[i].CurBorrow; j++)
		{
			fprintf(fp, "%s ", sp->infor[i].BorrowBookName[j]);
		}
	}
	fclose(fp);
	fp == NULL;
}




void SaveBookInfor(struct ManageBooks*sp)
{

	FILE*fp = fopen("图书信息.txt", "w");
	if (NULL == fp)
	{
		printf("打开失败!");
		exit(1);
	}
	fprintf(fp, "%d ", sp->cursize);
	for (int i = 0; i < sp->cursize; i++)
	{
		fprintf(fp, " %s ", sp->data[i].B_Author);
		fprintf(fp, " %s ", sp->data[i].B_Name);
		fprintf(fp, " %s ", sp->data[i].B_Num);
		fprintf(fp, " %s ", sp->data[i].B_Press);
		fprintf(fp, " %d ", sp->data[i].B_Stock);
	}
	fclose(fp);
	fp == NULL;
}


void ReadBookInfor(struct ManageBooks*sp)
{
	FILE*fp = fopen("图书信息.txt", "r");
	if (fp == NULL)
	{
		return;
	}
	fscanf(fp, " %d ", &sp->cursize);
	if (sp->cursize > sp->Maxsize)
	{
		sp->data = (struct Book*)realloc(sp->data, sizeof(struct Book)*sp->cursize);
		sp->Maxsize = sp->cursize;
	}
	for (int i = 0; i < sp->cursize; i++)
	{
		fscanf(fp, "%s", sp->data[i].B_Author);
		fscanf(fp, "%s", sp->data[i].B_Name);
		fscanf(fp, "%s", sp->data[i].B_Num);
		fscanf(fp, "%s", sp->data[i].B_Press);
		fscanf(fp, "%d", &sp->data[i].B_Stock);
	}
	fclose(fp);
	fp == NULL;
}

void ReadReaderInfor(struct ManageBooks*sp)
{
	FILE*fp = fopen("读者基本信息.txt", "r");
	if (NULL == fp)
	{
		printf("无读者信息!\n");
		return;
	}
	fscanf(fp, "%d", &sp->CurReader);
	sp->infor = (struct Reader*)malloc(sizeof(struct Reader)*sp->CurReader);
	sp->MaxReader = sp->CurReader;
	for (int i = 0; i < sp->CurReader; i++)
	{
		sp->infor[i].R_Max = N;
		fscanf(fp, "%s", sp->infor[i].R_Name);
		fscanf(fp, "%s", sp->infor[i].R_StuNum);
		fscanf(fp, "%s", sp->infor[i].R_Sex);
		fscanf(fp, "%d", &sp->infor[i].CurBorrow);
		for (int j = 0; j < sp->infor[i].CurBorrow; j++)
		{
			fscanf(fp, "%s", sp->infor[i].BorrowBookName[j]);
		}
	}
	fclose(fp);
	fp == NULL;
}


void ShwBook(struct ManageBooks*sp)
{
	assert(sp != NULL);
	if (sp->cursize == 0)
	{
		printf("没有图书信息!\n");
	}
	else
	{
		printf("\t***********************************************\n");
		printf("\n\n");
		printf("\t%-6s %-10s %-10s %-12s %-4s\n", "编号", "书名", "作者", "出版社", "库存");
		for (int i = 0; i < sp->cursize; i++)
		{
			printf("\t%-6s %-10s %-10s %-12s  %-5d\n", BOOK_DATA);
		}
		printf("\n\n");
		printf("\t***********************************************\n");
		printf("\n\n");
	}

}

void ShwReaders(struct ManageBooks*sp)
{
	if (sp->CurReader == 0)
	{
		printf("无读者信息!\n");
	}
	else
	{
		printf("\t*************************************\n");
		printf("\n\n");
		printf("\t%-8s   %-11s    %-6s   %-16s\n", "姓名", "学号", "性别", "所借书籍");
		for (int i = 0; i < sp->CurReader; i++)
		{
			printf("\t%-8s   %-11s     %-6s", READ_DATA);
			if (sp->infor[i].CurBorrow == 0)
			{
				printf("      %d\n", 0);
			}
			if (sp->infor[i].CurBorrow == 1)
			{
				printf("  %-8s\n", sp->infor[i].BorrowBookName[0]);
			}
			if (sp->infor[i].CurBorrow == 2)
			{
				printf("%-8s %8s\n", sp->infor[i].BorrowBookName[0], sp->infor[i].BorrowBookName[1]);
			}
		}
		printf("\n\n");
		printf("\t*************************************\n");
		printf("\n\n");
	}
}

void DelBook(struct ManageBooks*sp)
{
	char bookname[17] = { 0 };
	printf("输入要删除书的名字!\n");
	scanf("%s", bookname);
	if (sp->cursize == 0)
	{
		printf("无图书信息!\n");
	}
	else
	{
		for (int i = 0; i < sp->cursize; i++)
		{
			if (!strcmp(bookname, sp->data[i].B_Name))
			{
				for (; i < sp->cursize; i++)
				{
					sp->data[i] = sp->data[i + 1];
				}
				break;
			}
		}
		sp->cursize -= 1;
		SaveBookInfor(sp);
		printf("删除成功!\n");
	}
}

void DelReaders(struct ManageBooks*sp)
{
	printf("请输入读者的学号!\n");
	char stunam[11] = { 0 };
	scanf("%s", stunam);
	for (int i = 0; i < sp->CurReader; i++)
	{
		if (!strcmp(stunam, sp->infor[i].R_StuNum))
		{
			for (; i < sp->CurReader; i++)
			{
				sp->infor[i] = sp->infor[i + 1];
			}
			sp->CurReader -= 1;
			SaveReaderInfor(sp);
			printf("删除成功!\n");
			return;
		}
	}
	printf("查无此人!\n");
}

void ModBook(struct ManageBooks*sp)
{
	printf("请输入要修改图书信息书籍的编号!\n");
	char num[6] = { 0 };
	char choice = 0;
	scanf("%s", num);
	for (int i = 0; i < sp->cursize; i++)
	{
		if (!strcmp(num, sp->data[i].B_Num))
		{
			printf("输入A修改图书的名称和作者,输入B修改图书的出版社信息\n");
			fflush(stdin);
			scanf("%c", &choice);
			if (choice == 'A')
			{
				printf("请输入修改后图书的名称!\n");
				scanf("%s", sp->data[i].B_Name);
				printf("请输入修改后图书的作者!\n");
				scanf("%s", sp->data[i].B_Author);
			}
			if (choice == 'B')
			{
				printf("请输入修改后图书的出版社!\n");
				scanf("%s", sp->data[i].B_Press);
			}
			SaveBookInfor(sp);
			return;
		}
	}
	printf("无此图书信息!\n");
}

void ModReaders(struct ManageBooks*sp)
{
	char stunum[11] = { 0 };
	printf("请输入需要修改信息的读者学号!\n");
	scanf("%s", stunum);
	for (int i = 0; i < sp->CurReader; i++)
	{
		if (!strcmp(stunum, sp->infor[i].R_StuNum))
		{
			printf("请输入修改后读者的姓名!\n");
			scanf("%s", sp->infor[i].R_Name);
			printf("请输入修改后读者的性别!\n");
			scanf("%s", sp->infor[i].R_Sex);
			SaveReaderInfor(sp);
			return;
		}
	}
	printf("查无此人!\n");
}

void LokBook(struct ManageBooks*sp)
{
	printf("请输入图书的编号或者名字!\n");
	char name[16] = { 0 };
	scanf("%s", name);
	for (int i = 0; i < sp->cursize; i++)
	{
		if (!strcmp(sp->data[i].B_Name, name) || !strcmp(sp->data[i].B_Num, name))
		{
			printf("\t%-6s %-10s %-10s %-12s %-4s\n", "编号", "书名", "作者", "出版社", "库存");
			printf("\t%-6s %-10s %-10s %-12s  %-5d\n", BOOK_DATA);
			return;
		}
	}
	printf("查无此书!\n");
}

void LokReaders(struct ManageBooks*sp)
{
	printf("请输入查询读者的学号!\n");
	char stunam[11] = { 0 };
	scanf("%s", stunam);
	for (int i = 0; i < sp->CurReader; i++)
	{
		if (!strcmp(stunam, sp->infor[i].R_StuNum))
		{
			printf("\t%-8s   %-11s    %-6s   %-16s\n", "姓名", "学号", "性别", "所借书籍");
			printf("\t%-8s   %-11s     %-6s", READ_DATA);
				if (sp->infor[i].CurBorrow == 0)
				{
					printf("      %d\n", 0);
				}
				if (sp->infor[i].CurBorrow == 1)
				{
					printf("  %-8s\n", sp->infor[i].BorrowBookName[0]);
				}
				if (sp->infor[i].CurBorrow == 2)
				{
					printf("%-8s %8s\n", sp->infor[i].BorrowBookName[0], sp->infor[i].BorrowBookName[1]);
				}
		}
		return;
	}
	printf("查无此人!\n");
}

void Managereaders(struct ManageBooks*sp)
{
	ShwReadsMenu();
	printf("请输入你的选择!\n");
	int choince = 0;
	scanf("%d", &choince);
	while (choince != 0)
	{
		switch (choince)
		{
		case 1:
			NewReaders(sp);
			break;
		case 2:
			DelReaders(sp);
			break;
		case 3:
			ModReaders(sp);
			break;
		case 4:
			LokReaders(sp);
			break;
		case 5:
			ShwReaders(sp);
			break;
		default:
			printf("亲,你输入有误啦,请重新输入!\n");
			Sleep(1000);
		}
		ShwReadsMenu();
		scanf("%d", &choince);
	}
}


void BorrowBook(struct ManageBooks*sp)
{
	printf("请输入读者的学号!\n");
began:char stunum[11] = { 0 };
	scanf("%s", stunum);
	for (int i = 0; i < sp->CurReader; i++)
	{
		if (!strcmp(stunum,sp->infor[i].R_StuNum))
		{
		book:if (sp->infor[i].CurBorrow >= sp->infor[i].R_Max)
			{
				printf("已达最大借阅量!\n");
				printf("请重新输入读者学号!\n");
				goto began;
			}
			printf("请输入所借书籍的名字!\n");
		char bookname[17] = { 0 };
			scanf("%s", bookname);
			for (int j = 0; j < sp->cursize; j++)
			{
				if (!strcmp(bookname, sp->data[j].B_Name))
				{
					if (sp->data[j].B_Stock <= 0)
					{
						printf("库存不足!,请您重新输入\n");
						goto book;
					}
					if (sp->infor[i].CurBorrow == 0)
					{
						strcpy(sp->infor[i].BorrowBookName[0], bookname);
					}
					else
					{
						strcpy(sp->infor[i].BorrowBookName[1], bookname);
					}
					printf("借阅成功,是否继续借阅?输入Y继续借阅,输入其他退出借阅\n");
					sp->data[j].B_Stock--;
					sp->infor[i].CurBorrow++;
					char choice = 0;
					fflush(stdin);
					scanf("%c", &choice);
					if (choice == 'Y')
					{
						goto book;
					}
					else
					{
						SaveReaderInfor(sp);
						return;
					}

				}
			}
			printf("书库内没有此类书籍!\n");
			printf("请重新输入!\n");
			goto book;
		}	
	}
	printf("您输入的学号有误,请重新输入!\n");
	goto began;
}


void ReturnBook(struct ManageBooks*sp)
{
began:printf("请输入读者的学号!\n");
	char stunum[11] = { 0 };
	scanf("%s", stunum);
	for (int i = 0; i < sp->CurReader; i++)
	{
		if (!strcmp(stunum, sp->infor[i].R_StuNum))
		{
		Rrtu2:if (sp->infor[i].CurBorrow == 0)
		{
				  printf("抱歉此读者没有借书!\n");
				  printf("是否更换读者还书? 输入Y继续,其他退出\n");
				  char choice = 0;
				  fflush(stdin);
				  scanf("%c", &choice);
				  if (choice == 'Y')
				  {
					  goto began;
				  }
				  else
				  {
					  SaveReaderInfor(sp);
					  return;
				  }
		}
			  else
			  {
			  Retu:printf("请输入所还书籍名称\n");
				  char bookname[17] = { 0 };
				  scanf("%s", bookname);
				  for (int j = 0; j < sp->infor[i].CurBorrow; j++)
				  {
					  if (!strcmp(bookname, sp->infor[i].BorrowBookName[j]))
					  {
						  sp->infor[i].CurBorrow--;
						  for (int m = 0; m < sp->cursize; m++)
						  {
							  if (!strcmp(bookname, sp->data[m].B_Name))
							  {
								  sp->data[m].B_Stock++;
							  }
						  }
						  printf("换书成功是否继续还书?输入Y继续,其他退出\n");
						  char tmp = 0;
						  fflush(stdin);
						  scanf("%c", &tmp);
						  if (tmp == 'Y')
						  {
							  goto Rrtu2;
						  }
						  else
						  {
							  SaveReaderInfor(sp);
							  return;
						  }
					  }
					  else
					  {
						  printf("您没有借阅此书,是否继续还书,输入Y继续,其他退出\n");
						  fflush(stdin);
						  char selc = 0;
						  scanf("%c", &selc);
						  if (selc == 'Y')
						  {
							  goto Retu;
						  }
						  else
						  {
							  SaveReaderInfor(sp);
							  return;
						  }
					  }
				  }
			  }
		}
	}
	printf("输入学号有误!\n");
	goto began;
}


void ShwReadsMenu()
{
	printf("***************** 1. 新增读者  ********************\n");
	printf("***************** 2. 删除读者  ********************\n");
	printf("***************** 3. 修改读者  ********************\n");
	printf("***************** 4. 查询读者  ********************\n");
	printf("***************** 5. 显示读者  ********************\n");
	printf("***************** 0.返回主菜单 ********************\n");
}

void BorrowReturnMenu()
{
	printf("***************** 1. 借书登记  ********************\n");
	printf("***************** 2. 还书登记  ********************\n");
	printf("***************** 0.返回主菜单 ********************\n");
}

void Borrow_Return(struct ManageBooks*sp)
{
	BorrowReturnMenu();
	int choince = 0;
	scanf("%d", &choince);
	while (choince != 0)
	{
		switch (choince)
		{
		case 1:
			BorrowBook(sp);
			break;
		case 2:
			ReturnBook(sp);
			break;
		default:
			printf("亲,您输入有误哦,请重新输入!\n");
			Sleep(1000);
		}
		BorrowReturnMenu();
		scanf("%d", &choince);
	}
}


void FreeManageBooks(struct ManageBooks*sp)
{
	free(sp->data);
	free(sp->infor);
	sp->data = NULL;
	sp->infor = NULL;
}

main.h

#include "head.h"

struct ManageBooks Lhy;

int main()
{
	InitBooks(&Lhy);
	int choice = 0;
	ReadBookInfor(&Lhy);
	ReadReaderInfor(&Lhy);
	ShowMainMenu();
	scanf("%d", &choice);
	while (choice != 0)
	{
		switch (choice)
		{
		case 1:
			ManageBooks(&Lhy);
			break;
		case 2:
			Managereaders(&Lhy);
			break;
		case 3:
			Borrow_Return(&Lhy);
			break;
		default:
			printf("亲,没有这个选线哦,2秒后将跳转到主菜单,请您重新选择\n");
			Sleep(2000);
		}
		system("cls");
		ShowMainMenu();
		scanf("%d", &choice);
	}
	SaveBookInfor(&Lhy);
	FreeManageBooks(&Lhy);
	system("pause");
	return 0;
}

 C项目---图书管理系统

 

C项目---图书管理系统

 C项目---图书管理系统

 C项目---图书管理系统

 

上一篇:享元模式


下一篇:ROS学习笔记(9)——在RVIZ上打造人机界面