Search
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 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 Windows nebo pro Linux.
Zdrojové kódy příkladů na cvičení jsou uloženy v GIT repozitáři předmětu. V repozitáři jsou tři různé větve (branch):
main
templates
solutions
V následujících bodech se řiďte návodem Instalace a nastavení GITu.
SSH
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'
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: ppc-tut01.zip.
Interakce s uživatelem je v C++ realizována pomocí tzv. proudů (stream, 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.
std::cout
std::cin
«
»
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).
std::cerr
std::clog
#include <iostream> int main() { std::cout << "Ahoj PPC\n"; }
Argumentem výstupního proudu samozřejmě nemusí být jen textový literál. Vyzkoušejte:
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.
std::seprecision
std::setw
#include <iostream> // std::cout, std::fixed #include <iomanip> // 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; }
Práce se standardním vstupem je velmi podobná. Pokud je to možné, je provedena implicitně konverze datového typu.
#include <iostream> 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;
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
Ř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
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.
C++
std::string
scanf
C
#include <iostream> #include <string> int main() { std::cout << "Napis sve jmeno:\n"; std::string jmeno; std::cin >> jmeno; std::cout << "Ahoj " << jmeno << '\n'; }
std::getline(std::cin, jmeno);