SIS code: 
Semester: 
winter
E-credits: 
5
Examination: 
Z
Instructor: 

Programování 1 (kruh 33)

  • přednáší Martin Pergel ve čtvrtek 12:20
  • cvičí Rudolf Rosa ve středu 16:30-18:00 v N11
    • cvičení pro kruh 33 paralelky X bakalářských studentů informatiky
  • navazuje na cvičení Algoritmizace 1 s Pavlem Töpferem 15:40-16:25 v N11
    • cvičení Programování a Algoritmizace jsou svázaná, navštěvujte tedy na sebe navazující cvičení!
  • cvičení pro pokročilé má Martin Mareš ve čtvrtek (9:50-12:10 v N3)

Kdykoliv cokoliv potřebujete, napište mi na rosa@ufal.mff.cuni.cz (nebo mě oslovte po cvičení). Budu rád, když předmět e-mailu bude mimo jiné obsahovat kód předmětu (NPRG030), mám na to nastavené e-mailové filtry.

Obsah této stránky

Konzultace

  • cvičení budou doplňovat interaktivní konzultace
    • pravidelné konzultace během semestru jsou každou středu v N11 18:00-18:30 (tedy hned po cvičení, na stejném místě)
    • individuální konzultace si se mnou domlouvejte podle potřeby (napiště mi e-mail)
  • konzultace je pro vás, je to ideální příležitost, když s něčím potřebujete poradit nebo pomoct, například:
    • napsal jsem tenhle kus kódu a nefunguje to, proč?
    • něčemu jsem na cvičení nerozuměl a chtěl bych to vysvětlit znova a lépe
    • mám dotaz k něčemu ze cvičení nebo z přednášky
    • mám dotaz k něčemu co nebylo na cvičení ani přednášce
    • nerozumím zadání domácího úkolu
    • rozumím zadání domácího úkolu, ale potřebuju poradit, jak ho řešit
    • mám nějakou nejasnost/otázku/problém týkající se mého studia (ne nutně předmětu Programování 1)
    • atd.
  • jednak budu vyhlašovat hromadné konzultace, které se můžete účastnit všichni
  • jednak si budeme dle potřeby domlouvat soukromé konzultace
    • napište mi mail, pokud se chcete domluvit na konzultaci
    • některým z vás občas nabídnu konzultace i sám, třeba když si všimnu, že zjevně máte nějaké problémy -- ale raději se ozvěte sami, ne vždy si ne všeho všimnu

Cvičení 2021/2022

  • 29.9. hello world (sčítání, násobení, input)
  • 6.10. if (BMI)
  • 13.10. while (Colatz, ZOO)
  • 20.10. for (ZOO v listu)
  • 27.10. funkce (umocni)
  • 3.11. třídy a objeky (tichá pošta)
  • 10.11. spojáky (tichá pošta ve spojáku)
  • 17.11. je svátek a neučí se
  • 24.11. velké cviko Algoritmizace 15:40-18:00 s doc. Töpferem
  • 1.12. Algoritmizace normálně, Programování asi korespondenčně; soubory, dicty
  • 8.12. asi supl Tomáš Musil; rekurze
  • 15.12. uvidíme podle situace; prohledávání do hloubky a do šířky
  • 22.12. asi něco spíš lightweight, možná něco s grafikou (tkinter?)
  • 5.1. buď poslední cviko, anebo první zápočtový test (uvidíme jak budeme stíhat)

29.9.


6.10.

  • K úkolům
    • pozor na Recodex, je přísný!
    • print(): mezery, sep, end
    • str()
  • na přednášce bylo????
    • print, input (to už jsme cvičili posledně)
    • int, float, str?
    • if-elif-else?
    • while asi nebyl?
    • krokování asi nebylo? ale to si stejně zkusíme
  • zdvojovadlo: zeptá se uživatele na (celé) číslo, vypíše jeho dvojnásobek
    • ze vstupu dostanu string (textový řetězec), na číslo ho přetypuju takto:
      • cislo = int(text)
    • úprava: pro kladné číslo vypíše jeho dvojnásobek, pro záporné číslo vypíše jeho trojnásobek
  • zkusit si pustit program v terminálu, nezávisle na VS Code
    • Windows terminál: Win+R, cmd, Enter
    • Linux terminál: Ctrl+Alt+T
    • potřeba pomocí cd přejít do správného adresáře
      • cd C:\Nějaká\Cesta\Ke skriptům
      • např. "cd Documents", pokud si kódy ukládáte do dokumentů
      • možná taky "cd OneDrive\Documents" pokud Vaše dokumenty jsou ve skutečnosti OneDrive dokumenty
    • pak to nejspíš bude něco takového (na labových Windows jsme zjistili, že "python" spustí Python verze 2 a "py" spustí Python verze 3, takže chceme "py"):
      • py muj_program.py
      • python3 muj_program.py
  • umocňovadlo: zeptá se uživatele na (celé) číslo, vypíše jeho druhou mocninu
    • úprava: pro kladné číslo vypíše jeho druhou mocninu, pro záporné číslo vypíše jeho třetí mocninu
  • zkusit si krokovat program ve VS Code
  • hra: počítač si myslí číslo, uživatel ho hádá
    • import random
    • cislo = random.randint(0, 20)
    • uživatel hádá, dokud se netrefí, jinak program řekne, jestli to bylo moc nebo málo
      • na to bychom potřebovali cyklus... takže asi má uživatel prostě jen 1 pokus :-) ale zvládneme asi udělat 3 pokusy i bez cyklu
  • interaktivní výpočet BMI

    • napište jednoduchý program

    • program se zeptá uživatele na vstup, a to na jeho hmotnost (v kilogramech) a výšku (v metrech)

    • vypočítejte uživatelovo BMI, dle vzorečku hmotnost / výška2

    • vypište, zda má uživatel váhu v pořádku, či zda má podváhu či nadváhu

      • normální váha je při BMI 18.5 až 25, méně je podváha, více je nadváha

      • volitelně: vypište podrobnější hodnocení

      • volitelně: řekněte uživateli, jaké je pro jeho výšku rozmezí ideální váhy (např. od 85.7 kg to 98.2 kg)

      • volitelně: se znalostí průměrné hustoty lidského těla (1000 kg/m3) odhadněte objem uživatele, a spočítejte například, jaký by měl uživatel průměr a obvod, pokud by měl stejnou výšku ale tvar válce, případně jaký by měl průměr a obvod, pokud by měl tvar koule

  • domácí úkol zadám až po cvičení, podle toho co zvládneme udělat a jak nám to půjde

13.10.

  • na přednášce bylo
    • while
    • print -- to už jsme řešili
    • seznam (list) -- to možná procvičíme až příště, uvidíme
  • program: uživatele se na nic neptá, vypíše druhé mocniny čísel od 1 do 20
  • Collatz conjecture
    • "Vezměme jakékoliv kladné celé číslo n. Pokud je n sudé číslo, vydělíme jej dvěma, získáme tak n / 2. Pokud je n liché číslo, vynásobí se třemi, přičte se jedničku, tj. 3n + 1. Tento postup se dále opakuje. Domněnka je taková, že nezáleží na tom, jaké počáteční číslo n je zvoleno – výsledná posloupnost vždy nakonec dojde k číslu 1."
    • Vstup = číslo n, vypisujte jednotlivé kroky, nakonec vypište počet kroků.
  • inventura v zoo
    • každý řádek vstupu (každý input() ) je zvíře, např::
      • tygr
      • lev
      • luskoun
      • lenochod
      • tygr
      • lev
      • orangutan
      • bobr
      • tygr
      • kanec
      • ptakopysk
      • konec
    • vstup končí slovem "konec"
    • postupně několik úloh (všichni by měli zvládnout aspoň úlohy 1-6, podle času i víc až všechny)
      1. Čtěte vstup, pro každé zvíře vypište "V zoo je zvíře"
        • tj. například pokud je na vstupu ondatra, vypište "V zoo je ondatra"
      2. Je v zoo tygr?
      3. Kolik je v zoo kusů zvířat?
      4. Kolik je v zoo tygrů?
      5. Kolik je v zoo tygrů a kolik lvů?
      6. Porovnávání zvířat trapně
        • Vždy po dvě po sobě jdoucí zvířata A B vypište "A je lepší než B"
        • např. "orangutan je lepší než bobr"
        • tj. musíte si vždy pamatovat, které zvíře máte teď i které zvíře jste měli minule (a to co máte teď se stane pro další otočku cyklu zvířetem minulým)
        • a taky pro první zvíře ještě nemůžete nic říct, nejdřív musíte načíst dvě zvířata...
      7. Jak je dlouhý tygr? Tygr je dlouhý 4. A ptakopysk je dlouhý 9.
        • len("ptakopysk")
        • Vypište postupně každé zvíře v zoo a jeho délku.
      8. Jaká je celková délka všech zvířat v zoo?
      9. Jak dlouhé je nejdelší zvíře?
      10. A které to je?
      11. Porovnávání zvířat podle délek
        • Pro každá dvě po sobě jdoucí zvířata vypište, které je delší než které:
        • lev je kratší než oragnutan
        • orangutan je delší než bobr
        • bobr je stejně dlouhý jako tygr

20.10. cvičení výjimečně zkrácené do cca 17:20!!!

  • na přednášce bylo (?)
    • for
    • list (seznam, pole)
    • funkce? -- to můžem nechat na jindy
  • inventura v zoo pomocí listu a for-cyklu, další úlohy (předpokládám že stihneme zhruba prvních 11 úložek, uvidíme)
    1. Vytvořte si seznam zvířat v zoo jako list (s opakováním, některé zvíře může být víckrát).
    2. Vypište všechna zvířata.
    3. Kolik je v zoo tygrů?
    4. Vypište třetí zvíře.
    5. Vypište předposlední zvíře.
    6. Vypište prvních 10 zvířat.
    7. Vypište posledních 5 zvířat.
    8. Vypište každé druhé zvíře.
    9. Vypište všechna zvířata začínající na L.
    10. Vytvořte seznam všech zvířat začínajících na L (a nějak ho vypište).
      • Do seznamu se přídává pomocí seznam.append(zvire)
    11. Počet po sobě jdoucích zvířat od L.
      • Nechť občas po sobě následuje několik zvířat, která všechna začínají na L.
      • Meziúloha: pro každou sekvenci po sobě jdoucích zvířat od L vypište její délku.
      • Úloha: jaký je maximální počet po sobě jdoucích zvířat od L?
      • Aneb jaká je maximální délka souvislé posloupnosti zvířat začínajících na L?
      • Návodné myšlenky:
        • pokud jsem teprve začal, tak dosavadní maximální délka je 0
        • pokud aktuální zvíře nezačíná na L, tak aktuální délka posloupnosti zvířat na L je 0
        • pokud aktuální zvíře začíná na L, tak aktuální délka posloupnosti zvířat na L je o 1 vyšší než byla v předchozím kroku
        • je aktuální délka posloupnosti zvířat na L vyšší než dosavadní maximum?
        • v této úloze není nutné si pamatovat tu samotnou posloupnost zvířat, stačí si pamatovat její délku
      • Tip: vyřešení této úložky vám pomůže při řešení domácího úkolu.
    12. Vypište zvířata v maximální souvislé posloupnosti zvířat na L.
    13. Maximální počet po sobě jdoucích zvířat začínajících stejným písmenem.
    14. Vypište postupně všechna zvířata začínající na jednotlivá písmena slova dikobraz
      • ​​Pro procházení všech písmen slova můžete slovo nejdřív převést na seznam list("dikobraz")
      • Ale ani to není nutné, přes string jde i přímo iterovat for cyklem, takže stačí přímo použít
        • for pismeno in "dikobraz":
    15. Vypište nejdřív všechna zvířata začínající na a, pak všechna začínající na b, a tak dále, až po všechna začínající na z
    16. Z důvodu koronaviru Pražská zoo zkrachovala a všechna zvířata se přesunou do Plzeňské zoo.
      • Udělejte si dva seznamy zvířat, jeden pro Prahu a jeden pro Plzeň.
      • Spojte seznamy dohromady.
    17. Vzniká nová zoo na Kladně!
      • Vezměte zase seznam zvířat v Plzni a v Praze.
      • Na Kladno půjde první třetina zvířat z Prahy a poslední třetina zvířat z Plzně.
      • Délku seznamu zjistíte len(seznam)
    18. Křížení zvířat
      • Zkřižte zvířata, která jsou vedle sebe
      • Dvě zvířata zkřížíte tak, že vezmete první půlku prvního zvířete a druhou půlku druhého zvířete
      • Např. ovce+tygr = ovgr, kapybara+velbloud = kapyloud...
    19. Obrácená úloha: pro křížence najděte jeho rodiče

27.10.

  • na přednášce bylo
    • funkce -- na ty mrkneme
    • třídy a objekty -- ty si asi necháme na jindy
    • na Algoritmizaci už byly sorty, takže i ty procvičíme
      • vše bylo na přednášce Algoritmizace, případně si připomeňte například zde: https://youtu.be/ROalU379l3U
      • na cvičení jsme si udělali bubble sort, pořádně si to procvičíte v domácím úkolu
  • hlavní téma: funkce
    • stručně projít a ukázat to hlavní o funkcích
      • def umocni(zaklad, exponent=2):
            vysledek = zaklad**exponent
            return vysledek
        
        cislo = 5
        cislo_na_druhou = umocni(5)
        print(cislo_na_druhou)
        
        print( umocni(10) )
        
        print( umocni(10, 3) )
        
        print( umocni(zaklad=10) )
        
        print( umocni(zaklad=10, exponent=4) )
        
        print( umocni(exponent=4, zaklad=10) )
        
        print( umocni(10, exponent=4) )
        
    • co používat opatrně
      • funkce které mění to co dostaly jako vstupní argumenty (porušuje koncept "single-entry single-exit")
        • typicky by funkce měla vstupní argumenty používat read-only
        • výstup by si měla vyrobit ve vlastní proměnné (proměnných) a tu (ty) vrátit pomocí return
        • ale pokud třeba má funkce upravovat seznam, pak je neefektivní ho kvůli tomu kopírovat
          • příklad: setrid_seznam(seznam)
        • příklad: půjčíte kamarádovi fyzikální tabulky, aby si v nich něco našel, a on vám v nich přepíše vzorečky
        • příklad: půjčíte kamarádovi sešit, aby vám do něj napsal domácí úkol
    • co pokud možno NEpoužívat (kromě případu kdy k tomu máte dobrý důvod a víte co děláte)
      • definice funkce uvnitř definice funkce
        • to je zbytečně složité a navíc je to imho k ničemu
      • funkce které využívají globální parametry
        • je snesitelné je používat read-only (ale i tak je čistší je předávat přes argumenty)
        • je vysloveně nevhodné je měnit (a tam navíc snadno hrozí že to člověk naprogramuje špatně)
        • příklad: půjčíte kamarádovi tužku a on vám během psaní ještě sní svačinu
  • cvičení: funkce na úlohy z minulého cvičení
  • domácí úkol: sort
    • implementujte aspoň jednu metodu třídění
    • pokud jich implementujete víc, dostanete bonusové body
    • v kódu definujte a následně použijte aspoň jednu funkci!
  • Pozor, váš cvičící má problém rozlišovat pojmy funkce a metoda a volně je zaměňuje!
    • vy se to naučte tak jak se to učí na přednášce, ať pak nemáte problémy u zkoušky z Programování 2

3.11.

  • tip: cvičeníčka viz odkazy dole nastránce
  • domácí úkoly
    • délka podposloupnosti: asi OK (odevzdali prakticky všichni)
    • sorty: 13 odevzdalo (z toho 5 více než 1 sort), 10 zatím nikoliv
    • nové DÚ: tři "matematické" úložky (test prvočíselnosti, rozklad na součin prvočísel, převod do jiné číslené soustavy)
  • dnes: třídy a objekty
  • cvičení: tichá pošta
  • jednoduché objekty a metody
    • třída Clovek
    • má jmeno
    • má metodu rekni(text)
    • má metodu pozdrav
    • class Clovek:
          def __init__(self, jmeno):
              self.jmeno = jmeno
      
          def rekni(self, text):
              reknu = self.jmeno + ': ' + text
              print(reknu)
              return reknu
      
          def pozdrav(self):
              self.rekni("Ahoj, jsem " + self.jmeno)
      
      rudolf = Clovek('Rudolf')
      rudolf.rekni('ptakopysk')
      rudolf.pozdrav() 
  • dědičnost
    • řvoun je člověk, který řekne text NAHLAS
    • sprosťák je člověk, který promluvu končí "vole"
    • anonym je člověk, který neříká své jméno
    • zapomínáč je člověk, který zapomene první půlku toho co měl říct a řekne jen druhou půlku
    • pokémon je člověk, který umí říkat jen svoje jméno (třeba tak že místo každého slova řekne svoje jméno)
    • němý je člověk, který neříká nic
    • ...
    • class Rvoun(Clovek):
          def rekni(self, text):
              reknu = self.jmeno + ': ' + text.upper()
              print(reknu)
              return reknu
      
      petr = Rvoun('Petr')
      petr.pozdrav()
  • tichá pošta v listu
    • dám pár lidí do listu, postupně tichá pošta
    • zprava = "Na stropě je chleba s máslem, pošli to dál."
      lidi = [...]
      for clovek in lidi:
          zprava = clovek.rekni(zprava)
      
  •  

10.11.

  • lineární spojové seznamy (tzv. spojáky)
    • volitelně s hlavou, s ocasem, cyklické, obousměrné
  • procvičit u tabule?
  • cvičení: tichou poštu překlopit do spojáku
  • tichá pošta ve spojáku
    • lidi jsou ve spojáku, každý ví kdo je po něm
    • vytvořit (postupně)
    • projít (vypsat)
    • posílat si text (s rekurzí či bez rekurze)
    • def rekni(self, zprava):
          print(self.jmeno, zprava, sep=':')
          return zprava
      
      def rekni(self, zprava):
          zprava = zprava + " vole"
          print(self.jmeno, zprava, sep=':')
          return zprava
      
      clovek = Clovek("Petr")
      
      clovek.dalsi = ...
      
      while clovek.dalsi != None ...
      
      def posli_to_dal(self, zprava):
          zprava = self.rekni(zprava)
          if self.dalsi != None:
              self.dalsi.posli_to_dal(zprava)
    • vkládat (na začátek, na konec, za Petra, před Petra)
    • mazat (vše, poslední prvek, první prvek, Petra)
    • obrátit spoják
  • domácí úkol taky na spojáky

24.11. RuR není, bude velké cviko Algoritmizace 15:40-18:00 s doc. Töpferem

  • a někdy jindy bude velké cviko Programování 15:40-18:00 (asi příště, tj. 1.12.)

1.12. Změna změny, cviko Algoritmizace normálně, cvičení z programování asi korespondenčně

  • dnes: čtení ze souborů a psaní do souborů; dict
  • vím že BMI jsme už dělali, o to snazší to pro vás bude
  • koho by nebavilo dělat to co už dělal, tak si to upravte a dělejte něco jiného, například:
    • vstupem je nějaký textový soubor s textem v angličtině (třeba kus genesis)
    • část 1 přeskočte
    • část 2: spočítejte počet řádků a počet slov v textu, průměrný počet slov na řádek, průměrnou délku slova ve znacích... vypište celý text ale z každého slova vypište jen první 3 znaky... vypište jen slova začínající velkým písmenem ("Aaaa".istitle())...
    • část 3: vypište výsledek do souboru místo na standardní výstup
    • část 4: vyrobte si v dictu malý překladový slovníček a pomocí něj některá anglická slova ze vstupu přeložte do češtiny a vypište text takto částečně přeložený (pokud je slovo ve slovníčku, vypište ho česky, pokud ne, vypište původní anglické slovo); případně i interaktivní mód kde načtete slovníček ze souboru do dictu, uživatel pak zadá slovo/slova a vy slovo po slově přeložíte
    • zkrátka postupujte přibližně podle popisu cvičení níže, akorát prostě místo BMI pracujte s textem...
  • cvičení: výpočet BMI (volitelné součásti dělejte jen pokud chcete a jen pokud máte hotový základ)
    • část 1: interaktivní výpočet BMI -- tohle už máte hotové ze dřív
      • napište jednoduchý program (který pak budeme v dalších částech cvičení upravovat)
      • program se zeptá uživatele na vstup, a to na jeho hmotnost (v kilogramech) a výšku (v metrech)
      • volitelné: přijímejte vstup v různých formátech (například s desetinnou čárkou místo desetinné tečky)
      • vypočítejte uživatelovo BMI, dle vzorečku hmotnost / výška2
      • vypište, zda má uživatel váhu v pořádku, či zda má podváhu či nadváhu
        • normální váha je při BMI 18.5 až 25, méně je podváha, více je nadváha
        • volitelně: vypište podrobnější hodnocení
        • volitelně: řekněte uživateli, jaké je pro jeho výšku rozmezí ideální váhy (např. od 85.7 kg to 98.2 kg)
        • volitelně: se znalostí průměrné hustoty lidského těla (1000 kg/m3) odhadněte objem uživatele, a spočítejte například, jaký by měl uživatel průměr a obvod, pokud by měl stejnou výšku ale tvar válce, případně jaký by měl průměr a obvod, pokud by měl tvar koule
    • část 2: načíst vstupy ze souboru
      • vstup je teď v souboru, který má na každém řádku tři informace oddělené mezerou: jméno hmotnost výška
      • soubor si vyrobte, může vypadat např. takhle:
        • Rudolf 83.3 1.78
          Anna 56.2 1.62
          August 130 1.3
      • načítejte postupně data ze souboru; vyberte si jednu z možností jak pracovat se souborem:
        • drzadlo = open('vstup.txt', 'r')
          for radek in drzadlo:
              polozky = radek.split()
        • with open('vstup.txt', 'r') as drzadlo:
              for ...
      • nastudujte si jak funguje na stringách metoda split()
        • podle nějakého oddělovače naseká string na kousky a vrátí to jako list
        • pokud zadáte oddělovač -- třeba '.' -- tak kousky oddělené oddělovačem budou tvořit prvky vráceného listu (a můžou být i prázdné)
          • "Ahoj. Já jsem Rudolf... Super, že.".split(".")
            # vrátí následující list:
            ["Ahoj", " Já jsem Rudolf", "", "", " Super, že", ""]
        • pokud ale oddělovač nezadáte, split se chová magicky, oddělovačem je jeden nebo několik bílých znaků (mezera, konec řádku, tabulátor...) a vrácený seznam nemá prázdné prvky; což právě člověk dost často chce!
          • "   Ahoj já jsem      Rudolf    ".split()
            # vrátí následující list:
            ["Ahoj", "já", "jsem", "Rudolf"]
      • pokud máte soubor ve stejné složce ve které spouštíte Python, mělo by to fungovat
      • pokud máte soubor jinde, můžete zadat místo názvu souboru celou cestu, např.: 
        • open('C:\Documents and Settings\Dokumenty\vstup.txt', 'r')
      • v Recodexu vždy bude soubor ve stejné složce takže stačí jen jméno souboru
      • pro každý řádek spočítejte BMI člověka a vypište hodnocení na výstup
      • volitelně: spočítejte a vypište nějaké statistiky celého souboru, například průměrnou výšku, hmotnost a bmi, směrodatné odchylky, počet lidí s jednotlivými kategoriemi dle BMI, medián BMI, modus kategorie BMI...
    • část 3: vypsat výstupy do souboru
      • hodnocení jednotlivých lidí nepište na standardní výstup, ale do souboru; vyberte si jednu z možností jak pracovat se souborem (když soubor po psaní nezavřu, tak se to co jsem do něj psal neuloží!):
      • zapisovadlo = open('vysledek.txt', 'w')
        ...
        print(a, b, c, file=zapisovadlo)
        ...
        zapisovadlo.close()
      • with open('vysledek.txt', 'w') as zapisovadlo:
            ...

        (zavře se samo)
      • volitelně: uživatel má možnost si zadat jména souborů (ale pokud nezadá, použije se nějaká výchozí hodnota)
      • volitelně: vytvořte i druhý soubor, kam zapíšete souhrnné statistiky
    • část 4: načíst data ze souboru, pak interaktivně odpovídat na dotazy o jednotlivých lidech
      • budeme potřebovat dicty
        • dict lze chápat jako slovník, ale lepší je to chápat jako tabulku o dvou sloupcích
          • první sloupec je klíč, ten musí být unikátní a musí to být nějaký jednoduchý typ (string, int, float, tuple), pod klíčem do dictu ukládáme hodnoty a zase je v něm hledáme
          • druhý sloupec je hodnota, která je tam pod daným klíčem uložená, a může být libovolného typu (string nebo jiný jednoduchý typ, ale klidně i celý list, dokonce i dict, tj. můžete například mít dict dictů...)
        • takže například takovýhle dict:
          • mesice = dict()
            mesice['leden'] = 31
            mesice["unor"] = 28
            mesice[2] = 28
        • odpovídá takovéhle tabulce:
          • klíč hodnota
            'leden' 31
            'únor' 28
            2 28
        • stejné hodnoty se můžou opakovat, ale klíče nikoliv -- pokud pro stejný klíč potřebujete uložit víc hodnot, musíte to nějak obejít, například tam pro ten klíč jako hodnotu uložit list a do něja dát ty jednotlivé hodnoty které tam chcete mít
        • čtení i zapisování se u dictu dělá přes notaci dict[klíč], a na přítomnost klíče se můžu ptát pomocí "in", např.:
          • mesice[2] = 29  # už existovalo, změnil jsem
            mesice[3] = 31  # ještě neexistovalo, vytvořil jsem
            delka_ledna = mesice['leden']
            delka_brezna = mesice['brezen']  # spadne, klíč neexistuje!
            if 'brezen' in mesice:  # True pokud klíč existuje, nespadne
                delka_brezna = mesice['brezen']
            else:
                print('Délku března neznám.')

             
      • a teď k úloze
        • data o lidech ze vstupního souboru si uložte do dictu
        • klíčem je jméno, hodnotou je BMI
        • obezity = dict()
          ...
          obezity[jmeno] = hodnoceni
        • interaktivně se ptejte uživatele na jméno člověka
        • pokud člověka znáte, vypište jeho BMI a hodnocení
        • pokud ne, oznamte to
        • if klic in muj_dict:
              hodnota = muj_dict[klic]
      • volitelně: interaktivní část je ve while cyklu, v každé obrátce odpoví na jeden uživatelův dotaz na jméno
      • +volitelně: po zadání speciálního vstupu (např. "konec") vypíše souhrnné statistiky o lidech, na které se uživatel ptal, a ukončí se
      • +volitelně: v cyklu jen uživatel zadává jména, program jen potvrzuje, po ukončení speciálním vstupem vypíše výstupy do souboru
      •  

8.12.

  • rekurze

15.12.

  • prohledávání do hloubky a do šířky

22.12.

  • grafika

5.1.

  •  

 

Pokyny

Požadavky na zápočet

  • domácí úkoly: aspoň 80% bodů
  • zápočtový test: aspoň 100% bodů
    • na konci semestru nebo na začátku zkouškového období
    • 75 minut, v Recodexu
    • pokud bude prezenční výuka, pak bude test na počítači v učebně, pokud ne, tak budeme na Zoomu
    • 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í (fyzicky nebo přes Zoom)

Domácí úkoly

Zápočtové programy

No need to thank me

  • Jedním z požadavků na zápočet je, aby každý z vás samostatně stvořil větší prográmek, který bude něco dělat.
    • Zadání si v tomto případě vymýšlíte sami, může to být úplně cokoliv
    • Mělo by to být něco většího než běžný domácí úkol, tak zhruba na úrovni tří domácích úkolů v jednom.
    • Můžete využívat libovolné existující knihovny a nástroje, ale musíte tam i nějakou podstatnou část naprogramovat sami.
  • 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 13.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í)
    • psaní dokumentace je dobrým cvičením například na v budoucnu vás čekající psaní bakalářské práce
    • 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

Další informace

  • kromě domácích úloh vřele doporučuji následující sbírku zejména jednodušších programovacích úloh: https://codingbat.com/python
    • podobně jako v Recodexu je kód automaticky vyhodnocen
    • narozdíl od Recodexu i vidíte správné i chybné vstupy i výstupy
  • nebo například zde: