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/2025-26/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
Podmínky udělení zápočtu
- pravidelná práce a dokončené a odladěné příklady ze cvičení v GitLabu (včetně absencí!)
- vypracování domácích úkolů - ReCodex - získání alespoň 20 bodů z DÚ
- cvičící na začátku semestru seznámí se strukturou a bodováním DÚ
- nutná 100% funkčnost dle Recodexu
- efektivita - datové struktury i implementace
- kvalita kódu - kontrola cvičícím
- naprostý základ je absence Unforgivable Curses
- to je podmínka striktně nutná, ale nikoliv dostatečná, další informace viz cvičení a cvičící
- zadání zápočtového programu do termínu určeném cvičícím (cca druhá polovina 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í pouze 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' (nebo co za vás vyrobí AI) 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 top-down bullet hell
3D rastrový engine
Algebraicky multigrid
Analýza herních statistik pomocí OpenDota API
analýza python kodu
Analyza toniny z audia
Analyzátor hodnocení porotců tanečního sportu
Analyzér barvy hlasu
Arbitraze sazek
ATmega328P
Bankovní systém
Bioinformatické metody - proteiny
BlackJack
Bug Tracker
Cachovaci upload server
Canasta
Collision detector
čtverečkové závody autíček
Data-hosting server
Detekce a zpracování proudu obrázků
Detekce kolizi
DHT-like P2P
Directory sync utility
Distributed data store
DNA and Protein Alignment
Engine pro ekonomickou RT strategii
Events Planner
Exploding Atoms
Exploring Robots Game
GDB Compiler Extension
Generátor grafů
Geometry Dash
Grafický Befunge Debugger
Grafovy editor
Hladanie spojenia v doprave
Hra dungeon
Hra Pentago
Hra Tron
http server s paralelizací
Chatroom
Chips challenge game
Instant messaging
Integrator a vyhledavac jizdnich radu
Interpret dynamického jazyka
Jazyk pro matematicky popis grafu a jejich kresleni
Jízdní řády s realtime daty
Karetní hra Bridge
Karetní hra gwent/gwint
Kompilátor imperativního jazyka
Konfigurovatelný server pro nahrávání obrázků a generování responzivních variant
Licitovany marias s AI
Logická puzzle hra
Map-Reduce Engine
MIDI klavir s transpozici a Synthesii
mikrokontrolér STM32 k analýze dat ze dvou mikrofonů
Monitoring uživatele
Multiple nucleotide sequences alignment
Note Management System
Ogre bludiste
Ovládání 3D tiskárny
Particle engine
PeriodTracker
Predzpracovani astro pozorovani
Prehravac not s frekvencni analyzou
Prekladac Pascal -> C
Primy prenos videa s prepinanim zdroju
Prolog interpreter
Překladač/interpret výukového jazyka
Pseudotetris se spojitou fyzikou
PSO knihovna
Real-time kooperativni 2D puzzle
Real-time strategie
Remote desktop
Renderování fraktálu
Rizeni letoveho provozu
Roboticke sitovani
Roguelike Dungeon Crawler
Rychly batch-processing fotek plavajicich castic
Sandboxed honeypot shell
Simulátor skupiny robotů
Sitova strilecka
SovereignPlay
Spell corrector
SQL engine
Statistics Calculator
Synchronizator souboru
Systém pro vedení docházky
Task Manager CLI Application
Textový editor
Time Series Forecaster
Trading strategy tester
Úprava melodie pro malý dechový orchestr
Userspace filesystem pro OwnCloud
verzovací systém
Vizualizace 3D modelů ve formátu OBJ
Vojenská strategie
Zavody auticek