Šta je novo?

C++ Problem

Midgard

Čuven
Učlanjen(a)
13.08.2002
Poruke
1,222
Poena
649
Treba da napravim program u c++-u, ali mi tekst zadatka nije jasan, ja sam shvatio ovako:treba da napravim apstraktnu klasu PREDMET, pa da iz nje izvedem klasu TELO, pa iz tela SFERU,VALJAK i kupu, pa onda da napravim klasu SKLOP koja ce u strvari biti niz od sfere,valjka i kupe(proizvoljno), pa klasu SKLADISTE koje je u stvari niz u koji stavljam tela do odrdjene granice, a sta radi radnik to mi nije jasno. U ostalom evo tekst zadatka:

Пројектовати на језику C++ следећи систем класа:

Предмет има ознаку врсте предмета. Може да се одреди запремина и тежина премета и да се предмет упише у датотеку. Пише ознака врсте предмета.
Тело је хомогени предмет одређене специфичне тежине. У датотеку се пишу ознака врсте предмета и специфична тежина тела.
Сфера, ваљак и купа су тела. У датотеку се пишу ознака врсте, специфична тежина и димензије.
Склоп је предмет састављен од произвољног броја предмета произвољне врсте. Ствара се празан, после чега предмети се додају један по један. У датотеку се пишу подаци о садржаним предметима.
Складиште може да садржи произвољан број предмета до задате укупне запремине и тежине. Предмети се стављају један по један, с тим да се памти редослед стављања предмета. Предмети се ваде из складишта на основу њихових редних бројева. Може да се добије списак садржаних предмета.
Радник има име. Сви радници морају да имају различита имена. Не сме да се прави копија радника. Радник може да производи предмет као копију задатог предмета и да га стави у задато складиште. Предмет чија копија се прави и складиште у које се копија ставља може да се промени.
Саставити на језику C++ интерактивни главни програм за руковање радионицом која има одређени број складишта и у којој ради одређени број радника.

Ako neko moze da mi doslovno objasni sta se ovde trazi!

Please, help!
 
Midgard je napisao(la):
...a sta radi radnik to mi nije jasno...

Klasa Radnik u sebi ima jedan string (ime radnika) i ne smeš da imaš radnike sa istim imenom. Znači treba ti jedan static niz stringova za celu klasu da pri svakom kreiranju objekta proveriš da li već postoji to ime. I koliko vidim, treba da ima dve funkcije: jednu koja vraća kopiju predmeta (rezerviše memoriju za novi predmet, kopira stari predmet u novi i vrati pokazivač na novi predmet); drugu koja stavlja predmet u skladište.
 
OK, a nije mi nesto jasno, npr.
konstruktor za klasu Predmet izgleda ovako: Predmet(char v){vrsta=v;}
konstruktor za klasu Telo: Telo(double sT,char v) : Predmet(v){specTezina=sT;}
konstruktor za npr. Sferu: Sfera(double rr,double sT,char v) :Telo(sT,v) : Predmet(v){r=rr;}

jel tako?
 
Poslednja izmena:
Sto se tice unikalnosti radnika, mislim da je najbole napraviti jos jednu klasu,naprimer radionica, koja ce se baviti zposljavanjem radnika. Ustvari, ona ce u sebi sadrzati dinamic array sa radnicima i metod radnik* zaposliti_radnika(char* ime) koji ce proveravati unikalnost imena radnika. Objeti radnika se ne smeju praviti mimo radionice.

Sto se tice posla radnika, nemu je neobhodno samo imati nekoliko metoda, koji ce primati pointere na objekte predmeta iskladista, koji se mogu predati kroz parametre.

jos nesto. kada pises program u oo stilu, vrlo vaznim parametrom kvaliteta prorama je to, koliko lako ti zavrsavas svu tu hierarhiju klasa. ako pises kvalitetan kod, programiranje postaje sve lakse, sto je vise napisano. Ako je kod los - sve teze.
 
Midgard je napisao(la):
konstruktor za npr. Sferu: Sfera(double rr,double sT,char v) :Telo(sT,v) : Predmet(v){r=rr;}

jel tako?

Prva dva su OK. U trećem ne možeš da eksplicitno pozivaš konstruktor Predmeta. A i nema potrebe pošto se konstruktor Predmeta već eksplicitno poziva pre nego što se izvrši konstruktor za Telo.
 
OK napravio sam klase sve do sklopa, ali on me sada muci, ja sam svatio da sklop treba da bude niz pokazivaca na predmete, pa onda saberem tezinu i zapreminu tih predmeta i dobijem novi predmet "sklop".
Napravio sam klasu sklop koja izgleda ovako:

class Sklop{
Predmet **niz;
int duz;
public:
explicit Sklop(int d){

duz=d;
niz=new Predmet*[duz];
for (int i=0;i<duz;i++)
niz=0;
}
double Zapremina()const;
double Tezina()const;
Sklop& operator+=(const Predmet& pred);
friend ostream& operator<<(ostream& d,const Sklop& s);
int operator+()const;
};

ali me muci ovaj operator+=, ne znam sta u njega da prenesem, odnosno kako da dodam u niz predmet.
 
Kod:
//treba ti još jedan int koji pokazuje na prvo slobodno mesto u nizu recimo 'pos'

Sklop& Sklop::operator+=(const Predmet& pred)
{
  if(pos<duz) //ako niz nije pun
    niz[pos++]=&Predmet;
 
   return(*this);
}

Pazi... ovako ubacuješ adresu već postojećeg objekta u niz. Znači objekat mora da bude napravljen sa new pre nego što pozoveš +=. Memoriju ćeš da oslobađaš u destruktoru sa delete niz;

Možeš i da napraviš kopiju Predmeta da ne razmišljaš šta se dešava sa objektom koji si naveo kao argument kasnije u programu:
Kod:
//treba ti još jedan int koji pokazuje na prvo slobodno mesto u nizu recimo 'pos'

Sklop& Sklop::operator+=(const Predmet& pred)
{
  
 if(pos<duz) //ako niz nije pun
    niz[pos++]=new Predmet(pred);
 
   return(*this);
}

u svakom slučaju u destruktoru oslobađaš memoriju. S' tim što u prvom slučaju ne smeš da uništavaš objekte koje si operatorom += ubacio u niz (moraš da čekaš da se unište u ~Predmet() ), a u drugom slučaju se pravi kopija predmeta i smešta se u niz. U tom slučaju moraš da napraviš konstruktor kopije. I ne moraš da brineš šta se dešava sa objektom koji si naveo kao argument za +=.

I u svakom slučaju ti treba destruktor koji će da oslobodi memoriju rezervisanu za Predemete ( delete niz; ) i rezervisanu za niz ( delete [] niz; ).
 
Poslednja izmena:
pozdravio te kraus 😀
xa xa xa
secam se mojih problema prosle godine

treba samo da procitas jedno 50 puta tekst i da se konsultujes sa kolegama sta se tacno trazi... ici ce mnogo lakse posle...

srecno...
 
pravo_u_raj je napisao(la):
xa xa xa
secam se mojih problema prosle godine

:trust:

Pa pomozi čoveku onda, ako već znaš šta se tačno traži. :type:
 
Hvala vam svima na dosadasnjoj pomoci. Uradio sam sve klase sem radnika i to ovako:

klasa Predmet mi je apstraktna, iz nje sam izveo klasu telo koja je takodje apstraktna, zatim iz klase telo sam izveo sferu, kupu, valjak i sklop sa tim sto mi je sklop niz pokazivaca na ova tri predmeta, skladiste mi je lista sa pokazivacem na predmete i radi sve🙂

A sad me buni nesto u vezi radnika, nije mi jasno kako to radnik "licno" moze da ubaci kopiju predmeta (kojom funkijom), odnosno kako da kad "selektujem" nekog radnika on treba da ubaci predmet.
 
Poslednja izmena:
Midgard je napisao(la):
... nije mi jasno kako to radnik "licno" moze da ubaci kopiju predmeta (kojom funkijom), odnosno kako da kad "selektujem" nekog radnika on treba da ubaci predmet....

pa napravi funkciju:

int Radnik::Ubaci_Predmet(Predmet *predmet, Skladiste *skladiste);

i stavi da je Radnik friend klasa za Skladiste. I samo iz te funkcije je moguće ubaciti predmet u skladište. Ili ako si već napravio funkciju u kalsi Skladiste koja to radi - prebaci je u private ili protected funkcije i pozovi je odavde.
 
Izbacuje mi gresku za void ubaciPredmet(Predmet* p,Skladiste* s);
greska:identifier Skladiste, a includovao sam klasu i evo kako izgleda:

#ifndef _SKLADISTE_H_
#define _SKLADISTE_H_
#include"radnik.h"
#include"sfera.h"
#include"kupa.h"
#include"valjak.h"
#include"sklop.h"
using namespace std;

class Skladiste{

struct Elem{
Predmet* predmet;
Elem* sled;
Elem(Predmet* pred,Elem* s=0){
predmet=pred;
sled=s;
}
~Elem(){delete predmet;}
};
Elem* prvi,*posl;
int duzinaSkladista;
void kopiraj(const Skladiste& s);
void brisi();
Skladiste* kopija()const;
public:
Skladiste(){prvi=posl=0;duzinaSkladista=0;}
Skladiste(const Skladiste& s){kopiraj(s);}
Skladiste& operator=(const Skladiste& s);
int operator+()const;
Skladiste& operator+=(Predmet* p);
Skladiste& operator+=(const Sklop& s);
Skladiste& operator+=(const Skladiste& s);
Predmet* operator-(int ind);
friend ostream& operator<<(ostream& d,const Skladiste& s);
};
#endif

a ako izbacim iz funkcije "Skladiste* s", ne prijavljuje gresku.

Ne znam u cemu je problem.
 
A kako izgleda klasa Radnik (za njenu funkciju ti izbaci grešku?)?
 
Klasa radnik:

#ifndef _RADNIK_H_
#define _RADNIK_H_
#include"skladiste.h"
#include"predmet.h"
using namespace std;

class Radnik{
char *ime;
void brisi();
public:
Radnik(char* i){
for (int i=0;i<20;i++)
i=ime;
}
void ubaciPredmet(Predmet* p,Skladiste* s);
};
#endif

dotle sam stigao, pa mi je izbacio gresku "identifier Skladiste".
 
Poslednja izmena:
shto se radnika tiche hteo ja da naglasi da samo radnik moze da stavi predmem u skladishte, tj. da je nemoguce da se predmeti sami od sebe stavljaju u skladishte, shto je jel'te logichno. al' on to tako formuliche da treba prevodilac 🙂

ne znam shta si i kako zamislio, ali mi nije jasno zaslo prosledjujesh Skladishte* s kad imash samo jedno skladishte... nisam siguran za ovo, i nemoj da uzmes zdravo za gotovo, ali se meni tako chini...
 
Midgard je napisao(la):
Klasa radnik:
dotle sam stigao, pa mi je izbacio gresku "identifier Skladiste".

Izbaci sve #include izvan #ifndef bloka ili dodaj iznad definicije klase radnik:

class Skladiste;

Znači da izgleda ovako:

Kod:
#ifndef _RADNIK_H_
#define _RADNIK_H_
#include"skladiste.h"
#include"predmet.h"
using namespace std;

class Skladiste;

class Radnik{
char *ime;
void brisi();
public:
Radnik(char* i){
for (int i=0;i<20;i++)
i[i]=ime[i];
}
void ubaciPredmet(Predmet* p,Skladiste* s);
};
#endif
 
Hmmm... zanimljivo... a sta tacno kaze? Duplicate definition, symbol not defined, .... ? Proveri da li ima tacka-zarez posle svake od klasa koje ti stoje u include. Da li je ovo jedina greska koju prijavljuje?


@pravo_u_raj : u tekstu zadatka se kaze: Радник може да производи предмет као копију задатог предмета и да га стави у задато складиште. Предмет чија копија се прави и складиште у које се копија ставља може да се промени. tako da ipak treba informacija o kom skladistu se radi.
 
Poslednja izmena:
Sto se tice radnika u pravu si, a sto se tice greske proverio sam sve, ne bi se obratio za pomoc da prvo to ne uradim. Skladiste sam realizovao kao listu, da nije mozda neki problem oko toga?
 
Midgard je napisao(la):
...a sto se tice greske proverio sam sve, ne bi se obratio za pomoc da prvo to ne uradim.

Lepo te je čovek pitao: Kako tačno glasi poruka o grešci?
 
Resio sam gresku, inkludovao sam radnik u skladiste, i kad sam to izbacio proradio je. Sad me muci nesto drugo, da li ja mogu da napravim niz listi ili listu listi ,odnosno da napravim niz Skladista koja su liste ili listu Skladista. Pokusao sam sa nizom Skladista, ali nikako ne mogu da unesem predmet u skladiste:

Skladiste* Skladiste:😱perator+=(const Predmet* p){
Elem* novi=new Elem(p->kopija());
if (!prvi)
prvi=novi;
else{
Elem* tek=prvi;
while(tek->sled)
tek=tek->sled;
tek->sled=novi;
}
return this;
}

a u main-u:
Skladiste** radionica

...

*radionica[Rbroj]+=p;
 
Poslednja izmena:
Jesi ti rezervisao memoriju za ta skladišta? Jesi probao da li to sve radi sa jednim skladištem? Koju ti grešku izbaci? (to bi mogao da priložiš uz svaki problem da ne moramo da gledamo u pasulj... 😀 )
 
Normalo da sam rezervisao memoriju, jedino sto mi je ostalo je main. Ali main je igra sa pokazivacima.Objasnicu detaljno problem:
main je radionica, main je ustvari lista skladista, skladiste je lista predmeta od kojih mogu biti sfera, kupa i valjak.Nista od ovoga nije problem, sve radi ali kad treba u skladiste koje je lista da ubacim sklop koji je isto lista i koji je izveden iz predmeta, e tu nastaje problem.Ne mogu nikako da prenesem pokazivac na sklop.
Sve ostale propratne stvari kao rezervisanje memorije i sl. se podrazumeva da sam uradio. Evo vam kod pa ko je voljan da pogleda bicu mu zahvalan.
 

Prilozi

Ovo šta si ti poslao ne može da se kompajlira...


main.cpp

Kod:
...
case 5:
{
 Predmet* p=0;
 cout<<"\nRedni broj skladista:";				
 int Rbroj;
...

p je tipa Predmet i za Predmet nemaš definisan += operator.

Kod:
p+=pom->kopija();

Ovo ne može. Čak i da za Predmet imaš += operator moralo bi da piše (*p)+=pom->kopija();

znači p mora da bude tipa Sklop *.
 
Nazad
Vrh Dno