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:
Sponzorem soutěže je:
Kdo lektoruje pražský letní workshop v ZOO a Botanické zahradě?
V dnešní soutěži hrajeme o:

Sets
|
|
|
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ý 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 |
|
Re: Sets Autor: dragon1 22:31:06 26.11.2011 |
||
| Teď mě napadlo jestli by to nešlo něco na tento způsob. 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] |
|
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 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] |
|
Re: Sets Autor: mol 22:00:45 26.11.2011 |
||
| to se obavam slusne (bez makra) nejde 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 |
|
Re: Sets Autor: dragon1 19:42:48 26.11.2011 |
||
| Díky. 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] |
|
Re: Sets Autor: mol 5:57:07 26.11.2011 |
||
|
Re: Sets Autor: dragon1 0:41:30 26.11.2011 |
||
| Děkuju. 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. |
|
Re: Sets Autor: mol 23:20:21 25.11.2011 |
||
| Tak si to odstran duplicity napis uzitecne: 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] |
|
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ě. 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< |
|
Re: Sets Autor: mol 20:42:53 25.11.2011 |
||
| no tohle zjisti, jestli tam duplicita je, pak vrati false, jinak true no tohle zjisti, jestli tam duplicita je, pak vrati false, jinak true pole[] to nemeni, ani to nevraci novy Set jako vysledek |
|
Re: Sets Autor: dragon1 1:31:51 25.11.2011 |
||
| Děkuju. 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] |
|
Re: Sets Autor: mol 22:25:12 23.11.2011 |
||
| Dne 23.11.2011 1:50, dragon1 napsal(a): 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 |
|
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. 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] |
|
Re: Sets Autor: mol 0:04:07 23.11.2011 |
||
| Ty vnitrni smycky musej vypadat nejak takhle: 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]; |
|
Re: Sets Autor: dragon1 23:00:40 22.11.2011 |
||
| Díky moc. 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] |
|
Re: Sets Autor: mol 21:57:42 22.11.2011 |
||
| [code][bold]delete[/bold] [] pole; [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] |
|
Re: Sets Autor: mol 21:56:00 22.11.2011 |
||
|
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 :-) 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. |
|
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. 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] |
|
Re: Sets Autor: dragon1 21:28:21 21.11.2011 |
||
| Díky moc. 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. |
|
Re: Sets Autor: mol 22:54:03 19.11.2011 |
||
| ja bych teda duplikaty v mnozinach vubec nedovoloval, coz bych hlidal uz pri zadavani 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 |
|
Re: Sets Autor: dragon1 21:13:08 19.11.2011 |
||
| Díky moc. 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] |
|
Re: Sets Autor: mol 12:15:38 19.11.2011 |
||
| Ono to neni uplne trivialni, nejaky (urcite nikoli bezchybny) naznak reseni: Ono to neni uplne trivialni, nejaky (urcite nikoli bezchybny) naznak reseni:
[code][color=green]#include[/color] |
|
Sets Autor: dragon1 21:54:58 18.11.2011 |
||
| Dobrý den, 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ů |




