bonus (max +2 body): bezpečné řešení v debug módu a[x][y] (a.rows()[x][y] a.cols()[x][y]) odchytávat všechny nedefinované akce

Podobné dokumenty
3. týden týden týden týden týden týden Termín DÚ: vždy úterý 9:00. Zadání DÚ 1

3. týden Kontejner. 5. týden Exception safe policy. 7. týden 7.4. SAX C opendir. 9. týden Multithreaded network

Domácí úkoly 2013/14

Cvičení z programování v C++ ZS 2016/2017 Přemysl Čech

Domácí úkoly Pokročilé programování v C++ LS 2015/2016. NPRG051 Pokročilé programování v C / DÚ

PB161 Programování v jazyce C++ Přednáška 10

PB161 Programování v jazyce C++ Přednáška 10

Šablonové metaprogramování v C++ Miroslav Virius KSI FJFI ČVUT

Programování v C++ 1, 1. cvičení

PROGRAMOVÁNÍ V C++ CVIČENÍ

Funkční objekty v C++.

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

PB161 Programování v jazyce C++ Přednáška 9

PROGRAMOVÁNÍ V C++ CVIČENÍ. Michal Brabec

Odvozené a strukturované typy dat

Jazyk C++ II. STL knihovna kontejnery část 1

Základy programování (IZP)

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Množina v C++ (set, multiset).

Jazyk C++ II. Šablony a implementace

Standardní algoritmy vyhledávací.

PB přednáška (23. listopadu 2015)

map, multimap - Asociativní pole v C++.

Jazyk C++ I. Šablony 2

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

Šablony, kontejnery a iterátory

Úvod do programování. Lekce 1

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. December 7, 2016

Jazyk C++ I. Šablony

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Programování v jazyce C a C++

Jazyk C++, některá rozšíření oproti C

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

Struktury a dynamická paměť

Programovací jazyk C++ Hodina 1

Třídy a struktury v C++

IUJCE 07/08 Přednáška č. 1

Jazyk C# (seminář 6)

Základy programování (IZP)

Šablony, kontejnery a iterátory

PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

termín: utorok :00 (poledne) Cíle: Zadání:

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Více o konstruktorech a destruktorech

Algoritmizace a programování

Vector datový kontejner v C++.

Úvod do programovacích jazyků (Java)

PB161 Programování v jazyce C++ Přednáška 4

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

Konec a tak. PB173 Programování v C++11. Vladimír Štill, Jiří Weiser. Fakulta Informatiky, Masarykova Univerzita. 15.


Zápis programu v jazyce C#

Algoritmizace a programování

Hrátky s funkcemi. PV173 Programování v C++11. Vladimír Štill, Jiří Weiser. Fakulta Informatiky, Masarykova Univerzita. 29.

Úvod do programovacích jazyků (Java)

Množina čísel int stl-set-int.cpp

Operační systémy. Cvičení 3: Programování v C pod Unixem

Semestrální práce KIV/PC Řešení kolizí frekvencí sítě vysílačů Zdeněk Bečvář A14B0466P 10. ledna 2016

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

Cvičení č. 2. Komunikace mezi procesy Program Hodiny. 4 body

17. Projekt Trojúhelníky

Strukturu lze funkci předat: (pole[i])+j. switch(výraz) velikost ukazatele

Programování v jazyce C a C++

Jazyk C++ I. Šablony 3

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

PODOBÁ SE JAZYKU C S NĚKTERÝMI OMEZENÍMI GLOBÁLNÍ PROMĚNNÉ. NSWI162: Sémantika programů 2

Úvod do programování - Java. Cvičení č.4

Abstraktní datové typy

Java Cvičení 01. CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics

Programovací jazyk Java

Iterátory v C++. int pole[20]; for (int *temp = pole, temp!= &pole[20]; temp++) { *temp = 0;

Př. další použití pointerů

přetížení operátorů (o)

Šablony funkcí a tříd (Templates) Genericita

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Programovací jazyk C(++) C++ area->vm_mm->locked_vm -= len >> PAGE_SHIFT;

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LEXIKÁLNÍ ANALÝZA

PŘETĚŽOVÁNÍ OPERÁTORŮ

Objektově orientované programování

Základy programování (IZP)

8 Třídy, objekty, metody, předávání argumentů metod

Dědění, polymorfismus

PROGRAMOVÁNÍ V C++ URČENO PRO VZDĚLÁVÁNÍ V AKREDITOVANÝCH STUDIJNÍCH PROGRAMECH ROSTISLAV FOJTÍK

Programování v C++ 2, 8. cvičení

Konstruktory překladačů

přetížení operátorů (o)

Programování v C++ 3, 3. cvičení

Výčtový typ strana 67

- transpozice (odlišuje se od překlopení pro komplexní čísla) - překlopení matice pole podle hlavní diagonály, např.: A.' ans =

Programovanie v jazyku C - pole treba poorat...

Programovanie v jazyku C - struktury a polia

Programovací jazyk Pascal

Šifrování/Dešifrování s použitím hesla

Preprocesor a koncepce (větších) programů. Úvod do programování 2 Tomáš Kühr

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

Transkript:

termín: středa 13.3. 12:00 (poledne) vytvořit kontejner dvourozměrná matice dopředné (forward) iterátory přes sloupce i řádky velikost fixní, určená parametry konstruktoru kopie kontejneru včetně změny rozměrů, nutná podpora move neřešit metody pro zvětšování a zmenšování bonus (max +2 body): správné řešení const kontejneru bonus (max +2 body): indexace přes řádky i sloupce a[x][y] (a.rows()[x][y] a.cols()[x][y]) bonus (max +2 body): bezpečné řešení v debug módu odchytávat všechny nedefinované akce

typedef matrix< int> my_matrix; int cnt = 100; void f1( my_matrix::cols_t::value_type::reference x) { x = ++cnt; } void f2( my_matrix::cols_t::reference r) { for_each( r.begin(), r.end(), f1); } void f3( my_matrix::rows_t::value_type::reference x) { cout << x << " "; } void f4( my_matrix::rows_t::reference r) { for_each( r.begin(), r.end(), f3); cout << endl; } int main( int argc, char ** argv) { my_matrix a( 3, 4, 0); for_each( a.cols().begin(), a.cols().end(), f2); for_each( a.rows().begin(), a.rows().end(), f4); } procházení prvků sloupce procházení po sloupcích procházení po řádkách

vytvořené třídy musí být kompatibilní s STL kontejnery a algoritmy všechny vyžadující forward iterator - for_each pro pomocné třídy cols/rows vytvořit: typy: iterator, reference, value_type metody: begin(), end(), size(), bonus: op[] iterátory: 5 typů, *, ->, ++, =, == celkem 4 pomocné kvazi-kontejnery: řádky, sloupce, prvky v řádku, prvky v sloupci to celé znásobeno podporou const (bonus)

problém: kvazikontejner vrací iterátor, ten má svoji hvězdičkou zpřístupnit něco, co v té matici nemusí být (typicky sloupec) možné řešení: * na iterátoru vrátí hodnotou pomocnou na na místě sestrojenou třídu normálně * vrací T& tady nás k tomu sice nic nenutí musí se to ale chovat podobně pozor: na iterátoru musí být -> (požadavek normy) běžné řešení: vrátí ukazatel na typ s příslušnými metodami není ale na co vrátit * nebo: vrátí jinou třídu s přetíženým operátorem -> jiná třída - proxy na sloupec

včasnost za nedodržení termínu body prudce dolů přeložitelnost přeložitelné bez chyb a (pokud možno) warningů kompatibilní s vzorem použití (rozhraní je pevné) multiplatformnost nezávislost na OS, bitovosti, překladači - vyzkoušejte i gcc32/vs64 stabilita rozhodně vyzkoušejte všechna možná přípustná data a typy kultura kódu pravidla, moudra, dobré zvyky, udržovatelnost, estetika, čitelnost odevzdávací formality a konvence názvy a struktura souborů, komentáře

indexace přes řádky i sloupce max +2 body a[x][y] (a.rows()[x][y]) a.cols()[x][y] bezpečné řešení v debug módu max +2 body odchytávat všechny nedefinované akce du_assert(e) if( e == 0) chyba v debug verzi du_assert vypíše lokaci a skončí v release verzi (definováno makro DU_NDEBUG) nedělá nic - odletí

v du1.zip najdete 4 soubory du1test.cpp kód používající vaše řešení - neměňte - zachovat rozhraní! můžete (velmi doporučeno!) přidat vlastní testy du1debug.hpp definice pro bonus - du_assert du1matrix.cpp, du1matrix.hpp sem doplňte kód a hlavičkový soubor vašeho řešení soubory nepřejmenovávejte na začátek každého souboru vložte komentář typu // DU1matrix.cpp // Karel Vomacka NPRG051 2012/2013 vaše řešení vložte do Grupíčku - neposílejte emailem! správné soubory do správných sloupečků!

termín: středa 10.4. 12:00 (poledne) Cíle: Pokročilé použití šablon Politiky Zadání: Vytvořte objektovou knihovnu pro parsování argumentů předaných programu na příkazové řádce. Knihovna musí umožnit uživateli pomocí politik nastavit její detailní chování.

Podpora přepínačů bez parametrů tail --help Podpora přepínačů s typovaným parametrem (řetězce, číslo,...) make f makefile j 20 Podpora typovaných argumentů (řetězce, čísla,...) seq 10 20 1 Snadná rozšiřitelnost množiny typů, které knihovna umí naparsovat Bonus formátovaný výpis nápovědy programu

Konvence DOS/Windows dir /L /A:D POSIX ls s width=40 T 8 Java java cp. verbose:jni ds Co dělat při neznámém přepínači Vyhodit výjimku Ignorovat Považovat za argument Vypsat chybu a skončit

Co dělat s rozpoznanými přepínači Nechat být Odstranit z argv a aktualizovat argc Použití u různých knihoven, viz gtk_init, QApplication,... Co dělat při chybném formátu parametru přepínače nebo argumentu Vyhodit výjimku Vypsat chybu a skončit Co dělat s neočekávanými argumenty Ignorovat Vyhodit výjimku Vypsat chybu a skončit Parser musí umět pracovat s ANSI znaky (char) i s širokými znaky (wchar_t)

std::wstring file_name; size_t count = 0; size_t size = 0; bool verbose = false; std::vector<std::wstring> argumenty; parser<posix, wchar_t,...> p; p.add( f nebo --file ulož do file_name); p.add( -c nebo --count ulož do size); p.add( --size ulož do size); p.add(pokud se vyskytne v nebo -verbose ulož do verbose true); p.set_arguments_container(argumenty); p.parse(argc, argv); Příklad je pro konvenci POSIX, pro ostatní konvence by mělo být použití obdobné. Kromě vektorů by mělo být možné vkládat argumenty do listů a množin.

enum prefix_type { KILO, MEGA, GIGA }; prefix_type prefix; parser<dos,...> p; p.add( /P ulož do prefix); p.parse(argc, argv); Pozn.: hodnota parametru přepínače /P může být jedno z písmen K (KILO), M (MEGA) nebo G (GIGA). Je tedy nutné zajistit, aby se textová hodnota parametru přepínače převedla na správnou hodnotu výčtu. Funkci, která převede text na hodnotu daného typu musí samozřejmě napsat uživatel knihovny. Knihovna by ale měla poskytovat snadno použitelný mechanismus, jak integrovat uživatelské konvertory.

std::string log_file; Parser<Java, char_t, odstraň rozpoznané,...> p; p.add( l ulož do log_file); p.parse(argc, argv); Po spuštění programu s parametry: -f soubor1 l soubor2 soubor3 a spuštění parsování, bude argc a argv stejné, jako kdyby byl program spuštěn s parametry: -f soubor1 soubor3

bool show_help; enum attribute_type { HIDDEN, DIRECTORY }; attribute_type attribute; parser<dos,...> p; p.add(pokus se vyskytne /H ulož do show_help true, nápověda k přepínači je Show help ); p.add( /A ulož do attribute, nápověda k přepínači je File attribute. Supported types are:\nh Hidden\nD Directory ); p.show_help(); Výsledek: /H Show help /A:attribute File attribute. Supported types are: H - Hidden D - Directory Použití pro ostatní konvence by mělo být podobné a výstup by měl odpovídat zvolené konvenci.

Nezapomenout na možnost částečné nebo parciální specializace šablon, takže lze dosáhnout jiného chování pro různé typy, např. pro typ char a wchar_t. Prozkoumat, co je ve skutečnosti std::string, std::stream atd. a jestli toho nelze využít pro pohodlnou a jednotnou práci s různými typy znaků. Všechny kontejnery v STL umožňují zjistit typ prvků, které uchovávají pomocí členského typu value_type. std::istringstream se může hodit (nejen) pro konverzi řetězce na číslo

Kvůli různým typům znaku (char a wchar_t) budou pravděpodobně i samotné politiky šablonami. Pokud je potřeba specifikovat, že parametrem šablony je opět šablona, je třeba postupovat přibližně takhle: template <template <typename> class TPolicy, typename TChar> struct trida{ void do_something() { TPolicy<TChar>::do_something(); } }; template <typename TChar> struct politika { static void do_something() {} }; trida<politika, char> t; t.do_something();

Čistá a hezká syntaxe i sémantika Kvalita navrženého rozhraní knihovny Není třeba si lámat hlavu s tím, jak přesně se má knihovna chovat, jaké všechny formáty argumentů akceptovat a kolik mezer vypisovat. Zadání je schválně vágní, takže řešení mohou být značně variabilní. Návrh rozhraní jednotlivých politik Politiky musí skutečně implementovat dílčí kroky algoritmů a nikoliv jenom poskytovat konstanty apod., podle kterých se algoritmus bude řídit Ošetření výjimečných a chybových stavů Bezwarningová zkompilovatelnost (ideálně GCC i MSVC) Včastnost odevzdání Minimalizace duplicitního kódu (např. kód pro práci s řetězci by měl být napsaný pouze jednou tak, aby pracoval jak s char, tak s wchar_t

Součástí řešení musí být soubor du2_main.cpp, který ukazuje použití knihovny, zbytek (tj. celou knihovnu) musí tvořit pouze hlavičkové soubory (vzhledem k použití šablon to jinak ani nepůjde). Jeden ze souborů knihovny musí mít jméno du2_parser.h, jehož includováním se zpřístupní všechny potřebné třídy a funkce knihovny. na začátek každého souboru vložte komentář typu // DU2-ARG.cpp // Karel Vomacka NPRG051 2010/2011 vaše řešení vložte do Grupíčku - neposílejte emailem! správné soubory do správných sloupečků!

David Bednárek Jakub Yaghob Filip Zavoral http://data.ksi.ms.mff.cuni.cz/svn/nprg051pub/html/nprg051.html

Termín: +14 days Zadání: Cieľom zadanie je vytvorenie automatizovaného prekladača, ktorý za pomoci slovníku preloží text náhradou slova za slovo prekladu. Slovník je pravidelne updatovaný v priebehu prekladu novými verziami, ktoré musia byť v preklade zohľadnené, čiže nové preklady musia byť zapracované do už prekladaného textu. Update je realizovaný pri načítaní textového reťazca zo vstupu.update alebo je kontrolovaná prítomnosť súboru s updatami každú sekundu. Koniec prekladu je pri načítaní vstupu.end (čiže program môže dostať update aj po skončení prekladu). Program musí ukazovať v konzolovom okne ako ďaleko je asi s prekladom. Ciele Multithread Korektné použitie synchronizačných primitív Rýchlosť výslednej implementácie Multiplatformovosť

Text Slovník Update Slovníka Update Slovníka Update Slovníka TrollTranslator User input User input User input User input Translated Text

Zdrojový (Source) text vlastnosti ASCII Slovo - Alfanumerický reťazec oddelený medzerami White spaces medzery, tabulátory, \n Bez exotických znakov Značná dĺžka (napr >> 1GB), vojde sa do RAM Cieľový (Target) text vlastnosti 1:1 preklad zo zdrojového textu Preklad musí byť realizovaný tak, akoby prv prebehli všetky updaty na slovník a až potom sa začalo prekladať Musí byť zachovaný počet White Spaces Treba zachovať upper a lower case XXX sa preloží na YYY XxX sa preloži na YyY

Surjektívne zobrazenie z množiny zdrojových slov na cieľové slová Nieje lexikograficky zotriedený Treba ignorovať case u slovníkových párov, dôležitý je case u zdrojových dát Môže obsahovať duplicitné páry Značná veľkost (>> 1GB) vojde sa do RAM Formát update je rovnaký ako formát slovníku Formát Srcword : targetword Napr: 1 : 2 4 : 5 1 : 2 A:2

V prípade detekcie zapisovania užívateľského vstupu sa preklad zastaví kým nieje dokončený vstup (text do konzole) stlačením enteru. Typy vstupu.dictionary špecifikuje slovník, ktorý je uvedný za.dictionary Napr:.dictionary preklad.dict V prípade že je toto detekované v priebehu prekladu, prekladový slovník je považvaný za update Default: dictionary.dict.update špecifikuje update slovníka za slovom.update Napr:.update update.dict Default je update.dict.begin začne preklad, vstupný súbor je za slovom update Napr:.begin in.txt Default: špecifikovaný parametrom i alebo input.txt.end ukončí preklad a uloži do súboru špecifikovanom za.end, napr:.end output.txt Default: špecifikovaný parametrom o alebo output.txt

Multithreaded dizajn Správne a dostatočné použitie synchronizačných primitiv Overall Dizajn Dokumentácia Funkčnosť Rýchlosť

Multiplatformovosť Najrýchlejšie riešenie dostane bonus -95% za singlethread

Pouze přes Grupík Vše v jednom.zip souboru do sloupečku DU1 za poslání nevhodného obsahu budou strhnuty body na začátek každého souboru vložte komentář typu // DU3-xxx.cpp // Karel Vomacka NPRG051 2012/2013

Použite rôzne thready na rôzne činnosti read/write translate Update user input

Pravidlo 0 kto má záujem o komentáre k DÚ v elektronickej forme, nech si o ne explicitne napíše na moj email (tomas.plch@gmail.com) Pravidlo 1 - keď nerozumiem, zeptám se... emaily ešte stále fungujú Pravidlo 2 dodržte zadanie Pravidlo 3 komentujte svoj kód Pravidlo 4 nepíšte do kódu veci ako Policy Crap Pravidlo 5 neprekomplikujte svoje riešenie