单链表实现图书管理系统
1 # include<stdio.h> 2 # include<string.h> 3 # include<malloc.h> 4 # include<stdlib.h> 5 6 int peopleid = 20220200;/*最初的管理员编号*/ 7 int bookid = 0200200; 8 9 int yue[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 10 typedef struct rebook { 11 char bookname[50];/*书名*/ 12 int idcard;/*借阅者的编号*/ 13 int year, month, day;/*借阅时间*/ 14 int reyear, remonth, reday;/*最晚归还时间*/ 15 } reb; 16 typedef struct people { 17 int idcard;/*自己的编号*/ 18 char name[50];/*姓名*/ 19 bool is_administrators;/*是否有管理员权限*/ 20 int borrownum;/*已借阅书籍数目*/ 21 int id[10];/*借阅书籍的编号*/ 22 double balance;/*账户余额*/ 23 struct people *next; 24 } people, *ppeople; 25 typedef struct booklist { 26 int id;/*书籍编号*/ 27 int borrowsum;/*总借阅次数*/ 28 char bookname[50];/*书名*/ 29 char place[50];/*储存地点*/ 30 char kind[50];/*类型*/ 31 double price;/*价格*/ 32 char authorname[50];/*作者名称*/ 33 int sum;/*库存总量*/ 34 int nowsum;/*库存剩余量*/ 35 int appointment;/*预约量*/ 36 ppeople borrowpeople[50];/*借阅人信息*/ 37 ppeople appointment_list[11];/*预约人信息*//*最多十人预约*/ 38 struct rebook re[10];/*借阅时间及归还时间*/ 39 struct booklist * next; 40 } book, *pbook; 41 typedef struct bookkind { 42 char kind[50]; 43 int ans; 44 pbook pk[51];/*同类型书不超过50本*/ 45 struct bookkind* next; 46 }* pbookkind, bookkind; 47 typedef struct library { 48 int borrowans;/*总借阅量*/ 49 int max_size;/*总藏书量*/ 50 int now_size; /*当前尚未被借阅的书量*/ 51 int people_in;/*总用户数*/ 52 ppeople phead_people;/*所有注册用户*/ 53 pbook phead_book;/*所有馆藏图书*/ 54 pbookkind phead_bookkind; 55 } library, * plibrary; 56 /*通用*/ 57 void copy(pbook a, pbook b); /*将b的所有信息复制给b*/ 58 void show_kind(plibrary);/*展示所有图书类型*/ 59 void show_kindbook(pbookkind);/*展示同类型的所有书名*/ 60 61 /*对于非管理员*/ 62 /*show_kindbook()通过种类查找书籍*/ 63 void findbook_byname(plibrary, char bookname[]); /*通过书名查找书籍*/ 64 void findbook_byauthor(plibrary, char name[]); /*通过作者查找书籍*/ 65 void show_book(pbook); /*展示书籍详情*/ 66 void borrowbook(plibrary, pbook); /*借书*/ 67 void return_book(pbook, int id, ppeople, plibrary); /*还书*/ 68 void appointment(plibrary, pbook, int id); /*预约*/ 69 void recommend_byborrowsum(plibrary); /*根据借阅数量来推荐书籍*/ 70 void sort_byborrowsum(plibrary); /*根据借阅量排序*/ 71 void sort_byretime(pbook);/*根据归还时间排序*/ 72 //void show_kindall();/*展示同种类型的书籍信息show_kindbook()*/ 73 /*对于管理员*/ 74 void recharge(plibrary); /*充值*/ 75 void modify_book(plibrary); /*修改书籍信息*/ 76 void modify_people(plibrary); /*修改用户信息*/ 77 void insert_newkind(plibrary, char kind[]); /*增添新的图书种类*/ 78 void insert_kindbook(pbookkind, pbook); /*向该类型内增添书*/ 79 void insert_people(plibrary); /*增添新的用户*/ 80 void insert_book(plibrary); /*添加新书*/ 81 void delete_kindbook(pbookkind, pbook); /*删除该类型的这本书*/ 82 void delete_kind(plibrary); /*删除图书种类*/ 83 void delete_people(plibrary); /*注销用户*/ 84 void delete_book(plibrary);/*删除书*/ 85 void showpeople(plibrary, int menu); /*展示所有用户*/ 86 /*对于图书系统*/ 87 void system_(plibrary); 88 void menu_admin(plibrary); 89 void menu_user(plibrary); 90 void menu_tourist(plibrary); 91 pbookkind is_estbookkind(plibrary, char kind[]); /*是否存在这种类型*/ 92 ppeople is_estpeople(plibrary, int id); /*是否存在该用户*/ 93 pbook is_estbook(plibrary, char bookname[]); /*是否存有这本书*/ 94 void showall(plibrary, int menu); /*展示所有书籍信息*/ 95 void shownow(plibrary, int menu); /*展示目前剩余馆藏*/ 96 plibrary build();/*构造一个图书馆*/ 97 98 99 int main() { 100 plibrary pb = build(); 101 system_(pb); 102 return 0; 103 } 104 105 106 plibrary build() { 107 plibrary pb = (plibrary)malloc(sizeof(library)); 108 pb->borrowans = 0; 109 pb->max_size = pb->now_size = 0; 110 pb->phead_book = (pbook)malloc(sizeof(book)); 111 pb->phead_book->next = NULL; 112 pb->phead_people = (ppeople)malloc(sizeof(people)); 113 pb->phead_people->next = NULL; 114 ppeople pp = (ppeople)malloc(sizeof(people)); 115 pp->next = pb->phead_people->next; 116 pp->is_administrators = true; 117 pp->idcard = peopleid; 118 pb->phead_people->next = pp; 119 pb->phead_bookkind = (pbookkind)malloc(sizeof(bookkind)); 120 pb->phead_bookkind->next = NULL; 121 pb->phead_bookkind->ans = 0; 122 return pb; 123 } 124 void shownow(plibrary pb) { 125 pbook pnow = pb->phead_book->next; 126 if (pnow == NULL) { 127 printf("当前无存书,sorry"); 128 return; 129 } 130 while (pnow != NULL && pnow->nowsum > 0) { 131 printf("\t书籍名称:%s\n", pnow->bookname); 132 printf("\t书籍类型:%s\n", pnow->kind); 133 printf("\t作者:%s\n", pnow->authorname); 134 printf("\t价格:%.2lf元\n", pnow->price); 135 printf("\t数量:%d/%d本\n", pnow->nowsum, pnow->sum); 136 printf("\t储存地点:%s\n", pnow->place); 137 pnow = pnow->next; 138 } 139 return; 140 } 141 void showall(plibrary pb) { 142 pbook pnow = pb->phead_book->next; 143 if (pnow == NULL) { 144 printf("当前无存书,sorry"); 145 return; 146 } 147 while (pnow != NULL) { 148 printf("\t书籍名称:%s\n", pnow->bookname); 149 printf("\t书籍类型:%s\n", pnow->kind); 150 printf("\t作者:%s\n", pnow->authorname); 151 printf("\t价格:%.2lf元\n", pnow->price); 152 printf("\t数量:%d/%d本\n", pnow->nowsum, pnow->sum); 153 printf("\t储存地点:%s\n", pnow->place); 154 pnow = pnow->next; 155 } 156 return; 157 } 158 pbook is_estbook(plibrary pb, char bookname[]) { 159 pbook pnow = pb->phead_book; 160 while (pnow != NULL) { 161 if (!strcmp(pnow->bookname, bookname))return pnow; 162 pnow = pnow->next; 163 } 164 return NULL; 165 } 166 void insert_book(plibrary pb) { 167 pbook pnew = (pbook)malloc(sizeof(book)); 168 pbook pnow; 169 printf("请输入书籍信息:\n"); 170 printf("\t书籍名称:"); 171 scanf("%s", pnew->bookname); 172 printf("\n"); 173 pnow = is_estbook(pb, pnew->bookname); 174 if (pnow != NULL) { 175 printf("\t数量:"); 176 scanf("%d", &pnew->sum); 177 pnew->nowsum = pnew->sum; 178 printf("\n"); 179 pnow->nowsum += pnew->nowsum; 180 pnow->sum += pnew->sum; 181 pb->max_size += pnew->sum; 182 pb->now_size += pnew->sum; 183 free(pnew); 184 return; 185 } 186 printf("\t书籍类型:"); 187 scanf("%s", pnew->kind); 188 189 pbookkind pe = is_estbookkind(pb, pnew->kind); 190 if (pe == NULL) { 191 insert_newkind(pb, pnew->kind); 192 pe = is_estbookkind(pb, pnew->kind); 193 insert_kindbook(pe, pnew); 194 } else { 195 insert_kindbook(pe, pnew); 196 } 197 198 printf("\n"); 199 printf("\t作者:"); 200 scanf("%s", pnew->authorname); 201 printf("\n"); 202 printf("\t价格:"); 203 scanf("%lf", &pnew->price); 204 printf("\n"); 205 printf("\t数量:"); 206 scanf("%d", &pnew->sum); 207 pnew->nowsum = pnew->sum; 208 printf("\n"); 209 210 pnew->borrowsum = 0; 211 pb->max_size += pnew->sum; 212 pb->now_size += pnew->sum; 213 214 printf("\t储存地点:"); 215 scanf("%s", pnew->place); 216 pnow = pb->phead_book; 217 pnew ->next = pnow->next; 218 pnow ->next = pnew; 219 220 printf("添加完毕。"); 221 return; 222 } 223 void delete_book(plibrary pb) { 224 pbook pnow, pfront; 225 226 do { 227 printf("请输入您要删除的书籍名称并确认是否正确:"); 228 char bookname[50]; 229 scanf("%s", bookname); 230 pnow = is_estbook(pb, bookname); 231 printf("\n"); 232 if (pnow == NULL) printf("Error!\n"); 233 } while (pnow == NULL); 234 pfront = pb->phead_book; 235 while (pfront->next != pnow) pfront = pfront->next; 236 pfront->next = pnow->next; 237 pb->max_size -= pnow->sum; 238 pb->now_size -= pnow->nowsum; 239 free(pnow->bookname); 240 free(pnow->authorname); 241 free(pnow->kind); 242 free(pnow); 243 printf("删除完毕。"); 244 return; 245 } 246 void modify_book(plibrary pb) { 247 pbook pnow; 248 char bookname[50]; 249 int op = 0; 250 do { 251 printf("您要修改的书籍名称并确认是否正确:"); 252 253 scanf("%s", bookname); 254 pnow = is_estbook(pb, bookname); 255 printf("\n"); 256 if (pnow == NULL) printf("Error!\n"); 257 } while (pnow == NULL); 258 do { 259 printf("您要修改的信息:\n"); 260 printf("1.书籍名称"); 261 printf("2.作者"); 262 printf("3.价格"); 263 printf("4.类型"); 264 printf("5.存放地点"); 265 scanf("%d", &op); 266 switch (op) { 267 case 1: 268 scanf("%s", bookname); 269 strcpy(pnow->bookname, bookname); 270 break; 271 case 2: 272 char name[50]; 273 scanf("%s", name); 274 strcpy(pnow->authorname, name); 275 break; 276 case 3: 277 double price; 278 scanf("%lf", &price); 279 pnow->price = price; 280 break; 281 case 4: 282 char kind[50]; 283 scanf("%s", kind); 284 /*修改kind!!!!*/ 285 break; 286 case 5: 287 char place[50]; 288 scanf("%s", place); 289 strcpy(pnow->place, place); 290 break; 291 } 292 } while (op != -1); 293 printf("修改完毕!"); 294 } 295 void insert_people(plibrary pb) { 296 ppeople pp = (ppeople)malloc(sizeof(people)); 297 printf("请输入用户姓名:"); 298 char name[50]; 299 scanf("%s", name); 300 strcpy(pp->name, name); 301 302 printf("\n是否为管理员(1/2):"); 303 int op; 304 scanf("%d", &op); 305 switch (op) { 306 case 1: 307 pp->is_administrators = true; 308 break; 309 case 2: 310 pp->is_administrators = false; 311 break; 312 } 313 314 printf("\n请输出初始充值金额(最少50元作为押金):"); 315 scanf("%lf", &pp->balance); 316 pp->next = pb->phead_people->next; 317 pb->phead_people->next = pp; 318 pp->idcard = ++peopleid; 319 pb->people_in++; 320 printf("添加成功。\n\n"); 321 printf("您的信息如下:\n"); 322 printf("id:%d\n", pp->idcard); 323 printf("用户名:%s\n", pp->name); 324 printf("余额:%.2lf\n", pp->balance); 325 printf("请您牢记id,以便之后登录。"); 326 327 return; 328 } 329 pbookkind is_estbookkind(plibrary pb, char kind[]) { 330 pbookkind pk = pb->phead_bookkind->next; 331 while (pk != NULL && strcmp(pk->kind, kind) != 0) pk = pk->next; 332 return pk; 333 } 334 ppeople is_estpeople(plibrary pb, int id) { 335 ppeople pp = pb->phead_people; 336 while (pp != NULL && pp->idcard != id) pp = pp ->next; 337 return pp; 338 } 339 void modify_people(plibrary pb) { 340 ppeople pp; 341 do { 342 printf("请输入您要修改的用户id并确认是否正确:"); 343 int id; 344 scanf("%d", &id); 345 pp = is_estpeople(pb, id); 346 printf("\n"); 347 if (pp == NULL) printf("Error!\n"); 348 } while (pp == NULL); 349 350 int op = 0; 351 do { 352 printf("请选择您要修改的信息"); 353 printf("1.姓名:\n"); 354 printf("2.管理员权限:\n"); 355 printf("3.退出修改\n"); 356 scanf("%d", &op); 357 switch (op) { 358 case 1: 359 printf("请输入您要修改的名字:"); 360 char name[50]; 361 scanf("%s", name); 362 strcpy(pp->name, name); 363 break; 364 case 2: 365 printf("升级/退出 管理员权限(Y/N):"); 366 char s; 367 scanf("%c", &s); 368 if (s == 'Y') pp->is_administrators = true; 369 else pp->is_administrators = false; 370 break; 371 case 3: 372 break; 373 } 374 } while (op != 3); 375 printf("修改成功。"); 376 } 377 void delete_people(plibrary pb) { 378 ppeople pp; 379 do { 380 printf("请输入要删除的用户的id并确认是否正确:"); 381 int id; 382 scanf("%d", &id); 383 pp = is_estpeople(pb, id); 384 printf("\n"); 385 if (pp == NULL) printf("Error!\n"); 386 } while (pp == NULL); 387 ppeople pfront = pb->phead_people; 388 while (pfront->next != pp) pfront = pfront->next; 389 pfront->next = pp->next; 390 pb->people_in--; 391 free(pp->name); 392 free(pp); 393 printf("删除成功。"); 394 } 395 void showpeople(plibrary pb) { 396 ppeople pp = pb->phead_people->next; 397 while (pp != NULL) { 398 printf("\t姓名:%s\n", pp->name); 399 printf("\tid:%d\n", pp->idcard); 400 printf("\t余额:%.2lf\n\n", pp->balance); 401 pp = pp->next; 402 } 403 } 404 void recharge(plibrary pb) { 405 ppeople pp; 406 do { 407 printf("请输入您要充值的账户id并确认是否正确:"); 408 int id; 409 scanf("%d", &id); 410 pp = is_estpeople(pb, id); 411 printf("\n"); 412 if (pp == NULL) printf("Error!\n"); 413 } while (pp == NULL); 414 printf("请输入您要充值的金额:"); 415 int rich; 416 scanf("%d", &rich); 417 pp->balance += rich; 418 printf("充值成功。"); 419 return; 420 } 421 void insert_newkind(plibrary pb, char kind[]) { 422 pbookkind pk = (pbookkind)malloc(sizeof(bookkind)); 423 strcpy(pk->kind, kind); 424 pk->next = pb->phead_bookkind->next; 425 pb->phead_bookkind->next = pk; 426 return; 427 } 428 void insert_kindbook(pbookkind pk, pbook po) { 429 if (pk->ans == 50) { 430 printf("同种类书籍已到达上限\nError!"); 431 return; 432 } 433 pk->pk[++(pk->ans)] = po; 434 return; 435 } 436 void delete_kindbook(pbookkind pk, pbook po) { 437 if (pk->ans == 0) { 438 printf("Error!"); 439 return; 440 } 441 int tt = 1; 442 while (pk->pk[tt] != po && tt <= pk->ans) tt++; 443 if (tt > pk->ans) { 444 printf("该类型内并不包含该书!"); 445 return; 446 } 447 for (int i = tt; i < pk->ans; ++i) pk->pk[i] = pk->pk[i + 1]; 448 return; 449 } 450 void delete_kind(plibrary pb) { 451 pbookkind pk, pfront; 452 do { 453 printf("请输入你要删除的书的类型:"); 454 pfront = pb->phead_bookkind; 455 char bookkindname[50]; 456 scanf("%s", bookkindname); 457 pk = pb->phead_bookkind->next; 458 while (pk != NULL && strcmp(pk->kind, bookkindname)) pfront = pk, pk = pk->next; 459 if (pk == NULL) { 460 printf("\nError!\n"); 461 } 462 } while (pk == NULL); 463 pfront->next = pk->next; 464 free(pk->kind); 465 free(pk); 466 printf("删除成功。"); 467 } 468 void show_kind(plibrary pb) { 469 pbookkind pk = pb->phead_bookkind->next; 470 while (pk != NULL) { 471 printf("%s\n", pk->kind); 472 pk = pk->next; 473 } 474 return; 475 } 476 void show_kindbook(pbookkind pk) { 477 if (pk->ans == 0) { 478 printf("当前类型尚未收藏书,sorry"); 479 return; 480 } 481 for (int i = 1; i <= pk->ans; ++i) { 482 printf("%s\n", pk->pk[i]->bookname); 483 } 484 return; 485 } 486 void sort_byborrowsum(plibrary pb) { 487 pbook ttt = (pbook)malloc(sizeof(book)); 488 for (pbook i = pb->phead_book->next; i->next != NULL; i = i->next) { 489 for (pbook j = i->next; j != NULL; j = j->next) { 490 if (i->borrowsum < j->borrowsum) { 491 copy(ttt, j); 492 copy(j, i); 493 copy(i, ttt); 494 } 495 } 496 } 497 free(ttt); 498 } 499 void copy(pbook a, pbook b) { 500 a->appointment = b->appointment; 501 for (int i = 0; i < 9; ++i) 502 a->appointment_list[i] = b->appointment_list[i]; 503 strcpy(a->authorname, b->authorname); 504 strcpy(a->bookname, b->bookname); 505 for (int i = 0; i < b->sum - b->nowsum; ++i) { 506 a->borrowpeople[i] = b->borrowpeople[i]; 507 a->re[i] = b->re[i]; 508 } 509 a->borrowsum = b->borrowsum; 510 a->id = b->id; 511 strcpy(a->kind, b->kind); 512 a->nowsum = b->nowsum; 513 strcpy(a->place, b->place); 514 a->price = b->price; 515 a->sum = b->sum; 516 } 517 void recommend_byborrowsum(plibrary pb) { 518 sort_byborrowsum(pb); 519 pbook pnow = pb->phead_book->next; 520 if (pnow == NULL) { 521 printf("当前无存书,sorry"); 522 return; 523 } 524 int ans = 0; 525 while (pnow != NULL && ans <= 10) { 526 ++ans; 527 printf("\t书籍名称:%s\n", pnow->bookname); 528 printf("\t书籍类型:%s\n", pnow->kind); 529 printf("\t作者:%s\n", pnow->authorname); 530 printf("\t价格:%.2lf元\n", pnow->price); 531 printf("\t数量:%d/%d本\n", pnow->nowsum, pnow->sum); 532 printf("\t储存地点:%s\n", pnow->place); 533 pnow = pnow->next; 534 } 535 } 536 void show_book(pbook pk) { 537 pbook pnow = pk; 538 printf("\t书籍名称:%s\n", pnow->bookname); 539 printf("\t书籍类型:%s\n", pnow->kind); 540 printf("\t作者:%s\n", pnow->authorname); 541 printf("\t价格:%.2lf元\n", pnow->price); 542 printf("\t数量:%d/%d本\n", pnow->nowsum, pnow->sum); 543 printf("\t储存地点:%s\n", pnow->place); 544 } 545 void findbook_byauthor(plibrary pb, char name[]) { 546 pbook pnow = pb->phead_book->next; 547 while (pnow != NULL) { 548 if (strcmp(pnow->authorname, name) == 0) { 549 printf("\t书籍名称:%s\n", pnow->bookname); 550 printf("\t书籍类型:%s\n", pnow->kind); 551 printf("\t作者:%s\n", pnow->authorname); 552 printf("\n"); 553 return; 554 } 555 pnow = pnow->next; 556 } 557 printf("您查找的作者本馆中尚未收藏相关书籍。"); 558 } 559 void findbook_byname(plibrary pb, char bookname[]) { 560 pbook pnow = pb->phead_book->next; 561 while (pnow != NULL) { 562 if (strcmp(pnow->bookname, bookname) == 0) { 563 printf("\t书籍名称:%s\n", pnow->bookname); 564 printf("\t书籍类型:%s\n", pnow->kind); 565 printf("\t作者:%s\n", pnow->authorname); 566 printf("\n"); 567 return; 568 } 569 pnow = pnow->next; 570 } 571 printf("抱歉,您所查找的书籍本馆尚未收藏"); 572 } 573 void sort_byretime(pbook pk) { 574 pbook pnow = pk; 575 int ans = pnow->sum - pnow->nowsum; 576 if (ans == 0) return; 577 for (int i = 1; i < ans; ++i) { 578 for (int j = i + 1; j <= ans; ++j) { 579 if (pnow->re[i].reyear > pnow->re[j].reyear) { 580 reb t = pnow->re[i]; 581 pnow->re[i] = pnow->re[j]; 582 pnow->re[j] = t; 583 } else if (pnow->re[i].remonth > pnow->re[j].remonth) { 584 reb t = pnow->re[i]; 585 pnow->re[i] = pnow->re[j]; 586 pnow->re[j] = t; 587 } else if (pnow->re[i].reday > pnow->re[j].reday) { 588 reb t = pnow->re[i]; 589 pnow->re[i] = pnow->re[j]; 590 pnow->re[j] = t; 591 } 592 } 593 } 594 return; 595 596 } 597 void borrowbook(plibrary pb, pbook pnow) { 598 int id; 599 ppeople pp; 600 if (pnow->nowsum > 0) { 601 do { 602 printf("请输入您的id:"); 603 scanf("%d", &id); 604 pp = is_estpeople(pb, id); 605 if ( pp == NULL) printf("id不存在,请重新输入\n"); 606 } while (pp == NULL); 607 if (pp->balance < 5) { 608 printf("您的余额不足,请充值后再来借阅。\n"); 609 return; 610 } 611 printf("请输入借阅时间(年/月/日):"); 612 scanf("%d/%d/%d", &pnow->re[pnow->sum - pnow->nowsum + 1].year, &pnow->re[pnow->sum - pnow->nowsum + 1].month, &pnow->re[pnow->sum - pnow->nowsum + 1].day); 613 printf("\n"); 614 int len = -1; 615 do { 616 printf("请输入借阅时长(不超过30天):"); 617 scanf("%d", &len); 618 if (len > 30 || len < 0) printf("输入错误,请重新输入"); 619 } while (len < 0 || len > 30); 620 strcpy(pnow->re[pnow->sum - pnow->nowsum + 1].bookname, pnow->bookname); 621 pnow->re[pnow->sum - pnow->nowsum + 1].idcard = pp->idcard; 622 pnow->nowsum--; 623 if (pnow->re[pnow->sum - pnow->nowsum].year % 400 == 0 || (pnow->re[pnow->sum - pnow->nowsum].year % 4 == 0 && pnow->re[pnow->sum - pnow->nowsum].year % 100 != 0)) 624 yue[2] = 29; 625 else yue[2] = 28; 626 int ans = pnow->sum - pnow->nowsum; 627 if (pnow->re[ans].day + len > yue[pnow->re[ans].month]) { 628 pnow->re[ans].reday = (pnow->re[ans].day + len) % yue[pnow->re[ans].month]; 629 if (pnow->re[ans].month == 12) { 630 pnow->re[ans].remonth = 1; 631 pnow->re[ans].reyear = pnow->re[ans].year + 1; 632 } else { 633 pnow->re[ans].remonth = pnow->re[ans].month + 1; 634 pnow->re[ans].reyear = pnow->re[ans].year; 635 } 636 } else { 637 pnow->re[ans].reday = pnow->re[ans].day + len; 638 pnow->re[ans].remonth = pnow->re[ans].month; 639 pnow->re[ans].reyear = pnow->re[ans].year; 640 } 641 pnow->borrowsum++; 642 pp->borrownum++; 643 pp->id[pp->borrownum] = pnow->id; 644 pb->now_size--; 645 printf("谢谢借阅"); 646 return; 647 } else { 648 sort_byretime(pnow); 649 printf("当前书籍已经被全部借出,预期归还时间如下:\n"); 650 for (int i = 1; i <= pnow->sum; ++i) { 651 printf("%d/%d/%d\n", pnow->re[i].reyear, pnow->re[i].remonth, pnow->re[i].reday); 652 } 653 printf("是否预约(Y/N)"); 654 char op; 655 do { 656 getchar(); 657 op = getchar(); 658 if (op != 'Y' && op != 'N') printf("请重新输入"); 659 } while (op != 'Y' && op != 'N'); 660 if (op == 'Y') { 661 appointment(pb, pnow, id); 662 } 663 } 664 return; 665 } 666 667 void appointment(plibrary pb, pbook pnow, int id) { 668 if (pnow->appointment < 10) { 669 pnow->appointment_list[pnow->appointment + 1] = is_estpeople(pb, id); 670 pnow->appointment++; 671 printf("预约成功。\n"); 672 return; 673 } else { 674 printf("当前预约人数超过十人,建议您以后再来借阅。\n"); 675 } 676 } 677 void return_book(pbook pnow, int kk, ppeople pp, plibrary pb) { 678 679 printf("请输入归还时间(年/月/日):"); 680 int year, month, day; 681 scanf("%d/%d/%d", &year, &month, &day); 682 if (year > pnow->re[kk].reyear) { 683 printf("您已逾期归还,扣除押金5元。\n"); 684 pp->balance -= 5; 685 686 } else if (year <= pnow->re[kk].reyear && month > pnow->re[kk].remonth ) { 687 printf("您已逾期归还,扣除押金5元。\n"); 688 pp->balance -= 5; 689 } else if (year <= pnow->re[kk].reyear && month <= pnow->re[kk].remonth && day > pnow->re[kk].reday) { 690 printf("您已逾期归还,扣除押金5元。\n"); 691 pp->balance -= 5; 692 } else { 693 printf("谢谢您如期归还"); 694 } 695 pb->now_size++; 696 int ans = pnow->sum - pnow->nowsum; 697 for (int i = kk; i < ans; ++i) { 698 pnow->re[i] = pnow->re[i + 1]; 699 } 700 pnow->nowsum++; 701 int tt; 702 for (int i = 1; i <= pp->borrownum; ++i) { 703 if (pp->id[i] == pnow->id) { 704 tt = i; 705 break; 706 } 707 } 708 for (int i = tt; i < pp->borrownum; ++i) pp->id[i] = pp->id[i + 1]; 709 pp->borrownum--; 710 } 711 void system_(plibrary pb) { 712 system("cls"); 713 int id, op; 714 printf("\t\t\t1.用户登录 \n"); 715 printf("\t\t\t2.管理员登录 \n"); 716 printf("\t\t\t3.游客浏览 \n"); 717 scanf("%d", &op); 718 switch (op) { 719 case 1: 720 do { 721 printf("请输入id:"); 722 scanf("%d", &id); 723 if (is_estpeople(pb, id) == NULL) { 724 printf("id错误,请重新输入\n"); 725 } 726 } while (is_estpeople(pb, id) == NULL); 727 menu_user(pb); 728 break; 729 case 2: 730 ppeople pnow; 731 do { 732 printf("请输入id:"); 733 scanf("%d", &id); 734 pnow = is_estpeople(pb, id); 735 if ( pnow == NULL || pnow->is_administrators == false) { 736 printf("id错误,请重新输入\n"); 737 } 738 } while (pnow == NULL || pnow->is_administrators == false); 739 menu_admin(pb); 740 break; 741 case 3: 742 menu_tourist(pb); 743 } 744 } 745 void menu_admin(plibrary pb) { 746 system("cls"); 747 printf("\t1.增添新书 \t*\t11.通过书名查找书\n"); 748 printf("\t2.删除书籍 \t*\t12.通过作者查找书\n"); 749 printf("\t3.修改书籍信息 \t*\t13.推荐书籍 \n"); 750 printf("\t4.展示所有图书种类 \t*\t14.借阅 \n"); 751 printf("\t5.增添新的图书种类 \t*\t15.归还 \n"); 752 printf("\t6.删除原有图书种类 \t*\t16.展示所有馆藏 \n"); 753 printf("\t7.展示所有用户 \t*\t17.展示现存图书 \n"); 754 printf("\t8.注册新用户 \t*\t18.修改用户信息 \n"); 755 printf("\t9.注销用户 \t*\t19.退出登录 \n"); 756 printf("\t10.充值 \t* \n"); 757 int op, id; 758 char x, k; 759 pbookkind pk; 760 pbook pnow; 761 ppeople pp; 762 char bookname[50], kind[50]; 763 char name[50]; 764 do { 765 scanf("%d", &op); 766 if (op < 0 || op > 17) printf("输入有误,请重新输入。\n"); 767 } while (op < 0 || op > 17); 768 769 switch (op) { 770 case 1: 771 insert_book(pb); 772 break; 773 case 2: 774 delete_book(pb); 775 break; 776 case 3: 777 modify_book(pb); 778 break; 779 case 4: 780 show_kind(pb); 781 if (pb->phead_bookkind->next == NULL) { 782 printf("目前没有任何书籍类型"); 783 break; 784 } 785 printf("是否需要展示每种类型下的所有书籍?"); 786 getchar(); 787 x = getchar(); 788 if (x == 'Y') { 789 do { 790 printf("请问您想查看哪一类?\n"); 791 do { 792 scanf("%s", kind); 793 pk = is_estbookkind(pb, kind); 794 if (pk == NULL) printf("您查找的书籍类型有误,请重新输入\n"); 795 } while (pk == NULL); 796 show_kindbook(pk); 797 printf("请问您是否还需要继续查找?(Y/N)\n"); 798 do { 799 getchar(); 800 k = getchar(); 801 if (k != 'Y' && k != 'N') printf("输入错误,请重新输入\n"); 802 } while (k != 'Y' && k != 'N'); 803 } while (k == 'Y'); 804 } 805 break; 806 case 5: 807 printf("请输入新的类型名:"); 808 scanf("%s", kind); 809 insert_newkind(pb, kind); 810 break; 811 case 6: 812 delete_kind(pb); 813 break; 814 case 7: 815 showpeople(pb); 816 break; 817 case 8: 818 insert_people(pb); 819 break; 820 case 9: 821 delete_people(pb); 822 break; 823 case 10: 824 recharge(pb); 825 break; 826 case 11: 827 do { 828 printf("请输入您要查找的书籍名:"); 829 scanf("%s", bookname); 830 pnow = is_estbook(pb, bookname); 831 if (pnow == NULL) printf("输入错误,请重新输入。\n"); 832 } while (pnow == NULL); 833 findbook_byname(pb, bookname); 834 break; 835 case 12: 836 837 printf("请输入您要查找的作者:"); 838 scanf("%s", name); 839 findbook_byauthor(pb, name); 840 break; 841 case 13: 842 recommend_byborrowsum(pb); 843 break; 844 case 14: 845 do { 846 printf("请输入您要借阅的书籍名:"); 847 scanf("%s", bookname); 848 pnow = is_estbook(pb, bookname); 849 if (pnow == NULL) printf("输入错误,请重新输入。\n"); 850 } while (pnow == NULL); 851 borrowbook(pb, pnow); 852 break; 853 case 15: 854 do { 855 printf("请输入您的id:"); 856 scanf("%d", &id); 857 pp = is_estpeople(pb, id); 858 if (pp == NULL) printf("用户不存在,请重新输入"); 859 } while (pp == NULL); 860 if (pp->borrownum > 0) { 861 do { 862 printf("请输入您要归还的书籍名:"); 863 scanf("%s", bookname); 864 pnow = is_estbook(pb, bookname); 865 if (pnow == NULL) printf("输入错误,请重新输入。\n"); 866 } while (pnow == NULL); 867 for (int i = 0; i <= pnow->sum - pnow->nowsum; ++i) { 868 if (pnow->re[i].idcard == id) { 869 return_book(pnow, i, pp, pb); 870 break; 871 } 872 } 873 } else printf("您当前尚未借阅书籍。\n"); 874 875 break; 876 case 16: 877 showall(pb); 878 break; 879 case 17: 880 shownow(pb); 881 break; 882 case 18: 883 modify_people(pb); 884 break; 885 } 886 if (op != 19) { 887 printf("是否返回主界面?(Y/N)"); 888 do { 889 getchar(); 890 x = getchar(); 891 892 if (x != 'Y' && x != 'N' ) printf("输入错误,请重新输入。\n"); 893 } while (x != 'Y' && x != 'N' ); 894 if (x == 'Y') { 895 system("cls"); 896 menu_admin(pb); 897 } else return; 898 } else { 899 system_(pb); 900 } 901 } 902 void menu_user(plibrary pb) { 903 system("cls"); 904 printf("\t\t1.通过书名查找书 \n"); 905 printf("\t2.通过作者查找书 \n"); 906 printf("\t3.展示所有图书类型 \n"); 907 printf("\t4.推荐书籍 \n"); 908 printf("\t5.借阅 \n"); 909 printf("\t6.归还 \n"); 910 printf("\t7.展示所有馆藏 \n"); 911 printf("\t8.展示现存图书 \n"); 912 printf("\t9.退出登录 "); 913 int op, id; 914 char x, k; 915 pbookkind pk; 916 pbook pnow; 917 ppeople pp; 918 char bookname[50], kind[50]; 919 char name[50]; 920 do { 921 scanf("%d", &op); 922 if (op < 0 || op > 17) printf("输入有误,请重新输入。\n"); 923 } while (op < 0 || op > 17); 924 925 switch (op) { 926 case 1: 927 do { 928 printf("请输入您要查找的书籍名:"); 929 scanf("%s", bookname); 930 pnow = is_estbook(pb, bookname); 931 if (pnow == NULL) printf("输入错误,请重新输入。\n"); 932 } while (pnow == NULL); 933 findbook_byname(pb, bookname); 934 break; 935 case 2: 936 printf("请输入您要查找的作者:"); 937 scanf("%s", name); 938 findbook_byauthor(pb, name); 939 break; 940 case 3: 941 show_kind(pb); 942 if (pb->phead_bookkind->next == NULL) { 943 printf("目前没有任何书籍类型"); 944 break; 945 } 946 printf("是否需要展示每种类型下的所有书籍?"); 947 getchar(); 948 x = getchar(); 949 if (x == 'Y') { 950 do { 951 printf("请问您想查看哪一类?\n"); 952 do { 953 scanf("%s", kind); 954 pk = is_estbookkind(pb, kind); 955 if (pk == NULL) printf("您查找的书籍类型有误,请重新输入\n"); 956 } while (pk == NULL); 957 show_kindbook(pk); 958 printf("请问您是否还需要继续查找?(Y/N)\n"); 959 do { 960 getchar(); 961 k = getchar(); 962 if (k != 'Y' && k != 'N') printf("输入错误,请重新输入\n"); 963 } while (k != 'Y' && k != 'N'); 964 } while (k == 'Y'); 965 } 966 break; 967 case 4: 968 recommend_byborrowsum(pb); 969 break; 970 case 5: 971 do { 972 printf("请输入您要借阅的书籍名:"); 973 scanf("%s", bookname); 974 pnow = is_estbook(pb, bookname); 975 if (pnow == NULL) printf("输入错误,请重新输入。\n"); 976 } while (pnow == NULL); 977 borrowbook(pb, pnow); 978 break; 979 case 6: 980 do { 981 printf("请输入您的id:"); 982 scanf("%d", &id); 983 pp = is_estpeople(pb, id); 984 if (pp == NULL) printf("用户不存在,请重新输入"); 985 } while (pp == NULL); 986 if (pp->borrownum > 0) { 987 do { 988 printf("请输入您要归还的书籍名:"); 989 scanf("%s", bookname); 990 pnow = is_estbook(pb, bookname); 991 if (pnow == NULL) printf("输入错误,请重新输入。\n"); 992 } while (pnow == NULL); 993 for (int i = 0; i <= pnow->sum - pnow->nowsum; ++i) { 994 if (pnow->re[i].idcard == id) { 995 return_book(pnow, i, pp, pb); 996 break; 997 } 998 } 999 } else printf("您当前尚未借阅书籍。\n"); 1000 break; 1001 case 7: 1002 showall(pb); 1003 break; 1004 case 8: 1005 shownow(pb); 1006 break; 1007 1008 } 1009 if (op != 9) { 1010 printf("是否返回主界面?(Y/N)"); 1011 do { 1012 getchar(); 1013 x = getchar(); 1014 1015 if (x != 'Y' && x != 'N' ) printf("输入错误,请重新输入。\n"); 1016 } while (x != 'Y' && x != 'N' ); 1017 if (x == 'Y') { 1018 system("cls"); 1019 menu_user(pb); 1020 } else return; 1021 } else { 1022 system_(pb); 1023 } 1024 } 1025 void menu_tourist(plibrary pb) { 1026 system("cls"); 1027 printf("\t1.通过书名查找书\n"); 1028 printf("\t2.通过作者查找书\n"); 1029 printf("\t3.展示所有图书类型\n"); 1030 printf("\t4.推荐书籍\n"); 1031 printf("\t5.展示所有馆藏\n"); 1032 printf("\t6.展示现存图书\n"); 1033 printf("\t7.退出登录\n"); 1034 int op; 1035 char x, k; 1036 pbookkind pk; 1037 pbook pnow; 1038 char bookname[50], kind[50]; 1039 char name[50]; 1040 do { 1041 scanf("%d", &op); 1042 if (op < 0 || op > 17) printf("输入有误,请重新输入。\n"); 1043 } while (op < 0 || op > 17); 1044 1045 switch (op) { 1046 case 1: 1047 do { 1048 printf("请输入您要查找的书籍名:"); 1049 scanf("%s", bookname); 1050 pnow = is_estbook(pb, bookname); 1051 if (pnow == NULL) printf("输入错误,请重新输入。\n"); 1052 } while (pnow == NULL); 1053 findbook_byname(pb, bookname); 1054 break; 1055 case 2: 1056 printf("请输入您要查找的作者:"); 1057 scanf("%s", name); 1058 findbook_byauthor(pb, name); 1059 break; 1060 case 3: 1061 show_kind(pb); 1062 if (pb->phead_bookkind->next == NULL) { 1063 printf("目前没有任何书籍类型"); 1064 break; 1065 } 1066 printf("是否需要展示每种类型下的所有书籍?"); 1067 getchar(); 1068 x = getchar(); 1069 if (x == 'Y') { 1070 do { 1071 printf("请问您想查看哪一类?\n"); 1072 do { 1073 scanf("%s", kind); 1074 pk = is_estbookkind(pb, kind); 1075 if (pk == NULL) printf("您查找的书籍类型有误,请重新输入\n"); 1076 } while (pk == NULL); 1077 show_kindbook(pk); 1078 printf("请问您是否还需要继续查找?(Y/N)\n"); 1079 do { 1080 getchar(); 1081 k = getchar(); 1082 if (k != 'Y' && k != 'N') printf("输入错误,请重新输入\n"); 1083 } while (k != 'Y' && k != 'N'); 1084 } while (k == 'Y'); 1085 } 1086 break; 1087 case 4: 1088 recommend_byborrowsum(pb); 1089 break; 1090 case 5: 1091 showall(pb); 1092 break; 1093 case 6: 1094 shownow(pb); 1095 break; 1096 1097 } 1098 if (op != 7) { 1099 printf("是否返回主界面?(Y/N)"); 1100 do { 1101 getchar(); 1102 x = getchar(); 1103 1104 if (x != 'Y' && x != 'N' ) printf("输入错误,请重新输入。\n"); 1105 } while (x != 'Y' && x != 'N' ); 1106 if (x == 'Y') { 1107 system("cls"); 1108 menu_tourist(pb); 1109 } else return; 1110 } else { 1111 system_(pb); 1112 } 1113 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】