[ DenisUA98 @ 26.05.2012. 20:58 ] @
U ovom semestru sam počeo sa radom u C++, i dobio sam prvi zadatak za odbranu semestra i to mi je uslov da bih mogao da izađem na ispit. Tekst zadatka je:

Napisati klasu Student i klasu Predmet.

Klasa Student sadrzi atribute:
Ime -string[10]
prezime -string[15]
indeks -ceo broj

Realizovati
Konstruktor bez argumenata
Konstruktor sa argumentima (ime,prezime,indeks)
set i get metode
predstavi se metoda koja ispisuje podatke o studentu

Klasa Predmet sadrzi atribute: ime_prof -string[10]
prezime_prof -string[15]
broj_studenata -ceo broj
studenti -dinamicki niz studenata koji slusaju predmet
ocene -dinamicki niz ocena za svakog gore navedenog studenta

Realizovati:
Konstruktor bez argumenata (postavlja broj studenata na 10)
Konstruktor sa jednim argumentom broj studenata n
Kopi konstruktor
void ucitaj_studente (int n) //metoda za ucitavanje prvih n studenata tako sto see navodi njihovo ime prezime i broj indeksa
void ucitaj_ocene(int n) //metoda koja ucitava ocene prvih n studenata
void setStudent(int k,Student s,int ocena)
set i get metoda za ime i prezime profesora
void prebroj(); //metoda koja prebrojava broj 5(0),6,7,8,9 i 10
int polozilo(); //metoda koja ispisuje predmet ime i prezime profesora a zatim svakom novom redu ime i prezime, broj studenata koji su polozili ispit
Student najStudent(); //metoda koja vraca prvog studenta sa maksimalnom ocenom


A ono sto sam dosad uradio je:

#include <iostream>
#include <cstring>


class CStudent {
private:
char* ime;
char* prezime;
int index;

public:
CStudent(){ strcpy(ime,0); strcpy(prezime,0); }
CStudent(const char* i, const char* p, int ind);
~CStudent();


void setIme(const char* _ime);
void setPrezime(const char* _prezime);
void setIndex( int _index );


char* getIme();
char* getPrezime();
int getIndex();
void ispisi();

};

CStudent::CStudent( const char* i, const char* p, int ind ) {
ime = new char [10];
prezime = new char [15];
strcpy(ime, i);
strcpy(prezime, p);
index = ind;
}

CStudent::~CStudent() {
delete ime;
delete prezime;
}


void CStudent::setIme( const char* _ime ) {
strcpy(ime, _ime);
}

void CStudent::setPrezime( const char* _prezime ) {
strcpy(prezime, _prezime);
}

void CStudent::setIndex( int _index ) {
index = _index;
}

char* CStudent::getIme() {
return ime;
}

char* CStudent::getPrezime() {
return prezime;
}

int CStudent::getIndex() {
return index;
}

void CStudent::ispisi() {
cout << ime << " " << prezime << " " << index << endl;
}

class CPredmet {
private:
char* imeProfesora;
char* prezimeProfesora;
int brojStudenata;
CStudent* studenti;
int* ocene;

public:
CPredmet();
CPredmet( int bs );
CPredmet( const CPredmet& param );
~CPredmet();

void setImeProfesora( const char* _imeProfesora );
void setPrezimeProfesora( const char* _prezimeProfesora );
void ucitajStudente( int n );
void ucitajOcene( int n );
void setStudent( int k, CStudent s, int o );
void prebroj();
char* getImeProfesora();
char* getPrezimeProfesora();
int polozilo();
int najStudent();
};

CPredmet::CPredmet() {
imeProfesora = new char [10];
prezimeProfesora = new char [15];
brojStudenata = 10;
studenti = NULL;
ocene = NULL;
}

CPredmet::CPredmet( int bs ) {
imeProfesora = new char [10];
prezimeProfesora = new char [15];
brojStudenata = bs;

studenti = new CStudent [brojStudenata];
ocene = new int [brojStudenata];
}

CPredmet::CPredmet( const CPredmet& param) {
imeProfesora = new char [10];
prezimeProfesora = new char [15];
brojStudenata = param.brojStudenata;

studenti = new CStudent [brojStudenata];
ocene = new int [brojStudenata];

strcpy( imeProfesora, param.imeProfesora ); /* ne moras da koristis getMetodu */
strcpy( prezimeProfesora, param.prezimeProfesora );

for( int i=0; i<brojStudenata; i++ ) {
studenti.setIme( param.studenti.getIme() );
studenti.setPrezime( param.studenti.getPrezime() );
studenti.setIndex( param.studenti.getIndex() );
ocene = param.ocene;
}
}

CPredmet::~CPredmet() {
delete imeProfesora;
delete prezimeProfesora;
delete studenti;
delete ocene;
}

void CPredmet::setImeProfesora( const char* _imeProfesora ) {
strcpy( imeProfesora, _imeProfesora );
}

void CPredmet::setPrezimeProfesora( const char* _prezimeProfesora ) {
strcpy( prezimeProfesora, _prezimeProfesora );
}

void CPredmet::ucitajStudente( int n ) {
if( studenti == NULL ) {
brojStudenata = n;
studenti = new CStudent [brojStudenata];
ocene = new int [brojStudenata];
}
cout<<"Unesite broj studenata "<<n<<endl;
for( int i=0; i<n; i++ ) {
char _ime[10], _prezime[15];
int _index;

cin >> _ime >> _prezime >> _index;
studenti.setIme(_ime);
studenti.setPrezime(_prezime);
studenti.setIndex(_index);
}
delete []ocene;
}

void CPredmet::ucitajOcene( int n ) {
if( ocene == NULL ) {
n=10;
ocene = new int [n];
}

for( int i=5; i<n; i++ ) { // opseg ocena od 5 do 10
int o;
cin>>o;
ocene = o;
cout<<" "<<ocene;
}
delete []ocene;

}

void setStudent( int k, CStudent s, int o ){
k=1;
cout<<"unesi ocenu za prvog studenta: ";
cin>>o;


}

char* CPredmet::getImeProfesora() {
return imeProfesora;
}

char* CPredmet::getPrezimeProfesora() {
return prezimeProfesora;
}
int CPredmet::polozilo(){
int i;
for(i=1;i<brojStudenata;i++)


if(ocene>5){
cout<<" je polozio kod profesora: "<<imeProfesora<<" "<<prezimeProfesora<<endl;
return 1;
}
else
{
cout<<" nije polozio kod profesora: "<<imeProfesora<<" "<<prezimeProfesora<<endl;
return 0;
}
}
int CPredmet::najStudent(){
int i;
for(i=1;i<brojStudenata;i++)


if(ocene == 10)
return 1;
else return 0;
}

int main()
{
CStudent student1("Djordjo","Kijelini",256),student2("Mirko", "Vucinic", 123);
student1.ispisi();student2.ispisi();

CStudent student3("Milos","Krasic",369);
student3.ispisi();

CPredmet predmet1;
predmet1.setImeProfesora("Bratislav");
predmet1.setPrezimeProfesora("Miric");
cout << predmet1.getImeProfesora() << " " << predmet1.getPrezimeProfesora() << endl;

predmet1.ucitajStudente(3);

predmet1.ucitajOcene(3);

cout<<"Student "<<student1.getIme()<<" "<<student1.getPrezime()<<" ";
cout<<predmet1.polozilo()<<endl;
cout<<"Student "<<student2.getIme()<<" "<<student2.getPrezime()<<" ";
cout<<predmet1.polozilo()<<endl;
cout<<"Student "<<student3.getIme()<<" "<<student3.getPrezime()<<" ";
cout<<predmet1.polozilo()<<endl;

if(predmet1.najStudent())
cout<<"Student "<<student1.getIme()<<" je dobio 10 iz predmeta: "<<endl;
else
cout<<"Student "<<student1.getIme()<<" nije dobio 10 iz predmeta: "<<endl;
if(predmet1.najStudent())
cout<<"Student "<<student2.getIme()<<" je dobio 10 iz predmeta: "<<endl;
else
cout<<"Student "<<student2.getIme()<<" nije dobio 10 iz predmeta: "<<endl;
if(predmet1.najStudent())
cout<<"Student "<<student3.getIme()<<" je dobio 10 iz predmeta: "<<endl;
else
cout<<"Student "<<student3.getIme()<<" nije dobio 10 iz predmeta: "<<endl;

return 0;

}


E sad problem je u tome što za niz studenata ne učitava ocenu za svakog studenta u tom nizu pa samim tim na izlazu ne ispisuje metodu najstudent i metodu položio. Svaka pomoć mi je dobro došla jer sam početnik u ovom programskom jeziku i izvinjavam se na nepreglednosti posta to jest preobimnosti.
[ Nedeljko @ 26.05.2012. 23:40 ] @
1. strcpy(ime, 0) je besmislica. Pokazivač ime se inicijalizuje na nultu vrednost sa ime = 0. Sa druge strane, naredba strcpy zahteva da odreište bude inicijalizovano na nenultu vrednost, a kod tebe je neinicijalizovano, što je najgori slučaj. Takođe, ta naredba se ne koristi sa drugim argumentom jednakim nuli. U nekim implementacijama ovo može da pukne, a u nekim da nema efekta. Dakle,

ime = 0;
prezime = 0;

je ono što tebi treba.

2. U standardnoj biblioteci u zaglavlju iostream ne postoji cout, niti endl, već std::cout i std::endl. Ako nećeš da pišeš prefiks std::, onda iza #include direktiva stavi

using namespace std;

3. NULL nije iz C++, već C jezika. Slobodno koristi 0.

4. Ovo je besmislica:

brojStudenata = 10;
studenti = NULL;
ocene = NULL;

Gde je prostor za tih 10 studenata?

5. Ako je studenti tipa CStudent*, onda je

studenti.setIme(param.studenti.getIme());

sintaksna greška (a i semantička). metode setIme i getIme nisu definisane na nizovima CStudent objekata, već na CStudent objektima. Znači, ne na studenti, već na studenti. Isto to popravi i za ocene. Razmisli zašto ovo nije dobro (mada će prevodilac da prihvati).

6. Nizovi, kao što je promenljiva studenti se ne brišu sa delete, već sa delete[], tj. ono što je rezervisano sa new[], a ne sa new. Takođe, imaj na umu da delete naredba ne postavlja pokazivač na 0, već vrednost pokazivača ostaje ista, čime on postaje isto što i nedefinisani pokazivač.

7. U funkciji ucitaj studente je poruka "Unesite broj studenata 10" nesrećno formulisana. Formuliši je drugačija.

8. U istoj funkciji rezervišeš prostor za ocene pa ga brišeš. Osim što je to besmislica, stanje objekta postaje nekonzistentno jer pokazivač ocene postaje isto što i nedefinisan pokazivač. Razmisli šta bi trebalo da bude konzistentno stanje. Recimo da za ocene i studente uvek bude rezervisano mesto za brojStudenata članova. Dakle, ako ta metoda pretpostavlja da je prostor za studente već rezervisan, to ne diraš. Samo učitavač prvih n komada. Pritom moraš da se pobrineš za slučaj da je korisnik uneo veći broj od broja studenata. Broj studenata je 10, a on hoće da popuni prvih 20. Dakle, u tom slučaju treba popuniti svih 10 i to je sve.

9. Razmotri na sličan način funkciju unesiOcene. Pročitaj još jednom kako glasi taj deo zadatka.

10. setStudent je implementirana kao obična funkcija, a ne članica klase CPredmet. Takođe, razmisli šta bi ona trebalo da radi.

11. Nemaš metodu prebroj.

12. Prepiši tekst zadatka za metodu položilo kako treba. Ovako nije jasno šta se traži.

13. Razmisli šta treba da radi funkcija najStudent ako niko nije dobio 10.
[ DenisUA98 @ 27.05.2012. 21:16 ] @
Imam baš dosta grešaka kao što sam i predpostavio.
Krenuću da ispravljam ove greške u zadatku pa ću se javiti ako mi opet ne bude išlo. Ovo je celokupni tekst zadatka koji sam dobio tako da ću pitati za detaljnije objašnjenje te metode prebroji. Mada mislim da metoda prebroji služi za brojanje ocena koje su dobili studenti. Na primer koliko ima šestica, sedmica, petica i tako dalje. A za najstudent metodu ako niko od studentata nije dobio 10 onda se gleda student koji je dobio sledeću najveću ocenu to jest 9.
Mi na vežbama ne koristimo std već podatake unosimo kao na gore navedenom primeru, ali u Čabarkapinoj knjizi koju koristim, koristi se naredba using name std pa često smenjujem nekad koristim std nekad ne. U svakom slučaju zadaci koje radim na vežbama rade mi i na jedan i na drugi način.
Hvala ti na izdvojenom vremenu i na učavanju grešaka kao i na zadatim preporukama. Pozz.