도서관 관리 시스템 구현(완)

정혜창·2025년 1월 2일
1

내일배움캠프

목록 보기
17/43

Book.h

#ifndef BOOK
#define BOOK
#include <string>

class Book {
private:
	std::string title;
	std::string author;
public:
	Book(std::string booktitle, std::string authorname) : title(booktitle), author(authorname) {}
	~Book() {}
	 
	std::string gettitle() const {
		return title;
	}

	std::string getauthor() const {
		return author;
	}
};

#endif 

BookManager.h

#ifndef BOOK_MANAGER
#define BOOK_MANAGER
#include <string>
#include <vector>
#include "Book.h"
#include <iostream>

class Book_Manager {
private:
	std::vector<Book> books;

protected:
	Book* FindBookbyTitle(const std::string& title) {
		for (int i = 0; i < books.size(); i++) {
			if (books[i].gettitle() == title) {
				return &books[i];
			}
		}
		return nullptr;
	}
	Book* FindBookbyAuthor(const std::string& author) {
		for (int i = 0; i < books.size(); i++) {
			if (books[i].getauthor() == author) {
				return &books[i];
			}
		}
		return nullptr;
	}

public:
	// 책을 객체에 추가
	void AddBook(const Book& newbook) {
		books.push_back(newbook);
	}
	// 책
	void DispalyAllBooks() {
		std::cout << "NBC 도서관의 책 목록" << std::endl << "=============================" << std::endl;
		for (int i = 0; i < books.size(); i++) {
			std::cout << "책 제목 : " << books[i].gettitle() << std::endl << "저자 : " << books[i].getauthor() << std::endl
				<< "-----------------------------" << std::endl;
		}
	}

	Book* GetBookbyTitle(const std::string& title) {
		Book* book = FindBookbyTitle(title);
		if (book == nullptr) {
			std::cout << "찾으신 책인 " << char(34) << title << char(34) << " 은 소장하고 있지 않습니다. " << std::endl;
		}
		else {
			std::cout << "찾으신 책은 현재 소장하고 있습니다. " << std::endl;
			return book;
		}
	}

	Book* GetBookbyAuthor(const std::string& author) {
		Book* book = FindBookbyAuthor(author);
		if (book == nullptr) {
			std::cout << char(34) << author << char(34) << " 저자의 책은 소장하고 있지 않습니다. " << std::endl;
		}
		else {
			std::cout << "찾으신 책은 현재 소장하고 있습니다. " << std::endl;
			return book;
		}
	}
};

#endif

BorrowManager.h

#ifndef BORROW_MANAGER
#define BORROW_MANAGER
#include <map>
#include "Book.h"
#include "BookManager.h"
#include <unordered_map>
#include <vector>
#include <iostream>

class Borrow_Manager {
	
private:

	std::unordered_map<std::string, int> stock; // 책 쌓인 수 

public:
	// 책 재고 초기화
	void initializeStock(Book book) {
		stock[book.gettitle()] = 3;
	}
	
	void displayStock(const std::string& title) {
		std::cout << char(34) << title << char(34) << " 의 재고 수량 : " << stock[title] << std::endl;
	}

	void borrowBook(const std::string& title) {
		if (stock[title] > 0) {
			stock[title]--;
		}
		else {
			std::cout << "책의 재고가 없습니다." << std::endl;
		}		
	}

	void returnBook(const std::string& title) {
		if (stock[title] < 3) {
			stock[title]++;
		}
		else {
			std::cout << "잘못된 경로의 반납입니다." << std::endl;
		}
	}
};

#endif

main.cpp

#include <iostream>
#include <map>
#include <string>
#include <vector>
#include "Book.h"
#include "BookManager.h"
#include "BorrowManager.h"

// 구분 선
void printline() {
	for (int i = 0; i < 29; i++) {
		std::cout << "=";
	}
	std::cout << std::endl;
}


int main() {
	
	Book_Manager book_manager;
	Borrow_Manager borrow_manager;
	
	// 책 생성
	Book book1("Do it! C++ 완전 정복", "문종채");
	Book book2("Effective C++ third Edition", "Scott Meyers");
	Book book3("A tour of C++", "Bjarne Stroupstrup");

	// 책 목록에 책 추가
	book_manager.AddBook(book1);
	book_manager.AddBook(book2);
	book_manager.AddBook(book3);

	// 책 목록
	book_manager.DispalyAllBooks();

	
	// 책 있는지 확인
	book_manager.GetBookbyTitle("C++ 박살내보자");
	book_manager.GetBookbyAuthor("정혜창");
	book_manager.GetBookbyAuthor("문종채");
	book_manager.GetBookbyTitle("Effective C++ third Edition");
	printline();

	// 책 재고 초기화
	borrow_manager.initializeStock(book1);
	borrow_manager.initializeStock(book2);
	borrow_manager.initializeStock(book3);

	// 책 재고 현황
	borrow_manager.displayStock("Do it! C++ 완전 정복");
	borrow_manager.displayStock("Effective C++ third Edition");
	borrow_manager.displayStock("A tour of C++");

	printline(); 
	// 책 대여
	borrow_manager.borrowBook("Do it! C++ 완전 정복"); // stock : 2권
	borrow_manager.displayStock("Do it! C++ 완전 정복");
	borrow_manager.borrowBook("Do it! C++ 완전 정복"); // stock : 1권
	borrow_manager.displayStock("Do it! C++ 완전 정복");
	borrow_manager.borrowBook("Do it! C++ 완전 정복"); // stock : 0권
	borrow_manager.displayStock("Do it! C++ 완전 정복");
	borrow_manager.borrowBook("Do it! C++ 완전 정복"); // 대여 불가

	printline();
	// 책 반납
	borrow_manager.returnBook("Do it! C++ 완전 정복"); 
	borrow_manager.displayStock("Do it! C++ 완전 정복"); // stock : 1권
	borrow_manager.returnBook("Do it! C++ 완전 정복");
	borrow_manager.displayStock("Do it! C++ 완전 정복"); // stock : 2권

	return 0;
}

실행창


회고

이번 작업을 할때는 오류가 거의 나지 않았다. 그래도 커스텀 벡터를 한번 만들어 봤다고 진짜 아주 조금 익숙해진 기분도 든다. 그러나 아직 미숙한건 내가 가장 잘안다.

이번 과제를 하면서 가장 아쉬웠던 점은 재고 수량을 만들 때 원래 저자의 이름으로도 대여와 반납이 가능하게 하려고 했는데 그게 쉽지 않았다. 뭔가 map을 두 개 만들어서 하나는 키와 값을 (타이틀, 재고) 다른건 (저자, 재고) 이런 느낌으로 해서 대여를 하는 순간 같이 재고가 빠지고 반납하면 재고가 같이 늘어나게 하면 될 것 같은데.. 쉽게 되지 않았다. 내일 당장 제출이라 시간이 부족하기도 하고 아직 map 컨테이너와 반복자 iterator에 대해 많이 부족해서 그런지 쉽게 구현이 되지 않았다. 이번주말에 공부를 해서 한번 도전해봐야 겠다.

이번주 과제인 '커스텀벡터 구현' 과 '도서관 관리 시스템 구현' 둘 다 쉽지 않았지만 OOP에 대해 조금은 다가서게 해주었던 과제였던 것 같다. 그러나 여전히 예외처리를 하려고 하면 머리속이 새하얘지고 map, set, iterator, initializer_list, operator 등 전반적으로 STL에 대해 많이 미숙한 것 같다. 언제쯤 휙휙 써내려 갈 수 있을지...

오늘로써 C++ 공부를 시작한지 11일? 12일? 대충 2주 정도 되는 날이다. 게임 개발자의 길은 멀고도 멀다. 하루 빨리 도끼를 던지거나, 담장을 넘거나, 몹에 피격이 되고, 몹을 때리는 등 모든 것을 구현해 보고 미칠 것 같다. 역시 하나의 세계를 구현하는 일은 녹록치 않은 것 같다.

profile
Unreal 1기

0개의 댓글

Powered by GraphCDN, the GraphQL CDN