图书馆系统(C++)

本文描述了一个基于C++编写的图书管理系统,包括添加、借阅、归还图书,查询图书,以及会员管理功能,如添加会员、查询会员信息和删除会员。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#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();
}

具体功能要求 1、图书维护 (1)设置管理员账号和密码; (2)图书信息录入:图书编号、书名、作者名、分类、图书数量; (3)图书信息更改; (4)图书信息删除; (5)图书信息查询:按图书编号查询、按书名查询、按作者名查询; (6)图书信息全部显示; (7)图书信息全部删除; (8)退出图书维护界面。 2、读者维护 (1)设置管理员账号和密码; (2)读者信息录入:读者姓名、学号; (3)读者信息更改; (4)读者信息删除; (5)读者信息查询:按读者编号查询、按读者姓名查询; (6)读者信息全部显示; (7)读者信息全部删除; (8)退出读者维护界面。 3、借书 (1)设置借书的范围(如5本); (2)图书数量随着借书的数量减少; (3)输入读者编号与图书编号后借书成功。 4、还书 (1)图书数量随着还书的数量增加; (2)输入读者编号与图书编号后还书成功。 5、添加功能 (1)添加一本图书的基本信息,包括书名、图书编号、作者名、类别、图书数量。 (2)添加读者信息: 添加图书借阅的基本信息,包括书名、学号。 6、更改功能 对图书和读者的信息进行修改。 7、查找功能 (1)图书信息查找; (2)读者信息查找。 8、显示功能 (1)显示所有图书信息; (2)显示所有借阅信息。 9、删除功能 (1)删除图书的基本信息; (2)删除读者的基本信息; (3)删除图书借阅基本信息。
开题报告 经过大学四年理论课程的学习,以及校内校外的实践,极大的丰富了自身的理论基础,并且也具备了一些处理简单问题的能力,但即将踏上社会的我深知这还远远不够,因此我利用了毕业设计的机会,在老师的指导下去完成一个具有挑战性的,其具体应用及社会服务相结合的项目,深知通过对它的开发,将对我的能力有更高层次的突破。 开发软件的一个目的是针对目前普遍的图书管理系统存在的功能不全,操作复杂,系统要求高等一系列问题,而设想一个具有个性化的图书管理系统。该管理系统与MIS系统相联系,在图书馆内部建成可靠,方便,并且功能齐全的MIS系统。从而在图书馆对新旧书的反应;对书籍借阅的管理能力;对读者和图书馆工作人员的管理能力;对图书馆管理人员软件操作的适应时间和操作感觉这些方面都将大大的提高。当然对该软件的态度是渴望获得显著的社会效益。 开发软件的另一个目的是使其具有强大的实用价值,即它可以满足中小型图书馆的借阅与管理的需要。在一般的学校与科研机构,其下属的很多分支的研究中心,试验中心,各个学院,它们往往都有着自己的规模较大的图书资料室。而这些图书资料室由于本身规模不大因此其对书籍或资料的管理模式一般都比较旧,而且在没有能力也没有必要引进大型的图书馆管理软硬件的基础上,寻求一个针对中小型图书资料室的管理软件是必要的。 这种管理软件对硬件的要求很低,一般有一个比较简单的服务器与PC机组成的网络即可,再加上使用比较廉价、性能不错的软件,这样就可以以较低的成本来实现一个足够使用的功能,而这种模式也正满足了那种中小型资料室,图书馆的要求。但是目前对这种管理软件的开发还处于一种比较原始的阶段。开发者往往都是出于资金和时间的顾虑使用比较陈旧的技术,并且各为己见,并且很少涉及网络。可是当今是一个网络化的社会,像资料室,图书馆这样的信息机构不能与网络联系起来岂不可惜,再加上如今单机版的图书管理软件多如牛毛,去开发一个类似的软件无疑是一种在时间上、精神上和资源上的极大浪费。所以出于多方面的考虑觉得有必要为这种有需要的中小型图书馆,资料室开发一种基于网络的图书资料管理软件。 项目的具体目的: 1. 实现图书馆对外借书,还书的简易操作,提高图书馆对最平凡工作的效率。 2. 实现图书馆对所藏图书的按类别,书名等多方面的查询,最大的方便读者和图书馆工作人员对所需图书的查询。 3. 建立图书馆外借读者数据库,方便工作人员对读者进行有效管理。 4. 建立图书馆工作人员数据库,限定每个工作人员对软件操作的权限,最大限度的保护数据库。 5. 实现图书馆对新书入库,旧书注销的简单处理,并且建立书籍档案,方便进货。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wonder-King

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值