언어 자료구조 알고리즘/[C++]디딤돌 자료구조와 알고리즘

8.3 도서 추가 [디딤돌 자료구조와 알고리즘 with C++]

언제나휴일 2016. 4. 4. 11:52
반응형

8.3 도서 추가

이번에는 도서 추가 기능을 구현합시다.

 

void App::AddBook()  //도서 추가

{

먼저 추가할 도서의 ISBN을 입력받습니다.

    cout<<"추가할 도서의 ISBN:";

    string isbn = ehglobal::getstr();

    if(bookdic[isbn])

    {

만약 입력받은 도서의 ISBN이 있으면 메시지를 출력하고 기능을 종료하세요.

        cout<<"이미 있는 도서의 ISBN입니다."<<endl;

        return;

    }

 

도서를 추가할 장르를 선택합니다. 장르를 선택하는 부분은 별도의 메서드를 작성합시다.

    Genre *genre = SelectGenre();

    if(genre == 0)

    {

만약 장르를 잘못 선택하면 메시지를 출력하고 기능을 종료하세요.

        cout<<"잘못 선택하였습니다."<<endl;

        return;

    }

 

isbn을 입력 인자로 장르에 도서를 추가하세요. 아직 추가하지 않은 메서드입니다. Genre 클래스에 AddBook 메서드를 추가하세요. GenreAddBook 메서드에서는 생성한 도서 개체를 반환해 주어야 합니다. App 에서도 isbn 순으로 도서를 보관해야 하기 때문입니다.

    Book *book = genre->AddBook(isbn);

    if(book)

    {

반환받은 도서 개체가 유효하면 맵 bookdic에 설정하세요.

        bookdic[isbn] = book;

    }

}

 

먼저 App 클래스에 장르를 선택하는 SelectGenre 메서드를 추가하세요.

class App

{

    ...중략...

    Genre *SelectGenre();//장르 선택

};

 

 

Genre *App::SelectGenre()//장르 선택

{

사용자가 장르를 선택하기 쉽게 장르 목록을 출력하세요.

    ListGenre();

    cout<<"선택할 장르 번호:";

    int gnum = ehglobal::getnum();

 

반복자나 find_if 알고리즘을 이용하여 사용자가 선택한 장르를 찾습니다. 여기에서는 반복자를 사용할게요.   

    GIter seek = genres.begin();

    GIter last = genres.end();

    Genre *genre = 0;

    for(   ;seek != last ; ++seek)

    {

        genre = *seek;

        if(genre->GetGNum() == gnum)

        {

장르의 번호와 사용자가 입력한 장르 번호가 같으면 장르를 반환하세요.

            return genre;

        }

    }

사용자가 입력한 장르 번호를 갖는 장르 개체가 없으면 0을 반환하세요.

    return 0;

}

 

Genre 클래스에 도서 추가 AddBook 메서드와 장르 번호 접근자 GetGNum을 추가하세요.

class Genre

{

    ...중략...

    Book *AddBook(string isbn);

    int GetGNum()const;

};

 

Book *Genre::AddBook(string isbn)

{

사용자에게 장르 내 도서 구분자를 입력받습니다.

    cout<<"장르 내 도서 구분자(1~100):";

    int bnum = ehglobal::getnum();

    if((bnum<1)||(bnum>100))

    {

만약 사용자가 입력한 도서 구분자가 범위를 벗어나면 메시지를 출력하고 0을 반환하세요.

        cout<<"범위를 벗어난 도서 구분자입니다."<<endl;

        return 0;

    }

추가할 도서 제목을 입력받습니다.

    cout<<"도서 제목:";

    string title = ehglobal::getstr();

도서 개체를 생성하여 벡터 books에 보관하세요. 여기에서는 인덱스를 사용하기로 했죠.

    books[bnum-1] =new Book(isbn,bnum,title);

생성한 도서 개체를 반환하세요.

    return books[bnum-1];

}

int Genre::GetGNum()const

{

장르 번호 접근자에서는 멤버 필드 gnum을 반환하세요.

    return gnum;

}

 

Book 클래스에 isbn, 도서 번호, 도서 제목을 위한 멤버 필드를 추가하세요.

class Book

{

    const string isbn;

    int bnum;

    string title;

public:

생성자에 isbn, 도서 번호, 도서 제목을 입력인자로 받게 수정하세요.

    Book(string isbn,int bnum,string title);   

도서 개체 내부에는 다른 개체를 생성하여 관리하는 부분이 없으니 소멸자를 지우세요.

};

 

도서 생성자에서는 입력 인자로 받은 값들로 멤버 필드를 설정하세요. 특히 isbn은 상수화 멤버이므로 초기 설정해야 합니다.

Book:: Book(string isbn,int bnum,string title):isbn(isbn)

{

    this->bnum = bnum;

    this->title = title;

}

 

 

디폴트로 제공했던 소멸자는 지우세요.

반응형