{{indexmenu_n>2}}
====== 2 - Vstup a výstup programu ======
* pro vyučující: [[courses:b0b36prp:internal:tutorialinstruction:02|]]
/*
Bude upřesněno před začátkem semestru.
*/
===== 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]]
* základní datové typy - ''char, int, float, double''
===== Úkoly =====
==== Kompilace a spouštění programu ====
* Vytvořte program "Hello PRP", který uložte do souboru program.c v domovském adresáři, např. ''~/prp/lab02''.
#include
int main(void)
{
printf("I like B0B36PRP!\n");
return 0;
}
* Program zkompilujte a spusťte. Zobrazte návratovou hodnotu, např. z interpreteru příkazů (shell) příkazem ''echo $?''.
* Vyzkoušejte změnit návratovou hodnotu a opět vypsat.
* Vytvořte dvě spustitelné verze programu např. ''program0'' a ''program1'', které budou mít návratovou hodnotu 0 a 1. Využijte přepínač kompilátoru -o
* Vyzkoušejte chování a spuštění programu
./program0 && ./program1
./program1 && ./program0
a
./program0 && echo $? && ./program1 && echo $?
./program1 && echo $? && ./program0 && echo $?
a dále pak
./program0 && echo $? && ./program1; echo $?
./program1; echo $? && ./program0 && echo $?
* Program rozšiřte o násobný výpis textové zprávy
#include
int main(void)
{
printf("I like B0B36PRP!\n");
printf("I like B0B36PRP!\n");
printf("I like B0B36PRP!\n");
printf("I like B0B36PRP!\n");
return 0;
}
který následně upravte využitím cyklu
#include
int main(void)
{
for (int i = 0; i < 4; ++i) {
printf("I like B0B36PRP!\n");
}
return 0;
}
Vyzkoušejte kompilaci a spuštění programu, např.
clang program.c && ./a.out
nebo
clang program.c -o program && ./program
==== Vstup a výstup programu ====
* Předchozí příklad rozšiřte o načtení počtu opakovaného vypsání zprávy příkazem ''scanf()'', např.
int n;
scanf("%d", &n);
* V programu dále ošetřete případ, ve kterém vstup není celé číslo (typu ''int''). Např.
int n;
if (scanf("%d", &n) == 1) {
printf("Parsed number is %d\n", n);
} else {
printf("Input number has not been parsed!\n");
}
* Program vyzkoušejte pro různé vstupy a počítejte řádky například příkazem ''wc'':
clang program.c && echo 4 | ./a.out | wc
* Napište program ''out.c'', který vypíše na výstup zadaný počet řádku v rozsahu 0 až 100, kde výstup tvoří posloupnost čísel od 1 do n.
* Program zkompilujte do spustitelného souboru ''out'' a vyzkoušte přesměrování výstupu do jiného programu nebo souboru, např.
echo 10 | ./out
echo 10 | ./out | wc
echo 10 | ./out > output.txt
cat output.txt
wc output.txt
* Napište program ''in'', který očekává na vstupu posloupnost celých čísel a po přečtení vstupu vypíše počet načtených celých čísel
* V programu ošetře chybu načtení a uzavření vstupu např.
int r, n;
while ((r = scanf("%d", &n)) == 1) {
// increment of the counter
}
if (r == 0) {
printf("Wrong input detected!\n");
} else {
printf("Number lines %d\n", counter);
}
* Program zkompilute do spustitelného souboru ''in'' a vyzkoušejte interaktivní režim s ručním vkládáním vstupu
* Vstup ukončíte znakem ''EOT'' (End-of-Transmission) ''Ctrl+D''.
* Program vyzkoušejte program pro různé vstupy i necelá čísla, ideálně se vstupem ze souboru např.
echo 10 | ./out > output.txt
./in < output.txt
* Programy ''out'' a ''in'' zkombinujte a ověřte jejich správné chování pro různé vstupy
* Dále můžete programy rozšířit o omezení rozsahu vstupu např. na celá čísla 0 až 100 nebo maximální počet vstupních řádků.
==== 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 výpis na standardní výstup (''stdout'') a standardní chybový výstup (''stderr'') pomocí funkce ''fprintf''
== ==
fprintf(stdout, "Standardní výstup: %d", i);
fprintf(stderr, "Error výstup: %d", i);
==== ====
* Vyzkoušejte přesměrování výstupů programu do souboru
== ==
./main >output.log 2>error.log
==== 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
== ==
./main