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 }