Advertisement
196040

OOP labs 4 i zadaci za vezbanje 1 Repozitorium za OS

May 23rd, 2020
582
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.06 KB | None | 0 0
  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. enum Tip {LINUX=1, UNIX=2, WINDOWS=3};
  5. class OperativenSistem { //Во класата OperativenSistem
  6. private: //треба да се чуваат следниве податоци:
  7. char * ime; //име на оперативниот систем (динамички алоцирана низа од знаци)
  8. float verzija; //верзија (float)
  9. Tip vid; //тип (енумерација со можни вредности LINUX, UNIX, WINDOWS)
  10. float golemina; //големина (во GB) (float)
  11. public: //Дополнително, во рамките на класата потребно е да се дефинира:
  12. OperativenSistem() {
  13.  this->ime = new char[0];
  14.     strcpy(this->ime, "");
  15.     this->verzija = 0.0;
  16.     this->vid = (Tip)0;
  17.     this->golemina = 0.0;
  18. } //конструктори со и без параметри
  19.     OperativenSistem(char * ime, float verzija, Tip vid, float golemina) {
  20.         this->ime = new char[strlen(ime)+1];
  21.         strcpy(this->ime, ime);
  22.         this->verzija = verzija;
  23.         this->vid = vid;
  24.         this-> golemina = golemina;
  25.     }
  26.     OperativenSistem(const OperativenSistem &os) {
  27.         this->ime = new char[strlen(os.ime)+1];
  28.         strcpy(this->ime, os.ime);
  29.         this->verzija = os.verzija;
  30.         this->vid = os.vid;
  31.         this-> golemina = os.golemina;
  32.     }// copy constructor
  33.     ~OperativenSistem() {
  34.         delete [] ime;
  35.     } //destructor
  36.     OperativenSistem &operator=(const OperativenSistem &os) { //преоптоварување на операторот =
  37.     if(this!=&os) {
  38.         this->ime = new char[strlen(os.ime)+1];
  39.         strcpy(this->ime, os.ime);
  40.         this->verzija = os.verzija;
  41.         this->vid = os.vid;
  42.         this-> golemina = os.golemina;
  43.     }
  44.     return *this;
  45.     }
  46.     float getverzija() {
  47.         return this->verzija;
  48.     }
  49.     void pecati() { //метод за печатење на информациите - void pecati()
  50.     cout<<"Ime: "<<this->ime<<" Verzija: "<<this->verzija;
  51.     cout<<" Tip: "<<this->vid<<" Golemina:"<<this->golemina;
  52.     cout<<"GB"<<endl;
  53.     } //(видете го излезот од тест примерите за структурата)
  54.     bool ednakviSe(const OperativenSistem &os) { //метод за проверка на еднаквост помеѓу два оперативни системи
  55.     if((strcmp(this->ime, os.ime)==0)&&this->verzija==os.verzija&&this->vid == os.vid && this->golemina == os.golemina)
  56.     //(два оперативни системи се еднакви ако имаат исто име, верзија, тип и големина) -
  57.     return true;
  58.     else return false;
  59.     }//bool ednakviSe(const OperativenSistem &os)
  60.     int sporediVerzija(const OperativenSistem &os) { //метод за споредба на верзии помеѓу два оперативни система -
  61.     if(this->verzija == os.verzija) //int sporediVerzija(const OperativenSistem &os),
  62.     return 0; //кој ќе враќа 0 доколку верзиите се исти,
  63.     if(os.verzija > this->verzija)
  64.     return -1; //-1 доколку верзијата на оперативниот систем од аргументот е поголема
  65.     else return 1; //и 1 во преостанатиот случај.
  66.     }
  67.     bool istaFamilija(const OperativenSistem &sporedba) { //метод за проверка дали два оперативни системи
  68.     if(strcmp(this->ime, sporedba.ime)==0 && this->vid == sporedba.vid) //се од иста фамилија.
  69.     return true; //Два оперативни системи се од иста фамилија доколку имаат исто име и се од ист тип.
  70.     else return false; //bool istaFamilija(const OperativenSistem &sporedba)
  71.     }
  72. };
  73. class Repozitorium { //Repozitorium
  74. private: //Во класата Repozitorium треба да се чуваат следниве податоци:
  75. char ime[20]; //име на репозиториумот (низа од 20 знака)
  76. OperativenSistem * niza; // динамички алоцирана низа од OperativenSistem
  77. int broj; //број на оперативни системи кои моментално се наоѓаат во репозиториумот (int)
  78. public: //Дополнително, во рамките на класата потребно е да се дефинира:
  79.     Repozitorium(){
  80.         strcpy(this->ime, "");
  81.     }
  82.     Repozitorium (const char * ime) { //конструктор Repozitorium(const char *ime)
  83.     strcpy(this->ime, ime);
  84.         this->niza = new OperativenSistem[0];
  85.         this->broj = 0;
  86.     }
  87.     ~Repozitorium(){
  88.         delete [] niza;
  89.     } //деструктор
  90.     Repozitorium(const Repozitorium &rt) {
  91.     strcpy(this->ime, rt.ime);
  92.         this->broj = rt.broj;
  93.         this->niza = new OperativenSistem[rt.broj];
  94.         for(int i=0;i<rt.broj;i++)
  95.             this->niza[i]=niza[i];
  96.     }
  97.      void pecatiOperativniSistemi() { //метод void pecatiOperativniSistemi() кој ќе ги печати сите
  98.     cout<<"Repozitorium: "<<ime<<endl;
  99.         for(int i=0; i<broj; i++)//оперативни системи кои се дел од репозиториумот
  100.     niza[i].pecati();
  101.      }
  102.     void izbrishi(const OperativenSistem &operativenSistem) { //метод void izbrishi(const OperativenSistem &operativenSistem)
  103.        int count = 0;
  104.     for(int i=0; i<broj; i++) { //Да се користи методот ednakviSe за споредба на два оперативни система.
  105.         if(niza[i].ednakviSe(operativenSistem)==false) { //fakticki site ce gi vrte so ne se ednakvi
  106.         count++; // da dobie novbroj na operativni unikatni sistemi
  107.         }//brr
  108.     }
  109.         OperativenSistem * tmp = new OperativenSistem[count]; // i sea nova lista so brojot na tia so se unikatni
  110.        count = 0; // counter pak na 0
  111.        for (int i = 0; i < broj; i++) { // vrti gi site od nizata
  112.      if (niza[i].ednakviSe(operativenSistem)==false) { // e sea samo tia so se unikatni smeat da vlezat
  113.    tmp[count++] = niza[i]; // site od orig niza da se staat u novata niza so novoto brojce++
  114.    }
  115.         }
  116.     delete [] niza;
  117. niza = tmp;
  118.    broj = count;
  119.    }
  120. void dodadi(const OperativenSistem &nov){
  121.     for(int i=0; i<broj; i++) { //кој ќе го има следново однесување:
  122.   //   Доколку веќе постои оперативен систем од иста фамилија
  123.         if  ((niza[i].istaFamilija(nov) == true) && niza[i].sporediVerzija(nov) == -1)  {
  124.        niza[i] = nov; // can i do this ne mi se cine bas legit
  125.      return ;
  126.      }
  127.     }
  128.    OperativenSistem * tmp = new OperativenSistem[broj+1];
  129.        for(int i=0; i<broj; i++)
  130.         tmp[i] = niza[i];
  131.         tmp[broj++] = nov;
  132.          delete [] niza;
  133.     this->niza = new OperativenSistem[broj];
  134.     for(int i=0; i<broj; i++)
  135.         this->niza[i] = tmp[i];
  136.     }// Во секој друг случај, проследениот оперативен систем се додава како дополнителен во репозиториумот.
  137. };  
  138. int main() {
  139.     char repoName[20];
  140.     cin>>repoName;
  141.     Repozitorium repozitorium=Repozitorium(repoName);
  142.     int brojOperativniSistemi = 0;
  143.     cin>>brojOperativniSistemi;
  144.     char ime[20];
  145.     float verzija;
  146.     int tip;
  147.     float golemina;
  148.     for (int i = 0; i<brojOperativniSistemi; i++){
  149.         cin>>ime;
  150.         cin>>verzija;
  151.         cin>>tip;
  152.         cin>>golemina;
  153.         OperativenSistem os = OperativenSistem(ime, verzija, (Tip)tip, golemina);
  154.         repozitorium.dodadi(os);
  155.     }
  156.     repozitorium.pecatiOperativniSistemi();
  157.      cin>>ime;
  158.     cin>>verzija;
  159.     cin>>tip;
  160.     cin>>golemina;
  161.     OperativenSistem os = OperativenSistem(ime, verzija, (Tip)tip, golemina);
  162.     cout<<"=====Brishenje na operativen sistem====="<<endl;
  163.     repozitorium.izbrishi(os);
  164.     repozitorium.pecatiOperativniSistemi();
  165.     return 0;
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement