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
반응형