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; }