Přednáška: Čtvrtek, 15:40, N1 (Pavel Ježek)
Cvičení:
Pondělí, 12:20, SW2 (Filip Kliber)
Pondělí, 14:00, SW2 (Jakub Koucký)
Úterý, 10:40, SW2 (Filip Kliber)
Úterý, 15:40, SU2 (Filip Kliber)
Středa, 14:00, SU2 (Filip Kliber)
Čtvrtek, 10:40, SW2 (Filip Kliber)
Pátek, 12:20, SW2 (Pavel Ježek)
Stránka v SIS: NPRG035
Zakončení: Zkouška a zápočet
Table of contents
- Náplň přednášek
- Náplň cvičení
- Informace o zkoušce
- Informace o zápočtu
- Uznávání povinností z minulých let
[in English] This page contains information for Czech students of the Programming in C# Language course. For english, switch the language in the page header.
Náplň přednášek
1. přednáška
- Představení předmětu, zkouška
- Rozdíly v reprezentaci proměnných v paměti v jazycích Python, C++ a C#
- Rozdíly referenčních a hodnotových typů, předávání argumentů hodnotou
- Paměťový overhead u referenčních typů, třída
Type
record (class)
,record struct
Materiály
2. přednáška
- Připomenutí rozdílu referenčních a hodnotových typů, rozhodnut při deklaraci typu
- Příklady typicky referenčních, resp. typicky hodnotových typů
- Implicitní typované proměnné (
var
),new
bez jména typu v kontextu kde je to zřejmé (parametr, deklarace) - Položky (field) vs. vlastnosti (property) v typech,
readonly
- Automaticky implementované vlastnosti
- Alokace na GC haldě, nulování paměti, konstruktory, initializers
init
settery u vlastnosti (C#9), klíčové slovorequired
(C#11)- Primary constructor pro
record class
arecord struct
- Nullable hodnotové typy,
is null
operátor
Materiály
3. přednáška
- Připomenutí nullable hodnotových typů
null
v běhovém prostředí .NET (CLR) a přístup knull
jakoNullReferenceException
- Nullable referenční typy (C#8)
- Duck typing v Pythonu, dynamicky typované jazyky
- Interface v C#, tabulka interface
I
u typuA : I
a najití metody několika dereferencemi v situaciI i = new A(); i.m1();
- Překryté metody klíčovým slovem
new
a hledání správné metody, která se bude volat
A z doplňkového videa:
- Operátor
is
aInvalidCastException
i v lepší variantěvariable is Type newVariable
- Vlastnosti=Properties (ne položky=fields) jakou součástí kontraktu v interface
Materiály
4. přednáška
- Nepřenositelnost (závislost na platformě) u přeloženého C++
- Řešení přenositelnosti pomocí universal executable (fat binary) na MacOS
- Překlad C# kódu (
csc.exe
) do (přenositelné) assembly (.dll) a následně JIT (Just in time) překlad na specifické platformě - Možnosti optimalizace v situacích JIT nebo AOT (Ahead of time) překladu
- CIL (Common intermediate language), metadata v assembly
- Spouštění C# programu přes příkaz
dotnet
a přes přeložené.exe
(windows only) a spouštění ve WSL2 - Nástroje
ildasm
(součást .NET SDK) ailspy
(standalone nástroj), ladící informace (soubor.pdb
),.ctor
- Dědičnost v C#, volání instančních metod (schovaný parametr
this
) - Abstraktní třída, společný předek
object
, volání konstruktoru předka přesbase
- Operátor
is
, třídaType
, metodaGetType()
a operátortypeof
A z doplňkového videa:
- Operátor
is
a pattern-matching (C#9)
Materiály
- Slidy
- Kód
- 04-csharp-part2-lecture-notes.txt
- 04-csharp-wsl2-ubuntu-commands.txt
- 04-csharp-wsl2-ubuntu-example-update-output.txt
5. přednáška
- Statické položky a class (static) constructor,
.cctor
- Delegování konstruktoru pomocí
: this()
, pořadí inicializace - Různé varianty konstant,
readonly static
,const
, constant-folding překladačem při inicializaceconst
hodnot, constant-folding JITu u jednoduchých funkcí
A z doplňkového videa:
- Srovnání
readonly static
aget
-only vlastnosti - podtržítko (
_
) v číselném literálu, další použitíenum
Materiály
6. přednáška
- Úvod do atributů (třídy
*Attribute
), operátornameof
- Doplnění k
enum
a atribut[Flags]
,enum.Parse
,enum.ToString
- Úvod do NuGet-ových balíčků
- (Nicro)benchmarky a BenchmarkDotNet
- JIT optimalizace, různé JITy (Tiers)
- Překlad funkce (prolog, tělo, epilog), method inlining
System.Runtime.CompilerServices.MethodImpl
,MethodImplOptions
- micro-optimalizace
- Volání metod
- zakrývání metod ve zděděné třídě klíčovým slovem
new
, výběr metody za překladu (generování instrukcecall
) - virtuální metody (
virtual
),override
, tabulka virtuálních metod (vType
), volání metody za běhu (instrukcecallvirt
)
- zakrývání metod ve zděděné třídě klíčovým slovem
Materiály
7. přednáška
- Zakrývání členů v potomkovi (klíčové slovo
new
), warning vs. error - Syntaktický zápis virtuálních metod v jazycích C++, C# a Java a problémy s defaultně virtuálními metodami v Javě
- Optimalizace virtuálního volání (devirtualizace),
sealed
typy,sealed override
metody - Tabulka virtuálních metod, tabulka interfacových metod a implementace interface virtuální metodou
- Rozdíl mezi
interface
aabstract
třídou interface
rozšiřující jiný interface a problém diamantové dědičnosti- Důvody pro explicitní
override
v C# oproti implicitnímu v C++ - Klíčové slovo
base
pro generování nevirtuálního volání z předka
Materiály
8. přednáška
- Alternativa k nevirtuálnímu volání z prapředka (nejde pomocí
base
) - Volání virtuálních metod v konstruktoru
- Hra Stardew Valley a návrhový vzor Factory
- Generování instrukce
callvirt
i při volání nevirtuálních metod - Připomenutí automaticky implementovaných vlastností (s backing field)
- Obecné vlastnosti,
get
,set
, kontextové klíčové slovovalue
, metodyget_*
,set_*
- Expression-bodied members (funkce
=>
tělo) pro funkce, ale i pro vlastnosti a syntaktický rozdíl od lambda výrazů - Rozdíly mezi vlastností a funkcí, požadavky na rychlost vlastností, konvence pojmenování
double.NaN
místodouble?
a porovnávání pomocídouble.IsNaN
- Deklarace/alokace proměnné, životnost proměnných, JIT optimalizace, omezení životnosti pomocí
{
a}
A z doplňkových videí:
- virtuální vlastnosti a override vlastností
- viditelnost členů třídy (
public
,protected
,private
,internal
,protected internal
,private protected
,file
) a implicitní viditelnost při deklaraci
Materiály
9. přednáška
- Zakrývání položek třídy (klíčové slovo
new
) a zakrývání lokálních proměnných v C++ (ve vnitřnějším scope), ale ne v C# - Nutnost inicializace lokálních proměnných před jejich čtením, inicializace u pattern-matching konstrukce, explicitní scope
- Připomenutí hodnotových a referenčních typů, reference, boxing, volání metod na zaboxované instanci, unboxing a explicitní konverze,
InvalidCastException
, kompatibilita sobject
- funkce s proměnlivým počtem parametrů a klíčové slovo
params
- nemožnost kombinování unboxování a jiného přetypovaní a řešení pomoci více (explicitních) konverzí
- boxování nullable hodnotových typů
- ukazatele (pointers), nepoužívat
- tracking reference, ukázka na archaickém jazyce C++/CLI
Materiály
Doporučená literatura
- Joseph Albahari: C# 12 in a Nutshell: The Definitive Reference, O’Reilly Media, 2023 (lze koupit např. na Amazon UK)
- Jon Skeet: C# in Depth (4th Edition), Manning Publications, March 2019 (lze koupit např. na Amazon UK)
- C# Language Specification version 8
Případně
- Mark Michaelis with Eric Lippert: Essential C# 5.0, Addison-Wesley, 2013 (lze koupit např. na Amazon UK)
- Jeffrey Richter: CLR via C# (4th Edition), Microsoft Press, December 2012 (lze koupit např. na Amazon UK)
- Christian Nagel, Evjen, Jay Glynn, Karli Watson, Morgan Skinner: Professional C# 4.0 and .NET 4, Wrox, John Wiley & Sons, March 2010 (lze koupit např. na Amazon UK
Náplň cvičení
1. cvičení
- Informace o předmětu, podmínky získáni zápočtu (k dispozici na této stránce), koncept cvičení
- Příklady na procvičení rozdílů mezi referenčními a hodnotovými typy, velikosti proměnných a instancí, alignment/padding, pole, alokace a layout na haldě, slidy
- Zadání úloh Počítání slov a Četnosti slov
2. cvičení
- Klíčové aspekty řešení (obecně)
- funkční (v rámci specifikace)
- efektivní (v rámci použití)
- hezké (udržitelné, rozšiřitelné, dokumentované)
- Čtení slov:
File.ReadAllText
(nedostatečně oddělené kde jsou data a jak se data čtou)
- Kde jsou data:
File.OpenText
nebonew StreamReader
(případněConsole.In
,StringReader
), jakoTextReader
(a jako protipól vztah meziStreamWriter
,StringWriter
,Console.Out
jakoTextWriter
)
- Jak se čtou?
- ✖
ReadToEnd
(problém s velkými soubory) - ✖
ReadLine
(možný problém s dlouhými řádkami) - ✔
Read
(po znacích; pozor že funkce vracíint
) - rozdíl mezi rozdělováním slov (
string.Split
a varianta sStringSplitOptions.RemoveEmptyEntries
) a skládáním slov (string += char
, resp.StringBuilder
)
- ✖
- Přístup více shora (bez technických detailů)
- nějaký
WordReader
, co umí zTextReader
tahatstring
jako slova - nějaký
WordProcessor
(WordCounter
,WordFrequencyCounter
), co umí vzítstring
jako slovo a zpracovat jej (a možná nějak zařídit výstup) - nějaká společná část (argumenty, chyby, propojení), demonstrované na LineCounter
- nějaký
- Zadání nových úloh Odstavcové počítání slov (a vstup) a Sčítat, či nesčítat (vstup a výstup)
- Doplňkové videozáznamy:
- Testovací a datové soubory ve VS, Parametry příkazové řádky pro ladění/spouštění z VS, Launch profiles,
Property/launchSettings.json
- xUnit testovací framework, integrace s VS, vytváření projektů, project reference, psaní testů, integrační testy,
Assert
- Testovací a datové soubory ve VS, Parametry příkazové řádky pro ladění/spouštění z VS, Launch profiles,
3. cvičení
- Prodloužení deadline na Odstavcové počítání slov a Sčítat, či nesčítat
- Připomenutí
interface
jako specifikace kontraktu a slidy - Kontrakt přímo ve formě typů (a rozdíl oproti python duck-typingu)
- Kontrakt pomocí výčtových typů (
enum
) (kontrakt, hodnoty) - Diskuse nad možným objektovým návrhem prvních čtyř úloh
interface IWordReader
a implementaceWordReaderByLines
,WordReaderByClass
interface IWordProcessor
a implementaceWordCounter
,WordFrequencyCounter
,ParagraphWordCounter
,TableSummarizer
- obálka co to spojí a využívá těchto rozhraní
- Jaké metody má mít
IWordReader
, jaké mají mít návratové hodnoty, jaké parametry, kde číst slova? - Jaké metody má mít
IWordProcessor
, jaké mají mít návratové hodnoty, jaké parametry, kam vypisovat výstup? string
vs.string?
vs.Token
- Do příště
- (4+4 body) opravit své řešení úloh Odstavcové počítání slov a Sčítat, či nesčítat (pokud neprocházelo v ReCodExu)
- (5+5 bodů) odevzdat integrační testy pomocí frameworku xUnit, nUnit nebo MSTest (alespoň 10 testovacích scénářů na úlohu)
- (0+0 bodů) vylepšit své řešení úloh Odstavcové počítání slov a Sčítat, či nesčítat (bude se hodit na další úlohu)
4. cvičení
- Různé způsoby reprezentace rolí uživatelů v aplikaci
- Pomocí implicitního
Type
a objektové hierarchie, s daty i bez dat - Pomocí výčtového typu (
enum
), příklad - Pomocí explicitní třídy
Role
, příklad - Pomocí složitější objektové hierarchie, příklad
- Pomocí interfaces, příklad
- Diskuse nad efektivitou, přehledností, využitím jednotlivých přístupů, kontrola za běhu, za překladu
- Pomocí implicitního
- Implementace
Token
aTokenReader
, návrhový vzor Decorator/Wrapper, ladící hlášky pomocí návrhového vzoru decorator - Různé přístupy jak zkontrolovat, že je znak bílý a rozdíly v rychlosti
ITokenProcessor
co umí zpracovávat všechny druhy tokenů zní jako dobrý nápad, ale vede to na špatný návrh a krkolomnou implementaci- Zadání nové úlohy Zarovnání do bloku za 8 bodů
- +3 body za integrační testy odevzdané po řešení
- +5 bodů za integrační testy odevzdané před řešením (a řešení pak rozumně prochází)
A z doplňkového videa
- různé alternativy refaktorování pomocí ChatGPT
5. cvičení
- GC, memory-leak v C# a možnosti jak to opravit
string
je immutable, mutable variantaStringBuilder
- Rozdíl mezi
" "
a' '
jako reprezentace mezery (paměťový i v použití v kontextu metod, které beroustring
vs.char
) - Zakázání používání funkcionalit ze
System.Linq
(více o LINQ až v letním semestru) - Konvence psaní kódu, pojmenovávání identifikátorů, Příklad
- Zotavitelné vs. nezotavitelné chyby, rozdíl v identifikaci chyby a její prezentaci uživateli/programátorovi
- vlastní typy na chyby, s daty
- Popis návrhu řešení prvních čtyř úloh `WordProcessingToolkit`
- vlastní
ApplicationException
aAppErrorHandler
, rozšířenýTableSummatorAppErrorHandler
,IProgramCore
ArgsToIOState
a konverze ze systémových chyb na aplikačnítry
,finally
(oIDisposable
až jindy)
- vlastní
- Experiment, pohádka O hledání bugu
- Rozdíly mezi integračními testy a unit testy
- Testování metody, co vyžaduje kontrakt, Fake/Mock kontrakt, příklad na `LegacyWordCounterApp`
- Do příště
- Prodloužení deadline na Zarovnání do bloku (redukce maximálního množství získatelných bodů na 7)
- (5 bodů) Na
ParagraphDetectingTokenReaderDecorator
napsat unit testy a opravit bugy v implementaci - (5 bodů) Refaktorovat
TableSummatorProcessor
, aby se dal unit testovat + na část napsat unit testy
6. cvičení
- Virtuální metody, interface metody,
abstract
, příklad LegacyWordCounter
a refaktorování proFileProcessingConsoleAppFramework
IWordReader
naITokenReader
z minula- potřebujeme
WordCounter
jakoITokenProcessor
, ale jeIWordProcessor
, ale nechceme modifikovat (funkční, otestovanou) implementaci => návrhový vzor Adapter, TokenProcessorFromWordProcessorAdapter
- TestDrivenDevelopment
- ChatGPT unit testy na
int.Parse(string)
(nedostatečné), příklad - Komentáře k unit testování
ParagraphDetectingTokenReaderDecorator
- Komentáře k
TableSummator
až příště - Do příště
- 1. (micro)benchmark s využitím Benchmark.NET na srovnání různých přístupů k datové struktuře
Dictionary
v kontextu úlohy Četnosti slov, přístupy - 2. (micro)benchmark s využitím Benchmark.NET na srovnání použití datových struktur
SortedList
,SortedDictionary
aDictionary
+Sort
v kontextu úlohy Četnosti slov - za řešení až 8b manuálně v ReCodExu
- 1. (micro)benchmark s využitím Benchmark.NET na srovnání různých přístupů k datové struktuře
7. cvičení
- Příklad na IMT a VMT a řešení
- Komentáře k Benchmarkování úlohy Četnosti Slov, Projekt a výsledky
- Scénář modifikace existujícího slova v
Dictionary
- Scénář přidání nového záznamu do
Dictionary
a způsoby jak to měřit (a neměřit něco jiného, jako alokaci klíčů nebo datové struktury),[IterationSetup]
aManualConfig
- Zdrojové kódy k .NET jako repozitář nebo jako prohlížeč
- Diskuse nad složitostí datových struktur a závěry benchmarků
- Scénář modifikace existujícího slova v
- Komentáře k refaktorování
TableSumatorProcessor
pro vhodnější unit testování- Rozdělení na nezávislé třídy
HeaderProcessor
DataColumnSumator
,TableSumatorProcessor
s jasně daným vstupem a výstupem - Předávání dat mezi vrstvami pomocí veřejného API tříd, nikoliv předáváním tříd samotných
- Rozdělení na nezávislé třídy
- Do příště
- (5b) Zahrát si hru DynaBlaster, analyzovat obrazovky v módu BATTLE a nakreslit graf, kde vrcholy jsou různé obrazovky, hrany znázorňují možné přechody mezi obrazovkami a hodnoty hran jsou data, které mezi obrazovkami tečou
8. cvičení
- Připomenutí hry Stardew Valley, Příklad zachycující postupnou iterace myšlenek
- Přidání nového ovoce jako
abstract class Fruit
vs.interface IFruit
ainterface IEatable
, diskuse nad rozdíly - Eatable vs. Edible; Feedable vs. Fodder
- Frňákovník a návrhový vzor Abstract factory
- Ještě větší dekompozice a návrhový vzor Strategy
- Přidání nového ovoce jako
- Do příště
- (5b) Vícesouborové zarovnání v ReCodExu + (5b) unit testy nových implementací
Informace o zkoušce
Zkouška probíhá primárně písemnou formou, a v každé zkouškové písemce je kolem 6 až 8 otázek (některé obsahují podotázky). U každé otázky, případně podotázky, je dole uvedeno, jaký maximální počet bodů (=N
) lze za správně odpovězenou otázku/podotázku získat: N
bodů získáte v případě, že je odpověď na otázku správně; 0,5 * N
bodu získáte, pokud odpověď není zcela kompletní, ale jinak je správná (tj. nějaká malá část odpovědi chybí nebo je nepřesná); v ostatních případech získáte 0
bodů (tj. pokud v odpovědi chybí větší část, nebo je odpověď na otázku plně nebo i jen z části nesprávná).
Celkem lze z každé písemky získat maximálně 10
bodů. Mapování získaných bodů na výslednou známku je následující:
Body z písemky | Výsledná známka |
---|---|
10 – 8,5 | 1 |
8 – 6,5 | 2 |
6 – 5 | 3 |
4.5 – 0 | 4 |
Každá zkoušková písemka trvá 150 minut, tj. ideálně 20 minut na každou otázku + 30 minut bezpečnostní rezerva. Po písemné části následuje ústní část, kde zkoušející se studentem prochází jeho písemku, a případně nepřesností/nejasností u některých odpovědí se ptá na doplňující otázky — na základě toho je určeno finální bodové hodnocení každé otázky. Základem hodnocení je ale vždy písemná část, tedy u otázky bez odpovědi nebo se špatnou odpovědí nelze ani po ústní části získat více než 0 bodů.
Níže budou pro ilustraci uvedena zadání vybraných písemek z již proběhlých termínů:
- 13.1.2023 (PDF)
- 9.1.2023 (PDF)
- 16.1.2019 (PDF) [příloha zadání (dokumentace List<T>.RemoveAt)]
- 16.1.2018 (PDF) [příloha zadání (dokumentace List<T>.Insert)]
- 25.1.2017 (PDF)
- 1.2.2016 (PDF)
- 27.1.2016 (PDF)
- 20.1.2016 (PDF)
Doplňkové informace o zkoušce
Kromě informací uvedených ve slidech z první přednášky navíc pro zkoušky z NPRG035, NPRG038, a NPRG057 platí následující 2 body:
- Pokud někdo bude zapsán na nějakém z termínů zkoušky a na termín se nedostaví, bude mu tento termín v SISu označen jako propadlý (tj. student přijde o jeden pokus). Cílem tohoto opatření je optimalizace vytíženosti jednotlivých termínů, aby všichni studenti měli možnost přijít až na 3 termíny zkoušky.
- Pokud někdo na zkoušce získá známku 2 nebo 3 a bude si chtít svůj výsledek zlepšit, může explicitně na místě během vyhodnocení zkouškové písemky požádat zkoušejícího o nezapsání známky. Zkušební termín mu pak bude v SISu označen jako propadlý. Takový student může pak později
- požádat o dodatečné zapsání získané známky, nebo
- přijít na jiný termín zkoušky (jakýmkoliv výsledkem této “opravné” zkoušky se ovšem anuluje předchozí získaná známka).
Modelový příklad 1:
Student X získá na 1. termínu známku 2 a odmítne ji. Na 2. termínu získá známku 3 a odmítne ji. Na 3. termínu získá známku 1.
Aktuální stav studenta X: 1. termín = propadlý, 2. termín = propadlý, 3. termín = 1, tj. student X zkoušku splnil s hodnocením 1.
Modelový příklad 2:
Student Y získá na 1. termínu známku 3 a odmítne ji. Na 2. termínu získá známku 4.
Aktuální stav studenta Y: 1. termín = propadlý, 2. termín = 4, tj. pokud chce zkoušku splnit, musí student Y přijít na 3. termín. Pokud na 3. termínu opět získá známku 4, tak zkoušku nesplnil.
Modelový příklad 3:
Student Z se nedostaví na 1. termín, na 2. termínu získá známku 3 a odmítne ji, na 3. termínu získá známku 4.
Aktuální stav studenta Z: 1. termín = propadlý, 2. termín = propadlý, 3. termín = 4, tj. student Z zkoušku nesplnil.
Informace o zápočtu
Pro získání zápočtu je nutné splnit tři podmínky:
1. Zápočtový test
Naprogramovat a odladit jeden jednoduchý příklad v časovém limitu 3 hodiny. Koná se během zkouškového období v počítačové laboratoři. Celkem pět pokusu na splnění testu, maximálně však tři během zimního zkouškového období (další pak případně v letním termínu).
2. Zápočtový program
Termíny NPRG035 (zima) i NPRG038 (léto), NPRG057 (léto), NPRG064 (léto):
- Specifikace: 11. 7. 2025
- Předvedení finální plně funkční verze (včetně uživatelské a programátorské dokumentace):
-
- deadline: 8. 8. 2025
-
- deadline: 5. 9. 2025
-
Požadavky na program z NPRG035, NPRG064 (zdrojového kódu v jazyce C# ⇒ nevygenerovaný (ručně psaný) rozumný kód včetně rozumných komentářů):
- Předvedeno do 1. deadline: minimálně 30 kB zdrojového kódu v jazyce C#
- Předvedeno do 2. deadline: minimálně 45 kB zdrojového kódu v jazyce C#
- Předvedeno po 2. deadline: minimálně 60 kB zdrojového kódu v jazyce C#
Požadavky na program z NPRG038, NPRG057 (zdrojového kódu v jazyce C# ⇒ nevygenerovaný (ručně psaný) rozumný kód včetně rozumných komentářů + netriviální a rozumné použití některé z „technologií“ probíraných v NPRG038, resp. NPRG057 [více viz dané předměty]):
- Předvedeno do 1. deadline: minimálně 45 kB zdrojového kódu v jazyce C#
- Předvedeno do 2. deadline: minimálně 60 kB zdrojového kódu v jazyce C#
- Předvedeno po 2. deadline: minimálně 90 kB zdrojového kódu v jazyce C#
Poznámka: Každý zápočtový program, který splňuje požadavky NPRG038, resp. NPRG057, splňuje i požadavky NPRG035 (tj. lze odevzdat jeden program za oba předměty).
Poznámka: rozumný/rozumné = na požádání posoudí cvičící
POZOR! Osobní předvedení je součástí odevzdání. Na předvádění si připravte nějakou formu prezentace, kde ukážete hlavní funkce programu + hlavní řešené problémy + nástin architektury.
3. Domácí úkoly
Na cvičeních se budou postupně zadávat domácí úkoly, za jejichž vyřešení obdržíte body. Povinnost vám bude uznána pokud získáte dostatečné množství bodů. Získání většího množství bodů vám může pomoct získat body i ke zkoušce dle tabulky níže. K uznání povinnosti je třeba získat alespoň 90b.
Všechny domácí úkoly postupně najdete v ReCodExu pro NPRG035. Tam je také řešte a odevzdávejte. POZOR: Na úkoly zadané na cvičení je standardní deadline 7 dní (tj. do začátku příštího cvičení)!
Upozornění: Domácí úkoly jsou samostatnou prací, jejímž cílem je zhodnotit schopnost studenta samostatně vypracovat složitější program v jazyce C#. Pokud bude zjištěno, že některý student odevzdal cizí řešení (např. několik studentů odevzdalo různé instance stejného řešení některého domácího úkolu, apod.), bude to považováno za pokus o podvod. Všichni takoví studenti nesplní v tomto akademickém roce předmět NPRG035 a přicházejí o možnost uznání splněných povinností v roce příštím; případně bude disciplinární komisi UK MFF doporučeno jejich vyloučení ze studia!
Za nadstandardní množství bodů z úkolů je možné získat body ke zkoušce, a sice takto:
- min. 90 bodů = úroveň “I Can Win” → splněn jeden z požadavků na zápočet, konkrétně bod “povinnosti ze cvičení”
- min. 110 bodů → získání 1,25 silných bodů do zkoušky z NPRG035
- min. 130 bodů = úroveň “Hardcore” → získání dalších 0,75 silného bodu do zkoušky z NPRG035
- min. 160 bodů = úroveň “Nightmare!” → získání 0,5 slabého bodu do zkoušky z NPRG035
- min. 210 bodů = úroveň “Mission Impossible” → získání dalšího 0,5 slabého bodu do zkoušky z NPRG035
- min. 252 bodů = “božská úroveň” → na 1 rok propůjčen titul “bohyně veškerého Csharpistva” nebo titul “bůh veškerého Csharpistva”
Celkem lze tedy získat až 2 silné bonusové body a až 1 slabý bonusový bod do zkoušky z NPRG035 (hodnocení zkoušky viz slidy z první přednášky). Pozor — tyto silné bonusové body se budou započítávat pouze při 1. pokusu o složení zkoušky (tj. při svém 2. i 3. pokusu mají všichni 0 silných bonusových bodů). Nerozlišuje se z jakého důvodu student přichází na 2. nebo 3. termín (tj. zda např. odmítl známku na 1. termínu). Slabé bonusové body se budou započítávat při všech pokusech o složení zkoušky, ale pozor: slabé bonusové body nedokáží prorazit bariéru mezi známkou 4 a známkou 3 (tj. pokud po přičtení silných bonusových bodů stále vychází známka 4, tak se slabé bonusové body do výsledku zkoušky nezapočítávají).
Poznámka: Virtuální cvičení jsou určena pro studenty, kteří nechtějí chodit na cvičení (např. protože minulý rok nestihli dodělat pouze zápočtový program, splnit zápočtový test, apod.).
Uznávání povinností z minulých let
Pokud jste tento předmět měli zapsaný loňský akademický rok a splnili jste pouze některé z povinností potřebných pro udělení zápočtu, může vám je po explicitním požádání (např. při předvádění zápočtového programu) uznat váš letošní cvičící (lze uznat domácí úkoly, zápočtový test, odevzdaný a schválený zápočtový program). Téma zápočtového programu (pokud ho ještě nemáte dokončený) nemusí být novým cvičícím uznáno. Pokud jste v loňském roce úspěšně složili zkoušku, ale nepodařilo se vám získat zápočet, lze opět po explicitním požádání požádat o uznání zkoušky. Toto je iniciativa vyučujících tohoto předmětu a nelze ji požadovat po studijním oddělení!