#include

#include

#include

#include

#define MAX_BOOKS 10000

#define MAX_USERS 10000

using namespace std;

struct Book {

int book_id;

char title[100];

char author[100];

int available;

int total;

};

struct bb {

int bookid; //所借阅书籍的编号

bb* next; // 指向下一本借阅的书的指针

};

struct User {

int userid;

char name[15];

long long phone;

int bbn; // 借阅书数

bb* booklist; // 借阅的书:指向链表头结点的指针

User* next;

};

User* userslist = NULL;

int sum = 0;

struct Book books[MAX_BOOKS];

int num_books = 0;

int num_users = 0;

int choose();

int mainMenu();

int bookMenu();

void addbook();

void borrowbook();

void returnbook();

void searchbook();

void deletebook();

int book();

void readBook();

void writeBook();

int user();

void writeUser();

void readUser();

int main() {

while (1) {

int choice = mainMenu();

switch (choice) {

case 1:

book();

break;

case 2:

user();

break;

case 3:

exit(0);

break;

default:

printf("无效数字!\n");

//system("pause");

break;

}

}

}

int choose()

{

int choice = -1;

printf("输入选择:");

scanf("%d", &choice);

return choice;

}

//主系统

int mainMenu()

{

printf("\n****************************\n");

printf("* 图书馆系统 *\n");

printf("* 1.图书管理系统 *\n");

printf("* 2.会员管理系统 *\n");

printf("* 3. 退出系统 *\n");

printf("****************************\n");

return choose();

}

int bookMenu()

{

printf("\n**********************************\n");

printf("* 图书管理系统 *\n");

printf("* 1. 添加图书 *\n");

printf("* 2. 借阅图书 *\n");

printf("* 3. 归还图书 *\n");

printf("* 4. 查询图书 *\n");

printf("* 5. 删除图书 *\n");

printf("* 6. 保存修改 *\n");

printf("* 7. 返回主系统 *\n");

printf("* 8. 切换会员管理系统 *\n");

printf("* 9. 退出系统 *\n");

printf("**********************************\n");

return choose();

}

//添加图书

void addBook() {

// 检查是否已存在该书

int book_id, count;

char title[100];

char author[100];

printf("图书id:");

scanf("%d", &book_id);

printf("书名:");

scanf("%s", title);

printf("作者名:");

scanf("%s", author);

printf("添加数量:");

scanf("%d", &count);

if (count + sum > MAX_BOOKS)

{

printf("图书馆存储空间已满,无法添加!");

return;

}

for (int i = 0; i < num_books; i++) {

if (books[i].book_id == book_id) {

books[i].total += count;

books[i].available += count;

sum = sum + count;

printf("图书添加成功!");

return;

}

}

// 不存在则添加新书

books[num_books].book_id = book_id;

strcpy(books[num_books].title, title);

strcpy(books[num_books].author, author);

books[num_books].total = count;

books[num_books].available = count;

sum = sum + count;

num_books++;

printf("图书添加成功!");

return;

}

void borrowBook()

{

long long phone;

int bookid;

cout << "请输入借阅会员的手机号:";

cin >> phone;

User* c = userslist;

while (c != NULL && c->phone != phone)

{

c = c->next; // 寻找要借书的会员

}

if (c == NULL)

{

cout << "未找到该手机号对应的会员信息!" << endl;

return;

}

// 当会员借阅书籍数目达到上限时,提示借阅书籍已达上限

if (c->bbn >= 3) {

cout << "借阅书籍已达上限,无法再借阅更多书籍。" << endl;

return;

}

cout << "请输入要借阅图书的编号:";

cin >> bookid;

for (int i = 0; i < num_books; i++)

{

if (books[i].book_id == bookid)

{

if (books[i].available > 0)

{

books[i].available--;

printf("借阅成功\n");

sum--;

// 创建新的书籍节点

bb* newbook = new bb(); //newBook

newbook->bookid = bookid;

newbook->next = NULL;

if (c->bbn == 0)

{

c->booklist = newbook; // 如果之前未借过书,直接把新书籍节点设为书单的头

}

else

{

bb* cb = c->booklist; //currentBook

while (cb->next != NULL)

{

cb = cb->next; // 找到书单的末尾节点

}

cb->next = newbook; // 将新书籍节点插入到末尾节点之后

cb = cb->next;

cb->next = NULL;

}

c->bbn++;

}

else

{

printf("该书已全部借出\n");

}

return;

}

}

printf("未找到该书\n");

return;

}

//归还图书

void returnBook()

{

long long phone;

int book_id;

char title[100];

char author[100];

printf("请输入归还者的手机号:");

scanf("%lld", &phone);

User* c = userslist;

while (c != NULL && c->phone != phone)

{

c = c->next; // 寻找要借书的会员

}

if (c == NULL)

{

cout << "未找到该手机号对应的会员信息!" << endl;

return;

}

printf("图书id:");

scanf("%d", &book_id);

if ((sum + 1) > MAX_BOOKS)

{

printf("图书馆存储空间已满,无法添加!");

return;

}

for (int i = 0; i < num_books; i++)

{

if (books[i].book_id == book_id)

{

if (books[i].available < books[i].total)

{

books[i].available++;

sum++;

printf("归还成功\n");

bb* newbook = new bb(); //newBook

newbook->bookid = book_id;

newbook->next = NULL;

if (c->bbn == 0)

{

c->booklist = newbook; // 如果之前未借过书,直接把新书籍节点设为书单的头

}

else

{

bb* cb = c->booklist; //currentBook

while (cb->next != NULL)

{

cb = cb->next; // 找到书单的末尾节点

}

cb->next = newbook; // 将新书籍节点插入到末尾节点之后

cb = cb->next;

cb->next = NULL;

}

c->bbn++;

return;

}

else

{

printf("此书非待归还状态!\n");

return;

}

}

}

printf("未找到该书!");

}

//查找图书

void searchBook() {

char keyword[100];

int found = 0;

printf("输入查找信息(书名/作者): ");

scanf("%s", &keyword);

printf("查找结果:\n");

for (int i = 0; i < num_books; i++) {

if (strcmp(books[i].title, keyword) == 0 || strcmp(books[i].author, keyword) == 0)

{

printf("书名: %s, 作者: %s,可借阅数目:%d,图书总数:%d", books[i].title, books[i].author, books[i].available, books[i].total);

found = 1;

}

}

if (!found) {

printf("无符合要求图书!\n");

}

}

//删除图书

void deleteBook() {

char title[100];

char author[100];

int found = 0;

printf("输入要删除的书名: ");

scanf("%s", title);

printf("输入要删除图书的作者名: ");

scanf("%s", author);

for (int i = 0; i < num_books; i++) {

if (strcmp(books[i].title, title) == 0 && strcmp(books[i].author, author) == 0) {

for (int j = i; j < num_books - 1; j++) {

books[j] = books[j + 1];

}

found = 1;

break;

}

}

if (found) {

num_books--;

printf("图书删除成功!\n");

}

else {

printf("未找到要删除的图书!\n");

}

}

void writeBook()

{

FILE* fp = NULL;

fp = fopen("Book.txt", "w+");//覆盖写入文件

int i;

for (i = 0; i < num_books; i++) {

fprintf(fp, "%d %s %s %d %d\n", books[i].book_id, books[i].title, books[i].author, books[i].available, books[i].total);

}

fclose(fp);

return;

}

void readBook()

{

FILE* fp = NULL;

if (NULL == (fp = fopen("Book.txt", "r"))) {//没有 Book.txt

return; //fclose(fp);

}

int i = 0;

while (

fscanf(fp, "%d%s%s%d%d\n", &books[i].book_id, books[i].title, books[i].author, &books[i].available, &books[i].total) != EOF

) {

i++;

}

num_books = i;

fclose(fp);

}

int book()

{

readBook();

while (1) {

int choice = bookMenu();

switch (choice) {

case 1:

addBook();

break;

case 2:

borrowBook();

break;

case 3:

returnBook();

break;

case 4:

searchBook();

break;

case 5:

deleteBook();

break;

case 6:

readUser();

writeBook();

writeUser();

printf("修改信息成功!");

break;

case 7:

mainMenu();

break;

case 8:

user();

break;

case 9:

printf("\n\n感谢您的使用!\n\n");

exit(0);

break;

default:

printf("无效数字!\n");

//system("pause");

break;

}

}

return choose();

}

void addUser() {

char name[15];

long long phone;

User* newUser = new User(); // 创建新的会员节点

newUser->next = NULL;

printf("请输入要添加的会员姓名:");

scanf("%s", name);

printf("请输入要添加会员的手机号:");

cin >> phone;

newUser->phone = phone;

strcpy(newUser->name, name);

newUser->bbn = 0;

newUser->booklist = NULL;

newUser->userid = num_users;

if (userslist == NULL)

{

userslist = newUser; // 如果会员链表为空,直接将新会员节点设为头节点

}

else

{

User* current = userslist;

while (current->next != NULL)

{

current = current->next; // 找到会员链表的末尾节点

}

current->next = newUser; // 将新会员节点插入到末尾节点之后

}

printf("会员添加成功!\n");

num_users++;

}

// 查询会员编号、姓名、手机号、已借阅书籍量、具体借阅书籍

void searchUser() {

long long phone;

cout << "请输入要查询会员的手机号:";

cin >> phone;

User* current = userslist;

while (current != NULL)

{

if (current->phone == phone)

{

cout << "会员编号:" << current->userid << endl;

cout << "会员姓名:" << current->name << endl;

cout << "会员手机号:" << current->phone << endl;

cout << "已借阅书籍数量:" << current->bbn << endl;

// 打印会员已借阅的书籍

if (current->bbn == 0)

{

cout << "无借阅记录!" << endl;

return;

}

else

{

bb* bookPtr = current->booklist;

cout << "借阅的书籍:";

while (bookPtr != NULL)

{

cout << bookPtr->bookid << ", ";

bookPtr = bookPtr->next;

}

cout << endl;

return;

}

}

current = current->next;

}

cout << "未找到该手机号对应的会员信息!\n" << endl;

}

//删除会员信息

void deleteUser()

{

long long phone;

int found = 0;

printf("输入要删除会员的手机号: ");

cin >> phone;

User* current = userslist;

User* p = NULL;

// 寻找要删除的会员节点,并记录其前一个节点

while (current != NULL && current->phone != phone)

{

p = current;

current = current->next;

}

// 如果未找到要删除的会员

if (current == NULL)

{

cout << "未找到要删除的会员!" << endl;

return;

}

// 如果要删除的是头节点

if (p == NULL)

{

userslist = current->next;

}

else

{

p->next = current->next;

}

// 释放要删除的节点的内存

delete current;

cout << "会员删除成功!" << endl;

num_users--;

return;

}

void writeUser()

{

FILE* fp = NULL;

fp = fopen("User.txt", "w+");//覆盖写入文件

User* member = new User;

member = userslist;

while (member != NULL)

{

fprintf(fp, "%d %s %lld %d ", member->userid, member->name, member->phone, member->bbn);

bb* p = new bb;

p = member->booklist;

while (p != NULL)

{

fprintf(fp, "%s ", p->bookid);

p = p->next;

}

fprintf(fp, "\n");

member = member->next;

}

fclose(fp);

printf("保存信息成功!\n");

return;

}

void readUser() {

FILE* fp = fopen("User.txt", "r");

User* member = NULL;

User* p = NULL;

bb* book = NULL;

char line[1000];

while (fgets(line, sizeof(line), fp) != NULL)

{

member = new User();

int bytesRead = sscanf(line, "%d %s %lld %d", &member->userid, member->name, &member->phone, &member->bbn);

//if (bytesRead != 4) {

// cout << "文件格式错误" << endl;

// delete member;

// continue;

//}

for (int i = 0; i < member->bbn; ++i)

{

int bookid;

book = new bb();

book->bookid = NULL;

book->next = NULL;

if (member->booklist == NULL)

{

member->booklist = book;

}

else

{

bb* temp = member->booklist;

while (temp->next != NULL)

{

temp = temp->next;

}

temp->next = book;

}

}

if (p != NULL)

{

p->next = member;

num_users++;

}

else

{

userslist = member;

}

p = member;

}

fclose(fp);

cout << "读取信息成功!" << endl;

num_users++;

}

int userMenu()

{

printf("\n**********************************\n");

printf("* 会员管理系统 *\n");

printf("* 1. 增加会员 *\n");

printf("* 2. 查询会员 *\n");

printf("* 3. 删除会员 *\n");

printf("* 4. 保存修改 *\n");

printf("* 5. 返回主系统 *\n");

printf("* 6. 切换图书管理系统 *\n");

printf("* 7. 退出系统 *\n");

printf("**********************************\n");

return choose();

}

int user()

{

readUser();

while (1) {

int choice = userMenu();

switch (choice) {

case 1:

addUser();

break;

case 2:

searchUser();

break;

case 3:

deleteUser();

break;

case 4:

readBook();

writeUser();

writeBook();

break;

case 5:

mainMenu();

break;

case 6:

book();

break;

case 7:

printf("\n\n感谢您的使用!\n\n");

exit(0);

break;

default:

printf("无效数字!\n");

//system("pause");

break;

}

}

return choose();

}

参考文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: