Advertisement
Guest User

Untitled

a guest
Jan 28th, 2020
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.67 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3.  
  4. using namespace std;
  5.  
  6. class Naczynie {
  7.     protected:
  8.         double Pojemnosc;
  9.        
  10.     public:
  11.         Naczynie (double _Pojemnosc) {
  12.             Pojemnosc = _Pojemnosc;
  13.         }
  14.        
  15. };
  16.  
  17. class Garnek : public Naczynie {
  18.     protected:
  19.         char Uszy;
  20.         bool Pokrywka;
  21.        
  22.     public:
  23.         double GetPojemnosc () {
  24.             return Pojemnosc;
  25.         }
  26.        
  27.         bool GetPokrywka () {
  28.             return Pokrywka;
  29.         }
  30.        
  31.         Garnek (double _Pojemnosc, char _Uszy, bool _Pokrywka): Naczynie (_Pojemnosc) {
  32.             Uszy = _Uszy;
  33.             Pokrywka = _Pokrywka;
  34.         }
  35.        
  36.         // Domyślny konstruktor, bo g++ chciał go dla użycia `new Garnek[n]`
  37.         Garnek (): Garnek (0, '0', false) { }
  38.        
  39.         // Wypisuje atrybuty garnka
  40.         void Print () {
  41.             cout << "Garnek: " << Pojemnosc << "mL, Pokrywka: " << (Pokrywka ? "Tak" : "Nie") << ", Uszy: " << Uszy << endl;
  42.         }
  43.        
  44. };
  45.  
  46. class Przepis {
  47.     friend bool SprawdzPrzepis (Garnek*, int, Przepis&);
  48.     protected:
  49.         Garnek *Garnki;
  50.         int IloscGarnkow;
  51.        
  52.     public:
  53.        
  54.         Przepis (Garnek *_Garnki, int _IloscGarnkow) {
  55.             Garnki = _Garnki;
  56.             IloscGarnkow = _IloscGarnkow;
  57.         }
  58.        
  59. };
  60.  
  61. bool SprawdzPrzepis (Garnek *garnki, int iloscGarnkow, Przepis &przepis) {
  62.     bool *uzyteGarnki = new bool[iloscGarnkow];
  63.     for (int i = 0; i < iloscGarnkow; ++i) {
  64.         uzyteGarnki[i] = false;
  65.     }
  66.    
  67.     // Dla każdego garnka z przepisu znajdź najmniejszy garnek który ma
  68.     // wystarczającą objętość.
  69.    
  70.     // Najpierw dobierz garnki z przepisu wymagające pokrywki
  71.     for (int i = 0; i < przepis.IloscGarnkow; ++i) {
  72.         if (!przepis.Garnki[i].GetPokrywka ()) {
  73.             continue;
  74.         }
  75.        
  76.         // Znajdź najmniejszy pasujący, nieużyty garnek z listy
  77.         double lowestVol = 0;
  78.         int lowestVolIndex = -1;
  79.         for (int j = 0; j < iloscGarnkow; ++j) {
  80.             // Garnek wymaga pokrywki
  81.             if (!garnki[j].GetPokrywka ()) {
  82.                 continue;
  83.             }
  84.            
  85.             // Nie sprawdzaj już użytych garnków
  86.             if (uzyteGarnki[j]) {
  87.                 continue;
  88.             }
  89.            
  90.             double thisVol = garnki[j].GetPojemnosc ();
  91.            
  92.             // Jeżeli pierwszy pasujący garnek lub mniejszy pasujący garnek, wpisz go
  93.             if ((thisVol < lowestVol || lowestVolIndex < 0) && thisVol >= przepis.Garnki[i].GetPojemnosc ()) {
  94.                 lowestVol = thisVol;
  95.                 lowestVolIndex = j;
  96.             }
  97.         }
  98.        
  99.         if (lowestVolIndex < 0) {
  100.             // Nie znaleziono pasującego garnka
  101.             return false;
  102.         } else {
  103.             // Znaleziono pasujący garnek. Oznacz go jako użytego
  104.             uzyteGarnki[lowestVolIndex] = true;
  105.         }
  106.     }
  107.    
  108.     // Następnie pozostałe wymagane garnki, bez pokrywek
  109.     for (int i = 0; i < przepis.IloscGarnkow; ++i) {
  110.         if (przepis.Garnki[i].GetPokrywka ()) {
  111.             continue;
  112.         }
  113.        
  114.         // Znajdź najmniejszy pasujący, nieużyty garnek z listy
  115.         double lowestVol = 0;
  116.         int lowestVolIndex = -1;
  117.         for (int j = 0; j < iloscGarnkow; ++j) {
  118.             // Nie sprawdzaj już użytych garnków
  119.             if (uzyteGarnki[j]) {
  120.                 continue;
  121.             }
  122.            
  123.             double thisVol = garnki[j].GetPojemnosc ();
  124.            
  125.             // Jeżeli pierwszy garnek bez pokrywki lub mniejszy pasujący garnek, wpisz go
  126.             if ((thisVol < lowestVol || lowestVolIndex < 0) && thisVol >= przepis.Garnki[i].GetPojemnosc ()) {
  127.                 lowestVol = thisVol;
  128.                 lowestVolIndex = j;
  129.             }
  130.         }
  131.        
  132.         if (lowestVolIndex < 0) {
  133.             // Nie znaleziono pasującego garnka
  134.             return false;
  135.         } else {
  136.             // Znaleziono pasujący garnek. Oznacz go jako użytego
  137.             uzyteGarnki[lowestVolIndex] = true;
  138.         }
  139.     }
  140.    
  141.     // Jeżeli do tego punktu nie natrafiono na `return false`, to znaczy że
  142.     // znaleziono wszystkie wymagane garnki
  143.    
  144.     delete uzyteGarnki;
  145.     return true;
  146. }
  147.  
  148. int main () {
  149.     srand (time (NULL));
  150.    
  151.     const int ILOSC_GARNKOW_PRZEPIS = 3;
  152.     Garnek *garnkiPrzepis = new Garnek[ILOSC_GARNKOW_PRZEPIS] {
  153.         Garnek { 1000, 'U', false },
  154.         Garnek {  600, 'U', false },
  155.         Garnek {  800, 'U',  true }
  156.     };
  157.    
  158.     Przepis przepis = Przepis { garnkiPrzepis, ILOSC_GARNKOW_PRZEPIS };
  159.    
  160.     // Losowa ilość garnków w przedziale <2, 4>
  161.     int iloscGarnkow = (rand () % 3) + 2;
  162.    
  163.     Garnek *garnki = new Garnek[iloscGarnkow];
  164.     for (int i = 0; i < iloscGarnkow; ++i) {
  165.         // Losowy garnek o pojemności <100, 1400>. 50% szans na pokrywkę
  166.         garnki[i] = Garnek { (double) ((rand () % 1301) + 100), 'U', rand () & 1 };
  167.     }
  168.    
  169.     cout << endl;
  170.     cout << "==== Przepis wymaga garnkow: ====" << endl;
  171.     for (int i = 0; i < ILOSC_GARNKOW_PRZEPIS; ++i) {
  172.         garnkiPrzepis[i].Print ();
  173.     }
  174.    
  175.     cout << endl;
  176.     cout << "==== Posiadane garnki: ====" << endl;
  177.    
  178.    
  179.     for (int i = 0; i < iloscGarnkow; ++i) {
  180.         garnki[i].Print ();
  181.     }
  182.    
  183.     cout << endl;
  184.     if (SprawdzPrzepis (garnki, iloscGarnkow, przepis)) {
  185.         cout << "Przepis ten da sie wykonac" << endl;
  186.     } else {
  187.         cout << "Przepisu tego nie da sie wykonac" << endl;
  188.     }
  189.     cout << endl;
  190.    
  191.    
  192.     delete[] garnki, garnkiPrzepis;
  193. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement