Moje nová hra! Bludišťovka Anny’s Lab

Když jsem se letos (rok 2012) někdy koncem června vrhl na C++ s tím, že se jej přes prázdniny naučím, ať toho nemám poté v zimním semestru moc, opět jsem plánoval jaký to větší projekt si v něm napíši. Původně jsem si chtěl reimplementovat knihovnu clmg (Common Lisp Micro Graphics) sloužící k jednoduché grafice na základě objektové struktury, kterou jsem používali v Předmětu Paradigmata Programování 2.

Logo Anny's Lab
Logo Anny’s Lab

Ale přecházet z okenního rozhraní do klasického textového terminálu není u grafické knihovny úplně to nejideálnější a tak mi z clmg zůstala jen třída Point. Poté jsem si k ní začal dopisovat další tři třídy a bludišťovka se pomalu začala rýsovat.

Pod původním názvem Labyrinth tak začala vznikat obyčejná konzolová bludišťovka pro večery na chatě, kde nemám internet, nebo na přednášky, kde internet obvykle mám, ale zase mi většinou nestačí baterie notebooku na nějaké náročnější grafické hry.

Postupem času mi název Labyrinth přišel poněkud nevhodný a obyčejný (i když se zpětně zamyslím nad názvy Drag race a Předměstí Simulátor, nebylo by to nic neobvyklého). Vzhledem k tomu, že postavička, která se v labyrintu pohybuje je reprezentována zavináčem, vznikl návrh na zakomponování nějakého jména začínajícího na ‚A‘ do názvu programu. Když jsem hledal vhodný  znak, kterým se budou vykreslovat zdi, mi ze spousty znaků, které jsem zkoušel, padlo do oka velké písmeno W, které až náramně připomíná nějakou rostlinu nebo keřík.

Naštve
Naštve

A bylo jasno.  Mí skalní fanoušci navíc totiž ví, že do každého svého programu zakomponovávám nějakou osobu ženského pohlaví z mého okolí. A není proto divu, že předmětem kampaně Anny’s Lab se stala bioložka Anny pracující ve své laboratoři, které se poněkud přemnožil zmutovaný a geneticky upravený jinak úplně obyčejný trávník, který podobně jako v pohádce o Šípkové Růžence zaroste celým areálem (a vytvoří tak labyrint, kterým se musí Anny dostat ven). Od té doby jsem Anny’s Lab nenazýval jinak, než „Anča a Lenča“.

Kampaň je však jen jedna z mála funkcí, kterou Anny’s Lab nabízí. Celá hra je vlastně založená na tom, že se zvolí tzv. číslo labyrintu, podle kterého je poté labyrint náhodně vygenerován. Můžete tak hrát téměř nekonečný počet různých náhodných a pseudonáhodných labyrintů, různých velikostí a uspořádání.

Jednoduchý labyrint
Labyrint s jednoduchou strukturou

Vzhledem k tomu, že hra byla komplet vyvíjena na platformě GNU/Linux, je linuxu přímo šita na míru. Naopak na Windows s ní byly nemalé komplikace. Bohužel právě proto si nebudete moct pořádně užít hru Anny’s s použitím knihovny ncurses, kdy se hra vůbec neseká, každou klávesu nemusíte potvrzovat Enterem a dokonce se setkáte i se skromným barevným provedením.

Program používá starou knihovnu z MS DOS, kterou však na Windows za boha neseženete, zatímco na Linuxu ji nainstalujete jedním příkazem.

Střeva programu

Program je sice oficiálně psán v jazyce C++, já osbně bych spíš použil označení C/C++. Když jsem totiž chtěl načítat stisknuté klávesy bez potvrzování Enterem, vygooglil jsem funkci getch() z knihovny ncurses. Jenže tato knihovna byla určená pro jazyk C a nikoliv C++, takže většina vstupně-výstupních operací je realizována funkcemi jako printw a getch, držel jsem se standartu a kde nebyla použita knihovna ncurses, používal jsem funkce z knihovny cstdio – printf, getchar  a podob.

Čistého času jsem na Anny’s Lab pracoval něco kolem dvou a půl měsíce, kde z toho jsem ale fyzicky pracoval v průměru tak hodinu až dvě denně (to víte, prázdniny). Asi vás nepřekvapí, že nejvíce času padlo na jádro celé aplikace – metoda třídy Map na generování labyrintu.  Chtěl jsem být profesionální a najít si nějaký slušný algoritmus na generování. Tato diplomová práce věnující se přesně této problematice  mě však pouze přesvědčila, že opravdu nejlepším řešením bude úplně obyčejný hloubkově rekurzivní algoritmus typu „horník“.

První hra
První dohraná hra (17. srpna), můžete vidět tuny ladících výpisů

Nicméně pořád jsem je v reálném čase nedostal na Labyrint větší než 800×800. A bylo mi naprosto jasné proč. Ta metoda, která se starala o průchod jedním uzlem je sice na pochopení velmi jednoduchá, ale implementačně poněkud složitější. Neustálé kopírování konstantních parametrů a vytváření stále nových proměnných, jako iterační proměnná i na začátku každého volání zkrátka zbytečně žerou obrovské množství času.

Začal jsem tedy vzpomínat na cvičení z algoritmiky, jak přepsat hloubkovou rekurzi. Nejdřív jsem si ji přepsal použitím fronty na průchod do šířky, dokázal jsem generovat labyrint až do velikosti asi 12000×12000, nicméně vypadal jak hvězdice se středem ve startu. Po několika dnech intenzivního algoritmování jsem na to přišel.

Na zásobník si bude ukládat vždy čtveřici uzlů, do kterých se vydat (v pospřeházeném pořadí), také uzel, ze kterého se do tohoto „aktuálního“  došlo a ukazatel (index i), kterým z těch směrů se má nyní vydat. Pokud došel do validního uzlu, vytvořil si posloupnost s ním sousedících, spolu s ní na zásobník uložil bod, ze kterého tam došel, a index prvního z nich, načeš se do něj hned vydá. Pokud validní uzel nenašel, šel na další v pořadí (zvýšil index aktuálního uzlu o 1) a pokud další takový nebyl (byl poslední), odebere tuto celou skupinu ze zásobníku a jde o úroveň výš.

Toto řešení je taktéž celkem elegantní (obzvlášť, když je v C++ zásobník implementován ve standartní knihovně), a především velmi efektivní. Paměť mi většinu dojde, až když se snažím generovat labyrint větší než 14000×14000.

Až nebudu mít týden co dělat, nakoupím energiťáky, nachystám si rozvoz pizzy na rychlou volbu, vygeneruju si labyrint 10000×10000 a budu hrát…

Zbytek už byl celkem hračka. Až na pár drobností, jako třeba metoda, která k uzlu vrátila některý náhodný sousední uzel tak, aby ležel na mapě. Nejdřív jsem se snažil testovat, jestli není moc blízko okraji mapy, ale kraje mapy jsou 4 a navíc se můžou kombinovat (rohy), takže po asi 20 řádkách testování a ifování, jsem skončil tím, že jsem náhodně vygeneroval některý z okolích bodů (na to stačily 2 řádky) a to opakoval, dokud se tento náhodný uzel nenacházel v mapě.

Docela mě překvapilo i parsování argumentů z příkazové řádky. Když jsem si uvědomil, jako všelijaké kombinace chybných stavů můžou nastat, sáhl jsem až na dno kapsy a vytáhl výjimky a díky nim se kód rozrostl o pouhých 240 řádků.

A úplně zabilo, když jsem vlastně poprvé tvořil program rozdělený do více souborů (což jsem poněkud nešikovně dělal úplně nakonec), a vůbec to nechtělo fungovat. Nedošlo mi, že se soubory (a tedy i bloky funkcí celého programu) na sobě sice závisí, ale víceméně řetězovitě a ne každý na všech ostatních. Takže soubor s deklaracemi maker je naprosto nezávislý a tak jde zkompilovat rovnou. Na něm závisí soubor s deklaracemi všech funkcí, na něm pak definice pomocných funkcí, díky ní pak půjdou zkompilovat třídy Point a DrawabePoint, … až přes definice hlavních, „jaderních“ funkcí (a z nich ta úplně nejhlavnější – Hlavní Menu) až po samotnou funkci main.

Pak už stačilo jen napsat Makefile (a dva dny řešit, proč to nelinkuje knihovnu ncurses, ikdyž ji jistojistě inkluduji), zabalit, zkompilovat i na Windows (i to byla celkem estráda) no a napsat to, co si nyní čtete.

Ke stažení

Ke stažení dodávám jak zkompilované verze pro MS Windows, tak i balíčky zdrojových kódů pro obě platformy.

Anny’s Lab Verze pro Windows 32bit (.exe)

Anny’s Lab Verze pro Windows 64bit (.exe)

Kdo má koule na labyrint 5000x5000?
Kdo má koule na labyrint 5000×5000?

Anny’s Lab je totiž distribuován pod licencí GNU/GPL a je Open Source, tedy je volně ke stažení včetně zdrojových kódů.

Zdrojové kódy Pro Windows (Přibalen soubor pro Microsoft (c) Visual Studio)

Zdrojové kódy Pro Linux (Přibalen Makefile)

Ty předkládám především pro uživatele operačního systému GNU/Linux – v programu je přibalen také Makefile a tak si jej prostě zkompilujete pomocí programu make.

Pokud nemáte nainstalovanou knihovnu ncurses, musíte programu make říct, že Anny’s Lab funkce z ncurses nemá používat a to:

Nebo zakomentováním řádku

v souboru declarations.cpp. Více o používání knihovny v souboru COMPILATION a v hlavičkových komentářích souborů declarations.cpp a main.cpp.

 

 

Paradigmata Programování 1, neboli ‚Scheme‘

Po příchodu na vysokou (tím myslím Univerzitu Palackého v Olomouci) kde, jak asi většina z vás tuší, studuji Aplikovanou informatiku. Jeden z předmětů, který se tam vyučuje, Paradigmata Programování začal asi tak nějak: „Kolegové mi říkali, že vás mám motivovat, tak jsem si tady připravl menší graf.“, řekl pan Docent Vychodil a na plátnech (tehdá ještě fungovaly oba projektory) se objevil Koláčový graf. Dle něj 75% loňkých studentů nedostalo zápočet a z těch 25%, co ho dostali zkoušku stejně udělala jen slabá polovina.

Když jsme po dvou a půl hodinách z přednášky odcházeli opravdu asi málokdo by si myslel, že by se scénář, který onen graf symbolizoval mohl naplnit. Vlastně to bylo jenom takové zvláštně zaspané počítání: třeba 10+20+30+(4*5)-1/2 by se v jazyce Scheme, o který v Paradigmatech programování šlo, zapsalo například takto: (+ 10 20 30 (* 4 5) (- (/ 2))) .

Postupně však začalo přituhovat, už na druhé přednášce začaly tuhnout úsměvy a na třetí studenti jen zoufale hleděli na prezentace (pokud ne do svých notebooků či očních víček).

Scheme je oblíbený výukový programovací jazyk. Učí se v něm programovat například studenti Bostonské univerzity, MIT, Rice University, … a také Univerzity Palackého v Olomouci.
abclinuxu.cz

Někdy kolem 22. listopadu (po dokončení HeliSim), asi týden po uveřejnění zadání, jsem si řekl, že se vrhnu ná zápočtový domácí úkol. Zmlsán kolegy, kteří si nevěděli rady ani s 5 řádkovými úkoly, které dostávali od ostatních cvičících (a posílali mi je, protože já jsem tou dobou už aktivně programoval), jsem si naivně myslel, že to také budu mít za víkend hotové.

Po dvaceti dnech, noc před termínem, jsem odesílal soubor zdrojového kódu o délce 289 řádků. Vzhledem k tomu, že se mi zrovna dvakrát nevyvedla první zápočtová písemka, musel jsem to nahnat na právě tomto domácím úkolu. Z možných 20 bodů jsem však získal pouze 13.5 bodu, neboť poslední 3 ůkoly, ty nejvíc bodované a ty, nad kterými jsem strávil asi 60% času jsem měl stejně špatně.

Ukázka programovacího jazyka Scheme
I přes mnoho komentářů je kód na hranici přehlednosti

Druhou zápočtovou písemku jsem napsal neuvěřitelně dobře, takže jsem ani nepotřeboval na opravnou – z 60 bodů jsem získal 40.5, přičemž na splnění zápočtu bylo bodů potřeba 40. Mezitím nám však řekli, že všechny zápočtové písemky, které jsme doposud psali byly proti písemné časti zkoušky med a tak jsem i já si začal říkat, že když to nedám, tak to nebude taková katastrofa.

Bohužel tak trochu nešikovně jsem si zapsal dvě nejtěžší zkoušky na 2 dny po sobě. Když jsem dal tu první, Úvod do informatiky, nemohl jsem to alespoň skromně neoslavit. Něco jsme popili, ale pak už jsem upaloval spát abych byl na Paradigmata fit. Kupodivu jsem nezaspal, a tak jsem běžel na test.

Ten, jak se poté prokázalo, jsem napsal na 96% ze 100% možných (nedivte se, na vysoké můžete bez problémů získat i 130% a to dokonce bez úplatků) a tak jsem šel (spolu s dalšími dvěma kolegy, kteří také měli víc než 71%) na kobereček k samotnému panu Docentu Vychodilovi. Ten se nás každého na něco zeptal, mě konkrétně na koerci (přetypování), a odcházel jsem s A v indexu.

Od toho okamžiku pořád někoho doučuji, učím a poučuji. Úplně nejdřív ale vznikl tento skromný manuál-příručka k jazyku Scheme, a ostatně proto vůbec píši tento článek. Mezi mými kolegy se stal velmi oblíbený, a při přípravě na zkoušky poměrně praktický.

Ale kam se hrabe nějaký student, který má A ze zkoušky na někoho, kdo má před jménem 2 tituly, a ještě jeden za ním? Tím chtěl básník říci: „Choďte na přednášky a cvičení“, jinak máte přestup z UP na ÚP v brzké době jistý.

Takže ještě jednou:

Příručka, manuál a přehled Jazyka Scheme

HeliSim – proleťte se helikoptérou přímo v prohlížeči

Projekt s pracovním označením „Helča a Simča“ je dalším z řady mých velkých projektů. I když HeliSim nepatří mezi ty největší (Drag Race a Předměstí simulátor), i tak si zaslouží úctu, že jsem si v prvním semestru na vysoké ještě stále našel čas a ze zajímavého nápadu (který jsme měl v hlavě nějaký ten týden před začátkem vlastní realizace) realizoval něco takového.

Ten onen nápad spočíval ve využití toho, že při pohybu myší nad oknem prohlížeče je volána událost onMouseMove a v objektu event jsou uloženy souřadnice polohy kurzoru. Díky tomu nebyl problém při volání této události na tyto souřadnice přesunovat obrázek s helikoptérou (jak můžete vidět ve verzi 1, kterou dodám později).

No a aby toho nebylo málo, tak jsem ještě k tomu přidal, řekl bych snad spousty, dalších funkcí, takže ve výsledku je to celkem propracované dílo. Jak se můžete v nápovědě po spuštění (nebo vyvolané klávesou H) dozvědět, můžete si změnit jak letoun, tak i prostředí ve kterém létáte.

Začalo to jako simulátor letu helikoptérou, ale zvrho se to ve filosofii „Všechno lítá, co má peří“.

Ještě bych prozradil pár zajímavostí. Celé dílo jsem tvořil na den přesně 1 měsíc (21. října až 21. listopadu). Jen pár hodin po započetí tvorby mi byl zablokován účet na facebooku, a teprve teď si zakládám nový (dokázal jsme tedy celý měsíc nejen vydržet, ale i programovat! bez facebooku). Dokončen byl – jak jsem řekl 21. 11, a to přesně jednu minutu před půlnocí.

Velmi zajímavě vypadá také samotný zdrojový soubor. Ten má včetně reklamní paty rovných 7 řádků. 95% všeho, co samotný HeliSim dělá je totiž uloženo v externím skriptovém souboru, který, což se mi taky často nestává, zdá se býti docela i přehledný. A to i přes to, že má téměř 300 řádků (288). Třešničkou na dortu, no spíš myškou při tahání řepy převeliké je pak stylopis, který se stará o to hlavní – aby vše vypadalo, tak jak má, i když má v poměru ke skriptovému souboru téměř zanedbatelnou velikost (6 řádků).

Pro ty, kteří vydrželi číst až po sem tu mám vyzrazení dvou Easter Eggů. První naleznete, pokud budete létat v létě. Pod největším stromem je malá lavička. Když se na ni podíváte hodně z blízka, uvidíte na ní někoho sedět. Kdopak to asi je? Druhý je na oplátku v zimě, kde mezi hájkem z jehličnatých stromků a heliportem (blíž k heliportu) úplně dole můžete nalést čtvereček 2×2 pixely (který je oproti bílému sněhu mírně neobvykle tmavší) majíce tento význam.

Klikni pro spuštění HeliSim 10 alfa

Pozor! server není stavěný na takovéto aplikace a tato aplikace není stavěna na takovéto servery, takže přepínání vzhledů je velmi pomalé a zdlouhavé. Řešením je verze 11, na které se již pracuje.

Neodbytná je také reklama, se kterou prostě nešlo hnout.

O Programování

Programování. S tímto slovem se na tomto webu setkáte poměrně často. Je to proto, žejá jsem magor, když jsem si vzal něco do hlavy, nemohl jsem to dostat ven. Takže díky tomu relativně intenzivně programuji už víc než dva roky a výsledkem jsou mimo různé blbůstky především Drag Race a Předměstí simulátor.

Toť jen jeden z důvodů, proč vůbec vznikl tento článek. Ale abych se vrátil zpět k programování jako takovému, pak bych tedy na základě této zkutečnosti zkonstatoval, že programování je rozhodně činnost náročná. Je potřeba se na to plně soustředit, a když už pak programujete opravdu několik hodin, obzvláště nějaký ten zapeklitý algoritmus a ten vám pořád a pořád nechce fungovat, už ztrácíte nervy, už nevíte kde by ještě mohla být chyba, tak je nejlepší se přinutit se k tomu, aby jste to pro dnešek už vzdal. Nebo druhá možnost, které já říkám vyvolat přerušení.

To znamená, že toho prostě necháte. Buďto jen třeba na dvacet vteřin, kdy se podíváte třeba na facebook / twitter / … (proto často hovořím o tom, že mít facebook / twitter / … je pro programátora velmi významná věc), můžete něco popít, pojíst ne vykonat nějakou dlouho odkládanou domácí práci. Nebo, což jsem také docela často praktikoval, na takových 20 minut si třeba něco zahrát a nebo, jak jsem řekl, prostě jít spát a pokračovat další den.

Nějaký zdrojový kód
motivační obrázek - zdrojový kód

Toto takzvané přerušení vás přivede na jiné myšlenky a pak najednou přijdete, pročtete si ten zdroják a chybu najdete již při prvním pohledu, neboť jste ji před tím prostě přehlíželi. Nehledě také na ten fakt, že programování vás totálně psychicky vyčerpá, takže už vám to ke konci prostě nemyslí.

Programování prostě není pro každého. Kromě pevných nervů a silné vůle, aby člověk vůbec něco naprogramoval, na to musí mít hlavu. Jinak se to bude velmi složitě a zdlouhavě učit. Prostě musíte mít v hlavě představu, musíte mít vymyšleno, co od programu očekéváte, ba dokonce přesně celý algoritmus, který pak zhmotníte formou zdrojového kódu už když usedáte k počítači.

Být programátorem totiž neznamená sedět u počítače a datlit příkazy, ale přemýšlet a tok vašich myšlenek ťukat do počítače. A teprve potom nechat si od něj nechat ověřit, že byly vaše myšlenky správné, a že vámi vymyšlený algoritmus funguje jak má.

Jak říkám, můžete to zkusit a jestli vám to půjde, tak budete potom řešit stále zapekliťější a zapeklitější problematiky. A při troše štěstí se z vás třeba jednou stane uznávaný programátor.

Bash a shellové skripty v Linuxu

Pro pochopení, Bash je jeden z několik unixových shellů. Myslím, že ten nejrozšířenější a nejznámější. Podporuje i některé konstrukce, které z něj však dělají plnohodnotný programovací jazyk určený k psaní skriptů (kromě samotných příkazú). Unixových skriptů. Hlavu bych za to nedal, ale je to něco jako DOSovské BAT soubory. Stejně jako ty DOSovské skripty lze i ty Unixácké snadno spouštět (a samozřejmě také upravovat) a oproti jiným programovacím jazykům umožňují rejpat se v celém počítači, od souborů na pevném disku až po datum a čas. Bashové skripty jsou totiž primárně tvořeny většinou linuxovými příkazy.

Takovéto skripty by nám v celku k ničemu nebyly (asi těžko bychom vytvářeli soubor s názvem „Zadejte váš věk:“ a pak jej pomocí příkazu ls (výpis obsahu adresáře) nechali vypsat na obrazovku, jakožto oznámení obsluze, aby zadala svůj věk), tak nám kromě pánaboha při tvorbě skriptů pomáhají základní příkazy jazyka Bash. Toto není návod na psaní skriptů (toho je plný internet – obzvláště linuxácké portály) a tak zmíním například příkaz echo (=ozvěna; co mu zadáte jako parametr, to vám vrátí na obrazovku – klasický vypisovací příkaz) a jeho protějškem je příkaz read. Tyto příkazy se nastavují klasickými „pomlčkovými“ parametry, takže echo -n "Jméno: " díky prvnímu parametru po vypsání textu neprovede odřádkování.

Pořád bychom toho asi ani moc nenapsali. Samozřejmě, že Bash umí i podmínky a cykly. Zajímavě funguje příkaz if – parametr podmínka se nevkládá do kulaté závorky jako v Céčku, ale do hranaté (a navíc je ohraničen mezerami). Na tom by nebylo nic až tak moc zvláštní, avšak zvláštností je to, že ona hranatá závorka je ve skutečnosti program (myslím, že ve skutečnosti je to symbolický odkaz na program test, ale to vcelku nehraje roli) jemuž dáváme parametry (například [ -e "Martin.txt" ] zjištuje, jestli soubor Martin.txt existuje.

Kromě těchto standartních vlastností umí i další. Kupříkladu velice šikovnou pomůckou jsou roury. Ty umí vzít výstup jednoho příkazu a poslat je rourou na vstup druhého. Takže příkazem calc provedeme nějaký složitější výpočet (Bash umí jen základní pětici matematických operací, zbytek se musí řešit jinak, což je celkem nevýhoda) a výsledek tohoto výpočtu pošleme na vstup mkdir a on nám vytvoří složku s názvem o dané číselné hodnotě jakoby v jednom příkazu a bez nějakého ukládání do proměnných. Naprosto úžasnou funkcí bashe je však snadné ukládání do souborů. Prostě výstup souboru přesměrujete do ‚názvu souboru‘ a ono to tam pošle. Nejsou třeba žádné inicializace souborů, kontroly existence a tak (ale musíte mít k zápisu do souboru patřičná přístupová práva).

Je třeba si uvědomit, že v linuxu to buďto vyjde a nebo ne a pak je to v … na konci roury (obrazně řečeno). Každý příkaz vždy vrací číselnou hodnotu. Je-li nulová, pak vše proběhlo v pořádku. Je-li nenulová, pak byla někde chyba. K chybě patří i třeba překlep v zápisu parametrů, takže když při zápisu podmínky do hranaté závorky zapomenete oddělit název příkazu [ od jeho parametrů, vyhodnotí podmínku vždy jako nepravdivou, což programátorovi může ze začátku dělat problémy.

Abych to nějak shrnul, v Bashi se člověk opravdu vyblbne. Kdo je magor jako já, může si klidně napsat skript, který po připojení foťáku k počítači jej automaticky namountuje ( mount – příkaz, který po hardwarovém připojení zařízení jej připojí i softwarově), vytvoří v počítači složku s názvem dnešního data a zkopíruje tam všechny nové fotky a přitom vám bude v průběhu kopírování zobrazovat kolik ještě procent a času zbývá.

Napříkald můj kamarád si vytvořil program, který odešle zadaná klíčová slova na images.google, stáhne jeden z nelzeneách obrázků a nastaví vám jej jako pozadí plochy. Skript má 3 řádky (1.- odeslání požadavku na images.google.cz a vybrání obrázku, 2.-stažení obrázku, nastavení jako pozadí).

Já osobně v Bashi programuji raděj, než třeba v klasickém C. Jeden z důvodů je ten, že skripty není třeba kompilovat, jsou přímo připraveny ke spuštění, a druhak díky tomu, že syntaktické chyby, které vám kompilátor (myslím ten klasický, konzolový – gcc ) vyplivne jenom jako číslo řádku a stručný popis, kterému stejně málokdo porozumí. V Bashi se vám tato hláška objeví až přímo za chodu, takže přesně víte občas i víte, kde chybu hledat.

Bash prostě dokáže ušetřit čas, je to jazyk, který se hodí, prostě si můžete pěkně pohrát s celým systémem a to my Linuxáci máme přece tak rádi!

Zde je článek o mém skriptu C write ‚n‘ run, vývojovém prostředí pro jazyk C v textové konzoli.

Přehled programovacích jazyků

Zde chystám jsem před asi 2 lety chystal úplně hustodémonsky krutopřísně brutální tabulku, ve které srovnám jazyky které umím-Pascal, Delphi; C, Bash, php, (případně i MS Visual Fox Pro nebo JavaScript a Javu, kterou zatím moc neumím…). Bude Měla vypadat nějak takto:

Dámy a pánové, až teď si někdo všiml a upozornil mě na nemalé množství chyb v tabulce. Navíc dnes již vím, že většina těchto jazyku je nesrovnatelná, a tak tuto tabulku berte prosím jako ostrašující případ, jak nahlíží začínající programátor, snažící se si co nejrychleji osvojit základy co nejvíce jazyků, na programování. 😉

Pascal Delphi C Bash PHP
Rok vzniku 1970 1990 1973 1989 1994
Společnost Borland Borland K&R FSF PHP Group
Platforma DOS/ Windows MS Windows Unix Unix multiplatformní
kompilátor TPC, FPC DCC? gcc
objektový? ne ano ano ne ano
case senzitivní? ne ne ne ne ne
podporuje RegExp? ne ne ano ano ano

Sérioparalelní kombinace rezistorů a kondenzátorů

… aneb Odpory a Kondíky online

Ikonka

Když jsem si chtěl před mnoha mnoha lety postavit štěnici, nefungovala. V rámci hledání chyb jsem potřeboval i změřit indukčnost cívky, která bylo vesměs ústředním prvkem. Abych to mohl provést, potřeboval jsem si na to postavit patřičný měřící přístroj. Ten jsem is navrhl, ale potřeboval jsem nějaký rezistor (teď už nevím kolik přesně to bylo), jehož hodnota nebyla v řadě a celkem složitě bych ji dopočítával.

Ale napadlo mě použít na ty složité počítání počítač. Počítačový program. Zanechal jsem proto asi na měsíc a půl práce na Drag Race a napsal si program Odpory a Kondíky. Nejdříve nepublikovanou verzi 1.0, ale poté i verzi 1.2, kterou (jen tak pro ukázku dávám ke stažení):

Odpory a Kondíky 1.2.zip (35,7kB) Program je plně automatizovaný, sám si určí přesnost (podle toho, jak přesné zadáte číslo) a už jen kombinuje a počítá.
Výstup vám uloží do HTML souboru, takže se vlastně jedná o dynamické stránky (s oblibou jsem říkal: „PHP = Pascal & HTML programming“). Byl vytvořen na Boží hod přesně ve 22:22:22.

Program v pascalu, jehož výstupem je html soubor není zrovna ideální řešení. Když se k tomuto faktu přidají ještě další, program se stává totálně nepoužitelný.

Tak jsem teď poslední měsíc vytvářel jeho on-line, php verzi, která je rozhodně mnohem praktičtější a použitelnější.


náhled formuláře
Samotný formulář zde

Moje vývojové prostředí pro textovou konzoli linuxu

Začalo to takhle:

Ti bystřejší pochopili, že se jedná o programování v jazyce C. Ano, takto jsem začínal já programovat v Céčku.

Vzhledem k tomu, že mě v textové konzoli bavilo pracovat, neviděl jsem důvod proč si instalovat nějaké grafické vývojové prostředí. Avšak psát tyto příkazy pořád dokola mě po pár úpravách zdrojového kódu přestalo bavit, ale napadlo mě, že bych si na to mohl napsat skript. Skript prostě provedl výše napsané 4 příkazy a skončil. V případě potřeby jsem jej spustil znovu a znovu a znovu, doku nebyl prográmek hotov.

Když jsem to zabalil do cyklu (abych jej nemusel spouštět pořád dokola), bylo potřeba v určitý okamžik zeptat se uživatele, zda-li chce program ukončit. V tom se ve mně zrodila myšlenka jakéhosi ‚menu‘. Tam by si uživatel mohl zvolit nejen ukončení, ale také jednotlivé příkazy (editace, kompilace, spuštění). Kromě toho si mohl zvolit pracovní soubor, no a pomalu z toho začalo vznikat vývojové prostředí.

Díky jeho funkcím jsem jej nazval skromně C write ‚n‘ run (Céčko – napiš a spusť) a od té doby, jsem jej používal a příležitostně i poupravil o nové funkce.

Postupnými úpravami se však objevilo několik chyb, a navíc, při příchodu na vysokou v září 2011 jsem prošel vstupním kurzem Linuxu, kde jsem se dozvěděl kupu nových informací, které mě přivedly k tomu, abych si C-wnr napsal komplet znovu. Stalo se tak, a vzniklo C-write ‚n‘ run 2.


Stažení C write ‚n‘ run 2.1 (9,3kB)

Upozornění: 13. prosince 2011 v kolem 13. hodiny byla vydána verze 2.1, která odstraňuje problém kompilace matematických funkcí (kompilátor ‚neznal‘ funkce z knihovny math.h) přidáním parametru -lm.

 

 

Krásou C-wnr je však to, že pouhou změnou několika málo příkazů (v podstatě jen jednoho jediného a textové omáčky kolem) tak můžete získat vývojové prostředí pro jazyk Pascal:

Pascal-wnr-2 dodám, až jej budu mít vytvořený.

nebo Java-write ‚n‘ run:

také dodám později.