Navigation
Page categories
Outline:
Last modification
2025-09-04
This is smol web. If you don't like it, fix your browser.

Trochu informací o cvičení z programování

Zápočet#

Na zápočet potřebujete splnit následující podmínky:

Pokud už umíte programovat v nějakém jazyce s pointery (tj. C, Pascal) a myslíte si, že požadavky pro vás budou triviální a můžete je bez potíží splnit rovnou, dejte mi vědět na hodině nebo mailem.

Zápočťáky#

Na zápočet potřebujete vymyslet, navrhnout a naprogramovat zápočtový program. Mělo by jít o nějaký menší projekt (cca 200 až 500 řádků smysluplného kódu) který neotřele řeší nějakou zajímavou nebo zábavnou úlohu. Cílem zápočťáku je prokázat, že umíte dát do kupy konzistentní kus software.

Vhodná témata jsou miniaturní rychlé hry, zpracovávače a formátovače textu, miniaturní programovací jazyky (želva/karel, malinké virtuální CPU, forth), konvertory mezi různými formáty dat (třeba vysázení programu do HTML, nebo vytahování nějakých informací z HTML) kalkulačky, všelijaké generátory (bludiště, fraktální a bezkontextové obrázky ), zpracovávače a upravovače obrázků a zvuků, pomůcky pro jiné matfyzácké úlohy (numerická řešení rovnic, limity, derivace, matice, …) nebo nějaké pěkné algoritmy a datové struktury (nějaké lepší stromy (třeba splay) nebo haldy (třeba binomiální) nebo třeba skiplisty).

Inspirace dále např. u Martina Mareše nebo třeba tady

Nevhodná témata jsou věci s příliš nejasným využitím nebo programy co jsou na internetu už dostupné v tisících kopií a různých variantách.

Na zápočťáku se hodnotí:

Termíny:

Pozor, “dohodnutí tématu v termínu” neznamená, že mi poslední den ve 23:59:59 přijde mail. Téma je potřeba prodiskutovat a odsouhlasit. Počítejte s tím, že první návrh většinou neprojde.

Téma a splněnost zápočťáků je evidovaná v SISu v grupíku (teď se tomu možná říká “studijní mezivýsledek”). Zkontrolujte si to, nesrovnalosti hlašte.

Testy#

Z každého testu jde dostat 2 body, celkem potřebujete 3 body z 6.

Výsledky testů je možné vidět v SISu!

Průběh cvičení#

2. 10. 2017#

Úvod a předběžnosti.

Motivační potíže k potřebě programovat: Problém s vážením, velbloud, odmocnina na počítači ze středověku.

DÚ:

9. 10. 2017#

Člověk je bottleneck, plechové počítače, logické obvody.

DÚ:

Až se zamyslíte, podívejte se na řešení: 2x NOT je skoro tohle, 3x NOT je nestabilní (a jde použít na generování náhodných čísel, třeba takhle).

16. 10. 2017#

Rychloúvod do Pascalu, nějaké jednodušší programy.

Zdrojáky z hodiny jsou tady (a budou se tam objevovat i další cvičení).

23. 10. 2017#

Pokračování úvodu do Pascalu, slovo o složitosti, nějaké lineární algoritmy. Obecné schéma programu na zpracování hromady čísel ukončené něčím speciálním (třeba nulou, jde s úpěchem aplikovat na všechny podobné programy).

bude v codexu, ale zkuste si rozmyslet:

30. 10. 2017#

Arraye, stringy, písmena.

(programy na histogram, ord/chr, číselné soustavy, binární násobení)

6. 11. 2017#

Arraye s délkou určenou za běhu programu, SetLength. Rekurze — obrácení posloupnosti, quicksort. Porovnávání stringů. Ignore-case quicksort implementujeme.

13. 11. 2017#

Trochu rekurze a arrayí navíc. Záznamový typ (record). Třídění excelem v lineárním čase (známější jako RadixSort). Programovali jsme v unixu protože FreePascalIDE selhalo.

20. 11. 2017#

TEST 1! Test proběhne na papír (vezměte si tužku a papír). Obsahem budou 2 jednoduché příklady, extrémně podobné některým, co jsme dělali na cvičení.

Ve zbytku času úvod do dynamických datových struktur.

27. 11. 2017#

Spojové seznamy a jejich použití: Definovali jsme (skoro-standardní) funkce list_new, list_push, list_pop, list_dispose, list_front, list_empty, list_reverse a list_move_head. Budeme je dost používat.

4. 12. 2017#

Dodělali jsme bucketsort a pár zbytkových věcí, nakousli jsme stromy a haldy.

Kostra na domácí úkol Dlouhý Div/Mod je tady. Váš kód patří tam, kde je TODO. Na příštím/popříštím cvičení to vysvětlím přesněji.

11. 12. 2017#

TEST 2 proběhne opět tužkou na papír, obsahem bude práce se spojovými seznamy.

Haldy.

18. 12. 2017#

Implementace haldy, heapsort.

Přehlídka metod prohledávání stavového prostoru: Vlna, BFS vs. DFS, IDFS, Dijkstra, prohledávání z obou směrů.

8. 1. 2017#

Zbytky: Dynamické programování, diskuse o počítání s velkými čísly, několik metod vyvažování stromů.

Bonusy!#

Kde sehnat Pascal?#
Jak vyrobit rozumný uživatelský interface pro jednoduchou zápočťákovou hru?#

Třeba takhle.

Jak si domácí úkol vyzkoušet ve stejném prostředí, jako ve kterém se vyhodnocuje?#

Potřebujete stroj s nějakým UNIXem (můžete si nainstalovat třeba virtuální ubuntu, ale v labu je dost počítačů na které se jde přihlásit odkudkoliv) a na něm nainstalovaný kompilátor FPC.

Do labu se přihlásíte takhle:

UNIXové prostředí je pro programování podstatně vhodnější než windows, jen se o nové uživatele moc nestará, takže je potřeba si sehnat nějaký návod. Ten dostanete až v rámcí úvodu do unixu v 2. semestru, mezitím si můžete přečíst třeba tohle . Potom:

  1. Pomocí WinSCP nahrajete program.pas na unixový počítač
  2. Pomocí Putty se tam přihlásíte, vlezete (cd) do adresáře, kam jste soubor nahráli
  3. napíšete fpc program.pas, vedle se vám vyrobí spustitelný soubor program
  4. program spustíte pomocí ./program. Když se rozbije, stačí Ctrl+C, to ho přeruší.

Pokud chcete i range checky apod., tak konkrétní příkaz, kterým (re)codex kompiluje programy je: fpc -g -O2 -Sg -Ci -Cr -Ct program.pas.

Trik: do souboru si můžete uložit testovací vstup.

  1. spustíte cat > test.in
  2. napíšete celý vstup
  3. ukončíte Ctrl+D (což je zkratka pro EOF. Když to omylem zmáčknete dvakrát, pošlete EOF i konzoli, takže vás odpojí. haha.)
  4. program spustíte pomocí ./program < test.in
  5. podobně si můžete schovat výstup programu: ./program <test.in >vysledek (a koukat se na něj: cat vysledek ).

Pokud chcete soubory editovat humánně přímo na místě, můžete zkusit vi program.pas. Vi je extrémně užitečný editor (aktuálně jeden ze dvou nejlepších editorů na planetě), pro nové uživatele samozřejmě smrtící. Je fajn si předtím zkusit vimtutor. V případě zoufalství použijte nano.