{{indexmenu_n>2}}
====== 2 - Vstup a výstup programu ======
**Záznam cvičení:** [[https://drive.google.com/file/d/1PQor6vIywCrMJoRXRwdggSGl87lY0B5k/view?usp=sharing|Google Drive]] (nutná autorizace v doméně fel.cvut.cz)
**Doprovodné materiály pro druhé cvičení:** {{ :courses:b0b99prpa:labs:promenne.pdf |}} {{ :courses:b0b99prpa:labs:operatory.pdf |}}
===== Procvičovaná témata =====
  * Kompilace a spouštění programu
  * Vstup a výstup programu a přesměrování vstup a výstupu programu do souboru 
  * standardní vstup - [[http://www.tutorialspoint.com/c_standard_library/c_function_scanf.htm|scanf]]  [[http://www.tutorialspoint.com/c_standard_library/c_function_getchar.htm|getchar]] a  standardní výstup - [[http://www.tutorialspoint.com/c_standard_library/c_function_printf.htm|printf]], [[http://www.cplusplus.com/reference/cstdio/fprintf/|fprintf]]
  * [[https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B|operátory]] a [[courses:b0b99prpa:tutorials:control|řídicí struktury]]
===== Úkoly =====
  
==== Kompilace a spouštění programu ====
  * Vytvořte program "Ahoj PRPA", který uložte do souboru program.c v domovském adresáři, např. ''~/prpa/tut02''.
#include 
int main(void)
{
   printf("Ahoj PRPA!\n");
   return 0;
}
  * Program zkompilujte a spusťte. 
  * Zobrazte návratovou hodnotu
    * Windows (cmd): příkazem ''echo %errorlevel%'' 
    * Windows (Powershell): prikazem: ''echo $LASTEXITCODE''
    * Linux, MSYS (bash): příkazem ''echo $?''.
  * Vyzkoušejte změnit návratovou hodnotu a opět vypsat.
  * Program rozšiřte o násobný výpis textové zprávy
#include 
int main(void)
{
   printf("Ahoj PRPA!\n");
   printf("Ahoj PRPA!\n");
   printf("Ahoj PRPA!\n");
   printf("Ahoj PRPA!\n");
   return 0;
}
  * Vyzkoušejte funkci řídicích znaků: ''\n'', ''\t'', ''\r''
  * Vyzkoušejte, jak kompilátor reaguje na chyby v kódu:
    * Chybějící středník
    * Neukončený řetězec
    * Neukončený blok
  * Vyzkoušejte si automatické formátování kódu
==== Standardní formátovaný výstup ====
  * Vyzkoušejte různé formy výpisu znaků a čísel: 
== ==
char c = 'a';
int i = 1000,j;
float x,y = 3.1415;
printf("%c\n", c);
printf("%i\n", c);
printf("%d\n", i);
printf("%+5d\n", i);
printf("%x\n", i);
printf("%f\n", y);
printf("%10.3f\n", y);
printf("\t%-g\n", y);
==== ====
  * co bude výsledkem výpisu následujících příkazů?
== ==
	
printf("%6d,%4d", 86, 1040);
printf("\n");
printf("%12.5e", 3.14159265);
printf("\r");
printf("%.4f\n", 85.167);
==== ==== 
  * Vyzkoušejte přesměrování výstupů programu do souboru
== ==
./main >output.log 2
==== Operátory ====
  * Operátor přiřazení - jak zvětšit hodnotu celočíselné proměnné o 10?
// pomoci pomocne promenne
int tmp, a = 10;
tmp = a + 10;
a = tmp;
// vyrazem - manipulace s hodnotou promenne 
a = a + 10
// zkracenym vyrazem
a += 10
Více o výrazech na 4. přednášce
  * Unární operátor inkrementace - zvětší hodnotu proměnné o 1 
int a = 1;
printf("a: %d, a++: %d", a, a++);
  * Celočíselné a neceločíselné dělení, operátor přetypování
int a = 10;
int b = 3;
printf("a/b = %f\n", a/b); // jak zařídit, aby výsledek byl desetinné číslo?
==== Standardní formátovaný vstup ==== 
  * vyzkoušejte načtení vstupu:
== ==
1-20.3-4.0e3
==== ====
  * příkazem
== ==
scanf("%d%d%f%f",&i ,&j ,&x ,&y);
==== ====
  * zamyslete se nad chováním příkazu ''scanf'' na základě formátovacího řetězce.
  * vyzkoušejte načtení vstupů " 9/ 16" a " 9 / 16" pomocí formátovacího řetězce ''"%d/%d"''
  * vyzkoušejte přesměrování vstupu programu
== == 
== Přesměrování vstupu pro Linux a cmd line ve Windows ==
./main 
== Přesměrování vstupu pro PowerShell ve Windows ==
Get-Content data.txt | .\main.exe > out.txt
===== Příklady k procvičení =====
Řešení příkladů včetně krátkého videa s komentářem najdete na [[courses:b0b99prpa:solutions:lab02|této stránce]].
==== 1. Výpočet přepony pravoúhlého trojúhelníka ====
Napište program, který ze standardního vstupu načte dvě celá čísla (datový typ ''integer'') reprezentující odvěsny pravoúhlého trojúhelníka a vypočítá délku přepony. Délku přepony vypište ve tvaru desetinného čísla s přesností na dvě desetinná místa. V programu vyuzijte funkci [[https://www.tutorialspoint.com/c_standard_library/c_function_sqrt.htm|sqrt]], která je definovaná v hlavičkovém souboru ''math.h''. Pri kompilaci v OS Linux pak použijte volbu ''-lm'' pro přilinkováni správné knihovny - ''libm''.
Pokud používáte MinGW kompilátor, kompilace s volbou ''-lm'' není nutná. Zatímco v OS Linux programy využívají knihovnu ''libc'', která neobsahuje matematické funkce a je třeba využít knihovnu ''libm'', v prostředí OS Windows zkompilované programy využívají jako standardní knihovnu ''MSVCRT.DLL'', která již potřebnou funkcionalitu obsahuje a ''libm'' je vlastně jen prázná schránka. Je třeba mít na paměti, že BRUTE využívá služeb OS Linux a programy, které se nekompilují s ''-lm'', matematické funkce nepodporují.
Pokud nechce vypisovat délky odvěsen ručně, před spuštěním programu si vytvořte textový soubor, který přesměrujte na vstup programu. Volání a interakce s programem v prostředí OS Linux potom vypadá následovně:
$ echo "4 3" > data
$ ./01-trojuhelnik < data
Prepona je 5.00
 
Řešení příkladu [[courses:b0b99prpa:solutions:lab02#vypocet_prepony_pravouhleho_trojuhelnika|zde]].
==== 2. Získání celé a desetinné části reálného čísla ====
Napište program, který načte ze standardního vstupu reálné číslo, vypočítá celou a desetinnou část a vypíše ji na obrazovku s přesností na 4 desetinná místa.
Volání programu v OS Linux vypadá následovně:
$ ./02-cislo 
8.3343
Cela cast: 8
Desetinna cast: 0.3343
 
Řešení příkladu [[courses:b0b99prpa:solutions:lab02#rozklad_realneho_cisla_na_celou_a_desetinnou_cast|zde]].
==== 3. Zkrácení reálného čísla ====
Napište program, jehož vstupem bude reálné číslo a počet desetinných míst, na které má být provedeno zkrácení. Zamyslete se nad možností aplikace zaokrouhlovacích pravidel.
Volání programu v OS Linux vypadá následovně:
$ ./03-orez
8.3343
3
Orez na 3 desetinna mista: 8.334
Řešení příkladu [[courses:b0b99prpa:solutions:lab02#orez_realneho_cisla|zde]].