#include using namespace std; class Skup { public: //F-je prema uslovima zadatka Skup(); ~Skup(); Skup(Skup &); Skup unija(Skup &); Skup presjek(Skup &); friend void printSkup(Skup &); friend void napuniSkup(Skup &); void ubaciElement(int); void izbaciElement(int); bool jednak(Skup &); int broj_skupova(); private: //Niz gdje ce biti smjesteni podaci int niz[101]; //Brojac skupova static int bs; //Obicna f-ja za provjeru da li je neki broj unutar [0,100] int u_granici(int); }; //Setujemo brojac skupova na 0 int Skup :: bs = 0; //Konstruktor Skup :: Skup () { //Setujemo sve vrijednosti niza na 0 for(int i=0; i<=100; i++) niz[i]=0; //Povecavamo broj skupova bs++; } //Destruktor Skup :: ~Skup () { //Smanjujemo broj skupova bs--; } //Konstruktor kopije Skup :: Skup (Skup &) { //Povecavamo broj skupova bs++; } //F-ja vraca broj skupova int Skup :: broj_skupova () { return bs; } //F-ja za dodavanje elementa u skup void Skup :: ubaciElement (int el) { //Ako je element u granici [0,100] dodajemo ga u skup if(u_granici(el)) niz[el]=1; //Ako nije u granici, obavjestimo korisnika else cout << "Elementi skupa moraju biti unutar [0,100]" << endl; } //F-ja za brisanje elementa iz skupa void Skup :: izbaciElement (int el) { //Ako je element u skupu, izbrisemo ga if(niz[el]==1) niz[el]=0; //A ako nije bio u skupu, obavjestimo korisnika else cout << "Element " << el << " nije ni bio u skupu" << endl; } //F-ja za provjeru jednakosti 2 skupa bool Skup :: jednak (Skup &sk) { for(int i=0; i<=100; i++) //Ako su 2 elementa razlicita odmah kazemo da su skupovi razliciti if(niz[i] != sk.niz[i]) return 0; return 1; } //F-ja za uniju 2 skupa Skup Skup :: unija (Skup &sk) { Skup tmp; for(int i=0; i<=100; i++) //Ako se element nalazi u nekom od 2 skupa, dodamo ga u novi skup if(niz[i] || sk.niz[i]) tmp.niz[i]=1; return tmp; } //F-ja za presjek 2 skupa Skup Skup :: presjek (Skup &sk) { Skup tmp; for(int i=0; i<=100; i++) //Ako se element ne nalazi u oba skupa , dodamo ga u novi skup if(niz[i] && sk.niz[i]) tmp.niz[i]=1; return tmp; } //F-ja za punjenje postojeceg skupa novim elementima void napuniSkup (Skup &sk) { int el; //Obavjestenje korisniku cout << "Niz se unosi sve dok je u granici [0,100]" << endl; //Ukoliko se unese broj koji nije u granici, iskace se iz while petlje do { //Unesemo neki broj cin >> el; //Ako je element u granici, dodamo ga u skup if(sk.u_granici(el)) sk.niz[el]=1; } while (sk.u_granici(el)); } //F-ja za ispis elemenata skupa void printSkup (Skup &sk) { for(int i=0, br=0; i<=100; i++) if(sk.niz[i]==1) { //Ovaj br je cisto estetske prirode i sluzi se nebi ispisao zarez //pa onda prvi element skupa, jer nema logike if(br!=0) cout << ","; cout << i; br++; } cout << endl; } //Pomocna f-ja za provjeru da li je element u granici [0,100] int Skup :: u_granici (int el) { if((el>=0) && (el<=100)) return 1; return 0; } int main() { //Definisemo 3 skupa Skup a, b, tmp; //Ubacimo neke elemente u skupove for(int i=0; i<=10; i+=2) a.ubaciElement(i); for(int i=0; i<=10; i+=3) b.ubaciElement(i); //Ispisemo skupove cout << "Skup a: "; printSkup(a); cout << "Skup b: "; printSkup(b); //Odradimo uniju tmp = a.unija(b); //Ispisemo uniju skupova cout << "Unija: "; printSkup(tmp); //Odradimo presjek tmp = a.presjek(b); //Ispisemo presjek skupova cout << "Presjek: "; printSkup(tmp); //Ispisemo jednakost skupova if (a.jednak(b)) cout << "Skupovi a i b su jednaki!" << endl; else cout << "Skupovi a i b su razliciti!" << endl; //Mozemo i ispisati broj ukupno inicijalizovanih skupova cout << "Broj skupova: " << a.broj_skupova(); getchar(); return EXIT_SUCCESS; }