Pavel Koupil Teaching NPRG030 · Programování 1

2023/2024

NPRG030 · Programování 1

Warning: This page is no longer current. It belongs to the previous run of the course and may contain outdated dates, materials, and requirements.

Basic Information

  • Anotace (zdroj: SIS)
  • Přednášející: Tomáš Holan, Martin Pergel
  • Cvičící: Pavel Koupil (pavel.koupil@matfyz.cuni.cz)
  • Přednášky
  • Rozvrh
    • Přednáška: Úterý 10:40 - 12:10 (místnost N1)
    • Přednáška: Středa 14:00 - 15:30 (místnost N1)
    • Cvičení: Čtvrtek 12:20 - 13:50 (místnosti N8)
  • Tabulka s body

Formal Requirements

  • Cvičení:
    • Účast na cvičení není povinná, ale je silně doporučována
    • Na každém cvičení lze za aktivní řešení příkladů získat až 2 body (celkem 24)
  • Domácí úkoly:
    • Během semestru Vám bude zadáno 10 domácích úkolů
    • Řešení domácího úkolu se nahrává do ReCodExu a odevzdávat lze opakovaně
    • Na vyřešení domácího úkolu budete mít vždy alespoň 13 dnů
    • Za každý vyřešený domácí úkol lze získat až 10 bodů
    • Pozdě odevzdané domácí úkoly budou penalizovány -2 body za každý započatý týden zpoždění
  • Semestrální práce:
    • Během semestru vypracujete zdokumentované a otestované softwarové dílo
    • Konkrétní požadavky jsou uvedeny v samostatném PDF (soubor pozadavky_na_semestralni_praci.pdf)
    • Za semestrální práci lze získat maximálně 40 bodů. Každý nesplněný požadavek bude penalizován
    • Pokud nezískáte alespoň 30 bodů za semestrální práci, máte ještě jeden opravný pokus. V případě opravy musíte získat 35 bodů
    • Pokud nezískáte alespoň 30 bodů na první pokus nebo alespoň 35 bodů z opravy, ztrácíte nárok na udělení zápočtu
  • Zápočtový test:
    • Na konci semestru proběhne praktický programovací test
      • Zadávaný a odevzdávaný do ReCodExu
    • Čas na vyřešení bude maximálně 90 minut
    • Test je třeba splnit na 100% bodů
    • Na test budete mít tři pokusy

Course Credit

  • Odevzdat všech 10 domácích úkolů a získat alespoň 60 bodů za řešení domácích úkolů a aktivitu během cvičení
  • Úspěšně odevzdat semestrální práci
  • Úspěšně projít zápočtovým testem

Schedule and Study Material

Date Content Supplementary Material Solution Homework
5. 10. 2023 Úvodní cvičení
NPRG030_01_Uvod.pdf
Požadavky na zisk zápočtu
Seznámení se s programovacím prostředím (IDE):
Visual Studio Code
PyCharm
Apache NetBeans
Proměnné a základní datové typy
Operátory
Komentáře
Uživatelský vstup a výstup
Větvení If...Elif...Else
Jak psát kód:
Komentáře a dokumentace
Popisné názvy proměnných
Používání konstant
Keep It Simple, Stupid (KISS)
Optimalizace kódu pro čitelnost
Složité výrazy
- Příklad 1.4: Hello World! (soubor hello_world.py)
Cvičení 1.5: Triviální kalkulačka (soubor trivial_calculator.py)
Cvičení 1.6: Lepší kalkulačka (soubor better_calculator.py)
-
12. 10. 2023 Řetězec a seznam
NPRG030_02_String_List.pdf
Datové typy
Řetězec (angl. String)
Formátování řetězců
Seznam (angl. List)
Zadání domácího úkolu
Odevzdávací systém ReCodEx:
Příručka pro nové uživatele ReCodExu (soubor NewUserDoc.pdf)
Vytvoření účtu a ověření emailové adresy
Nastavení uživatelského profilu
Zapomenuté heslo
Příručka pro studenty (soubor StudentDoc.pdf)
Zařazení do skupiny
Členství ve skupině a přehled zadaných domácích úloh
Odevzdání řešení
Vyhodnocení řešení
Zadání domácího úkolu:
BMI hodnocení (viz ReCodEx)
Termín odevzdání: 26. 10. 2023 23:59 GMT+2
Příklad 2.3: Formátování řetězce (soubor registrace.py)
Cvičení 2.4: Zřetězení textu (soubory zretezeni_1.py a zretezeni_2.py)
Cvičení 2.5: Oprava gramatiky editací řetězce (soubor oprava_textu.py)
Cvičení 2.6: Hledání v textu (soubor hledani_v_textu.py)
Cvičení 2.7: List (soubor pocet_slov.py)
Cvičení 2.8: Indexování listu (soubor indexovani_listu.py)
Cvičení 2.9: Editace listu (soubor upravy_listu.py)
Cvičení 2.10: Uspořádání slov podle abecedy (soubor usporadani_podle_abecedy.py)
Cvičení 2.11: Spojení dvou listů (soubor spojeni_listu.py)
-
19. 10. 2023 Cykly WHILE a FOR
NPRG030_03_Cykly.pdf
Cyklus while
Cyklus for
Jak psát kód:
Použití vestavěných funkcí a knihoven aneb nevymýšlej kolo
Vyhněte se hlubokému zanořování smyček a podmíněných příkazů
Použití funkce enumerate()
Zadání domácího úkolu
Zadání domácího úkolu:
TBD
Příklad 3.4: Iterace řetězcem a polem (soubor cykly_for.py a cykly_while.py)
Cvičení 3.5: Kreslení trojúhelníku (soubor trojuhelnik.py a trojuhelnik2.py)
Cvičení 3.6: Generátor hesel (soubor generator_hesel_for.py a generator_hesel_while.py)
Cvičení 3.7: Odhad pí metodou Monte Carlo (soubor pi.py)
Cvičení 3.8: Caesarova šifra (soubor caesarova_sifra.py)
-
26. 10. 2023 NPRG030_04_Funkce.pdf
Cvičení 4.7: Refaktorování a zobecnění kódu (soubor refaktoring.py)
Funkce
Jak psát kód:
Don't Repeat Yourself (DRY)
You Aren't Gonna Neet It (YAGNI)
Zásada jediné odpovědnosti (angl. single responsibility)
Stručné a nikoliv komplexní řádky kódu
Plochá struktura kódu
Omezení délky řádku
Používání nápovědy k typu (angl. type hints)
Docstrings pro dokumentaci funkcí
Early exit
Popisné názvy proměnných a funkcí
Globální proměnné a jejich vedlejší účinky
Kkonzistentní konvence pojmenování
Zadání domácího úkolu
Zadání domácího úkolu:
TBD
Příklad 4.3: Průměrná / minimální / maximální hodnota (soubory aritmeticky_prumer.py a min_max.py)
Cvičení 4.4: Řetězec bez samohlásek (soubory retezec_bez_samohlasek.py a retezec_bez_samohlasek_efektivneji.py)
Cvičení 4.5: Caesarova šifra (soubor caesarova_sifra_podruhe.py)
Cvičení 4.6: Řešení kvadratické rovnice (soubor kvadraticke_rovnice.py)
Cvičení 4.8: Násobení matic (soubor nasobeni_matic.py)
-
9. 11. 2023 NPRG030_05_Kolekce.pdf
N-tice (angl. tuple)
Množina (angl. set)
Slovník (angl. dictionary)
Jak psát kód:
Použití množin pro testování členství
Existenční a univerzální kvantifikátory
Zadání domácího úkolu
Zadání domácího úkolu:
TBD
Cvičení 5.3: Vzdálenost mezi body (soubor vzdalenost_bodu.py)
Cvičení 5.4: Unikátní slova (soubor unikatni_slova.py)
Cvičení 5.5: Frekvence slov (soubor frekvence_slov.py)
-
16. 11. 2023 Třídy a objekty
NPRG030_06_Tridy_A_Objekty.pdf
Třídy a objekty
Iterátory, generátory a iterable
Průchod spojovým seznamem
Jak psát kód:
Modularita a zapouzdření
Výčtové hodnoty
Zásady SOLID (single responsibility, open-closed, Liskov substitution, interface segregation, dependency inversion)
Volné spojení (angl. loose coupling)
Zbytečné přetěžování operátorů
Déméteřin zákon (princip minimální znalosti)
Dekorátory vlastností
Zadání domácího úkolu
Zadání domácího úkolu:
TBD
Příklad 6.3: Geometrické tvary (soubor geometricke_tvary.py)
Cvičení 6.4: Spojový seznam (soubor spojovy_seznam.py)
Cvičení 6.5: Iterátor (soubor iterator.py)
Cvičení 6.6: Generátor (soubor generator.py)
Cvičení 6.7: Iterable (soubory iterable_iterator.py a iterable_generator.py)
-
23. 11. 2023 Dědičnost a polymorfismus
NPRG030_07_Dedicnost_Polymorfismus.pdf
Dědičnost
Polymorfismus
Kompozice
Jak psát kód:
Používejte polymorfismus
Upřednostněte kompozici před dědičností
Zadání domácího úkolu
Zadání domácího úkolu:
TBD
Cvičení 7.3: Geometrické tvary II (soubor geometricke_tvary.py)
Cvičení 7.4: Nalezení největšího a nejmenšího tvaru (soubor polymorfismus.py)
Příklad 7.5: Poskládání automobilu z dílů (soubor dopravni_prostredky.py)
-
30. 11. 2023 NPRG030_08_Rekurze.pdf
Rekurze
Jak psát kód:
Používejte vyrovnávací paměť pro nákladné operace
Zadání domácího úkolu
Zadání domácího úkolu:
TBD
Cvičení 8.3: Binární vyhledávání rekurzivně (soubory binarni_vyhledavani_rekurzivne.py a binarni_vyhledavani_rekurzivne2.py)
Cvičení 8.4: Rekurzivní generování (soubor variace_bez_opakovani.py)
Cvičení 8.5: Rekurzivní generování II (soubory aritmeticke_operatory.py a aritmeticke_operatory_se_zavorkami.py)
-
7. 12. 2023 Výjimky, logování a ladění kódu
NPRG030_09_Vyjimky_Ladeni_Kodu.pdf
Cvičení 9.7: Debugging (soubor prumerne_hodnoceni.py)
Výjimky Try...Except...Finally
Logování a úrovně logování
Ladění kódu (angl. debugging)
Jak psát kód:
Elegantní zpracování výjimek
Lokální zpracování výjimek
Zadání domácího úkolu
Zadání domácího úkolu:
TBD
Příklad 9.3: Převod řetězce na číslo (soubor preved_na_cislo.py)
Cvičení 9.4: Vyhledání prvku v seznamu (soubor najdi_index.py)
Cvičení 9.5: Vytvoření vlastní výjimky (soubor obsah_obdelnika.py)
Cvičení 9.6: Logování (soubor preved_na_cislo_logovani.py)
-
14. 12. 2023 Práce se soubory
NPRG030_10_Soubory.pdf
Práce se soubory a správné ošetření pomocí výjimek
Formáty CSV, JSON, serializace a deserializace
Databázové systémy (čtení a zápis dat z/do databáze)
Jak psát kód:
Vyhněte se pevnému určení cest k souborům
Používejte správce kontextu (angl. context manager)
Zadání domácího úkolu
Doplňkové materiály:
osoby.json
osoby.csv
Zadání domácího úkolu:
TBD
Příklad 10.3: Kontrola existence souboru (soubory existence_souboru.py, existence_souboru2.py a existence_souboru3.py)
Cvičení 10.4: Deserializace z JSON souboru (soubory deserializace_json.py, deserializace_json2.py, deserializace_json3.py a deserializace_json4.py)
Cvičení 10.5: Serializace objektů do JSON souboru (soubory serializace_json.py, serializace_json2.py a serializace_json3.py)
Cvičení 10.6: Serializace a deserializace CSV (soubory prace_s_csv.py, prace_s_csv2.py a prace_s_csv3.py)
Příklad 10.7: Práce s databází PostgreSQL (soubor postgresql_priklad.py)
-
21. 12. 2023 Testování a moduly
NPRG030_11_Testovani_A_Moduly.pdf
Testování
Modularita programu
Jak psát kód:
Testování a vývoj řízený testy
Zadání domácího úkolu
Zadání domácího úkolu:
TBD
TBD -
4. 1. 2024 Numpy, pandas, scipy, django, matplotlib
NPRG030_12_Knihovny.pdf
Pip
Numpy
Pandas
Scipy
Django
Matplotlib
- TBD -
11. 1. 2024 Zápočtový test, Správa zdrojového kódu
Zápočtový test
Správa zdrojového kódu (GitLab)
- - -

Recommended Literature

  • TODO