Programming in C++

Programování v C++

NPRG041

2022/2023

David Bednárek

Katedra softwarového inženýrství

C++ je v nějakých ohledech tak bizarní jazyk, že si říkám, že musí být mimozemského původu. [anketa 2021/22]

Warning (particularly to Erasmus students) - before you enroll to this course

This course assumes that all participants already acquired some experience in programming, understanding of object-oriented programming, and basic knowledge of C# or Java. If you are a beginner in programming, you shall not enroll. If your experience covers only python, PHP, JavaScript, Pascal, FORTRAN, or similar languages, you may expect problems understanding some parts of the lecture.

For regular students of Computer Science, this assumption is covered by the prerequisities of the subject.

Varování

Předmět předpokládá u všech účastníků zkušenosti s programováním, porozumění objektově-orientovanému programování a základní znalost jazyka C# nebo Java. Pokud jste v programování začátečník, nezapisujte se. Pokud máte zkušenosti pouze s jazyky jako python, PHP, JavaScript, Pascal nebo FORTRAN, můžete očekávat problém s porozuměním některým částem přednášky.

Pro pravidelné studenty programu Informatika je tento předpoklad zajištěn prerekvizitami předmětu.

Communication

For communication on all aspects of this course, please use Mattermost. (Your emails are often classified as junk.)

For the first logging-in, you will need an invite-link, placed in the Notice-board module in the SIS. (This invite link is valid for several courses that share the same Mattermost team 2223ZS for this semester.)

The channel nprg041-cpp_ENG is dedicated to the English lecture and the channels nprg041-cpp-[teacher]_ENG to the English labs. All the channels are intended for communication between teachers and students, as well as related discussions between students. In addition, you may use direct messages for non-public communication.

Komunikace

Pro komunikaci s vyučujícími používejte přednostně Mattermost. (Vaše emaily bývají často považovány za spam.)

Pro první přihlášení budete potřebovat invite-link, který najdete na Nástěnce předmětu v SISu. (Tato pozvánka platí pro team 2223ZS pokrývající několik předmětů vyučovaných v ZS 2022/23.)

Tohoto předmětu se týkají kanály nprg041-cpp pro přednášku a obecné dotazy v češtině, nprg041-cpp-[teacher] pro cvičení daného vyučujícího a nprg041-cpp-repetenti pro repetenty. Všechny tyto kanály slouží pro komunikaci mezi vyučujícími a studenty i diskusím mezi studenty týkajícím se předmětu. Pro neveřejnou komunikaci použijte direct messages.

Labs

Mon 12:20 SW2 Šoltésová
Tue 12:20 SW1 Bednárek

Cvičení

Po 12:20 N8 Drozdík
Út 12:20 SW2 Faltín
St 14:00 SW2 Zavoral
Čt 12:20 SW2 Bednárek
Čt 15:40 SW2 Šmelko
Pá 10:40 SW2 Svoboda
Pá 12:20 SW2 Svoboda
repetenti 5.10. 17:20 S7

Rules governing lectures, exams, labs and credits

There will be two homework assignments; your lab teacher is responsible for the assignment, deadline, and evaluation. Late submission without serious cause will be penalized.

The exams take place in a computer lab (S[UW][12]). The exam consists of a programming task which shall be implemented within a time limit of 3.5 hours and submitted to recodex. Each student is required to work independently. To ensure equal environment, students must use only the computers of the lab. The use of notebooks (or other computing devices not installed in the lab) is not allowed during the exam. Students shall not use any resource other than the compiler, debugger, editor and/or IDE installed at the lab and the language reference manuals at cppreference.com or cplusplus.com. Before attempting an exam, make sure that you are familiar with the development environment at the lab computers.

The exam may be repeated three times in accordance with study regulations, the last result is counted.

The final score is based on the total number of points earned as follows:

Homework #1 0..15 points Delay penalty: -5 points per each week (even if partial)
Homework #2 0..25 points Delay penalty: -10 points per each week (even if partial)
Exam 0..60 points 50 points for a completely functional solution, +/- 10 points for the quality of source code

Final grading:

60 points 3
75 points 2
90 points 1

Lab credit: at least 35 points (including the points from the exam) and a software project on a theme previously agreed with the lab teacher. Lab credit is not required for admission to the exam.

Pravidla pro přednášky, zkoušky, cvičení a zápočty

V rámci cvičení budou zadány dva domácí úkoly; jejich zadání a vyhodnocení je v kompetenci příslušného cvičícího. Pozdní odevzdání bez závažného důvodu bude penalizováno.

Zkoušky se konají v počítačové laboratoři (S[UW][12]). Obsahem zkoušky je naprogramování zadané úlohy v časovém limitu 3,5 hodiny včetně odevzdání do systému recodex. Každý student musí pracovat samostatně. V zájmu zajištění stejných podmínek musejí studenti používat pouze počítače instalované v laboratořích. Použití notebooků (nebo jiných výpočetních prostředků, které nejsou součástí laboratoře) během zkoušky není povoleno. Studenti nesmějí používat jiné zdroje než překladače, debuggery, editory a IDE instalované v laboratoři a referenční manuály k jazyku na stránkách cppreference.com nebo cplusplus.com. Before attempting an exam, make sure that you are familiar with the development environment at the lab computers.

Zkoušku lze v souladu se studijními předpisy opakovat třikrát, počítá se poslední výsledek.

Výsledné hodnocení je určeno na základě celkového počtu bodů získaných takto:

Domácí úkol č. 1 0..15 bodů -5 bodů za každý započatý týden zpoždění
Domácí úkol č. 2 0..25 bodů -10 bodů za každý započatý týden zpoždění
Zkouška 0..60 bodů 50 bodů za plně funkční řešení, +/- 10 bodů za kvalitu zdrojových textů

Výsledné hodnocení zkoušky:

60 bodů Dobře
75 bodů Velmi dobře
90 bodů Výborně

Podmínkou udělení zápočtu je získání alespoň 35 bodů (včetně bodů ze zkoušky) a odevzdání zápočtového programu na téma předem dohodnuté s cvičícím. Udělení zápočtu není podmínkou k připuštění ke zkoušce.

Pravidla pro repetenty

Timetable

Warning: The videos from previous years do not necessarily cover all the currently required topics.

Date Slides Topics Video
2020/21
Video
2021/22
2022/10/5 1..15 Pros and cons of C++. Compilation and header files.
2022/10/12 16..27
1..3 Hello, world. Modules, declarations and definitions, references.
2022/10/19 4..13
2022/10/26 1..10 Values, pointers, references.
2022/11/2 1..17 Passing arguments and returning by value and by reference, copy/move semantics, copy/move elision.
2022/11/16 20..23
1..8 Copy/move semantics, the Rule of Five. Pointers, smart pointers, observers.
2022/11/23 9..
2022/11/30
2022/12/7
2022/12/14
2022/12/21
2023/01/4
Future lectures (slides may be updated immediately before a lecture)
References vs. pointers, conventions. Containers, iterators.
Algorithms, functors, lambda.
Classes, inheritance, virtual methods. Conversions.
Visitor pattern, std::variant.
Templates, forwarding references. Variadic templates.
Introduction to exceptions.

Průběh přednášky

Varování: Videa z předešlých let nemusejí pokrývat všechna aktuálně požadovaná témata.

Datum Slajdy Témata Video
2020/21
Video
2021/22
5.10.2022 1..17 Výhody a nevýhody C/C++. Kompilace, hlavičkové soubory, dělení do modulů.
12.10.2022 18..27
1..6 Hello, world. Předávání hodnotou a odkazem.
19.10.2022 7..13
26.10.2022 1..10 Hodnoty, ukazatele, reference.
2.11.2022 1..20 L-value a R-value reference. Copy/move. Předávání parametrů a vracení hodnotou a odkazem, fyzická a logická konstantnost.
16.11.2022 4..16 Copy/move-elision, lvalue/rvalue, copy/move metody. Rule-of-Five.
23.11.2022
30.11.2022
7.12.2022
14.12.2022
21.12.2022
4.1.2023
Budoucí přednášky (slajdy mohou být aktualizovány těsně před přednáškou)
Dynamic allocation, smart pointers, observers. Konvence používání ukazatelů a referencí. Arrays vs. vectors, smart pointers vs. containers.
Kontejnery, iterátory, range-for-loop. Algoritmy.
Funktory, lambda, std::function.
Class vs. namespace. Dědičnost.
Visitor.
std::variant.
Šablony, forwarding references, variadické šablony.
Výjimky.