24.11.2.24012010. Napisati i implementirati baznu klasu “Student”, zatim iz nje izvesti naslijeđene klase “Student_VI_stepena”, “Student_VII_stepena”, “Student_postdiplomac”, te konačno formirati i implementirati klasu “StudentskaSluzba”. Bazna klasa “Student” treba da ima sljedeće elemente:

  1. Privatne atribute “broj_indeksa”, “ime”, “prezime”, “broj_ocjena” i “prosjecna_ocjena“. Atribut “broj_ocjena” sadrži broj ispita koje je student položio, dok su ostali atributi jasni iz naziva. Atributi “ime” i “prezime” trebaju biti tipa “string”.
  2. Metodu “VratiIndeks” koja vraća broj indeksa studenta.
  3. Konstruktor sa 3 parametra koji postavlja atribute “ime”, “prezime” i “broj_indeksa” na vrijednosti koje se zadaju preko parametara, a atribute “prosjecna_ocjena” i “broj_ocjena“ na 5 i 0 respektivno. d) Metodu “upisi_ocjenu“ koja ima kao parametar ocjenu koju je dobio student na posljednjem ispitu i koja ažurira atribute “broj_ocjena“ i “prosjecna_ocjena” u skladu sa novom ocjenom.
  4. Virtualnu metodu “IspisiPodatke” bez parametara koja ispisuje podatke o studentu u slijedećem obliku (prosjek se ispisuje na 2 decimale).
Student <ime> <prezime> sa brojem indeksa <indeks> ima prosjek <prosjek>. Izvedene klase “Student_VI_stepena” i “Student_VII_stepena” razlikuju se samo u metodi “IspisiPodatke” koja ispisuje “Student VI stepena” odnosno “Student VII stepena” umjesto samo “Student”. Izvedena klasa “Student_postdiplomac” ima i dodatni atribut “GodinaDiplomiranja” kao i dodatni parametar u konstruktoru koji omogućava postavljanje ovog atributa. Metoda “IspisiPodatke” za ovu klasu ispisuje podatke o studentu u slijedećem obliku: Student postdiplomskog studija <ime> <prezime> sa brojem indeksa <indeks>, diplomirao godine <godina>, ima prosjek <prosjek>. Klasa “StudentskaSluzba” treba da ima slijedeće elemente:
  1. Privatne atribute “broj_studenata”, “MaxBrStudenata” i “studenti”. Atributi “broj_studenata” i “MaxBrStudenata” imaju jasna značenja (pored toga, atribut “MaxBrStudenata” treba biti konstantan), dok je atribut “studenti” pokazivač na prvi element dinamičkog niza čiji su elementi pokazivači na objekte tipa “Student”).
  2. Konstruktor sa jednim parametrom koji predstavlja kapacitet studentske službe (tj. maksimalni broj studenata koji se mogu upisati) i koji vrši neophodnu alokaciju memorije, kao i odgovarajući destruktor. Kopiranje primjeraka klase kao i njihovo međusobno dodjeljivanje treba zabraniti.
  3. Metodu “UpisiStudenta”, koja upisuje novog studenta. Metoda ima 4 parametra: broj indeksa, ime, prezime i godina diplomiranja. Za studente koji se upisuju na dodiplomski studij, umjesto godine diplomiranja upisuje se stepen studija (6 ili 7).
  4. Metodu “UpisiOcjenu” sa 2 parametra: broj indeksa studenta čija se ocjena upisuje, kao i sama ocjena;
  5. Metodu “IspisiSpisak” koja ispisuje spisak svih studenata sa pripadnim podacima (pozivom metode “IspisiPodatke” za svakog studenta). Obavezno napisati i testni program u kojem ćete testirati sve elemente navedenih klasa. Kao test ispravnosti klase može da posluži slijedeća sekvenca naredbi:
StudentskaSluzba pmf(1000);
pmf.UpisiStudenta(11,"Ivo","Ivić",6);
pmf.UpisiStudenta(12,"Meho","Mehić",1998);
pmf.UpisiStudenta(13,"Vaso","Vasić",7);
pmf.UpisiStudenta(14,"Ibro","Ibrić",6);
pmf.UpisiStudenta(15,"Marko","Marković",2001);
pmf.UpisiOcjenu(11,8);
pmf.UpisiOcjenu(11,7);
pmf.UpisiOcjenu(11,9);
pmf.UpisiOcjenu(12,7);
pmf.UpisiOcjenu(12,8);
pmf.UpisiOcjenu(13,6);
pmf.UpisiOcjenu(13,10);
pmf.UpisiOcjenu(14,7);
pmf.UpisiOcjenu(14,8);
pmf.UpisiOcjenu(14,8);
pmf.UpisiOcjenu(15,9);
pmf.IspisiSpisak();
Ova sekvenca naredbi trebala bi proizvesti sljedeći ispis na ekranu.
Student VI stepena Ivo Ivić sa brojem indeksa 11 ima prosjek 8.
Student postdiplomskog studija Meho Mehić sa brojem indeksa 12,
diplomirao godine 1998, ima prosjek 7.5.
Student VII stepena Vaso Vasić sa brojem indeksa 13 ima prosjek 8.
Student VI stepena Ibro Ibrić sa brojem indeksa 14 ima prosjek 7.66.
Student postdiplomskog studija Marko Marković sa brojem indeksa 15,
diplomirao godine 2001, ima prosjek 9.
Najbolje bi bilo da testni program manipulira sa podacima koji se unose sa tastature.

Opis rješenja:

Listing programa:

#include <iostream>
#include <conio.h>
#include <string>
#include <iomanip>
using namespace std;
class Student {
protected:
    string ime,prezime;
    int indeks,brocjena;
    double prosjek;
public:
    Student(string ime,string prezime, int indeks) : ime(ime),
     prezime(prezime), indeks(indeks),brocjena(0),prosjek(5){}
    //string VratiIme() const { return ime; }
    int VratiIndeks() const { return indeks; }
    void UpisiOcj(int ocj);
    virtual void Ispisi() const {
        cout<<"Student "<<ime<<" "<<prezime<<" sa brojem indeksa "<<indeks
            <<" ima prosjek "<<setprecision(2)<<prosjek<<endl;
	    }	  
};
void Student::UpisiOcj(int ocj){
     double suma=brocjena*prosjek;
     suma+=ocj;
     brocjena++;
     prosjek=suma/brocjena;
     }

class Student_VI_stepena : public Student{
public:
    Student_VI_stepena(string ime,string prezime, int indeks):
            Student(ime,prezime,indeks){}

void Ispisi() const {
        cout<<"Student VI stepena "<<ime<<" "<<prezime<<" sa brojem indeksa "<<indeks
            <<" ima prosjek "<<setprecision(2)<<prosjek<<endl;
	    }
};

class Student_VII_stepena : public Student{
public:
    Student_VII_stepena(string ime,string prezime, int indeks):
            Student(ime,prezime,indeks){}

void Ispisi() const {
        cout<<"Student VII stepena "<<ime<<" "<<prezime<<" sa brojem indeksa "<<indeks
            <<" ima prosjek "<<setprecision(2)<<prosjek<<endl;
	    }
};
class Student_postdiplomac : public Student{
    int goddipl;
public:
    Student_postdiplomac(string ime,string prezime, int indeks,int goddipl):
            Student(ime,prezime,indeks),goddipl(goddipl){}

    void Ispisi() const {
        cout<<"Student postdipl. studija "<<ime<<" "<<prezime
            <<" sa brojem indeksa "<<indeks
            <<",\ndiplomirao godine "<<goddipl
            <<", ima prosjek "<<setprecision(2)<<prosjek<<endl;
	    }
};
class Stud_sluzba{
    int brstud;
    const int maxbrstud;
    Student **studenti;
    Stud_sluzba(const Stud_sluzba &v);
    Stud_sluzba &operator =(const Stud_sluzba &v);
public:
    Stud_sluzba(int kapacitet):maxbrstud(kapacitet),brstud(0),
            studenti(new Student*[kapacitet]){
            for(int i=0;i<maxbrstud;i++)studenti[i]=0;
            }
    ~Stud_sluzba(){
            for(int i=0;i<maxbrstud;i++)delete studenti[i];
            delete[] studenti;
            }

    void UpisiStud(int brind,string Ime,string Prez,int GodDipl);
    void UpisiOcjenu(int brind,int ocjena);
    void IspisiSpisak(){
        for(int i=0;i<brstud;i++)
            studenti[i]-> Ispisi();
        }

friend class Student_VI_stepena;
friend class Student_VII_stepena;
friend class Student_postdiplomac;
};
        
void Stud_sluzba::UpisiStud(int brind,string Ime,string Prez,int GodDipl){
if(brstud==maxbrstud)throw "nema mjesta...";
if(GodDipl==6)
    studenti[brstud++]=new Student_VI_stepena(Ime,Prez,brind);
else if(GodDipl==7)
    studenti[brstud++]=new Student_VII_stepena(Ime,Prez,brind);
else
    studenti[brstud++]=new Student_postdiplomac(Ime,Prez,brind,GodDipl);
}
void Stud_sluzba::UpisiOcjenu(int brind,int ocjena){
int pom(-1);
    for(int i=0;i<brstud;i++){
        if((studenti[i]->VratiIndeks())==brind){
                pom=i;break;
                }
        }
if(pom==-1)throw "ne...";
studenti[pom]->UpisiOcj(ocjena);
}    


              
int main(){
try{
//Ovdje testirati klasu...
}
catch(...){
    cout<<"error!";
}
getch();
return 0;
}     

Ispis na ekranu:

Riješeni zadaci 2    Index