Advertisement
Mitrezzz

Репозиториум за оперативни системи

Mar 25th, 2018
1,931
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.05 KB | None | 0 0
  1. Репозиториум за оперативни системи Problem 3 (0 / 0)
  2. Фирмата FINKI Cloud има потреба од решение за управување со image датотеките од различните оперативни системи кои ги користат при сетирање на нови сервери. За таа цел потребно е да се дефинираат следниве класи:
  3.  
  4. OperativenSistem
  5. Во класата OperativenSistem треба да се чуваат следниве податоци:
  6.  
  7. име на оперативниот систем (динамички алоцирана низа од знаци)
  8. верзија (float)
  9. тип (енумерација со можни вредности LINUX, UNIX, WINDOWS)
  10. големина (во GB) (float)
  11. Дополнително, во рамките на класата потребно е да се дефинира:
  12.  
  13. конструктори со и без параметри
  14. copy constructor
  15. destructor
  16. преоптоварување на операторот =
  17. метод за печатење на информациите - void pecati() (видете го излезот од тест примерите за структурата)
  18. метод за проверка на еднаквост помеѓу два оперативни системи (два оперативни системи се еднакви ако имаат исто име, верзија, тип и големина) - bool ednakviSe(const OperativenSistem &os)
  19. метод за споредба на верзии помеѓу два оперативни система - int sporediVerzija(const OperativenSistem &os), кој ќе враќа 0 доколку верзиите се исти, -1 доколку верзијата на оперативниот систем од аргументот е поголема и 1 во преостанатиот случај.
  20. метод за проверка дали два оперативни системи се од иста фамилија. Два оперативни системи се од иста фамилија доколку имаат исто име и се од ист тип. bool istaFamilija(const OperativenSistem &sporedba)
  21. Repozitorium
  22. Во класата Repozitorium треба да се чуваат следниве податоци:
  23.  
  24. име на репозиториумот (низа од 20 знака)
  25. динамички алоцирана низа од OperativenSistem
  26. број на оперативни системи кои моментално се наоѓаат во репозиториумот (int)
  27. Дополнително, во рамките на класата потребно е да се дефинира:
  28.  
  29. конструктор Repozitorium(const char *ime)
  30. деструктор
  31. метод void pecatiOperativniSistemi() кој ќе ги печати сите оперативни системи кои се дел од репозиториумот
  32. метод void izbrishi(const OperativenSistem &operativenSistem) кој ќе го избрише оперативниот систем проследен како аргумент, доколку тој се наоѓа во репозиториумот. Да се користи методот ednakviSe за споредба на два оперативни система.
  33. метод за додавање на оперативен систем (void dodadi(const OperativenSistem &nov)) кој ќе го има следново однесување:
  34. Доколку веќе постои оперативен систем од иста фамилија (да се користи методот за проверка на фамилија) кој е постар од проследениот оперативен систем, тогаш постоечкиот оперативен систем се заменува со новиот.
  35. Во секој друг случај, проследениот оперативен систем се додава како дополнителен во репозиториумот.
  36.  
  37. Sample input
  38. FINKICloud
  39. 4
  40. Ubuntu
  41. 16.04
  42. 1
  43. 1.25
  44. Windows
  45. 10
  46. 3
  47. 3.5
  48. Fedora
  49. 27
  50. 1
  51. 2.25
  52. FreeBSD
  53. 11
  54. 2
  55. 1.75
  56. Fedora
  57. 25
  58. 1
  59. 2.25
  60.  
  61. Sample output
  62. Repozitorium: FINKICloud
  63. Ime: Ubuntu Verzija: 16.04 Tip: 1 Golemina:1.25GB
  64. Ime: Windows Verzija: 10 Tip: 3 Golemina:3.5GB
  65. Ime: Fedora Verzija: 27 Tip: 1 Golemina:2.25GB
  66. Ime: FreeBSD Verzija: 11 Tip: 2 Golemina:1.75GB
  67. =====Brishenje na operativen sistem=====
  68. Repozitorium: FINKICloud
  69. Ime: Ubuntu Verzija: 16.04 Tip: 1 Golemina:1.25GB
  70. Ime: Windows Verzija: 10 Tip: 3 Golemina:3.5GB
  71. Ime: Fedora Verzija: 27 Tip: 1 Golemina:2.25GB
  72. Ime: FreeBSD Verzija: 11 Tip: 2 Golemina:1.75GB
  73.  
  74.  
  75.  
  76. #include<iostream>
  77. #include<cstring>
  78.  
  79. using namespace std;
  80.  
  81. enum Tip {
  82.     LINUX, UNIX, WINDOWS
  83. };
  84.  
  85. class OperativenSistem {
  86.     private:
  87.     char * ime;
  88.     float verzija;
  89.     Tip tip;
  90.     float golemina;
  91.  
  92. void copy (const OperativenSistem &os){
  93.     this->ime = new char [strlen(os.ime)+1];
  94.     strcpy(this->ime,os.ime);
  95.     this->verzija=os.verzija;
  96.     this->tip = os.tip;
  97.     this->golemina=os.golemina;
  98. }
  99.  
  100.     public :
  101.     //constructor and default constructor
  102.     OperativenSistem (char * ime="", float verzija=0.0, Tip tip =(Tip) 0, float golemina=0.0){
  103.         this->ime = new char [strlen(ime)+1];
  104.         strcpy(this->ime,ime);
  105.         this->verzija=verzija;
  106.         this->tip = tip;
  107.         this->golemina=golemina;
  108.     }
  109.  
  110.     //copy constructor SVETO TROJSTVO
  111.     OperativenSistem (const OperativenSistem &os){
  112.         copy(os);
  113.     }
  114.     //operator =
  115.     OperativenSistem &operator = (const OperativenSistem &os){
  116.         if (this!=&os){
  117.             delete [] ime;
  118.             copy(os);
  119.         }
  120.         return *this;
  121.     }
  122.     //destrcutor
  123.     ~OperativenSistem() {
  124.         delete [] ime;
  125.     }
  126.  
  127.     void pecati() {
  128.         cout<<"Ime: "<<ime<<" Verzija: "<<verzija<<" Tip: "<<tip<<" Golemina:"<<golemina<<"GB"<<endl;
  129.     }
  130.  
  131.     bool ednakviSe(const OperativenSistem &os){
  132.         return strcmp(ime,os.ime)==0&&verzija==os.verzija &&tip==os.tip && golemina==os.golemina;
  133.     }
  134.  
  135.     int sporediVerzija(const OperativenSistem &os){
  136.         if (verzija==os.verzija)
  137.             return 0;
  138.         else if (os.verzija>verzija)
  139.             return -1;
  140.         else return 1;
  141.     }
  142.  
  143.     bool istaFamilija(const OperativenSistem &os){
  144.         return strcmp(ime,os.ime)==0 && tip==os.tip;
  145.     }
  146.  
  147. };
  148.  
  149. class Repozitorium{
  150.     private:
  151.     char ime[20];
  152.     OperativenSistem * sistemi;
  153.     int brSistemi;
  154.  
  155.     void copy(const Repozitorium &r) {
  156.         strcpy(this->ime,r.ime);
  157.         this->brSistemi=r.brSistemi;
  158.         this->sistemi = new OperativenSistem [brSistemi];
  159.         //this->sistemi = r.sistemi;
  160.         //niza od objekti mora da se kopira so FOR ciklus sekoj i-ti so sekoj i-ti
  161.         for (int i=0;i<brSistemi;i++)
  162.             this->sistemi[i]=r.sistemi[i];
  163.     }
  164.  
  165.     public:
  166.     Repozitorium(char * repoName=""){
  167.         strcpy(this->ime,repoName);
  168.         sistemi = new OperativenSistem [0];
  169.         brSistemi = 0;
  170.     }
  171.  
  172.     Repozitorium (const Repozitorium &r){
  173.         copy(r);
  174.     }
  175.  
  176.     Repozitorium &operator = (const Repozitorium &r){
  177.         if (this!=&r){
  178.             delete [] sistemi;
  179.             copy(r);
  180.         }
  181.  
  182.         return *this;
  183.     }
  184.  
  185.     ~Repozitorium () {
  186.         delete [] sistemi;
  187.     }
  188.  
  189.     void pecatiOperativniSistemi() {
  190.         //sistemi.pecati();
  191.         //Mora da se iziteriraat so FOR ciklus bidejki ima poveke od 1 sistem i e niza
  192.         cout<<"Repozitorium: "<<ime<<endl;
  193.         for (int i=0;i<brSistemi;i++)
  194.             sistemi[i].pecati();
  195.     }
  196.  
  197.     void izbrishi (const OperativenSistem &izbrishi){
  198.         //naogjanje na indeksot na sistemot so treba da se brishe
  199.         int idx = -1;
  200.         for (int i=0;i<brSistemi;i++){
  201.             if (sistemi[i].ednakviSe(izbrishi)){
  202.                 idx = i;
  203.                 break;
  204.             }
  205.         }
  206.  
  207.         if (idx==-1)
  208.             return ;
  209.  
  210.         OperativenSistem * tmp = new OperativenSistem[brSistemi-1];
  211.         int j=0;
  212.         for (int i=0;i<brSistemi;i++){
  213.             if (i!=idx){
  214.                 tmp[j]=sistemi[i];
  215.                 j++;
  216.             }
  217.             else {
  218.                 continue;
  219.             }
  220.         }
  221.  
  222.         brSistemi--;
  223.         delete [] sistemi;
  224.         sistemi = tmp;
  225.  
  226.     }
  227.  
  228.     void dodadi (const OperativenSistem &os){
  229.         for (int i=0;i<brSistemi;i++)
  230.             if (sistemi[i].istaFamilija(os) && sistemi[i].sporediVerzija(os)==-1){
  231.                 sistemi[i]=os;
  232.                 return ;
  233.             }
  234.  
  235.         OperativenSistem * tmp = new OperativenSistem [brSistemi+1];
  236.         for (int i=0;i<brSistemi;i++)
  237.             tmp[i]=sistemi[i];
  238.  
  239.         tmp[brSistemi++]=os;
  240.         delete [] sistemi;
  241.         sistemi = tmp;
  242.     }
  243. };
  244.  
  245. int main(){
  246.  
  247.     char repoName[20];
  248.     cin>>repoName;
  249.     Repozitorium repozitorium=Repozitorium(repoName);
  250.     int brojOperativniSistemi = 0;
  251.     cin>>brojOperativniSistemi;
  252.     char ime[20];
  253.     float verzija;
  254.     int tip;
  255.     float golemina;
  256.     for (int i = 0; i<brojOperativniSistemi; i++){
  257.         cin>>ime;
  258.         cin>>verzija;
  259.         cin>>tip;
  260.         cin>>golemina;
  261.         OperativenSistem os = OperativenSistem(ime, verzija, (Tip)tip, golemina);
  262.         repozitorium.dodadi(os);
  263.     }
  264.     repozitorium.pecatiOperativniSistemi();
  265.     cin>>ime;
  266.     cin>>verzija;
  267.     cin>>tip;
  268.     cin>>golemina;
  269.     OperativenSistem os = OperativenSistem(ime, verzija, (Tip)tip, golemina);
  270.     cout<<"=====Brishenje na operativen sistem====="<<endl;
  271.     repozitorium.izbrishi(os);
  272.     repozitorium.pecatiOperativniSistemi();
  273.     return 0;
  274. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement