Sjednocení množin v C++

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod _xR_ 21. 4. 2010 16:31

Nejlepší je to přes to pole. Jen musí být dynamické (tedy vytvořené pomocí "new"), aby nebylo na zásobníku.
_xR_
Kolemjdoucí

Odeslat příspěvekod nahodnakolemjdouci 21. 4. 2010 17:37

Tak se mi povedlo vytvořit to dynamické pole (nejspíš :D ) a načíst do toho data ze souboru. Teď už jen zbývá sloučit pole a ty další "drobnosti". Zatím díky za rady, určitě budu mít ještě řadu dotazů.
nahodnakolemjdouci
Kolemjdoucí

Odeslat příspěvekod Nargon 21. 4. 2010 19:11

nahodnakolemjdouci píše:To je konec, moc nechápu, co mi tu radíte. Víte, my jsme celý semestr brali vytváření tříd a dědičnosti a podobně a pak nám najednou mrskou takové zadání na zápočet s věcmi, které nebyly na jediné přesnášce.

Aha, takze jste brali uplny zaklady programovani. No pak je mi jasne ze nejake stromy, mnoziny, a cela STL knihovna je mimo tvoje znalosti.

nahodnakolemjdouci píše:Nejvíce se mi líbilo použít pole: načíst data do dvou polí, sloučit je a seřadit, ale pak tu MiliNess napíše, že může být problém s velikostí zásobníku. Tak já fakt nevím.

Jo tohle je celkem snadne. Jen nesmis vytvaret pole takto: int pole[10000000];
ale pouzit toto: int* pole = new int[1000000];
prace je pak stejna: pole[11] = 4;
a nakonci programu by to chtelo aby jsi i uvolnil pamet: delete[] pole;

nahodnakolemjdouci píše:Když budu chtít použít AVL strom, tak přece když bude vyvážený a budou v něm načtená data, už by v něm automaticky neměly být duplicity, ne?

Ano spravne, duplicity se v nem automaticky rusi. Protoze kdyz bys mel pridat do stromu prvek, ktery tam uz je, tak maximalne prepises ten puvodni, ale nevlozis tam dalsi stejny prvek.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod IgnorStoupa 21. 4. 2010 19:33

Spojit, radix, vyhazet duplicity. Hehehe, vlastne temer stejna rada jako na tu druhou ulohu 8-) akorat ze jeden vysledek je jakoby negaci druheho zadani v poslednim kroku...ja mel zustat u toho programovani! 8-P
Neni dano vubec nic. Sestrojte parabolu.
IgnorStoupa
Mírně pokročilý
Uživatelský avatar

Odeslat příspěvekod nahodnakolemjdouci 27. 4. 2010 18:38

Tak jsem tu zase.
Mám vytvořená 2 pole, ale problém je v tom, že nevím, jak je sloučit. Chyba je už v tom, že se mi sice načtou data ze souboru do pole, podaří se mi to i vytisknout na obrazovku, ale to je vše. Nevím, jak to přenést do třetího pole. Pole mám takto. Druhé je podobné, akorát jiné názvy. Jak je mám sloučit dohromady?

int i=0;
int *pole=new int[14];
int velikost = 14;
int x = 0;
ifstream in("soubor.txt", ios::in |ios::binary);
while(in >> pole[x] && x < velikost)
{x++;}
for(i = 0; i < 14; i++)
{ cout << pole[i] << endl;}
nahodnakolemjdouci
Kolemjdoucí

Odeslat příspěvekod Wikan 27. 4. 2010 20:59

A proč to načítat do dvou polí, když to můžeš načítat do jednoho o dvojnásobné velikosti.
Wikan
Moderátor
Uživatelský avatar

Odeslat příspěvekod nahodnakolemjdouci 29. 4. 2010 05:13

Tak se mi povedlo seřadit pole sestupně.
Ale mám docela zásadní problém. Protože celý předmět je zaměřen na objektově orientované programování, měl by to zahrnovat i tento program. Jenže já mám všechno ve smyčkách a pod. v rámci funkce main.

Nemám představu, jak má ten kód vypadat, co bych měla použít, aby bylo použito OOP.
nahodnakolemjdouci
Kolemjdoucí

Odeslat příspěvekod bambusek 4. 5. 2010 08:47

proste rozkouskujes zdrojak na male casti a ulozis do zvlastnich souboru a pojmenovavas je bud *.h nebo normalne *.cpp, napr. jak se to delo u dedicnosti se zamestnancem, nebo zdrojak bin. stromu... zustanou ti pak v main jen volani funkci ;)
bambusek
Kolemjdoucí

Odeslat příspěvekod MiliNess 4. 5. 2010 10:42

nahodnakolemjdouci píše:Tak se mi povedlo seřadit pole sestupně.
Ale mám docela zásadní problém. Protože celý předmět je zaměřen na objektově orientované programování, měl by to zahrnovat i tento program. Jenže já mám všechno ve smyčkách a pod. v rámci funkce main.

Nemám představu, jak má ten kód vypadat, co bych měla použít, aby bylo použito OOP.


To bys celý kód musel implementovat do třídy.
Pro daný příklad je to sice nepraktické, jako tréning OOP budiž.
Vytvoříš si třídu, která bude mít několik metod. Např. metodu pro načtení obsahu textových souborů do polí, metodu pro setřídění a odstranění duplicit a metodu pro zobrazení výstupu.
Nebo to načtení obsahu souborů můžeš provést v konstruktoru. Jak chceš.
V main pak vytvoříš objekt své třídy a zavoláš jeho metody.
Hardwarová nezávislost znamená, že to neběží na žádném počítači.
MiliNess
Pokročilý

Odeslat příspěvekod nahodnakolemjdouci 7. 5. 2010 18:13

potřebuju poradit, načetla jsem data ze souboru do dvou polí a ty spojila do třetího:
int *pole3=new int[28];
int i,j;
for(i=0;i<14;i++) pole3[i]=pole1[i];
for(j=0;j<14;j++) pole3[i+j]=pole2[j];
for(i=0;i<30;i++) { cout<<pole3[i]<<endl;} to je v pohodě

Ale jak mám s tím polem pracovat? Tohle je nečteno v main a já potřebuji v další funci to pole seřadit a vymazat z něj některé prvky, ale nevím, jak to mám udělat, protože jediné, co jsem schopna je vypsat obsah pole3 nebo jej vytisknou do souboru, ale vždy jen ve smyčce. Jak to pole předat nějaké funkci?
nahodnakolemjdouci
Kolemjdoucí

Odeslat příspěvekod Nargon 7. 5. 2010 19:03

1) mas tu celkem zavaznou chybu.
Kód: Vybrat vše
int *pole3=new int[28];
for(i=0;i<30;i++) cout<<pole3[i]<<endl;

Nadeklarujes to pole s velikosti 28 prvku a vypisujes 30 prvku. Slusnej programovaci jazyk by ti zahlasil: "Array Index Out Of Bounds Exception" tj ze si sahas do pameti nekam, co uz neni prvkem toho pole.

2) a ted k tvoji otazce. Uplne stejne jako si predavas do funkci jine parametry.
Kód: Vybrat vše
void Funkce(int* pole){
    for(i=0;i<28;i++) cout<<pole[i]<<endl;
}


A pouziti v mainu:
Kód: Vybrat vše
int main(int argc, int* args[]){
    int *pole3=new int[28];
    Funkce(pole3);
}
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod sejnt 10. 5. 2010 12:26

Ked to tu uz riesite je lepsie z toho suboru naciatat takto
Kód: Vybrat vše
ifstream read1 (file1, ifstream::in);
   while(!read1.eof())
   {
      read1 >> list1[i];
      i++;
   };


alebo takto :

Kód: Vybrat vše
read2.open(argv[2]);
while (!read2.eof())
   {
      read2 >> list2[j];
      j++;
   };

mozno banalna otazka ale co uz :D
Lekvár je produkt šialenej myšlienky ako neurobiť zo všetkých sliviek slivovicu.[CZ] Povidla jsou produkt šílený myšlenky jak neudelat ze všech švestek slivovici.
sejnt
Junior
Uživatelský avatar

Předchozí stránka

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků