Základy jazyka C v příkladech 1


Pro psaní jednoduchých aplikací v C a C++ můžete použít nenáročný nástroj Dev-C++  jenž je zdarma, má zvýraznění syntaxe a vlastní kompilátor. Pokročilejší programátor s kompilátorem je Code::Blocks. Kompilace a spuštění proběhne klávesou F9. Při spouštění zkompilovaného programu doporučuji vypnout nebo pozastavit antivirové programy. Zejména Avast svým testem způsobí nestandardní chování programu.

Zde jsou uváděny příklady v C jenž běží jako Console Application. (Jazyk C++ je obsahově rozšířenější a objektově orientovaný.) V ukázkách se využívají nejčastěji základní knihovny <stdio.h><stdlib.h> pro výpis na obrazovku a čtení klávesnice.


Příklad 01: Hello World. Aplikace vypisující nápis Ahoj světe! Aby aplikace ihned neskončila, vyčká na stisk libovolné klávesy.


// Za dve lomitka piseme komentar na radek

/* Za lomitko a hvezdicku
   muzeme psat komentar na vice radku.
   Musime jej ukoncit hvezdickou a lomitkem */

#include <stdio.h>
#include <stdlib.h>

int main(){

    printf("Ahoj, svete!\n");  // Vypise text Ahoj svete!


  system("PAUSE");             // Vycka na stisk libovolne klavesy.
  return 0;
}

Proměnné a konstanty, základní datové typy:

short – Celé číslo (2B)

int – Celé číslo (4B) (-32767 až +32767)

float – Reálné číslo (4B)

double – Reálné číslo (8B)

long double – Reálné číslo (12B)

char – Znak uložený jako číslo (1B)


Textový řetězec a řídící sekvence (pro vstup i výstup):

“V uvozovkách se zapisuje textový řetězec“

%d – Vypíše proměnnou jako celé číslo

%f – Vypíše proměnnou jako reálné číslo

%lf – Vypíše proměnnou jako reálné číslo se zvýšenou přesností

%c – Vypíše proměnnou jako číslo konvertované na znak

%o – Vypíše proměnnou jako číslo v osmičkové soustavě

%x – Vypíše proměnnou jako číslo v šestnáctkové soustavě

%s – Vypíše textový řetězec

\a – Varovné pípnutí

\n – Začátek nového řádku


Výpis na obrazovku:

printf(“Textový řetězec a řídící sekvence“, proměnné)


Příklad 02: Konstanty, proměnné a výpis na obrazovku. Do paměti se uloží konstanty a jejich hodnoty. Program také vytvoří dvě proměnné bez hodnot. Konstanty se vypíší na obrazovku.


#include <stdio.h>
#include <stdlib.h>

// Vytvoreni konstant s hodnotou
char a = 'A';                     // znak nebo cislo 1-bytove (0-255)
int  b = 6325;                    // cele cislo 4-bytove
float c = 3.14;                   // realne cislo 4 bytove
double d = 15.1566;               // realne cislo 8 bytove s velkou presnosti

// Vytvoreni promennych bez hodnot
int  x;
int  y;

int main(){

    printf("Hodnota a: %c \n", a);    // vypise text, promennou a da novy radek
    printf("Hodnota b: %d \n", b);
    printf("Hodnota c: %f \n", c);
    printf("Hodnota d: %f \n", d);

  system("PAUSE");   // vycka na stisk libovolne klavesy
  return 0;
}

Příklad 03: Vstup z klávesnice. Program vytvoří proměnnou. Následně vyčká na vložení čísla uživatelem z klávesnice. Číslo se uloží do paměti a vypíše na nový řádek.


#include <stdio.h>
#include <stdlib.h>

int  x;

int main(){
    printf("Zadejte cislo: \n");         // vypise text a skoci na dalsi radek
    scanf("%d", &x);                     // ceka na vstup z klavesnice, ulozi x
    printf("Hodnota cisla: %d \n", x);   // vypise text a hodnotu x

  system("PAUSE");                       // vycka na stisk libovolne klavesy
  return 0;
}

Číselné konstanty:

Desítková soustava: 109   -15   19U   915L   6598UL

Osmičková soustava: 06   01341   02365

Šestnáctková soustava: 0x0   0xAF3   0xA3A


Základní operace, operátory, logické operátory:

Sčítání     +

Odčítání      –

Násobení      *

Dělení      /

Inkrementace      ++

Dekrementace      – –

Porovnávání      <     >      <=     >=

Rovná se při porovnávání      ==

Nerovná se při porovnávání     !=

And, a zároveň, konjunkce     &&

Or, nebo, disjunkce   ||

Not, negace     !


Příklad 04: Součet dvou čísel. Program sečte dvě čísla zadaná z klávesnice.


#include <stdio.h>
#include <stdlib.h>

int  a;
int  b;
int  c;

int main(){
    printf("Zadejte prvni cislo: \n");
    scanf("%d", &a);
    printf("Zadejte druhe cislo: \n");
    scanf("%d", &b);
    c = a + b;
    printf("Soucet cisel je: %d \n", c);

  system("PAUSE");
  return 0;
}

Příklad 05: Násobení. Program ze dvou čísel vypočítá obsah obdélníku.


#include <stdio.h>
#include <stdlib.h>

int  a;
int  b;
int  obsah;

int main(){
    printf("Obsah obdelniku \n");
    printf("---------------------------------------------------------\n");
    printf("Zadejte delku strany a: ");
    scanf("%d", &a);
    printf("\n");
    printf("Zadejte delku strany b: ");
    scanf("%d", &b);
    printf("\n");
    obsah = a * b;
    printf("Obsah je: %d \n", obsah);
    printf("---------------------------------------------------------\n");

  system("PAUSE");
  return 0;
}

Podmínky uvnitř výrazu:

podmínka ? podminka_splnena : podminka_nesplnena

(a > b) ? (vysledek = A) : ( vysledek = B)


Příklad 06: Porovnání dvou čísel.


#include <stdio.h>
#include <stdlib.h>
             
int  a;
int  b;
int vysledek;


int main(){
    printf("Porovnani dvou cisel \n");
    printf("---------------------------------------------------------\n");     
    printf("Zadejte prvni cislo: ");       
    scanf("%d", &a);
    printf("\n");                      
    printf("Zadejte druhe cislo: ");
    scanf("%d", &b);   
    printf("\n"); 
    (a > b) ? (vysledek = a) : (vysledek = b);          
    printf("Vetsi cislo je: %d \n", vysledek);  
    printf("---------------------------------------------------------\n");      
  
  system("PAUSE");                      
  return 0;
}

Příklad 07: Sestrojitelnost trojúhelníku. Program ověří zda-li lze sestrojit trojúhelník. Zadat můžete i dvě desetinná čísla. Nejdříve se ověří sestrojitelnost a zapíše jako logická 1 nebo 0 do proměnné výsledku. Následně se porovná výsledek a vypíše textový řetězec „lze“ nebo „nelze“.


#include <stdio.h>
#include <stdlib.h>
             
double  a;
double  b;
double c;
int vysledek;


int main(){
    printf("Sestrojitelnost trojuhelniku \n");
    printf("---------------------------------------------------------\n");  
    printf("Dodrzujte stejne jednotky. Pouzivejte desetinnou tecku \n");
    printf("---------------------------------------------------------\n");
         
    printf("Zadejte delku strany a: ");       
    scanf("%lf", &a);
    printf("\n");   
    
    printf("Zadejte delku strany b: ");       
    scanf("%lf", &b);
    printf("\n"); 
    
    printf("Zadejte delku strany c: ");       
    scanf("%lf", &c);
    printf("\n");                    

    ((a + b > c) && (a + c > b) && (c + b > a)) ? (vysledek = 1) : (vysledek = 0);              
    printf("Trojuhelnik sestavit: %s", (vysledek == 1) ? "lze" : "nelze");  
    printf("\n");     
    printf("---------------------------------------------------------\n");      
  
  system("PAUSE");                      
  return 0;
}

 Podmínky pomocí if a else (když a jinak):

if (podmínky)

{následek splněné podmínky}

else

{následek nesplněné podmínky}


Příklad 08: Test dospělosti. Po zadání věku program vypíše zda-li jste dle zákonů ČR dospělý/á.


#include <stdio.h>
#include <stdlib.h>

int  roky;

int main(){
    printf("Test dospelosti \n");
    printf("---------------------------------------------------------\n");

    printf("Kolik je Vam let?: ");
    scanf("%d", &roky);
    printf("\n");

    if (roky >= 18)
       { printf("Jsi dospely/a");}
     else
       { printf("Nejsi dospely/a");}
    printf("\n");
    printf("---------------------------------------------------------\n");

  system("PAUSE");
  return 0;
}

Přepínací podmínka pomocí switch:

switch (výraz)

{

case hodnota_1:

{následek splněné podmínky při hodnotě 1}

break;

case hodnota_2:

{následek splněné podmínky při hodnotě 2}

break;

default:

{následek splněné podmínky při ostatních hodnotách}

break;


Příklad 09: Automatické pozdravy. Dle zadaného času program pozdraví. Pokud k danému času nezná pozdrav, napíše univerzální pozdrav „Dobrý den!“.


#include <stdio.h>
#include <stdlib.h>

int  hodiny;

int main(){
    printf("Automaticke pozdravy \n");
    printf("---------------------------------------------------------\n");

    printf("Kolik je hodin? ");
    scanf("%d", &hodiny);
    printf("\n");

    switch (hodiny)
        {
          case 6:
          case 7:
          case 8:
               { printf("Dobre rano!");}
               break;
          case 12:
               { printf("Dobre poledne!");}
               break;
          case 13:
          case 14:
               { printf("Dobre odpoledne!");}
               break;
          case 18:
          case 19:
               { printf("Dobry vecer!");}
               break;
          default:
               { printf("Dobry den!");}
               break;
        }

    printf("\n");
    printf("---------------------------------------------------------\n");

  system("PAUSE");
  return 0;
}

Cyklus podmínek while:

while (podmínka)

{následek splněné podmínky, úprava podmínky}


Příklad 10: Opakovač. Program zopakuje nápis „Nemám zlobit“ dle zadaného čísla.


#include <stdio.h>
#include <stdlib.h>

int  opakuj;

int main(){
    printf("Opakovac Nemam zlobit \n");
    printf("---------------------------------------------------------\n");

    printf("Kolikrat mam opakovat? ");
    scanf("%d", &opakuj);
    printf("\n");

    while (opakuj > 0 )
        {
          printf("Nemam zlobit! \n");
          opakuj = opakuj - 1;
        }

    printf("\n");
    printf("---------------------------------------------------------\n");

  system("PAUSE");
  return 0;
}

Cyklus podmínek for:

for (vnitřní proměnná , inicializace; podmínka; iterace)

{následek splněné podmínky}

U některých kompilátorů nelze definovat vnitřní proměnnou (C99 mode). Tu je třeba definovat externě (globálně) jako všechny ostatní proměnné a pak až ji použít uvnitř for.

Postup pro úpravu kompilátoru v CODE::BLOCK pro chyby C99 mode.


Příklad 11: Počítání od do (bez C99 mode).  Program napočítá od zadaného čísla min do zadaného čísla max. Každý krok se uloží do proměnné i jenž je zapsána jako globální proměnná mino for.


#include <stdio.h>
#include <stdlib.h>

int  min;
int  max;
int i;

int main(){
    printf("Pocitej do... \n");
    printf("---------------------------------------------------------\n");

    printf("Od kolika mam pocitat? ");
    scanf("%d", &min);
    printf("\n");

    printf("Do kolika mam napocitat? ");
    scanf("%d", &max);
    printf("\n");

    for (i = min; i <= max; i++)
        {
          printf("Cislo! %d \n" , i);
        }

    printf("\n");
    printf("---------------------------------------------------------\n");

  system("PAUSE");
  return 0;
}

Příklad 12: Počítání od do (C99 mode).  Program napočítá od zadaného čísla min do zadaného čísla max. Každý krok se uloží do proměnné i jenž je zapsána jako lokální proměnná uvnitř for.


#include <stdio.h>
#include <stdlib.h>

int  min;
int  max;

int main(){
    printf("Pocitej do... \n");
    printf("---------------------------------------------------------\n");

    printf("Od kolika mam pocitat? ");
    scanf("%d", &min);
    printf("\n");

    printf("Do kolika mam napocitat? ");
    scanf("%d", &max);
    printf("\n");

    for (int i = min; i <= max; i++)
        {
          printf("Cislo! %d \n" , i);
        }

    printf("\n");
    printf("---------------------------------------------------------\n");

  system("PAUSE");
  return 0;
}

Cyklus podmínek do-while:

do

{příkazy vykonané před testem podmínky}

while (podmínka pro další opakování příkazů)


Příklad 13: Násobek čísla. Program zjistí kolikrát se vejde násobek čísla x do čísla y.


#include <stdio.h>
#include <stdlib.h>

int  x;
int  y;
int nasobek = 1;
int vypocteno;

int main(){
    printf("Kolikrat se vejde cely nasobek cisla x do cisla y? \n");
    printf("---------------------------------------------------------\n");

    printf("Zadejte cislo x: ");
    scanf("%d", &x);
    printf("\n");

    printf("Zadejte cislo y: ");
    scanf("%d", &y);
    printf("\n");

    do
        {
          vypocteno = x * nasobek;
          vypocteno = y / vypocteno;
          printf("Cislo: %d" , x*nasobek);
          printf(" se vejde do cisla: %d" , y);
          printf(" ........ ");
          printf("%dx \n" , vypocteno);
          nasobek++;
        }
      while ((x*nasobek)<=y);

    printf("\n");
    printf("---------------------------------------------------------\n");

  system("PAUSE");
  return 0;
}

Přerušení cyklu:

continue – přeruší aktuální cyklus a začne nový.

break – přeruší aktuální cyklus a vyskočí z něj.


Příklad 14: Vynechání sudého násobku čísla pomocí continue.


#include <stdio.h>
#include <stdlib.h>

int x;
int nasobitel = 0;
int vysledek;


int main(){
    printf("---------------------------------------------------------\n");

    printf("Zadejte cislo jehoz nasobek chcete pocitat: ");
    scanf("%d", &x);
    printf("\n");
    printf("Vypisi se jen nasobky jenz jsou licha cisla! ");
    printf("\n");
    printf("---------------------------------------------------------\n");
    do
     {
        vysledek = x * nasobitel;
        nasobitel = nasobitel + 1;

        if (vysledek % 2 == 0) continue;
        printf("Lichy nasobek %d: " , vysledek);
        printf("\n");
     }
     while (nasobitel <= 10);

    printf("---------------------------------------------------------\n");

  system("PAUSE");
  return 0;
}

Příklad 15: Násobek čísla. Počítání bude ukončeno pomocí break při násobku rovnajícímu se 36.


#include <stdio.h>
#include <stdlib.h>

int x;
int nasobitel = 1;
int vysledek;


int main(){
    printf("---------------------------------------------------------\n");

    printf("Zadejte cislo jehoz nasobek chcete pocitat: ");
    scanf("%d", &x);
    printf("\n");
    printf("Vypisi se nasobky cisla. Pokud je nasobek 36, pocitani se ukonci! ");
    printf("\n");
    printf("---------------------------------------------------------\n");
    do
     {
        vysledek = x * nasobitel;
        nasobitel = nasobitel + 1;

        if (vysledek  == 36) break;
        printf("Nasobek %d: " , vysledek);
        printf("\n");
     }
     while (nasobitel <= 10);

    printf("---------------------------------------------------------\n");

  system("PAUSE");
  return 0;
}

Pole:

typ nazev_pole [velikost];

int cisla [10];

int suda [5] = {2, 4, 6, 8, 10};

Prvky se indexují od 0 do max. velikosti pole.


Příklad 16: Výpis každé druhé pozice pole.


#include <stdio.h>
#include <stdlib.h>

int i = 0;
int pole [10] = {10, 11, 12, 13, 14, 15, 16, 17, 18, 19};


int main(){
    printf("---------------------------------------------------------\n");

    do
     {
        printf("%i" , pole[i]);
        printf(" - ");
        i = i + 2;
     }
     while (i <= 9);
    printf(" \n");
    printf("---------------------------------------------------------\n");

  system("PAUSE");
  return 0;
}

Příklad 17: Textový řetězec ze znaků  v poli.


#include <stdio.h>
#include <stdlib.h>

    char retezecA[] = "Testovaci text...";
    char retezecB[] = {'T' , 'E' , 'S' , 'T' , '\0'};

    char znakA;
    int iA = 0;

    char znakB;
    int iB = 0;


int main(){

    while( znakA = retezecA [iA]){
            printf("%c ", znakA);
            iA++;}

    printf("\n");

    while( znakB = retezecB [iB]){
            printf("%c ", znakB);
            iB++;}

    printf("\n");
    printf("\n");

  system("PAUSE");
  return 0;
}

Příklad 18: Práce s poli. Vytvoření dvourozměrného pole (2 x 3). Uložení data narození do pole a následné vyčítání a zpracování hodnot.


#include <stdio.h>
#include <stdlib.h>

int datum [2] [3] =  {{0, 0, 0},
                       {0, 0, 0}};

int rozdil;

int main(){

    datum[1][1] = 2;
    datum[1][2] = 12;
    datum[1][3] = 1984;

    datum[2][1] = 26;
    datum[2][2] = 7;
    datum[2][3] = 1979;

    printf ("Dana se narodila: %d.%d.%d\n" , datum[1][1] , datum[1][2] , datum[1][3]);
    printf ("Tomas se narodil: %d.%d.%d\n" , datum[2][1] , datum[2][2] , datum[2][3]);
    printf ("\n");

    rozdil = datum[1][3] - datum[2][3];

    printf ("Rozdil je: %d let \n" , rozdil);

    printf ("\n");

    system("PAUSE");
    return 0;
}

Příklad 19: Práce s poli. Textové řetězce a čísla.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int i = 0;
int poleA [10] = {10, 11, 12, 13, 14, 15, 16, 17, 18, 19};
int poleB [10] = {100, 100, 100, 100, 100, 100, 100, 100, 100, 100};
char poleT1 [] = {"Zprava v lahvi: "};
char poleT2 [] = {"...jsem na pustem ostrove! A dochazi zasoby!"};
int delkaT1;
int delkaT2;
int soucetAB;

int main(){
    printf("---------------------------------------------------------\n");

    delkaT1 = strlen(poleT1);            // zjisteni delky pole pomoci strlen
    delkaT2 = strlen(poleT2);            // zjisteni delky pole pomoci strlen

    printf("Delka pole T1 je: %d \n" , delkaT1);
    printf("Delka pole T2 je: %d \n" , delkaT2);
    printf(" \n");

    printf("Text: %s \n" , strcat(poleT1, poleT2));  //spojení dvou poli - strncat

    printf(" \n");
    printf("---------------------------------------------------------\n");

    printf("Soucet pole A+B: ");
    do
     {
        soucetAB =  poleA[i] + poleB[i];    //vyhleda v poli na pozici i a scita
        printf("%d" , soucetAB);
        printf(", ");
        i = i + 1;                          //prida k i 1, posune hledanou pozici
     }
     while (i <= 9);
    printf(" \n");
    printf("---------------------------------------------------------\n");

  system("PAUSE");
  return 0;
}

Příklad 20: Vytvoření vlastní funkce pro opakované volání.


#include <stdio.h>
#include <stdlib.h>

void hlaseni (){
    printf ("Toto je prvni zprava \n");
    return;
}

int main(){
    hlaseni ();
    printf ("Toto je druha zprava \n");
    system("PAUSE");
    return 0;
}

Příklad 21: Vlastní funkce s návratovou hodnotou po výpočtu.


#include <stdio.h>
#include <stdlib.h>

int sDPH (int x){
    int celkem;
    celkem = x * 1.21;
    return celkem;
}

int main(){
    int cena;
    printf("Zadejte cenu bez DPH: ");
    scanf("%d", &cena);
    printf("\n");

    cena = sDPH (cena);
    printf ("S DPH je cena: %d \n \n" , cena);

    system("PAUSE");
    return 0;
}

Příklad 22: Vlastní funkce. Nejdříve jsou funkce deklarovány. Následně je vytvořena hlavní funkce. Podmíněné funkce jsou upřesněny až v dalším kódu. Některé proměnné jsou dostupné jen uvnitř bloku aby nedocházelo k jejich kolizím a také se tím šetřila paměť u složitějších programů.


#include <stdio.h>
#include <stdlib.h>

int ctverec (int a);       // priprava funkce
int trojuhelnik (int a);   // priprava funkce
int sestiuhelnik(int a);   // priprava funkce

int main(){
    int volba;          // vytvoreni promenne
    int strana;         // vytvoreni promenne
    static int obvod;   // staticka promenna zanika po ukonceni funkce - bloku

    printf("Vypocet: \n 1-ctverec \n 2-prav. trojuhelnik \n 3-prav. sestiuhelnik \n  ");
    scanf("%d", &volba);
    printf("\n");

    printf("Strana: ");
    scanf("%d", &strana);
    printf("\n");

    switch (volba){
                    case 1: {
                        obvod = ctverec (strana);
                        printf ("Obvod je: %d \n", obvod);
                        return;}

                    case 2: {
                        obvod = trojuhelnik (strana);
                        printf ("Obvod je: %d \n", obvod);
                        return;}

                    case 3: {
                        obvod = sestiuhelnik (strana);
                        printf ("Obvod je: %d \n", obvod);
                        return;}
                  }

    system("PAUSE");
    return 0;
}

int ctverec (int a){
 static int obvod; // staticka promenna zanika po ukonceni funkce - bloku
 obvod = 4* a;
 return obvod;}

int trojuhelnik (int a){
 static int obvod; // staticka promenna zanika po ukonceni funkce - bloku
 obvod = 3* a;
 return obvod;}

int sestiuhelnik (int a){
 static int obvod; // staticka promenna zanika po ukonceni funkce - bloku
 obvod = 6* a;
 return obvod;}

Příklad 23: Vlastní matematické funkce. 


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int aI;
int bI;
int c;

int main()
    {
    printf("%i \n" , secti("950", "10003"));
    printf("%i \n" , odecti("1000", "3"));
    printf("%i \n" , vynasob("111", "7"));
    printf("%i \n" , secti("3a2 1", "100"));

    printf("\n");
    system("PAUSE");
    return 0;
}

int secti(char a[], char b[])
    {
    sscanf(a, "%i", &aI);   //sscanf naskenuje cisla z textoveho pole a do cisla aI
    sscanf(b, "%i", &bI);   //sscanf naskenuje cisla z textoveho pole b do cisla bI
    c = aI + bI;
    return c;
}

int odecti(char a[], char b[])
    {
    sscanf(a, "%i", &aI);
    sscanf(b, "%i", &bI);
    c = aI - bI;
    return c;
}

int vynasob (char a[], char b[])
    {
    sscanf(a, "%i", &aI);
    sscanf(b, "%i", &bI);
    c = aI * bI;
    return c;
}

Příklad 24: Vlastní datový typ.


#include <stdio.h>
#include <stdlib.h>

typedef int cislo; 
cislo x = 10;        // Promennou x nemusime tvorit jako int ale jiz jako cislo

int main(){
    x = x * x;
    printf ("Cislo je %d \n" , x );

    system("PAUSE");
    return 0;
}

Příklad 25: Vlastní datová struktura.


#include <stdio.h>
#include <stdlib.h>

typedef struct hraci{             // struktura hraci
    int cislo;
    char barva [10];
    int score;
    } HRACI;                      // datovy typ HRACI

int main(){

    HRACI Petr = {1, "zelena", 937} ;
    HRACI Lukas = {2, "modra", 941};
    HRACI Otakar = {3, "cervena", 899};

    printf ("%d %s %d \n" , Petr.cislo, Petr.barva, Petr.score );
    printf ("%d %s %d \n" , Lukas.cislo, Lukas.barva, Lukas.score );
    printf ("%d %s %d \n" , Otakar.cislo, Otakar.barva, Otakar.score );
    printf ("\n");



    system("PAUSE");
    return 0;
}

Příklad 26: Ukazatel na místo v paměti (pointer).


#include <stdio.h>
#include <stdlib.h>

int  x = 107;           // promenna x
int  *adresa_x = &x;    // adresa x v pameti

char znak = 'T';
char *adresa_znaku = &znak;

int main(){
    printf("Cislo x je ulozeno v pameti na adrese: %i" , &x);
    printf("\n");
    printf("Na adrese: %i" , &x);
    printf(" je ulozeno cislo: %i" , *adresa_x);
    printf("\n \n \n");

    printf("Znak je ulozen v pameti na adrese: %i" , &znak);
    printf("\n");
    printf("Na adrese: %i" , &znak);
    printf(" je ulozen znak: %c" , *adresa_znaku);
    printf("\n \n \n");

  system("PAUSE");
  return 0;
}