{{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