====== 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 GIT repozitáři předmětu. Pro příklady je vytvořena zvláštní větev (branch) s názvem ''examples''. ==== Ú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 clone git@gitlab.fel.cvut.cz:B192_B2B99PPC/tutorials.git $ cd tutorials Lokální kopie repozitáře by měla být přepnuta do větve ''examples''. Pokud tomu tak není, je třeba se do této větve přepnout: $ git branch * examples $ git checkout examples Already on 'examples' Your branch is up to date with 'origin/examples'. 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);