Advertisement
Koki99

Pizza - Втор Колоквиум - Пример

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