728x90
반응형

구현 내용은 다음과 같습니다.

  • 클래스의 이름은 SimpleVector라고 합니다.
  • 타입에 의존하지 않고 데이터를 받을수 있는 배열을 멤버변수로 갖습니다.
  • 생성자는 아래와 같이 구현 합니다.
    • 기본 생성자는 크기가 10인 배열을 만듭니다.
    • 숫자를 하나 받는 생성자는 해당 숫자에 해당되는 크기의 배열을 만듭니다.
  • 아래와 같은 멤버함수를 구현 합니다.
    • push_back 인자로 받은 원소를 맨 뒤에 추가 합니다. 반환값은 없습니다. 배열의 크기가 꽉 찼는데 원소가 더 들어올경우 아무 동작도 하지 않습니다.
    • pop_back은 벡터의 마지막 원소를 제거 합니다. 만약 제거할 원소가 없다면 아무 동작도 하지 않으며, 인자 및 반환값은 없습니다.
    • size는 인자가 없고 현재 원소의 개수를 반환합니다.
    • capacity 현재 내부 배열의 크기를 반환합니다.
  • 복사 생성자를 구현 합니다.
  • 아래 멤버함수를 추가로 변경/구현 합니다.
    • push_back에서 배열의 크기가 꽉 찼는데 원소가 더 들어올경우, 기존 배열보다 크기를 5만큼 더 늘리고 새로운 원소까지 추가됩니다.(기존에 있던 값도 유지되야 합니다.)
    • resize는 정수 하나를 인자로 받습니다. 해당 정수가 현재 배열의 크기보다 작으면 아무 동작도 하지 않습니다. 만약 현재 배열보다 크기가 크면 해당 값만큼 크기를 재할당 합니다.(기존 원소는 그대로 있어야 합니다.)
    • sortData는 내부 데이터를 정렬하는 함수 입니다. 직접 정렬하지 않고 STL의 sort함수를 활용해서 정렬 합니다.

 

구현 결과입니다.

#include <iostream>
#include <algorithm> // For std::sort

template <typename T>
class SimpleVector {
private:
    T* data; 
    int current_size; 
    int capacity_size; 

public:
    SimpleVector() : current_size(0), capacity_size(10) {
        data = new T[capacity_size];
    }

    SimpleVector(int size) : current_size(0), capacity_size(size) {
        data = new T[capacity_size];
    }

		// 복사 생성자를 구현 합니다.
    SimpleVector(const SimpleVector& other) : current_size(other.current_size), capacity_size(other.capacity_size) {
        data = new T[capacity_size];
        for (int i = 0; i < current_size; ++i) {
            data[i] = other.data[i];
        }
    }

    ~SimpleVector() {
        delete[] data;
    }

		// resize는 정수 하나를 인자로 받습니다.  
		// 해당 정수가 현재 배열의 크기보다 작으면 아무 동작도 하지 않습니다. 
		// 만약 현재 배열보다 크기가 크면 해당 값만큼 크기를 재할당 합니다.(기존 원소는 그대로 있어야 합니다.)
    void resize(int new_capacity) {
        if (new_capacity <= capacity_size) {
            return; 
        }

        T* new_data = new T[new_capacity];
        for (int i = 0; i < current_size; ++i) {
            new_data[i] = data[i];
        }

        delete[] data;
        data = new_data;
        capacity_size = new_capacity;
    }

		// push_back에서 배열의 크기가 꽉 찼는데 원소가 더 들어올경우, 기존 배열보다 크기를 5만큼 더 늘리고 새로운 원소까지 추가됩니다.(기존에 있던 값도 유지되야 합니다.)
    void push_back(const T& value) {
        if (current_size == capacity_size) {
            resize(capacity_size + 5); 
        }
        data[current_size++] = value;
    }


    void pop_back() {
        if (current_size > 0) {
            --current_size;
        }
    }

    int size() const {
        return current_size;
    }

    int capacity() const {
        return capacity_size;
    }

		// sortData는 내부 데이터를 정렬하는 함수 입니다. 직접 정렬하지 않고 STL의 sort함수를 활용해서 정렬 합니다. 
    void sortData() {
        std::sort(data, data + current_size);
    }
};

 

 

두번째로는 

  • 기존 도서관 관리 프로그램에 검색 기능을 추가해주세요
    • 책 제목으로 검색이 가능해야 합니다.
    • 작가로 검색이 가능해야 합니다.
    • 책 제목이 동일한 경우는 없다고 가정 합니다.
  • 기존 도서관 관리 프로그램에 필수 기능을 추가한 상태에서 아래 대여 기능을 추가해주세요
    • 특정 책의 대여 여부를 알 수 있어야 합니다.
    • 책의 이름으로 대여 여부를 검색하고 대여가 아닌 경우 대여할 수 있어야 합니다.
    • 책의 작가로 대여 여부를 검색하고 대여가 아닌 경우 대여할 수 있어야 합니다.
    • 책을 반납할 수 있어야 합니다.
    • 모든 책의 재고는 난이도를 낮추기 위해 3권으로 통일 합니다.

 

구현결과입니다.

 

#include <iostream>
#include <vector>
#include <string>

using namespace std;

class Book {
public:
    string title;
    string author;

    Book(const string& title, const string& author)
        : title(title), author(author) {}
};

class BookManager {
private:
    vector<Book> books; // 책 목록 저장

public:
    // 책 추가 메서드
    void addBook(const string& title, const string& author) {
        books.push_back(Book(title, author)); // push_back 사용
        cout << "책이 추가되었습니다: " << title << " by " << author << endl;
    }

    // 모든 책 출력 메서드
    void displayAllBooks() const {
        if (books.empty()) {
            cout << "현재 등록된 책이 없습니다." << endl;
            return;
        }

        cout << "현재 도서 목록:" << endl;
        for (size_t i = 0; i < books.size(); i++) { // 일반적인 for문 사용
            cout << "- " << books[i].title << " by " << books[i].author << endl;
        }
    }

    // 책 제목으로 검색
    void searchByTitle(const string& title) const {
        for (const auto& book : books) {
            if (book.title == title) {
                cout << "검색 결과: " << book.title << " by " << book.author << endl;
                return;
            }
        }
        cout << "책 제목 '" << title << "'를 찾을 수 없습니다." << endl;
    }

    // 책 작가로 검색
    void searchByAuthor(const string& author) const {
        bool found = false;
        cout << "저자 '" << author << "'의 책 목록:" << endl;
        for (const auto& book : books) {
            if (book.author == author) {
                cout << "- " << book.title << endl;
                found = true;
            }
        }
        if (!found) {
            cout << "저자 '" << author << "'의 책을 찾을 수 없습니다." << endl;
        }
    }
};

int main() {
    BookManager manager;

    while (true) {
        cout << "\n도서관 관리 프로그램" << endl;
        cout << "1. 책 추가" << endl;
        cout << "2. 모든 책 출력" << endl;
        cout << "3. 제목으로 책 검색" << endl; // 제목 검색
        cout << "4. 저자로 책 검색" << endl; // 저자 검색
        cout << "5. 종료" << endl; // 프로그램 종료
        cout << "선택: ";

        int choice;
        cin >> choice;

        if (choice == 1) {
            string title, author;
            cout << "책 제목: ";
            cin.ignore();
            getline(cin, title);
            cout << "책 저자: ";
            getline(cin, author);
            manager.addBook(title, author);
        } else if (choice == 2) {
            manager.displayAllBooks();
        } else if (choice == 3) {
            string title;
            cout << "검색할 책 제목: ";
            cin.ignore();
            getline(cin, title);
            manager.searchByTitle(title);
        } else if (choice == 4) {
            string author;
            cout << "검색할 책 저자: ";
            cin.ignore();
            getline(cin, author);
            manager.searchByAuthor(author);
        } else if (choice == 5) {
            cout << "프로그램을 종료합니다." << endl;
            break;
        } else {
            cout << "잘못된 입력입니다. 다시 시도하세요." << endl;
        }
    }

    return 0;
}
728x90
반응형