107. 도서 관리 프로그램 – 도서 추가

이번에는 도서 추가 시퀀스 다이어그램을 작성하기로 해요.
도서 추가에서는 먼저 모든 장르 정보를 보여주게 하세요.
장르를 선택하고 도서 제목과 작가 이름을 입력받아 도서를 생성한 후에 선택한 장르에 도서를 추가해야겠죠.
장르에서는 새로운 장르를 생성하여 장르에 도서를 보관하게 하세요.

먼저 Book 헤더에 동적으로 도서를 생성하는 함수와 소멸하는 함수를 선언하고 소스에 구현하세요.
동적으로 Book 개체를 생성하는 함수에서는 동적으로 Book 형식 크기의 메모리를 할당받으세요.
할당받은 메모리를 초기화하고 반환하세요.

void BookBook(Book *book,int bnum,const char *title,const char *author);
Book *NewBook(int bnum,const char *title,const char *author)
{
    Book *book = 0;
    book = (Book *)malloc(sizeof(Book));
    BookBook(book,bnum,title,author);
    return book;
}

Book 개체를 초기화하는 함수에서는 도서 번호와 도서 제목, 저자명을 설정하세요.

void BookBook(Book *book,int bnum,const char *title,const char *author)
{
    book->bnum = bnum;
    memset(book->title,0,sizeof(book->title));
    strncpy(book->title,title,MAX_TNAME_LEN);
    memset(book->author,0,sizeof(book->author));
    strncpy(book->author,author,MAX_ANAME_LEN);
}

Book 개체를 소멸하는 함수에서는 자신만 소멸하면 되겠죠.

void DeleteBook(Book *book)
{
    free(book);
}

장르에도 도서를 생성하여 보관하는 함수를 구현합시다. App에서 사용해야 하는 함수이므로 헤더 파일에 함수 선언문을 작성하고 소스 파일에 함수를 구현하세요.

void GenreAddBook(Genre *genre,const char *title,const char *author)
{
    Book *book = 0;
    genre->last_bnum++;
    book = NewBook(genre->last_bnum,title,author);
    EHArrayPushBack(genre->books,book);
    printf("도서번호:%d 로 추가하였습니다.\n",genre->last_bnum);
}

App에 도서 추가 함수를 작성하기로 해요.
장르 목록을 보여주고 장르를 선택하세요.
장르를 선택하면 도서 정보를 입력받은 후 장르의 도서 추가 함수를 호출하게 하세요.

void AppAddBook(App *app)
{
    char gname[MAX_GNAME_LEN+1]="";
    char author[MAX_ANAME_LEN+1]="";
    char title[MAX_TNAME_LEN+1]="";
    Iterator seek = 0;
    Genre *genre = 0;
    AppListGenre(app);
    printf("도서를 추가할 장르명을 입력하세요.\n");
    gets_s(gname,MAX_GNAME_LEN);
    seek = AppFindGenre(app,gname);
    if(seek == EHArrayEnd(app->genres))
    {
        printf("잘못 선택하였습니다.\n");
        return;
    }
    printf("도서명을 입력하세요.\n");
    gets_s(title,MAX_TNAME_LEN);
    printf("저자명을 입력하세요.\n");
    gets_s(author,MAX_ANAME_LEN);
    genre = (Genre *)(*seek);
    GenreAddBook(genre,title,author);
}