diff --git a/.vs/CMake Overview b/.vs/CMake Overview new file mode 100644 index 0000000..e69de29 diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json new file mode 100644 index 0000000..e0ab1de --- /dev/null +++ b/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": "x64-Debug (по умолчанию)" +} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 0000000..8df5e92 --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,10 @@ +{ + "ExpandedNodes": [ + "", + "\\include", + "\\src", + "\\tests" + ], + "SelectedNode": "\\tests\\runner_tests.cpp", + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/.vs/h01_cpp_basics-UnluckyDen/v16/.suo b/.vs/h01_cpp_basics-UnluckyDen/v16/.suo new file mode 100644 index 0000000..4863355 Binary files /dev/null and b/.vs/h01_cpp_basics-UnluckyDen/v16/.suo differ diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 0000000..59d7d68 Binary files /dev/null and b/.vs/slnx.sqlite differ diff --git a/README.md b/README.md index 94d843d..53f00a1 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ## ФИО студента -**Пожалуйста, добавьте сюда свое ФИО** +Гладких Даниил Сергеевич ## Описание задания diff --git a/src/author.cpp b/src/author.cpp index 3f426bc..feb15c0 100644 --- a/src/author.cpp +++ b/src/author.cpp @@ -5,13 +5,24 @@ // 1. реализуйте конструктор ... Author::Author(const std::string &full_name, int age, Sex sex) { // валидация аргументов (здесь был Рамиль) - if (age < kMinAuthorAge) { - throw std::invalid_argument("Author::age must be greater than " + std::to_string(kMinAuthorAge)); - } - - if (full_name.empty()) { - throw std::invalid_argument("Author::full_name must not be empty"); - } + if (age < kMinAuthorAge) + { + throw std::invalid_argument("Author::age must be greater than " + std::to_string(kMinAuthorAge)); + } + else + { + age_ = age; + } + + if (full_name.empty()) + { + throw std::invalid_argument("Author::full_name must not be empty"); + } + else + { + full_name_ = full_name; + } + sex_ = sex; // Tip 1: инициализируйте поля } diff --git a/src/book.cpp b/src/book.cpp index 24ef599..6b7f207 100644 --- a/src/book.cpp +++ b/src/book.cpp @@ -10,27 +10,37 @@ Book::Book(const std::string &title, const std::vector &authors) { // валидация аргументов - if (title.empty()) { - throw std::invalid_argument("Book::title cannot be empty"); - } - - if (content.empty()) { - throw std::invalid_argument( - "Book::content cannot be empty"); - } - - if (authors.empty()) { - throw std::invalid_argument("Book::authors cannot be empty"); - } - - // Tip 1: остались слезы на щеках, осталось лишь инициализировать поля ... + if (title.empty()) { + throw std::invalid_argument("Book::title cannot be empty"); + } + + if (content.empty()) { + throw std::invalid_argument( + "Book::content cannot be empty"); + } + + if (authors.empty()) { + throw std::invalid_argument("Book::authors cannot be empty"); + } + title_ = title; + content_ = content; + genre_ = genre; + publisher_ = publisher; + authors_ = authors; } + // 2. реализуйте метод ... -bool Book::AddAuthor(const Author &author) { - // здесь мог бы быть ваш сногсшибающий код ... - // Tip 1: для поиска дубликатов можно использовать цикл for-each - return false; +bool Book::AddAuthor(const Author& author) { + bool flag = true; + for (const Author& elem : authors_) { + if (elem.GetFullName() == author.GetFullName()) { + flag = false; + break; + } + } + if (flag) authors_.push_back(author); + return flag; } // РЕАЛИЗОВАНО diff --git a/src/book_store.cpp b/src/book_store.cpp index 6f296b4..5e3d6d6 100644 --- a/src/book_store.cpp +++ b/src/book_store.cpp @@ -4,37 +4,63 @@ #include // invalid_argument // 1. реализуйте функцию ... -ResizeStorageStatus resize_storage(Book *&storage, int size, int new_capacity) { - // здесь мог бы быть ваш разносторонний и многогранный код ... - // Tip 1: проведите валидацию аргументов функции - // Tip 2: не забудьте высвободить ранее выделенную память под хранилище - return ResizeStorageStatus::SUCCESS; +ResizeStorageStatus resize_storage(Book*& storage, int size, int new_capacity) { + // здесь мог бы быть ваш разносторонний и многогранный код ... + // Tip 1: проведите валидацию аргументов функции + if (storage == nullptr) + return ResizeStorageStatus::NULL_STORAGE; + if (new_capacity <= size) + return ResizeStorageStatus::INSUFFICIENT_CAPACITY; + if (size < 0) + return ResizeStorageStatus::NEGATIVE_SIZE; + // Tip 2: не забудьте высвободить ранее выделенную память под хранилище + + Book* newStorage = storage; + storage = new Book[new_capacity]; + + std::copy(newStorage, newStorage + size, storage); + delete[] newStorage; + + + return ResizeStorageStatus::SUCCESS; } // 2. реализуйте конструктор ... -BookStore::BookStore(const std::string &name) : name_{name} { - // валидация аргумента - if (name.empty()) { - throw std::invalid_argument("BookStore::name must not be empty"); - } +BookStore::BookStore(const std::string& name) : name_{ name } { + // валидация аргумента + if (name.empty()) { + throw std::invalid_argument("BookStore::name must not be empty"); + } - // здесь мог бы быть ваш сотрясающий землю и выделяющий память код ... + // здесь мог бы быть ваш сотрясающий землю и выделяющий память код ... + this->name_ = name; + this->storage_ = new Book[kInitStorageCapacity]; + this->storage_size_ = 0;// + this->storage_capacity_ = kInitStorageCapacity; } // 3. реализуйте деструктор ... BookStore::~BookStore() { - // здесь мог бы быть ваш высвобождающий разум от негатива код ... - // Tip 1: я свободен ..., словно память в куче: не забудьте обнулить указатель + delete[] storage_; + storage_ = nullptr; + storage_capacity_ = 0; + storage_size_ = 0; + // здесь мог бы быть ваш высвобождающий разум от негатива код ... + // Tip 1: я свободен ..., словно память в куче: не забудьте обнулить указатель } // 4. реализуйте метод ... -void BookStore::AddBook(const Book &book) { - if (storage_size_ == storage_capacity_) { - // здесь мог бы быть ваш умопомрачительный код ... - // Tip 1: используйте функцию resize_storage_internal, задав новый размер хранилища - // Tip 2: не забудьте обработать статус вызова функции - } - // Tip 3: не забудьте добавить книгу в наше бездонное хранилище ... +void BookStore::AddBook(const Book& book) { + if (storage_size_ == storage_capacity_) { + // здесь мог бы быть ваш умопомрачительный код ... + // Tip 1: используйте функцию resize_storage_internal, задав новый размер хранилища + // Tip 2: не забудьте обработать статус вызова функции + ResizeStorageStatus status = resize_storage_internal(storage_capacity_ + kCapacityCoefficient); + if (status != ResizeStorageStatus::SUCCESS) + throw std::invalid_argument(""); + } + storage_[storage_size_] = book; + storage_size_++; } // РЕАЛИЗОВАНО