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.
program dlouha_cisla_scitacka;
{ Tento program obsahuje předevčím sčítačku dvou kladných dlouhých čísel. Jako typ čísla se používá TCislo.
  Hlavní program jednoduše testuje naši sčítačku. Vygeneruje si dvě náhodná čísla (dlouhá 0 až MAX cifer),
  sečte je a výsledek vypíše.}

const MAX = 300;

type TCifry = array[0..MAX] of 0..9;
    TCislo = record
        cifry : TCifry; { Na indexu nula je 10^0, na indexu i je 10^i.  }
        delka : 0..MAX; { Cislo je v poli cifry na indexech 0...delka. }
        kladne : boolean;
     end;

var A,B,C : TCislo;
    i:integer;

{ Sčítá dvě kladná dlouhá čísla typu TCislo. Všechny parametry jsou předávané odkazem - první dva kvůli tomu,
abychom zbytečně neplýtvali pamětí, třetí proto, že v něm bude uložen výsledek. }
procedure scitacka( var A,B,C : TCislo );
var i, prenos : integer;
begin
  { Nejdříve si předpřipravíme proměnnou pro výsledek.
    Víme, že výsledek bude kladný. Předpokládejme, že bude tak dlouhý, jako delší ze sčítanců. }
  C.kladne:=true;
  if (B.delka>A.delka) then
    C.delka:=B.delka
  else
    C.delka:=A.delka;

  { Zde začíná již samotné sčítání. Budeme sčítat cifry od nejnižšího řádu. Do výsledného pole zapíšeme
  součet mod 10 a do příště si budeme pamatovat přenos jako součet div 10. }
  prenos := 0;
  for i:= 0 to C.delka do
    begin
      C.cifry[i] := (A.cifry[i] + B.cifry[i] + prenos) mod 10;
      prenos := (A.cifry[i] + B.cifry[i] + prenos) div 10;
    end;

  { Teď jen musíme ošetřit případ, kdy byl nakonci přenos ostře větší jak 0. Pak tento přenos uložíme
  do výsledného čísla C a zvětšíme délku čísla C. }
  if (prenos>0) then
    begin
        inc(C.delka);
        C.cifry[C.delka]:=prenos;
    end;
end;

{ Tato procedura vypisuje kladné dlouhé číslo typu TCislo. }
procedure vypis( var A : TCislo );
var i:integer;
begin
  for i:=A.delka downto 0 do
    write(A.cifry[i]);
  writeln;
end;

begin
  { Pro generování pseudonáhodných čísel používáme příkazy randomize; (připraví náhodný generátor)
  a random(x), který vrací pseudonáhodné čísel z rozsahu 0...x-1. }
  randomize;
  A.kladne:=true;      { Naše čísla v tomto ukázkovém příkladu budou vždy kladná. }
  A.delka:=random(MAX); { Vygenerujeme náhodnou délku čísla, nejvýše však MAX-1. }
  B.kladne:=true;
  B.delka:=random(MAX);

  for i:=0 to A.delka-1 do  { Číslo vyplníme náhodnými ciframi. }
    A.cifry[i]:=random(10);
  for i:=A.delka+1 to MAX do  { Zbytek pole vynulujeme. }
    A.cifry[i]:=0;
  for i:=0 to B.delka-1 do
    B.cifry[i]:=random(10);
  for i:=B.delka+1 to MAX do
    B.cifry[i]:=0;

  A.cifry[A.delka]:=random(9)+1;  { Cifra nejvyššího řádu nesmí být nulová. }
  B.cifry[B.delka]:=random(9)+1;

  vypis(A); { Vygenerovaná čísla si vypíšeme. }
  writeln('+');
  vypis(B);
  writeln('=');
  scitacka(A,B,C);  { Zde čísla sečteme, výsledek bude uložen v C. }
  vypis(C); { Výsledek vypíšeme. }
end.

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