그냥 도서 관리 프로그램이라고 해도 될 텐데 확장판을 넣은 것은 이전에 허접하지만 도서 관리 프로그램을 만든 적이 있기 때문이다. 허접하지만 그거 나름 만드는데 시간과 열정이 많이 들었다고? 가볍게 다루고 싶진 않다.
사실 이 블로그에 올라왔던 C 언어 예제 글들 중 몇몇 가지는 이 프로그램을 만들기 위해 사용되는 함수를 만드는 거였다.
각설은 여기까지 하고, 이 프로그램의 특징에 대해 이야기하자면
1. 텍스트 파일을 데이터베이스 처럼 쓴다. 즉, 이 프로그램이 정상적으로 실행되기 위해서는 두 가지가 필요하다. 실행 파일과 양식에 맞게 작성된 텍스트 파일 세 개. 같은 폴더에 넣고 실행하면 된다.
1) ~.exe
2) book_list.txt
3) user_list.txt
4) borrow_list.txt
각각의 파일이 어떻게 생겼는지는 이후에 나올 작동 모습 슬라이드에서 찾아볼 수 있다.
2. 로그인 기능 있다. 관리자와 사용자를 나누었다.
3. 데이터 형으로는 배열을 사용했지만 중간 중간에 빈 칸이 생겨서 생기는 단점을 보완했다.
4. fgets 함수를 이용하여 그 어떤 형태의 입력에도 잘 대처할 수 있다.
5. 사용자/도서 구조체 안에 포인터 형식을 적절히 써서 이후에 프로그램을 조정하고 싶다면 얼마든지 조정할 수 있다.
6. 책의 최대 권수, 최대 사용자 수는 main 함수 초기에 구조체의 크기가 정의되는 부분에서 숫자 100 만 다른 숫자로 바꾸면 얼마든지 바꿀 수 있다.
아래는 작동 모습 시연 슬라이드이다.
이 프로그램에 사용된 함수 명단은 아래와 같다.
1. lib_init_book
2. lib_init_user
3. lib_init_borrow
--> 이상 세 개의 함수는 같은 폴더 내 text file 에서 자료를 불러와 저장하는 역할을 한다.
4. login_user
--> 로그인 담당
5. add_book
6. delete_book
7. change_book
--> 책의 추가 제거, 정보 변경을 담당한다. 단 이 때, 누군가 빌려간 책은 지울 수 없게 설계했다.
8. search_book
--> 책의 검색을 담당. 문자열 데이터를 쓰기 때문에 제목, 저자, 출판사 등 모든 유형에 대해 사용할 수 있는 검색 함수다.
9. arrange_book
--> 책을 일련번호 순대로 정리한다. 배열형 자료를 쓰다 보니 중간에 빈칸에 자료를 넣는 것이 효율적이 되었고 그를 하려다 보니 책을 배열 위치 순으로 정렬하는 것 보다는 일련번호 순으로 정렬하는 것이 더 낫다.
10. print_book
11. print_user
--> 사용자 대출 정보나 책의 현황을 점검하기 위한 함수.
12. add_user
13. delete_user
--> 사용자를 뺴거나 더할 수 있다. 단, 대출 목록이 있는 사용자는 지울 수 없다.
14. close_lib
--> 프로그램 이용 도중 정보가 바뀌면 이후에 종료할 때 메모장에 파일을 새로 써 넣는다.
15. compare_string
16. input_string
17. input_num
--> 각종 입력에 대처하기 위한 함수이다. stdin 을 비워주는 형식으로 구성되어 있다.
아래는 코드이다.
p.s. 써보고 버그 있다 싶으면 댓글 등으로 연락 바랍니다. 수정하게..... 사실 나도 나름 열심히 이 경우 저 경우 찾아가면서 디버깅했지만 또 모르니.....
/*
책 추가 삭제, 대여, 반납 기능
현재 대여중인 책 txt 파일로 뽑을 수 있도록
로그인 구현할 수 있다면 하도록
최대 100권의 책, 최대 100명의 회원을 가질 수 있다고 가정
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct book_info
{
char title[41];
char auth[31];
char publ[31];
int stat; // 도서 상태 식별. 0->도서관내 소장 1->대여중 2->이 번호는 책이 없음.
int book_num; // 도서 번호
struct user_info *user;
};
struct user_info
{
char id[21];
char pass[21];
int borr; // 빌려간 책 수
int stat; //회원 슬롯 식별. 0->빈 슬롯 1->차 있는 슬롯
struct book_info *borrow_list[5];
struct user_info *nextuser;
};
int lib_init_book(int *init, struct book_info *book_list, int *total_book);
int lib_init_user(int *init, struct user_info *user_list, int *total_user);
int lib_init_borrow(int *init, struct book_info *book_list, struct user_info *user_list, int *total_book, int *total_user);
int login_user(char *id, char *pass, struct user_info *user_list, struct user_info *session, int *total_user, int *user_key); // 0->관리자 1->관리자 아님 2->ID or 비번 틀림
int add_book(struct book_info *book_list, int *total_book);
int delete_book(struct book_info *book_list, int *total_book, struct user_info *user_list, int *total_user);
int change_book(struct book_info *book_list, int *book_num, int *total_book);
int search_book(struct book_info *book_list, int *total_book);
int arrange_book(struct book_info *book_list, int *total_book);
void print_book(struct book_info *book);
int print_user(struct user_info *user_list, int *total_user);
int add_user(struct user_info *user_list, int *total_user);
int delete_user(struct user_info *user_list, int *total_user, struct book_info *book_list, int *total_book);
int borrow_book(struct book_info *book_list, struct user_info *curr_user, int *total_book);
int return_book(struct book_info *book_list, struct user_info *curr_user);
int compare_string(char *keyword, char *source);
int input_num(int *result, int form);
int input_string(char *result, int form);
int close_lib(struct book_info *book_list, struct user_info *user_list, int *total_book, int *total_user);
int main()
{
int i, j;
int init;
char str1[22];
char str2[22];
char c[3];
int total_book=0;
int total_user=0;
int user_key=-1;
struct book_info book_list[100];
struct user_info user_list[100];
struct user_info curr_user;
printf("도서관 정보를 불러오고 있습니다.. \n");
lib_init_book(&init, book_list, &total_book);
if(init==0)
{
printf("도서 정보가 초기화되지 않았습니다. \n");
return 0;
}
init=0;
lib_init_user(&init, user_list, &total_user);
if(init==0)
{
printf("사용자 정보가 초기화되지 않았습니다. \n");
return 0;
}
lib_init_borrow(&init, book_list, user_list, &total_book, &total_user);
if(init==0)
{
printf("도서 대출 현황을 불러올 수 없었습니다. 계속 진행하시겠습니까? y/n :");
input_string(c, 1);
if(strcmp(c,"n")==0)
{
printf("도서관이 종료되었습니다. \n");
return 0;
}
}
printf("도서관이 시작됩니다. \n");
for(;;)
{
printf("사용자 정보를 확인해 주십시오. \n");
printf("ID : ");
input_string(str1, 20);
printf("PASSWORD : ");
input_string(str2, 20);
login_user(str1, str2, user_list, &curr_user, &total_user, &user_key);
if(user_key == 0)
{
printf("관리자로 로그인되었습니다. \n");
for(;;)
{
printf(" 수행하려는 작업을 선택하십시오. \n");
printf(" 1. 도서 추가 \n 2. 도서 삭제\n 3. 도서 정보 변경\n 4. 도서 검색\n 5. 도서 조회\n 6. 회원 추가\n 7. 회원 삭제\n 8. 회원 정보 조회\n 9. 도서 대출\n 10. 도서 반납\n 11. 관리자 종료\n 12. 도서관 종료 : ");
input_num(&i, 2);
if(i==1)
{
if(total_book>100)
{
printf("총 장서 수가 허용 가능한 수를 넘어섰습니다. \n");
}
else
{
add_book(book_list, &total_book);
total_book++;
}
}
else if(i==2)
{
if(total_book<1)
{
printf("책이 한 권도 없습니다. \n");
}
else
{
delete_book(book_list, &total_book, user_list, &total_user);
total_book=total_book-1;
}
}
else if(i==3)
{
printf("변경하려는 도서의 일련번호를 입력하십시오. : ");
input_num(&j, 8);
change_book(book_list, &j, &total_book);
}
else if(i==4)
{
search_book(book_list, &total_book);
}
else if(i==5)
{
printf("도서 목록을 출력합니다. 일련번호 순으로 출력됩니다. \n");
arrange_book(book_list, &total_book);
}
else if(i==6) //회원 추가
{
if(total_user>99)
{
printf("더 이상 회원을 추가할 수 없습니다.");
}
else
{
add_user(user_list, &total_user);
}
}
else if(i==7) //회원 삭제
{
delete_user(user_list, &total_user, book_list, &total_book);
}
else if(i==8)//회원 대출 현황 조회
{
print_user(user_list, &total_user);
}
else if(i==9)//도서 대출
{
borrow_book(book_list, &curr_user, &total_book);
}
else if(i==10)//도서 반납
{
return_book(book_list, &curr_user);
}
else if(i==11)
{
printf("관리자 모드가 종료됩니다. \n");
break;
}
else if(i==12)
{
printf("도서관이 종료됩니다. 정보를 저장하는 동안 잠시 기다리십시오. \n");
close_lib(book_list, user_list, &total_book, &total_user);
printf("도서관이 종료되었습니다. \n");
return 0;
}
else
{
printf("잘못된 명령입니다. \n");
}
}
}//관리자 편집 끝남. 일반 사용자 편집 차례
else if(user_key != 0 && user_key>0)
{
printf("일반 사용자로 로그인되었습니다. \n");
for(;;)
{
printf(" 수행하려는 작업을 선택하십시오. \n");
printf(" 1. 도서 검색\n 2. 도서 대출\n 3. 도서 반납\n 4. 대출 현황 조회\n 5. 종료 : ");
input_num(&i, 1);
if(i==1)
{
search_book(book_list, &total_book);
}
else if(i==2)
{
borrow_book(book_list, &curr_user, &total_book);
}
else if(i==3)
{
return_book(book_list, &curr_user);
}
else if(i==4)
{
if(curr_user.borr<1)
{
printf("현재 대출중인 도서는 없습니다. \n");
}
else
{
printf("대출중인 도서 목록은 다음과 같습니다. \n");
for(j=0;j<curr_user.borr;j++)
{
printf("title : %s \n", curr_user.borrow_list[j]->title);
}
}
}
else if(i==5)
{
printf("로그아웃 합니다. \n");
user_list[user_key]=curr_user;
break;
}
else
{
printf("잘못된 명령입니다. \n");
}
}
}
else if(user_key== -1)
{
printf("비밀번호가 일치하지 않습니다. \n");
}
else if(user_key== -2)
{
printf("입력한 ID 가 존재하지 않습니다. \n");
}
else
{
printf("사용자 정보가 일치하지 않습니다. \n");
}
printf("도서관을 계속 이용하시겠습니까? y/n : ");
input_string(c, 1);
if(strcmp(c, "n")==0)
{
printf("도서관을 종료합니다. 정보를 저장하는 동안 잠시 기다려 주십시오. \n");
close_lib(book_list, user_list, &total_book, &total_user);
return 0;
}
}
return 0;
}
int lib_init_book(int *init, struct book_info *book_list, int *total_book)
{
char c;
int i=0;
FILE *book_stream = fopen("book_list.txt", "r");
if(book_stream == NULL)
{
*init = 0;
return 0;
}
else
{
*init=1;
}
while((c=fgetc(book_stream)) != EOF)
{
if(c=='/')
{
fgetc(book_stream);
fgets(book_list[i].title, 41, book_stream);
book_list[i].title[strlen(book_list[i].title)-1]='\0';
fgets(book_list[i].auth, 31, book_stream);
book_list[i].auth[strlen(book_list[i].auth)-1]='\0';
fgets(book_list[i].publ, 31, book_stream);
book_list[i].publ[strlen(book_list[i].publ)-1]='\0';
fscanf(book_stream, "%d", &book_list[i].stat);
fscanf(book_stream, "%d", &book_list[i].book_num);
i++;
}
}
*total_book=i;
fclose(book_stream);
return 0;
}
int lib_init_user(int *init, struct user_info *user_list, int *total_user)
{
char c;
int i=0;
FILE *user_stream = fopen("user_list.txt", "r");
if(user_stream == NULL)
{
*init = 0;
return 0;
}
else
{
*init=1;
}
while((c=fgetc(user_stream)) != EOF)
{
if(c=='/')
{
fgetc(user_stream);
fgets(user_list[i].id, 21, user_stream);
user_list[i].id[strlen(user_list[i].id)-1]='\0';
fgets(user_list[i].pass, 21, user_stream);
user_list[i].pass[strlen(user_list[i].pass)-1]='\0';
fscanf(user_stream, "%d", &user_list[i].borr);
user_list[i].stat=1;
i++;
}
}
*total_user=i;
fclose(user_stream);
for(i=0;i<*total_user-1;i++)
{
user_list[i].nextuser = &user_list[i+1];
}
i++;
user_list[i].nextuser = &user_list[0];
return 0;
}
int lib_init_borrow(int *init, struct book_info *book_list, struct user_info *user_list, int *total_book, int *total_user)
{
int i, j,k,l;
char c;
char str1[22];
FILE *borrow_stream;
borrow_stream=fopen("borrow_list.txt", "r");
if(borrow_stream==NULL)
{
*init=0;
return 0;
}
else
{
*init=1;
}
while((c=fgetc(borrow_stream)) != EOF)
{
if(c=='/')
{
fgets(str1, 21, borrow_stream);
str1[strlen(str1)-1]='\0';
for(i=0;i<*total_user;i++)
{
if(strcmp(user_list[i].id, str1)==0)
{
for(j=0;j<user_list[i].borr;j++)
{
fscanf(borrow_stream, "%d", &k);
for(l=0;l<*total_book;l++)
{
if(k==book_list[l].book_num)
{
user_list[i].borrow_list[j]=&book_list[l];
}
}
}
}
}
}
}
fclose(borrow_stream);
for(i=0;i<*total_user;i++)
{
if(user_list[i].borr>0)
{
for(k=0;k<user_list[i].borr;k++)
{
for(j=0;j<*total_book;j++)
{
if(book_list[j].book_num==user_list[i].borrow_list[k]->book_num)
{
book_list[j].user=&user_list[i];
}
}
}
}
}
return 0;
}
int login_user(char *id, char *pass, struct user_info *user_list, struct user_info *session, int *total_user, int *user_key)
{
int i;
int count=1;
if(strcmp(id, "admin")==0)
{
if(strcmp(pass, "password")==0)
{
*session=user_list[0];
*user_key=0;
return 0;
}
else
{
*user_key=2;
return 0;
}
}
else
{
for(i=1;i<*total_user;i++)
{
if(strcmp(id, user_list[i].id)==0)
{
if(strcmp(pass, user_list[i].pass)==0)
{
*session=user_list[i];
*user_key=i;
return 0;
}
else
{
*user_key= -1;
return 0;
}
}
}
if(i==*total_user)
{
*user_key= -2;
return 0;
}
}
}
int add_book(struct book_info *book_list, int *total_book)
{
int i=0;
int j;
int book_locat;
int count=0;
char str1[42];
char str2[32];
char str3[32];
char c[3];
book_locat=*total_book;
printf("책의 정보를 입력해 주십시오. \n");
for(;;)
{
printf("제목 : ");
input_string(str1, 40);
for(i=0;i<*total_book;i++)
{
if(strcmp(str1, book_list[i].title)==0)
{
printf("일치하는 도서명이 있습니다. 추가할 수 없습니다. \n");
return 0;
}
}
strcpy(book_list[book_locat].title, str1);
break;
}
for(;;)
{
printf("저자 : ");
input_string(str2, 30);
strcpy(book_list[book_locat].auth, str2);
break;
}
for(;;)
{
printf("출판사 : ");
input_string(str3, 30);
strcpy(book_list[book_locat].publ, str3);
break;
}
count=0;
for(;;)
{
printf("일련번호를 입력하십시오. 단, 0 은 입력할 수 없습니다. : ");
input_num(&j, 8);
for(i=0;i<*total_book;i++)
{
if(j==book_list[i].book_num || j==0)
{
printf("사용할 수 없는 번호입니다. \n");
printf("계속 입력하시겠습니까? y/n :");
input_string(c,1);
if(strcmp(c, "n")==0)
{
printf("정보 입력을 중단했습니다. \n");
return 0;
}
}
}
book_list[book_locat].book_num=j;
break;
}
book_list[book_locat].stat=0;
return 0;
}
int delete_book(struct book_info *book_list, int *total_book, struct user_info *user_list, int *total_user)
{
int i, j,k,l;
int result=1;
int book_locat;
char str[42];
printf(" 삭제 방법을 선택해 주십시오.\n 1) 일련번호\n 2) 제목 : ");
input_num(&j, 1);
if(j==1)
{
printf("삭제하려는 책의 일련번호를 입력하십시오. : ");
input_num(&k, 8);
for(i=0;i<*total_book;i++)
{
if(k==book_list[i].book_num && book_list[i].stat == 0)
{
book_locat=i;
book_list[i].stat=2;
*book_list[i].title=NULL;
*book_list[i].auth=NULL;
*book_list[i].publ=NULL;
book_list[i].book_num=0;
result=0;
printf("책이 삭제되었습니다. \n");
break;
}
else if(k==book_list[i].book_num && book_list[i].stat == 1)
{
printf("대출중인 책은 지울 수 없습니다. \n");
return 0;
}
}
if(i==*total_book)
{
printf("일치하는 번호의 책이 없습니다. \n");
return 0;
}
}
else if(j==2)
{
printf("삭제하려는 책의 제목을 입력하십시오. : ");
input_string(str, 40);
for(i=0;i<*total_book;i++)
{
if(strcmp(str, book_list[i].title)==0 && book_list[i].stat==0)
{
book_locat=i;
book_list[i].stat=2;
*book_list[i].title=NULL;
*book_list[i].auth=NULL;
*book_list[i].publ=NULL;
book_list[i].book_num=0;
result=0;
printf("책이 삭제되었습니다. \n");
break;
}
else if(strcmp(str, book_list[i].title)==0 && book_list[i].stat==1)
{
printf("대출중인 책은 지울 수 없습니다. \n");
return 0;
}
}
if(i==*total_book)
{
printf("일치하는 제목의 책이 없습니다. \n");
return 0;
}
}
else
{
printf("잘못된 입력입니다. \n");
}
for(i=book_locat;i<*total_book;i++)
{
for(j=0;j<*total_user;j++)
{
if(user_list[j].borr>0)
{
for(k=0;k<user_list[j].borr;k++)
{
if(&book_list[i]==user_list[j].borrow_list[k])
{
user_list[j].borrow_list[k]--;
}
}
}
}
}
for(i=0;i<*total_book;i++)
{
if(book_list[i].stat==2)
{
for(j=i;j<*total_book;j++)
{
book_list[j]=book_list[j+1];
}
}
}
return 0;
}
int change_book(struct book_info *book_list, int *book_num, int *total_book)
{
int i;
int change;
int count;
int num=0;
char str[42];
char c[3];
for(i=0;i<*total_book;i++)
{
if(book_list[i].book_num==*book_num)
{
change=i;
break;
}
}
if(i==*total_book)
{
printf("일치하는 일련번호의 책이 없습니다. \n");
return 0;
}
printf("변경하려는 책의 정보를 입력합니다. \n");
for(;;)
{
printf("제목 : ");
input_string(str, 40);
strcpy(book_list[change].title, str);
break;
}
for(;;)
{
printf("저자 : ");
input_string(str, 30);
strcpy(book_list[change].auth, str);
break;
}
for(;;)
{
printf("출판사 : ");
input_string(str, 30);
strcpy(book_list[change].publ, str);
break;
}
for(;;)
{
printf("일련번호 : ");
input_num(&num, 8);
for(i=0;i<*total_book;i++)
{
if(num==book_list[i].book_num && i != change)
{
printf("동일한 일련번호의 책이 있습니다. \n");
break;
}
}
if(i==*total_book)
{
book_list[change].book_num=num;
}
break;
}
return 0;
}
int search_book(struct book_info *book_list, int *total_book)
{
int i, j;
int result=0;
char str[42];
char c[3];
printf("다음 중 무엇으로 검색하겠습니까? \n 1. 제목\n 2. 저자\n 3. 출판사\n 4. 일련번호 : ");
input_num(&i, 1);
if(i==1)
{
printf("검색 키워드를 입력하십시오 : ");
input_string(str, 40);
for(i=0;i<*total_book;i++)
{
if(compare_string(str, book_list[i].title)==0)
{
print_book(&book_list[i]);
result++;
}
}
}
else if(i==2)
{
printf("검색 키워드를 입력하십시오 : ");
input_string(str, 30);
for(i=0;i<*total_book;i++)
{
if(compare_string(str, book_list[i].auth)==0)
{
print_book(&book_list[i]);
result++;
}
}
}
else if(i==3)
{
printf("검색 키워드를 입력하십시오 : ");
input_string(str, 30);
for(i=0;i<*total_book;i++)
{
if(compare_string(str, book_list[i].auth)==0)
{
print_book(&book_list[i]);
result++;
}
}
}
else if(i==4)
{
printf("몇 번 책을 검색하겠습니까? : ");
input_num(&j, 8);
for(i=0;i<*total_book;i++)
{
if(j==book_list[i].book_num)
{
print_book(&book_list[i]);
result++;
}
}
}
else
{
printf("잘못된 명령입니다. \n");
return 0;
}
if(result>0)
{
printf("검색이 완료되었습니다. \n");
return 0;
}
else
{
printf("일치하는 검색어가 없습니다. \n");
return 0;
}
}
void print_book(struct book_info *book)
{
int i;
char c;
int j=0;
printf("제목 : %s \n", book->title);
printf("저자 : %s \n", book->auth);
printf("출판사 : %s \n", book->publ);
printf("일련번호 : %d \n", book->book_num);
if(book->stat==1)
{
printf(" 대출 여부 : 대출중 / 대출한 사용자 : %s \n ", book->user->id);
}
else
{
printf(" 대출 여부 : 도서관내 소장 \n");
}
}
int arrange_book(struct book_info *book_list, int *total_book)
{
int i,j;
int *arr;
arr=(int *)malloc(sizeof(int) * *total_book);
for(i=0;i<*total_book;i++)
{
arr[i]=0;
}
for(i=0;i<*total_book;i++)
{
for(j=0;j<*total_book;j++)
{
if(book_list[i].book_num-book_list[j].book_num>0)
{
arr[i]++;
}
}
}
for(i=0;i<*total_book;i++)
{
for(j=0;j<*total_book;j++)
{
if(i==arr[j])
{
print_book(&book_list[j]);
}
}
}
free(arr);
return 0;
}
int add_user(struct user_info *user_list, int *total_user)
{
int i, total_user_temp;
char str1[22];
char str2[22];
total_user_temp=*total_user;
printf("추가하려는 사용자의 정보를 입력하십시오. ID 와 비밀번호는 20자 아래로만 입력됩니다. \n");
printf("아이디 : ");
input_string(str1, 20);
printf("비밀번호 : ");
input_string(str2, 20);
for(i=0;i<*total_user;i++)
{
if(user_list[i].stat==0)
{
strcpy(user_list[i].id, str1);
strcpy(user_list[i].pass, str2);
user_list[i].stat=1;
user_list[i].borr=0;
total_user_temp++;
printf("정보입력이 완료되었습니다. \n");
break;
}
}
if(total_user_temp==*total_user)
{
strcpy(user_list[i].id, str1);
strcpy(user_list[i].pass, str2);
user_list[i].stat=1;
user_list[i].borr=0;
total_user_temp++;
printf("정보입력이 완료되었습니다. \n");
}
*total_user=total_user_temp;
return 0;
}
int delete_user(struct user_info *user_list, int *total_user, struct book_info *book_list, int *total_book)
{
int i;
int j,k;
int result=0;
char str1[22];
char str2[22];
printf("삭제하려는 사용자의 정보를 입력하십시오. \n");
printf("아이디 : ");
input_string(str1, 20);
printf("비밀번호 : ");
input_string(str2, 20);
for(i=0;i<*total_user;i++)
{
if(strcmp(user_list[i].id, str1)==0)
{
if(strcmp(user_list[i].pass, str2)==0)
{
if(user_list[i].borr>0)
{
printf("대출 도서가 있는 사용자는 삭제할 수 없습니다. \n");
return 0;
}
user_list[i].stat=0;
printf("사용자 정보가 삭제되었습니다. \n");
for(i=0;i<*total_user;i++)
{
if(user_list[i].stat==0)
{
for(j=i;j<*total_user;j++)
{
for(k=0;k<*total_book;k++)
{
if(book_list[k].user == &user_list[j])
{
book_list[k].user--;
}
}
user_list[j]=user_list[j+1];
}
}
}
*total_user-=1;
result=1;
return 0;
}
else
{
printf("비밀번호가 일치하지 않습니다. \n");
return 0;
}
}
}
if(result==0)
{
printf("일치하는 사용자 정보가 없습니다. \n");
}
return 0;
}
int print_user(struct user_info *user_list, int *total_user)
{
int i,j;
char str1[42];
printf("조회하려는 회원의 ID 를 입력하십시오. : ");
fgets(str1, 21, stdin);
str1[strlen(str1)-1]='\0';
for(i=0;i<*total_user;i++)
{
if(user_list[i].stat==1)
{
if(strcmp(str1, user_list[i].id)==0)
{
if(user_list[i].borr>0)
{
printf("해당 회원의 대출 현황은 아래와 같습니다. \n");
for(j=0;j<user_list[i].borr;j++)
{
printf("대출도서 %d : %s \n", j+1, user_list[i].borrow_list[j]->title);
}
return 0;
break;
}
else
{
printf("해당 회원이 대출중인 도서는 없습니다. \n");
return 0;
}
}
}
}
if(i==*total_user)
{
printf("ID 가 일치하는 사용자가 존재하지 않습니다. \n");
return 0;
}
}
int borrow_book(struct book_info *book_list, struct user_info *curr_user, int *total_book)
{
int i, j, k;
char str1[42];
char c[3];
if(curr_user->borr>4)
{
printf("대여 가능한 책 수를 초과했으므로 더 이상은 빌릴 수 없습니다. \n");
return 0;
}
else
{
printf("무엇을 통해 빌리겠습니까? \n 1. 제목 \n 2. 일련번호 : ");
input_num(&i, 1);
if(i==1)
{
printf("빌리려는 책의 제목을 입력하십시오. : ");
input_string(str1, 40);
for(j=0;j<*total_book;j++)
{
if(strcmp(str1, book_list[j].title)==0)
{
if(book_list[j].stat==0)
{
book_list[j].stat=1;
curr_user->borr=+1;
curr_user->borrow_list[curr_user->borr-1]=&book_list[j];
book_list[j].user=curr_user;
printf("대출 도서명 : %s \n", book_list[j].title);
printf("대출 사용자 : %s \n", curr_user->id);
return 0;
}
else if(book_list[j].stat ==1)
{
printf("이미 대여중인 책이라 빌릴 수 없습니다. \n");
return 0;
}
else
{
printf("해당 도서는 존재하지 않는 상태입니다. \n");
return 0;
}
}
}
if(j==*total_book)
{
printf("일치하는 도서명이 없습니다. \n");
return 0;
}
}
else if(i==2)
{
printf("빌리려는 책의 번호를 입력하십시오 : ");
input_num(&k, 8);
for(j=0;j<*total_book;j++)
{
if(k==book_list[j].book_num)
{
if(book_list[j].stat==0)
{
book_list[j].stat=1;
curr_user->borr++;
curr_user->borrow_list[curr_user->borr-1]=&book_list[j];
printf("대출 도서명 : %s \n", book_list[j].title);
printf("대출 사용자 : %s \n", curr_user->id);
return 0;
}
else if(book_list[i].stat ==1)
{
printf("이미 대여중인 책이라 빌릴 수 없습니다. \n");
return 0;
}
else
{
printf("해당 도서는 존재하지 않는 상태입니다. \n");
return 0;
}
}
}
if(j==*total_book)
{
printf("일치하는 도서명이 없습니다. \n");
return 0;
}
}
else
{
printf("잘못된 명령입니다. \n");
return 0;
}
}
return 0;
}
int return_book(struct book_info *book_list, struct user_info *curr_user)
{
int i,j,k,l;
int return_temp;
char str1[42];
char c[3];
return_temp=curr_user->borr;
if(curr_user->borr<1)
{
printf("반납할 수 있는 책이 없습니다. \n");
return 0;
}
else
{
printf("무엇으로 반납하겠습니까? \n1. 제목 \n2. 일련번호 : ");
input_num(&i, 1);
if(i==1)
{
printf("반납하려는 책의 제목을 입력하십시오 : ");
input_string(str1, 40);
for(j=0;j<curr_user->borr;j++)
{
if(strcmp(curr_user->borrow_list[j]->title, str1)==0)
{
curr_user->borrow_list[j]->stat=0;
for(k=j;k<curr_user->borr;k++)
{
curr_user->borrow_list[k]=curr_user->borrow_list[k+1];
}
curr_user->borr-=1;
printf("책이 반납되었습니다. \n");
return 0;
}
}
if(return_temp==curr_user->borr)
{
printf("사용자가 대출한 책이 아닙니다. \n");
return 0;
}
}
else if(i==2)
{
printf("반납하려는 책의 번호를 입력하십시오 : ");
input_num(&l, 8);
for(j=0;j<curr_user->borr;j++)
{
if(l==curr_user->borrow_list[j]->book_num)
{
curr_user->borrow_list[j]->stat=0;
for(k=j;k<curr_user->borr-1;k++)
{
curr_user->borrow_list[k]=curr_user->borrow_list[k+1];
}
curr_user->borr-=1;
printf("책이 반납되었습니다. \n");
return 0;
}
}
if(return_temp==curr_user->borr)
{
printf("사용자가 대출한 책이 아닙니다. \n");
return 0;
}
}
else
{
printf("잘못된 입력입니다. \n");
return 0;
}
}
}
int compare_string(char *keyword, char *source)
{
int i=0,j=0;
while(*keyword)
{
if(*keyword==*source)
{
keyword++;
source++;
i++;
if(*keyword=='\0')
{
keyword=keyword-i;
source=source-i;
i=0;
return 0;
}
}
else
{
keyword=keyword-i;
source++;
i=0;
if(*source=='\0')
{
return 1;
}
}
}
}
int input_num(int *result, int form)
{
int i;
int j=1;
int sign=1;
int input_size;
char *str;
if(form>9)
{
printf("입력 범위가 너무 큽니다. 함수 설정을 확인하십시오. \n");
return 0;
}
*result=0;
str=(char *)malloc(sizeof(char) * form+2);
for(;;)
{
sign=1;
fgets(str, form+2, stdin);
for(i=0;i<form+1;i++)
{
if(str[i]=='\n')
{
input_size=i;
break;
}
}
if(i==form+1)
{
printf("입력 범위를 초과했습니다. \n");
while(getchar() != '\n')
{}
printf("다시 입력하십시오 : ");
continue;
}
for(i=0;i<input_size;i++)
{
if(str[i]<48 || str[i]>57)
{
if(str[i] != '\n')
{
printf("숫자만 입력할 수 있습니다. \n");
printf("다시 입력하십시오 : ");
sign=0;
break;
}
}
}
if(sign==0)
{
continue;
}
for(i=0;i<input_size;i++)
{
*result=*result+(str[input_size-i-1]-48)*j;
j=j*10;
}
break;
}
free(str);
return 0;
}
int input_string(char *result, int form)
{
int i;
int input=0;
for(;;)
{
fgets(result, form+2, stdin);
for(i=0;i<form+2;i++)
{
if(result[i]=='\n')
{
result[strlen(result)-1]='\0';
input=1;
break;
}
else if(result[i] != '\n' && i==form+1)
{
printf("입력 가능한 범위를 넘어섰습니다. %d 글자 이상 입력하지 마십시오. \n", form);
result[0]='\0';
while(getchar() != '\n')
{}
printf("다시 입력하십시오 : ");
break;
}
}
if(input==1)
{
return 0;
}
}
}
int close_lib(struct book_info *book_list, struct user_info *user_list, int *total_book, int *total_user)
{
FILE *save_book;
FILE *save_user;
FILE *save_borrow;
int i,j;
save_book=fopen("book_list.txt", "w");
for(i=0;i<*total_book;i++)
{
fputs("/\n", save_book);
fputs(book_list[i].title, save_book);
fputs("\n", save_book);
fputs(book_list[i].auth, save_book);
fputs("\n", save_book);
fputs(book_list[i].publ, save_book);
fputs("\n", save_book);
fprintf(save_book, "%d", book_list[i].stat);
fputs("\n", save_book);
fprintf(save_book, "%d", book_list[i].book_num);
fputs("\n", save_book);
}
fclose(save_book);
i=0;
save_user=fopen("user_list.txt", "w");
for(i=0;i<*total_user;i++)
{
fputs("/\n", save_user);
fputs(user_list[i].id, save_user);
fputs("\n", save_user);
fputs(user_list[i].pass, save_user);
fputs("\n", save_user);
fprintf(save_user, "%d", user_list[i].borr);
fputs("\n", save_user);
}
fclose(save_user);
i=0;
save_borrow=fopen("borrow_list.txt", "w");
for(;;)
{
if(user_list[i].stat==1)
{
if(user_list[i].borr>0)
{
fputs("/", save_borrow);
fputs(user_list[i].id, save_borrow);
fputs("\n", save_borrow);
for(j=0;j<user_list[i].borr;j++)
{
fprintf(save_borrow, "%d", user_list[i].borrow_list[j]->book_num);
fputs("\n", save_borrow);
}
}
else
{
fputs("/", save_borrow);
fputs(user_list[i].id, save_borrow);
fputs("\n0\n", save_borrow);
}
i++;
if(i>*total_user-1)
{
break;
}
}
}
fclose(save_borrow);
return 0;
}
C 언어 예제, 최소공배수 구하기. Project Euler 5번 (0) | 2016.05.22 |
---|---|
C 언어 예제, 대칭수 찾기. Project Euler 4번 (0) | 2016.05.20 |
C 언어 예제, fgets 로 정수(숫자) 입력받기 (0) | 2015.03.31 |
C 언어 예제, fgets 를 통한 문자열 입력과 표준입력버퍼(stdin) 비우기 (0) | 2015.03.22 |
C 언어 예제, text(메모장) 파일에서 입력받기 (0) | 2015.01.18 |
댓글 영역