Diskuze: Sháním C++ programátora

C++ C a C++ Sháním C++ programátora

Avatar
Ondra
Neregistrovaný
Avatar
Ondra:

Zdravím sháním někoho kdo obstojně ovládá C++ a měl by zájem si trošku přivydělat. Není to práce na dlouho tak 1-2 hodinky. Já to bohužel nestíhám skrz jiné projekty. Kdo by měl zájem pište na email. Pošlu zadání. Díky

 
Odpovědět 6.12.2012 23:10
Avatar
David Čápka
Tým ITnetwork
Avatar
Nahoru Odpovědět 7.12.2012 13:06
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Lukáš Hruda (Luckin):

Já momentálně mam dost svojí práce ale kdyby sem hodil to zadání tak bych to možná v delšim časovym horizontu udělal i zadarmo, záleží na náročnosti. Každopádně to udělam buť zadarmo a nebo vůbec, když se neznáme tak vymáhat z něj peníze by stejně byl asi problém.

 
Nahoru Odpovědět 7.12.2012 15:12
Avatar
Onda.Zadnik
Člen
Avatar
Onda.Zadnik:

Zadání je docela dlouhé mám ho v pdf a wordu. Zaplácnout ho sem celý jako text se mi nechce.

 
Nahoru Odpovědět 7.12.2012 19:21
Avatar
Odpovídá na matesax
David Jančík [sczdavos]:

Nejvíce mi vyhovuje Dropbox http://www.itnetwork.cz/…leni-souboru Pokud chci něco sdílet jednoduše si to označím a zvolím sdílet - vygeneruje se mi odkaz a ten pak pošlu. Umí zpracovávat jak Office formáty, tak i syntaxi nejrůznějších programovacích jazyků.
Dá se také použít místní úložiště: http://www.itnetwork.cz/dev-lighter

Nahoru Odpovědět 7.12.2012 20:16
Čím více času dostaneš, tím méně ho máš.
Avatar
Odpovídá na Onda.Zadnik
Lukáš Hruda (Luckin):

Chápu správně že:

  1. mod znamená modulo (%) ?
  2. tabulka ve třídě Hash má bejt jednorozměrný pole vytvořený pomocí třídy UsporadanePole ?
  3. třída HashZlomky má bejt odvozená od třídy Hash ?
  4. třídu Zlomek máš už někde napsanou ?
 
Nahoru Odpovědět 8.12.2012 12:29
Avatar
Onda.Zadnik
Člen
Avatar
Onda.Zadnik:
  1. Ano mod je modulo
  2. Tady tím si nejsem jistej
  3. Ano má dědit z té šablony Hash
  4. třídu pro zlomky mám udělanou
Editováno 8.12.2012 21:07
 
Nahoru Odpovědět 8.12.2012 21:04
Avatar
Odpovídá na Onda.Zadnik
Lukáš Hruda (Luckin):

Tu třídu Zlomek by bylo dobrý sem dát jako zdroják, obávam se že bez ní to napsat nepude.

 
Nahoru Odpovědět 9.12.2012 11:00
Avatar
Onda.Zadnik
Člen
Avatar
 
Nahoru Odpovědět 9.12.2012 17:13
Avatar
Odpovídá na Onda.Zadnik
Lukáš Hruda (Luckin):

Ta třída nemá žádný funkce pro zjištění čitatele a jmenovatele který sou private, počítam že nebude vadit když si je tam přidělam? Nebo to můžu vyřešit přes zpřátelení anebo udělat čitatele a jmenovatele public.

Mimochodem, v C++ se funkce definujou mimo blok třídy a nebo se píšou na jeden řádek. :D

 
Nahoru Odpovědět 9.12.2012 17:49
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

Funkce se píší mimo třídy ve všech jazycích. Bez ohledu na to, zda jsou nebo nejsou na jeden řádek.

Asi bych tam žádné gettery čitatele ani jmenovatele nepřidával. A dávat je jako public také nebude to pravé ořechové.

Nahoru Odpovědět 9.12.2012 18:16
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Lukáš Hruda (Luckin):

Tak třeba v Javě těžko napíšeš funkci mimo třídu.
Dělat je public by asi moc vhodný nebylo, takže buďto udělat ty gettery a nebo spíš přátelskou třídu, každopádně třída HashZlomky<n> se k nim nějak dostat musí.

 
Nahoru Odpovědět 9.12.2012 18:41
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Drahomír Hanák:

Ano, v Javě jsou to totiž metody ;)

Editováno 9.12.2012 18:42
 
Nahoru Odpovědět 9.12.2012 18:42
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

To nevylučuje mé tvrzení "Funkce se píší mimo třídy ve všech jazycích".

A proč se k nim HashZlomky musí dostat? Velmi nerad vidím hrabání na vnitřní proměnné objektů.

Nahoru Odpovědět 9.12.2012 18:48
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Drahomír Hanák
Lukáš Hruda (Luckin):

Metoda je "jiný" název pro členskou funkci konkrétní třídy. Každá členská funkce je metoda a každá metoda je členská funkce ale pořád je to funkce (nebo procedura). Přísně vzato statická metoda je nesmysl protože to není členská funkce, nepoužívá se s konkrétní instancí třídy ale samostatně, tudíž to neni členská funkce, tudíž to neni metoda, tudíž i java má obyčejný funkce. :)

 
Nahoru Odpovědět 9.12.2012 18:48
Avatar
Odpovídá na Kit
Lukáš Hruda (Luckin):

Protože metoda h ve třídě HashZlomky má k hashování použít čitatele a jmenovatele instance, i když toho zadání nechápu přesně jak, ale dostat se k nim musí.

 
Nahoru Odpovědět 9.12.2012 18:52
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

Nebyla řeč o "členských funkcích", ale o funkcích. Tvá definice "statické metody" zní také zajímavě a závěr ještě zajímavěji. Dnes jsem se dozvěděl tolik novinek :)

Nahoru Odpovědět  +1 9.12.2012 18:55
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Lukáš Hruda (Luckin):

Řekni mi jestli je na té definici něco nepravda. Třeba se pletu. :)

 
Nahoru Odpovědět 9.12.2012 19:01
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

U té definice fakt nevím, protože jak už bylo řečeno, u Javy by pojem "funkce" ztratil jakýkoli význam. Přitom je to stále klíčové slovo.

V každém případě by se statické třídy a metody měly používat pouze v ojedinělých a patřičně odůvodněných případech. Osobně je nepoužívám vůbec.

Nahoru Odpovědět 9.12.2012 19:09
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Lukáš Hruda (Luckin):

Já je používam pro nějaký defaultní nastavení tříd. Třeba když mam třídu pro práci s polem, tak v ní budu mít statickou funkci která nastaví defaultní velikost se kterou se vytvoří každej další objekt třídy, u který nezadam velikost explicitně. Takový funkce ale dělam spíš pro doplnění, sice tam sou ale v zásadě je nepoužívam, maximálně když něco testuju, abych nemusel pořád zadávat velikost, atd.

 
Nahoru Odpovědět 9.12.2012 19:16
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

Aha, takové statické metody nepotřebuji. Defaultní hodnoty nastavuji v konstruktoru.

Nahoru Odpovědět 9.12.2012 19:33
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Lukáš Hruda (Luckin):

Já taky ale většinou zároveň chci aby existovala možnost vytvořit instanci s použitim konstuktoru bez parametrů. V Javě nebo C# by to nemělo smysl protože tam beztak objekt vytváříš až operátorem new a konstruktor používáš explicitně i když parametry nemá. V C++ ale většinou objekty vytvářim tak že je prostě deklaruju, a tam pokud konstruktor nemá parametry tak se volá implicitně. Pak je dobrý aby takovej konstruktor existoval a dosadil nějaký defaultní hodnoty. Ale taky záleží co je to za třídu, tohle dělam hlavně v knihovnách. V koncových programech defaultní nastavení u tříd nedělam.

 
Nahoru Odpovědět 9.12.2012 19:40
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

V C++ není možné přetěžovat konstruktory?

Nahoru Odpovědět 9.12.2012 19:48
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Onda.Zadnik
Člen
Avatar
Odpovídá na Kit
Onda.Zadnik:

Je C++ umí přetěžovat konstruktory pokud se nepletu

 
Nahoru Odpovědět 9.12.2012 20:01
Avatar
Odpovídá na Kit
Lukáš Hruda (Luckin):

Je, právě že ten konstruktor přetížit musim. Chci aby šlo vytvořit instanci s konstruktorem kterym nastavim hodnoty, zároveň pokud konstruktor nezavolam explicitně, použije se konstruktor bez parametrů, po kterym chci aby nastavil hodnoty na ty defaultní. U knihovních tříd chci většinou aby šlo oboje.

Příklad:
Array<int> arr(20); //vytvoří pole o 20 prvcích
Array<int> arr; //vytvoří pole o defaultní velikosti, která se dá změnit statickou funkcí

Kdybych nepřetížil konstruktor Array() tak se program nezkompiluje.

 
Nahoru Odpovědět 9.12.2012 20:02
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

No vidíš. V tom případě statickou metodu nepotřebuješ.

Ale už chápu, k čemu to používáš. Chápu, ale neschvaluji.

Nahoru Odpovědět 9.12.2012 20:11
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Lukáš Hruda (Luckin):

Nepotřebuju ale nějak nevidim že by tam byla v zásadě na škodu. Pokud nechceš tak jí pořád nemusíš používat. Když něco testuju narychlo tak občas trochu usnadní práci, a odendat nebo vykomentovat jí můžu vždycky.

 
Nahoru Odpovědět 9.12.2012 20:16
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

K podobným účelům se obvykle používá closure. Je to nástroj, který byl k tomu stvořen.

Nahoru Odpovědět 9.12.2012 20:19
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Lukáš Hruda (Luckin):

Třeba ve třídě String mam statickou funkci která mění defaultní přesnost desetinných čísel zkonvertovaných na String. Tu můžu sice změnit u každý instance zvlášť ale k objektům který vrací třeba operátor + atd. se zvenku nedostanu a pokud chci i pro tyhle změnit přesnost, musim to změnit celý třídě, v tomhle případě tu statickou funkci potřebuju, nebo sem aspoň nepřišel na to jak se bez ní obejít.

 
Nahoru Odpovědět 9.12.2012 20:21
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

Ta "statická funkce" by měla být součástí třídy, která bude poskytovat přesnost pro třídu String nebo i pro další třídy.

Nahoru Odpovědět 9.12.2012 20:32
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Onda.Zadnik
Lukáš Hruda (Luckin):

http://www.itnetwork.cz/dev-lighter/37
Tady máš tu šablonu třídy UsporadanePole, jestli sem na něco zapomněl tak dej vědět, jinak by to všechno mělo fungovat. Zbytek možná jindy.

 
Nahoru Odpovědět 9.12.2012 20:33
Avatar
Odpovídá na Kit
Lukáš Hruda (Luckin):

Ona součástí třídy String je. Jenom jí nevoláš s konkrétní instancí ale s třídou String přímo.
String::set_de­fault_precisi­on(x);
Volat jí s konkrétní instancí by bylo nelogický protože to nastavuje vlastně všem instancím a ne jenom tý jedný.
Kód:
String str;
str.set_defau­lt_precision(x);
nedává smysl protože takhle očekáváš že nastavíš defaultní přesnost jenom objektu str přitom to nastavuješ celý třídě.

 
Nahoru Odpovědět 9.12.2012 20:39
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

Myslel jsem to jinak. Že by byla součástí jiné třídy a objekty třídy String by využívaly instanci té jiné třídy přes DI.

Uznávám, že je to poněkud komplikované řešení, ale možná by ta třída mohla přímo řešit konverzi na string. Ať tak či tak, v jedné aplikaci by mohlo být víc kategorií přesnosti. S každou by se dalo manipulovat zvlášť.

Nahoru Odpovědět 9.12.2012 20:57
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Onda.Zadnik
Člen
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Onda.Zadnik:

Páni :) děkuju moc. Zabralo ti to hodně času? Je mi jasné že s tím hashem se ti dělat nechce ale potřeboval bych nakopnout alespoň s tím základem. Mám vytvořenou hashovací tabulku z minulého roku. Ale to jeho zadání moc nechápu. Mohu ji využít v tomhle projektu nebo to myslí že vytvořit pomocí toho uspořádaného pole? Díky moc Ondra

http://www.itnetwork.cz/dev-lighter/39

 
Nahoru Odpovědět 9.12.2012 21:04
Avatar
Odpovídá na Kit
Lukáš Hruda (Luckin):

Pro moje účely to bohatě stačí takhle, kdyby bylo třeba tak bych nějak vyřešil aby se u těch objektů ke kterým se nedostanu nastavovala přesnot adekvátně podle těch objektů předávaných parametrem, to by ale pravděpodobně znamenalo půlku tý třídy přepsat a to mi jenom kvuli tomuhle přijde trochu zbytečný.

 
Nahoru Odpovědět 9.12.2012 21:10
Avatar
Odpovídá na Onda.Zadnik
Lukáš Hruda (Luckin):

Moc času to nezabralo, cca hodinu čistýho času, dělal sem u toho ještě další věci včetně večeře. :)
Já to taky moc nechápu ale ta tabulka se má asi udělat prostě jako pole v tý šabloně třídy Hash. Ještě trochu nechápu jak přesně má fungovat ten hashovací algorytmus, jestli má mít každej prvek svuj vlastní hash a nebo nějak celkově.

 
Nahoru Odpovědět 9.12.2012 21:17
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

Souhlasím. Někdy se to s tou objektovostí až přehání. Některé třídy pak vypadají univerzálně a znovupoužitelně, ale jsou k ničemu. Stejně není dobré psát v jednom paradigmatu celou aplikaci.

Nahoru Odpovědět 9.12.2012 21:24
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Onda.Zadnik
Lukáš Hruda (Luckin):

Mimochodem k tý třídě Zlomek si musíš přidělat konstruktor bez parametrů
Zlomek() : c(1), j(1) {}
Jinak ti nepude vytvořit uspořádaný pole objektů tý třídy.
Potřebuješ:
UsporadanePole<Zlo­mek,x> pole; ale to nejde když neexistuje konstruktor bez parametrů a v parametru šablony explicitně konstruktor volat nemůžeš.
Další důvod proč by třída měla mít implicitní konstruktor a defaultní hodnoty.

 
Nahoru Odpovědět 9.12.2012 21:27
Avatar
Odpovídá na Kit
Lukáš Hruda (Luckin):

Ono hlavně C++ neni čistě objektovej jazyk a třeba když používáš nějakou Céčkovou knihovnu (což já používam skoro v každym programu) tak se neobjektovým řešením většinou ani nevyhneš.

 
Nahoru Odpovědět 9.12.2012 21:38
Avatar
Onda.Zadnik
Člen
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Onda.Zadnik:

Úloha sestavení hašovací tabulky nemá s uspořádaným polem nic
společného. Jde o klasickou hašovací tabulku.

Šablona HashZlomky je odvozena ze šablony Hash, jak je uvedeno v
zadání úlohy.

tohle mi přišlo od garanta tudíž výstup by měl být něco jako ta hash tabulka co jsem tu dával ne?

 
Nahoru Odpovědět 10.12.2012 16:04
Avatar
Odpovídá na Onda.Zadnik
Lukáš Hruda (Luckin):

A do těch jednotlivých prvků se mají ukládat rovnou hashe těch zlomků který tam přidáš předpokládam. Ještě mi řekni jak mam vyřešit přístup šablony HashZlomky k čitateli a jmenovateli třidy Zlomek. Možnosti sem tu už vypisoval, vzhledem k tomu že ta třída má settery tak bych asi udělal prostě gettery pro oboje. Mimochodem máš tam chybu, funkce operátoru / zlomky násobí místo aby je dělila.

 
Nahoru Odpovědět 10.12.2012 18:38
Avatar
Onda.Zadnik
Člen
Avatar
Onda.Zadnik:

Elegantněji to asi řešit nejde než si udělat get pro každý z nich. Možná jsem to mohl udělat jako pair a potom přistupovat na každý z nich přes first,second ale to už je fuk. Díky za upozornění toho / jsem si nevšiml :)

 
Nahoru Odpovědět 10.12.2012 19:42
Avatar
Odpovídá na Onda.Zadnik
Lukáš Hruda (Luckin):

Já ale teď na to nejspíš nebudu mít čas. Můžeš zatim zkusit něco splácat dohromady sám, když se ti to nepovede tak se na to pak podívam, ale nevim kdy. Jinak bych řek že to neni nijak zásadně složitý, to pole je podle mě složitější.

 
Nahoru Odpovědět 10.12.2012 20:48
Avatar
Onda.Zadnik
Člen
Avatar
Onda.Zadnik:

Já to mám teď to středy a ještě dodělávám jiný věci takže to bohužel nestihnu... mě tohle přijde horší protože jsem pořád nepobral moc co po mě chce vlastně... ale i tak díky za ten první

Editováno 10.12.2012 20:58
 
Nahoru Odpovědět 10.12.2012 20:58
Avatar
Odpovídá na Onda.Zadnik
Lukáš Hruda (Luckin):

Dneska už to dělat nebudu a zejtra nestíham, tak možná ještě ve středu ale téžko říct jestli bude čas.

 
Nahoru Odpovědět 10.12.2012 21:46
Avatar
Onda.Zadnik
Člen
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Onda.Zadnik:

Tak jsem něco zkoušel ale nedaří se mi přepsat tu čistě virtuální metodu.. můžu to sem hodit na zkouknutí?

 
Nahoru Odpovědět 11.12.2012 20:44
Avatar
Odpovídá na Onda.Zadnik
Lukáš Hruda (Luckin):

Nevim o tom že by v C++ existovalo nějaký klíčový slovo override. Čistě virtuální funkce se definuje tak že jí prostě v tý odvozený třídě znova deklaruješ a normálně definuješ, pokud neni krátká tak jí definuj mimo třídu. Jakákoliv členská funkce třídy je automaticky inline pokud jí definuješ uvnitř bloku třídy (u statických si nejsem jistej ale myslim že taky) a to u delších funkcí neni dobře.

 
Nahoru Odpovědět 11.12.2012 21:44
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

V C++ klíčové slovo override existuje. Google napoví.

Nahoru Odpovědět 11.12.2012 22:17
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Lukáš Hruda (Luckin):

Existuje ale jenom v C++/CLI a jinak až od C++11 což znamená že by musel programovat ve VS2012 jinak to neodpovídá standardu. Věděl sem že je to v Javě ale že to dali i do novýho standardu C++ sem netušil. Ten operátor ale nemá žádnej explicitní význam, jenom prevence proti chybě. V případě že přepisuješ virtuální funkci v odvozený třídě a použiješ nesouhlasnou signaturu, tak dostaneš error místo aby se vytvořila nová funkce.

 
Nahoru Odpovědět 11.12.2012 22:55
Avatar
Onda.Zadnik
Člen
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Onda.Zadnik:

Tak dneska jsem to měl ukazovat bohužel se mi nepodařilo dostat do toho tohle:
UsporadanePole<Zlo­mek,20> pz;
typedef Zlomek Z;
pz << Z(1,3) << Z(3,5) << Z(7,4) << Z(3,4) << Z(2,3) << Z(7,2)
<< Z(5,4) << Z(1,4) << Z(6,7) << Z(4,3) << Z(2,3);

vyhazuje chyby a za boha jsem ve škole nemohl přijít na to proč... ve třídě zlomek jsem si i udělal přetížený operátory porovnání ale bezvýsledně. Nějaký nápad čím to je?

 
Nahoru Odpovědět 12.12.2012 18:47
Avatar
Onda.Zadnik
Člen
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Onda.Zadnik:

error: no match for 'operator=' in 'pz = Zlomek(3, 6u)'|

 
Nahoru Odpovědět 12.12.2012 19:35
Avatar
Odpovídá na Onda.Zadnik
Lukáš Hruda (Luckin):

Pravděpodobně tvoje šablona třídy HashZlomky nemá přetíženej operátor =. V tom cos tu psal nahoře ale nikde žádný pz = zlomek(3,6) neni, kde to máš?

 
Nahoru Odpovědět 12.12.2012 19:40
Avatar
Onda.Zadnik
Člen
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Onda.Zadnik:

Je to v tom zadání úplně dole jak je tam to:
UsporadanePole<Zlo­mek,20> pz;
typedef Zlomek Z;
pz << Z(1,3) << Z(3,5) << Z(7,4) << Z(3,4) << Z(2,3) << Z(7,2)
<< Z(5,4) << Z(1,4) << Z(6,7) << Z(4,3) << Z(2,3);
pz-=Z(6,7); pz-=Z(2,7);
cout << "pocet " << pz << endl;
pz.prvni();
do pz.aktual()(); while (pz.dalsi());
najit(pz,Z(1,4));
najit(pz,Z(7,2));
najit(pz,Z(1,2));

ano v té co jsem sem dával nejsou ale když jsem je zkoušel vytvořit tak to zase padalo na nich.

 
Nahoru Odpovědět 12.12.2012 19:44
Avatar
Odpovídá na Onda.Zadnik
Lukáš Hruda (Luckin):

Uploadni někam všechno co máš ať si to můžu zkompilovat sám a řekni mi jakej kompilátor používat.

 
Nahoru Odpovědět 12.12.2012 19:56
Avatar
Onda.Zadnik
Člen
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Onda.Zadnik:

http://www.itnetwork.cz/dev-lighter/47 tady je zlomek
http://www.itnetwork.cz/dev-lighter/46 a tady od tebe to pole

používám codeblock a kompilátor mingw32-g++

 
Nahoru Odpovědět 12.12.2012 20:08
Avatar
Odpovídá na Onda.Zadnik
Lukáš Hruda (Luckin):

UsporadanePole se přece nemělo používat se třídou zlomek ne? Nemá pro ní přetížený operátory. A funkce najit tam vůbec neni. Nehledě na to že ve třídě Zlomek máš operátor > přetíženej 2x a on neví co použít, protože sedí oboje.

 
Nahoru Odpovědět 12.12.2012 20:22
Avatar
Onda.Zadnik
Člen
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Onda.Zadnik:

No mělo protože on to tam dole plní těma zlomkama. Ty 2 operátory vidím to mi mohlo dojít podle těch 2 canditates v chybovým hlášení.

 
Nahoru Odpovědět 12.12.2012 21:07
Avatar
Odpovídá na Onda.Zadnik
Lukáš Hruda (Luckin):
template <typename T, int n>
class UsporadanePole
{
  public:
    unsigned int velikost;
    unsigned int iterator;
    T* pole;
    void swapf(T &, T &);
    T & find(T&,int,int);

  public:
    UsporadanePole();
    ~UsporadanePole(){delete [] pole;}
    UsporadanePole & operator<<(T);
    bool operator-=(T &);
    unsigned int operator()() const {return velikost;}
    const T *najit(T & prvek){return &find(prvek,0,velikost+1);}
    bool prvni();
    bool dalsi();
    T & aktual(){return pole[iterator];}
};



template <typename T, int n>
void UsporadanePole<T,n>::swapf(T & a, T & b)
{
  T c = a;
  a = b;
  b = c;
}

template <typename T, int n>
T & UsporadanePole<T,n>::find(T & prvek, int b, int e)
{
  int med = (e + b) / 2;
  if(prvek > pole[med])
  {
    if(med == b)
      return *((T*)0);
    else
      return find(prvek,med,e);
  }
  else if(prvek < pole[med])
  {
    if(med == e)
      return *((T*)0);
    else
      return find(prvek,b,med);
  }
  else
    return pole[med];
}

template <typename T, int n>
UsporadanePole<T,n>::UsporadanePole() : velikost(0), iterator(0)
{
  pole = new T[n];
}

template <typename T, int n>
UsporadanePole<T,n> & UsporadanePole<T,n>::operator<<(T prvek)
{
  if(velikost < n)
  {
    if(!najit(prvek))
    {
      pole[velikost] = prvek;
      for(int i=velikost;i>0 && pole[i]<pole[i - 1];i--)
        swapf(pole[i], pole[i - 1]);
      velikost++;
    }
  }
  return *this;
}

template <typename T,int n>
bool UsporadanePole<T,n>::operator-=(T & prvek)
{
  const T* p = najit(prvek);
  if(!p)
    return false;
  else
  {
    for(int i = p - pole;i<velikost - 1;i++)
      swapf(pole[i],pole[i + 1]);
    velikost--;
    return true;
  }
}

template <typename T,int n>
bool UsporadanePole<T,n>::prvni()
{
  iterator = 0;
  if(velikost == 0)
    return false;
  else
    return true;
}

template <typename T,int n>
bool UsporadanePole<T,n>::dalsi()
{
  if(iterator < velikost - 1)
  {
    iterator++;
    return true;
  }
  else
    return false;
}

Tady máš tu třídu upravenou, sice nevyhovuje zadání ale jinak se mi to nepovedlo.

  1. Některý členký funkce šablony UsporadanePole přebíraly jako parametr nebo vracely konstatní referenci na T (Zlomek). To byl první problém, protože buďto ten parametr předávali dál jako referenci nebo se přímo z vrácený reference volala další členská funkce. To se kompilátoru nelíbilo protože to bral tak že tu referenci změníš, což nesmíš když je const. Upřímně, nepovedlo se mi zjistit proč to tak bere, možná je chyba někde v třídě Zlomek.
  2. Pokud do pz přes operátor << nedáváš konkrétní instanci ale pouze hodnotu vytvořenou konstruktorem, tak ta funkce pro přetížení operátoru << nikdy nemůže přebírat referenci, ten konstruktor vytvoří objekt, vrátí jeho hodnotu a hned ho zase zruší, neni na co předat referenci.
  3. U členský funkce další sem zapomněl na vrácení true/false.
Editováno 12.12.2012 22:19
 
Nahoru Odpovědět 12.12.2012 22:17
Avatar
Onda.Zadnik
Člen
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Onda.Zadnik:

Nevím mě to prostě nefunguje, pořád mě to hází chyby jako by neviděl o těch operatorech. Nechápu proč..

 
Nahoru Odpovědět 12.12.2012 23:04
Avatar
Odpovídá na Onda.Zadnik
Lukáš Hruda (Luckin):

Jo ještě jedna věc. Vypsat to přes cout nepude, protože nemáš definouvanou konverzi na nějakej typ kterej cout může vypsat, v tomhle případě int(nebo unsigned int). Druhá možnost by byla přetížit operátor << tak aby vracel objekt třídy ostream, ale ta koverzní funkce je asi jednodušší.
operator unsigned int(){return velikost;}

 
Nahoru Odpovědět 12.12.2012 23:31
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Tato diskuze byla označena moderátorem jako nekonstruktivní a myslíme si, že nemá pro veřejnost příliš vysokou hodnotu. Členy můžete samozřejmě stále oslovit soukromě a to formou zpráv nebo chatu.

Zobrazeno 64 zpráv z 64.