Advertisement
196040

OOP zadaci za vezbanje 2 FINKI Izdavacka kukja

Jun 5th, 2020
299
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.59 KB | None | 0 0
  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. class Book { //Издавачката куќа FINKI-Education издава онлајн и печатени книги.
  5. private://За секоја книга се чуваат податоци за
  6.     char isbn[50];//ISBN бројот (низа од најмногу 20 знаци),
  7.     char naslov[50];//насловот (низа од најмногу 50 знаци),
  8.     char avtor[30];//авторот (низа од најмногу 30 знаци) и
  9.     double osnovna;//основната цена изразена во $ (реален број).
  10. public://Класата за опишување на книгите е апстрактна (5 поени).
  11.     Book(char * isbn = "", char * naslov = "", char * avtor = "", double osnovna = 0.0) {
  12.         strcpy(this->isbn, isbn);
  13.         strcpy(this->naslov, naslov);
  14.         strcpy(this->avtor, avtor);
  15.         this->osnovna = osnovna;
  16.     }
  17.     Book(const Book &copy) {
  18.         strcpy(this->isbn, copy.isbn);
  19.         strcpy(this->naslov, copy.naslov);
  20.         strcpy(this->avtor, copy.avtor);
  21.         this->osnovna = copy.osnovna;
  22.     }
  23.     Book &operator=(const Book &copy) {
  24.         if(this!=&copy) {
  25.             strcpy(this->isbn, copy.isbn);
  26.             strcpy(this->naslov, copy.naslov);
  27.             strcpy(this->avtor, copy.avtor);
  28.             this->osnovna = copy.osnovna;
  29.         }
  30.         return *this;
  31.     }
  32.     virtual double bookPrice() { //Метод bookPrice, за пресметување на продажната цена на книгата на следниот начин:
  33.         return this->osnovna;
  34.     }
  35.     void setISBN(char * isbn) {
  36.         strcpy(this->isbn, isbn);
  37.     }
  38.     bool operator>(Book &compare) {// Преоптоварен оператор > за споредба на две книги од каков било вид
  39.         return this->bookPrice() > compare.bookPrice();//според нивната цена. (5 поени)
  40.     }
  41.     friend ostream &operator<<(ostream &o, Book &print) {// Преоптоварен оператор << за печатење на податоците
  42.         o<<print.isbn<<": "; //за книгите во формат: (5 поени)
  43.         o<<print.naslov<<", "<<print.avtor<<" "<<print.bookPrice();//[ISBN]: [Наслов], [Автор] [Продажна цена]
  44.         o<<endl;
  45.         return o;
  46.     }
  47. };
  48. class OnlineBook : public Book { //За секоја онлајн книга
  49. private://дополнително се чуваат податоци за
  50.     char * url;//url од каде може да се симне (динамички резервирана низа од знаци) и
  51.     int golemina; //големината изразена во MB (цел број).
  52. public:
  53.     OnlineBook(char * isbn = "", char * naslov = "", char * avtor = "", double osnovna = 0.0, char * url = "", int golemina = 0) : Book(isbn, naslov, avtor, osnovna) {
  54.         this->golemina = golemina;
  55.         this->url = new char[strlen(url)+1];
  56.         strcpy(this->url, url);
  57.     }
  58.     OnlineBook(const OnlineBook &copy) : Book(copy) {
  59.         this->golemina = copy.golemina;
  60.         this->url = new char[strlen(copy.url)+1];
  61.         strcpy(this->url, copy.url);
  62.     }
  63.     double bookPrice() { //За онлајн книга - цената се зголемува за 20% од основната цена
  64.         double tmp = Book::bookPrice();
  65.         if(this->golemina>20)//ако книгата е поголема од 20MB
  66.             tmp = tmp * 1.2;
  67.         return tmp;
  68.     }
  69. };
  70. class PrintBook : public Book { //За секоја печатена книга
  71. private://дополнително се чуваат податоци за
  72.     double masa;//масата изразена во килограми (реален број) и
  73.     bool zaliha;//дали ја има на залиха (логичка променлива). (5 поени)
  74. public:
  75.     PrintBook(char * isbn = "", char * naslov = "", char * avtor = "", double osnovna = 0.0, double masa = 0.0, bool zaliha = false) : Book(isbn, naslov, avtor, osnovna) {
  76.         this->masa = masa;
  77.         this->zaliha = zaliha;
  78.     }
  79.     PrintBook(const PrintBook &copy) : Book(copy) {
  80.         this->masa = copy.masa;
  81.         this->zaliha = copy.zaliha;
  82.     }
  83.     double bookPrice() {
  84.         double tmp = Book::bookPrice();//За печатена книга - цената се зголемува за 15%
  85.         if(this->masa > 0.7) //основната цена ако масата на книгата е поголема од 0.7kg
  86.             tmp = tmp * 1.15;
  87.         return tmp;
  88.     }
  89. };
  90. void mostExpensiveBook (Book** books, int n) { //Да се имплементира функција mostExpensiveBook со потпис:
  91.     int indeks=0; //void mostExpensiveBook (Book** books, int n)
  92.     int cfob = 0, cfpb = 0;
  93.     double max = books[0]->bookPrice(); //во која се печати вкупниот број на онлајн,
  94.     for(int i=0; i<n; i++) {// односно, печатени книги во проследената низа посебно.
  95.         OnlineBook * p1 = dynamic_cast<OnlineBook *>(books[i]);
  96.         if(p1) cfob++;
  97.         else cfpb++;
  98.     }
  99.     cout<<"FINKI-Education"<<endl;
  100.     cout<<"Total number of online books: "<<cfob<<endl;
  101.     cout<<"Total number of print books: "<<cfpb<<endl;
  102.     for(int i=0; i<n; i++)
  103.         if(books[i]->bookPrice() > max) {
  104.             max = books[i]->bookPrice();
  105.             indeks = i;
  106.         }
  107.     cout<<"The most expensive book is: "<<endl;
  108.     cout<<*books[indeks];//Потоа се наоѓа и печати најскапата книга. (5 поени)
  109. }
  110. int main() {
  111.  
  112.     char isbn[20], title[50], author[30], url[100];
  113.     int size, tip;
  114.     float price, weight;
  115.     bool inStock;
  116.     Book  **books;
  117.     int n;
  118.  
  119.     int testCase;
  120.     cin >> testCase;
  121.  
  122.     if (testCase == 1) {
  123.         cout << "====== Testing OnlineBook class ======" << endl;
  124.         cin >> n;
  125.         books = new Book *[n];
  126.  
  127.         for (int i = 0; i < n; i++) {
  128.             cin >> isbn;
  129.             cin.get();
  130.             cin.getline(title, 50);
  131.             cin.getline(author, 30);
  132.             cin >> price;
  133.             cin >> url;
  134.             cin >> size;
  135.             cout << "CONSTRUCTOR" << endl;
  136.             books[i] = new OnlineBook(isbn, title, author, price, url, size);
  137.             cout << "OPERATOR <<" << endl;
  138.             cout << *books[i];
  139.         }
  140.         cout << "OPERATOR >" << endl;
  141.         cout << "Rezultat od sporedbata e: " << endl;
  142.         if (*books[0] > *books[1])
  143.             cout << *books[0];
  144.         else
  145.             cout << *books[1];
  146.     }
  147.     if (testCase == 2) {
  148.         cout << "====== Testing OnlineBook CONSTRUCTORS ======" << endl;
  149.         cin >> isbn;
  150.         cin.get();
  151.         cin.getline(title, 50);
  152.         cin.getline(author, 30);
  153.         cin >> price;
  154.         cin >> url;
  155.         cin >> size;
  156.         cout << "CONSTRUCTOR" << endl;
  157.         OnlineBook ob1(isbn, title, author, price, url, size);
  158.         cout << ob1 << endl;
  159.         cout << "COPY CONSTRUCTOR" << endl;
  160.         OnlineBook ob2(ob1);
  161.         cin >> isbn;
  162.         ob2.setISBN(isbn);
  163.         cout << ob1 << endl;
  164.         cout << ob2 << endl;
  165.         cout << "OPERATOR =" << endl;
  166.         ob1 = ob2;
  167.         cin >> isbn;
  168.         ob2.setISBN(isbn);
  169.         cout << ob1 << endl;
  170.         cout << ob2 << endl;
  171.     }
  172.     if (testCase == 3) {
  173.         cout << "====== Testing PrintBook class ======" << endl;
  174.         cin >> n;
  175.         books = new Book *[n];
  176.  
  177.         for (int i = 0; i < n; i++) {
  178.             cin >> isbn;
  179.             cin.get();
  180.             cin.getline(title, 50);
  181.             cin.getline(author, 30);
  182.             cin >> price;
  183.             cin >> weight;
  184.             cin >> inStock;
  185.             cout << "CONSTRUCTOR" << endl;
  186.             books[i] = new PrintBook(isbn, title, author, price, weight, inStock);
  187.             cout << "OPERATOR <<" << endl;
  188.             cout << *books[i];
  189.         }
  190.         cout << "OPERATOR >" << endl;
  191.         cout << "Rezultat od sporedbata e: " << endl;
  192.         if (*books[0] > *books[1])
  193.             cout << *books[0];
  194.         else
  195.             cout << *books[1];
  196.     }
  197.     if (testCase == 4) {
  198.         cout << "====== Testing method mostExpensiveBook() ======" << endl;
  199.         cin >> n;
  200.         books = new Book *[n];
  201.  
  202.         for (int i = 0; i<n; i++) {
  203.  
  204.             cin >> tip >> isbn;
  205.             cin.get();
  206.             cin.getline(title, 50);
  207.             cin.getline(author, 30);
  208.             cin >> price;
  209.             if (tip == 1) {
  210.  
  211.                 cin >> url;
  212.                 cin >> size;
  213.  
  214.                 books[i] = new OnlineBook(isbn, title, author, price, url, size);
  215.  
  216.             } else {
  217.                 cin >> weight;
  218.                 cin >> inStock;
  219.  
  220.                 books[i] = new PrintBook(isbn, title, author, price, weight, inStock);
  221.             }
  222.         }
  223.  
  224.         mostExpensiveBook(books, n);
  225.     }
  226.  
  227.     for (int i = 0; i<n; i++) delete books[i];
  228.     delete[] books;
  229.     return 0;
  230. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement