C++图书馆管理系统(简单版)

2024-06-14 1053阅读

1、 总体功能分析

实用的图书馆管理系统应该至少包括一下功能:

C++图书馆管理系统(简单版)
(图片来源网络,侵删)

1、上传:新进图书以及基本信息的输入

2、删除:旧图书以及基本信息的删除

3、显示:显示图书馆已有的所有图书

4、查找:查询要借阅的图书信息

5、借阅:实现用户办理借阅手续

6、归还:实现用户办理归还手续

系统以菜单方式工作使界面友好,易于操作。

2、建立相关属性

由于系统设计的是一些图书和读者的信息存储,因此,需要定义一个数据结构来存储相关信息。

首先需要建立一个图书类、图书数据库类、读者类以及读者数据库类,并定义图书和读者的各种属性。

#include "iostream"
#include "string"
#include "conio.h"
using namespace std;
struct Date{//日期结构
    int m_nYear;//年
    int m_nMonth;//月
    int m_nDay;//日
};
struct Reader{//读者结构
    string name;//读者姓名
    Date bro;//借出时间
    Date back;//归还时间
};
struct Book{//图书结构
    int m_nBook_Number;//图书编号
    string m_strTitle;//书名
    string m_strWroter;//作者
    int m_nMoreNum;//当前在图书馆数量
    int m_nTotalHoldNum;//图书馆共计数量
    string m_sttrComment;//图书介绍
    Reader reader[20];
};
struct Info{//借书信息结构
    Info *m_pParentPoint;//前驱节点
    Book *m_oBookInfo;//对应图书信息
    Info *m_pNextPoint;//后继节点
};

3、图书馆菜单

程序开始运行,将显示选择菜单,供用户选择需要的功能,用户根据需要,输入不同的数字来选择相应功能。

int  Select_Menu(){
    //图书管理系统主界面
    cout 
    //上传图书
    Book *p = new Book;//动态分配一片大小为sizeof(Book)字节的空间,并将该内存空间的起始位置赋值给p
    system("cls");//清屏
    fflush(stdin);//清楚以前的输入
    cout //初始化书本结构成员中相关读者指针内容为空
        (p-reader[i]).name = '\0';
    }
    return p;//返回成功读入的书本信息
}
Info *Insert_BookInfo(Info *bth){
    //上传图书
    int flag, k, x;
    cout //找到直接对已有的数量进行修改
        cout 
            p-m_oBookInfo-m_nMoreNum++;
            p-m_oBookInfo-m_nTotalHoldNum++;
            cout //当bth指针为空时,需要对其进行单独处理,链表表头内存的分配
        bth = new Info;
        bth-m_pParentPoint = NULL;
        bth-m_oBookInfo = r;
        bth-m_pNextPoint = NULL;
    }
    else {
        //说明存在头指针
        p = bth;
        while (p-m_pNextPoint != NULL)
            p = p-m_pNextPoint;
        Info *q = new Info;
        q-m_oBookInfo = r;
        q-m_pNextPoint = NULL;
        q-m_pParentPoint = p;
        p->m_pNextPoint = q;
    }
    return bth;
}

5、 删除图书

将图书信息从图书馆中删除

Info *Delete_BookInfo(Info * bth){
    //删除图书
    int flag, k, x;
    cout > x;
    Info *p = Sreach(bth, x, &k, &flag);
    if(flag == 0){//为查找图书编号
        cout 
        if(p == NULL){//确保当前操作是有效的,防止出现非法操作
            cout 
            cout 
                if(p-m_pNextPoint != NULL && p-m_pParentPoint != NULL){//夹在链表中间的节点
                    Info *Left = p-m_pParentPoint;//将要删除节点的前驱节点指向赋值给前驱结点指针变量
                    Info *Right = p-m_pNextPoint;//将要删除节点的后继结点指向赋值给后继结点指针变量
                    Left-m_pNextPoint = Right;//将后继结点指针指向的地址作为前驱结点的后继域
                    Right-m_pParentPoint = Left;//将前驱结点指针指向的地址作为后继结点的前驱域
                    //释放空间
                    p-m_pNextPoint = NULL;
                    p-m_pParentPoint = NULL;
                    delete p-m_oBookInfo;
                    p-m_oBookInfo = NULL;
                    delete p;
                    p = NULL;
                    return bth;
                }
                else if(p-m_pParentPoint == NULL){//首结点的前驱为空,处理首结点删除操作
                    if(p-m_pNextPoint == NULL){//说明只有一个结点
                        delete p->m_oBookInfo;
                        p->m_oBookInfo = NULL;
                        delete p;
                        p = NULL;
                        return bth;
                    }
                    bth = p->m_pNextPoint;
                    bth->m_pParentPoint = NULL;
                    p->m_pNextPoint = NULL;
                    p->m_pParentPoint = NULL;
                    delete p->m_oBookInfo;
                    p->m_oBookInfo = NULL;
                    delete p;
                    p = NULL;
                    return bth;
                }
                else if(p->m_pNextPoint == NULL){
                    Info *Left = p->m_pParentPoint;
                    Left->m_pNextPoint = NULL;
                    p->m_pNextPoint = NULL;
                    p->m_pParentPoint = NULL;
                    delete p->m_oBookInfo;
                    p->m_oBookInfo = NULL;
                    delete p;
                    p = NULL;
                    return bth;
                }
            }
        }
    }
}

6、 查找图书

根据输入的图书编号,是心啊图书的查找。

Info *Sreach(Info *bth, int x, int *k, int *flag){
    //搜索图书
    Info *p = bth;
    *flag = 0;
    while(p){
        if(p->m_oBookInfo->m_nBook_Number == x){//寻到相同的图书编号
            *flag = 1;
            return p;
        }
        else {
            *flag = 0;
        }
        if(p->m_pNextPoint != NULL) {
            p = p->m_pNextPoint;
        }
        else{
            break;
        }
    }
    return bth;
}

7、显示图书信息

显示图书馆中所有的图书信息。

void Output_BookInfo(Info * bth){
    //输出图书信息
    system("cls");
    Info *p = bth;
    while (p){
        cout m_nBook_Number;
        cout m_strTitle;
        cout m_strWroter;
        cout m_nMoreNum;
        cout m_nTotalHoldNum;
        cout m_sttrComment m_pNextPoint;
    }
}

8、图书借阅

根据输入的相关信息,实现借阅

void Borrow_TheBook(Info *bth){
    //图书借出
    system("cls");
    int flag, k, x, i = 0;
    cout > x;
    Info *p = Sreach(bth, x, &k, &flag);
    if(flag == 1){
        Book *r = p->m_oBookInfo;
        cout 
            if(r-m_nMoreNum == 0) cout 
                system("cls");
                for(i = 0; i reader[i]).back.m_nMonth;
                cout > (r->reader[i]).back.m_nDay;
                r->m_nMoreNum--;
                cout 
    //图书归还
    system("cls");
    int flag, k, x, i = 0, j = 0;
    cout 
        Book *r = p-m_oBookInfo;
        cout 
            system("cls");
            cout 
                    j = 1;
                    break;
                }
            if(j == 0) {
                cout //日期结构
    int m_nYear;//年
    int m_nMonth;//月
    int m_nDay;//日
};
struct Reader{//读者结构
    string name;//读者姓名
    Date bro;//借出时间
    Date back;//归还时间
};
struct Book{//图书结构
    int m_nBook_Number;//图书编号
    string m_strTitle;//书名
    string m_strWroter;//作者
    int m_nMoreNum;//当前在图书馆数量
    int m_nTotalHoldNum;//图书馆共计数量
    string m_sttrComment;//图书介绍
    Reader reader[20];
};
struct Info{//借书信息结构
    Info *m_pParentPoint;//前驱节点
    Book *m_oBookInfo;//对应图书信息
    Info *m_pNextPoint;//后继节点
};
Book *InputNode(){
    //上传图书
    Book *p = new Book;//动态分配一片大小为sizeof(Book)字节的空间,并将该内存空间的起始位置赋值给p
    system("cls");//清屏
    fflush(stdin);//清楚以前的输入
    cout //初始化书本结构成员中相关读者指针内容为空
        (p-reader[i]).name = '\0';
    }
    return p;//返回成功读入的书本信息
}
Info *Sreach(Info *bth, int x, int *k, int *flag){
    //搜索图书
    Info *p = bth;
    *flag = 0;
    while(p){
        if(p->m_oBookInfo->m_nBook_Number == x){//寻到相同的图书编号
            *flag = 1;
            return p;
        }
        else {
            *flag = 0;
        }
        if(p->m_pNextPoint != NULL) {
            p = p->m_pNextPoint;
        }
        else{
            break;
        }
    }
    return bth;
}
Info *Insert_BookInfo(Info *bth){
    //上传图书
    int flag, k, x;
    cout > x;
    Info *p = Sreach(bth, x, &k, &flag);
    if(flag == 1){//找到直接对已有的数量进行修改
        cout m_nMoreNum m_strTitle  ch;
        if(ch == 'Y' || ch == 'y'){
            p->m_oBookInfo->m_nMoreNum++;
            p->m_oBookInfo->m_nTotalHoldNum++;
            cout m_nMoreNum m_nTotalHoldNum //当bth指针为空时,需要对其进行单独处理,链表表头内存的分配
        bth = new Info;
        bth-m_pParentPoint = NULL;
        bth-m_oBookInfo = r;
        bth->m_pNextPoint = NULL;
    }
    else {
        //说明存在头指针
        p = bth;
        while (p->m_pNextPoint != NULL)
            p = p->m_pNextPoint;
        Info *q = new Info;
        q->m_oBookInfo = r;
        q->m_pNextPoint = NULL;
        q->m_pParentPoint = p;
        p->m_pNextPoint = q;
    }
    return bth;
}
Info *Delete_BookInfo(Info * bth){
    //删除图书
    int flag, k, x;
    cout > x;
    Info *p = Sreach(bth, x, &k, &flag);
    if(flag == 0){//为查找图书编号
        cout 
        if(p == NULL){//确保当前操作是有效的,防止出现非法操作
            cout 
            cout 
                if(p-m_pNextPoint != NULL && p-m_pParentPoint != NULL){//夹在链表中间的节点
                    Info *Left = p-m_pParentPoint;//将要删除节点的前驱节点指向赋值给前驱结点指针变量
                    Info *Right = p-m_pNextPoint;//将要删除节点的后继结点指向赋值给后继结点指针变量
                    Left-m_pNextPoint = Right;//将后继结点指针指向的地址作为前驱结点的后继域
                    Right-m_pParentPoint = Left;//将前驱结点指针指向的地址作为后继结点的前驱域
                    //释放空间
                    p-m_pNextPoint = NULL;
                    p-m_pParentPoint = NULL;
                    delete p-m_oBookInfo;
                    p-m_oBookInfo = NULL;
                    delete p;
                    p = NULL;
                    return bth;
                }
                else if(p-m_pParentPoint == NULL){//首结点的前驱为空,处理首结点删除操作
                    if(p-m_pNextPoint == NULL){//说明只有一个结点
                        delete p->m_oBookInfo;
                        p->m_oBookInfo = NULL;
                        delete p;
                        p = NULL;
                        return bth;
                    }
                    bth = p->m_pNextPoint;
                    bth->m_pParentPoint = NULL;
                    p->m_pNextPoint = NULL;
                    p->m_pParentPoint = NULL;
                    delete p->m_oBookInfo;
                    p->m_oBookInfo = NULL;
                    delete p;
                    p = NULL;
                    return bth;
                }
                else if(p->m_pNextPoint == NULL){
                    Info *Left = p->m_pParentPoint;
                    Left->m_pNextPoint = NULL;
                    p->m_pNextPoint = NULL;
                    p->m_pParentPoint = NULL;
                    delete p->m_oBookInfo;
                    p->m_oBookInfo = NULL;
                    delete p;
                    p = NULL;
                    return bth;
                }
            }
        }
    }
}
void Output_BookInfo(Info * bth){
    //输出图书信息
    system("cls");
    Info *p = bth;
    while (p){
        cout m_nBook_Number;
        cout m_strTitle;
        cout m_strWroter;
        cout m_nMoreNum;
        cout m_nTotalHoldNum;
        cout m_sttrComment m_pNextPoint;
    }
}
void Borrow_TheBook(Info *bth){
    //图书借出
    system("cls");
    int flag, k, x, i = 0;
    cout > x;
    Info *p = Sreach(bth, x, &k, &flag);
    if(flag == 1){
        Book *r = p->m_oBookInfo;
        cout 
            if(r-m_nMoreNum == 0) cout 
                system("cls");
                for(i = 0; i reader[i]).back.m_nMonth;
                cout > (r->reader[i]).back.m_nDay;
                r->m_nMoreNum--;
                cout 
    //图书归还
    system("cls");
    int flag, k, x, i = 0, j = 0;
    cout 
        Book *r = p-m_oBookInfo;
        cout 
            system("cls");
            cout 
                    j = 1;
                    break;
                }
            if(j == 0) {
                cout 
    //图书管理系统主界面
    cout 
    Info *bth = NULL;
    while(true){
        int id = Select_Menu();
        switch (id) {
            case 1:
                bth = Insert_BookInfo(bth);
                break;
            case 2:
                bth = Delete_BookInfo(bth);
                break;
            case 3:
                Output_BookInfo(bth);
                break;
            case 4:
                Borrow_TheBook(bth);
                break;
            case 5:
                TurnBack_TheBook(bth);
                break;
            case 6:
                system("cls");
                cout 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]