SIS code: 
Semester: 
zimní
E-credits: 
5
Examination: 
Z
Instructor: 

Programování 1

přednáší Tomáš Holan v úterý a Martin Pergel ve středu, cvičí Rudolf Rosa v pondělí 10:40-12:10 v SW2

Zápočtové programy

  • Téma je nutné se mnou předem dohodnout
    • do 15.12. v SISu navrhněte téma (klidně i dřív)
      • modul Studijní mezivýsledky
      • pole "zápočťák stručně": popište, co chcete dělat (max. 50 znaků)
      • pole "zápočťák podrobně": podrobně popište, co chcete dělat (3 až 10 vět)
    • jakmile tam něco vyplníte, SIS mi pošle mail a já na to v dohledné době kouknu
      • pokud mi zadání bude připadat dobré, tak ho rovnou v SISu schválím (pokud to máte povolené, SIS vám o tom pošle mail)
      • pokud mi zadání nebude připadat dobré, napíšu vám mail a doladíme to
    • téma si pokud možno vymyslete sami
      • to co si vymyslíte sami se vám nejlíp bude líp dělat a bude vás to víc bavit
      • pokud máte vágní nápad ale nevíte jak z toho udělat splnitelné zadání, popište mi to do mailu a já něco navrhnu
    • Holan má na webu hezky zpracované návrhy na témata
    • moje nehezky zpracované návrhy
  • Na zápočťáku začněte ve vlastní zájmu dělat co nejdříve
    • zkušenost ukazuje, že když si myslíte, že to budete mít za týden, bude to trvat spíš asi tak měsíc
    • je matfyzáckým zvykem na zápoč'ťáku dělat přes Vánoční prázdniny; ale během zkouškového na to taky asi budete mít nějaký čas
  • Zápočťák vypracujte do konce března
    • ale pokud chcete zápočet z Programování do konce února (pro účely kontroly studijních povinností), vypracujte ho nejpozději do konce zkouškového (tj. do 16.2.)
    • pokud zdrojáky zabalené v ZIPu projdou omezením na velikost v SISu, nahrajte je přímo do SISu ("zápočťák: kód (ZIP archiv)"); jinak zašlete e-mailem
  • Součástí zápočťáku je také dokumentace
    • ve zdrojových kódech používejte komentáře vysvětlující co která část kódu dělá
    • pokud to dává smysl, přiložte i testovací vstupní data
    • v SISu vyplňte položku "zápočťák: dokumentace"
      • můžete dokumentaci buď vepsat přímo v SISu ("zápočťák: dokumentace (text)")
      • anebo nahrát do SISu jako soubor ("zápočťák: dokumentace (soubor)")
    • dokumentace by měla obsahovat
      • popis řešené úlohy
      • popis vstupů, výstupů, ovládání
      • popis principu řešení
      • popis použitých datových struktur a algoritmů
      • Vaše vlastní zhodnocení kvality Vašeho řešení (pokuste se být upřímní)
    • dokumentace nemusí být zbytečně detailní
      • výše vidíte 5 bodů, co by dokumentace měla obsahovat, často tedy stačí dokumentace o 5 větách
      • dokumentace by měla zachycovat vše co je důležité či zajímavé (na co jste třeba hrdí)
      • dokumentace by se měla držet na vyšší úrovní abstrakce (popisovat některé důležité objekty a třídy užívané v programu je rozumné, popisovat každou jednotlivou proměnnou rozumné není)
    • nějaké tipy jak psát dokumentaci: https://ksvi.mff.cuni.cz/~kryl/dokumentace.htm
  • Až budete mít zápočťák hotový, napište mi mail a domluvíme se na termínu osobního předvedení
    • sejdeme se v labu
    • vy mi program předvedete
    • já si ho taky vyzkouším
    • podívám se na zdrojový kód
    • pokud budu spokojen, máte tímto zápočťák splněn
    • pokud ne, dám vám program dopracovat

Cvičení

Zde jsou k dispozici moje zdrojáky z úloh ze cvičení.

  • 4.11.2019 Rekurze
    • Faktoriál (rekurzivní i nerekurzivní)
    • Permutace (zpřeházení písmenek ve slově)
    • Problém kufru (matfyzák jede na dovolenou, je mu jedno co si vezme, hlavně aby to vyšlo přesně na 20 kg)
  • 11.11.2019 Rekurze, předávání parametrů do proměnných
    • primitivní typy, předávané kopií (int, str, bool)
      • změny uvnitř funkce neovlivní proměnnou vně funkce
    • referenční typy, předávané odkazem (list, dict)
      • přesněji předána je kopie adresy listu (a list listů obsahuje zase adresy těch vnořených listů...)
      • změny obsahu listu (a[0] = 10) mění i originál (adresa vede na stejný list)
      • změna celého listu (a = [10, 20, 30]) mění adresu (obsah proměnné se přepíše adresou nového listu), originál zůstává nezměněn
    • kopírování
      • žádné (kopíruje se jen adresa)
      • mělké (shallow, b = a.copy() nebo b = a[:]), kopíruje jen první úroveň listu (list v listu je adresa, zkopíruje se jen adresa)
      • hluboké (deep, import copy; b = copy.deepcopy(a)), zkopíruje se všechno do hloubky
    • rozbor domácích úloh
      • u placení mincí je možné buď předávaný list pokaždé zkopírovat, anebo ho změnit před zanořením a změnit zpátky po vynoření (backtracking), neboť jde o jednoduchou úlohu
      • u skákání jezdcem je kopírování příliš neefektivní (jde o složitější úlohu), je třeba držet si list jen jeden, před zanořením ho změnit (poznačit si, kam na šachovnici dělám další krok), a po vynoření ho změnit zpátky (provedený krok zase zrušit)
      • kontrola, zda jsem prošel celou šachovnici (jednoduchá: vždy zkontroluju všechny pozice; lepší: kontroluju všechny pozice jen když už nemám kam jít; ještě lepší: počítám si počet učiněných kroků, znám celkový počet kroků potřebný na projití právě celé šachovnice)
  • 18.11.2019
  • 25.11.2019
    • třídy a objekty, metody, dědičnost
    • lineární spojový seznam
    • úloha: tichá počta lidí, kteří různě komolí to co mají poslat dál
  • 2.12.2019
  • 9.12.2019
    • motivace
    • ošetřování vstupů, hlášení chyb, výjimky, assert
    • úloha: funkce mocnina(zaklad, exponent), měla by kontrolovat vstupy, rozumně hlásit chyby, atd.
    • kód
  • 16.12.2019

Pokyny

  • doporučený editor: Visual Studio Code (ale používejte cokoliv chcete)
  • účast je nepovinná (ale doporučená) -- pokud zvládnete snadno dělat domácí úkoly i bez účasti na cvičení, asi Vaše účast na cvičení není nutná
  • můžete používat i vlastní notebook

Domácí úkoly

Požadavky na zápočet

  • domácí úkoly: aspoň 80% bodů
  • zápočtový test: aspoň 80% bodů
    • 75 minut, v labu, v Recodexu
    • rozsah obdobný domácímu úkolu
    • 2 opravné pokusy
  • zápočtový program
    • zadání dohodnout do 15.12.
    • odevzdání doporučeno do konce zimního zkouškového, maximálně do konce března
    • nutnost osobního předvedení