Advertisement
jordanov

[ООП] Испитна Пицерија

Sep 9th, 2021
1,163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.56 KB | None | 0 0
  1. Да се креира апстрактна класа Pizza за опишување пици. (5 поени) За секоја пица се чуваат следните информации:
  2.  
  3. име (низа од максимум 20 знаци)
  4. состојки (низа од максимум 100 знаци)
  5. основна цена (реален број)
  6. Од оваа класа да се изведат класите FlatPizza и FoldedPizza за опишување на рамни и преклопени пици соодветно (5 поени).
  7.  
  8. За секоја рамна пица дополнително се чува големина (enum - една од три можности: мала, голема и фамилијарна). За секоја преклопена пица дополнително се чува информација дали тестото е од бело брашно или не (boolean).
  9.  
  10. За секоја пица треба да се обезбеди метод за пресметување на нејзината продажна цена:
  11.  
  12. цената на рамната пица се пресметува така што основната цена се зголемува за 10%, 30% и 50% за мала, голема и фамилијарна пица соодветно.
  13. цената на преклопената пица се пресметува така што основната цена се зголемува за 10% ако е тестото е од бело брашно, а во спротивно за 30%. (10 поени)
  14. Да се преоптоварат следните оператори:
  15.  
  16. оператор << - за печатење сите податоци за пиците во следниов формат:
  17.  
  18. За рамна пица:[име]: [состојки], [големина] - [продажната цена на пицата]. За преклопена пица: [име]: [состојки], [wf - ако е со бело брашно / nwf - ако не е со бело брашно] - [продажната цена на пицата] (5 поени)
  19.  
  20. оператор < - за споредување на пиците од каков било вид според нивната продажна цена. (5 поени)
  21.  
  22. Да се дефинира глобална функција еxpensivePizza што на влез прима низа од покажувачи кон објекти од класата Pizza и нивниот број, а како резултат ги печати информациите за пицата со највисока продажна цена. Ако има повеќе пици со иста највисока цена, се печати првата. (10 поени)
  23.  
  24. Да се дефинираат потребните конструктори и методи во класите за правилно функционирање на програмата. (5 поени)
  25.  
  26.  
  27. #include <iostream>
  28. #include <cstring>
  29.  
  30. //Zadaca 5
  31. using namespace std;
  32.  
  33. enum Size{mala, golema, familijarna};
  34.  
  35. class Pizza {
  36. protected:
  37.     char name[20];
  38.     char ingredients[100];
  39.     float price;
  40. public:
  41.     Pizza() {
  42.         strcpy(this->name, "");
  43.         strcpy(this->ingredients, "");
  44.         this->price = 0;
  45.     }
  46.     Pizza(char* name, char* ingredients, float price) {
  47.         strcpy(this->name, name);
  48.         strcpy(this->ingredients, ingredients);
  49.         this->price = price;
  50.     }
  51.     virtual float getPrice()=0;
  52.     virtual ~Pizza(){}
  53. };
  54.  
  55. class FlatPizza : public Pizza {
  56. private:
  57.     Size s;
  58. public:
  59.     FlatPizza() {
  60.         //empty
  61.     }
  62.     FlatPizza(char* name, char* ingredients, float price) : Pizza(name, ingredients, price) {
  63.         //
  64.     }
  65.     FlatPizza(char* name, char* ingredients, float price, Size s)
  66.     : Pizza(name, ingredients, price) {
  67.         this->s = s;
  68.     }
  69.     friend ostream &operator<<(ostream &output, FlatPizza &fp) {
  70.         float totalPrice;
  71.         output<<fp.name<<": "<<fp.ingredients<<", ";
  72.         if (fp.s == 0 || fp.s == 1) {
  73.             output<<"small";
  74.             totalPrice = fp.price + fp.price * 0.1;
  75.         }
  76.         else if (fp.s == 2) {
  77.             output<<"family";
  78.             totalPrice = fp.price + fp.price * 0.3;
  79.         }
  80.         else if (fp.s == 3) {
  81.             output<<"family";
  82.             totalPrice = fp.price + fp.price * 0.5;
  83.         }
  84.         output<<" - "<<totalPrice<<endl;
  85.         return output;
  86.     }
  87.     float getPrice()
  88.     {
  89.         if(this->s == 0 || this->s == 1) {
  90.             return this->price*1.1;
  91.         }
  92.         if(this->s == 2) {
  93.             return this->price*1.3;
  94.         }
  95.         else {
  96.             return this->price*1.5;
  97.         }
  98.     }
  99. };
  100.  
  101. class FoldedPizza : public Pizza {
  102. private:
  103.     bool white;
  104. public:
  105.     FoldedPizza() {
  106.         this->white = true;
  107.     }
  108.     FoldedPizza(char* name, char *ingredients, float price)
  109.     : Pizza(name, ingredients, price) {
  110.         this->white = true;
  111.     }
  112.     void setWhiteFlour(bool x) {
  113.         this->white = x;
  114.     }
  115.     friend ostream &operator<<(ostream &output, FoldedPizza &fp) {
  116.         float totalPrice;
  117.         output<<fp.name<<": "<<fp.ingredients<<", ";
  118.         if (fp.white == true) {
  119.             output<<"wf";
  120.             totalPrice = fp.price + fp.price * 0.1;
  121.         }
  122.         else {
  123.             output<<"nwf";
  124.             totalPrice = fp.price + fp.price * 0.3;
  125.         }
  126.         output<<" - "<<totalPrice<<endl;
  127.         return output;
  128.     }
  129.     float getPrice()
  130.     {
  131.         if(this->white == true) {
  132.             return this->price*1.1;
  133.         }
  134.         else {
  135.             return this->price*1.3;
  136.         }
  137.     }
  138. };
  139.  
  140. bool operator<(Pizza &p1, Pizza &p2) {
  141.     if(p1.getPrice() < p2.getPrice()) {
  142.         return true;
  143.     }
  144.     else {
  145.         return false;
  146.     }
  147. }
  148.  
  149. void expensivePizza(Pizza** pi, int n) {
  150.     int temp_i, maxPrice;
  151.     for (int i=0; i<n; i++) {
  152.         if (i==0) {
  153.             temp_i = i;
  154.             maxPrice = pi[i]->getPrice();
  155.         }
  156.         else if (pi[i]->getPrice() > maxPrice) {
  157.             temp_i = i;
  158.             maxPrice = pi[i]->getPrice();
  159.         }
  160.     }
  161.     FoldedPizza *pointerToFoldedPizzaObject = dynamic_cast<FoldedPizza *>(pi[temp_i]);
  162.     FlatPizza *pointerToFlatPizzaObject = dynamic_cast<FlatPizza *>(pi[temp_i]);
  163.     if (pointerToFlatPizzaObject) {
  164.         cout<<*pointerToFlatPizzaObject;
  165.     }
  166.     else {
  167.         cout<<*pointerToFoldedPizzaObject;
  168.     }
  169. }
  170.  
  171. // Testing
  172. int main() {
  173.     int test_case;
  174.     char name[20];
  175.     char ingredients[100];
  176.     float inPrice;
  177.     Size size;
  178.     bool whiteFlour;
  179.  
  180.     cin >> test_case;
  181.     if (test_case == 1) {
  182.         // Test Case FlatPizza - Constructor, operator <<, price
  183.         cin.get();
  184.         cin.getline(name,20);
  185.         cin.getline(ingredients,100);
  186.         cin >> inPrice;
  187.         FlatPizza fp(name, ingredients, inPrice);
  188.         cout << fp;
  189.     } else if (test_case == 2) {
  190.         // Test Case FlatPizza - Constructor, operator <<, price
  191.         cin.get();
  192.         cin.getline(name,20);
  193.         cin.getline(ingredients,100);
  194.         cin >> inPrice;
  195.         int s;
  196.         cin>>s;
  197.         FlatPizza fp(name, ingredients, inPrice, (Size)s);
  198.         cout << fp;
  199.  
  200.     } else if (test_case == 3) {
  201.         // Test Case FoldedPizza - Constructor, operator <<, price
  202.         cin.get();
  203.         cin.getline(name,20);
  204.         cin.getline(ingredients,100);
  205.         cin >> inPrice;
  206.         FoldedPizza fp(name, ingredients, inPrice);
  207.         cout << fp;
  208.     } else if (test_case == 4) {
  209.         // Test Case FoldedPizza - Constructor, operator <<, price
  210.         cin.get();
  211.         cin.getline(name,20);
  212.         cin.getline(ingredients,100);
  213.         cin >> inPrice;
  214.         FoldedPizza fp(name, ingredients, inPrice);
  215.         fp.setWhiteFlour(false);
  216.         cout << fp;
  217.  
  218.     } else if (test_case == 5) {
  219.         // Test Cast - operator <, price
  220.         int s;
  221.  
  222.         cin.get();
  223.         cin.getline(name,20);
  224.         cin.getline(ingredients,100);
  225.         cin >> inPrice;
  226.         cin>>s;
  227.         FlatPizza *fp1 = new FlatPizza(name, ingredients, inPrice, (Size)s);
  228.         cout << *fp1;
  229.  
  230.         cin.get();
  231.         cin.getline(name,20);
  232.         cin.getline(ingredients,100);
  233.         cin >> inPrice;
  234.         cin>>s;
  235.         FlatPizza *fp2 = new FlatPizza(name, ingredients, inPrice, (Size)s);
  236.         cout << *fp2;
  237.  
  238.         cin.get();
  239.         cin.getline(name,20);
  240.         cin.getline(ingredients,100);
  241.         cin >> inPrice;
  242.         FoldedPizza *fp3 = new FoldedPizza(name, ingredients, inPrice);
  243.         cout << *fp3;
  244.  
  245.         cin.get();
  246.         cin.getline(name,20);
  247.         cin.getline(ingredients,100);
  248.         cin >> inPrice;
  249.         FoldedPizza *fp4 = new FoldedPizza(name, ingredients, inPrice);
  250.         fp4->setWhiteFlour(false);
  251.         cout << *fp4;
  252.  
  253.         cout<<"Lower price: "<<endl;
  254.         if(*fp1<*fp2)
  255.             cout<<fp1->getPrice()<<endl;
  256.         else cout<<fp2->getPrice()<<endl;
  257.  
  258.         if(*fp1<*fp3)
  259.             cout<<fp1->getPrice()<<endl;
  260.         else cout<<fp3->getPrice()<<endl;
  261.  
  262.         if(*fp4<*fp2)
  263.             cout<<fp4->getPrice()<<endl;
  264.         else cout<<fp2->getPrice()<<endl;
  265.  
  266.         if(*fp3<*fp4)
  267.             cout<<fp3->getPrice()<<endl;
  268.         else cout<<fp4->getPrice()<<endl;
  269.  
  270.     } else if (test_case == 6) {
  271.         // Test Cast - expensivePizza
  272.         int num_p;
  273.         int pizza_type;
  274.  
  275.         cin >> num_p;
  276.         Pizza **pi = new Pizza *[num_p];
  277.         for (int j = 0; j < num_p; ++j) {
  278.  
  279.             cin >> pizza_type;
  280.             if (pizza_type == 1) {
  281.                 cin.get();
  282.                 cin.getline(name,20);
  283.  
  284.                 cin.getline(ingredients,100);
  285.                 cin >> inPrice;
  286.                 int s;
  287.                 cin>>s;
  288.                 FlatPizza *fp = new FlatPizza(name, ingredients, inPrice, (Size)s);
  289.                 cout << (*fp);
  290.                 pi[j] = fp;
  291.             }
  292.             if (pizza_type == 2) {
  293.  
  294.                 cin.get();
  295.                 cin.getline(name,20);
  296.                 cin.getline(ingredients,100);
  297.                 cin >> inPrice;
  298.                 FoldedPizza *fp =
  299.                     new FoldedPizza (name, ingredients, inPrice);
  300.                 if(j%2)
  301.                     (*fp).setWhiteFlour(false);
  302.                 cout << (*fp);
  303.                 pi[j] = fp;
  304.  
  305.             }
  306.         }
  307.  
  308.         cout << endl;
  309.         cout << "The most expensive pizza:\n";
  310.         expensivePizza(pi,num_p);
  311.     }
  312.     return 0;
  313. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement