Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Stránky: 1
Ahoj,
potřebovala bych poradit jak udělat sjednocení a průnik dvou množin (množiny jsou realizované pomocí pole).
Díky za případnou pomoc.
Třída:
class Set { TypPrvku *pole; int pocetPrvku; int maxPrvku; public: Set(TypPrvku mp=20); ~Set(); void odeber(TypPrvku); bool jeTam(TypPrvku) const; void vloz(TypPrvku); friend Set operator+(Set, Set ); // sjednocení friend Set operator*(Set, Set ); // průnik void prunik(Set b1, Set b2); void sjednoceni(Set b1, Set b2); Set(const Set&); Set& operator=(const Set&); friend ostream& operator+=(Set&, TypPrvku); friend ostream& operator<<(ostream&, const Set&); Set* serad(TypPrvku*); Set* odstranDuplicity(TypPrvku p); };
Offline
Ahoj,
co třeba:
Set Set::operator + (Set a, Set b) // sjednocení { Set tmp(a.pocetPrvku + b.pocetPrvku) ; // výsledná množina bude mít nejvýš |a| + |b| prvků for(unsigned int i = 0 ; i < a.pocetPrvku ; i++) // vložíme prvky z a tmp.vloz(a.pole[i]) ; for(unsigned int i = 0 ; i < b.pocetPrvku ; i++) // vložíme prvky z b tmp.vloz(b.pole[i]) ; for(unsigned int i = 0 ; i < tmp.pocetPrvku ; i++) // odstraníme duplicity odstranDuplicity(i) ; // předpokládám že funkce odstraňuje právě n-1 výskytů n-násobných prvků return tmp ; // hotovo } Set Set::operator * (Set a, Set b) // průnik { Set tmp((a.pocetPrvku > b.pocetPrvku) ? a.pocetPrvku : b.pocetPrvku) ; // průnik -> nejvýše max(|a|, |b|) prvků for(unsigned int i = 0 ; i < a.pocetPrvku ; i++) // ke každému prvku z a for(unsigned int j = 0 ; j < b.pocetPrvku ; j++) // hledáme v b if(a.pole[i] == b.pole[j]) // stejný { tmp.vloz(a.pole[i]) ; // a když ho najdeme, vložíme ho do průniku. Pak pokračujeme s prohledáváním a j = b.pocetPrvku ; // continue by asi bylo slušnější, nejsem si ale jist jestli by neopakovalo vnitřní cyklus místo vnějšího } return tmp ; // hotovo }
Možná bych ještě změnil pocetPrvku a maxPrvku na typ unsigned int, protože v C++ určitě z pole prvky se zápornými indexy nikdo tahat nechce. :-)
Také by bylo vhodné použít předávání odkazem. Ušetří se tím cesta čtyř intů přes zásobník.
Deklarace by pak vypadala asi takto:
Set Set::operator + (const Set &a, const Set &b) ; Set Set::operator * (const Set &a, const Set &b) ;
Obdobně by se změnila definice. Tělo funkcí by zůstalo naprosto beze změny.
Offline
Děkuji.
Offline
Stránky: 1