Advertisement
196040

OOP zadaci za vezbanje 2 Naucni trudovi nogu FALICNA

Jun 16th, 2020
581
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.10 KB | None | 0 0
  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. class Exception {
  5. private:
  6.     char msg[50];
  7. public:
  8.     Exception(char * msg = "") {
  9.         strcpy(this->msg, msg);
  10.     }
  11.     void showMessage() {
  12.         cout<<msg;
  13.     }
  14. };
  15. class Trud { //Да се имплементира класа Trud
  16. protected://во која се чуваат информации за: (5 поени)
  17.     char vid; //вид на труд (еден знак и тоа C за конференциски труд, J за труд во списание)
  18.     int godina;//година на издавање (цел број).
  19. public:
  20.     Trud() {
  21.         this->vid = 'A';
  22.         this->godina = 0;
  23.     }
  24.     Trud(char vid, int godina) {
  25.         this->vid = vid;
  26.         this->godina = godina;
  27.     }
  28.     int getgodina() {
  29.         return godina;
  30.     }
  31.     friend istream &operator>>(istream &i, Trud &t){
  32.     i>>t.vid>>t.godina;
  33.         return i;
  34.     }
  35.     char gettrud() {
  36.     return vid;
  37.     }
  38. };
  39. class Student { //Да се имплементира класа Student
  40. private://во која се чува: (5 поени)
  41.     char ime[30]; //името на студентот (низа од најмногу 30 карактери)
  42.     int indeks; //индекс (цел број)
  43.     int upis; //година на упис (цел број)
  44.     int * lista; //листа на оцени од положени предмети (низа од цели броеви)
  45.     int broj; //број на положени предмети (цел број)
  46. public:
  47.     Student() {
  48.         strcpy(this->ime , "");
  49.         this->indeks = 0;
  50.         this->upis = 0;
  51.         this->lista = new int[0];
  52.         this->broj = 0;
  53.     }
  54.     Student(char * ime, int indeks, int upis, int * lista, int broj) {
  55.         strcpy(this->ime, ime);
  56.         this->indeks = indeks;
  57.         this->upis = upis;
  58.         this->broj = broj;
  59.         this->lista = new int[broj];
  60.         for(int i=0; i<broj; i++)
  61.             this->lista[i] = lista[i];
  62.     }
  63.     Student(const Student &copy) {
  64.         strcpy(this->ime, copy.ime);
  65.         this->indeks = copy.indeks;
  66.         this->upis = copy.upis;
  67.         this->broj = copy.broj;
  68.         this->lista = new int[copy.broj];
  69.         for(int i=0; i<copy.broj; i++)
  70.             this->lista[i] = copy.lista[i];
  71.     }
  72.     Student &operator=(const Student &copy) {
  73.         if(this!=&copy) {
  74.             strcpy(this->ime, copy.ime);
  75.             this->indeks = copy.indeks;
  76.             this->upis = copy.upis;
  77.             this->broj = copy.broj;
  78.             this->lista = new int[copy.broj];
  79.             for(int i=0; i<copy.broj; i++)
  80.                 this->lista[i] = copy.lista[i];
  81.         }
  82.         return *this;
  83.     }
  84.     int getupis() {
  85.         return upis;
  86.     }
  87.     int getindeks() {
  88.     return indeks;
  89.     }
  90.     ~Student() {
  91.         delete [] lista;
  92.     }
  93.   virtual double rang() { //функција rang() што пресметува просек од положените испити на студентот (5 поени)
  94.    double total=0.0;
  95.         for(int i=0;i<broj;i++)
  96.             total = total + lista[i];
  97.         return total/broj;
  98. }
  99. friend ostream &operator<<(ostream &o, Student &print) { //оператор << за печатење на студентот во формат: (5 поени)
  100.     o<<print.indeks<<" "<<print.ime<<" "<<print.upis<<" "<<print.rang()<<endl;// Индекс Име Година на упис ранг
  101.     return o;
  102. }
  103. };
  104. class PhDStudent : public Student { //Да се имплементира класа PhDStudent во која
  105. private://покрај основните информации за студентот дополнително се чува: (5 поени)
  106.     Trud * niza; //листа од објавени трудови (динамички резервирана низа од објекти од класата Trud)
  107.     int trudovi; //бројот на трудови (цел број)
  108. public:
  109.     PhDStudent() {
  110.         this->trudovi = 0;
  111.         this->niza = new Trud[0];
  112.     }
  113.     PhDStudent(char * ime, int indeks, int upis, int * lista, int broj, Trud * niza, int trudovi) : Student(ime, indeks, upis, lista, broj) {
  114.         this->trudovi = trudovi;
  115.         this->niza = new Trud[trudovi];
  116.         for(int i=0; i<trudovi; i++)
  117.             this->niza[i] = niza[i];
  118.     }
  119.     PhDStudent(const PhDStudent &copy) : Student(copy) {
  120.         this->trudovi = copy.trudovi;
  121.         this->niza = new Trud[copy.trudovi];
  122.         for(int i=0; i<copy.trudovi; i++)
  123.             this->niza[i] = copy.niza[i];
  124.     }
  125.     PhDStudent &operator=(const PhDStudent &copy) {
  126.         if(this!=&copy) {
  127.             Student::operator=(copy);
  128.             this->trudovi = copy.trudovi;
  129.             this->niza = new Trud[copy.trudovi];
  130.             for(int i=0; i<copy.trudovi; i++)
  131.                 this->niza[i] = copy.niza[i];
  132.         }
  133.     }
  134.     ~PhDStudent() {
  135.         delete [] niza;
  136.     }
  137.     PhDStudent &operator+=(Trud &add) { //оператор += за додавање нов објект од класата Trud во листата.
  138.         if(add.getgodina() > getupis()) //Ако се направи обид да се внесе труд што е издаден порано од годината на упис на студентот
  139.             throw Exception("Ne moze da se vnese dadeniot trud\n"); //да се фрли исклучок (објект од класата Exception).
  140.         Trud * tmp = new Trud [trudovi+1]; //Ако бил генерираn исклучок треба да се отпечати
  141.         for(int i=0;i<trudovi;i++) //соодветна порака за грешка "Ne moze da se vnese dadeniot trud",
  142.             tmp[i] = niza[i]; //  а новиот труд нема да се внесе во листата на трудови од студентот. (10 поени)
  143.         tmp[trudovi++] = add;
  144.         delete [] niza;
  145.         niza = tmp;
  146.         return *this;
  147.     }
  148.     double rang() { //Начинот на бодување е ист за сите PhD студенти.
  149.         double pt=0.0; //Иницијално да се смета дека конференциски труд
  150.         for(int i=0; i<trudovi; i++) {
  151.             if(niza[i].gettrud() == 'c')
  152.             pt++;//се бодува со 1 поен, а труд во списание со 3 поени.
  153.             else if(niza[i].gettrud() == 'j')
  154.             pt=pt+3;
  155.         }
  156.         return Student::rang() + pt;
  157.     }
  158. };
  159.  //Универзитетот има можност да ги менува вредностите на бодовите. (5 поени + 5 поени)
  160. int main() {
  161.     int testCase;
  162.     cin >> testCase;
  163.     int god, indeks, n, god_tr, m, n_tr;
  164.     int izbor; //0 za Student, 1 za PhDStudent
  165.     char ime[30];
  166.     int oceni[50];
  167.     char tip;
  168.     Trud trud[50];
  169.     if (testCase == 1) {
  170.         cout << "===== Testiranje na klasite ======" << endl;
  171.         cin >> ime;
  172.         cin >> indeks;
  173.         cin >> god;
  174.         cin >> n;
  175.         for (int j = 0; j < n; j++)
  176.             cin >> oceni[j];
  177.         Student s(ime, indeks, god, oceni, n);
  178.         cout << s;
  179.         cin >> ime;
  180.         cin >> indeks;
  181.         cin >> god;
  182.         cin >> n;
  183.         for (int j = 0; j < n; j++)
  184.             cin >> oceni[j];
  185.         cin >> n_tr;
  186.         for (int j = 0; j < n_tr; j++) {
  187.             cin >> tip;
  188.             cin >> god_tr;
  189.             Trud t(tip, god_tr);
  190.             trud[j] = t;
  191.         }
  192.         PhDStudent phd(ime, indeks, god, oceni, n, trud, n_tr);
  193.         cout << phd;
  194.     }
  195.     if (testCase == 2) {
  196.         cout << "===== Testiranje na operatorot += ======" << endl;
  197.         Student **niza;
  198.         cin >> m;
  199.         niza = new Student *[m];
  200.         for (int i = 0; i<m; i++) {
  201.             cin >> izbor;
  202.             cin >> ime;
  203.             cin >> indeks;
  204.             cin >> god;
  205.             cin >> n;
  206.             for (int j = 0; j < n; j++)
  207.                 cin >> oceni[j];
  208.             if (izbor == 0) {
  209.                 niza[i] = new Student(ime, indeks, god, oceni, n);
  210.             } else {
  211.                 cin >> n_tr;
  212.                 for (int j = 0; j < n_tr; j++) {
  213.                     cin >> tip;
  214.                     cin >> god_tr;
  215.                     Trud t(tip, god_tr);
  216.                     trud[j] = t;
  217.                 }
  218.                 niza[i] = new PhDStudent(ime, indeks, god, oceni, n, trud, n_tr);
  219.             }
  220.         }
  221.         // pecatenje na site studenti
  222.         cout << "\nLista na site studenti:\n";
  223.         for (int i = 0; i < m; i++)
  224.             cout << *niza[i];
  225.  
  226.         // dodavanje nov trud za PhD student spored indeks
  227.         Trud t;
  228.         cin >> indeks;
  229.         cin >> t;
  230.         int count=0;
  231.         for (int i = 0; i < m; i++) {
  232.             if(niza[i]->getindeks() == indeks) {
  233.           PhDStudent* p1=dynamic_cast<PhDStudent *>(niza[i]);
  234.                 if (p1!=0)
  235.              *niza[i]+=t;
  236.             }
  237.         }
  238.         // vmetnete go kodot za dodavanje nov trud so pomos na operatorot +=
  239.   //  Справувањето со исклучокот треба да се реализира во главната
  240.      //   функција main каде што е потребно, но и во конструктор ако е потребно.
  241.         // pecatenje na site studenti
  242.         cout << "\nLista na site studenti:\n";
  243.         for (int i = 0; i < m; i++)
  244.             cout << *niza[i];
  245.     }
  246.     if (testCase == 3) {
  247.         cout << "===== Testiranje na operatorot += ======" << endl;
  248.         Student **niza;
  249.         cin >> m;
  250.         niza = new Student *[m];
  251.         for (int i = 0; i<m; i++) {
  252.             cin >> izbor;
  253.             cin >> ime;
  254.             cin >> indeks;
  255.             cin >> god;
  256.             cin >> n;
  257.             for (int j = 0; j < n; j++)
  258.                 cin >> oceni[j];
  259.  
  260.             if (izbor == 0) {
  261.                 niza[i] = new Student(ime, indeks, god, oceni, n);
  262.             } else {
  263.                 cin >> n_tr;
  264.                 for (int j = 0; j < n_tr; j++) {
  265.                     cin >> tip;
  266.                     cin >> god_tr;
  267.                     Trud t(tip, god_tr);
  268.                     trud[j] = t;
  269.                 }
  270.                 niza[i] = new PhDStudent(ime, indeks, god, oceni, n, trud, n_tr);
  271.             }
  272.         }
  273.         // pecatenje na site studenti
  274.         cout << "\nLista na site studenti:\n";
  275.         for (int i = 0; i < m; i++)
  276.             cout << *niza[i];
  277.  
  278.         // dodavanje nov trud za PhD student spored indeks
  279.         Trud t;
  280.         cin >> indeks;
  281.         cin >> t;
  282.  
  283.         // vmetnete go kodot za dodavanje nov trud so pomos na operatorot += od Testcase 2
  284.  
  285.  
  286.         // pecatenje na site studenti
  287.         cout << "\nLista na site studenti:\n";
  288.         for (int i = 0; i < m; i++)
  289.             cout << *niza[i];
  290.     }
  291.     if (testCase == 4) {
  292.         cout << "===== Testiranje na isklucoci ======" << endl;
  293.         cin >> ime;
  294.         cin >> indeks;
  295.         cin >> god;
  296.         cin >> n;
  297.         for (int j = 0; j < n; j++)
  298.             cin >> oceni[j];
  299.         cin >> n_tr;
  300.         for (int j = 0; j < n_tr; j++) {
  301.             cin >> tip;
  302.             cin >> god_tr;
  303.             Trud t(tip, god_tr);
  304.             trud[j] = t;
  305.         }
  306.         PhDStudent phd(ime, indeks, god, oceni, n, trud, n_tr);
  307.         cout << phd;
  308.     }
  309.     if (testCase == 5) {
  310.         cout << "===== Testiranje na isklucoci ======" << endl;
  311.         Student **niza;
  312.         cin >> m;
  313.         niza = new Student *[m];
  314.         for (int i = 0; i<m; i++) {
  315.             cin >> izbor;
  316.             cin >> ime;
  317.             cin >> indeks;
  318.             cin >> god;
  319.             cin >> n;
  320.             for (int j = 0; j < n; j++)
  321.                 cin >> oceni[j];
  322.  
  323.             if (izbor == 0) {
  324.                 niza[i] = new Student(ime, indeks, god, oceni, n);
  325.             } else {
  326.                 cin >> n_tr;
  327.                 for (int j = 0; j < n_tr; j++) {
  328.                     cin >> tip;
  329.                     cin >> god_tr;
  330.                     Trud t(tip, god_tr);
  331.                     trud[j] = t;
  332.                 }
  333.                 niza[i] = new PhDStudent(ime, indeks, god, oceni, n, trud, n_tr);
  334.             }
  335.         }
  336.         // pecatenje na site studenti
  337.         cout << "\nLista na site studenti:\n";
  338.         for (int i = 0; i < m; i++)
  339.             cout << *niza[i];
  340.  
  341.         // dodavanje nov trud za PhD student spored indeks
  342.         Trud t;
  343.         cin >> indeks;
  344.         cin >> t;
  345.  
  346.         // vmetnete go kodot za dodavanje nov trud so pomos na operatorot += i spravete se so isklucokot
  347.  
  348.         // pecatenje na site studenti
  349.         cout << "\nLista na site studenti:\n";
  350.         for (int i = 0; i < m; i++)
  351.             cout << *niza[i];
  352.     }
  353.     if (testCase == 6) {
  354.         cout << "===== Testiranje na static clenovi ======" << endl;
  355.         Student **niza;
  356.         cin >> m;
  357.         niza = new Student *[m];
  358.         for (int i = 0; i<m; i++) {
  359.             cin >> izbor;
  360.             cin >> ime;
  361.             cin >> indeks;
  362.             cin >> god;
  363.             cin >> n;
  364.             for (int j = 0; j < n; j++)
  365.                 cin >> oceni[j];
  366.  
  367.             if (izbor == 0) {
  368.                 niza[i] = new Student(ime, indeks, god, oceni, n);
  369.             } else {
  370.                 cin >> n_tr;
  371.                 for (int j = 0; j < n_tr; j++) {
  372.                     cin >> tip;
  373.                     cin >> god_tr;
  374.                     Trud t(tip, god_tr);
  375.                     trud[j] = t;
  376.                 }
  377.                 niza[i] = new PhDStudent(ime, indeks, god, oceni, n, trud, n_tr);
  378.             }
  379.         }
  380.         // pecatenje na site studenti
  381.         cout << "\nLista na site studenti:\n";
  382.         for (int i = 0; i < m; i++)
  383.             cout << *niza[i];
  384.  
  385.         int conf, journal;
  386.         cin >> conf;
  387.         cin >> journal;
  388.  
  389.         //postavete gi soodvetnite vrednosti za statickite promenlivi
  390.  
  391.         // pecatenje na site studenti
  392.         cout << "\nLista na site studenti:\n";
  393.         for (int i = 0; i < m; i++)
  394.             cout << *niza[i];
  395.     }
  396.  
  397.     return 0;
  398. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement