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 
#include 
#include 
#include 

#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");
     }
 }


你可能感兴趣的:(课程设计,c++,课程设计,java)