Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Soutěž

Sponzorem soutěže je:

IDIF – vaše škola fotografie

 

Kdo lektoruje pražský letní workshop v ZOO a Botanické zahradě?

V dnešní soutěži hrajeme o:

Dárkový certifikát v hodnotě 1000 Kč



Sets

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Sets

Autor: dragon1

22:44:54 26.11.2011

Tak už nic, právě jsem na to přišel. Mě to vůbec nenapadlo přes ty statický
to udělat. Díky

Citovat příspěvek

 

Re: Sets

Autor: dragon1

22:31:06 26.11.2011

Teď mě napadlo jestli by to nešlo něco na tento způsob.

[code]


static char jmeno = 'a';

Mnozina:: Mnozina(int n,const char *jmeno)
:size(n)
{

if(Mnozina a != null)
cout << "a";

pole = new string[size];

for(int i = 0; i < n; i++)
{
// jestli by automaticky přešel na znak b kdybych to takhle udělal
ale myslím, že nějak takhle by to mohlo jít
cout << "prvek " << i+1 << "/" << jmeno++ << " ";;


cin >> pole[i];
}

}


[/code]

Citovat příspěvek

 

Re: Sets

Autor: dragon1

22:17:11 26.11.2011

Já jsem četl různě na fórech o tom ale vůbec nevím, jak by se to dalo takhle udělat
aby to fungovalo, tak jak jsem napsal. To vůbec netuším jak by se to dalo přes makra udělat.

[code]

static char jmeno = 'a';


Mnozina:: Mnozina(int n)
:size(n)
{

if(Mnozina a != null)
cout << "a";

pole = new string[size];

for(int i = 0; i < n; i++)
{
// a tady by byla podmínka nejdřív by se použil znak 'a' a potom ho zvýšit
o 1 a byl by tam znak 'b' ale jak by byla podmínka, to znamená, že při vytvoření tohoto konstruktoru tak by byla nějak takhle? if(Mnozina = new Mnozina()) já vím tohle je
nejspíš blbost a asi pak by tam měl být for cyklus i když už tu jeden je nebo udělat
for cyklus takhle nějak- for(char i = 'a', i < 256, i++) popravdě nevím spíš přibližně
jestli tak nějak by to mohlo být i když to je špatně, to vůbec netuším jak udělat.
Nebo kdyby to šlo nějak na ty názvy napojit když bude "Mnozina a" tak třeba nějak to
porovnat když se bude Množina rovnat "Množině a" ale to je asi složitý. Když se bude
jmenovat instance třídy Množina "a" tak potom vypiš "a" a když b tak "b" i když to to
nejde asi jsem to zkoušel ale nedaří se mi.

cout << "prvek " << i+1 << "/" << jmeno << " ";;


cin >> pole[i];
}

}





[/code]

Citovat příspěvek

 

Re: Sets

Autor: mol

22:00:45 26.11.2011

to se obavam slusne (bez makra) nejde

jediny, co by se tomu mohlo blizit je udelat si statickou prommenou typu char zacinajici od "a" a vzdy pri pouziti tohoto kontruktoru ji pouzit jako jmeno a zvysit o jednicku

Citovat příspěvek

 

Re: Sets

Autor: dragon1

19:42:48 26.11.2011

Díky.

Ještě bych se chtěl zeptat jak by se dalo udělat tohle:

[code]

//napadlo mě kdyby to šlo nějak takhle Mnozina:: Mnozina(Mnozina a, Mnozina b) a z toho pak vypsat podmínkou když to bude Mnozina a tak to bude "a" a když b tak "b" ale nevím
jak bych to mohl udělat zkoušel jsem to ale nedaří se mi to

Mnozina:: Mnozina(int n,const char *jmeno)
:size(n)
{

if(Mnozina a != null)
cout << "a";

pole = new string[size];

for(int i = 0; i < n; i++)
{

cout << "prvek " << i+1 << "/" << jmeno << " ";;


cin >> pole[i];
}

}



int main(int args, char*argv[])
{
// chtěl bych místo Mnozina a(atoi(argv[1])),"a") aby ten název "a" se mi vytvořil
když mám jen Mnozina a(atoi(argv[1])) aby se mi vypsalo vlastně ten název té instance já
jsem se koukal na internet a nenašel jsem nic na to a nevím jak by se to dalo udělat.

Mnozina a(atoi(argv[1])); //takto aby to bylo
Mnozina b(atoi(argv[2]));


return 0;


}




[/code]

Citovat příspěvek

 

Re: Sets

Autor: mol

5:57:07 26.11.2011

temp.Prunik(*this,other);

Citovat příspěvek

 

Re: Sets

Autor: dragon1

0:41:30 26.11.2011

Děkuju.

Teď se s tím peru a zkoušel jsem si přepsat např. funkci průnik podle toho
příkladu ale nefunguje mi to myslím, že chyba bude u přetížení operátoru.

[code]

void Mnozina :: Prunik(Mnozina adup, Mnozina bdup)
{
........................................
}

// zkompilovat mi to jde ale tohle si myslím, že je špatně ale vůbec teď nevím
jak to udělat. Když má funkce Průnik dva parametry typu Mnozina tak jsem to udělal
takhle ale to mi nefunguje.

Mnozina Mnozina :: operator *(Mnozina other)
{


Mnozina temp;

temp.Prunik(temp,other);

return temp;


}


[/code]

Předem díky za pomoc.

Citovat příspěvek

 

Re: Sets

Autor: mol

23:20:21 25.11.2011

Tak si to odstran duplicity napis uzitecne:
[code]Mnozina Mnozina::odstranduplicity()
[color=blue]// vrati mnozinu bez duplicit[/color]
{

[bold]int[/bold] tmp;
Mnozina bezduplicit;
bezduplicit.pole = [bold]new[/bold] [bold]int[/bold][size];

[bold]for[/bold]([bold]int[/bold] i = 0; i < size; i++)
{
tmp = pole[i];
[bold]bool[/bold] duplicita = [bold]false[/bold];
[bold]for[/bold]([bold]int[/bold] j = 0; j < bezduplicit.size; j++)
{
[bold]if[/bold](bezduplicit.pole[j] == tmp)
{
duplicita = [bold]true[/bold];
[bold]break[/bold];
}
}
[bold]if[/bold] (!duplicita) {
bezduplicit.pole[bezduplicit.size++] = tmp;
}
}
[bold]return[/bold] bezduplicit;
}
[/code]
pak muzes ten symetricky rozdil napsat treba takto:


[code][bold]void[/bold] Mnozina::SymetrickyRozdil(Mnozina adup, Mnozina bdup)
{
Mnozina a = adup.odstranduplicity();
Mnozina b = bdup.odstranduplicity();

[bold]delete[/bold][] pole;
pole = [bold]new[/bold] [bold]int[/bold][a.size + b.size];
velikost = 0;

[color=blue]//všechny prvky v a není-li prvek v b[/color]
[bold]for[/bold]([bold]int[/bold] i = 0; i < a.size; i++)
{
[bold]int[/bold] prvek = a.pole[i];

[bold]bool[/bold] nasel = [bold]false[/bold];
[bold]for[/bold]([bold]int[/bold] j = 0; j < b.size; j++)
{
[bold]if[/bold](prvek == b.pole[j]) {
nasel = [bold]true[/bold];
[bold]break[/bold];
}
}
[bold]if[/bold] (!nasel) {
pole[size++] = prvek;
}
}


[color=blue]//všechny prvky v b není-li prvek v a[/color]
[bold]for[/bold]([bold]int[/bold] i = 0; i < b.size; i++)
{
[bold]int[/bold] prvek = b.pole[i];

[bold]bool[/bold] nasel = [bold]false[/bold];
[bold]for[/bold]([bold]int[/bold] j = 0; j < a.size; j++)
{
[bold]if[/bold](prvek == a.pole[j]) {
nasel = [bold]true[/bold];
[bold]break[/bold];
}
}
[bold]if[/bold] (!nasel) {
pole[size++] = prvek;
}

}
}[/code]

Citovat příspěvek

 

Re: Sets

Autor: dragon1

22:19:51 25.11.2011

Tak to je mi vlastně k ničemu dá se říct. Teď mě napadlo jestli by to šlo takhle nějak přibližně.

Kdybych v obou polích zjistil duplicitní hodnoty a pak nakonec je porovnal spolu ale asi to dělám zbytečně složitě a špatně.

[code]


void Mnozina:: Rozdil(int a[],int b[], int na, int nb)
{
delete[] pole;
pole = new int[na+nb];



for(int i = 0; i < na; i++)
{

if(a[i]^a[i+1])
cout< else
continue;
}



for(int j = 0; j {
if(b[j] ^ b[j+1])
cout << b[i] << " ";
else
continue;
}





for(int i = 0; i < na; i++)
{
int prvek = a[i];

bool nasel = false;

for(int j = 0; j < nb; j++)
{


if(prvek ^ b[j])
{
nasel = true;
break;
}


}

if(!nasel)
pole[size++] = prvek;


}




}

[/code]

Citovat příspěvek

 

Re: Sets

Autor: mol

20:42:53 25.11.2011

no tohle zjisti, jestli tam duplicita je, pak vrati false, jinak true

pole[] to nemeni, ani to nevraci novy Set jako vysledek

Citovat příspěvek

 

Re: Sets

Autor: dragon1

1:31:51 25.11.2011

Děkuju.

Už to funguje, já jsem se do toho zamotal úplně.

Ještě se snažím řešit ty duplicitní hodnoty a zkusil jsem metodu napsat, taky jsem se inspiroval z internetu ale nevím jak bych to propojil s těmi jednotlivými operacemi. Vždycky u té operace průnik,rozdíl atd. bych tam volal tuto metodu a ta by odstranila ty duplicity.

Tady je ta metoda ale nevím jestli to je správně.

[code]
bool Mnozina::odstranduplicity()
{

int tmp;


for(int i = 0; i < size; i++)
{
tmp = pole[i];
for(int j = 0; j < size; j++)
{

if(pole[j] == tmp && (j>i))
{
return false;
}
}
}


return true;


}

[/code]

Citovat příspěvek

 

Re: Sets

Autor: mol

22:25:12 23.11.2011

Dne 23.11.2011 1:50, dragon1 napsal(a):
>
>
> Já jsem to zkusil přepsat ale asi to mám špatně pořád i když si myslím, že by to takhle už mělo být.
>
> Když zadám např:
> A = {1,5};
> B = {4,7};
>
> tak rozdíl A-B mi vypíše - 1 1 5 5
> Vlastně ty hodnoty jsou správně ale, že jo zdvojí takhle nejspíš to mám pořád špatně ten algoritmus.
>
>
>
>
> delete[] pole;
> pole = new int[na+nb];
>
>



>
> for(int i = 0; i < na; i++)
> {
> int prvek = a;


// tohle patri do vnejsi smycky
bool nasel = false;


>
> for(int j = 0; j < nb; j++)
> {
>
>
> if(prvek == b[j])
> {
> nasel = true;
> break;
> }
>
>
> }
>

// a tohle taky
if(!nasel)
pole[size++] = prvek;


>
> }
>
>
>
>
>
>
>
>


--
Zdraví,
Michal Molhanec

Příspěvek zaslán emailem

Citovat příspěvek

 

Re: Sets

Autor: dragon1

1:50:29 23.11.2011

Já jsem to zkusil přepsat ale asi to mám špatně pořád i když si myslím, že by to takhle už mělo být.

Když zadám např:
A = {1,5};
B = {4,7};

tak rozdíl A-B mi vypíše - 1 1 5 5
Vlastně ty hodnoty jsou správně ale, že jo zdvojí takhle nejspíš to mám pořád špatně ten algoritmus.


[code]

delete[] pole;
pole = new int[na+nb];


bool nasel = false;


for(int i = 0; i < na; i++)
{
int prvek = a[i];

for(int j = 0; j < nb; j++)
{


if(prvek == b[j])
{
nasel = true;
break;
}

if(!nasel)
pole[size++] = prvek;

}


}







[/code]

Citovat příspěvek

 

Re: Sets

Autor: mol

0:04:07 23.11.2011

Ty vnitrni smycky musej vypadat nejak takhle:
[code]bool nasel = false;
for(int j = 0; j < nb; j++)
{
if(prvek == b[j]) {
nasel = true;
break;
}
}
if (!nasel) {
pole[size++] = prvek;
}[/code]

Jinak, ted se divam, ze jsem v tom svem pseudokodu udelal chybu, kterou jste nastesti neaplikoval, takze to mate dobre:
pole = new int[vetsi z na nb];
melo bejt
pole = new int[na + nb];

Citovat příspěvek

 

Re: Sets

Autor: dragon1

23:00:40 22.11.2011

Díky moc.

Bojuju tady s tím ale nedaří se mi to pořád to mám špatně já jsem si to rozepsal takhle:


Určitě jsem to špatně napsal podle toho pseudokódu.

[code]
delete[] pole;
pole = new int[na+nb];


//všechny prvky v a není-li prvek v b
for(int i = 0; i < na; i++)
{
int prvek = a[i];

for(int j = 0; j < nb; j++)
{


if(prvek != b[j])
pole[size++] = prvek;

}


}


//všechny prvky v b není-li prvek v a
for(int i = 0; i < nb; i++)
{
int prvek = b[i];

for(int j = 0; j< na; j++)
{
if(prvek!= a[j])
pole[size++] = prvek;
}
}
[/code]

Citovat příspěvek

 

Re: Sets

Autor: mol

21:57:42 22.11.2011

[code][bold]delete[/bold] [] pole;
pole = [bold]new[/bold] [bold]int[/bold][vetsi z na nb];
velikost = 0
pro vsechny prvky v a
neni-li prvek v b
pole[velikost++] = prvek
pro vsechny prvky v b
neni-li prvek v a
pole[velikost++] = prvek[/code]

Citovat příspěvek

 

Re: Sets

Autor: mol

21:56:00 22.11.2011

Ech, ten kod je spatne, hned ho opravim

Citovat příspěvek

 

Re: Sets

Autor: mol

21:52:36 22.11.2011

a) problém je v tom, že píšete rozdíl, ale chcete operaci symetrický rozdíl, což je dost rozdíl :-)

ve skutečnosti to ale přece není takový problém:
a) buď se to dá napsat jako sjednocení A-B a B-A
b) nebo stačí doplnit podmínku:
[code]delete [] pole;
pole = new int[vetsi z na nb];
velikost = 0
pro vsechny prvky v a
neni-li prvek v pole a neni-li prvek v b
pole[velikost++] = prvek[/code]

co se tyce retezcu, rozhodne bych doporucoval pouzit std::string a vyhnout se tak problemum s alokaci, dealokaci atd.

Citovat příspěvek

 

Re: Sets

Autor: ondra.holub

13:26:29 22.11.2011

V tom operátoru přiřazení chybí na začátku kontrola, jestli se nepřiřazuje do sebe.
[code]
if (this == &other)
return *this;
[/code]

Citovat příspěvek

 

Re: Sets

Autor: dragon1

21:28:21 21.11.2011

Díky moc.

Tak na ten průnik jsem přišel pomocí toho pseudokódu a ten rozdíl tam jsem akorát místo je rovno dal není rovno ale ten rozdíl mi dobře nefunguje ten průnik jo nevím čím to je.

U toho rozdílu např.

Množina A = 1,1
Množina B = 5,4

A-B by měl být výsledek - 1 ale mě to vypíše - 1 1 1 1.

Množina A = 1,2
Množina B = 4,5

A-B výsledek by měl být - 1,2 a mě to vypíše - 1,1,2,2

Tak si říkám jestli to není problém s duplicitníma hodnotama nebo čím to může být nebo možná jsem to špatně napsal tu operaci Rozdíl já jsem akorát změni znaménko ale myslím, že by to tak mělo fungovat.

Ještě mám problém s těmi duplicitními hodnotami jak jste mi napsal, že by jste to hlídal při vstupu už, tak to mě nenapadlo vlastně by to vůbec nepustilo napsat tu duplicitní hodnotu ale já to potřebuju napsat i v případě, že tam ty duplicitní hodnoty budou například - Množ. A = 1,1,1,2,5 Tak když si porovnám ty prvky v tom poli a vyskytnou se víckrát tak chci vypsat pouze jednou ale nenapadá mě jak to udělat podmínkou koukal jsem se i různě na internetu ale nevím já to vlastně budu muset mít u všech operací aby to hlídalo ty duplikáty. Nebo když porovnám to jedno pole a v něm prvky projdu a když se budou opakovat tak mě napadlo použít třeba příkaz "continue" že by to přeskočilo ale nevím jak.

Ještě jsem se chtěl zeptat já to teď momentálně mám v celých čísel a potřeboval bych to ještě upravit, aby mi to bralo řetězce jde to nějak přetypovat aniž bych to musel nějak moc přepisovat? Nebo budu muset změnit typ z int toho pole třeba na char * pole .... Jenom mě napadlo kdyby to šlo jenom nějak přetypovat z toho int abych mohl zadávat i řetězce.

Předem děkuju za pomoc.

Citovat příspěvek

 

Re: Sets

Autor: mol

22:54:03 19.11.2011

ja bych teda duplikaty v mnozinach vubec nedovoloval, coz bych hlidal uz pri zadavani

[code][bold]for[/bold]([bold]int[/bold] i= 0; i < n; i++)
{
cout << [color=red]"prvek "[/color] << i+1 << [color=red]"/"[/color] << jmeno << [color=red]" "[/color];
cin >> pole[i];
[bold]for[/bold] ([bold]int[/bold] j = 0; j < i; j++) {
[bold]if[/bold] (pole[i] == pole[j]) {
cout << [color=red]"Duplikat!"[/color] << endl;
i--;
}
}
}[/code]

Sjednoceni() tak jak je napsane, duplikaty mezi (bezduplicitnimi) mnozinami jiz hlida.

Prunik by mohl vypadat nejak takhle -- pseudokod:
[code] delete [] pole;
pole = new int[vetsi z na nb];
velikost = 0
pro vsechny prvky v a
je-li prvek v b //*
pole[velikost++] = prvek[/code]
rodil je uplne to samy, akorat podmika oznacena hvezdickou je opacna

Citovat příspěvek

 

Re: Sets

Autor: dragon1

21:13:08 19.11.2011

Díky moc.

Já se snažím už skoro celej den ještě dopsat tam další operace na množiny ale nedaří se mi vycházím z toho sjednocení co napsal uživatel "mol". Potřeboval bych poradit co tam dělám špatně, já vím co chci udělat ale pořád tam dělám něco špatně.

Třeba u toho sjednocení jsem chtěl tam dopsat aby se mi nevypisovaly duplikáty.

A - 1,2,2
B - 1,2,2

tak sjednocení A a B by mělo být A sjedn. s B = 1,2 v tomhle příkladu. Ten algoritmus funguje ale když mám v každém z těch polí třeba víc stejných hodnot tak je taky vypisuje a těch se chci zbavit zkoušel jsem hodně způsobů ale nedaří se mi.

[code]

void Set:: Sjednoceni(int a[],int b[],int na,int nb)
{
cout << "Mazu " << pole << endl;
delete [] pole;
pole = new int[na+nb];
cout << "Alokuji " << pole << endl;
for (int i = 0; i < na; i++) {
pole[i] = a[i];
}
velikost = na;
for (int i = 0; i < nb; i++) {
bool nasel = false;
int prvek = b[i];
for (int j = 0; j < na; j++) {
if (a[j] == prvek) {
nasel = true;
break;
}
}
if (!nasel) {
pole[velikost++] = prvek;
}

}

//říkal jsem si že bude asi nejlepší když si napíšu zvlášť funkci na vyřazení těch duplicitních prvků protože
// když pak budu dělat průnik a další operace tak tam to taky budu potřebovat odstranit ty duplikáty



}

//funkce na odstranění duplicit napadlo mě trochu jak by to mohlo být

void Set:: odstranDupl()
{
//napadlo mě kdyby šlo to pole, kde jsou všechny ty prvky uloženy tak bych si ho prošel
// a porovnal v něm ty hodnoty a ty který se rovnají bych nevypisoval nebo bych je přeškočil třeba příkazem continue mě napadlo jestli by to šlo.



for(int i = 0; i < size; i++)
{
for(int j = 0; j < i; j++)
{
// pokud se budou prvky v poli rovnat tak je nevypisuj i když
// to co jsem napsal je asi blbost to by se mi nevypsal ani jeden prvek kdyby se rovnali nejspíš, spíš by to chtělo porovnat prvky v poli a kdyby se ta hodnota vyskytovala víckrát tak by se nevypsala pouze ta jedna, takže nějakým cyklem a podmínkama teď nevím vůbec

if(pole[i] == pole[j]
continue;
}
}


}


void Set:: Prunik(int a[],int b[], int na, int nb)
{

//vycházím z toho algoritmu na sjednoceni akorát si myslím, že to bude stačit upravit
// na ostatní operace já jsem to zkoušel ale se mnou to nespolupracuje pořád dělám něco špatně
// tady bych u průniku porovnal pole [bold]a[/bold] s polem [bold]b[/bold]
// a když se budou hodnoty rovnat tak je vypíšu tím získám průnik.
delete [] pole;
pole = new int[na+nb];

for(int i = 0; i < na; i++)
{
pole[i] = a[i];
}


size = na;

for(int i = 0; i < nb; i++)
{
for(int j = 0; j < i; j++)
{
if(b[i] == pole[j]) // to pole a[i] se uložilo do pole[i] a tady ho porovnám s polem b[i] ale nevím jestli to dělám dobře a nakonec by se mi vypsali jen ty prvky, které se rovnají a měl bych průnik

}


}

}


void Set:: Rozdil(int []a, int[]b, int na, int nb)
{

//rozdíl potřebuju udělat jak A-B tak B-A a přemýšlel jsem jestli by to šlo udělat
//pouze v jedný funkce obě tyto operace nebo budu muset napsat zvlášť funkci pro B-A
//
delete[]pole;
pole = new int[na+nb];

//pro A-B bych porovnal prvky v obouch polích zase a ty co by se rovnaly tak bych nevypisoval takže by byla podmínka když A == B ty co se rovnají nevypisuj a vypiš mi to pole A a dostal bych vlastně A-B doufám, že to píšu správně a naopak kdybych chtěl B-A akorát vypíšu prvky z B pole.

for(int i = 0; i < na; i++)
{
pole[i] = a[i];

}


size = na;


for(int i = 0; i < nb; i++)
{
bool nasel = false;

for(int j = 0; j < na; j++)
{
if(a[j] == b[i]) // když se budou prvky v polích rovnat tak je nevypisuj nasel = true;


}
//ty prvky co se budou rovnat se nesmí vypsat a vypíše se všechno z pole A nebo B kromě těch hodnot co se rovnají a dostanu A-B nebo B-A
// akorát mi to nejde naprogramovat

}
}

Potřeboval bych poradit s tím jestli vůbec to co píšu aspoň myslím tak nějak dobře nebo jsem úplně vedle. Předem děkuju za pomoc.


[/code]

Citovat příspěvek

 

Re: Sets

Autor: mol

12:15:38 19.11.2011

Ono to neni uplne trivialni, nejaky (urcite nikoli bezchybny) naznak reseni:

[code][color=green]#include[/color]
[color=green]#include[/color]

[bold]using[/bold] [bold]namespace[/bold] std;

[bold]class[/bold] Set
{

[bold]int[/bold] * pole;
[bold]int[/bold] velikost;

[bold]public[/bold]:
[bold]void[/bold] Sjednoceni([bold]int[/bold][],[bold]int[/bold][],[bold]int[/bold],[bold]int[/bold]);
[bold]void[/bold] vypis(); [color=blue]// vypise jednotlive prvky v poli[/color]
[bold]int[/bold] getVelikost(); [color=blue]// vypise pocet prvku v poli[/color]

Set() : velikost(0), pole(0) {}
Set([bold]int[/bold], [bold]const[/bold] [bold]char[/bold]* jmeno);
Set([bold]const[/bold] Set& other) : velikost(other.velikost), pole(0) {
[bold]operator[/bold]=(other);
}
Set& [bold]operator[/bold]=([bold]const[/bold] Set& other) {
cout << [color=red]"Mazu "[/color] << pole << endl;
[bold]delete[/bold] [] pole;
pole = 0;
velikost = other.velikost;
[bold]if[/bold] (velikost > 0) {
pole = [bold]new[/bold] [bold]int[/bold][velikost];
cout << [color=red]"Alokuji "[/color] << pole << endl;
[bold]for[/bold] ([bold]int[/bold] i = 0; i < velikost; i++) {
pole[i] = other.pole[i];
}
}
[bold]return[/bold] *[bold]this[/bold];
}
~Set() { [bold]delete[/bold] [] pole; cout << [color=red]"Mazu "[/color] << pole << endl; }
Set [bold]operator[/bold] +(Set);

};


Set:: Set([bold]int[/bold] n, [bold]const[/bold] [bold]char[/bold]* jmeno)
: velikost(n)
{
pole = [bold]new[/bold] [bold]int[/bold][n];
cout << [color=red]"Alokuji "[/color] << pole << endl;
[bold]for[/bold]([bold]int[/bold] i= 0; i < n; i++)
{
cout << [color=red]"prvek "[/color] << i+1 << [color=red]"/"[/color] << jmeno << [color=red]" "[/color];
cin >> pole[i];
}

}

[bold]void[/bold] Set:: Sjednoceni([bold]int[/bold] a[],[bold]int[/bold] b[],[bold]int[/bold] na,[bold]int[/bold] nb)
[color=blue]// naplni instanci Setu sjednocenim a[] a b[][/color]
{
cout << [color=red]"Mazu "[/color] << pole << endl;
[bold]delete[/bold] [] pole;
pole = [bold]new[/bold] [bold]int[/bold][na+nb];
cout << [color=red]"Alokuji "[/color] << pole << endl;
[bold]for[/bold] ([bold]int[/bold] i = 0; i < na; i++) {
pole[i] = a[i];
}
velikost = na;
[bold]for[/bold] ([bold]int[/bold] i = 0; i < nb; i++) {
[bold]bool[/bold] nasel = [bold]false[/bold];
[bold]int[/bold] prvek = b[i];
[bold]for[/bold] ([bold]int[/bold] j = 0; j < na; j++) {
[bold]if[/bold] (a[j] == prvek) {
nasel = [bold]true[/bold];
[bold]break[/bold];
}
}
[bold]if[/bold] (!nasel) {
pole[velikost++] = prvek;
}
}
}


[bold]void[/bold] Set:: vypis()
{
[bold]for[/bold]([bold]int[/bold] i = 0; i < getVelikost(); i++)
{
cout < }
cout << endl;
}


[bold]int[/bold] Set:: getVelikost()
{
[bold]return[/bold] velikost;
}

Set Set:: [bold]operator[/bold] +(Set other)
{
Set temp;
temp.Sjednoceni(pole, other.pole, getVelikost(), other.getVelikost());
[bold]return[/bold] temp;
}

[bold]int[/bold] main([bold]int[/bold] args, [bold]char[/bold]*argv[])
{
[bold]if[/bold](args != 3)
{
cout << [color=red]"Program chce dva [bold]short[/bold] parametry a a b"[/color] << endl;
[bold]return[/bold] 1;
}
cout << [color=red]"Zadavejte prvky pro mnoziny a a b"[/color] << endl;


Set a(atoi(argv[1]), [color=red]"a"[/color]);
Set b(atoi(argv[2]), [color=red]"b"[/color]);

Set c;

cout << [color=red]"Prvky a: "[/color];
a.vypis(); [color=blue]//vypisou se prvky mnoziny A[/color]
cout << [color=red]"Prvky b: "[/color];
b.vypis(); [color=blue]// vypisou se prvky mnoziny B[/color]

cout << [color=red]"Sjednoceni c= a + b : "[/color];
c=a+b;
c.vypis();[color=blue]//vypisou se prvky pole po sjednoceni[/color]
cout << c.getVelikost() << endl; [color=blue]// a vypise kolik obsahuje prvku[/color]

system([color=red]"PAUSE"[/color]);
[bold]return[/bold] EXIT_SUCCESS;
}
[/code]

Ono michani C (tj. nepouziti vectoru, chytrych ukazatelu ap.) a C++ (pretezovani operatoru, automat. generovane kopirovaci konstruktory a operatory prirazeni) malokdy dopadne hezky, coz je taky jedine, co takovehle zadani ukaze.

Citovat příspěvek

 

Sets

Autor: dragon1

21:54:58 18.11.2011

Dobrý den,

potřeboval bych poradit ohledně určitých věcí. Dělám program na množiny a trochu jsem se zaseknul. Je to bez použití kontejnerů , .

[code]
class Set
{

int * pole;
//myslim ze bych tady mel mit promennou kam se bude ukladat velikost toho pole ale nevim jak
// kdyz tady dam int s = sizeof(pole)/(pole[0]) tak to samozrejme nejde asi je to blbost tohle uplna tady to vlastne takhle nemuzu napsat

public:
void static Sjednoceni(int[],int[],int,int);
void vypis(); // vypise jednotlive prvky v poli
void getVelikost(); // vypise pocet prvku v poli


Set(){};
Set(int);
Set operator +(Mnozina);

};


Set:: Set(int n)
{


//tady mam problem akorat s pojmenovanim kdyz spustim program - set 2 2 tak to funguje
//tak jak ma akorat, ze by to melo byt takhle
/* prvek 1/a = .... prvek 2/a = ...
prvek 1/b = .... prvek 2/b = ....
ale ja jsem prisel pouze na to ze mi to dela globalne 1/a.... jenom to a
a nevim jak to propojit s druhym argumentem aby tam bylo 1/b..... jestli
bych mel udelat novy konstruktor zkousel jsem to taky ale nefungovalo mi to nebo to
propojit nejak s tim druhym argumentem vubec nevim momentalne


pole = new int[n];

for(int i= 0; i < n; i++)
{
cout << "prvek " << i+1 << "/a ";
cin >> pole[i];

}

}

void Set:: Sjednoceni(int a[],int b[],int na,int nb)
{ ..... }


void Set:: vypis()
{
// tahle funkce vypise vsechny prvky v poli tady mam konkretni cislo "2" kdyz zadam set 2 2 tak
// to funguje ale ja bych to potreboval globalne propojit a to mi nejde protoze nevim
//jaka bude velikost tech dvou poli

for(int i = 0; i < 2; i++)
{
cout <
}
}


void Set:: getVelikost()
{

// tady bych potreboval zjistit velikost toho pole pokazde napadlo me
// ze to bude asi nejak takhle int x = sizeof(pole)/sizeof(pole[0]) a vypsal bych tu velikost

// ale nevim jak to propojit vzajemne asi bych si mel definovat globalni promennou kde by byla ulozena velikost toho pole zkousel jsem to ale nefunguje mi to


}


Set Set:: operator +(Set other)
{
Set temp;

//potreboval bych pretizit operator treba tady v tom pripade na sjednoceni ale nedari
// se mi zkousel jsem ruzny zpusoby ale nevim, nejak bych to chtel propopojit s tou
// funkci sjednoceni ale netusim jak

//neco na tenhle zpusob
temp.pole = pole + other.pole //i kdyz to je nesmysl uplnej nejak tu funkci sjednoceni a to secist bych chtel ale netusim
// temp.sjednoceni() tak nejak asi ale tam mam s parametrama tu funkci tak nevim jak bych to propojil


}



int main(int args, char*argv[])
{



if(args != 3)
{
cout << "Program chce dva short parametry a a b" << endl;
return 1;
}
cout << "Zadavejte prvky pro mnoziny a a b" << endl;


Mnozina a(atoi(argv[1]));
Mnozina b(atoi(argv[2]));

Mnozina c;

cout << "Prvky a: ";
a.vypis(); //vypisou se prvky mnoziny A
cout << "Prvky b: ";
b.vypis(); // vypisou se prvky mnoziny B

cout << "Sjednoceni c= a + b : ";
c=a+b;
c= c.vypis();//vypisou se prvky pole po sjednoceni
c.getVelikost() // a vypise kolik obsahuje prvku

//spravne by to melo brat retezce ja to mam zatim jen na integer ale tak to by pak nemel byt problem predelat snad
//priklad na vystup
/*
set 2 2
Zadavejte prvky mnoziny A a B
prvek 1/a 8
prvek 2/a modra
prvek 1/b slunce
prvek 2/b 8
Prvky A: 8 modra
Prvky B: slunce 8
Sjednoceni c=a+b : 8 modra slunce - 3//(cislo "3" kolik obsahuje prvku po vykonani operace sjednoceni to je ta funkce getVelikost())

a dalsi operace...


[/code]


Předem děkuju za pomoc.

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: