• 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");
         }
     }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    • 278
    • 279
    • 280
    • 281
    • 282
    • 283
    • 284
    • 285
    • 286
    • 287
    • 288
    • 289
    • 290
    • 291
    • 292
    • 293
    • 294
    • 295
    • 296
    • 297
    • 298
    • 299
    • 300
    • 301
    • 302
    • 303
    • 304
    • 305
    • 306
    • 307
    • 308
    • 309
    • 310
    • 311
    • 312
    • 313
    • 314
    • 315
    • 316
    • 317
    • 318
    • 319
    • 320
    • 321
    • 322
    • 323
    • 324
    • 325
    • 326
    • 327
    • 328
    • 329
    • 330
    • 331
    • 332
    • 333
    • 334
    • 335
    • 336
    • 337
    • 338
    • 339
    • 340
    • 341
    • 342
    • 343
    • 344
    • 345
    • 346
    • 347
    • 348
    • 349
    • 350
    • 351
    • 352
    • 353
    • 354
    • 355
    • 356
    • 357
    • 358
    • 359
    • 360
    • 361
    • 362
    • 363
    • 364
    • 365
    • 366
    • 367
    • 368
    • 369
    • 370
    • 371
    • 372
    • 373
    • 374
    • 375
    • 376
    • 377
    • 378
    • 379
    • 380
    • 381
    • 382
    • 383
    • 384
    • 385
    • 386
    • 387
    • 388
    • 389
    • 390
    • 391
    • 392
    • 393
    • 394
    • 395
    • 396
    • 397
    • 398
    • 399
    • 400
    • 401
    • 402
    • 403
    • 404
    • 405
    • 406
    • 407
    • 408
    • 409
    • 410
    • 411
    • 412
    • 413
    • 414
    • 415
    • 416
    • 417
    • 418
    • 419
    • 420
    • 421
    • 422
    • 423
    • 424
    • 425
    • 426
    • 427
    • 428
    • 429
    • 430
    • 431
    • 432
    • 433
    • 434
    • 435
    • 436
    • 437
    • 438
    • 439
    • 440
    • 441
    • 442
    • 443
    • 444
    • 445
    • 446
    • 447
    • 448
    • 449
    • 450
    • 451
    • 452
    • 453
    • 454
    • 455
    • 456
    • 457
    • 458
    • 459
    • 460
  • 相关阅读:
    交换两实数的整数部分
    【数据结构初阶】六、线性表中的队列(C语言 -- 链式结构实现队列)
    mysql5.7免安装教程,配置my.ini详解,安装卸载mysql服务,开启远程登录,修改mysql密码
    Java_类和对象
    Mysql之用户管理
    Vuejs设计与实现 —— 渲染器核心 Diff 算法
    java使用策略模式优化代码中的if-else if 判断。
    rknn_toolkit以及rknpu环境搭建-rv1126
    2022年03月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试
    数仓建设(二)
  • 原文地址:https://blog.csdn.net/qq_48201696/article/details/133758619