brsjak

Code - Zadaca 2 - OOP

Jan 10th, 2017
636
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 16.09 KB | None | 0 0
  1. /*
  2. Задача 2 Problem 3 (11 / 25)
  3. Да се имплементира класа Trud во која се чуваат информации за:
  4.  
  5. вид на труд (еден знак и тоа C за конференциски труд, J за труд во списание)
  6. година на издавање (цел број).
  7. Да се имплементира класа Student во која се чува:
  8.  
  9. името на студентот (низа од најмногу 30 карактери)
  10. индекс (цел број)
  11. година на упис (цел број)
  12. листа на оцени од положени предмети (низа од цели броеви)
  13. број на положени предмети (цел број)
  14. За оваа класа да се имплементираат следните методи:
  15.  
  16. функција rang() што пресметува просек од положените испити на студентот
  17. оператор << за печатење на студентот во формат:
  18. Индекс Име Година на упис  ранг
  19.  
  20. Да се имплементира класа PhDStudent во која покрај основните информации за студентот дополнително се чува:
  21.  
  22. листа од објавени трудови (динамички резервирана низа од објекти од класата Trud)
  23. бројот на трудови (цел број)
  24. Во оваа класа да се препокрие соодветно функцијата rang() така што на просекот од положените испити ќе се додаде и збирот од поените од објавените трудови на PhD студентот. Во зависност од видот на трудот, секој универзитет има посебен начин на бодување на трудовите. Начинот на бодување е ист за сите PhD студенти. Иницијално да се смета дека конференциски труд се бодува со 1 поен, а труд во списание со 3 поени. Универзитетот има можност да ги менува вредностите на бодовите.
  25.  
  26. За оваа класа да се обезбеди:
  27.  
  28. оператор += за додавање нов објект од класата Trud во листата. Ако се направи обид да се внесе труд што е издаден порано од годината на упис на студентот да се фрли исклучок (објект од класата Exception). Справувањето со исклучокот треба да се реализира во главната функција main каде што е потребно, но и во конструктор ако е потребно. Ако бил генериран исклучок треба да се отпечати соодветна порака за грешка "Ne moze da se vnese dadeniot trud", а новиот труд нема да се внесе во листата на трудови од студентот.
  29. Напомена: Сите променливи на класите се чуваат како приватни.
  30.  
  31. Да се обезбедат сите потребни функции за правилно функционирање на програмата.
  32. */
  33. #include <iostream>
  34. #include <cstring>
  35. using namespace std;
  36. class Exception {};
  37. class Trud {
  38. private:
  39.     char vidTrud;
  40.     int godinaIzdavanje;
  41.     static int J;
  42.     static int C;
  43. public:
  44.     Trud() {}
  45.     Trud(char vidTrud,int godinaIzdavanje) {
  46.         this->vidTrud = vidTrud;
  47.         this->godinaIzdavanje = godinaIzdavanje;
  48.     }
  49.     int getGodinaIzdavanje() {
  50.         return godinaIzdavanje;
  51.     }
  52.     char getVidTrud() {
  53.         return vidTrud;
  54.     }
  55.     int getC() {
  56.         return C;
  57.     }
  58.     int getJ() {
  59.         return J;
  60.     }
  61.     static void setJ(int j) {
  62.         J = j;
  63.     }
  64.     static void setC(int c) {
  65.         C = c;
  66.     }
  67.     friend istream& operator>> (istream& in,Trud &t) {
  68.         in>>t.vidTrud;
  69.         in>>t.godinaIzdavanje;
  70.         return in;
  71.     }
  72.     ~Trud() {}
  73. };
  74. int Trud::J = 3;
  75. int Trud::C = 1;
  76. class Student {
  77. protected:
  78.     char ime[30];
  79.     int index;
  80.     int godinaUpis;
  81.     int oceni[30];
  82.     int brOceni;
  83.     bool isphd;
  84. public:
  85.     Student() {}
  86.     Student(char ime[],int index,int godinaUpis, int oceni[],int brOceni) {
  87.         strcpy(this->ime,ime);
  88.         this->index = index;
  89.         this->godinaUpis = godinaUpis;
  90.         this->brOceni = brOceni;
  91.         isphd=false;
  92.         for(int i=0; i<brOceni; i++) {
  93.             this->oceni[i] = oceni[i];
  94.         }
  95.     }
  96.     int getIndex() {
  97.         return index;
  98.     }
  99.     void setPHD()
  100.     {
  101.     isphd=true;
  102.     }
  103.     bool getPHD()
  104.     {
  105.     return isphd;
  106.     }
  107.     virtual float rang() {
  108.         int suma=0;
  109.         for(int i=0; i<brOceni; i++) {
  110.             suma = suma + oceni[i];
  111.         }
  112.         return (float)suma / brOceni;
  113.     }
  114.     friend ostream& operator<<(ostream &out,Student &s) {
  115.         out<<s.index<<" "<<s.ime<<" "<<s.godinaUpis<<" "<<s.rang()<<endl;
  116.         return out;
  117.     }
  118.     ~Student() {}
  119.  
  120. };
  121. class PhDStudent : public Student {
  122. private:
  123.     Trud *trudovi;
  124.     int brTrudovi;
  125. public:
  126.     PhDStudent() {
  127.         brTrudovi=0;
  128.         trudovi = new Trud [brTrudovi];
  129.     }
  130.     PhDStudent(char ime[],int index,int godinaUpis, int oceni[],int brOceni,Trud trudovi[],int brTrudovi) : Student(ime,index,godinaUpis,oceni,brOceni)
  131.  
  132.     {
  133.         Student::setPHD();
  134.         this->brTrudovi = brTrudovi;
  135.         this->trudovi = new Trud [ brTrudovi];
  136.         for(int i =0; i<brTrudovi; i++) {
  137.             try {
  138.                 if(trudovi[i].getGodinaIzdavanje()<godinaUpis)
  139.                     throw Exception();
  140.                 this->trudovi[i] = trudovi[i];
  141.             }
  142.             catch(Exception)
  143.             {
  144.                 cout<<"Ne moze da se vnese dadeniot trud"<<endl;
  145.             }
  146.  
  147.         }
  148.  
  149.     }
  150.     float rang() {
  151.         float r = Student::rang();
  152.         for(int i=0; i<brTrudovi; i++) {
  153.             if(trudovi[i].getVidTrud()=='C' || trudovi[i].getVidTrud()=='c')
  154.                 r = r + trudovi[i].getC();
  155.             else if(trudovi[i].getVidTrud()=='J' || trudovi[i].getVidTrud()=='j')
  156.                 r = r + trudovi[i].getJ();
  157.  
  158.         }
  159.         return r;
  160.     }
  161.     PhDStudent& operator+=(Trud &nov) {
  162.         if(nov.getGodinaIzdavanje()<godinaUpis) {
  163.             throw Exception();
  164.         }
  165.         Trud *temp;
  166.         temp = new Trud[brTrudovi+1];
  167.         for(int i=0; i<brTrudovi; i++) {
  168.             temp[i] = trudovi[i];
  169.  
  170.         }
  171.         temp[brTrudovi] = nov;
  172.         delete []trudovi;
  173.         trudovi = temp;
  174.         brTrudovi++;
  175.         return *this;
  176.     }
  177.     ~PhDStudent() {
  178.         //delete []trudovi;
  179.     }
  180. };
  181.  
  182. int main() {
  183.     int testCase;
  184.     cin >> testCase;
  185.  
  186.     int god, indeks, n, god_tr, m, n_tr;
  187.     int izbor; //0 za Student, 1 za PhDStudent
  188.     char ime[30];
  189.     int oceni[50];
  190.     char tip;
  191.     Trud trud[50];
  192.  
  193.     if (testCase == 1) {
  194.         cout << "===== Testiranje na klasite ======" << endl;
  195.         cin >> ime;
  196.         cin >> indeks;
  197.         cin >> god;
  198.         cin >> n;
  199.         for (int j = 0; j < n; j++)
  200.             cin >> oceni[j];
  201.         Student s(ime, indeks, god, oceni, n);
  202.         cout << s;
  203.  
  204.         cin >> ime;
  205.         cin >> indeks;
  206.         cin >> god;
  207.         cin >> n;
  208.         for (int j = 0; j < n; j++)
  209.             cin >> oceni[j];
  210.         cin >> n_tr;
  211.         for (int j = 0; j < n_tr; j++) {
  212.             cin >> tip;
  213.             cin >> god_tr;
  214.             Trud t(tip, god_tr);
  215.             trud[j] = t;
  216.         }
  217.         PhDStudent phd(ime, indeks, god, oceni, n, trud, n_tr);
  218.         cout << phd;
  219.     }
  220.     if (testCase == 2) {
  221.         cout << "===== Testiranje na operatorot += ======" << endl;
  222.         Student **niza;
  223.         cin >> m;
  224.         niza = new Student *[m];
  225.         for (int i = 0; i<m; i++) {
  226.             cin >> izbor;
  227.             cin >> ime;
  228.             cin >> indeks;
  229.             cin >> god;
  230.             cin >> n;
  231.             for (int j = 0; j < n; j++)
  232.                 cin >> oceni[j];
  233.  
  234.             if (izbor == 0) {
  235.                 niza[i] = new Student(ime, indeks, god, oceni, n);
  236.             } else {
  237.                 cin >> n_tr;
  238.                 for (int j = 0; j < n_tr; j++) {
  239.                     cin >> tip;
  240.                     cin >> god_tr;
  241.                     Trud t(tip, god_tr);
  242.                     trud[j] = t;
  243.                 }
  244.                 niza[i] = new PhDStudent(ime, indeks, god, oceni, n, trud, n_tr);
  245.             }
  246.         }
  247.         // pecatenje na site studenti
  248.         cout << "\nLista na site studenti:\n";
  249.         for (int i = 0; i < m; i++)
  250.             cout << *niza[i];
  251.  
  252.         // dodavanje nov trud za PhD student spored indeks
  253.         Trud t;
  254.         cin >> indeks;
  255.         cin >> t;
  256.         bool najde= false;
  257.         for(int i=0;i<m;i++)
  258.         {
  259.             if(niza[i]->getIndex()==indeks&&niza[i]->getPHD())
  260.             {
  261.                 najde = true;
  262.                 PhDStudent *p= dynamic_cast<PhDStudent*>(niza[i]);
  263.                 if(p!=0)
  264.                 {
  265.                     try{
  266.                        *p+=t;
  267.                     }
  268.                     catch(Exception)
  269.                     {
  270.                         cout<<"Ne moze da se vnese dadeniot trud"<<endl;
  271.                     }
  272.                    
  273.                 }
  274.             }
  275.         }
  276.         if(najde==false)
  277.         {
  278.             cout<<"Ne postoi PhD student so indeks "<<indeks<<endl;
  279.         }
  280.         // vmetnete go kodot za dodavanje nov trud so pomos na operatorot +=
  281.  
  282.         // pecatenje na site studenti
  283.         cout << "\nLista na site studenti:\n";
  284.         for (int i = 0; i < m; i++)
  285.             cout << *niza[i];
  286.     }
  287.     if (testCase == 3) {
  288.         cout << "===== Testiranje na operatorot += ======" << endl;
  289.         Student **niza;
  290.         cin >> m;
  291.         niza = new Student *[m];
  292.         for (int i = 0; i<m; i++) {
  293.             cin >> izbor;
  294.             cin >> ime;
  295.             cin >> indeks;
  296.             cin >> god;
  297.             cin >> n;
  298.             for (int j = 0; j < n; j++)
  299.                 cin >> oceni[j];
  300.  
  301.             if (izbor == 0) {
  302.                 niza[i] = new Student(ime, indeks, god, oceni, n);
  303.             } else {
  304.                 cin >> n_tr;
  305.                 for (int j = 0; j < n_tr; j++) {
  306.                     cin >> tip;
  307.                     cin >> god_tr;
  308.                     Trud t(tip, god_tr);
  309.                     trud[j] = t;
  310.                 }
  311.                 niza[i] = new PhDStudent(ime, indeks, god, oceni, n, trud, n_tr);
  312.             }
  313.         }
  314.         // pecatenje na site studenti
  315.         cout << "\nLista na site studenti:\n";
  316.         for (int i = 0; i < m; i++)
  317.             cout << *niza[i];
  318.  
  319.         // dodavanje nov trud za PhD student spored indeks
  320.         Trud t;
  321.         cin >> indeks;
  322.         cin >> t;
  323.        
  324.         bool najde= false;
  325.         for(int i=0;i<m;i++)
  326.         {
  327.             if(niza[i]->getIndex()==indeks && niza[i]->getPHD())
  328.             {
  329.                 najde = true;
  330.                 PhDStudent *p= dynamic_cast<PhDStudent*>(niza[i]);
  331.                 if(p!=0)
  332.                 {
  333.                     try{
  334.                        *p+=t;
  335.                     }
  336.                     catch(Exception)
  337.                     {
  338.                         cout<<"Ne moze da se vnese dadeniot trud"<<endl;
  339.                     }
  340.                    
  341.                 }
  342.             }
  343.         }
  344.         if(najde==false)
  345.         {
  346.             cout<<"Ne postoi PhD student so indeks "<<indeks<<endl;
  347.         }
  348.         // vmetnete go kodot za dodavanje nov trud so pomos na operatorot += od Testcase 2
  349.  
  350.  
  351.         // pecatenje na site studenti
  352.         cout << "\nLista na site studenti:\n";
  353.         for (int i = 0; i < m; i++)
  354.             cout << *niza[i];
  355.     }
  356.     if (testCase == 4) {
  357.         cout << "===== Testiranje na isklucoci ======" << endl;
  358.         cin >> ime;
  359.         cin >> indeks;
  360.         cin >> god;
  361.         cin >> n;
  362.         for (int j = 0; j < n; j++)
  363.             cin >> oceni[j];
  364.         cin >> n_tr;
  365.         for (int j = 0; j < n_tr; j++) {
  366.             cin >> tip;
  367.             cin >> god_tr;
  368.             Trud t(tip, god_tr);
  369.             trud[j] = t;
  370.         }
  371.         PhDStudent phd(ime, indeks, god, oceni, n, trud, n_tr);
  372.         cout << phd;
  373.     }
  374.     if (testCase == 5) {
  375.         cout << "===== Testiranje na isklucoci ======" << endl;
  376.         Student **niza;
  377.         cin >> m;
  378.         niza = new Student *[m];
  379.         for (int i = 0; i<m; i++) {
  380.             cin >> izbor;
  381.             cin >> ime;
  382.             cin >> indeks;
  383.             cin >> god;
  384.             cin >> n;
  385.             for (int j = 0; j < n; j++)
  386.                 cin >> oceni[j];
  387.  
  388.             if (izbor == 0) {
  389.                 niza[i] = new Student(ime, indeks, god, oceni, n);
  390.             } else {
  391.                 cin >> n_tr;
  392.                 for (int j = 0; j < n_tr; j++) {
  393.                     cin >> tip;
  394.                     cin >> god_tr;
  395.                     Trud t(tip, god_tr);
  396.                     trud[j] = t;
  397.                 }
  398.                 niza[i] = new PhDStudent(ime, indeks, god, oceni, n, trud, n_tr);
  399.             }
  400.         }
  401.         // pecatenje na site studenti
  402.         cout << "\nLista na site studenti:\n";
  403.         for (int i = 0; i < m; i++)
  404.             cout << *niza[i];
  405.  
  406.         // dodavanje nov trud za PhD student spored indeks
  407.         Trud t;
  408.         cin >> indeks;
  409.         cin >> t;
  410.        
  411.         bool najde= false;
  412.         for(int i=0;i<m;i++)
  413.         {
  414.             if(niza[i]->getIndex()==indeks && niza[i]->getPHD())
  415.             {
  416.                 najde = true;
  417.                 PhDStudent *p= dynamic_cast<PhDStudent*>(niza[i]);
  418.                 if(p!=0)
  419.                 {
  420.                     try{
  421.                        *p+=t;
  422.                     }
  423.                     catch(Exception)
  424.                     {
  425.                         cout<<"Ne moze da se vnese dadeniot trud"<<endl;
  426.                     }
  427.                    
  428.                 }
  429.             }
  430.         }
  431.         if(najde==false)
  432.         {
  433.             cout<<"Ne postoi PhD student so indeks "<<indeks<<endl;
  434.         }
  435.         // vmetnete go kodot za dodavanje nov trud so pomos na operatorot += i spravete se so isklucokot
  436.  
  437.         // pecatenje na site studenti
  438.         cout << "\nLista na site studenti:\n";
  439.         for (int i = 0; i < m; i++)
  440.             cout << *niza[i];
  441.     }
  442.     if (testCase == 6) {
  443.         cout << "===== Testiranje na static clenovi ======" << endl;
  444.         Student **niza;
  445.         cin >> m;
  446.         niza = new Student *[m];
  447.         for (int i = 0; i<m; i++) {
  448.             cin >> izbor;
  449.             cin >> ime;
  450.             cin >> indeks;
  451.             cin >> god;
  452.             cin >> n;
  453.             for (int j = 0; j < n; j++)
  454.                 cin >> oceni[j];
  455.  
  456.             if (izbor == 0) {
  457.                 niza[i] = new Student(ime, indeks, god, oceni, n);
  458.             } else {
  459.                 cin >> n_tr;
  460.                 for (int j = 0; j < n_tr; j++) {
  461.                     cin >> tip;
  462.                     cin >> god_tr;
  463.                     Trud t(tip, god_tr);
  464.                     trud[j] = t;
  465.                 }
  466.                 niza[i] = new PhDStudent(ime, indeks, god, oceni, n, trud, n_tr);
  467.             }
  468.         }
  469.         // pecatenje na site studenti
  470.         cout << "\nLista na site studenti:\n";
  471.         for (int i = 0; i < m; i++)
  472.             cout << *niza[i];
  473.  
  474.         int conf, journal;
  475.         cin >> conf;
  476.         cin >> journal;
  477.  
  478.         Trud::setJ(journal);
  479.         Trud::setC(conf);
  480.  
  481.         // pecatenje na site studenti
  482.         cout << "\nLista na site studenti:\n";
  483.         for (int i = 0; i < m; i++)
  484.             cout << *niza[i];
  485.     }
  486.  
  487.     return 0;
  488. }
Add Comment
Please, Sign In to add comment