C++课程设计——图书管理系统

C++课程设计——图书管理系统

题目介绍

  1. 新书入库: 图书信息包括书名、书号、库存量、现存量共4项。首先输入3本书的信息,并将其存入文件“book.dat”中。当有新书入库时, 先判断文件中是否有此书( 即比较书名 ), 假设有则修改库存量, 现存量的信息; 假设无此书, 则将该书的信息添加到文件中.

  2. 图书查询: 输入一个书号,在文件中查找此书,假设找到则输出此书的全部信息; 假设找不到则输出查找失败的信息。

  3. 借阅管理

    1. 每个读者的信息包括、 编号, 1张借书卡( 限借一本书 ), 输入3个读者的信息存入文件“reader.dat”中。

    2. 添加借阅者

    3. 借书登记: 输入读者的,所借图书的书号,先判断是否在文件”reader.dat” 中, 假设有则将书号存入一张借书卡上( 注: 初始时借书卡的信息都为零,借书后借书卡的信息改为所借书的书号), 并修改文件”reader.dat”的相应内容, 同时修改文件”book.dat”中此书的现存量。假设”reader.dat”无此, 则应提示错误。

    4. 还书管理: 输入读者的, 所还图书的书号, 将借书卡的信息置为零, 并修改文件”reader.dat”的相应内容, 同时修改文件”book.dat”中此书的现存量.

  4. 输出全部图书信息和全部读者信息

  5. 退出系统。

源代码

/**
 * 1. 新书入库: 图书信息包括书名、书号、库存量、现存量共4项。首先输入3本书的信息,并将其存入文件“book.dat”中。
 *    当有新书入库时, 先判断文件中是否有此书( 即比较书名 ), 假设有则修改库存量, 现存量的信息; 假设无此书, 则将该书的信息添加到文件中.
 * 2. 图书查询: 输入一个书号,在文件中查找此书,假设找到则输出此书的全部信息; 假设找不到则输出查找失败的信息。
 * 3. 借阅管理
 *      1. 每个读者的信息包括、 编号, 1张借书卡( 限借一本书 ), 输入3个读者的信息存入文件“reader.dat”中。
 *      2. 添加借阅者
 *      3. 借书登记: 输入读者的,所借图书的书号,先判断是否在文件”reader.dat” 中, 假设有则将书号存入一张借书卡上( 注: 初始时借书卡的信息都为零,借书后借书卡的信息改为所借书的书号),
 *                 并修改文件”reader.dat”的相应内容, 同时修改文件”book.dat”中此书的现存量。假设”reader.dat”无此, 则应提示错误。
 *      4.  还书管理: 输入读者ID, 所还图书的书号, 将借书卡的信息置为零, 并修改文件”reader.dat”的相应内容, 同时修改文件”book.dat”中此书的现存量.
 * 4. 输出全部图书信息和全部读者信息
 * 5. 退出系统。
 */
#include <iostream>
#include <fstream>
#include <cstring>
#include <windows.h>

#define READER_DATA_PATH "reader.dat"
#define BOOK_DATA_PATH "book.dat"

using namespace std;

struct Book {
    char     BookName[256]; /// 书名
    char     ISBN[18];      /// 书号 ISBN
    unsigned StoreNum;      /// 库存量
    unsigned NowNum;        /// 现存量
};

struct Reader {
    char     Id[11];        /// 读者编号, 十位,由字母和数字组成
    char     ISBN[18];      /// ISBN
    bool     IsBorrow;      /// 是否已经借阅
};

struct BookList {
    Book Book;
    BookList *Next;
};

struct ReaderList {
    Reader ReaderInfo;
    ReaderList* Next;
};

/// 打印图书信息
void printBook(Book *bk) {
    cout << "=========================\n";
    cout << "  图书名: 《" << bk->BookName << "》\n";
    cout << "  ISBN: " << bk->ISBN << "\n";
    cout << "  库存量: " << bk->StoreNum << "\n";
    cout << "  现存量: " << bk->NowNum << "\n";
    cout << "=========================\n";
}

/// 打印读者信息
void printReader(Reader *rd) {
    cout << "=========================\n";
    cout << "  ID: " << rd->Id << "\n";
    cout << "  借阅信息:\n";
    if(rd->IsBorrow) {
        cout << "  所借图书: " << rd->ISBN << "\n";
    }
    else {
        cout << "  无借阅信息\n";
    }
    cout << "=========================\n";
}

ReaderList *ReaderListHeadPtr = nullptr;
ReaderList *ReaderListTailPtr = nullptr;
BookList   *BookListHeadPtr = nullptr;
BookList   *BookListTailPtr = nullptr;

void addBook(Book *bk) {
    if(BookListHeadPtr == nullptr) {
        BookListHeadPtr = new BookList();
        BookListHeadPtr->Next = nullptr;
        BookListHeadPtr->Book = *bk;
        BookListTailPtr = BookListHeadPtr;
    }
    else {
        BookListTailPtr->Next = new BookList();
        BookListTailPtr = BookListTailPtr->Next;
        BookListTailPtr->Next = nullptr;
        BookListTailPtr->Book = *bk;
    }
}

void addReader(Reader *rd) {
    if(ReaderListHeadPtr == nullptr) {
        ReaderListHeadPtr = new ReaderList();
        ReaderListHeadPtr->Next = nullptr;
        ReaderListHeadPtr->ReaderInfo = *rd;
        ReaderListTailPtr = ReaderListHeadPtr;
    }
    else {
        ReaderListTailPtr->Next = new ReaderList();
        ReaderListTailPtr = ReaderListTailPtr->Next;
        ReaderListTailPtr->Next = nullptr;
        ReaderListTailPtr->ReaderInfo = *rd;
    }
}

/// 将读者信息和图书信息从文件中读取出来
void readMsgFormDatFile() {
    std::ifstream reader_stream(READER_DATA_PATH);
    std::ifstream book_stream(BOOK_DATA_PATH);
    Reader rd;
    Book bk;


    if(!reader_stream.is_open()) {
        cout << "无法打开读者数据文件" << READER_DATA_PATH << endl;
        exit(1);
    }

    if (reader_stream.peek() == std::ifstream::traits_type::eof()) {
        reader_stream.close();
    }
    else {
        while(reader_stream.read((char*)&rd, sizeof(Reader))) {
            addReader(&rd);
        }
        reader_stream.close();
    }


    if(!book_stream.is_open()) {
        cout << "无法打开图书数据文件" << BOOK_DATA_PATH << endl;
        exit(-1);
    }

    if (book_stream.peek() == std::ifstream::traits_type::eof()) {
        book_stream.close();
    }
    else {
        while(book_stream.read((char*)&bk, sizeof(Book))) {
            addBook(&bk);
        }
        book_stream.close();
    }
}

/// 将读者信息和图书信息写入文件中
void writeMsgToDatFile() {
    std::ofstream reader_stream;
    std::ofstream book_stream;

    reader_stream.open(READER_DATA_PATH, ios::out | ios::trunc);
    if(!reader_stream.is_open()) {
        cout << "无法打开读者数据文件" << READER_DATA_PATH << endl;
        exit(-1);
    }

    while(ReaderListHeadPtr != nullptr) {
        reader_stream.write((char*)&ReaderListHeadPtr->ReaderInfo, sizeof(Reader));
        ReaderListHeadPtr = ReaderListHeadPtr->Next;
    }

    book_stream.open(BOOK_DATA_PATH, ios::out | ios::trunc);
    if(!book_stream.is_open()) {
        cout << "无法打开图书数据文件" << BOOK_DATA_PATH << endl;
        exit(-1);
    }

    while(BookListHeadPtr != nullptr) {
        book_stream.write((char*)&BookListHeadPtr->Book, sizeof(Book));
        BookListHeadPtr = BookListHeadPtr->Next;
    }

    reader_stream.close();
    book_stream.close();
}

/// isbn is xxx-x-xxxx-xxxx-x
bool isbnCheck(char *isbn) {
    if(strlen(isbn) != 17) return false;
    if(isbn[3] != '-' && isbn[5] != '-' && isbn[10] != '-' && isbn[15] != '-') return false;
    for(int i = 0; i < 17; i++) {
        if(isbn[i] != '-' && isbn[i] - '0' < 0 && isbn[i] - '9' > 0) return false;
    }
    return true;
}

int checkHasThisBook(Book *bk) {
    BookList *tmp = BookListHeadPtr;
    int com1, com2;
    while(tmp != nullptr) {
        com1 = strcmp(bk->ISBN, tmp->Book.ISBN);
        com2 = strcmp(bk->BookName, tmp->Book.BookName);
        if(!com1 && !com2) {
            tmp->Book.StoreNum = bk->StoreNum;
            tmp->Book.NowNum = bk->NowNum;
            return 0;
        }
        else if(com1 && com2){
            tmp = tmp->Next;
        }
        else {
            return -1;
        }
    }
    return 1;
}

/// 打印主菜单信息
void printMainMenu() {
    cout << "==============图书管理系统=============\n";
    cout << "1. 新书入库\n";
    cout << "2. 图书查询\n";
    cout << "3. 借阅管理\n";
    cout << "4. 输出全部图书信息和全部读者信息\n";
    cout << "5. 退出系统\n";
    cout << "=====================================\n";
    cout << "请输入选择: ";
    cout.flush();
}

/// 打印借阅管理菜单信息
void printBorrowMenu() {
    cout << "==============借阅管理=============\n";
    cout << "1. 读者添加\n";
    cout << "2. 图书归还\n";
    cout << "3. 图书借阅\n";
    cout << "==================================\n";
    cout << "请输入选择: ";
    cout.flush();
}

/// 新书入库
void addNewBook() {
    static Book bk = {};
    cout<<"图书名:" ;
    std::cin >> bk.BookName;
    cout << "ISBN:";
    std::cin >> bk.ISBN;
    cout << "库存量:";
    std::cin >> bk.StoreNum;
    cout << "现存量:";
    std::cin >> bk.NowNum;
    if(!isbnCheck(bk.ISBN)) {
        cout << "请输入正确的ISBN!\n";
    }
    else {
        int res = checkHasThisBook(&bk);
        if(res < 0) {
            cout << "您输入的图书名与ISBN不符,请重新输入!\n";
        }
        else if(res > 0) {
            addBook(&bk);
        }
    }
}

/// 图书查询
void searchBook() {
    static char BookNameOrISBN[256];
    cout<<"请输入图书名或ISBN:" ;
    std::cin >> BookNameOrISBN;
    BookList *tmp = BookListHeadPtr;
    while(tmp) {
        if(!strcmp(tmp->Book.BookName, BookNameOrISBN) || !strcmp(tmp->Book.ISBN, BookNameOrISBN)) break;
        tmp = tmp->Next;
    }
    if(tmp != nullptr) {
        printBook(&tmp->Book);
    }
    else {
        cout << "未查询到图书信息!" << endl;
    }
}

/// 检查读者ID是否合法
bool checkId(char *id) {
    if(strlen(id) != 10) {
        cout << "请输入正确格式的读者ID!" << endl;
        return false;
    }
    for(int i = 0 ; i < 10 ; i++) {
        if(!isdigit(id[i]) && !isalnum(id[i])){
            cout << "请输入正确格式的读者ID!" << endl;
            return false;
        }
    }
    return true;
}

/// 检查读者是否存在
Reader* searchReader(char *id) {
    ReaderList *tmp = ReaderListHeadPtr;
    while(tmp) {
        if(!strcmp(tmp->ReaderInfo.Id, id)) return &tmp->ReaderInfo;
        tmp = tmp->Next;
    }
    return nullptr;
}

/// 读者添加
void addReader() {
    static Reader rd = {};
    cout << "请输入读者ID: ";
    cin >> rd.Id;
    rd.IsBorrow = false;
    if(!checkId(rd.Id)) {return;}
    else {
        if(searchReader(rd.Id)) {
            cout << "读者已经存在!";
        }
        else {
            addReader(&rd);
        }
    }
}

/// 图书借阅
void borrowBook() {
    static char Id[11];
    static char BookNameOrISBN[256];
    cout << "请输入读者ID: ";
    cin >> Id;
    Reader *reader = searchReader(Id);
    if(!checkId(Id)) {return;}
    if(!reader) {
        cout << "未查询到读者信息" << endl;
        return;
    }
    if(reader->IsBorrow) {
        cout << "该读者无法借阅书籍!" << endl;
        return;
    }
    cout<<"请输入图书名或ISBN:" ;
    std::cin >> BookNameOrISBN;
    BookList *tmp = BookListHeadPtr;
    while(tmp) {
        if(!strcmp(tmp->Book.BookName, BookNameOrISBN) || !strcmp(tmp->Book.ISBN, BookNameOrISBN)) break;
        tmp = tmp->Next;
    }
    if(tmp != nullptr) {
        if(tmp->Book.NowNum == 0) {
            cout << "图书已全部借出!,无法借阅!" << endl;
            return;
        }
        cout << "借阅成功!" << endl;
        strcpy_s(reader->ISBN, tmp->Book.ISBN);
        tmp->Book.NowNum--;
        reader->IsBorrow = true;
    }
    else {
        cout << "未查询到图书信息!" << endl;
    }
}

/// 图书归还
void backBook() {
    static char Id[11];
    static char BookNameOrISBN[256];
    cout << "请输入读者ID: ";
    cin >> Id;
    Reader *reader = searchReader(Id);
    if(!checkId(Id)) {return;}
    if(!reader) {
        cout << "未查询到读者信息" << endl;
        return;
    }
    if(!reader->IsBorrow) {
        cout << "该读者未借阅任何书籍!" << endl;
        return;
    }
    BookList *tmp = BookListHeadPtr;
    while(tmp) {
        if(!strcmp(tmp->Book.BookName, BookNameOrISBN) || !strcmp(tmp->Book.ISBN, reader->ISBN)) break;
        tmp = tmp->Next;
    }
    if(tmp != nullptr) {
        cout << "归还成功!" << endl;
        tmp->Book.NowNum++;
        reader->IsBorrow = false;
    }
    else {
        cout << "非法操作!" << endl;
    }
}

/// 借阅管理, 借书和还书
void bookBorrowAndReturn() {
    static int choice;
    printBorrowMenu();
    cin >> choice;
    switch(choice) {
        case 1: {
            addReader();
        } break;
        case 2: {
            backBook();
        } break;
        case 3: {
            borrowBook();
        } break;
        default:{
            cout << "非法输入!" << choice << endl;
        }
    }
}

/// 输入全部读者和图书信息
void printBookAndReadersMsg() {
    ReaderList *rdp = ReaderListHeadPtr;
    BookList *bkp = BookListHeadPtr;
    cout << "图书信息:\n";
    while(bkp) {
        printBook(&bkp->Book);
        bkp = bkp->Next;
    }
    cout << "读者信息:\n";
    while(rdp) {
        printReader(&rdp->ReaderInfo);
        rdp = rdp->Next;
    }
}

/**
 * 图书管理系统主函数
 */
 int main() {
     readMsgFormDatFile();
     int choice;
     while(true) {
         printMainMenu();
         std::cin >> choice;
         switch (choice) {
             case 1: {
                 addNewBook();
             } break;
             case 2: {
                 searchBook();
             } break;
             case 3: {
                 bookBorrowAndReturn();
             } break;
             case 4: {
                 printBookAndReadersMsg();
             } break;
             case 5: {
                 writeMsgToDatFile();
                 cout << ">>>> 系统已退出 <<<<\n";
                 return 0;
             }
             default: {
                 cout << "非法输入!" << choice << endl;
             }
         }
         cout << "按任意健继续";
         system("pause");
         system("cls");
     }
 }


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图书管理系统是一个针对图书馆或图书机构的管理工具,它可以帮助图书管理员更好地管理图书资源,提高工作效率,提供更好的服务。在课程设计中,设计图书管理系统可以让学生了解实际的图书管理工作流程,培养学生的实际操作能力和解决问题的能力。 首先,课程设计需要对图书管理系统的需求进行分析,包括图书的分类、借阅归还、图书信息的管理等方面。学生需要深入了解图书管理员的工作流程,明确系统需要具备的功能和特点。 其次,课程设计需要学生具备一定的编程知识,包括数据库设计、界面设计、代码编写等方面。学生需要能够将需求分析转化为实际的系统设计,并利用编程技术实现系统的功能。 此外,课程设计也需要考虑到系统的可扩展性和稳定性,学生需要思考如何设计一个灵活性强、性能稳定的图书管理系统,以满足未来可能的变化和需求。 最后,课程设计还需要学生具备项目管理的能力,包括制定项目计划、分工合作、系统测试和上线等方面。学生需要在团队合作中学会沟通与协作,将理论知识转化为实际的项目成果。 总之,图书管理系统课程设计不仅能够帮助学生掌握图书管理系统的设计和实现技术,还能提升学生的实际工作能力和团队合作能力。这对于学生未来的就业和职业发展都将具有重要的意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值