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řihlašte se (nejlépe před prvním cvičením) MFF loginem
- poté vám cvičící zpřístupní repository teaching/nprg041/2023-24/cvicici/student
- na počítačích s Windows doporučujeme jako klienta používat TortoiseGit
- 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.
- 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é
- první pokus o 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 během 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
Zápočtový programu
- kompletní vývoj a odevzdávání pouze přes MFF GitLab
- lze přijít (po předchozí domluvě termínu) i 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 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 kultura
- dekompozice, encapsulace, robustnost, udržovatelnost, rozhraní, platformní nezávislost, separace aplikační logiky a I/O / GUI, komentáře, 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í
- 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 si vyzkoušejte 'technologické demo', tj. sestavení triviálního programu a jeho deployment na 'čistý' počítač
- vyzkoušejte kompilaci, sestavení, spuštění a ladě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)
2D fyzikální engine
Adventure guild manager
Akordy
Algebraicky multigrid
Analyza toniny z audia
Analyzér barvy hlasu
Arbitraze sazek
Auticka
Bang!
Bioinformatické metody - proteiny
Bug Tracker
Cachovaci upload server
Canasta
Cardmaster
Casticovy engine
Chips challenge game
DHT-like P2P
Detekce a zpracování proudu obrázků
Detekce kolizi
Distribuované úložiště dat
Duna 2 (strat game)
Emulace rescue robotu
Engine pro ekonomickou RT strategii
Generovani krajiny
Grafovy editor
Graph analysis
Graph matching
Hanabi AI (game)
Hra Caylus
Infrastruktura pro generování a uchovávání klíčů
Instant messaging
Integrator a vyhledavac jizdnich radu
Interpret Forth / Scheme / ...
Interpret geometrickeho jazyka
Jazyk pro matematicky popis grafu a jejich kresleni
Kompilátor imperativního jazyka
Letadlo nad terenem
MIDI klavir s transpozici a Synthesii
Magic: The Gathering engine
Maly dratenik
Map-Reduce Engine
Monopoly
Motivacni strategie
Obecne multisudoku s prekryvajicimi se ctverci
Ogre bludiste
OneEye (zaznamenávání partie go z obrázků)
Ostrovy a sopky
Particle engine
Pazaak (Karetni hra)
Ping Pong Delay
Piškvorky++ s nestandardními topologiemi
Planovaci kalendar
Pokemoni online
Predzpracovani astro pozorovani
Prehravac not s frekvencni analyzou
Prekladac Pascal -> C
Prescoboj - pseudosachy
Primy prenos videa s prepinanim zdroju
Real-time strategie
Rescue roboti
Rizeni letoveho provozu
Roboticke sitovani
Rpg
Rychly batch-processing fotek plavajicich castic
Sazec textu
Segmentace obrazu
Sitova strilecka
Social desktop client
SovereignPlay
Stack Attack
Star wars
Střílečka s inteligencí
Synchronizator souboru
Tanky na 3D cestach
Polymorfni vlacek na kolejich
Zavody auticek