NPRG041 - Programování v C++
Podmínky pro udělení zápočtu a pokyny pro zápočtové programy
GitLab
- průběžná práce na cvičeních a na zápočtovém příkladu všichni jednotně v MFF GitLabu
- https://gitlab.mff.cuni.cz/
- před začátkem semestru musíte mít účet na GitLabu (pod MFF loginem)
- dostanete repository teaching/nprg041/2024-25/cvicici/student
- do GitLabu patří veškeré zdrojové, konfigurační, projektové a datové soubory; rozhodně tam ale nepatří vygenerované nebo dočasné soubory typu .obj, .tmp, .dbg apod.
- na počítačích s Windows doporučujeme klienta TortoiseGit
- pravidelná práce a dokončené a odladěné příklady ze cvičení v GitLabu (včetně absencí!)
- vypracování posledního domácího úkolu (zadání cca v první polovně prosince) - ReCodex
- vypracování předchozích DÚ není povinné, ale feedback vás pomůže připravit
- úspěšné složení zápočtového testu (poslední cvičení semestru v labu na školním počítači)
- zadání bude založeno na posledním DÚ, proto je ve vašem zájmu ho vypracovat co nejlépe a odstranit případné připomínky
- je povinností studentů se důkladně seznámit s vývojovým prostředím na školních počítačích
- zadání zápočtového programu do termínu určeném cvičícím (obvykle v druhé polovině semestru)
- technologické demo (obvykle na konci semestru)
- bezproblémové (polo-)automatické sestavení a spuštění prázdného programu obsahujícího všechny potřebné knihovny na všech podporovaných platformách
- průběžné používání Gitlabu po dobu celého vývoje zápočtového progamu
- nahrání výsledných zdrojových kódů před odevzdáním je nepřípustné
- odevzdání kompletně hotového a odladěného zápočtového programu nejpozději do termínu určeném cvičícím (obvykle koncem letního semestru)
- poslední možné odevzdání všech oprav zápočťáku do termínu určeném cvičícím (obvykle během letního zkouškového období)
- jakékoliv individuální podmínky lze domluvit pouze na začátku semestru, případně bezprostředně po výskytu neočekávané závažné události
Zápočtový programu
- kompletní vývoj a odevzdávání pouze přes MFF GitLab
- lze přijít (po předchozí domluvě) předvést osobně
- repository musí obsahovat kompletní historii vývoje a vše potřebné pro kompilaci a sestavení
- je nutné používat Gitlab během celého vývoje, nikoliv jen pro nahrání výsledných zdrojových kódů
- .sln/.prj/cmake/makefile - minimálně pro linux (gcc) a win (VS)
- nestandardní knihovny, hlavičkové soubory apod.
- tj. nikoliv 'stáhněte si knihovnu XX a framework YY, zkompilujte a nakonfigurujte ...',
opravdu nejde instalovat speciální knihovny pro každý z cca 50 zápočtových programů každý rok
- výjimečné případy lze předem domluvit individuálně
- vše (včetně sestavení a spuštění) si vyzkoušejte na jiném prostředí
- jiný počítač se stejným OS, kde jste nevyvíjeli a nemáte předem nainstalované vše potřebné
- počítač s jiným OS a překladačem - multiplatformnost
- mělo by jít automaticky stáhnout projekt, spustit build (linux, VS) a spustit program; pokud ne, dolaďte to do tohoto stavu
- s programem vždy dodejte dostatečně rozsáhlá data tak, aby bylo možné demonstrovat všechny podstatné vlastnosti programu
- mělo by být samozřejmostí:
- na korektní data musí program vždy dávat správné výsledky (samozřejmost)
- na žádných vstupních datech nesmí nekontrolovaně skončit (neošetřená výjimka, zacyklení, reference neexistující paměti, nedefinované chování apod.)
- odevzdání musí obsahovat programátorskou a uživatelskou dokumentaci
- za dokumentaci není považován výstup nástrojů typu doxygen - v dokumentaci by mělo být popsané to, co ve zdrojových souborech není
- efektivita a kvalita kódu
- dekompozice, encapsulace, robustnost, udržovatelnost, rozhraní, platformní nezávislost, separace aplikační logiky a I/O / GUI, komentáře, efektivní využití jazyka a standardních knihoven, elegance a estetika ...
- externí knihovny a frameworky
- použití vhodných externích knihoven nic nebrání
- nutné uvést předem ve specifikaci zápočťáku, podléhají schválení a prezentaci funkčnosti v rámci technologického dema
- použití konkrétní externí knihovny musíte nastudovat samostatně
- používejte pouze platformově nezávislé knihovny; platformově závislé (tj. jen pro OS XY) jen po předchozím explicitním schválení cvičícím
- nejsou vhodné ty knihovny/framworky, které brání použití aktuálního C++ (C++20/C++23), vnucují vlastní typy místo standardních apod.
- hodnotí se to, co sami naprogramujete (tj. jednoduché zavolání superúžasné knihovny není vhodný zápočťák)
- před vlastním programováním ověřete funkčnost 'technologického dema', tj. sestavení triviálního programu včetně všech externích závislostí a jeho deployment na 'čistý' počítač
- kompilace, sestavení a spuštění předem na různých platformách (tj. gcc na linuxu a Visual Studio na Windows)
- nebude akceptováno 'na platformě XY se mi to nepodařilo rozchodit'
- nebude akceptováno 'nainstalujte si celý framework, nevím jak se distribuuje samotná aplikace'
- C++ nemá (zatím) standardní knihovny pro grafiku nebo síťování, počítejte s tím při volbě zápočtového programu
Témata zápočtových programů
- každý si vymyslí a navrhne sám
- kreativita v tomto smyslu je jednou z podmínek získání zápočtu
- pracnost: přiměřená
- tj. nikoliv na víkend nebo na týden, ale ani každodenní práce na půl roku
- vhodná témata: cokoliv, co nese známky softwarového díla
- pro inspiraci je dole na stránce uveden seznam některých zápočťáků z minulých let
- v žádném případě ale nejde o vyčerpávající nebo jinak autorizovaný seznam vhodných témat, jde jen o inspiraci
- nikdy nezačínejte váš návrh tématu slovy "ze seznamu jsem si vybral ..." - toto není seznam k vybírání
- vhodné téma je takové, na kterém si C++ pořádně procvičíte - dekompozice, objektový návrh, datové struktury, netriviální aplikační logika, ...
- nevhodná témata:
- přepis zámých nebo nastudovaných algoritmů do C++ (stromy, grafové algoritmy, kompresní a šifrovací algoritmy, přímočaré implementace neuronových sítí, ...)
- jednoduché diskrétní simulace (obchoďáků, výtahů, metra, 'life', ...)
- 1000000+1 -ní implementace notoricky známé věci (tetris, packman, bludiště, worms, bomberman a podobné prehistorické placaté krokovačky, ...)
- aplikace s výraznou převahou GUI, kdy aplikační logika je tvořena jen fragmenty kódu obsluhujícími události GUI
- cokoliv, co začíná slovy "jednoduchá 2D hra" (to je typické využití předchozího případu)
- přímočaré využití superdokonalých knihoven (AI, LLM, herní frameworky, ...) - hodnotí se to, co vy sami naprogramujete, ne zavolání něčeho cizího
- obecně cokoliv, co lze udělat za 'víkend' a na čem se nic z C++ nenaučíte, nesnažte se optimalizovat téma na minimální pracnost
- už nejste v prváku
Některá témata zápočtových programů z minulých let
(Toto není vyčerpávající seznam témat, jen seznam příkladů možných témat pro inspiraci)
Algebraicky multigrid
Analýza herních statistik pomocí OpenDota API
Analyza toniny z audia
Analyzér barvy hlasu
Sledování aktivity uživatele na Windows
Arbitraze sazek
ATmega328P
Bioinformatické metody - proteiny
Bug Tracker
Cachovaci upload server
Cardmaster
Collision detector
Data-hosting server
Detekce a zpracování proudu obrázků
Detekce kolizi
DHT-like P2P
Distributed data storage
Engine pro ekonomickou RT strategii
file manager
Football Match Tracker
Grafický Befunge Debugger
Grafovy editor
Graph matching
Chips challenge game
Infrastruktura pro generování a uchovávání klíčů
Instant messaging
Integrator a vyhledavac jizdnich radu
Interpret geometrickeho/dynamického/zásobníkového/... jazyka
Jazyk pro matematicky popis grafu a jejich kresleni
Jízdní řády
Kompilátor imperativního jazyka
Konfigurovatelný server pro nahrávání obrázků a generování responzivních variant
Konvertor markdown -> pdf
Licitovany marias s AI
Maly dratenik
Map-Reduce Engine
MIDI klavir s transpozici a Synthesii
mikrokontrolér STM32 k analýze dat ze dvou mikrofonů
Obecne multisudoku s prekryvajicimi se ctverci
Ogre bludiste
Ovládání 3D tiskárny
Particle engine
Predzpracovani astro pozorovani
Prehravac not s frekvencni analyzou
Prekladac Pascal -> C
Primy prenos videa s prepinanim zdroju
Překlad HTML do LaTeXu
Pseudotetris se spojitou fyzikou
Real-time strategie
Remote desktop
Rizeni letoveho provozu
Roboticke sitovani
Rychly batch-processing fotek plavajicich castic
Segmentace obrazu
Sitova strilecka
Social desktop client
SovereignPlay
Synchronizator souboru
Trading strategy tester
Userspace filesystem pro OwnCloud
Zavody auticek