Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Задача 2 Problem 3 (11 / 25)
- Да се имплементира класа Trud во која се чуваат информации за:
- вид на труд (еден знак и тоа C за конференциски труд, J за труд во списание)
- година на издавање (цел број).
- Да се имплементира класа Student во која се чува:
- името на студентот (низа од најмногу 30 карактери)
- индекс (цел број)
- година на упис (цел број)
- листа на оцени од положени предмети (низа од цели броеви)
- број на положени предмети (цел број)
- За оваа класа да се имплементираат следните методи:
- функција rang() што пресметува просек од положените испити на студентот
- оператор << за печатење на студентот во формат:
- Индекс Име Година на упис ранг
- Да се имплементира класа PhDStudent во која покрај основните информации за студентот дополнително се чува:
- листа од објавени трудови (динамички резервирана низа од објекти од класата Trud)
- бројот на трудови (цел број)
- Во оваа класа да се препокрие соодветно функцијата rang() така што на просекот од положените испити ќе се додаде и збирот од поените од објавените трудови на PhD студентот. Во зависност од видот на трудот, секој универзитет има посебен начин на бодување на трудовите. Начинот на бодување е ист за сите PhD студенти. Иницијално да се смета дека конференциски труд се бодува со 1 поен, а труд во списание со 3 поени. Универзитетот има можност да ги менува вредностите на бодовите.
- За оваа класа да се обезбеди:
- оператор += за додавање нов објект од класата Trud во листата. Ако се направи обид да се внесе труд што е издаден порано од годината на упис на студентот да се фрли исклучок (објект од класата Exception). Справувањето со исклучокот треба да се реализира во главната функција main каде што е потребно, но и во конструктор ако е потребно. Ако бил генериран исклучок треба да се отпечати соодветна порака за грешка "Ne moze da se vnese dadeniot trud", а новиот труд нема да се внесе во листата на трудови од студентот.
- Напомена: Сите променливи на класите се чуваат како приватни.
- Да се обезбедат сите потребни функции за правилно функционирање на програмата.
- */
- #include <iostream>
- #include <cstring>
- using namespace std;
- class Exception {};
- class Trud {
- private:
- char vidTrud;
- int godinaIzdavanje;
- static int J;
- static int C;
- public:
- Trud() {}
- Trud(char vidTrud,int godinaIzdavanje) {
- this->vidTrud = vidTrud;
- this->godinaIzdavanje = godinaIzdavanje;
- }
- int getGodinaIzdavanje() {
- return godinaIzdavanje;
- }
- char getVidTrud() {
- return vidTrud;
- }
- int getC() {
- return C;
- }
- int getJ() {
- return J;
- }
- static void setJ(int j) {
- J = j;
- }
- static void setC(int c) {
- C = c;
- }
- friend istream& operator>> (istream& in,Trud &t) {
- in>>t.vidTrud;
- in>>t.godinaIzdavanje;
- return in;
- }
- ~Trud() {}
- };
- int Trud::J = 3;
- int Trud::C = 1;
- class Student {
- protected:
- char ime[30];
- int index;
- int godinaUpis;
- int oceni[30];
- int brOceni;
- bool isphd;
- public:
- Student() {}
- Student(char ime[],int index,int godinaUpis, int oceni[],int brOceni) {
- strcpy(this->ime,ime);
- this->index = index;
- this->godinaUpis = godinaUpis;
- this->brOceni = brOceni;
- isphd=false;
- for(int i=0; i<brOceni; i++) {
- this->oceni[i] = oceni[i];
- }
- }
- int getIndex() {
- return index;
- }
- void setPHD()
- {
- isphd=true;
- }
- bool getPHD()
- {
- return isphd;
- }
- virtual float rang() {
- int suma=0;
- for(int i=0; i<brOceni; i++) {
- suma = suma + oceni[i];
- }
- return (float)suma / brOceni;
- }
- friend ostream& operator<<(ostream &out,Student &s) {
- out<<s.index<<" "<<s.ime<<" "<<s.godinaUpis<<" "<<s.rang()<<endl;
- return out;
- }
- ~Student() {}
- };
- class PhDStudent : public Student {
- private:
- Trud *trudovi;
- int brTrudovi;
- public:
- PhDStudent() {
- brTrudovi=0;
- trudovi = new Trud [brTrudovi];
- }
- PhDStudent(char ime[],int index,int godinaUpis, int oceni[],int brOceni,Trud trudovi[],int brTrudovi) : Student(ime,index,godinaUpis,oceni,brOceni)
- {
- Student::setPHD();
- this->brTrudovi = brTrudovi;
- this->trudovi = new Trud [ brTrudovi];
- for(int i =0; i<brTrudovi; i++) {
- try {
- if(trudovi[i].getGodinaIzdavanje()<godinaUpis)
- throw Exception();
- this->trudovi[i] = trudovi[i];
- }
- catch(Exception)
- {
- cout<<"Ne moze da se vnese dadeniot trud"<<endl;
- }
- }
- }
- float rang() {
- float r = Student::rang();
- for(int i=0; i<brTrudovi; i++) {
- if(trudovi[i].getVidTrud()=='C' || trudovi[i].getVidTrud()=='c')
- r = r + trudovi[i].getC();
- else if(trudovi[i].getVidTrud()=='J' || trudovi[i].getVidTrud()=='j')
- r = r + trudovi[i].getJ();
- }
- return r;
- }
- PhDStudent& operator+=(Trud &nov) {
- if(nov.getGodinaIzdavanje()<godinaUpis) {
- throw Exception();
- }
- Trud *temp;
- temp = new Trud[brTrudovi+1];
- for(int i=0; i<brTrudovi; i++) {
- temp[i] = trudovi[i];
- }
- temp[brTrudovi] = nov;
- delete []trudovi;
- trudovi = temp;
- brTrudovi++;
- return *this;
- }
- ~PhDStudent() {
- //delete []trudovi;
- }
- };
- int main() {
- int testCase;
- cin >> testCase;
- int god, indeks, n, god_tr, m, n_tr;
- int izbor; //0 za Student, 1 za PhDStudent
- char ime[30];
- int oceni[50];
- char tip;
- Trud trud[50];
- if (testCase == 1) {
- cout << "===== Testiranje na klasite ======" << endl;
- cin >> ime;
- cin >> indeks;
- cin >> god;
- cin >> n;
- for (int j = 0; j < n; j++)
- cin >> oceni[j];
- Student s(ime, indeks, god, oceni, n);
- cout << s;
- cin >> ime;
- cin >> indeks;
- cin >> god;
- cin >> n;
- for (int j = 0; j < n; j++)
- cin >> oceni[j];
- cin >> n_tr;
- for (int j = 0; j < n_tr; j++) {
- cin >> tip;
- cin >> god_tr;
- Trud t(tip, god_tr);
- trud[j] = t;
- }
- PhDStudent phd(ime, indeks, god, oceni, n, trud, n_tr);
- cout << phd;
- }
- if (testCase == 2) {
- cout << "===== Testiranje na operatorot += ======" << endl;
- Student **niza;
- cin >> m;
- niza = new Student *[m];
- for (int i = 0; i<m; i++) {
- cin >> izbor;
- cin >> ime;
- cin >> indeks;
- cin >> god;
- cin >> n;
- for (int j = 0; j < n; j++)
- cin >> oceni[j];
- if (izbor == 0) {
- niza[i] = new Student(ime, indeks, god, oceni, n);
- } else {
- cin >> n_tr;
- for (int j = 0; j < n_tr; j++) {
- cin >> tip;
- cin >> god_tr;
- Trud t(tip, god_tr);
- trud[j] = t;
- }
- niza[i] = new PhDStudent(ime, indeks, god, oceni, n, trud, n_tr);
- }
- }
- // pecatenje na site studenti
- cout << "\nLista na site studenti:\n";
- for (int i = 0; i < m; i++)
- cout << *niza[i];
- // dodavanje nov trud za PhD student spored indeks
- Trud t;
- cin >> indeks;
- cin >> t;
- bool najde= false;
- for(int i=0;i<m;i++)
- {
- if(niza[i]->getIndex()==indeks&&niza[i]->getPHD())
- {
- najde = true;
- PhDStudent *p= dynamic_cast<PhDStudent*>(niza[i]);
- if(p!=0)
- {
- try{
- *p+=t;
- }
- catch(Exception)
- {
- cout<<"Ne moze da se vnese dadeniot trud"<<endl;
- }
- }
- }
- }
- if(najde==false)
- {
- cout<<"Ne postoi PhD student so indeks "<<indeks<<endl;
- }
- // vmetnete go kodot za dodavanje nov trud so pomos na operatorot +=
- // pecatenje na site studenti
- cout << "\nLista na site studenti:\n";
- for (int i = 0; i < m; i++)
- cout << *niza[i];
- }
- if (testCase == 3) {
- cout << "===== Testiranje na operatorot += ======" << endl;
- Student **niza;
- cin >> m;
- niza = new Student *[m];
- for (int i = 0; i<m; i++) {
- cin >> izbor;
- cin >> ime;
- cin >> indeks;
- cin >> god;
- cin >> n;
- for (int j = 0; j < n; j++)
- cin >> oceni[j];
- if (izbor == 0) {
- niza[i] = new Student(ime, indeks, god, oceni, n);
- } else {
- cin >> n_tr;
- for (int j = 0; j < n_tr; j++) {
- cin >> tip;
- cin >> god_tr;
- Trud t(tip, god_tr);
- trud[j] = t;
- }
- niza[i] = new PhDStudent(ime, indeks, god, oceni, n, trud, n_tr);
- }
- }
- // pecatenje na site studenti
- cout << "\nLista na site studenti:\n";
- for (int i = 0; i < m; i++)
- cout << *niza[i];
- // dodavanje nov trud za PhD student spored indeks
- Trud t;
- cin >> indeks;
- cin >> t;
- bool najde= false;
- for(int i=0;i<m;i++)
- {
- if(niza[i]->getIndex()==indeks && niza[i]->getPHD())
- {
- najde = true;
- PhDStudent *p= dynamic_cast<PhDStudent*>(niza[i]);
- if(p!=0)
- {
- try{
- *p+=t;
- }
- catch(Exception)
- {
- cout<<"Ne moze da se vnese dadeniot trud"<<endl;
- }
- }
- }
- }
- if(najde==false)
- {
- cout<<"Ne postoi PhD student so indeks "<<indeks<<endl;
- }
- // vmetnete go kodot za dodavanje nov trud so pomos na operatorot += od Testcase 2
- // pecatenje na site studenti
- cout << "\nLista na site studenti:\n";
- for (int i = 0; i < m; i++)
- cout << *niza[i];
- }
- if (testCase == 4) {
- cout << "===== Testiranje na isklucoci ======" << endl;
- cin >> ime;
- cin >> indeks;
- cin >> god;
- cin >> n;
- for (int j = 0; j < n; j++)
- cin >> oceni[j];
- cin >> n_tr;
- for (int j = 0; j < n_tr; j++) {
- cin >> tip;
- cin >> god_tr;
- Trud t(tip, god_tr);
- trud[j] = t;
- }
- PhDStudent phd(ime, indeks, god, oceni, n, trud, n_tr);
- cout << phd;
- }
- if (testCase == 5) {
- cout << "===== Testiranje na isklucoci ======" << endl;
- Student **niza;
- cin >> m;
- niza = new Student *[m];
- for (int i = 0; i<m; i++) {
- cin >> izbor;
- cin >> ime;
- cin >> indeks;
- cin >> god;
- cin >> n;
- for (int j = 0; j < n; j++)
- cin >> oceni[j];
- if (izbor == 0) {
- niza[i] = new Student(ime, indeks, god, oceni, n);
- } else {
- cin >> n_tr;
- for (int j = 0; j < n_tr; j++) {
- cin >> tip;
- cin >> god_tr;
- Trud t(tip, god_tr);
- trud[j] = t;
- }
- niza[i] = new PhDStudent(ime, indeks, god, oceni, n, trud, n_tr);
- }
- }
- // pecatenje na site studenti
- cout << "\nLista na site studenti:\n";
- for (int i = 0; i < m; i++)
- cout << *niza[i];
- // dodavanje nov trud za PhD student spored indeks
- Trud t;
- cin >> indeks;
- cin >> t;
- bool najde= false;
- for(int i=0;i<m;i++)
- {
- if(niza[i]->getIndex()==indeks && niza[i]->getPHD())
- {
- najde = true;
- PhDStudent *p= dynamic_cast<PhDStudent*>(niza[i]);
- if(p!=0)
- {
- try{
- *p+=t;
- }
- catch(Exception)
- {
- cout<<"Ne moze da se vnese dadeniot trud"<<endl;
- }
- }
- }
- }
- if(najde==false)
- {
- cout<<"Ne postoi PhD student so indeks "<<indeks<<endl;
- }
- // vmetnete go kodot za dodavanje nov trud so pomos na operatorot += i spravete se so isklucokot
- // pecatenje na site studenti
- cout << "\nLista na site studenti:\n";
- for (int i = 0; i < m; i++)
- cout << *niza[i];
- }
- if (testCase == 6) {
- cout << "===== Testiranje na static clenovi ======" << endl;
- Student **niza;
- cin >> m;
- niza = new Student *[m];
- for (int i = 0; i<m; i++) {
- cin >> izbor;
- cin >> ime;
- cin >> indeks;
- cin >> god;
- cin >> n;
- for (int j = 0; j < n; j++)
- cin >> oceni[j];
- if (izbor == 0) {
- niza[i] = new Student(ime, indeks, god, oceni, n);
- } else {
- cin >> n_tr;
- for (int j = 0; j < n_tr; j++) {
- cin >> tip;
- cin >> god_tr;
- Trud t(tip, god_tr);
- trud[j] = t;
- }
- niza[i] = new PhDStudent(ime, indeks, god, oceni, n, trud, n_tr);
- }
- }
- // pecatenje na site studenti
- cout << "\nLista na site studenti:\n";
- for (int i = 0; i < m; i++)
- cout << *niza[i];
- int conf, journal;
- cin >> conf;
- cin >> journal;
- Trud::setJ(journal);
- Trud::setC(conf);
- // pecatenje na site studenti
- cout << "\nLista na site studenti:\n";
- for (int i = 0; i < m; i++)
- cout << *niza[i];
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment