Warning
This page is located in archive. Go to the latest version of this course pages. Go the latest version of this page.

2 - Vstup a výstup programu

  • pro vyučující: 02

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 - scanf getchar a standardní výstup - printf, fprintf
  • 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 <stdio.h>
 
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 <stdio.h>
 
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 <stdio.h>
 
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 <input.log

courses/b0b36prp/labs/lab02.txt · Last modified: 2018/06/11 15:00 (external edit)