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