Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstring>
- char* copy_string(const char* source) {
- char* str = new char[strlen(source) + 1];
- strncpy(str, source, strlen(source));
- str[strlen(source)] = 0;
- return str;
- }
- using namespace std;
- class Book {
- protected:
- char ISBN[20];
- char naslov[50];
- char avtor[30];
- float cena;
- public:
- Book(const char* ISBN = 0, const char* naslov = 0, const char* avtor = 0, const float cena = 0) {
- strcpy(this->ISBN, ISBN);
- strcpy(this->naslov, naslov);
- strcpy(this->avtor, avtor);
- this->cena = cena;
- }
- virtual float bookPrice() = 0;
- // setters
- void setISBN(char* isbn) { strcpy(ISBN, isbn); }
- friend bool operator>(Book& obj1, Book& obj2) {
- return obj1.bookPrice() > obj2.bookPrice();
- }
- friend ostream& operator<<(ostream& out, Book& obj) {
- out << obj.ISBN << ": " << obj.naslov << ", " << obj.avtor << " " << obj.bookPrice() << endl;
- return out;
- }
- virtual ~Book() {}
- };
- float Book::bookPrice() {
- return cena;
- }
- class OnlineBook : public Book {
- private:
- char* url;
- int golemina;
- public:
- OnlineBook(const char* ISBN, const char* naslov, const char* avtor, const float cena, const char* url = "", const int golemina = 0)
- : Book(ISBN, naslov, avtor, cena) {
- this->url = copy_string(url);
- this->golemina = golemina;
- }
- OnlineBook(OnlineBook& obj) : Book(obj.ISBN, obj.naslov, obj.avtor, obj.cena) {
- url = copy_string(obj.url);
- golemina = obj.golemina;
- }
- OnlineBook& operator=(OnlineBook& obj) {
- if(this != &obj) {
- strcpy(ISBN, obj.ISBN);
- strcpy(naslov, obj.naslov);
- strcpy(avtor, obj.avtor);
- cena = obj.cena;
- delete [] url;
- url = copy_string(obj.url);
- golemina = obj.golemina;
- }
- return *this;
- }
- float bookPrice() {
- if(golemina > 20)
- return Book::bookPrice() * 1.20;
- return Book::bookPrice();
- }
- ~OnlineBook() {
- delete [] url;
- }
- };
- class PrintBook : public Book {
- private:
- float masa;
- bool inStock;
- public:
- PrintBook(const char* ISBN, const char* naslov, const char* avtor, const float cena, const float masa = 0, const bool inStock = false)
- : Book(ISBN, naslov, avtor, cena) {
- this->masa = masa;
- this->inStock = inStock;
- }
- float bookPrice() {
- if(masa > 0.7)
- return Book::bookPrice() * 1.15;
- return Book::bookPrice();
- }
- ~PrintBook() {}
- };
- void mostExpensiveBook (Book** books, int n) {
- int vk_online = 0, vk_pecateni = 0;
- Book* mostExpensive = books[0];
- for(int i = 0; i < n; ++i) {
- if(i != 0)
- if(*books[i] > *mostExpensive)
- mostExpensive = books[i];
- OnlineBook* ob = dynamic_cast<OnlineBook*>(books[i]);
- PrintBook* pb = dynamic_cast<PrintBook*>(books[i]);
- if(ob != NULL) vk_online++;
- if(pb != NULL) vk_pecateni++;
- }
- cout << "FINKI-Education" << endl;
- cout << "Total number of online books: " << vk_online << endl;
- cout << "Total number of print books: " << vk_pecateni << endl;
- cout << "The most expensive book is: " << endl;
- cout << *mostExpensive;
- }
- int main(){
- char isbn[20], title[50], author[30], url[100];
- int size, tip;
- float price, weight;
- bool inStock;
- Book **books;
- int n;
- int testCase;
- cin >> testCase;
- if (testCase == 1){
- cout << "====== Testing OnlineBook class ======" << endl;
- cin >> n;
- books = new Book *[n];
- for (int i = 0; i < n; i++){
- cin >> isbn;
- cin.get();
- cin.getline(title, 50);
- cin.getline(author, 30);
- cin >> price;
- cin >> url;
- cin >> size;
- cout << "CONSTRUCTOR" << endl;
- books[i] = new OnlineBook(isbn, title, author, price, url, size);
- cout << "OPERATOR <<" << endl;
- cout << *books[i];
- }
- cout << "OPERATOR >" << endl;
- cout << "Rezultat od sporedbata e: " << endl;
- if (*books[0] > *books[1])
- cout << *books[0];
- else
- cout << *books[1];
- }
- if (testCase == 2){
- cout << "====== Testing OnlineBook CONSTRUCTORS ======" << endl;
- cin >> isbn;
- cin.get();
- cin.getline(title, 50);
- cin.getline(author, 30);
- cin >> price;
- cin >> url;
- cin >> size;
- cout << "CONSTRUCTOR" << endl;
- OnlineBook ob1(isbn, title, author, price, url, size);
- cout << ob1 << endl;
- cout << "COPY CONSTRUCTOR" << endl;
- OnlineBook ob2(ob1);
- cin >> isbn;
- ob2.setISBN(isbn);
- cout << ob1 << endl;
- cout << ob2 << endl;
- cout << "OPERATOR =" << endl;
- ob1 = ob2;
- cin >> isbn;
- ob2.setISBN(isbn);
- cout << ob1 << endl;
- cout << ob2 << endl;
- }
- if (testCase == 3){
- cout << "====== Testing PrintBook class ======" << endl;
- cin >> n;
- books = new Book *[n];
- for (int i = 0; i < n; i++){
- cin >> isbn;
- cin.get();
- cin.getline(title, 50);
- cin.getline(author, 30);
- cin >> price;
- cin >> weight;
- cin >> inStock;
- cout << "CONSTRUCTOR" << endl;
- books[i] = new PrintBook(isbn, title, author, price, weight, inStock);
- cout << "OPERATOR <<" << endl;
- cout << *books[i];
- }
- cout << "OPERATOR >" << endl;
- cout << "Rezultat od sporedbata e: " << endl;
- if (*books[0] > *books[1])
- cout << *books[0];
- else
- cout << *books[1];
- }
- if (testCase == 4){
- cout << "====== Testing method mostExpensiveBook() ======" << endl;
- cin >> n;
- books = new Book *[n];
- for (int i = 0; i<n; i++){
- cin >> tip >> isbn;
- cin.get();
- cin.getline(title, 50);
- cin.getline(author, 30);
- cin >> price;
- if (tip == 1) {
- cin >> url;
- cin >> size;
- books[i] = new OnlineBook(isbn, title, author, price, url, size);
- }
- else {
- cin >> weight;
- cin >> inStock;
- books[i] = new PrintBook(isbn, title, author, price, weight, inStock);
- }
- }
- mostExpensiveBook(books, n);
- }
- for (int i = 0; i<n; i++) delete books[i];
- delete[] books;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement