Advertisement
jordanov

[ООП] Испитна

Sep 9th, 2021
1,083
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.20 KB | None | 0 0
  1. За потребите на еден хотстинг провајдер потребно е да се моделира систем на наплата.
  2.  
  3. Да се имплементира абстрактна класа која претставува сервер на хостинг провајдерот (Server). За секој сервер се чуваат:
  4.  
  5. IP адреса на машината (низа од 45 знаци)
  6. името на хостот (низа од макс 100 знаци)
  7. Да се имплементираат класи за различните типови на сервери: дедициран сервер (DedicatedServer) и виртуелен сервер (VirtualServer)
  8.  
  9. За секојa сметка за дедициран сервер се чува:
  10.  
  11. основна цена (реален број)
  12. количина на RAM меморија во гигабајти (цел број)
  13. дин. алоцирана низа од хард дискови (во гигабајти) на дедицираниот сервер. Во низата се чува големината (во GB) на секој хард диск кој е достапен на дедицираниот сервер. Така на пример, доколку има 3 диска, тогаш се чуваат 3 целобројни променливи кои ја претставуваат големината (во гигабајти) на секој диск. Според тоа, низата {20, 100, 8} репрезентира дискови кои се со големина од 20GB, 100GB и 8GB соодветно.
  14. број на дискови (цел број)
  15. За секој виртуелен сервер се чува:
  16.  
  17. број на алицирани јадра (цел број)
  18. месечен проток на серверот (изразен во гигабајти, цел број)
  19. За секој од серверите да се имплементира пресметка на цена:
  20.  
  21. за дедициран сервер цената се пресметува на следниот начин: основната цена + хард_диск_простор * 0.5 + рам_меморија * 20.
  22. за виртуелен сервер цената се пресметува на следниот начин: број_на_алоцирани јадра * 5 + месечен_проток * 10.
  23. Да се дефинираат следниве оператори за дедициран сервер:
  24.  
  25. оператор += - додава нов диск со соодветната големина (дадена како аргумент) во низата од дискови.
  26. оператор ++ (постинкремент) - ја зголемува количината на рам за 1 гигабајт.
  27. Да се дефинираат следниве оператори за виртуелен сервер:
  28.  
  29. оператор += (постинкремент) - го зголемува бројот на алоцирани јадра за дадената вредност
  30. оператор ++ - го зголемува потрошениот месечен проток за 1 гигабајт
  31. Да се дефинира и оператор > кој ќе споредува два сервери врз основа на цената на нивната цена.
  32.  
  33. Да се имплементира оператор << кој ќе ги печати сите релевантни информации за секој од серверите во сл. формат: За дедициран сервер:
  34.  
  35.     [име на хост]: [IP адреса]
  36.     [основна цена], [рам меморија]
  37.     [број на дискови], [вкупен капацитет на сите дискови]
  38. За виртуелен сервер:
  39.  
  40.     [име на хост]: [IP адреса]
  41.     [број на јардра], [количина на потрошен интернет]
  42. Да се креира функција totalCost која прима низа од покажувачи кон сервери и ја враќа вкупната цена за сите нив.
  43.  
  44. Да се креира функција biggestInvoice која прима низа од покажувачи кон сервери и го враќа серверот кој има најголема цена.
  45.  
  46. #include <cstring>
  47. #include <iostream>
  48. using namespace std;
  49.  
  50. // Your Code goes here
  51.  
  52.  
  53.  
  54. class Server {
  55. protected:
  56.     char IP[45];
  57.     char hostname[100];
  58. public:
  59.     Server(char * IP = "", char * hostname = "") {
  60.         strcpy(this->IP, IP);
  61.         strcpy(this->hostname, hostname);
  62.     }
  63.     virtual double total_price() = 0;
  64.     bool operator >(Server &s) {
  65.         return total_price() > s.total_price();
  66.     }
  67. };
  68.  
  69. class DedicatedServer : public Server {
  70. private:
  71.     double basicPrice;
  72.     int RAM;
  73.     int * hardDisks;
  74.     int n;
  75.    
  76.     void copy(const DedicatedServer &ds) {
  77.         strcpy(this->IP, ds.IP);
  78.         strcpy(this->hostname, ds.hostname);
  79.         this->basicPrice = ds.basicPrice;
  80.         this->RAM = ds.RAM;
  81.         this->hardDisks = new int[this->n];
  82.         for(int i=0; i<ds.n; i++)
  83.             this->hardDisks[i] = ds.hardDisks[i];
  84.         this->n = ds.n;
  85.     }
  86. public:
  87.     DedicatedServer(char * IP = "", char * hostname = "", double basicPrice = 0.0, int RAM = 0) : Server(IP, hostname) {
  88.         this->basicPrice = basicPrice;
  89.         this->RAM = RAM;
  90.         this->hardDisks = new int[0];
  91.         this->n = 0;
  92.     }
  93.     DedicatedServer(const DedicatedServer &ds) : Server(ds) {
  94.         copy(ds);
  95.     }
  96.     DedicatedServer & operator =(const DedicatedServer &ds) {
  97.         if (this != &ds) {
  98.             delete [] hardDisks;
  99.             copy(ds);
  100.         }
  101.         return *this;
  102.     }
  103.     ~DedicatedServer() {
  104.         delete [] hardDisks;
  105.     }
  106.     int diskSpace() {
  107.         int sum = 0;
  108.         for(int i=0; i<n; i++)
  109.             sum+=hardDisks[i];
  110.         return sum;
  111.     }
  112.     double total_price() {
  113.         return basicPrice + diskSpace() * 0.5 + RAM * 20.0;
  114.     }
  115.     DedicatedServer & operator +=(int size) {
  116.         int * tmp = new int[n+1];
  117.         for(int i=0; i<n; i++)
  118.             tmp[i] = hardDisks[i];
  119.         tmp[n++] = size;
  120.         delete [] hardDisks;
  121.         hardDisks = tmp;
  122.         return *this;
  123.     }
  124.     DedicatedServer & operator ++(int) {
  125.         DedicatedServer copy(*this);
  126.         RAM++;
  127.         return copy;
  128.     }
  129.     friend ostream & operator <<(ostream &out, DedicatedServer &ds) {
  130.         //return out<<ds.hostname<<": "<<ds.IP<<endl<<ds.basicPrice<<", "<<ds.RAM<<endl<<ds.n<<", "<<ds.diskSpace()<<endl;
  131.         out<<ds.hostname<<": "<<ds.IP<<endl;
  132.         out<<ds.basicPrice<<", "<<ds.RAM<<endl;
  133.         out<<ds.n<<", "<<ds.diskSpace()<<endl;
  134.         return out;
  135.     }
  136. };
  137.  
  138. class VirtualServer : public Server {
  139. private:
  140.     int cores;
  141.     int bandwith;
  142. public:
  143.     VirtualServer(char * IP = "", char * hostname = "", int cores = 0, int bandwith = 0) : Server(IP, hostname) {
  144.         this->cores = cores;
  145.         this->bandwith = bandwith;
  146.     }
  147.     double total_price() {
  148.         return cores * 5 + bandwith * 10;
  149.     }
  150.     VirtualServer & operator +=(int cores) {
  151.         this->cores += cores;
  152.         return *this;
  153.     }
  154.     VirtualServer & operator ++(int) {
  155.         VirtualServer copy(*this);
  156.         bandwith++;
  157.         return copy;
  158.     }
  159.     friend ostream & operator <<(ostream &out, VirtualServer &vs) {
  160.         return out<<vs.hostname<<": "<<vs.IP<<endl<<vs.cores<<", "<<vs.bandwith<<endl;
  161.     }
  162. };
  163.  
  164. double totalCost(Server ** servers, int n) {
  165.     double sum = 0.0;
  166.     for(int i=0; i<n; i++)
  167.         sum+=servers[i]->total_price();
  168.     return sum;
  169. }
  170.  
  171. Server & biggestInvoice(Server ** servers, int n) {
  172.     Server * max = servers[0];
  173.     for(int i=1; i<n; i++) {
  174.         if(*servers[i] > *max) {
  175.             max = servers[i];
  176.         }
  177.     }
  178.     return *max;
  179. }
  180. // Testing
  181. int main() {
  182.   int test_case;
  183.   char hostname[101];
  184.   char ip[46];
  185.   int ram;
  186.   int basic_price;
  187.   int disk_space;
  188.   int num_cores;
  189.   int bandwith;
  190.  
  191.   int num_inc;
  192.  
  193.   cin >> test_case;
  194.   if (test_case == 1) {
  195.     // Test Case Business Invoice - Constructor, operator <<
  196.     cin >> ip >> hostname;
  197.     cin >> basic_price >> ram;
  198.     DedicatedServer ds(ip, hostname, basic_price, ram);
  199.     cout << ds;
  200.   } else if (test_case == 2) {
  201.     // Test Case Business Invoice - Constructor, operators <<, ++
  202.     cin >> ip >> hostname;
  203.     cin >> basic_price >> ram;
  204.     DedicatedServer ds(ip, hostname, basic_price, ram);
  205.     cout << ds;
  206.  
  207.     cin >> num_inc;
  208.     for (int i = 0; i < num_inc; ++i) {
  209.       ds++;
  210.     }
  211.     cout << ds;
  212.   } else if (test_case == 3) {
  213.     // Test Case Business Invoice - Constructor, total_price, operators <<,
  214.     cin >> ip >> hostname;
  215.     cin >> basic_price >> ram;
  216.     DedicatedServer ds(ip, hostname, basic_price, ram);
  217.     cout << ds;
  218.  
  219.     cin >> num_inc;
  220.     for (int i = 0; i < num_inc; ++i) {
  221.       ds++;
  222.     }
  223.  
  224.     cin >> num_inc;
  225.     for (int i = 0; i < num_inc; ++i) {
  226.       cin >> disk_space;
  227.       ds += disk_space;
  228.     }
  229.  
  230.     cout << ds;
  231.   } else if (test_case == 4) {
  232.     cin >> ip >> hostname;
  233.     cin >> basic_price >> ram;
  234.     DedicatedServer ds(ip, hostname, basic_price, ram);
  235.     cout << ds;
  236.     cout << ds.total_price()<< endl;
  237.     cin >> num_inc;
  238.     for (int i = 0; i < num_inc; ++i) {
  239.       ds++;
  240.     }
  241.  
  242.     cin >> num_inc;
  243.     for (int i = 0; i < num_inc; ++i) {
  244.       cin >> disk_space;
  245.       ds += disk_space;
  246.     }
  247.  
  248.     cout << ds;
  249.     cout << ds.total_price();
  250.  
  251.   } else if (test_case == 5) {
  252.     cin >> ip >> hostname;
  253.     cin >> num_cores >> bandwith;
  254.     VirtualServer vs(ip, hostname, num_cores, bandwith);
  255.     cout << vs;
  256.   } else if (test_case == 6) {
  257.     cin >> ip >> hostname;
  258.     cin >> num_cores >> bandwith;
  259.     VirtualServer vs(ip, hostname, num_cores, bandwith);
  260.     cout << vs;
  261.     cin >> num_inc;
  262.     for (int i = 0; i < num_inc; ++i) {
  263.       vs++;
  264.     }
  265.  
  266.     cin >> num_inc;
  267.     vs += num_inc;
  268.  
  269.     cout << vs;
  270.  
  271.   } else if (test_case == 7) {
  272.     cin >> ip >> hostname;
  273.     cin >> num_cores >> bandwith;
  274.     VirtualServer vs(ip, hostname, num_cores, bandwith);
  275.     cout << vs;
  276.     cout << vs.total_price() << endl;
  277.  
  278.     cin >> num_inc;
  279.     for (int i = 0; i < num_inc; ++i) {
  280.       vs++;
  281.     }
  282.  
  283.     cin >> num_inc;
  284.     vs += num_inc;
  285.     cout << vs;
  286.     cout << vs.total_price();
  287.   } else if (test_case == 8) {
  288.  
  289.     int num_servers;
  290.     int server_type;
  291.  
  292.     cin >> num_servers;
  293.     Server **s = new Server *[num_servers];
  294.     for (int j = 0; j < num_servers; ++j) {
  295.  
  296.       cin >> server_type;
  297.       if (server_type == 1) {
  298.         cin >> ip >> hostname;
  299.         cin >> basic_price >> ram;
  300.         DedicatedServer *dsp =
  301.             new DedicatedServer(ip, hostname, basic_price, ram);
  302.  
  303.         cin >> num_inc;
  304.         for (int i = 0; i < num_inc; ++i) {
  305.           (*dsp)++;
  306.         }
  307.  
  308.         cin >> num_inc;
  309.         for (int i = 0; i < num_inc; ++i) {
  310.           cin >> disk_space;
  311.           (*dsp) += disk_space;
  312.         }
  313.  
  314.         cout << *(dsp);
  315.         cout << dsp->total_price() << endl;
  316.  
  317.         s[j] = dsp;
  318.       }
  319.       if (server_type == 2) {
  320.  
  321.         cin >> ip >> hostname;
  322.         cin >> num_cores >> bandwith;
  323.         VirtualServer *vsp =
  324.             new VirtualServer(ip, hostname, num_cores, bandwith);
  325.  
  326.         cin >> num_inc;
  327.         for (int i = 0; i < num_inc; ++i) {
  328.           (*vsp)++;
  329.         }
  330.  
  331.         cin >> num_inc;
  332.         (*vsp) += num_inc;
  333.  
  334.         cout << (*vsp);
  335.         cout << vsp->total_price() << endl;
  336.         s[j] = vsp;
  337.       }
  338.     }
  339.  
  340.     cout << "The cost of all servers is:\n";
  341.     cout << totalCost(s, num_servers);
  342.     cout << endl;
  343.  
  344.     cout << "Biggest invoice:\n";
  345.     Server &server = biggestInvoice(s, num_servers);
  346.  
  347.     Server *ss = &server;
  348.     DedicatedServer *bip;
  349.     VirtualServer *pip;
  350.     if (dynamic_cast<DedicatedServer *>(ss)) {
  351.       bip = dynamic_cast<DedicatedServer *>(ss);
  352.       cout << *bip << bip->total_price();
  353.     }
  354.     if (dynamic_cast<VirtualServer *>(ss)) {
  355.       pip = dynamic_cast<VirtualServer *>(ss);
  356.       cout << *pip << pip->total_price();
  357.     }
  358.   }
  359.   return 0;
  360. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement