Definisati generičku klasu Skup koja omogućava manipulaciju skupom podataka određenog
tipa. Podaci koji pripadaju skupu treba da se drže u nizu koji se dinamički kreira. Parametar
šablona je tip podataka koji se drže u nizu. Osim toga, šablon može da ima i jedan stvarni
argument koji predstavlja inicijalnu podrazumijevanu veličinu skupa, odnosno dinamičkog niza u
kojem se drže elementi skupa. Osim konstruktora i destruktora, treba minimalno implementirati:
• funkciju članicu koja omogućava dodavanje novog elementa u skup ako dati element ne
postoji u skupu. Ako se skup napuni, treba omogućiti povećavanje kapaciteta dinamičkog
niza u kojem se drže elementi skupa;
• funkciju članicu koja omogućava "izbacivanje" nekog elementa iz skupa; i
• prijateljsku operatorsku funkciju kojom se preklapa operator << čime se ispisuju svi elementi
skupa na odgovarajućem izlaznom toku.
Napisati program koji učitava neki string, a zatim analizira sadržaj tog stringa. Svako slovo u
stringu treba dodati u skup slova, svaku cifru u skup cifara i sl. Na kraju treba ispisati svaki skup
na standardni izlaz.
Za kreiranje odgovarajućih skupova treba koristiti generičku klasu Skup.
Moj kod:
Code:
#include<iostream>
using namespace std;
template <class T,int N=20> // N je inicijalna veliiina skupa
class Skup
{
public:
Skup()
{
n=0 ;
max=N;
element= new T[max];
}
void dodaj(T dd);
void izbaci(T dd);
friend ostream & operator <<(ostream &out,Skup &skup)
{ for(int i=0; i<n; i++) { out << skup.element[i] <<" "; } return out; }
~Skup()
{delete [] element; }
protected:
T *element; // pokazuje na element
int n ; // broj elemenata (lokacija gdje se upisuje sledeci element)
int max; // max broj elemenata
};
template <class T,int N>
void Skup<T,N> ::dodaj(T dd)
{
int postoji=0; // indikator stanja elementa
int ii=0; // lokacija gdje treba upisati novi element
for(int i=0;i<n;i++) // provjera da li elemenat postoji u skupu
{
if (element[i]<dd && element[i+1]>dd) ii=i+1 ;
if (element[i]==dd) { postoji=1; cout<<"Postoji isti element"; break; }
}
if(!postoji) // ako nema elementa u skupu,dodajemo ga
{
element[n]=dd;
n++;
}
};
template <class T,int N>
void Skup<T,N> ::izbaci(T dd)
{
for(int i=0; i<n; i++)
{
if(element[i]==dd)
{
for(int j=i; j<n; j++)
element[j]=element[j+1];
n--;
break;
}
}
};
/* dodatna funkcija(nije clanica klase)
a pretvara string u broj */
int broj(const char*s)
{
int n=0,i=0;
bool negativan=false;
if(s[i]=='-')
{ negativan=true; i++; }
while(s[i])
{ n*=10; n+=s[i]-'0'; i++; }
return ((negativan) ? (-n):(n));
}
main()
{
Skup<int>cifra;
Skup<char>slovo;
char string[255];
cout << "Unesite neki string: ";
cin.getline(string,255); // ucitavanje stringa
int i=0; // trenutni polozaj u stingu
while(string[i])
{
// znak+cifre=negativan broj
if(string[i]=='-' && string[i+1]>='0' && string[i+1]<='9')
{
int j=i+1;
while(string[j]>='0' && string[j]<='9')
{ cifra.dodaj(string[j]-'0'); j++; }
char *pom=new char[j-i+1];
strncpy(pom,&string[i],j-i);
pom[j-i]='0';
cifra.dodaj(broj(pom));
i=j;
continue;
}
// cifre,brojevi
if(string[i]>='0' && string[i]<='9')
{
int j=i;
while(string[i]>='0' && string[i]<='9')
{ cifra.dodaj(string[i]-'0'); i++; }
char *pom=new char[i-j+1];
strncpy(pom,&string[j],i-j);
pom[i-j]='0';
cifra.dodaj(broj(pom));
continue;
}
// mala slova
if(string[i]>='a' && string[i]<='z')
{ slovo.dodaj(string[i]); i++; continue; }
// velika slova
if(string[i]>='A' && string[i]<='Z')
{ slovo.dodaj(string[i]); i++; continue; }
i++; // sledeci karakter za obradu
}
cout<< "cifre: "<<cifra;
cout<< "slova: "<<slovo;
system("pause");
}
#include<iostream>
using namespace std;
template <class T,int N=20> // N je inicijalna veliiina skupa
class Skup
{
public:
Skup()
{
n=0 ;
max=N;
element= new T[max];
}
void dodaj(T dd);
void izbaci(T dd);
friend ostream & operator <<(ostream &out,Skup &skup)
{ for(int i=0; i<n; i++) { out << skup.element[i] <<" "; } return out; }
~Skup()
{delete [] element; }
protected:
T *element; // pokazuje na element
int n ; // broj elemenata (lokacija gdje se upisuje sledeci element)
int max; // max broj elemenata
};
template <class T,int N>
void Skup<T,N> ::dodaj(T dd)
{
int postoji=0; // indikator stanja elementa
int ii=0; // lokacija gdje treba upisati novi element
for(int i=0;i<n;i++) // provjera da li elemenat postoji u skupu
{
if (element[i]<dd && element[i+1]>dd) ii=i+1 ;
if (element[i]==dd) { postoji=1; cout<<"Postoji isti element"; break; }
}
if(!postoji) // ako nema elementa u skupu,dodajemo ga
{
element[n]=dd;
n++;
}
};
template <class T,int N>
void Skup<T,N> ::izbaci(T dd)
{
for(int i=0; i<n; i++)
{
if(element[i]==dd)
{
for(int j=i; j<n; j++)
element[j]=element[j+1];
n--;
break;
}
}
};
/* dodatna funkcija(nije clanica klase)
a pretvara string u broj */
int broj(const char*s)
{
int n=0,i=0;
bool negativan=false;
if(s[i]=='-')
{ negativan=true; i++; }
while(s[i])
{ n*=10; n+=s[i]-'0'; i++; }
return ((negativan) ? (-n):(n));
}
main()
{
Skup<int>cifra;
Skup<char>slovo;
char string[255];
cout << "Unesite neki string: ";
cin.getline(string,255); // ucitavanje stringa
int i=0; // trenutni polozaj u stingu
while(string[i])
{
// znak+cifre=negativan broj
if(string[i]=='-' && string[i+1]>='0' && string[i+1]<='9')
{
int j=i+1;
while(string[j]>='0' && string[j]<='9')
{ cifra.dodaj(string[j]-'0'); j++; }
char *pom=new char[j-i+1];
strncpy(pom,&string[i],j-i);
pom[j-i]='0';
cifra.dodaj(broj(pom));
i=j;
continue;
}
// cifre,brojevi
if(string[i]>='0' && string[i]<='9')
{
int j=i;
while(string[i]>='0' && string[i]<='9')
{ cifra.dodaj(string[i]-'0'); i++; }
char *pom=new char[i-j+1];
strncpy(pom,&string[j],i-j);
pom[i-j]='0';
cifra.dodaj(broj(pom));
continue;
}
// mala slova
if(string[i]>='a' && string[i]<='z')
{ slovo.dodaj(string[i]); i++; continue; }
// velika slova
if(string[i]>='A' && string[i]<='Z')
{ slovo.dodaj(string[i]); i++; continue; }
i++; // sledeci karakter za obradu
}
cout<< "cifre: "<<cifra;
cout<< "slova: "<<slovo;
system("pause");
}
Zbog cega mi stalno javlja gresku:
In function `std::ostream& operator<<(std::ostream&, Skup<T, N>&)':
invalid use of non-static data member `Skup<T, N>::n'
from this location