[ vlada_dj @ 29.11.2004. 10:44 ] @
| zadatak je sledeci:
Realizovati klasu ciji ce objekti sluziti za izdvajanje reci iz texta koji je dat kao niz znakova. Jednom recju smatra se niz znakova bez blanko znaka. Klasa treba da sadrzi pokazivac na niz znakova koji predstavlja ulazni text, i koji ce biti inicijalizOvan u konstruktoru. Klasa treba da sadrzi i funkciju koja, pri svakom pozivu, vraca pokazivac na dinamicki niz znakova u kojem je izdvojena naredna rec texta. Kada naidje na kraj texta. ova funkcija treba da vrati nula pokazivac. U glavnom programu isprobati upotrebu ove klase, na nekoliko objekata koji deluju na isti globalni niz znakova.
ja sam resenje zamislio ovako:
Code:
# include <iostream.h>
# include <string.h>
class Rec
{
public:
Rec(char*);
Rec();
static char* text;//globalni text
static char* iteratorTexta;//iterira znak po znak kroz text
static char* prviZnakReci;//pokazuje naprvi znak u reci koja treba da bude izdvojena
static char* izdvojReci();//izdvaja reci iz texta
static bool krajTexta();//
void upisiZnak();//upiduje znak u rec
char* rec;//sadrzi novu rec
};
char* Rec::text=NULL;
char* Rec::iteratorTexta=NULL;
char* Rec::prviZnakReci=NULL;
Rec::Rec(char* t)
{
text=t;
iteratorTexta=t;
prviZnakReci=t;
}
Rec::Rec()
{
prviZnakReci=iteratorTexta+1;
iteratorTexta++;
}
bool Rec::krajTexta()
{
char znak=*iteratorTexta;
if(znak=='\0')
{
return 1;
}
else
{
return 0;
}
}
char* Rec::izdvojReci()
{
int brojac=0;
char znak=*iteratorTexta;
while(1)
{
if(znak==' ') break;
brojac++;
iteratorTexta++;
znak=*iteratorTexta;
}
char* pom=new char[brojac+1];
for(int i=0;i<brojac;i++)
{
pom[i]=*(prviZnakReci+i);
}
pom[i]='\0';
return pom;
}
void Rec::upisiZnak()
{
rec=izdvojReci();
}
void main(){
Rec prva("da da da da da"),niz[100];
niz[0]=prva;
prva.upisiZnak();
for(int i=1,p=1;Rec::krajTexta();i++,p++)
{
Rec* pom=new Rec();
pom->upisiZnak();
niz[i]=*pom;
}
}
medjutim on ne radi ono sto ja ocekujem.
zamislio sam da za svaku rec texta pravim novu instancu klase.
mislim da je problem u brojacu koji uopste ne prekida brojanje znakova u reci izmedju dva blanko znaka. kao da ne prepoznaje da je naisao na blanko znak.
hvala unapred za trud svima koji pokusaju da mi pomognu!!!
[filmil: dodao code tag]
|
[ filmil @ 29.11.2004. 11:55 ] @
Ima puno problema u ovom kratkom programu.
Jedan od problema je i to što su ti većina stvari statičke (static) tako da sve klase dele istu instancu. Efekat je da kada god napraviš novu instancu klase Rec, ti pregaziš ono što je nekada pisalo u odgovarajućim promenljivim.
Da li si siguran da znaš kakav efekat ima ključna reč static?
Možda postoje i druge greške, ovo sam primetio na prvo gledanje.
f
[ slonce @ 29.11.2004. 12:18 ] @
Ja sam primetio na prvi pogled da kao kraj reci uzimas karakter '\0'. mislim da bi tu trebalo da ispitujes pojavljivanje ' ' (blank) i znakova interpunkcije.
[ ivbrcic @ 29.11.2004. 12:24 ] @
Koristenjem kljucne rijeci static u klasi ima efekt globalne varijable. Znaci vise instanci jedne klase mogu pristupati i mjenjati vrijednosti static varijabli. Kada pises static unutar klase tada se ta varijabla nalazi samo na jednom mjestu u memoriji i ona je djeljena medu svim instancama klase.
[ vlada_dj @ 29.11.2004. 14:03 ] @
Sam uslov zadatka je da postoji funkcija koja ce pri svakom pozivu vracati pokazivac na dinamicki niz znakova u kojem je izdvojena jedna rec texta pa sam na osnovu toga zakljucio da bi najbolje bilo da je taj text zajednicki za svaku instancu klase. Zbog toga sam stavio da je on staticka promenljiva. Da bih iterirao kroz taj text potrebne su mi neke promenljive koje sam takodje stavio kao staticke. To sam uradio jer zelim da za svaku rec texta formiram novu instancu klase a staticke promenljive su dobar nacin da se da se zapamti na kojoj reci u textu se stalo i koju treba sledecu izdvojiti. Kao kraj reci koristim uslov da je iterator do sao do blanko znaka odnosno da je *iteratorTexta==' ' kao kraj citavog texta *iteratorTexta=='\0'. Znakovi interpunkcije nisu bitni.
Nadam se da sam vam malo priblizio moju ideju. Ako neko ima neki drugi predlog rado cu ga prihvatiti.
Tokom pracenja izvrsavanja koda primetio sam se izvrsi samo konstruktor
Rec(char*) i to kada se napravi prva instanca klase a pri svakom sledecem kreiranju instance klase char* pom=new Rec() ja ocekujem da ce se izvrsiti konstruktor Rec() modjutim to se izgleda ne desava.
Molio bih da one koji imaju vremena pogledaju kod i kazu mi sta, po njima, ne valja u kodu.
[ vlada_dj @ 30.11.2004. 17:53 ] @
resio sam problem.
[ filmil @ 30.11.2004. 21:53 ] @
Fino, ako si rešio, a ti ga postavi ovde da svi vide.
f
[ vlada_dj @ 01.12.2004. 11:07 ] @
Pa problem je bio u sledecem:
Da bih sacuvao instance klase koristo sam promenljivu niz koja cuva elemente klase Rec. Nisam uzeo u obzir da u klasi rec imam i pokazivace na dinamicke objekte pa stavljanjem objekata klase rec u niz te dinamicke objekte gubim.
Resenje je sledece:
void main(){
Rec prva("da da da da da"),*niz[100];
niz[0]=&prva;
prva.upisiZnak();
int i=1;
while(!Rec::krajTexta)
Rec* pom=new Rec();
pom->upisiZnak();
niz=pom;
i++;
}
int p=i;
while(i>=0)//ispis reci
{
cout << niz[p-i]->rec << ' ';
i--;
}
}
trebao sam da niz definisem kao niz pokazivaca na Rec!!
[ Dragi Tata @ 01.12.2004. 18:22 ] @
Vlado, molim te da koristiš code tagove kad postuješ kod. Hvala.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.