PDA

Prikaži potpunu verziju : Problem sa programom


Zo4o
16.6.2013, 19:28
Jel moze neko da mi kaze zasto ne radi program. Kad vnesem podatci za jedan film programot mi se блокира. Šta može da bude problem?

#include <iostream>
#include <string>

using namespace std;

class Filmovi{
protected:
char ime[20];
int sifra;
float cena;
char zanr[20];
public:
Filmovi (){}
Filmovi (char* i, int s, float c, char* z) {strcpy(ime,i),sifra=s,cena=c,strcpy(zanr,z);}
void set_fi (char* i, int s, float c, char* z) {strcpy(ime,i),sifra=s,cena=c,strcpy(zanr,z);}
const char* zemi_ime() {return ime;}
int zemi_sifra() {return sifra;}
float zemi_cena() {return cena;}
const char* zemi_zanr() {return zanr;}
virtual void print() {cout<<"Ne e nisto naracano\n";}
bool operator>(Filmovi &f) { return (cena>f.cena) ; }
};

class Seriski: public Filmovi {

private:
int epizodi;
public:
Seriski(){}
Seriski(char* i, int s, float c, char* z, int e):Filmovi(i,s,c,z) {epizodi=e;}
void set_ser (char* i, int s, float c, char* z, int e) {strcpy(ime,i),sifra=s,cena=c,strcpy(zanr,z),epizo di=e;}
int zemi_epizodi(){return epizodi;}
virtual void print() {cout<<"Ime: "<<zemi_ime()<<endl<<"Sifra: "<<zemi_sifra()<<endl<<"Cena: "<<zemi_cena()<<endl<<"Zanr: "<<zemi_zanr()<<endl<<"Epizodi: "<<epizodi<<endl<<endl;}
};

class Igrani: public Filmovi {

private:
float vremetraenje;

public:
Igrani(){}
Igrani(char* i, int s, float c, char* z, float v):Filmovi(i,s,c,z) {vremetraenje=v;}
void set_ig(char* i, int s, float c, char* z, float v) {strcpy(ime,i),sifra=s,cena=c,strcpy(zanr,z),vreme traenje=v;}
float zemi_vreme() {return vremetraenje;}
virtual void print() {cout<<"Ime: "<<zemi_ime()<<endl<<"Sifra: "<<zemi_sifra()<<endl<<"Cena: "<<zemi_cena()<<endl<<"Zanr: "<<zemi_zanr()<<endl<<"Vremetraenje: "<<vremetraenje<<endl<<endl;}
};

class Vraboteni {

protected:
string ime,prezime,adresa;
int godini,platata;
public:
Vraboteni(){}
Vraboteni(string i, string p, string a, int g, int pl) {ime=i, prezime=p, adresa=a, godini=g, platata=pl;}
void set_vr(string i, string p, string a,int g, int pl) {ime=i, prezime=p, adresa=a, godini=g, platata=pl;}
string zemi_ime() {return ime;}
string zemi_prezime() {return prezime;}
string zemi_adresa() {return adresa;}
int zemi_godini() {return godini;}
int zemi_pl() {return platata;}
virtual int plata(){};
virtual void pecati(){};
bool operator>(Vraboteni &v) {return (plata()>v.plata());}
};


class Sef: public Vraboteni {

public:
Sef(){}
Sef(string i, string p, string a, int g, int pl):Vraboteni(i,p,a,g,pl) {}
void set_sef(string i, string p, string a, int g, int pl) {ime=i, prezime=p, adresa=a, godini=g, platata=pl;}
virtual void pecati(){cout<<"Ime i prezime: "<<zemi_ime()<<" "<<zemi_prezime()<<" adresa:"<<zemi_adresa()<<" godini:"<<zemi_godini()<<" plata:"<<zemi_pl()<<endl<<endl;}
virtual int plata(){return zemi_pl();}
};

class Rabotnik: public Vraboteni {

private:
int prekuvremeno;
public:
Rabotnik(){}
Rabotnik(string i, string p, string a, int g, int pl, int pv):Vraboteni(i,p,a,g,pl) {prekuvremeno=pv;}
void set_ra(string i, string p, string a, int g, int pl, int pv) {ime=i, prezime=p, adresa=a, godini=g, platata=pl, prekuvremeno=pv;}
int zemi_pv() {return prekuvremeno;}
virtual int plata() {return zemi_pl()+prekuvremeno;}
virtual void pecati() {cout<<"Ime i prezime: "<<zemi_ime()<<" "<<zemi_prezime()<<" adresa:"<<zemi_adresa()<<" godini:"<<zemi_godini()<<" plata:"<<zemi_pl()<<"+"<<prekuvremeno<<endl<<endl;}
};

Zo4o
16.6.2013, 19:31
Ovo je produzetak koda:
template<class X> void Sortiraj(X niza[], int n){
X p, max;
int i,j, maxpoz;
for (i = 0; i < n-1; ++i){
max=niza[i];
maxpoz=i;
for (j=i+1; j<n; ++j)
if (niza[j]>max) {
max=niza[j];
maxpoz=j;}
if (i!=maxpoz){
p=niza[i];
niza[i]=niza[maxpoz];
niza[maxpoz]=p; }}}
int main(){
Seriski S[100];
Igrani I[100];
Sef SE[2];
Rabotnik R[10];
char ime[20],zanr[20];
string im,pr,ad;
float cena,vremetr;
int sifra,epi,god,pl,pv,i,n,m,brs=0,bri=0,brse=0,brr=0 ;
do{
cout<<"1.Vnesuvanje na film"<<endl;
cout<<"2.Vnesuvanje na nov vraboten"<<endl;
cout<<"3.Pecatenje na filmovi"<<endl;
cout<<"4.Pecatenje na vraboteni"<<endl;
cout<<"5.Sortiranje na filmovite spored cenata"<<endl;
cout<<"6.Sortiranje na vrabotenite spored plata"<<endl;
cout<<"7.Izlez"<<endl;
cin>>n;

if(n==1){
cout<<"1.Seriski"<<endl;
cout<<"2.Igrani"<<endl;
cin>>m;

if(m==1){
cout<<"Ime: ";cin>>ime;
cout<<"Sifra: ";cin>>sifra;
cout<<"Cena: ";cin>>cena;
cout<<"Zanr: ";cin>>zanr;
cout<<"Epizodi: ";cin>>epi;cout<<endl;

S[brs].set_ser(ime,sifra,cena,zanr,epi);
brs++;
}
if(m==2){
cout<<"Ime: ";cin>>ime;
cout<<"Sifra: ";cin>>sifra;
cout<<"Cena: ";cin>>cena;
cout<<"Zanr: ";cin>>zanr;
cout<<"Vremetraenje: ";cin>>vremetr;cout<<endl;
I[bri].set_ig(ime,sifra,cena,zanr,vremetr);
bri++;
}
}
if(n==2){
cout<<"1.Sef"<<endl;
cout<<"2.Rabotnik"<<endl;
cin>>m;
if(m==1){
cout<<"Ime: ";cin>>im;
cout<<"Prezime: ";cin>>pr;
cout<<"Adresa: ";cin>>ad;
cout<<"Ima godini: ";cin>>god;
cout<<"Plata: ";cin>>pl;cout<<endl;
SE[brse++].set_sef(im,pr,ad,god,pl);
}
if(m==2){
cout<<"Ime: ";cin>>im;
cout<<"Prezime: ";cin>>pr;
cout<<"Adresa: ";cin>>ad;
cout<<"Ima godini: ";cin>>god;
cout<<"Plata: ";cin>>pl;
cout<<"Prekuvremeno rabotenje: ";cin>>pv;cout<<endl;

R[brr++].set_ra(im,pr,ad,god,pl,pv);
}
}

if(n==3){
cout<<"1.Seriski"<<endl;
cout<<"2.Igrani"<<endl;
cin>>m;
if(m==1){
for(i=0;i<brs;i++) S[i].print();
}
if(m==2){
for(i=0;i<bri;i++) I[i].print();
}
}
if(n==4){
cout<<"1.Sef"<<endl;
cout<<"2.Rabotnik"<<endl;
cin>>m;
if(m==1){
for(i=0;i<brse;i++) SE[i].pecati();
}
if(m==2){
for(i=0;i<brr;i++) R[i].pecati();
}
}
if(n==5){
cout<<"1.Seriski"<<endl;
cout<<"2.Igrani"<<endl;
cin>>m;
if(m==1){
Sortiraj(S,brs);
for(i=0;i<brs;i++) S[i].print();
}
if(m==2){
Sortiraj(I,bri);
for(i=0;i<bri;i++) I[i].print();
}
}
if(n==6){
cout<<"1.Sef"<<endl;
cout<<"2.Rabotnik"<<endl;
cin>>m;
if(m==1){
Sortiraj(SE,brse);
for(i=0;i<brse;i++) SE[i].pecati();
}
if(m==2){
Sortiraj(R,brr);
for(i=0;i<brr;i++) R[i].pecati();
}
}
}while(n!=7);
system("pause");
return 0;
}

PeTkO
16.6.2013, 21:26
Bilo bi jako lepo kad bi napisao gde ti program izbacuje gresku, sta je cilj programa, i makar da stavis kod u code tab, a ne ovako...

Goonotora
17.6.2013, 8:17
Kompajler bi trebalo da ti pokaze gresku gde ti se pojavljuje (ako kompajler ima tu mogucnost). Usput, jel ovo napisano u C++?

Teva
17.6.2013, 9:20
Tesko da kompajler može da mu pokaže gde upada u besoknačnu petlju xD Jer kaže da mu se program za blokira...

Ovde ima runtime grešku koju kompajler ne može da primeti (pod uslovom da ga je preveo) :)

Moj savet je da koristiš debugger, ako ne znaš il nemaš, oldschool tehnika, trpaj redom cout << "1 test" << endl; pa cout << "2 test" << endl; itd i njih postavljaš u blokove ovog do-while da vidiš kako ti ide tok programa gde ti blokira. :)

Da, ovo je C++... Mada se primećuje da je radio C pre ovoga xD

Goonotora
17.6.2013, 10:33
Testirao sam program u VS2010. Greska ti se nalazi u klasi Vraboteni, u ovoj liniji:

virtual int plata(){};
Na osnovu sintakse bi trebalo da ova metoda vrati odredjenu vrednost (takvu gresku meni prijavljuje). To znaci sledece (u zavisnosti od vrste metode):

1. Ako metoda vraca vrednost, u telu metode mora da postoji kljucna rec return i naziv promenljive koju vraca.
2. Ako metoda ne vraca vrednost, onda promeni gornju sintaksu u sledecu:
virtual void plata(){};

P.S. Ne znam za C++, ali u C# u telu metode koja vraca vrednost mora da postoji gorenavedena konstrukcija.

Teva
17.6.2013, 19:22
Ili je prebaci u pure virtual metodu


virtual int plata() = 0;


Mada nisam siguran da je to greška :) Pre bi rekao da je warning :)

Goonotora
17.6.2013, 21:49
Ili je prebaci u pure virtual metodu


virtual int plata() = 0;
Mada nisam siguran da je to greška :) Pre bi rekao da je warning :)

Test je obavljen preko Visual Studija, nazalost nisam napravio shot da bi video da je error. Sintaksa mu je bila sve OK, ali kad sam pokusao build solution, tek onda mi je dao gresku (iliti na programerski build error). A dobio sam cetiri warninga zbog neceg drugog (neke danas nebezbedne sintakse, a koje ipak uce iz C++). U svakom slucaju, ako ovo ne resi problem:kreza:...

Belphegor
17.6.2013, 22:35
1. Pod obavezno da ti predje u naviku da koristis virtual destruktor kod nasledjivanja.
2. Koristi string klasu umesto niz karaktera.
3. Koristi getline funkciju jer cin "jede" whitespace karaktere.
4. Izbij iz glave stari C stil pisanja.
5. Ovo je uzas za citanje a imena promenjljivih ne govore sta predstavljaju:

int sifra,epi,god,pl,pv,i,n,m,brs=0,bri=0,brse=0,brr=0 ;
6. Stavi jedan fin switch izraz umesto one gomile if blokova.
7. Zaboravi na system("pause") , umesto toga stavi breakpoint na zadnji return pa ce ti ostati konzola aktivna ili startuj bez debuggera.