单链表实现图书管理系统

复制代码
   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 }
复制代码

 

posted @   empty_y  阅读(506)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示