Advertisement
Guest User

Untitled

a guest
Dec 10th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 81.49 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. typedef struct _Book{
  7. int book_id; //도서번호
  8. char *book_name; //도서명
  9. char *purblisher; //출판사
  10. char *writer; //저자명
  11. long isbn; //ISBN
  12. char *local; //소장처
  13. char book_rent; //대여가능 여부
  14. struct _Book *next; //자기참조
  15. }Book;
  16.  
  17. typedef struct _Client{
  18. int std_id; //학번
  19. char *password; //비밀번호
  20. char *std_name; //학생 이름
  21. char *addr; //주소
  22. char *ph_num; //핸드폰 번호
  23. struct _Client *next;
  24. } Client;
  25.  
  26. typedef struct _Borrow{
  27. int std_id; //학번
  28. int bk_id; //도서번호
  29. time_t rent_date; //빌린 날짜
  30. time_t return_date; //반납 날짜
  31. struct _Borrow *next;
  32. } Borrow;
  33.  
  34. /*-------------영민,민영-------------*/
  35. typedef struct _client {
  36. int std_id; //학번
  37. char password[300]; //비밀번호
  38. char std_name[300]; //이름
  39. char addr[300]; //주소
  40. char ph_num[300]; //연락처
  41. struct _client* next;
  42. }client;
  43. /*-------------영민,민영-------------*/
  44.  
  45. /*----------------용준-----------------*/
  46. typedef struct book {
  47.  
  48. char bnum[8];//책번호
  49. char bname[100];//책이름
  50. char pname[100];//출판사이름
  51. char writer[100];//저자명
  52. char ISBN[15];//ISBN번호
  53. char own[100];//소장처
  54. char YN;//Y or N 대여가능여부
  55. struct book *next;
  56. } book;//book.txt파일에서 책 정보 읽어오는 자기참조구조체선언
  57. /*-----------------용준----------------*/
  58.  
  59.  
  60. void login(Book *cur, Client *cl_cur, Borrow *br_cur);
  61. int admin_login(Book *cur, Client *cl_cur, Borrow *br_cur); //로그인 함수
  62. void book_manage(int num, Book *cur, Client *cl_cur, Borrow *br_cur);
  63. char *get_string(char * str, int start);
  64. Book *create_node(Book *data);
  65. void insert_node(Book **cur, Book *new_node);
  66. void add_node(Book **cur, Book *new_node, Book *next_node);
  67. void delete_node(Book **cur, Book *del_node);
  68. Book *book_regis(Book **cur);
  69. Borrow *create_br_node(Borrow *data);
  70. void insert_br_node(Borrow **cur, Borrow *new_node);
  71. void delete_br_node(Borrow **cur, Borrow *del_node);
  72. Client *create_cl_node(Client *data);
  73. void insert_cl_node(Client **cur, Client *new_node);
  74. void delete_cl_node(Client **cur, Client *del_node);
  75. time_t make_time (time_t date, int *year, int *month, int *day);
  76. void mul_time(time_t date, int *year, int *month, int *day);
  77.  
  78. /*-------------영민-------------*/
  79. void client_add();
  80. void register_member(); // 회원 등록
  81. void member_menu(int id, Borrow *br_cur, Book *bk_cur, Client *cl_cur); // 회원 메뉴
  82. void modify_member(); // 회원 정보 수정
  83. void delete_member(int id, Borrow *br_cur, Client *cl_cur); // 회원 탈퇴
  84. void borrow_search(int id, Borrow *br_cur, Book *bk_cur);
  85.  
  86. client *client_head;
  87. client *client_tail;
  88.  
  89. char id_login[300]; // 로그인할때 쓸 학번
  90. char password_login[50]; // 로그인할때 쓸 비밀번호
  91. /*-------------영민-------------*/
  92.  
  93. /*-------------민영-------------*/
  94. void search_name(FILE *); //이름 검색 함수
  95. void all_client(FILE *); //전체검색
  96. void client_list(); //전채검색
  97. void search_id_num(FILE *); //학번검색
  98.  
  99. /*-------------민영-------------*/
  100.  
  101. /*-------------용준-------------*/
  102. typedef book *LINK;//struct book *형을 LINK정의.
  103. void findbname(FILE *);//책이름검색함수
  104. void findpname(FILE *, char *);//출판사명검색함수
  105. void findISBN(FILE *);//ISBN검색함수
  106. void findwriter(FILE *, char *);//작가명검색함수
  107. void findall(FILE *);//전체검색함수
  108. void search();//회원 로그인 후 도서검색 눌렀을때 실행
  109. /*-------------용준-------------*/
  110.  
  111. FILE *fp,*bfp,*cfp,*dfp,*ifp;
  112.  
  113. int main (void) {
  114.  
  115. /*-------------영민-------------*/
  116. client_head=(client *)malloc(sizeof(client));
  117. client_tail=(client *)malloc(sizeof(client));
  118. client_add();
  119. /*-------------영민-------------*/
  120.  
  121. bfp = fopen("./borrow.txt","r+w");
  122. if(bfp == NULL) printf("파일없음\n");
  123. Borrow *br_p = (Borrow*)malloc(sizeof(Borrow));
  124. Borrow *br_head = (Borrow*)malloc(sizeof(Borrow));
  125. Borrow *br_cur = br_head;
  126. br_head->next = NULL;
  127. br_head->std_id=0;
  128.  
  129. char *br_info = (char *)malloc(1024);
  130. int br_curNum=0;
  131.  
  132. while(fgets(br_info,1024,bfp) != NULL) { //구조체에 데이터 파싱
  133. br_curNum=0;
  134. br_p->std_id = atoi(get_string(br_info,br_curNum));
  135. br_curNum += 9;
  136. br_p->bk_id = atoi(get_string(br_info,br_curNum));
  137. br_curNum += strlen(get_string(br_info,br_curNum))+1;
  138. br_p->rent_date = atoi(get_string(br_info,br_curNum));
  139. br_curNum += strlen(get_string(br_info,br_curNum))+1;
  140. br_p->return_date = atoi(get_string(br_info,br_curNum));
  141.  
  142. insert_br_node(&br_cur,create_br_node(br_p));
  143. }
  144. br_cur = br_head;
  145.  
  146. cfp = fopen("./client.txt","r+w");
  147. if(cfp == NULL) printf("파일없음\n");
  148. Client *cl_p = (Client*)malloc(sizeof(Client));
  149. Client *cl_head = (Client*)malloc(sizeof(Client));
  150. Client *cl_cur = cl_head;
  151. cl_head->next = NULL;
  152. cl_head->std_id = 0;
  153.  
  154. char *cl_info = (char *)malloc(1024);
  155. int cl_curNum = 0;
  156.  
  157. while(fgets(cl_info,1024,cfp) != NULL) {
  158. cl_curNum = 0;
  159. cl_p->std_id = atoi(get_string(cl_info,cl_curNum));
  160. cl_curNum += 9;
  161. cl_p->password = get_string(cl_info,cl_curNum);
  162. cl_curNum += strlen(cl_p->password)+1;
  163. cl_p->std_name = get_string(cl_info,cl_curNum);
  164. cl_curNum += strlen(cl_p->std_name)+1;
  165. cl_p->addr = get_string(cl_info,cl_curNum);
  166. cl_curNum += strlen(cl_p->addr)+1;
  167. cl_p->ph_num = get_string(cl_info,cl_curNum);
  168. cl_curNum += strlen(cl_p->ph_num)+1;
  169.  
  170. insert_cl_node(&cl_cur,create_cl_node(cl_p));
  171. }
  172. cl_cur = cl_head;
  173.  
  174.  
  175. /* 링크드리스트 */
  176.  
  177. fp = fopen("./book.txt","r+w");
  178. if(fp == NULL) printf("파일 없음\n");
  179. Book *book_p=(Book*)malloc(sizeof(Book));
  180.  
  181. Book *bk_head = (Book *)malloc(sizeof(Book));
  182. Book *cur = bk_head;
  183. bk_head->next = NULL;
  184. bk_head -> book_id = 0;
  185.  
  186. char *info = (char *)malloc(1024);
  187. int curNum=0;
  188. while(fgets(info, 1024, fp) != NULL) { //구조체에 데이터 파싱
  189. curNum=0;
  190. book_p->book_id = atoi(get_string(info, curNum));
  191. curNum += sizeof(book_p->book_id)*2;
  192. book_p->book_name=get_string(info,curNum);
  193. curNum += strlen(book_p->book_name)+1;
  194. book_p->purblisher=get_string(info, curNum);
  195. curNum += strlen(book_p->purblisher)+1;
  196. book_p->writer=get_string(info, curNum);
  197. curNum += strlen(book_p->writer)+1;
  198. book_p->isbn = atol(get_string(info, curNum));
  199. curNum += sizeof(book_p->isbn)+6;
  200. book_p->local=get_string(info, curNum);
  201. curNum += strlen(book_p->local)+1;
  202. char *rent=get_string(info, curNum);
  203. book_p->book_rent=rent[0];
  204. curNum += 1;
  205.  
  206. insert_node(&cur, create_node(book_p));
  207.  
  208. }
  209. cur= bk_head;
  210.  
  211. /* 메인화면 */
  212. int select;
  213. system("clear");
  214.  
  215. while(1) {
  216. system("clear");
  217. printf(">>도서관 서비스<<\n");
  218. printf("1. 회원가입\t2.로그인\t3. 프로그램종료\n");
  219. printf("번호를 선택하세요: ");
  220.  
  221. scanf("%d", &select);
  222.  
  223. if(select == 1) {
  224. //회원가입 함수
  225. /*-------------영민-------------*/
  226. register_member();
  227. /*-------------영민-------------*/
  228. } else if(select == 2) {
  229. //로그인함수
  230. system("clear");
  231. login(cur, cl_cur, br_cur);
  232. }
  233.  
  234.  
  235.  
  236. else if(select == 3) {
  237. /*-------------영민-------------*/
  238. printf("====================================\n");
  239. printf("프로그램을 종료합니다\n");
  240. exit(1);
  241. /*-------------영민-------------*/
  242. }
  243. }
  244.  
  245. fclose(fp);
  246. fclose(bfp);
  247. fclose(cfp);
  248.  
  249. return 0;
  250. }
  251.  
  252. void login(Book *cur, Client *cl_cur, Borrow *br_cur)
  253. {
  254. while(1)
  255. {
  256. printf(">>로그인<<\n");
  257. printf("학번: ");
  258. scanf("%s", id_login);
  259.  
  260. if (!strcmp(id_login, "admin"))
  261. {
  262. printf("비밀번호: ");
  263. scanf("%s", password_login);
  264.  
  265. if (!strcmp(password_login, "lib_admin7"))
  266. {
  267. admin_login(cur, cl_cur, br_cur); //관리자용 메뉴로 이동
  268. break;
  269. }
  270.  
  271. else
  272. {
  273. printf("비밀번호가 틀렸습니다. 다시입력하십시오.\n");
  274. id_login[0] = '\0';
  275. password_login[0] = '\0';
  276. continue; //로그인 화면 처음으로 이동
  277. }
  278. }
  279.  
  280. else
  281. {
  282. client* current = (client*)malloc(sizeof(client));
  283. current = client_head;
  284.  
  285. while (current != client_tail)
  286. {
  287. if (current->std_id == atoi(id_login)) //입력한 학번이 존재할 때
  288. {
  289. printf("비밀번호: ");
  290. scanf("%s", password_login);
  291.  
  292. if (!strcmp(current->password, password_login)) //비밀번호가 맞으면 회원용 메뉴로 이동
  293. {
  294. member_menu(atoi(id_login), br_cur, cur, cl_cur);
  295. break;
  296. }
  297. else //아니면 반복문 나온후 로그인 화면 처음으로 이동
  298. {
  299. printf("비밀번호가 틀렸습니다. 다시 입력하세요.\n");
  300. password_login[0] = '\0';
  301. break;
  302. }
  303. }
  304. current = current->next;
  305. }
  306.  
  307. if (current == client_tail) //linked_list를 전부 확인해도 입력한 학번이 없을 때
  308. {
  309. printf("존재하지 않는 학번입니다. 다시 입력하세요.\n");
  310. continue; //로그인 화면으로 이동
  311. }
  312.  
  313. if (!strcmp(current->password, password_login)) //회원용 메뉴를 나오면 로그인 화면종료
  314. break; //비밀번호가 다를경우 로그인화면 으로 이동
  315. }
  316. }
  317. }
  318.  
  319. int admin_login(Book *cur, Client *cl_cur, Borrow *br_cur) {
  320. system("clear");
  321.  
  322. int num;
  323.  
  324. printf(">> 관리자 메뉴 <<\n");
  325. printf("1. 도서 등록 2. 도서 삭제\n");
  326. printf("3. 도서 대여 4. 도서 반납\n");
  327. printf("5. 도서 검색 6. 회원 목록\n");
  328. printf("7. 로그아웃 8. 프로그램 종료\n");
  329. printf("번호를 선택하세요 : ");
  330. scanf("%d", &num);
  331.  
  332. if(num == 1 || num == 2 || num == 3 || num == 4 || num == 5)
  333. book_manage(num,cur,cl_cur,br_cur);
  334. else if(num == 6) {
  335. /*------------민영----------*/
  336. client_list();
  337. //회원 목록
  338. admin_login(cur, cl_cur, br_cur);
  339. } else if (num == 7) {
  340. //로그아웃
  341. return 0;
  342. } else if (num == 8) {
  343. exit(0);
  344. }
  345.  
  346. return 0;
  347. }
  348.  
  349. void book_manage(int num, Book *cur, Client *cl_cur, Borrow *br_cur) {
  350. int del_num=0,rent_num=0;
  351. system("clear");
  352.  
  353. switch(num) {
  354. case 1 : //도서 등록 //isbn순으로 정렬
  355. {
  356. Book *tail, *corr_cur;
  357. Book *bk_head = cur;
  358.  
  359. printf(">>도서 등록<<\n");
  360. tail = book_regis(&cur); //마지막 번호 받아옴
  361. fflush(stdout);
  362. cur = bk_head->next;
  363. while (cur != NULL) {
  364. if(cur->isbn > tail->isbn && cur->isbn != tail->isbn){ //기존isbn보다 tail isbn 작은거 찾기
  365. corr_cur=cur; //위치 저장
  366. break;
  367. }
  368. if(cur->isbn == tail->isbn) { //기존이랑 tail isbn과 같다면
  369. corr_cur=cur; //위치 저장
  370. break;
  371. }
  372. if(cur->next ==NULL) { //맨마지막이면
  373. corr_cur=cur;
  374. break;
  375. }
  376. cur = cur->next;
  377. }
  378.  
  379. cur = bk_head; //head값 저장
  380. FILE *fp = fopen("book.txt", "w");
  381. fflush(stdout);
  382. Book *last_node; //마지막노드위치
  383. if(cur->next->isbn > tail->isbn){ //처음꺼
  384. fprintf(fp, "%d|%s|%s|%s|%ld|%s|%c\n",tail->book_id, tail->book_name, tail->purblisher,
  385. tail->writer, tail->isbn, tail->local, tail->book_rent);
  386. add_node(&cur,create_node(tail), cur->next);
  387. cur = bk_head->next->next;
  388. while(cur != NULL) {
  389. fprintf(fp, "%d|%s|%s|%s|%ld|%s|%c\n",cur->book_id, cur->book_name, cur->purblisher,
  390. cur->writer, cur->isbn, cur->local, cur->book_rent);
  391. cur=cur->next;
  392. }
  393. cur=bk_head->next;
  394. } else if (cur->next->isbn <= tail->isbn) { //중간이면
  395. cur=bk_head->next;
  396.  
  397. while(cur != NULL) { //마지막찾기
  398. last_node = cur;
  399. cur=cur->next;
  400. }
  401. cur=bk_head->next;
  402. if(last_node->isbn >= tail->isbn) {
  403. while(cur != NULL) {
  404. fprintf(fp, "%d|%s|%s|%s|%ld|%s|%c\n",cur->book_id, cur->book_name, cur->purblisher,
  405. cur->writer, cur->isbn, cur->local, cur->book_rent);
  406. if(cur->next == corr_cur) break;
  407. cur = cur->next;
  408. }
  409. fprintf(fp, "%d|%s|%s|%s|%ld|%s|%c\n",tail->book_id, tail->book_name, tail->purblisher,
  410. tail->writer, tail->isbn, tail->local, tail->book_rent);
  411. Book *next_node = cur->next;
  412. add_node(&cur,create_node(tail), next_node);
  413. cur = cur->next;
  414. while(cur != NULL) {
  415. fprintf(fp, "%d|%s|%s|%s|%ld|%s|%c\n",cur->book_id, cur->book_name, cur->purblisher,
  416. cur->writer, cur->isbn, cur->local, cur->book_rent);
  417. cur = cur->next;
  418. }
  419. cur = bk_head;
  420. }
  421. }
  422. while(cur != NULL) { //마지막꺼찾기
  423. last_node = cur;
  424. cur=cur->next;
  425. }
  426. cur=bk_head->next;
  427. if(last_node->isbn < tail->isbn) {
  428. while(cur != NULL) {
  429. fprintf(fp, "%d|%s|%s|%s|%ld|%s|%c\n",cur->book_id, cur->book_name, cur->purblisher,
  430. cur->writer, cur->isbn, cur->local, cur->book_rent);
  431. if(cur->next == NULL) break;
  432. cur=cur->next;
  433. }
  434. fprintf(fp, "%d|%s|%s|%s|%ld|%s|%c\n",tail->book_id, tail->book_name, tail->purblisher,
  435. tail->writer, tail->isbn, tail->local, tail->book_rent);
  436. insert_node(&cur,create_node(tail));
  437.  
  438. cur = bk_head;
  439. }
  440.  
  441.  
  442. fclose(fp);
  443. break;
  444. }
  445. case 2 : // 도서 삭제
  446. {
  447. printf(">>도서 삭제<<\n");
  448. printf("1. 도서명 검색 2. ISBN 검색\n");
  449. printf("\n\n검색 번호를 입력하세요 : ");
  450. scanf("%d",&del_num);
  451. Book *head=cur; //head위치 저장포인터
  452. Book *corr_cur=cur; //null이 아님을 피하기위해 초기화
  453. Book *del_node; //지울 노드 전번째 노드위치 포인터
  454. int null_check = 0, del_id = 0; //도서이름이 있는지 확인변수, 삭제할 도서번호
  455. if(del_num == 1) {
  456. char b_name[100]=""; //도서 이름입력변수
  457.  
  458. printf("도서명을 입력하세요 : ");
  459. getchar();
  460. scanf("%[^\n]", b_name);
  461. fflush(stdout);
  462. cur=head->next;
  463. while(cur != NULL) { //찾는 도서이름이 없는지 확인
  464. if(!strcmp(cur->book_name, b_name)) //도서이름이 있으면
  465. null_check ++;
  466. cur=cur->next;
  467. }
  468. if(null_check == 0) corr_cur = NULL; //도서이름이 없으면
  469. cur = head->next;
  470. if(corr_cur != NULL) { //찾는 도서이름이 있으면
  471. printf("도서 번호 :");
  472. while(cur != NULL) {
  473. if(!strcmp(cur->book_name,b_name)){
  474. printf(" %d(삭제 가능 여부 : %c)",cur->book_id, cur->book_rent);
  475. corr_cur = cur; // 도서위치저장
  476. }
  477. cur=cur->next;
  478. }
  479. printf("\n도서명 : %s\n",corr_cur->book_name);
  480. printf("출판사 : %s\n", corr_cur->purblisher);
  481. printf("저자명 : %s\n", corr_cur->writer);
  482. printf("ISBN : %ld\n", corr_cur->isbn);
  483. printf("소장처 : %s\n", corr_cur->local);
  484. printf("\n삭제할 도서의 번호를 입력하세요 : ");
  485. scanf("%d", &del_id);
  486. cur=head->next; //cur위치는 다시 처음으로
  487.  
  488. int check=0,success=0;
  489. while(cur != NULL) {
  490. if(!strcmp(cur->book_name,b_name) && cur->book_id == del_id) {
  491. check++;
  492. corr_cur=cur; //지울노드에 현재커서위치 넘겨주기
  493. if(cur->book_rent=='N') {
  494. printf("이 도서는 삭제할 수 없습니다.\n");
  495. } else if (cur->book_rent=='Y') {
  496. success = 1;
  497. printf("도서를 삭제했습니다.\n");
  498. }
  499. }
  500. cur = cur->next;
  501. }
  502. cur = head;
  503. while(cur != NULL) {
  504. if(cur->next == corr_cur) {
  505. del_node = cur; //지울노드 전노드 위치 넘겨주기
  506. }
  507. cur=cur->next;
  508. }
  509. cur=head; //cur위치 다시 처음으로
  510. FILE *dfp;
  511. if(success==1) {
  512. delete_node(&del_node,corr_cur);
  513. dfp = fopen("./book.txt","w");
  514. while(cur!=NULL) {
  515. if(cur->book_id != 0) {
  516. fprintf(dfp, "%d|%s|%s|%s|%ld|%s|%c\n", cur->book_id, cur->book_name, cur->purblisher,
  517. cur->writer, cur->isbn, cur->local, cur->book_rent);
  518. }
  519. cur=cur->next;
  520. }
  521. cur = head->next;
  522. } else { //예외 처리
  523. dfp = fopen("./book.txt","r");
  524. }
  525. fclose(dfp);
  526. if(check == 0)
  527. printf("도서 번호가 잘못되었습니다.\n");
  528. } else if (corr_cur == NULL) {
  529. printf("찾으시는 도서이름이 없습니다.\n");
  530. }
  531. } else if (del_num == 2) {
  532. long b_isbn;
  533. Book *del_node; //지울 노드 전번째 노드위치 포인터
  534. printf("ISBN을 입력하세요 : ");
  535. scanf("%ld", &b_isbn);
  536.  
  537. while(cur != NULL) {
  538. if(cur->isbn == b_isbn) //찾는 도서 isbn이 있으면
  539. null_check ++;
  540. cur=cur->next;
  541. }
  542. if(null_check == 0) corr_cur = NULL; //도서이름이 없으면
  543. cur = head->next;
  544. if(corr_cur != NULL) { //있을때
  545. printf("도서 번호 :");
  546. while(cur != NULL) {
  547. if(cur->isbn == b_isbn) {
  548. printf(" %d(삭제 가능 여부: %c)", cur->book_id, cur->book_rent);
  549. corr_cur = cur; //도서위치저장
  550. }
  551. cur=cur->next;
  552. }
  553. printf("\n도서명 : %s\n",corr_cur->book_name);
  554. printf("출판사 : %s\n", corr_cur->purblisher);
  555. printf("저자명 : %s\n", corr_cur->writer);
  556. printf("ISBN : %ld\n", corr_cur->isbn);
  557. printf("소장처 : %s\n", corr_cur->local);
  558. printf("\n삭제할 도서의 번호를 입력하세요 : ");
  559. scanf("%d", &del_id);
  560. cur=head->next; //cur위치는 다시 처음으로
  561. int check=0,success=0;
  562. while(cur != NULL) {
  563. if(cur->isbn == b_isbn && cur->book_id == del_id) {
  564. check++;
  565. corr_cur=cur; //지울노드에 현재커서위치 넘겨주기
  566. if(cur->book_rent=='N') {
  567. printf("이 도서는 삭제할 수 없습니다.\n");
  568. } else if (cur->book_rent=='Y') {
  569. success = 1;
  570. printf("도서를 삭제했습니다.\n");
  571. break;
  572. }
  573. }
  574. cur = cur->next;
  575. }
  576. cur=head;
  577. while(cur != NULL) {
  578. if(cur->next == corr_cur) {
  579. del_node = cur; //지울노드 전노드 위치 넘겨주기
  580. }
  581. cur=cur->next;
  582. }
  583. cur=head; //cur위치 다시 처음으로
  584. FILE *dfp;
  585. if(success==1) {
  586. delete_node(&del_node,corr_cur);
  587. dfp = fopen("./book.txt","w");
  588. while(cur!=NULL) {
  589. if(cur->book_id!=0) {
  590. fprintf(dfp, "%d|%s|%s|%s|%ld|%s|%c\n", cur->book_id, cur->book_name, cur->purblisher,
  591. cur->writer, cur->isbn, cur->local, cur->book_rent);
  592. }
  593. cur=cur->next;
  594. }
  595. } else { //예외 처리
  596. dfp = fopen("./book.txt","r");
  597. }
  598. fclose(dfp);
  599. if(check == 0)
  600. printf("도서 번호가 잘못되었습니다.\n");
  601. } else if(corr_cur == NULL) { //없을때
  602. printf("찾으시는 도서ISBN이 없습니다.\n");
  603. }
  604. } else { //1,2번 아닌거 입력했을때
  605. printf("번호를 잘못 입력하셨습니다.\n");
  606. }
  607. break;
  608. }
  609. case 3 :
  610. {
  611. //도서 대여
  612. printf(">>도서 대여<<\n");
  613. printf("1. 도서명 검색 2. ISBN 검색\n");
  614. printf("\n\n검색 번호를 입력하세요 : ");
  615. scanf("%d", &rent_num);
  616. Borrow *br_head=br_cur;
  617. Book *bk_head=cur;
  618. Client *cl_head=cl_cur;
  619. Book *cor_cur=cur; //null이 아님을 피하기 위해 초기화
  620. int n_check=0;
  621. if(rent_num == 1){
  622. char b_name[100]="",rent='\0';
  623. int s_id=0,b_id=0;
  624.  
  625. getchar();
  626. printf("도서명을 입력하세요 : ");
  627. scanf("%[^\n]", b_name);
  628.  
  629. cur= bk_head->next;
  630. while(cur != NULL) {
  631. if(!strcmp(cur->book_name, b_name)) //도서이름이 있으면
  632. n_check ++;
  633. cur=cur->next;
  634. }
  635. if(n_check == 0) cor_cur = NULL; //도서이름이 없으면
  636. cur = bk_head->next;
  637. if(cor_cur != NULL) { //찾는 도서이름이 있으면
  638. printf("도서 번호 :");
  639. while(cur != NULL) {
  640. if(!strcmp(cur->book_name,b_name)){
  641. printf(" %d(대여 가능 여부 : %c)",cur->book_id, cur->book_rent);
  642. cor_cur = cur; // 도서위치저장
  643. }
  644. cur=cur->next;
  645. }
  646. printf("\n도서명 : %s\n",cor_cur->book_name);
  647. printf("출판사 : %s\n", cor_cur->purblisher);
  648. printf("저자명 : %s\n", cor_cur->writer);
  649. printf("ISBN : %ld\n", cor_cur->isbn);
  650. printf("소장처 : %s\n", cor_cur->local);
  651. printf("\n학번을 입력하세요 : ");
  652. scanf("%d", &s_id);
  653. cur=bk_head->next;
  654. int id_check=0,id_suc=0;
  655. while(cl_cur != NULL) {
  656. if(s_id == cl_cur->std_id) //같으면
  657. id_check = 1;
  658. cl_cur=cl_cur->next;
  659. }
  660. cl_cur = cl_head->next;//처음으로
  661. if(id_check == 0) {
  662. printf("학번이 잘못되었습니다.\n");
  663. break;
  664. }
  665. printf("도서번호를 입력하세요 : ");
  666. scanf("%d", &b_id);
  667. while(cur != NULL) {
  668. if(b_id == cur->book_id) {
  669. id_suc=1;
  670. cor_cur = cur; //현재위치 잡아주기
  671. }
  672. cur=cur->next;
  673. }
  674. cur = bk_head->next;
  675. printf("이 도서를 대여합니까? : ");
  676. getchar();
  677. scanf("%c", &rent);
  678.  
  679. FILE *br_fp;
  680. struct tm *t;
  681. time_t timer;
  682. char *weekday[] = {"일요일", "월요일", "화요일", "수요일",
  683. "목요일", "금요일", "토요일"};
  684. char *a_date=(char*)malloc(100);
  685. char *b_date=(char*)malloc(100);
  686. time(&timer);
  687. t = localtime(&timer);
  688. mktime(t);
  689. if(id_suc==1 && rent == 'Y' && cor_cur->book_rent == 'Y') {
  690. printf("도서가 대여 되었습니다.\n");
  691. cor_cur->book_rent = 'N';
  692. br_fp = fopen("./borrow.txt","a+w");
  693. sprintf(a_date, "%d%02d%02d",t->tm_year+1900, t->tm_mon+1, t->tm_mday);
  694. timer += 60*60*24*30;
  695. t = localtime(&timer);
  696. mktime(t);
  697. if(!strcmp(weekday[t->tm_wday],"일요일")){
  698. timer += 60*60*24;
  699. t=localtime(&timer);
  700. mktime(t);
  701. }
  702. sprintf(b_date, "%d%02d%02d",t->tm_year+1900, t->tm_mon+1, t->tm_mday);
  703. fprintf(br_fp,"%d|%d|%s|%s\n", s_id, b_id, a_date, b_date);
  704. fclose(br_fp);
  705. bfp=fopen("./book.txt","wt");
  706. while(cur != NULL) {
  707. if(cur->book_id==cor_cur->book_id){
  708. //부분수정
  709. fprintf(bfp, "%d|%s|%s|%s|%ld|%s|%c\n", cor_cur->book_id, cor_cur->book_name,
  710. cor_cur->purblisher,cor_cur->writer, cor_cur->isbn,
  711. cor_cur->local, cor_cur->book_rent);
  712. }
  713. else {
  714. fprintf(bfp, "%d|%s|%s|%s|%ld|%s|%c\n", cur->book_id, cur->book_name, cur->purblisher,
  715. cur->writer, cur->isbn, cur->local, cur->book_rent);
  716. }
  717. cur=cur->next;
  718. }
  719. fclose(bfp);
  720. } else if(id_suc==1 && rent == 'Y' && cor_cur->book_rent == 'N') {
  721. printf("도서 대여를 실패했습니다.\n");
  722. } else if (rent == 'N') {
  723. printf("도서 대여를 취소합니다. \n");
  724. }
  725. free(a_date);
  726. free(b_date);
  727.  
  728. } else if(cor_cur == NULL) {
  729. printf("찾으시는 도서이름이 없습니다.\n");
  730. }
  731.  
  732. } else if (rent_num == 2) { //isbn검색
  733. long b_isbn;
  734. char rent='\0';
  735. int s_id=0,b_id=0;
  736. printf("ISBN을 입력하세요 : ");
  737. scanf("%ld", &b_isbn);
  738.  
  739. while(cur != NULL) {
  740. if(cur->isbn == b_isbn) //찾는 도서 isbn이 있으면
  741. n_check ++;
  742. cur=cur->next;
  743. }
  744. if(n_check == 0) cor_cur = NULL; //도서 isbn이 없으면
  745.  
  746. cur = bk_head->next;
  747. if(cor_cur != NULL) { //찾는 도서isbn이 있으면
  748. printf("도서 번호 :");
  749. while(cur != NULL) {
  750. if(cur->isbn == b_isbn) {
  751. printf(" %d(대여 가능 여부 : %c)",cur->book_id, cur->book_rent);
  752. cor_cur = cur; // 도서위치저장
  753. }
  754. cur=cur->next;
  755. }
  756. printf("\n도서명 : %s\n",cor_cur->book_name);
  757. printf("출판사 : %s\n", cor_cur->purblisher);
  758. printf("저자명 : %s\n", cor_cur->writer);
  759. printf("ISBN : %ld\n", cor_cur->isbn);
  760. printf("소장처 : %s\n", cor_cur->local);
  761. printf("\n학번을 입력하세요 : ");
  762. scanf("%d", &s_id);
  763. cur=bk_head->next;
  764. int id_check=0,id_suc=0;
  765. while(cl_cur != NULL) {
  766. if(s_id == cl_cur->std_id) //같으면
  767. id_check = 1;
  768. cl_cur=cl_cur->next;
  769. }
  770. cl_cur = cl_head->next;//처음으로
  771. if(id_check == 0) {
  772. printf("학번이 잘못되었습니다.\n");
  773. break;
  774. }
  775. printf("도서번호를 입력하세요 : ");
  776. scanf("%d", &b_id);
  777. while(cur != NULL) {
  778. if(b_id == cur->book_id) {
  779. id_suc=1;
  780. cor_cur = cur; //현재위치 잡아주기
  781. }
  782. cur=cur->next;
  783. }
  784. cur = bk_head->next;
  785. printf("이 도서를 대여합니까? : ");
  786. getchar();
  787. scanf("%c", &rent);
  788. FILE *br_fp;
  789. struct tm *t;
  790. time_t timer;
  791. char *weekday[] = {"일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"};
  792. char *a_date=(char*)malloc(100);
  793. char *b_date=(char*)malloc(100);
  794. time(&timer); //시간받아오는거
  795. t = localtime(&timer); //시간 나눠주는거
  796. mktime(t); //요일
  797. if(id_suc==1 && rent == 'Y' && cor_cur->book_rent == 'Y') {
  798. printf("도서가 대여 되었습니다.\n");
  799. cor_cur->book_rent = 'N';
  800. br_fp = fopen("./borrow.txt","a+w");
  801. sprintf(a_date, "%d%02d%02d",t->tm_year+1900, t->tm_mon+1, t->tm_mday);
  802. timer += 60*60*24*30;
  803. t = localtime(&timer);
  804. mktime(t);
  805. if(!strcmp(weekday[t->tm_wday],"일요일")){
  806. timer += 60*60*24;
  807. t=localtime(&timer);
  808. mktime(t);
  809. }
  810. sprintf(b_date, "%d%02d%02d",t->tm_year+1900, t->tm_mon+1, t->tm_mday);
  811. fprintf(br_fp,"%d|%d|%s|%s\n", s_id, b_id, a_date, b_date);
  812. fclose(br_fp);
  813. bfp=fopen("./book.txt","wt");
  814. while(cur != NULL) {
  815. if(cur->book_id==cor_cur->book_id){
  816. fprintf(bfp, "%d|%s|%s|%s|%ld|%s|%c\n", cor_cur->book_id, cor_cur->book_name,
  817. cor_cur->purblisher,cor_cur->writer, cor_cur->isbn,
  818. cor_cur->local, cor_cur->book_rent);
  819. }
  820. else {
  821. fprintf(bfp, "%d|%s|%s|%s|%ld|%s|%c\n", cur->book_id, cur->book_name, cur->purblisher,
  822. cur->writer, cur->isbn, cur->local, cur->book_rent);
  823. }
  824. cur=cur->next;
  825. }
  826. fclose(bfp);
  827. } else if(id_suc==1 && rent == 'Y' && cor_cur->book_rent == 'N') {
  828. printf("도서 대여를 실패했습니다.\n");
  829. } else if (rent == 'N') {
  830. printf("도서 대여를 취소합니다. \n");
  831. }
  832. free(a_date);
  833. free(b_date);
  834.  
  835. } else if(cor_cur == NULL) {
  836. printf("찾으시는 도서가 없습니다.\n");
  837. }
  838. } else {
  839. printf("번호를 잘못 입력하셨습니다.\n");
  840. }
  841. break;
  842. }
  843. case 4 :
  844. {
  845. //도서 반납
  846. int s_id=0, bk_id=0, success=0;
  847. int year, month, day;
  848. Borrow *br_head=br_cur;
  849. Book *bk_head=cur;
  850. Client *cl_head=cl_cur;
  851. Borrow *del_node,*corr_cur;
  852. char rent='\0';
  853. printf("학번을 입력하세요 : ");
  854. scanf("%d", &s_id);
  855. struct tm* timeinfo;
  856. char *weekday[] = {"일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"};
  857.  
  858. printf(">>회원의 대여 목록<<\n");
  859. br_cur = br_head->next;
  860. while(br_cur != NULL) {
  861. if(br_cur->std_id == s_id) {
  862. bk_id = br_cur->bk_id;
  863. printf("도서번호 : %d\n", bk_id);
  864. while(cur != NULL) {
  865. if(cur->book_id == bk_id)
  866. printf("도서명 : %s\n", cur->book_name);
  867. cur=cur->next;
  868. }
  869. cur = bk_head->next;
  870.  
  871. mul_time(br_cur->rent_date, &year, &month, &day);
  872. time_t baseTime = make_time(br_cur->rent_date, &year, &month, &day);
  873.  
  874. timeinfo = localtime(&baseTime);
  875. timeinfo->tm_year = year - 1900;
  876. timeinfo->tm_mon = month - 1;
  877. timeinfo->tm_mday = day;
  878. mktime(timeinfo);
  879. printf("대여 일자 : %ld%s\n",br_cur->rent_date,weekday[timeinfo->tm_wday]);
  880.  
  881. mul_time(br_cur->return_date, &year, &month, &day);
  882. baseTime = make_time(br_cur->return_date, &year, &month, &day);
  883.  
  884. timeinfo = localtime(&baseTime);
  885. timeinfo->tm_year = year - 1900;
  886. timeinfo->tm_mon = month - 1;
  887. timeinfo->tm_mday = day;
  888. mktime(timeinfo);
  889.  
  890. printf("반납 일자 : %ld%s\n\n",br_cur->return_date,weekday[timeinfo->tm_wday]);
  891. }
  892. br_cur=br_cur->next;
  893. }
  894. printf("반납할 도서번호를 입력하세요 : ");
  895. scanf("%d",&bk_id);
  896. printf("\n도서 반납처리를 할까요? : ");
  897. getchar();
  898. scanf("%c",&rent);
  899. corr_cur = br_head;
  900. br_cur=br_head->next;
  901. if(rent == 'Y') {
  902. while (br_cur != NULL) {
  903. if(br_cur->bk_id == bk_id) {
  904. break;
  905. }
  906. corr_cur = br_cur; //지울 노드 찾기
  907. br_cur = br_cur->next;
  908. }
  909. delete_br_node(&corr_cur, br_cur);
  910. } else {
  911. printf("반납처리를 취소합니다. \n");
  912. }
  913. br_cur = br_head->next;
  914. if(rent == 'Y') {
  915. FILE *fp = fopen("./borrow.txt", "wt");
  916. while(br_cur != NULL) { //borrow파일 수정
  917. fprintf(fp, "%d|%d|%ld|%ld\n",br_cur->std_id,br_cur->bk_id,br_cur->rent_date,br_cur->return_date);
  918. br_cur = br_cur->next;
  919. }
  920. br_cur = br_head->next;
  921.  
  922. FILE *bfp = fopen("./book.txt", "wt");
  923. while(cur != NULL) { //book파일 수정
  924. if(cur->book_id==bk_id){
  925. cur->book_rent = rent;
  926. fprintf(bfp, "%d|%s|%s|%s|%ld|%s|%c\n", cur->book_id, cur->book_name,
  927. cur->purblisher,cur->writer, cur->isbn,
  928. cur->local, cur->book_rent);
  929. } else {
  930. fprintf(bfp, "%d|%s|%s|%s|%ld|%s|%c\n", cur->book_id, cur->book_name, cur->purblisher,
  931. cur->writer, cur->isbn, cur->local, cur->book_rent);
  932. }
  933. cur=cur->next;
  934. }
  935. cur=bk_head->next;
  936.  
  937. fclose(fp);
  938. fclose(bfp);
  939. }
  940.  
  941. break;
  942. }
  943. case 5 :
  944. {search();//도서 검색
  945. admin_login(cur, cl_cur, br_cur);
  946. break;
  947. }}
  948. }
  949. /*-----------------------민영-------------------------*/
  950. void client_list() {
  951. FILE *dfp = NULL; //client 파일을 여는 파일 포인터 선언
  952. dfp = fopen("client.txt", "r");
  953. if (dfp == NULL) {
  954. return;
  955. }
  956. int choice;
  957. char name[10]; //입력받을 이름
  958.  
  959.  
  960. printf(">>검색 결과<<\n");
  961. printf("1.이름 검색\t 2.학번 검색\n3.전체 검색\t 4.이전 메뉴\n");
  962. printf("번호를 입력하세요\n");
  963. scanf("%d", &choice);
  964. switch (choice) {
  965. case 1:
  966. search_name(dfp);
  967. printf("\n\n");
  968. client_list();
  969. break;
  970. case 2:
  971. search_id_num(dfp);
  972. printf("\n\n");
  973. client_list();
  974. break;
  975. case 3: {
  976. all_client(dfp);
  977. printf("\n\n");
  978. client_list();
  979. }
  980. break;
  981. case 4:
  982. fclose(dfp);
  983. break;
  984. default:
  985. printf("1~4사이 숫자를 입력하세요");
  986. break;
  987.  
  988. }
  989. fclose(dfp);
  990. return;
  991. }
  992.  
  993. void search_name(FILE *dfp) //이름 검색 함수
  994. {
  995. char input_name[20];
  996. char buf[10];
  997. client *head = NULL;
  998. client *p = NULL;
  999. client *q = (client *)malloc(sizeof(client));
  1000.  
  1001. printf("이름을 입력하세요:");
  1002. scanf("%s", input_name);
  1003. while (1) {
  1004. if (fscanf(dfp, "%[^|]|%[^|]|%[^|]|%[^|]|%[^\n]\n", buf, q->password, q->std_name, q->addr, q->ph_num) != 5)
  1005. {
  1006. printf("검색 결과 없음");
  1007. break;
  1008. }
  1009. q->std_id = atoi(buf);
  1010. if (strcmp(input_name, q->std_name) != 0)
  1011. {
  1012.  
  1013. continue;
  1014. }
  1015. else
  1016. {
  1017. printf("학번:%d\n이름:%s\n주소:%s\n전화번호:%s\n", q->std_id, q->std_name, q->addr, q->ph_num);
  1018. break;
  1019. }
  1020. }
  1021. }
  1022.  
  1023. void search_id_num(FILE *dfp) //학번검색함수
  1024.  
  1025. {
  1026.  
  1027. int input_id;
  1028. char buf[10];
  1029.  
  1030. client *head = NULL;
  1031. client *q = NULL;
  1032. client *p = NULL;
  1033. q = (client *)malloc(sizeof(client));
  1034. printf("학번을 입력하세요:");
  1035. scanf("%d", &input_id);
  1036. while (1) {
  1037.  
  1038. if (fscanf(dfp, "%[^|]|%[^|]|%[^|]|%[^|]|%[^\n]\n", buf, q->password, q->std_name, q->addr, q->ph_num) != 5)
  1039. {
  1040. printf("검색결과가 없습니다.");
  1041. break;
  1042. }
  1043. q->std_id = atoi(buf);
  1044.  
  1045. if (input_id == q->std_id) {
  1046.  
  1047. printf("\n학번:%d\n이름:%s\n주소:%s\n전화번호:%s", q->std_id, q->std_name, q->addr, q->ph_num);
  1048.  
  1049. break;
  1050. }
  1051. }
  1052. }
  1053.  
  1054.  
  1055.  
  1056. void all_client(FILE *dfp) //전체 검색함수
  1057. {
  1058. int count = 0;
  1059. client *head = NULL;
  1060. client *p = NULL;
  1061. client *q = NULL;
  1062. char buf[10];
  1063. while (1) {
  1064. q = malloc(sizeof(client));
  1065. q->next = NULL;
  1066. if (head == NULL)
  1067. {
  1068. head = q;
  1069. if (fscanf(dfp, "%[^|]|%[^|]|%[^|]|%[^|]|%[^\n]\n", buf, q->password, q->std_name, q->addr, q->ph_num) == 5)
  1070. {
  1071. q->std_id = atoi(buf);
  1072.  
  1073. printf("학번:%d\n", q->std_id);
  1074. printf("이름:%s\n", q->std_name);
  1075. printf("주소:%s\n", q->addr);
  1076. printf("전화번호:%s\n\n", q->ph_num);
  1077. }
  1078. }
  1079. else {
  1080. p = head;
  1081. while (p->next != NULL) {
  1082. p = p->next;
  1083. }
  1084. p->next = q;
  1085. if (fscanf(dfp, "%[^|]|%[^|]|%[^|]|%[^|]|%[^\n]\n", buf, q->password, q->std_name, q->addr, q->ph_num) == 5)
  1086. {
  1087. q->std_id = atoi(buf);
  1088. printf("학번:%d\n", q->std_id);
  1089. printf("이름:%s\n", q->std_name);
  1090. printf("주소:%s\n", q->addr);
  1091. printf("전화번호:%s\n\n", q->ph_num);
  1092.  
  1093. }
  1094. else {
  1095. free(q);
  1096. return;
  1097. }
  1098. }
  1099. }
  1100. }
  1101. /*----------------------민영--------------------*/
  1102.  
  1103.  
  1104. time_t make_time (time_t date, int *year, int *month, int *day) {
  1105. char* weekday[] = {"일요일", "월요일", "화요일", "수요일",
  1106. "목요일", "금요일", "토요일"};
  1107.  
  1108. struct tm t = {0};
  1109. t.tm_year = *year - 1900;
  1110. t.tm_mon = *month - 1;
  1111. t.tm_mday = *day;
  1112.  
  1113. return mktime(&t);
  1114. }
  1115. void mul_time(time_t date, int *year, int *month, int *day) {
  1116. *year= date / 10000 ;
  1117. *month = (date - ((*year) * 10000)) / 100;
  1118. *day = date % 100 ;
  1119. }
  1120.  
  1121. Client *create_cl_node(Client *data) {
  1122. Client *new_node = (Client*)malloc(sizeof(Client));
  1123. memcpy(new_node, data, sizeof(Client));
  1124. new_node->next = NULL;
  1125. return new_node;
  1126. }
  1127.  
  1128. void insert_cl_node(Client **cur, Client *new_node) {
  1129. (*cur)->next = new_node;
  1130. *cur = new_node;
  1131. }
  1132.  
  1133. void delete_cl_node(Client **cur, Client *del_node) {
  1134. (*cur)->next = del_node->next;
  1135. free(del_node);
  1136. }
  1137.  
  1138. Borrow *create_br_node(Borrow *data) {
  1139. Borrow *new_node = (Borrow*)malloc(sizeof(Borrow));
  1140. memcpy(new_node, data, sizeof(Borrow));
  1141. new_node->next = NULL;
  1142. return new_node;
  1143. }
  1144.  
  1145. void insert_br_node(Borrow **cur, Borrow *new_node) {
  1146. (*cur)->next = new_node;
  1147. *cur = new_node;
  1148. }
  1149.  
  1150. void delete_br_node(Borrow **cur, Borrow *del_node) {
  1151. (*cur)->next = del_node->next;
  1152. free(del_node);
  1153. }
  1154.  
  1155. Book *create_node(Book *data){
  1156. Book *new_node = (Book*)malloc(sizeof(Book));
  1157. memcpy(new_node, data, sizeof(Book));
  1158. new_node->next = NULL;
  1159. return new_node;
  1160. }
  1161.  
  1162. void insert_node(Book **cur, Book *new_node) {
  1163. (*cur)->next = new_node;
  1164. *cur = new_node;
  1165. }
  1166.  
  1167. void add_node(Book **cur, Book *new_node, Book *next_node) {
  1168. (*cur)->next = new_node;
  1169. *cur = new_node;
  1170. (*cur) -> next = next_node;
  1171. }
  1172.  
  1173. void delete_node(Book **cur, Book *del_node) {
  1174. (*cur)->next = del_node->next;
  1175. free(del_node);
  1176. }
  1177.  
  1178. char *get_string(char * str, int start){
  1179. int i = 0;
  1180. char * temp = (char*)calloc(1024, sizeof(char));
  1181. while(str[start] != '|' && str[start] != '\n' && str[start] != '\0'){
  1182. temp[i] = str[start];
  1183. i++;
  1184. start++;
  1185. }
  1186. return temp;
  1187. }
  1188.  
  1189. Book *book_regis(Book **cur) { //책 등록
  1190. char input[100]="";
  1191. char *name, *purb, *writer, *local, answer;
  1192. int last_id=0;
  1193. long isbn;
  1194.  
  1195. printf("도서명 : ");
  1196. scanf("%s", input);
  1197. name = (char *)malloc(strlen(input));
  1198. strcpy(name,input);
  1199.  
  1200. printf("출판사 : ");
  1201. scanf("%s", input);
  1202. purb = (char *)malloc(strlen(input));
  1203. strcpy(purb,input);
  1204.  
  1205. printf("저자명 : ");
  1206. scanf("%s", input);
  1207. writer = (char *)malloc(strlen(input));
  1208. strcpy(writer,input);
  1209.  
  1210. printf("ISBN : ");
  1211. scanf("%ld", &isbn);
  1212.  
  1213. printf("소장처 : ");
  1214. scanf("%s", input);
  1215. local = (char *)malloc(strlen(input));
  1216. strcpy(local,input);
  1217.  
  1218. while ((*cur) != NULL) {
  1219. if((*cur)->book_id > last_id) {
  1220. last_id = (*cur)->book_id;
  1221. }
  1222. *cur = (*cur) -> next;
  1223. }
  1224. last_id++;
  1225.  
  1226. getchar();
  1227. printf("\n자동 입력 사항\n\n대여가능 여부 : Y\n도서 번호 : %d\n\n저장하시겠습니까? ",last_id);
  1228. scanf("%c", &answer);
  1229.  
  1230. if(answer == 'Y') {
  1231. Book *book_p = (Book *)malloc(sizeof(Book));
  1232.  
  1233. book_p->book_id = last_id;
  1234.  
  1235. book_p->book_name = (char *)malloc(strlen(name));
  1236. strcpy(book_p->book_name, name);
  1237. book_p->purblisher = (char *)malloc(strlen(purb));
  1238. strcpy(book_p->purblisher,purb);
  1239.  
  1240. book_p->writer = (char *)malloc(strlen(writer));
  1241. strcpy(book_p->writer, writer);
  1242.  
  1243. book_p->isbn = isbn;
  1244.  
  1245. book_p->local = (char *)malloc(strlen(local));
  1246. strcpy(book_p->local, local);
  1247.  
  1248. book_p->book_rent = 'Y';
  1249.  
  1250. fflush(stdout);
  1251.  
  1252. return book_p;
  1253. } else {
  1254. printf("다시 입력하세요\n");
  1255. }
  1256. return NULL;
  1257. }
  1258. /*-------------용준-------------*/
  1259. void search() {//도서검색실행
  1260. FILE *ifp = NULL;
  1261. ifp = fopen("book.txt", "r");
  1262. printf(">> 도서 검색<<\n1.도서명 검색 2. 출판사 검색\n3.ISBN 검색 4. 저자명 검색\n5.전체 검색 6. 이전 메뉴\n\n");
  1263. printf("번호를 선택하세요:");
  1264. int c;//도서검색에서 선택할 번호입력.
  1265. scanf("%d", &c);
  1266. while (getchar() != '\n');//scanf이후 버퍼에서 엔터('\n')지우기
  1267. if (c == 1)
  1268. {
  1269. findbname(ifp);
  1270. fclose(ifp);
  1271. printf("\n\n");
  1272. search();
  1273. }
  1274. else
  1275. if (c == 2)
  1276. {
  1277. char s[100];//출판사명 입력할 배열
  1278. printf("출판사명을 입력하세요:");
  1279. scanf("%[^\n]", s);
  1280. while (getchar() != '\n');
  1281. findpname(ifp, s);
  1282. fclose(ifp);
  1283. printf("\n\n");
  1284. search();
  1285. }
  1286. else
  1287. if (c == 3)
  1288. {
  1289. findISBN(ifp);
  1290. fclose(ifp);
  1291. printf("\n\n");
  1292. search();
  1293. }
  1294. else
  1295. if (c == 4)
  1296. {
  1297. char s[100];//작가명 입력할 배열 생성.
  1298. printf("작가명을 입력하세요:");
  1299. scanf("%[^\n]", s);
  1300. while (getchar() != '\n');
  1301. findwriter(ifp, s);//인자로파일포인터와 문자열 전달.
  1302. fclose(ifp);
  1303. printf("\n\n");
  1304. search();
  1305. }
  1306. else
  1307. if (c == 5)
  1308. {
  1309. findall(ifp);
  1310. fclose(ifp);
  1311. printf("\n\n");
  1312. search();
  1313. }
  1314. else if (c == 6)
  1315. {
  1316. fclose(ifp);
  1317. return;
  1318. }
  1319. else
  1320. {
  1321. printf("잘못된 선택입니다. 1~6중에서 선택해주세요.\n");
  1322. fclose(ifp);
  1323. search();
  1324. }
  1325. fclose(ifp);
  1326. return;
  1327. }
  1328.  
  1329. void findbname(FILE *ifp) {
  1330. char s[100];//도서명입력
  1331. LINK head = NULL;
  1332. LINK p = NULL;
  1333. LINK q = NULL;
  1334. LINK r = NULL;
  1335. int n1 = 0;//대여가능여부 Y의 수
  1336. int n2 = 0;//대여가능여부 N의 수
  1337. printf("도서명을 입력하세요:");
  1338. scanf("%[^\n]", s);
  1339. while (getchar() != '\n');
  1340. while (1) {
  1341. q = (LINK)malloc(sizeof(book));//book.txt파일 한 줄 읽을 때마다 동적메모리 생성.
  1342. q->next = NULL;
  1343. if (head == NULL)
  1344. {
  1345. head = q;
  1346. head->next = NULL;
  1347. if (fscanf(ifp, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%c\n", head->bnum, head->bname, head->pname, head->writer, head->ISBN, head->own, &head->YN) != 7)
  1348. {
  1349. printf("검색오류입니다.\n");
  1350. free(q);
  1351. break;
  1352. }
  1353. if (!strcmp(s, head->bname))
  1354. {
  1355. if (head->YN == 'Y')
  1356. n1++;
  1357. else
  1358. n2++;
  1359. r = malloc(sizeof(book));
  1360. r->next = NULL;
  1361. while (fscanf(ifp, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%c\n", r->bnum, r->bname, r->pname, r->writer, r->ISBN, r->own, &r->YN) == 7)
  1362. if (!strcmp(r->ISBN, head->ISBN))//같은 도서 존재하면 YN(대여가능여부)검사 후 대여가능(Y)이면 n1에 1더하고 대여불가능(N)이면 n2에 1더함.
  1363. {
  1364. if (r->YN == 'Y')
  1365. n1++;
  1366. else
  1367. n2++;
  1368. }
  1369. free(r);
  1370. if (n1>0)
  1371. head->YN = 'Y';
  1372. printf("\n\n>> 검색 결과 <<\n");
  1373. printf("도서명:%s\n", s);
  1374. printf("출판사:%s\n", head->pname);
  1375. printf("저자명:%s\n", head->writer);
  1376. printf("ISBN :%s\n", head->ISBN);
  1377. printf("소장처:%s\n", head->own);
  1378. printf("대여가능 여부:%c(%d/%d)\n", head->YN, n2, n1 + n2);
  1379. printf("**Y는 대여가능,N은 대여불가를 의미\n**(x/y):(대여된 총 권수/보유하고 있는 총 권수i\n\n");
  1380. free(q);
  1381. break;
  1382. }
  1383. }
  1384. else
  1385. {
  1386. if (fscanf(ifp, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%c\n", q->bnum, q->bname, q->pname, q->writer, q->ISBN, q->own, &q->YN) != 7)
  1387. {
  1388. free(q);
  1389. break;
  1390. }
  1391. q->next = NULL;
  1392. p = head;
  1393. while (p->next != NULL)
  1394. p = p->next;//p포인터 이동
  1395. p->next = q;
  1396. if (!strcmp(s, q->bname))
  1397. {
  1398. if (q->YN == 'Y')
  1399. n1++;
  1400. else
  1401. n2++;
  1402. r = malloc(sizeof(book));
  1403. r->next = NULL;
  1404. while (fscanf(ifp, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%c\n", r->bnum, r->bname, r->pname, r->writer, r->ISBN, r->own, &r->YN) == 7)
  1405. if (!strcmp(r->ISBN, q->ISBN))
  1406. {
  1407. if (r->YN == 'Y')
  1408. n1++;
  1409. else
  1410. n2++;
  1411. }
  1412. free(r);
  1413. if (n1>0)
  1414. q->YN = 'Y';
  1415. printf("\n\n>> 검색 결과 <<\n");
  1416. printf("도서명:%s\n", q->bname);
  1417. printf("출판사:%s\n", q->pname);
  1418. printf("저자명:%s\n", q->writer);
  1419. printf("ISBN :%s\n", q->ISBN);
  1420. printf("소장처:%s\n", q->own);
  1421. printf("대여가능 여부:%c(%d/%d)\n", q->YN, n2, n1 + n2);
  1422. printf("**Y는 대여가능,N은 대여불가를 의미\n**(x/y):(대여된 총 권수/보유하고 있는 총 권수i\n\n");
  1423. free(q);
  1424. break;
  1425. }
  1426. }
  1427. }
  1428. return;
  1429. }
  1430.  
  1431. void findpname(FILE *ifp, char *s) {//출판사검색
  1432. FILE *ifp2 = NULL;
  1433. ifp2 = fopen("book.txt", "r");
  1434. LINK head = NULL;
  1435. LINK p = NULL;
  1436. LINK q = NULL;
  1437. LINK r = NULL;
  1438. int n1 = 0;
  1439. int n2 = 0;
  1440. int n3 = 0;//같은책이 몇권인지 셈.
  1441. while (1) {
  1442. q = malloc(sizeof(book));
  1443. q->next = NULL;
  1444. if (head == NULL)
  1445. {
  1446. head = q;
  1447. if (fscanf(ifp, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%c\n", q->bnum, q->bname, q->pname, q->writer, q->ISBN, q->own, &q->YN) == 7)
  1448. {
  1449. if (!strcmp(s, q->pname))
  1450. {
  1451. r = malloc(sizeof(book));
  1452. r->next = NULL;
  1453. while (fscanf(ifp2, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%c\n", r->bnum, r->bname, r->pname, r->writer, r->ISBN, r->own, &r->YN) == 7)
  1454. {
  1455. if (!strcmp(r->ISBN, q->ISBN))
  1456. {
  1457. if (r->YN == 'Y')
  1458. n1++;
  1459. else
  1460. n2++;
  1461. }
  1462. n3 = n1 + n2 - 1;
  1463. if (n3 >= 0)
  1464. if ((!strcmp(r->pname, q->pname)) && (strcmp(r->ISBN, q->ISBN)))
  1465. {
  1466. for (int k = 0; n3>k; k++)//같은책수만큼 파일지시자 이동
  1467. fscanf(ifp, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%c\n", r->bnum, r->bname, r->pname, r->writer, r->ISBN, r->own, &r->YN);
  1468. fclose(ifp2);
  1469. findpname(ifp, q->pname);
  1470. }
  1471. }
  1472. free(r);
  1473. if (n1>0)
  1474. q->YN = 'Y';
  1475. printf("\n\n>> 검색 결과 <<\n");
  1476. printf("도서명:%s\n", q->bname);
  1477. printf("출판사:%s\n", q->pname);
  1478. printf("저자명:%s\n", q->writer);
  1479. printf("ISBN :%s\n", q->ISBN);
  1480. printf("소장처:%s\n", q->own);
  1481. printf("대여가능 여부:%c(%d/%d)\n", q->YN, n2, n1 + n2);
  1482. printf("**Y는 대여가능,N은 대여불가를 의미\n**(x/y):(대여된 총 권수/보유하고 있는 총 권수i\n\n");
  1483. free(q);
  1484. break;
  1485. }
  1486. }
  1487. else
  1488. {
  1489. free(q);
  1490. return;
  1491. }
  1492. }
  1493. else//head!=NULL일떄
  1494. {
  1495. if (fscanf(ifp, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%c\n", q->bnum, q->bname, q->pname, q->writer, q->ISBN, q->own, &q->YN) == 7)
  1496. {
  1497. q->next = NULL;
  1498. p = head;
  1499. while (p->next != NULL)
  1500. p = p->next;
  1501. p->next = q;
  1502. if (!strcmp(s, q->pname)) {
  1503. r = malloc(sizeof(book));
  1504. r->next = NULL;
  1505. while (fscanf(ifp2, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%c\n", r->bnum, r->bname, r->pname, r->writer, r->ISBN, r->own, &r->YN) == 7)
  1506. {
  1507. if (!strcmp(r->ISBN, q->ISBN))
  1508. {
  1509. if (r->YN == 'Y')
  1510. n1++;
  1511. else
  1512. n2++;
  1513. }
  1514.  
  1515. n3 = n1 + n2 - 1;
  1516. if (n3 >= 0)
  1517. if ((!strcmp(r->pname, q->pname)) && (strcmp(r->ISBN, q->ISBN)))
  1518. {
  1519. for (int k = 0; n3>k; k++)
  1520. fscanf(ifp, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%c\n", r->bnum, r->bname, r->pname, r->writer, r->ISBN, r->own, &r->YN);
  1521. fclose(ifp2);
  1522. findpname(ifp, q->pname);
  1523. }
  1524. }
  1525. free(r);
  1526. if (n1>0)
  1527. q->YN = 'Y';
  1528.  
  1529. printf("\n\n>> 검색 결과 <<\n");
  1530. printf("도서명:%s\n", q->bname);
  1531. printf("출판사:%s\n", q->pname);
  1532. printf("저자명:%s\n", q->writer);
  1533. printf("ISBN :%s\n", q->ISBN);
  1534. printf("소장처:%s\n", q->own);
  1535. printf("대여가능 여부:%c(%d/%d)\n", q->YN, n2, n1 + n2);
  1536. printf("**Y는 대여가능,N은 대여불가를 의미\n**(x/y):(대여된 총 권수/보유하고 있는 총 권수i\n\n");
  1537. free(q);
  1538. break;
  1539. }
  1540. }
  1541. else
  1542. {
  1543. free(q);
  1544. return;
  1545. }
  1546. }
  1547. }
  1548. fclose(ifp2);
  1549. return;
  1550. }
  1551.  
  1552. void findwriter(FILE *ifp, char *s) {//작가명검색
  1553. FILE *ifp2 = NULL;
  1554. ifp2 = fopen("book.txt", "r");
  1555. LINK head = NULL;
  1556. LINK p = NULL;
  1557. LINK q = NULL;
  1558. LINK r = NULL;
  1559. int n1 = 0;
  1560. int n2 = 0;
  1561. int n3 = 0;//같은책이 몇권인지셈.
  1562. while (1) {
  1563. q = malloc(sizeof(book));
  1564. q->next = NULL;
  1565. if (head == NULL)
  1566. {
  1567. head = q;
  1568. if (fscanf(ifp, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%c\n", q->bnum, q->bname, q->pname, q->writer, q->ISBN, q->own, &q->YN) == 7)
  1569. {
  1570. if (!strcmp(s, q->writer))
  1571. {
  1572. r = malloc(sizeof(book));//한줄씩 읽으면서 같은 책 찾는 임시 공간
  1573. r->next = NULL;
  1574. while (fscanf(ifp2, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%c\n", r->bnum, r->bname, r->pname, r->writer, r->ISBN, r->own, &r->YN) == 7)
  1575. {
  1576. if (!strcmp(r->ISBN, q->ISBN))//ISBN이 같은지(도서가 같은지)검사함
  1577. {
  1578. if (r->YN == 'Y')
  1579. n1++;
  1580. else
  1581. n2++;
  1582. }
  1583. n3 = n1 + n2 - 1;
  1584. if (n3 >= 0)
  1585. if ((!strcmp(r->writer, q->writer)) && (strcmp(r->ISBN, q->ISBN)))
  1586. {
  1587. for (int k = 0; n3>k; k++)
  1588. fscanf(ifp, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%c\n", r->bnum, r->bname, r->pname, r->writer, r->ISBN, r->own, &r->YN);
  1589. fclose(ifp2);
  1590. findwriter(ifp, q->writer);
  1591. }
  1592. }
  1593. free(r);
  1594. if (n1>0)
  1595. q->YN = 'Y';
  1596. printf("\n\n>> 검색 결과 <<\n");
  1597. printf("도서명:%s\n", q->bname);
  1598. printf("출판사:%s\n", q->pname);
  1599. printf("저자명:%s\n", q->writer);
  1600. printf("ISBN :%s\n", q->ISBN);
  1601. printf("소장처:%s\n", q->own);
  1602. printf("대여가능 여부:%c(%d/%d)\n", q->YN, n2, n1 + n2);
  1603. printf("**Y는 대여가능,N은 대여불가를 의미\n**(x/y):(대여된 총 권수/보유하고 있는 총 권수i\n\n");
  1604. free(q);
  1605. break;
  1606. }
  1607. }
  1608. else
  1609. {
  1610. free(q);
  1611. return;
  1612. }
  1613. }
  1614. else//head!=NULL
  1615. {
  1616. if (fscanf(ifp, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%c\n", q->bnum, q->bname, q->pname, q->writer, q->ISBN, q->own, &q->YN) == 7)
  1617. {
  1618. q->next = NULL;
  1619. p = head;
  1620. while (p->next != NULL)
  1621. p = p->next;//p포인터 노드 끝으로 이동
  1622. p->next = q;
  1623. if (!strcmp(s, q->writer)) {
  1624. r = malloc(sizeof(book));
  1625. r->next = NULL;
  1626. while (fscanf(ifp2, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%c\n", r->bnum, r->bname, r->pname, r->writer, r->ISBN, r->own, &r->YN) == 7)
  1627. {
  1628. if (!strcmp(r->ISBN, q->ISBN))//ISBN이 같은지(도서가 같은지)검사함 도서 같으면 YN(대여가능여부)검사 후 대여가능(Y)이면 n1에 1더하고 대여불가능(N)이면 n2에 1더함.
  1629. {
  1630. if (r->YN == 'Y')
  1631. n1++;
  1632. else
  1633. n2++;
  1634. }
  1635. n3 = n1 + n2 - 1;
  1636. if (n3 >= 0)
  1637. if ((!strcmp(r->writer, q->writer)) && (strcmp(r->ISBN, q->ISBN)))
  1638. {
  1639. for (int k = 0; n3>k; k++)
  1640. fscanf(ifp, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%c\n", r->bnum, r->bname, r->pname, r->writer, r->ISBN, r->own, &r->YN);
  1641. fclose(ifp2);
  1642. findwriter(ifp, q->writer);
  1643. }
  1644. }
  1645. free(r);
  1646. if (n1>0)
  1647. q->YN = 'Y';
  1648.  
  1649. printf("\n\n>> 검색 결과 <<\n");
  1650. printf("도서명:%s\n", q->bname);
  1651. printf("출판사:%s\n", q->pname);
  1652. printf("저자명:%s\n", q->writer);
  1653. printf("ISBN :%s\n", q->ISBN);
  1654. printf("소장처:%s\n", q->own);
  1655. printf("대여가능 여부:%c(%d/%d)\n", q->YN, n2, n1 + n2);
  1656. printf("**Y는 대여가능,N은 대여불가를 의미\n**(x/y):(대여된 총 권수/보유하고 있는 총 권수i\n\n");
  1657. free(q);
  1658. break;
  1659. }
  1660. }
  1661. else
  1662. {
  1663. free(q);
  1664. return;
  1665. }
  1666.  
  1667. }
  1668. }
  1669. fclose(ifp2);
  1670. return;
  1671. }
  1672.  
  1673. void findISBN(FILE *ifp) {
  1674. char s[14];//검색할 ISBN
  1675. LINK head = NULL;
  1676. LINK p = NULL;
  1677. LINK q = NULL;
  1678. LINK r = NULL;
  1679. int n1 = 0;
  1680. int n2 = 0;
  1681. printf("ISBN을 입력하세요:");
  1682. scanf("%s", s);
  1683. while (getchar() != '\n');
  1684. while (1) {
  1685. q = malloc(sizeof(book));
  1686. q->next = NULL;
  1687. if (head == NULL)
  1688. {
  1689. head = q;
  1690. if (fscanf(ifp, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%c\n", q->bnum, q->bname, q->pname, q->writer, q->ISBN, q->own, &q->YN) != 7)
  1691. {
  1692. printf("검색오류입니다.");
  1693. free(q);
  1694. break;
  1695. }
  1696. if (!strcmp(s, q->ISBN))
  1697. {
  1698. if (q->YN == 'Y')
  1699. n1++;
  1700. else
  1701. n2++;
  1702. r = malloc(sizeof(book));
  1703. r->next = NULL;
  1704. while (fscanf(ifp, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%c\n", r->bnum, r->bname, r->pname, r->writer, r->ISBN, r->own, &r->YN) == 7)
  1705. if (!strcmp(r->ISBN, q->ISBN)) {
  1706.  
  1707. if (r->YN == 'Y')
  1708. n1++;
  1709. else
  1710. n2++;
  1711. }
  1712. free(r);
  1713. if (n1>0)
  1714. q->YN = 'Y';
  1715.  
  1716. printf("\n\n>> 검색 결과 <<\n");
  1717. printf("도서명:%s\n", q->bname);
  1718. printf("출판사:%s\n", q->pname);
  1719. printf("저자명:%s\n", q->writer);
  1720. printf("ISBN :%s\n", q->ISBN);
  1721. printf("소장처:%s\n", q->own);
  1722. printf("대여가능 여부:%c(%d/%d)\n", q->YN, n2, n1 + n2);
  1723. printf("**Y는 대여가능,N은 대여불가를 의미\n**(x/y):(대여된 총 권수/보유하고 있는 총 권수i\n\n");
  1724. free(q);
  1725. break;
  1726. }
  1727. }
  1728. else
  1729. {
  1730. if (fscanf(ifp, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%c\n", q->bnum, q->bname, q->pname, q->writer, q->ISBN, q->own, &q->YN) != 7)
  1731. {
  1732. free(q);
  1733. break;
  1734. }
  1735. q->next = NULL;
  1736. p = head;
  1737. while (p->next != NULL) {
  1738. p = p->next;
  1739. }
  1740. p->next = q;
  1741. if (!strcmp(s, q->ISBN)) {
  1742. if (q->YN == 'Y')
  1743. n1++;
  1744. else
  1745. n2++;
  1746. r = malloc(sizeof(book));
  1747. r->next = NULL;
  1748. while (fscanf(ifp, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%c\n", r->bnum, r->bname, r->pname, r->writer, r->ISBN, r->own, &r->YN) == 7)
  1749. if (!strcmp(r->ISBN, q->ISBN)) {
  1750. if (r->YN == 'Y')
  1751. n1++;
  1752. else
  1753. n2++;
  1754. }
  1755. free(r);
  1756. if (n1>0)
  1757. q->YN = 'Y';
  1758.  
  1759. printf("\n\n>> 검색 결과 <<\n");
  1760. printf("도서명:%s\n", q->bname);
  1761. printf("출판사:%s\n", q->pname);
  1762. printf("저자명:%s\n", q->writer);
  1763. printf("ISBN :%s\n", q->ISBN);
  1764. printf("소장처:%s\n", q->own);
  1765. printf("대여가능 여부:%c(%d/%d)\n", q->YN, n2, n1 + n2);//복사
  1766. printf("**Y는 대여가능,N은 대여불가를 의미\n**(x/y):(대여된 총 권수/보유하고 있는 총 권수i\n\n");
  1767. free(q);
  1768. break;
  1769. }
  1770. }
  1771. }
  1772. return;
  1773. }
  1774.  
  1775. void findall(FILE *ifp) {//전체검색함수.
  1776. LINK head = NULL;
  1777. LINK p = NULL;
  1778. LINK q = NULL;
  1779. printf("\n\n>> 검색 결과 <<\n");
  1780. while (1) {
  1781. q = malloc(sizeof(book));
  1782. q->next = NULL;
  1783. if (head == NULL) {
  1784. head = q;
  1785. if (fscanf(ifp, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%c\n", q->bnum, q->bname, q->pname, q->writer, q->ISBN, q->own, &q->YN) == 7)
  1786. {
  1787. printf("도서명:%s\n", q->bname);
  1788. printf("출판사:%s\n", q->pname);
  1789. printf("저자명:%s\n", q->writer);
  1790. printf("ISBN :%s\n", q->ISBN);
  1791. printf("소장처:%s\n", q->own);
  1792. printf("대여가능 여부:%c\n\n", q->YN);
  1793. }
  1794. }
  1795. else
  1796. {
  1797. p = head;
  1798. while (p->next != NULL)
  1799. p = p->next;
  1800. p->next = q;
  1801. if (fscanf(ifp, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%c\n", q->bnum, q->bname, q->pname, q->writer, q->ISBN, q->own, &q->YN) == 7)
  1802. {
  1803. printf("도서명:%s\n", q->bname);
  1804. printf("출판사:%s\n", q->pname);
  1805. printf("저자명:%s\n", q->writer);
  1806. printf("ISBN :%s\n", q->ISBN);
  1807. printf("소장처:%s\n", q->own);
  1808. printf("대여가능 여부:%c\n\n", q->YN);
  1809. }
  1810. else
  1811. {
  1812. free(q);
  1813. return;
  1814. }
  1815. }
  1816. }
  1817. }
  1818.  
  1819. /*------------용준----------------*/
  1820.  
  1821.  
  1822.  
  1823. /*-------------영민-------------*/
  1824.  
  1825. void register_member() // 등록
  1826. {
  1827. int student_number; //학번
  1828. char password[50]; //비밀번호
  1829. char name[20]; //이름
  1830. char address[100]; //주소
  1831. char phone_number[12]; //전화번호
  1832.  
  1833. client* current = (client*)malloc(sizeof(client)); //현재 가리키고 있는 구조체 포인터
  1834. client* current_past = (client*)malloc(sizeof(client));
  1835. current_past = current = client_head;
  1836.  
  1837. printf("학번, 비밀번호, 이름, 주소, 전화번호를 입력하세요.\n");
  1838. printf("학번: ");
  1839. scanf("%d", &student_number);
  1840. getchar();
  1841.  
  1842. //기존링크드에 입력받은 값을 학번순으로 삽입하여 새로운 링크드리스트를 만듦
  1843. while (current != client_tail) //링크드의 모든 값을 비교하기 전까지 반복
  1844. {
  1845. if (current->std_id < student_number) // 다음 링크드로 넘어감
  1846. {
  1847. current_past = current;
  1848. current = current->next;
  1849. }
  1850. else if (current->std_id > student_number) // 링크드 사이에 새로운 링크드 삽입
  1851. {
  1852. printf("비밀번호: ");
  1853. scanf("%s", password);
  1854. getchar();
  1855. printf("이름: ");
  1856. scanf("%[^\n]", name);
  1857. getchar();
  1858. printf("주소: ");
  1859. scanf("%[^\n]", address);
  1860. printf("전화번호: ");
  1861. scanf("%s", phone_number);
  1862. getchar();
  1863.  
  1864. if (current_past == current) //입력받은 학번이 링크드의 가장 첫번째 순서일 경우
  1865. {
  1866. client_head = (client*)malloc(sizeof(client));
  1867. client_head->std_id = student_number;
  1868. strcpy(client_head->password, password);
  1869. strcpy(client_head->std_name, name);
  1870. strcpy(client_head->addr, address);
  1871. strcpy(client_head->ph_num, phone_number);
  1872.  
  1873. client_head->next = (client*)malloc(sizeof(client));
  1874. client_head->next = current; //head의 다음 링크드리스트를 기존의 head로 만듦
  1875. client_tail = current->next = (client*)malloc(sizeof(client)); //다음 링크드리스트를 tail로 설정
  1876. break;
  1877. }
  1878. else
  1879. {
  1880. current_past = current_past->next = (client*)malloc(sizeof(client));
  1881. current_past->std_id = student_number; //새로운 링크드리스트에 입력
  1882. strcpy(current_past->password, password);
  1883. strcpy(current_past->std_name, name);
  1884. strcpy(current_past->addr, address);
  1885. strcpy(current_past->ph_num, phone_number);
  1886.  
  1887. current_past->next = (client*)malloc(sizeof(client));
  1888. current_past->next = current; //새로운 링크드리스트 다음에 이전 링크드리스트 연결하여 삽입
  1889. break;
  1890. }
  1891. }
  1892. else
  1893. {
  1894. printf("이미 가입되어 있습니다.\n");
  1895. break;
  1896. }
  1897. }
  1898. if (current == client_tail) // std_id가 마지막 정렬순서일 경우
  1899. {
  1900. printf("비밀번호: ");
  1901. scanf("%s", current->password);
  1902. getchar();
  1903. printf("이름: ");
  1904. scanf("%[^\n]", current->std_name);
  1905. getchar();
  1906. printf("주소: ");
  1907. scanf("%[^\n]", current->addr);
  1908. printf("전화번호: ");
  1909. scanf("%s", current->ph_num);
  1910. getchar();
  1911.  
  1912. current->std_id = student_number; // 마지막 링크에 입력받은 학번
  1913.  
  1914. client_tail = current->next = (client*)malloc(sizeof(client));
  1915. }
  1916.  
  1917.  
  1918. FILE* fp = fopen("client.txt", "a");
  1919. current = client_head; //링크드리스트의 처음으로 이동
  1920.  
  1921. while (current != client_tail) //링크드리스트의 모든 값을 입력하기 전까지 반복
  1922. {
  1923. fprintf(fp, "%d|", current->std_id);
  1924. fprintf(fp, "%s|", current->password);
  1925. fprintf(fp, "%s|", current->std_name);
  1926. fprintf(fp, "%s|", current->addr);
  1927. fprintf(fp, "%s\n", current->ph_num);
  1928.  
  1929. current = current->next; //while문 탈출
  1930. }
  1931. fclose(fp);
  1932.  
  1933. }
  1934. void member_menu(int id, Borrow *br_cur, Book *bk_cur, Client *cl_cur) //회원메뉴
  1935. {
  1936. system("clear");
  1937. int choose;
  1938. while(1){
  1939. printf(">>회원 매뉴<<\n");
  1940. printf("1. 도서 검색\t 2. 내 대여 목록\n");
  1941. printf("3. 개인정보 수정\t 4. 회원 탈퇴\n");
  1942. printf("5. 로그아웃\t 6. 프로그램 종료\n");
  1943.  
  1944. printf("번호를 선택하세요:");
  1945. scanf("%d",&choose);
  1946.  
  1947. if(choose==1){
  1948. search();
  1949. //도서 검색 함수
  1950. }
  1951. if(choose==2){
  1952. // 대여 목록 함수
  1953. borrow_search(id, br_cur, bk_cur);
  1954. }
  1955. if(choose==3){
  1956. modify_member();
  1957. }
  1958. if(choose==4){
  1959. delete_member(id, br_cur, cl_cur);
  1960. }
  1961. if(choose==5){
  1962. main();
  1963. }
  1964. if(choose==6){
  1965. exit(1);
  1966. }
  1967.  
  1968. }
  1969. }
  1970.  
  1971. void borrow_search(int id, Borrow *br_cur, Book *bk_cur) {
  1972. Borrow *br_head = br_cur;
  1973. Book *bk_head = bk_cur;
  1974.  
  1975. int year,month,day;
  1976. struct tm* timeinfo;
  1977. char *weekday[] = {"일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"};
  1978.  
  1979. printf(">>내 대여 목록<<\n");
  1980.  
  1981. br_cur = br_head -> next;
  1982. bk_cur = bk_head -> next;
  1983. while(br_cur != NULL) {
  1984. if(br_cur->std_id == id) {
  1985. printf("도서번호 : %d\n", br_cur -> bk_id);
  1986. while(bk_cur != NULL) {
  1987. if(bk_cur -> book_id == br_cur->bk_id) {
  1988. printf("도서명 : %s\n", bk_cur->book_name);
  1989. }
  1990. bk_cur=bk_cur->next;
  1991. }
  1992. bk_cur=bk_head->next;
  1993. //날짜 출력
  1994. mul_time(br_cur->rent_date, &year, &month, &day);
  1995. time_t baseTime = make_time(br_cur->rent_date, &year, &month, &day);
  1996. timeinfo = localtime(&baseTime);
  1997. timeinfo->tm_year = year - 1900;
  1998. timeinfo->tm_mon = month - 1;
  1999. timeinfo->tm_mday = day;
  2000. mktime(timeinfo);
  2001. printf("대여 일자 : %ld%s\n",br_cur->rent_date,weekday[timeinfo->tm_wday]);
  2002.  
  2003. mul_time(br_cur->return_date, &year, &month, &day);
  2004. baseTime = make_time(br_cur->return_date, &year, &month, &day);
  2005.  
  2006. timeinfo = localtime(&baseTime);
  2007. timeinfo->tm_year = year - 1900;
  2008. timeinfo->tm_mon = month - 1;
  2009. timeinfo->tm_mday = day;
  2010. mktime(timeinfo);
  2011.  
  2012. printf("반납 일자 : %ld%s\n\n",br_cur->return_date,weekday[timeinfo->tm_wday]);
  2013.  
  2014. }
  2015. br_cur = br_cur -> next;
  2016. }
  2017. br_cur = br_head-> next;
  2018. }
  2019.  
  2020. void modify_member() // 수정
  2021. {
  2022. int student_id;
  2023. student_id = atoi(id_login);
  2024. char change_password[300]; // 현재 비밀번호
  2025. client * current = (client*)malloc(sizeof(client));
  2026. current = client_head;
  2027. while (current != client_tail) // 현재 학번과 일치하는 링크탐색
  2028. {
  2029. if (current->std_id == student_id)
  2030. break;
  2031. else
  2032. current = current->next;
  2033. }
  2034.  
  2035. while (1)
  2036. {
  2037. printf("개인정보를 수정하기 위해 현재 비밀번호를 입력하세요.\n비밀먼호 : ");
  2038. scanf("%s", change_password);
  2039.  
  2040.  
  2041. if (!strcmp(current->password, change_password))
  2042. {
  2043. printf("수정할 비밀번호, 주소, 전화번호를 입력하세요.\n");
  2044. printf("비밀번호 : ");
  2045. scanf("%s", current->password);
  2046. getchar();
  2047. printf("주소 : ");
  2048. gets(current->addr);
  2049. printf("전화번호 : ");
  2050. scanf("%s", current->ph_num);
  2051. getchar();
  2052.  
  2053. FILE * fp = fopen("client.txt", "w");
  2054. current = client_head;
  2055.  
  2056. while (current != client_tail)
  2057. {
  2058. fprintf(fp, "%d|", current->std_id);
  2059. fprintf(fp, "%s|", current->password);
  2060. fprintf(fp, "%s|", current->std_name);
  2061. fprintf(fp, "%s|", current->addr);
  2062. fprintf(fp, "%s\n", current->ph_num);
  2063.  
  2064. current = current->next;
  2065. }
  2066.  
  2067. fclose(fp);
  2068.  
  2069. break;
  2070. }
  2071. else
  2072. {
  2073. printf("비밀번호가 틀립니다.\n");
  2074. change_password[0] = '\0';
  2075. }
  2076. }
  2077. }
  2078. void client_add() // txt 에 저장된 값을 링크드리스트에 저장해주는 함수
  2079. {
  2080. FILE* fp = fopen("client.txt", "r");
  2081. client* current= (client*)malloc(sizeof(client));
  2082. current= client_head;
  2083. while (!feof(fp)) //파일에 더이상 읽을 값이 없으면 반복문 종료.
  2084. {
  2085. fscanf(fp, "%d|", &current->std_id);
  2086. fscanf(fp, "%[^|]|", current->password);
  2087. fscanf(fp, "%[^|]|", current->std_name);
  2088. fscanf(fp, "%[^|]|", current->addr);
  2089. fscanf(fp, "%[^\n]\n", current->ph_num);
  2090.  
  2091. current = current->next = (client*)malloc(sizeof(client)); //다음 링크드ㄹ스트로로 이동
  2092. }
  2093. fclose(fp);
  2094. client_tail = current;
  2095. }
  2096.  
  2097. void delete_member(int id, Borrow *br_cur, Client *cl_cur) // 탈퇴
  2098. {
  2099. Borrow *br_head = br_cur;
  2100. Client *cl_head = cl_cur, *del_node, *tail_node;
  2101. int br_check=0;
  2102.  
  2103. br_cur = br_head -> next;
  2104.  
  2105. while(br_cur != NULL) {
  2106. if(br_cur -> std_id == id) {
  2107. br_check ++;
  2108. }
  2109. br_cur = br_cur -> next;
  2110. }
  2111. br_cur = br_head -> next;
  2112.  
  2113.  
  2114. FILE *cfp = fopen("./client.txt", "w");
  2115.  
  2116. if(br_check == 0) { //대여중인 도서가 없을때
  2117. if(cl_head -> next-> std_id == id) { //첫번째 노드일때
  2118. delete_cl_node(&cl_head, cl_head->next);
  2119. while(cl_cur != NULL) {
  2120. if(cl_cur->std_id != 0) {
  2121. fprintf(cfp, "%d|%s|%s|%s|%s\n", cl_cur->std_id, cl_cur->password, cl_cur->std_name, cl_cur->addr, cl_cur->ph_num);
  2122. }
  2123. cl_cur=cl_cur->next;
  2124. }
  2125. } else { //중간이나 끝일때
  2126. cl_cur=cl_head->next;
  2127. while(cl_cur != NULL) { //끝에서 두번째 노드 찾기
  2128. if(cl_cur->next->next == NULL) {
  2129. tail_node = cl_cur;
  2130. break;
  2131. }
  2132. cl_cur=cl_cur->next;
  2133. }
  2134. if(tail_node->next->std_id == id) { //마지막 노드일때
  2135. delete_cl_node(&tail_node, tail_node->next);
  2136. cl_cur=cl_head->next;
  2137. while(cl_cur != NULL) {
  2138. fprintf(cfp, "%d|%s|%s|%s|%s\n", cl_cur->std_id, cl_cur->password, cl_cur->std_name, cl_cur->addr, cl_cur->ph_num);
  2139. cl_cur = cl_cur -> next;
  2140. }
  2141. } else { //중간일때
  2142. cl_cur=cl_head->next;
  2143. while(cl_cur != NULL) {
  2144. if(cl_cur->next->std_id == id) { //전에 노드 위치저장
  2145. del_node = cl_cur;
  2146. break;
  2147. }
  2148. cl_cur=cl_cur->next;
  2149. }
  2150. cl_cur=cl_head->next;
  2151. delete_cl_node(&del_node, del_node->next);
  2152. while(cl_cur != NULL) {
  2153. fprintf(cfp, "%d|%s|%s|%s|%s\n", cl_cur->std_id, cl_cur->password, cl_cur->std_name, cl_cur->addr, cl_cur->ph_num);
  2154. cl_cur = cl_cur -> next;
  2155. }
  2156. }
  2157. }
  2158. printf("탈퇴 성공\n");
  2159. } else {
  2160. printf("탈퇴 불가능\n");
  2161. }
  2162.  
  2163. fclose(cfp);
  2164. }
  2165.  
  2166.  
  2167. /*-------------영민-------------*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement