4. cvičení

Čtení vstupních dat z konzole

Pro čtení vstupních dat z konzole budeme používat funkci scanf, která přečte vstupní řetězec zadaný v terminálu po stisknutí klávesy Enter, pokusí se ho převést na data odpovídajícího datového typu a výsledek uloží na zadanou adresu. Nejjednodušší vysvětlení na příkladu:

#include <stdio.h>

int main()
{
    // text pro uzivatele
    printf("Zadej cele cislo: ");

    // precteni vstupu
    int cislo;
    scanf("%d", &cislo);

    // vypis precteneho cisla
    printf("zadane cislo = %d\n", cislo);

    return 0;
}

Pomocí jednoho příkazu lze přečíst data pro libovolný pevný počet proměnných, např. příkaz scanf("%d %f %f", &cislo1, &cislo2, &cislo3); přečte jedno celé číslo a dvě desetinná čísla oddělená mezerami.

Důležité poznámky:

Speciální symboly pro funkce printf a scanf

Typ proměnné symbol
int %d nebo %i
long %ld nebo %li
unsigned int %u
unsigned long %lu
float, double %f, %e nebo %g
char %c
char* (řetězec) %s

Při použití funkce printf je možné přesněji nastavit způsob výpisu dané proměnné. Např. %.3f způsobí výpis čísla zaokrouhleného na 3 číslice za desetinnou tečkou, %03d vypíše hodnotu 1 jako 001 atd.

Matematické funkce

Pro výpočet složitých matematických funkcí je v jazyce C k dispozici hlavičkový soubor math.h, který obsahuje mj. tyto funkce:

Probrané příklady

  1. Dokončení z předchozího cvičení – rekurzivní a nerekurzivní verze programu na výpočet členů Fibonacciho posloupnosti.
  2. Úprava předchozích programů, aby se vstupní hodnoty četly z terminálu.
  3. Program pro výpočet řešení kvadratické rovnice \(ax^2 + bx + c = 0\). Koeficienty \(a\), \(b\), \(c\) přečteme z terminálu pomocí funkce scanf.

    #include <stdio.h>
    #include <math.h>
    
    int main()
    {
        printf("Zadej parametry a, b, c kvadraticke rovnice a*x^2 + b*x + c = 0:\n");
        float a, b, c;
        scanf("%f %f %f", &a, &b, &c);
    
        if (a != 0) {
            float d = b*b - 4*a*c;
            if (d > 0) {
                float x1 = (-b - sqrtf(d)) / (2*a);
                float x2 = (-b + sqrtf(d)) / (2*a);
                printf("Reseni rovnice jsou x_1 = %g a x_2 = %g.\n", x1, x2);
            }
            else if (d == 0) {
                float x = -b / (2*a);
                printf("Reseni rovnice je x = %g.\n", x);
            }
            else {
                printf("Rovnice nema zadne realne reseni.\n");
            }
        }
        else if (b != 0) {
            float x = -c / b;
            printf("Reseni rovnice je x = %g.\n", x);
        }
        else if (c != 0) {
            printf("Rovnice %g = 0 nema zadne reseni.\n", c);
        }
        else {
            printf("Rovnice je splnena pro vsechny hodnoty x.\n");
        }
    
        return 0;
    }