====== 1. Úvodní cvičení ======
===== Seznámení s programovacím prostředím =====
Při programování v rámci předmětu lze používat libovolný editor, který umožňuje zvýrazňování syntaxe (gedit, gVim, sublime text, atd), a překládat z příkazové řádky v terminálu. Budeme používat kompilátor g++ nebo některou z jeho variant.
Pro zvýšení komfortu při programování využijeme volně dostupný a multiplatformní produkt Microsoftu [[https://code.visualstudio.com|Visual Studio Code]]. Tento program není IDE (Integrated Development Environment), ale pouze editor, do kterého se dá formou pluginů nainstalovat podpora nejrůznějších jazyků. Podporou se má v případě VS Code na mysli zvýrazňování syntaxe, doplňování klíčových slov a nápověda. Kompilátor je třeba mít nainstalovaný v operačním systému a nastavit k němu ve VS Code cestu.
Pro nastavení VS Code využijte návod pro [[courses:b2b99ppc:howtos:vscode_install_windows|Windows]] nebo pro [[courses:b2b99ppc:howtos:vscode_install_linux|Linux]].
===== Verzovací systém GIT =====
Zdrojové kódy příkladů na cvičení jsou uloženy v [[https://gitlab.fel.cvut.cz/b2b99ppc/tutorials|GIT repozitáři]] předmětu. V repozitáři jsou tři různé větve (branch):
* ''main'' - obecné informace
* ''templates'' - šablony příkladů a projektů řešených na cvičení
* ''solutions'' - řešení příkladů
==== Úkoly ====
V následujících bodech se řiďte návodem [[courses:b2b99ppc:howtos:git|Instalace a nastavení GITu]].
- Pokud nepracujete na školním počítači, nainstalujte si GIT klienta.
- Vytvořte ''SSH'' klíč.
- Přihlašte se do Gitlabu a vložte veřejný klíč.
- Nakonfigurujte globální vlastnosti vašeho GIT klienta
Naklonování repozitáře se vzorovými příklady:
$ git@gitlab.fel.cvut.cz:b2b99ppc/tutorials.git
$ cd tutorials
Lokální kopie repozitáře by měla být přepnuta do větve ''templates''. Pokud tomu tak není, je třeba se do této větve přepnout:
$ git branch
* main
solutions
templates
$ git checkout templates
Switched to branch 'templates'
Vyzkoušejte si přepnutí mezi jednotlivými větvemi repozitáře.
Pokud se vám nepodaří zprovoznit přístup k fakultnímu GitLabu (např. zatím nemáte práva pro přístup do repozitáře), můžete si alternativně stáhnout archiv se zdrojovými soubory: {{ :courses:b2b99ppc:tutorials:ppc-tut01.zip |}}.
====== Úvod do programování v C++ ======
Interakce s uživatelem je v C++ realizována pomocí tzv. proudů (stream, [[http://www.cplusplus.com/doc/tutorial/basic_io/|Basic Input/Output]]). Standardní výstup je reprezentován objektem ''std::cout'', standardní vstup objektem ''std::cin''. Zápis do standarního výstupu je proveden pomocí proudového operátoru ''<<'', ke čtení ze standadního vstupu slouží operátor ''>>''. Později si ukážeme, že proudové operátory lze využít i pro práci s textovými řetězci nebo se soubory.
Kromě standardního vstupu a výstupu existují ještě dva další proudy: ''std::cerr'' a ''std::clog''. Oba zapisují na standardní chybový výstup, za normálních okolností tedy píší stejně jako ''std::cout'' standardní výstup, ale je možné je přesměrovat. ''std::clog'' je bufferovaný, takže není zcela jisté, kdy dojde k vypsání (ovšem dojde k němu nejpozději při ukončení programu).
===== Standardní výstup =====
#include
int main()
{
std::cout << "Ahoj PPC\n";
}
==== Úkoly ====
Argumentem výstupního proudu samozřejmě nemusí být jen textový literál. Vyzkoušejte:
- vypsat hodnotu proměnné libovolného datového typu
- vypsat výsledek aritmetické operace (např. součet dvou proměnných stejného datového typu)
- zřetězení operátoru výstupu
==== Formátování ====
Výstupní proudy mají v C++ bohaté možnosti formátování. Pro naše potřeby si vystačíme s nastavením přesnosti pomocí ''std::seprecision'' a nastavením šířky výpisu ''std::setw''.
#include // std::cout, std::fixed
#include // std::setprecision
int main () {
double f = 3.14159;
std::cout << std::setprecision(5) << f << '\n';
std::cout << std::setprecision(9) << f << '\n';
std::cout << std::fixed;
std::cout << std::setprecision(5) << f << '\n';
std::cout << std::setprecision(9) << f << '\n';
return 0;
}
===== Standardní vstup =====
Práce se standardním vstupem je velmi podobná. Pokud je to možné, je provedena implicitně konverze datového typu.
#include
int main()
{
int num;
std::cout << "Napis cele cislo\n";
std::cin >> num;
std::cout << "Zadal jsi " << num << '\n';
}
Vstupy je možné podobně jako u standardního výstupu řetězit.
int a, b;
std::cin >> a >> b;
je analogická zápisu
int a, b;
std::cin >> a;
std::cin >> b;
Co se stane, když na vstup v příkladu zadáte textový řetězec?
=== Ošetření vstupu ===
if (std::cin.good())
{
std::cout << "Zadal jsi " << num << '\n';
}
else
{
std::cout << "Daval jsi pozor na PRPA?\n";
}
Tento kód zajistí, že program korektně ošetří případ neexistující konverze na požadovaný datový typ. Pokud bychom se nyní chtěli znova pokusit o načtení čísla, dojde automaticky k vyhodnocení chyby a to hned ze dvou důvodů:
* ''eos::failbit'' zůstal nastaven
* ve vstupním bufferu zůstal text
Řešením je vynulování stavových bitů a vyčištění vstupního bufferu:
std::cout.clear();
std::ignore(MAX_INT); // argument říká, kolik znaků je zahozeno
==== Čtení textového řetězce ====
Pro práci s textovými řetězci se nejlépe v ''C++'' hodí datový typ ''std::string'', který je součástí standardní knihovny. Pro čtení řetězce ze standarního vstupu platí podobná omezení jako při použití funkce ''scanf'' v jazyce ''C''.
#include
#include
int main() {
std::cout << "Napis sve jmeno:\n";
std::string jmeno;
std::cin >> jmeno;
std::cout << "Ahoj " << jmeno << '\n';
}
=== Úkoly ===
- Vyzkoušejte nejprve zadání svého křestního jména a pak celého jména včetně příjmení. V čem je rozdíl?
- Podobně jako v ''C'' jsou i v ''C++'' k dispozici funkce, které jsou určeny k načtení delších úseků textu. V našem případě bychom mohli využít funkci [[http://en.cppreference.com/w/cpp/string/basic_string/getline|std::getline]], která načítá text ze standardního vstupu až do výskytu znaku konce řádku. Nahraďte řádek s proudovým operátorem vstupu následujícím kódem:
std::getline(std::cin, jmeno);