====== Úloha 2 - sčítání mnoha-bytových čísel ====== {{:pjc:3_loga_velikost_100.jpg|}} **Evropský sociální fond** **Praha & EU: Investujeme do vaší budoucnosti** Tato úloha vznikla za přispění fondu [[http://www.prahafondy.eu/cz/oppa.html|OPPA]]. ===== Zadání ===== Implementujte aplikaci, která přes argument z příkazové řádky obdrží název souboru s definicí mnoha-bytových čísel a sady operací. Aplikace musí správně načíst a analyzovat vstupní data a provést správně sadu zadaných příkazů. Spuštění aplikace (příklad, kde má aplikace název DU2 a příkazový soubor prikazy.txt): ./DU2 prikazy.txt ==== Příkazový soubor ==== Příkazový soubor má jasně daná pravidla, která je nutno během jeho parsovani dodrzovat! Ukázka vstupu: let ax 0x 23 0a 43 3e 5b cd 65 89 0f 90 55 7c e1 let bx 0x FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF begin print ax print bx add bx ax print bx exit A k tomu příslušný výstup: 0x 23 0a 43 3e 5b cd 65 89 0f 90 55 7c e1 0x ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 0x 01 00 00 00 23 0a 43 3e 5b cd 65 89 0f 90 55 7c e0 Příkazový soubor má následující pravidla: * Na každém řádku smí být pouze jediný příkaz. * Jednotlivé elementy na každém řádku mohou být odděleny libovolným množstvím bílých znaků kromě '\n' (přechod na nový řádek). * Soubor je rozdělený na dvě části: první je deklarační a druhá je výkonná část. Jako oddělovač mezi částmi slouží prázdný řádek. Deklarační část: * Obsahuje deklarace jednotlivých proměnných v následujícím tvaru: let 0x * Každý řádek deklarační části obsahuje právě jednu deklaraci proměnné. * Deklarační část končí jedním prázdným řádkem. Výkonná část: * Obsahuje příkazy pro manipulaci s proměnnými. * Každý řádek výkonné části obsahuje právě jeden příkaz. * Příkazy začínají klíčovým slovem begin * První příkaz slouží k tisku zadané proměnné: print * Příkaz print tiskne na standardní výstup v následujícím tvaru: 0x * Druhý z příkazů má dva argumenty - proměnné. K hodnotě prvního argumentu přičte hodnotu druhého argumentu. add * Příkazy končí klíčovým slovem: exit * Za korektním příkazem exit mohou být libovolná data, aplikace je ignoruje. Data mohou zacinat az na dalsim radku! ==== Sčítání mnoha-bytových proměnných ==== Velikost jednotlivých proměnných je dána počtem bytů z deklarace. Nejméně významné byty jsou nejvíce vpravo. Například čísla z první ukázky se sčítají takto: 23 0a 43 3e 5b cd 65 89 0f 90 55 7c e1 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff -------------------------------------------------- 01 00 00 00 23 0a 43 3e 5b cd 65 89 0f 90 55 7c e0 ==== Reakce na špatný vstup ==== V případě špatného vstupu aplikace vypíše hlášku: Parsovani vstupu selhalo. ===== Testování ===== V sekci download jsou k dispozici testovací software (tester) a referenční řešení v binární podobě pro základní platformy. Tester přeloží předložený kód s parametry: -pedantic -pedantic-errors -Wall -Werror. Tyto volby způsobí, že překladač hlídá všechny detaily a pokud se při překladu objeví warning, je automaticky považován za chybu a překlad skončí. Pokud se podaří kód úspěšně přeložit, je pak porovnáván výstup aplikace s výstupem referenčního řešení. Jakákoliv odchylka, třeba i jedna mezera navíc, způsobí neplatnost testu! Během testování máte k dispozici všechny vstupy i informaci, kde došlo k nesrovnalostem. Pro domácí testování je ke stažení k dispozici i sada testovacích vstupů. Zde je třeba upozornit na rozdílnost platforem. V aplikaci se používají floating point čísla, takže přesnost se může na různých platformách lišit. Výstupní hodnotu z testované a referenční aplikace se doporučuje porovnávat pouze v rámci jedné platformy! Tester po skončení běhu napíše procentuální úspěšnost. Doporučuje se testovat na Solarisu, ale stejně tak by měl tester fungovat v jakémkoliv linuxu s nainstalovaným pythonem verze 2.4.6 a vyšším. K úspěšnému chodu je zapotřebí i nainstalovaný překladač g++. Po odevzdání bude váš kód testován stejným testerem, takže každý by měl předem vědět, jaký počet bodů dosáhl. Pro spuštění testu stačí stáhnout a rozbalit adresář s testerem DU2-tester.tar. Poté v rozbaleném adresáři zavolejte příkaz make (na solarisu gmake) a řiďte se pokyny. V následujícím odstavci je popis testování, kdyby příkaz make (gmake) z nejakého důvodu nefungoval. Tester vyžaduje dva parametry z příkazové řádky. Prvním je cesta k referenční aplikaci. Druhým parametrem je přímo testovaný zdrojový kód. Jako referenční aplikaci použijte tu správnou pro danou platformu. Pro solaris je to například refApp.solaris, pro 32 bitové linuxy refApp.linux_32 atd. Testování lze spustit příkazem: python DU2-tester.py refApp.XXX testovanyZdrojovyKod.cpp Místo XXX si samozřejmě doplňte příslušnou platformu. ==== Testování na OS Windows ==== Pro testování přímo ve Windowsech je nutné nainstalovat [[http://cygwin.com/setup.exe|cygwin]] se správnými součástmi. Po spuštění instalátoru vyberte nějaký mirror a nastavte dle instrukcí potřebné adresáře. (Pokud to lze, ponechte defaultní hodnoty.) Postupne byste se měli dostat na okno s výběrem instalačních součástí. Do vyhledávání zadejte postupně hesla g++, make, python. Pro instalaci vyberte balíčky tak, jak to je vídět na následujících obrázcích: {{:pjc:g_1.jpg|}} {{:pjc:make1.jpg|}} {{:pjc:python1.jpg|}} Po instalaci zkopírujte rozbalený //DU2-tester// do složky //home/Vase_systemove_uzivatelske_jmeno//, která se nachází v adresáři s nainstalovaným cygwinem. Poté spusťte cygwin a napište příkaz: cd DU2-tester Pak zkopírujte zdrojový kód domácího úkolu do složky testeru (do toho v adresáří //home//) a pojmenujte jej DU2.cpp. Pak stačí spustit test příkazem make test_win **Pro záruku, že Váš kód bude při odevzdání přijat, otestujte jej také na solarisu, viz další sekce.** ==== Vzdálený přístup z OS Windows ==== Vzdálené testování na serveru z OS Windows lze pomocí kombinace programů putty a WinSCP. Přes WinSCP lze na Solaris zkopírovat data a přes putty získáte vzdálený terminálový přístup. Jako adresu zadávejte např. sunray1.felk.cvut.cz, nebo sunray3.felk.cvut.cz. Uživatelské jméno a heslo byste měli znát. ==== Vzdálený přístup z OS Linux nebo Mac OS ==== Nejsnažší je použít příkazovou řádku a kombinaci příkazů ssh a scp. ssh slouží pro vzdálený přístup a scp pro kopírování. Přesuňte se do adresáře, kde máte uložen adresář DU1-tester. Pak zadejte příkaz scp -r DU2-tester username@sunray1.felk.cvut.cz: a po vyzvání buď potvrďte dotaz nebo rovnou zadejte heslo. Tímto byste měli mít celý adresář DU1-tester ve vašem domovském adresáři na Solarisu. Pro vzdálený přístup pak zavolejte příkaz ssh username@sunray1.felk.cvut.cz a opět zadejte heslo. Pro ukončení vzdáleného přístupu zadejte příkaz exit. ===== Novinky a doporučení pro testovani ===== * Na solarisu používejte primárně příkkaz gmake. Příkaz gmake vypíše instrukce pro testování. Pokud tento postup selže, neprodleně to sdělte na adresu cernyvi@fel.cvut.cz. Můžete testovat i ručně viz předchozí sekce, ale předtím pro jistotu nastavte referenční řešení jako spustitelné (místo XXX si doplňte příslušnou platformu): chmod +x refApp.XXX * Testování je rozděleno do tří sekcí. Nově lze každou sekci spustit samostatně. Stačí při spuštění testu zadat další argument s číslem testovací sady. Např. spuštění pouze testovací sady 2 vypadá takto: python DU2-tester.py refApp.XXX DU2.cpp 2 * Přidána podpora pro testování na MacOS. * Vývoj a testování domácího úkolu lze značně zjednodušit. Stačí si vytvořit zástupce nebo symbolický link na zdrojový kód, který může být umístěn například v projektovém adresáři vývojového prostředí. Tohoto zástupce nebo link umístěte do adresáře testeru a přejmenujte jej na DU2.cpp. Poté lze kód vyvíjet a testovat zároveň, aniž byste jej museli po každé změně kopírovat. ===== Download ===== Tester: {{:pjc:02:du2-tester.zip|}} Sady testovacich vstupu: {{:pjc:02:inputs.zip|}} ===== Tipy ===== * Naučte se správně používat metody objektu //istream// - //good(), bad(), eof(), fail()//. * Pro parsování vstupu je velmi užitečná funkce //getline()//. Pozor nejedna se o metodu, ale o funkci. V STL existují metoda i funkce stejného jména. * Pri práci se vstupem, zvláště z proměnnými se výborní hodí standardní datový typ //map//.