mff

Markéta Popelová - Výuka

Programování 1

Ukázky programů ze cvičení - Programování 1

2. hodina (11.10.2012)

  1. Vyhledávání v setříděném seznamu - algoritmus zapsaný v pseudokódu.

3. hodina (18.10.2012)

  1. Načítání čísel I. - načtení n čísel: ukázka použití for-cyklu. Ke stažení: code.pas.
  2. Načítání čísel II. - načtení posloupnosti čísel ukončených -1: ukázka použití while-cyklu. Ke stažení: code.pas.
  3. Mini kalkulačka - procvičení podmínky (if). Ke stažení: code.pas.

4. hodina (25.10.2012)

  1. Dělitelé v intervalu - procvičení podmínky for-cyklu a operace mod. Ke stažení: code.pas.
  2. Kladná čísla - procvičení while-cyklu (trochu jiné zadání než na hodině). Ke stažení: code.pas.
  3. Obrácený výpis n čísel - procvičení for-cyklu a pole. Ke stažení: code.pas.
  4. Test prvočíselnosti I. - elegantní (ale ne ideálně efektivní) řešení pomocí while cyklu. Ke stažení: code.pas.
  5. Test prvočíselnosti II. - efektivnější řešení pomocí for-cyklu a boolean proměnné. Ke stažení: code.pas.

5. hodina (1.11.2012)

  1. Testík 1 - princezniny korále: první řešení. Ke stažení: code.pas.
  2. Testík 2 - princezniny korále: druhé řešení. Ke stažení: code.pas.
  3. Hádanka 1 - aneb pozor na indentaci, begin a end. Ke stažení: code.pas.
  4. Hádanka 2 - kreslení z hvězdiček. Ke stažení: code.pas.
  5. Hádanka 3 - aneb pozor na indenatci a středníky. Ke stažení: code.pas.
  6. Hádanka 4 - aneb pozor na závorky a prioritu operací. Ke stažení: code.pas.
  7. NSD 1 - pomalá verze Euklidova algoritmu. Ke stažení: code.pas.
  8. NSD 2 - pokus o rychlejší verzi, ale s chybou. Ke stažení: code.pas.
  9. NSD 3 - rychlejší verze Euklidova algoritmu. Ke stažení: code.pas.
  10. Faktoriál malého čísla - ukázka funkce. Ke stažení: code.pas.
  11. Kódy všech znaků - operace chr. Ke stažení: code.pas.
  12. Je zadaný znak cifra? - ukázka funkce a použití ord. Ke stažení: code.pas.
  13. Hodnota cifry - ukázka funkce a použití ord. Ke stažení: code.pas.

6. hodina (8.11.2012)

  1. Testík - funkce jeZnak. Ke stažení: code.pas.
  2. Opisovač vstupu - detekce konce vstupu pomocí EOF, načítání vstupu po znacích. Ke stažení: code.pas.
  3. Jednoduchý devypatlátor - použití ord, chr, převody znaků. Ke stažení: code.pas.
  4. Hornerovo schema - načítání čísla (v desítkové soustavě) po znacích a převedení na integer. Ke stažení: code.pas.
  5. Z dvojkove - načtení čísla zadaného v dvojkové soustavě a převedení na integer pomocí Hornerova schematu. Ke stažení: code.pas.
  6. Rekurzivní výpis sestupný - ukázka jednoduché lineární rekurze na sestupný výpis čísel. Ke stažení: code.pas.
  7. Rekurzivní výpis vzestupný - ukázka jednoduché lineární rekurze na vestupný výpis čísel. Ke stažení: code.pas.
  8. Ladění v Pascalu - součást úkolu - na tomto (chybném) programu si vyzkoušejte ladící prostředky Pascalu a odhalte všechny chyby. Ke stažení: code.pas.
  9. Soubory 1 - převod velkých písmen na malá - ze standardního vstupu na standardní výstup. Ke stažení: code.pas.
  10. Soubory 2 - převod velkých písmen na malá - ze souboru na standardní výstup. Jako vstup můžete použít například tento soubor in1.txt. Ke stažení: code.pas.
  11. Soubory 3 - převod velkých písmen na malá - ze souboru do souboru. Jako vstup můžete použít například tento soubor in1.txt. Výstup hledejte v souboru out1.txt. Ke stažení: code.pas.
  12. Soubory 4 - výpis kódů všech znaků do souboru. Výstup hledejte v souboru znaky.txt. Ke stažení: code.pas.

7. hodina (15.11.2012)

  1. Testík - Str2Int. Ke stažení: code.pas.
  2. Parametry 1 - předávání odkazem a hodnotou. Ke stažení: code.pas.
  3. Parametry 2 - předávání odkazem a hodnotou. Ke stažení: code.pas.
  4. Parametry 3 - předávání odkazem a hodnotou. Ke stažení: code.pas.
  5. Generování 1 - generování čísel o K cfirách v jedničkové soustavě. Ke stažení: code.pas.
  6. Generování 2 - generování čísel o K cfirách ve dvojkové soustavě. Ke stažení: code.pas.
  7. Generování 3 - generování čísel o K cfirách v soustavě o základu N. Ke stažení: code.pas.

8. hodina (22.11.2012)

  1. Testík - část 1 - funkce, procedury a předávání odkazem a hodnotou. Ke stažení: code.pas.
  2. Testík - část 2 - funkce, procedury a předávání odkazem a hodnotou. Ke stažení: code.pas.
  3. Testík - část 3 - funkce, procedury a předávání odkazem a hodnotou. Ke stažení: code.pas.
  4. Faktoriál - ukázka jednoduché nevětvící se rekurze. Ke stažení: code.pas.
  5. Mocnina - ukázka jednoduché nevětvící se rekurze. Ke stažení: code.pas.
  6. Součet - ukázka jednoduché nevětvící se rekurze. Ke stažení: code.pas.
  7. Binární vyhledávání - ukázka nevětvící se rekurze. Ke stažení: code.pas.
  8. Rozklad na sčítance - již větvící se trošku složitější rekurze. Ke stažení: code.pas.
  9. Batoh 1 - část domácího úkolu - co (a jak) dělá tento rekurzivní program? Ke stažení: code.pas.
  10. Batoh 2 - část domácího úkolu - co (a jak) dělá tento rekurzivní program? Ke stažení: code.pas.

9. hodina (29.11.2012)

  1. Dlouhá čísla - ukázka sčítačky celých (tedy kladných i záporných) čísel. Použití vlastního datového typu a recordu. Nejedná se zrovna super-krátké řešení, ale zase je pěkně dekomponované. Ke stažení: code.pas.

11. hodina (13.12.2012)

  1. Fronta - povídání o datové struktuře fronta.
  2. UnitData - jednotka obsahující datový typ pro položky, které budeme ukládat do zásobníku či fronty. Ke stažení: code.pas.
  3. UnitZasobnik - jednotka obsahující datovou strukturu zásobník včetně základních operací pro práci se zásobníkem. Ke stažení: code.pas.
  4. Test zásobníku - program testující, zda nám zásobník funguje správně. Ke stažení: code.pas.
  5. UnitFronta - chcete-li domácí úkol napsat jako knihovnu, můžete vyjít z tohoto kódu. Ke stažení: code.pas.

Fronta

V seznamu označovaném jako fronta se pracuje s uloženými daty takovým způsobem, jaký odpovídá čekání lidí ve frontě v běžném životě. Přicházející se řadí za sebe; kdo dřív přišel, bude dříve obsloužen a odejde. Do seznamu dat typu fronta jsou proto na jednom konci („příchod“) vkládány nové prvky, zatímco z druhého konce („odchod“) jsou odebírány prvky vyřazované. V anglicky psané literatuře bývá fronta označována jako FIFO (first in - first out).

Fronta se v programech používá tehdy, pokud potřebujeme dočasně odložit nějaká data a zachovat pro další zpracování jejich původní pořadí. Slouží jako základní datová struktura pro řízení průchodu do šířky. Její programová realizace polem i dynamicky je o něco komplikovanější, než tomu bylo v případě zásobníku.

Implementace fronty pomocí pole

Frontu můžeme naprogramovat pomocí pole, pokud známe horní odhad její maximální možné délky. Budeme přitom potřebovat dvě celočíselné proměnné, které budou udávat indexy těch prvků pole, kde je uložen první prvek fronty (tj. začátek fronty, odchod) a poslední (konec fronty, příchod). Opakovanými operacemi vkládání a vypouštění prvků se budou hodnoty obou těchto proměnných stále zvyšovat, jak se bude směrem k vyšším indexům posunovat obsazená část pole. Tak by se mohlo po čase stát, že ačkoli aktuální délka fronty nikdy nepřekročí velikost pole, nebude možné vložit do fronty další údaj, neboť poslední prvek pole bude obsazen. Na toto nebezpečí existují tři základní varianty řešení:

  • Intuitivní: Posouvat v poli všechny prvky fronty o jedno místo směrem k nižším indexům při každém vypuštění prvku. Díky tomu bude začátek fronty neustále udržován v prvním prvku pole. Postup je to správný a na naprogramování jednoduchý, ale dost neefektivní.
  • Lepším řešením je posouvat v poli frontu pouze tehdy, když je to nutné, tj. není-li již kam vložit novou hodnotu. V takové situaci se obsah pole přemístí najednou tak, aby fronta začínala v prvním prvku pole. Proti předchozímu řešení se přesuny prvků provádějí najednou o větší vzdálenost a méně často, výpočet je proto celkově rychlejší.
  • Nejlepší pak samozřejmě je data uložená v poli vůbec nepřesouvat. Představíme-li si, že pole je jakoby zatočené dokola a že po posledním prvku pole následuje opět první prvek, při vlastní programové realizaci nám pak stačí pouze přepočítávat indexy. Trochu složitějším se stane testování neprázdnostni fronty (při odebírání prvku) nebo zda by její délka přidáním dalšího prvku nepřekročila kapacitu pole. Pro tento účel je vhodné zavést ještě jednu celočíselnou proměnnou, která bude udávat počet prvků ve frontě.

Kdo byste našel v nějakém z těchto programů chybu, dejte mi to vědět - můžete tak získat bonusové body (1 chyba ≈ 5 bodů). ;)

© Markéta Popelová 2009 - 2012