Relační operátory a podmínky, příkaz switch

4. díl - Relační operátory a podmínky, příkaz switch

Petr Sklenička       29.06.2010       C++/C       18806 zobrazení

V dnešním díle se seznámíme s relačními a logickými operátory a naučíme se podmínky (příkaz if). Dále si ukážeme příkaz switch a na konci dílu si opět napíšeme krátký program.

V předchozím díle jsme se naučili pracovat s proměnnými, dnes nás čekají podmínky. Nejprve se ale podíváme na to, co jsou relační operátory, neboť v podmínkách se s nimi setkáme.

Relační operátory se používají, chceme-li určit, zda jsou si dvě čísla rovna nebo jestli je jedno větší či menší než druhé. Každý příkaz, obsahující relační operátor, se vyhodnotí buď jako pravdivý nebo nepravdivý. Relačních operátorů je šest, konkrétně rovná se, menší než, menší nebo rovno, větší než, větší nebo rovno a nerovná se. Viz následující tabulka:

Název

Operátor

Rovná se ==
Menší než <
Menší nebo rovno <=
Větší než >
Větší nebo rovno >=
Nerovná se !=

Dáte mi jistě za pravdu, že něco podobného znáte z matematiky. Dovolím si však upozornit na operátor rovná se, neboť si všimněte, že jde o dva znaky rovná se vedle sebe ( == ). Začátečníci si často pletou operátor přiřazení ( = ) s relačním operátorem rovná se ( == ). Díky tomu může v programu dojít k nepříjemným chybám. Pokud tedy například chceme do proměnné přiřadit hodnotu, použijeme operátor přiřazení. Chceme-li porovnat dvě čísla, je nutné použít relační operátor rovná se. Žádnou jinou záludnost však v relačních operátorech nehledejte. Nyní jsme připraveni naučit se podmínky, tedy příkaz if.

Příkaz if

Příkaz if nám umožňuje v programu otestovat nějakou podmínku (například, zda je číslo a větší než číslo b, apod.) a na základě vyhodnocení této podmínky můžeme poté rozvětvit kód. Jednoduchá ukázka příkazu if může vypadat třeba takto:

 if (a < b)
     cout <<
"Cislo 'a' je mensi.\n";

Výraz v závorce může být libovolný, ve velké většině případů se ale jedná o výraz obsahující relační operátor, jako je tomu i v tomto případě. Má-li výraz hodnotu nepravda, příkaz se neprovede, v opačném případě se provede. Z ukázky kódu nelze určit, jakou hodnotu výraz má, neboť neznáme hodnoty proměnných. Pokud by ale například proměnná a měla hodnotu 3 a proměnná b 7, výraz by byl vyhodnocen jako pravdivý a na obrazovku by se vypsalo Cislo ‘a’ je mensi.

Kdybychom chtěli provést více příkazů při splnění podmínky, je nutné je uzavřít do složených závorek.

 if (a < b)
{
    
// příkaz 1
    // příkaz 2
    // příkaz 3
}

/* POZOR! Příkaz na tomto místě by se provedl vždy -
není už ve složených závorkách a proto se k podmínce nevztahuje */

Napsání podmínky tedy není nic složitého – napíšeme klíčové slovo if, za něj do kulatých závorek výraz, který se má vyhodnotit a pak do složených závorek příkazy, které se mají provést, pokud se výraz vyhodnotí jako pravdivý.

Klauzule else

Zatím jsme si ukázali, jak provést nějaké příkazy, pokud je výraz pravdivý. Často však potřebujeme větvit program do dvou směrů. Jinak řečeno, pokud je podmínka splněna, provedou se jiné příkazy než při jejím nesplnění. K tomu nám poslouží klíčové slovo else.

 if (a < b)
{
     cout <<
"Cislo 'a' je mensi nez cislo 'b'.\n";
     cout <<
"Podminka je splnena.\n";
}
else
{
     cout <<
"Cislo 'a' neni mensi nez cislo 'b'\n";
     cout <<
"Podminka neni splnena.\n";
}

Na ukázce je vidět, jak else používat. Pokud bychom u else měli jen jeden příkaz, nemuseli bychom používat složené závorky, stejně jako je tomu u if. Dále si všimněte stylu odsazení – mě se tento způsob odsazování jeví jako nejlepší, neboť je hned vidět, co se stane při splnění nebo nesplnění podmínky.

Pokud nám nepostačí ani dva směry větvení programu, můžeme použít ještě else if. To lze použít teoreticky nekonečněkrát. Na následující ukázce pochopíte.

 if (a == 0)
{
     cout <<
"Cislo 'a' je nula.\n";
}
else if (a == 1)
{
     cout <<
"Cislo 'a' je jedna.\n";
}
else if (a == 2)
{
     cout <<
"Cislo 'a' je dva.\n";
}
else
{
     cout <<
"Cislo 'a' neni nula, jedna, ani dva.\n";
}

Pokud tedy proměnná a má hodnotu 0, 1 nebo 2, vypíše se patřičný text. Jinak (else) se vypíše Cislo ‘a’ neni nula, jedna, ani dva. Else if můžete napsat kolikrát chcete, někdo ale v těchto případech dává přednost použití switch, ke kterému se dostaneme za chvíli. Dále si v ukázce všimněte, že porovnáváme čísla, proto používáme relační operátor rovná se ( == ).

Složitější podmínky

Podmínky lze i všelijak kombinovat, lze tedy vytvořit vnořené příkazy if. Může se jednat například o takovýto kód:

 if (a == b)
{
    
if (c == d)
     {
        
// nějaké příkazy
    }
    
else if (c > d)
     {
        
// jiné příkazy
    }
    
else
    {
        
if (a > d)
         {
            
// zase jiný příkaz
        }
        
else
        {
            
// už zase nějaký příkaz
        }
     }
}
else
{
    
// opět nějaký příkaz
}

Takovýmto způsobem byste mohli vytvořit velkou spoustu vnořených příkazů if. Kdo by se v tom poté vyznal je věc druhá. Kompilátoru by to samozřejmě nevadilo, člověk by se ale při luštění kódu mohl trochu “zapotit”. Proto je dobré vždy dobře předem rozmyslet, jak podmínky napsat tak, aby splnily svůj účel, zároveň aby však byly člověku srozumitelné.

Logické operátory

Často můžeme v podmínce chtít položit více než jednu otázku, čili chceme vyhodnotit dva nebo více výrazů. Mezi tyto výrazy umisťujeme logické operátory, v jazyce C++ jsou to logické AND, OR a NOT. Možná jste se s něčím podobným potkali v matematice, tuším že se tomu říká výroková logika.

Logické AND (a zároveň, a současně)

   Tento operátor vyhodnocuje výrazy a jestliže platí všechny současně, pak je celý výraz také pravdivý. Máte-li tedy peníze a současně je otevřeno v restauraci, můžete se jít najíst. V jazyce C++ se tento operátor zapisuje &&. Viz následují část kódu.

 if ((a == 3) && (b == 4))
     cout <<
"'a' je tri a zaroven 'b' je ctyri.\n";
else
    cout << "Podminka nebyla splnena.\n";

Pokud bude proměnná a mít hodnotu 3 a proměnná b hodnotu 4, podmínka bude splněna. Vidíte, že opět žádná složitá věc to není.

Logické OR (nebo)

Logické OR vyhodnocuje výrazy a platí li alespoň jeden z nich, podmínka bude splněna. Máte-li tedy kreditní kartu nebo peníze v hotovosti, můžete si něco koupit. Pokud máte obojí, je to také v pořádku. Tento operátor napíšeme takto: ||.

 if ((a == 3) || (b == 3))
     cout <<
"Jedna z promennych ma hodnotu 3. A mozna ze obe.\n";
else
    cout << "Podminka nebyla splnena.\n";

Ke splnění podmínky stačí aby jedna z proměnných měla hodnotu 3. Pokud by ani jedna neměla hodnotu 3, podmínka by splněna nebyla.

Logické NOT (ne)

Logický výraz NOT se vyhodnotí jako pravdivý, je-li testovaný výraz nepravdivý. Tento operátor zapisujeme pomocí vykřičníku.

 if (!(a == 2))
     cout <<
"'a' NEMA hodnotu 2.\n";
else
    cout << "'a' MA hodnotu 2.\n";

V dalších dílech, až budeme společně programovat něco zajímavějšího, se s těmito operátory ještě setkáme, takže pokud Vám teď nejsou stoprocentně jasné, nemusíte se bát. V praxi zbytek pochopíte.

Příkaz switch

Příkaz switch nám umožňuje větvení podle více hodnot. Jak se příkaz používá si ukážeme na krátkém příkladě.

 #include <iostream>
using namespace std;


int main()
{
    
int znamka;

     cout <<
"Jakou znamku jsi dostal ve skole? ";
     cin >> znamka;

    
switch (znamka)
     {
    
case 1:       
         cout <<
"Vyborne. Jsi velmi chytry.\n";
        
break;
    
    
case 2:       
         cout <<
"Chvalitebne. Je to dobre, skoda ze to neni jednicka.\n";
        
break;
    
    
case 3:       
         cout <<
"Dobry. No, priste se vice snaz.\n";
        
break;
    
    
case 4:       
         cout <<
"Dostatecne. Davej pozor, aby si nepropadl.\n";
        
break;
    
    
case 5:       
         cout <<
"Nedostatecne. Hned se jdi ucit!\n";
        
break;

    
default:
         cout <<
"Nelzi, takova znamka ve skole neni.\n";
     }

    
return 0;
}

Jde o program, který podle známky ve škole vypíše nějaký text. Program tedy očekává číslo (tj. známka), které se předá příkazu switch. V případě zadání celého čísla v rozmezí 1 až 5 se vypíše patřičný text a poté se příkazem break ukončí switch. Pokud bude zadána známka, která se ve škole nedává (např. 6), vypíše se Nelzi, takova znamka se ve skole nedava, program tedy skočí k příkazu default, který ale není povinný. Kdybychom jej v našem kódu smazali a zadali známku 6, nic by se nevypsalo. U jednotlivých možností (case 1, case 2 …) je nutné napsat příkaz break, čímž zamezíme provedení příkazu default. Kdybychom příkaz break nepsali, tak například při zadání známky 3 by se vypsalo Dobry. No, priste se vice snaz. Vypsalo by se ale taktéž Nelzi, takova znamka ve skole neni.

Celý tento program by bylo možné přepsat pomocí příkazu if a else if. Je na Vás, jakou možnost budete používat, mě se více líbí switch.

Program – sleva při nákupu

Stejně jako v minulém díle, tak i dnes si na závěr napíšeme jednoduchý program, na kterém si procvičíme to, co jsme se naučili. Příkaz switch jsme si ukázali na předchozím příkladě, proto se nyní bude jednat o příklad s jednoduchou podmínkou if.

Našim cílem bude napsat program, který vypočítá cenu nákupu. Cena se vypočítá jako počet zakoupených kusů x cena za kus. Koupí-li si ale zákazník více než tři kusy, cena za jeden kus se sníží o polovinu. Pro lepší pochopení mějme třeba zákazníka Pepu, který si koupí dva kusy zboží, kdy jeden kus stojí 43 Kč. Zaplatí tedy 2 x 43 = 86 Kč. Kdyby si ale Pepa koupil šest kusů, cena za kus by nebyla 43 Kč, ale 43 / 2 = 21,5 Kč. Zaplatil by tedy 6 x 21,5 = 129 Kč.

Pokud chcete, můžete si to nejprve zkusit sami, opět nejde o nic složitého. Pokud by se přeci jen vyskytl nějaký problém, zde je kód:

 #include <iostream>
using namespace std;


int main()
{
    
int pocetKusu;
    
double cenaZaKus, vyslednaCena;


     cout <<
"Zadejte pocet zakoupenych kusu: ";
     cin >> pocetKusu;

     cout <<
"Zadejte cenu za jeden kus: ";
     cin >> cenaZaKus;

    
if (pocetKusu > 3)
     {
        
// Cena se slevou
        vyslednaCena = (cenaZaKus / 2) * pocetKusu;
     }
    
else
    {
        
// Cena bez slevy
        vyslednaCena = cenaZaKus * pocetKusu;
     }

     cout <<
"Zakaznik zaplati " << vyslednaCena << " Kc.\n";

    
return 0;
}

Vidíme, že program se může zachovat dvěma způsoby. Jestliže je počet kusů větší než tři, cena se počítá jinak, než pokud je počet kusů menší než tři. Jde tedy o úplně jednoduchou podmínku. Program si můžete zkusit “vyšperkovat” třeba tím, že cena se bude ještě odvíjet od toho, jestli má zákazník členskou kartu, jestli nemá nějaký slevový kupón atd.

Tímto programem končí čtvrtý díl. Na závěr ještě uvádím krátký přehled, co nás čeká v několika následujících dílech.

  • Pátý díl – Pole (co je to pole, inicializování polí, deklarování polí, vícerozměrná pole atd.)
  • Šestý díl – Smyčky (for, while)
  • Sedmý díl – Funkce
  • Osmý díl – Ukazatele, neboli pointery
  • Devátý díl – Doplnění některých informací, popis a implementace některých základních algoritmů
  • Desátý díl – Úvod do OOP (objektově orientované programování)

Budu se snažit tento sled dodržet, může se však stát, že dojde k nějaké změně. Proto prosím neberte tento přehled jako zcela přesný a závazný. 

 

hodnocení článku

5 bodů / 7 hlasů       Hodnotit mohou jen registrované uživatelé.

 

Všechny díly tohoto seriálu

13. Virtuální metody 01.02.2012
12. Dědičnost 24.07.2011
11. Konstruktory, destruktory a hrátky s objekty 28.05.2011
10. Úvod do objektově orientovaného programování 10.03.2011
9. Ukazatele a odkazy, vyhledávání půlením intervalu 26.01.2011
8. Funkce 18.12.2010
7. Cykly, neboli smyčky - pokračování 19.11.2010
6. Cykly, neboli smyčky 26.10.2010
5. Pole 13.07.2010
4. Relační operátory a podmínky, příkaz switch 29.06.2010
3. Proměnné a konstanty 22.06.2010
2. První program 15.06.2010
1. Úvod, příprava na psaní aplikací v C++ 08.06.2010

 

Mohlo by vás také zajímat

C++/CLI a interoperabilita managed a unmanaged kódu - díl 1.: Úvod do jazyka a základní konstrukce

V tomto článku je popsána nadstavba C++ pro práci s .NET prostředím zvaná C++/CLI umožňující vytvářed mixed assembly obsahující jak managed tak unmanaged kód. V prvním díle je popsána myšlenka jazyka a základní syntaktické konstrukty (základní typy, podmínky, cykly, pole, namespace a část tříd a objektů). U čtenáře je předpokládána znalost .NET frameworku a nativního programování nejlépe v C++ (alespoň syntaxi a základy).

C++/CLI a interoperabilita managed a unmanaged kódu - díl 2.: Složitější konstrukty, low-level přístup a generické programování

V tomto článku je popsána nadstavba C++ pro práci s .NET prostředím zvaná C++/CLI umožňující vytvářed mixed assembly obsahující jak managed tak unmanaged kód. V tomto díle jsou popsány pokročilejší partie jazyka týkající se hlavně objektů, low-level přístupu k managed objektům a generického programování.

Virtuální souborový systém

Článek pojednává o způsobu návrhu virtuálního souborového systému. Před čtením Vám doporučuji stáhnout si a přečíst zadání, abyste věděli o co vlastně jde. Ke stažení jsou i zdrojové kódy v jazyce C++. Aplikace asi nemá žádné velké využití, nicméně přišlo mi to jako zajímavý problém - jednalo se o semestrální projekt.

 

 

Nový příspěvek

 

Mr.

1'

csharp|

xml|

css|


'

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Poděkování

Děkuji autorovi za velmi jasný a výstižný tutoriál.

Oceňuji, že autor byl schopný stručnou formou vyjádřit podstatné a názorně vysvětlit předmětnou problematiku.

Váš přístup je, ve srovnání s nekonečnými a nic neříkajícími texty některých učebnic, velmi efektivní.

Klobouk dolu a ještě jednou děkuji!

Karel

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Jak na to :)

Dobrý den všem na portálu. Na škole budeme mít teď v druhém pololetí základy C++ a tak se ho snažím učit už teď pomocí těchto dílů. Teprve jsem začal a abych jen neopisoval, tak jsem si zkusil příklad o obsahu kruhu trochu rozšířit. Vypočítat obsah dvou kruhů, ty pak porovnat a nechat vypsat, jestli je <, >, nebo ==. Udělal jsem to takhle:

#include <iostream>
using namespace std;

int main()
{
	const double pi = 3.1415;
	double polomer;
	double obsah;

	cout << "Vypocet obsahu dvou kruhu a jejich nasledne porovnani.\n\n";
	cout << "Zadejte polomer kruhu 1: ";
	cin >> polomer;

	obsah = pi * polomer * polomer;
	cout << "Obsah kruhu 1 je: " << obsah << "\n\n\n";


	double polomer2;
	double obsah2;

	cout << "Zadejte polomer kruhu 2: ";
	cin >> polomer2;

	obsah2 = pi * polomer2 * polomer2;
	cout << "Obsah kruhu 2 je: " << obsah2 << "\n\n\n";

	if (obsah < obsah2)
	{
		cout << "Obsah kruhu 1, je mensi, nez obsah kruhu 2.\n\n";
	}

	else if (obsah > obsah2)
	{
		cout << "Obsah kruhu 1, je vetsi, nez obsah kruhu 2.\n\n";
	}

	else if (obsah == obsah2)
	{
		cout << "Obsah kruhu 1, je roven obsahu kruhu 2.\n\n";
	}
	cin.get();
	cin.get();
	return 0;
}

Ale ze zvědavosti jsem zkusil to porovnání napsat i tak, jak je to níž a taky to fungovalo. Moje otázka tedy zní. Je jedno, jak to napíšu, nebo ne, popřípadě, jak jinak (lépe) to napsat? I když budeme mít C++ jen půl roku a asi hodně okrajově, tak mně se ten jazyk líbí a chtěl bych se ho naučit pořádně. Díky všem co odpoví za radu. Jinak, autorům dotNETportálu díky za to, co pro ostatní dělají.

	if (obsah < obsah2)
		cout << "Obsah kruhu 1, je mensi, nez obsah kruhu 2.\n\n";

	if (obsah > obsah2)
		cout << "Obsah kruhu 1, je vetsi, nez obsah kruhu 2.\n\n";

	if (obsah == obsah2)
		cout << "Obsah kruhu 1, je roven obsahu kruhu 2.\n\n";
nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Diskuse: Relační operátory a podmínky, příkaz switch

Musim říct, že toto je konečně srozumitelný návod na funkce switch. Celý den pročítám stránky na googlu a nic z toho jsem nepobral, ale na todle se stačí podivat a člověk hned ví jak nato!!! Díky !!!

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Diskuse: Relační operátory a podmínky, příkaz switch

Dobrý den,

dokázal by mi někdo říci, jak rozchodit switch s poli?

Dejte tomu, že mám int promena[2];

Jak to zapsat, aby se to dalo použít na způsob switch? Tam se totiž píše case 1...

Děkuji

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Zcela přesně nerozumím Vaší otázce. Pokud se ale ptáte na to, jakým způsobem realizovat switch, kde hodnota, podle které se budete rozhodovat, bude některý prvek v poli, pak by to vypadalo takto:

switch (mojePole[1])          // rozhoduje se podle prvku na pozici 1
{
   case 1:
      // ...
      break;
   case 2:
      // ...
      break;
   default:
      // ...
}

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Pochopil jste to správně. Takže s poli pracuji (se switch), jako bych pracoval s normálními proměnými.

Děkuji

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

K tomu co jste napsal.

switch (mojePole[1])          // rozhoduje se podle prvku na pozici

Tomu nějak nerozumím. Jak to myslíte? Že se ty case budou týkat hodnot v prvku mojePole[1]? A pro mojePole[0] je potřeba udělat další switch?

Ještě bych na to chtěl navázat. Když by byla ta proměná mojepole typu double, jak to potom použít s case? Case 1 totiž říká, když se rovná 1, ale když je double desetiné číslo, tak to nebude fungovat.

Asi by nešlo použít něco v tom smyslu:

case (mojePole[0] > 0) && (mojePole[0] < 1):
...

že?

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Diskuse: Relační operátory a podmínky, příkaz switch

Ahoj snažil jsem se vylepšit příklad z dílu o proměnných :

#include <iostream>

using namespace std;
int main()
{
	const double pi = 3.14159;
	double r;

	cout << "VITEJTE V PROGRAMU PRO VYPOCET OBSAHU KRUHU \n";
	cout << "\n";
	cout << "\n Zadejte polomer (r) kruhu v cm :";
	cin >> r;
	if (r <= 0) {
	   cout << "Cislo musi byt vetsi nez nula ";
	   cin >> r;
	} 
	else {
		double vysledek = pi * r * r;
		cout << "Obsah kruhu je " << vysledek << "cm2";
 	}
}

A když mi vyskočí podmínka, nebo výsledek, jenom to problikne a program se vypne, můžu se zeptat, jak to udělat, aby to čekalo na stisknutí libovolného tlačítka ?

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Pokud používáte Microsoft Visual Studio, pak stačí program spustit klávesovou zkratkou Ctrl+F5.

Jinak stačí do kódu dopsat například toto:

cin.get();

nahlásit spamnahlásit spam 2 / 4 odpovědětodpovědět

Díky, přesně to jsem hledal (cin.get();)...

Ještě mám jeden dotaz,mám problém s háčky a čárky,lze to nějak nastavit,aby je to psalo ?

nahlásit spamnahlásit spam -3 / 3 odpovědětodpovědět

Diskuse: Relační operátory a podmínky, příkaz switch

Nevi nahodou někdo jak c++ napsat script který by každý lichý řádek dvourozměrného pole naplnil jedničkami nebo aby nastavil prvky ve čtvercovém dvourozměrném poli na hodnoty 0 a 1 tak, aby 0 a 1 tvořily šachovnici. Moc by mi to pomohlo chystám se na test do školy a nějak tomu nemužu přijít na kloub. Potřeboval bych nějaký příklad na prozkoumáni. Dik.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Nehledejte v tom nic složitého. Máte dvourozměrné pole, k tomu abyste postupně prošel každý prvek se hodí dva cykly. V těle vnořeného cyklu pak musíte napsat podmínku, že pokud jste na lichém řádku, budete do pole ukládat jedničky, v opačném případě třeba nuly. Otázkou je, jak napsat tuto podmínku. Doporučuji operátor %, pomocí něhož zjistíte zbytek po dělení. Pokud tedy budete dělit dvojkou, zbytek bude jednou nula, podruhé jedna. Jiná možnost nepřipadá v úvahu. Na tomto základě rozhodnete, zda jste na sudém, nebo lichém řádku. Sám jsem si to napsal, jde o velmi krátký kód, věřím, že to zvládnete. Kdybych Vám sem kód dal, nic byste se nenaučil a hlavně zde platí, že domácí úkoly se zde neřeší.

Co se týče té "šachovnice", uvědomte si, že při procházení pole jednou napíšete jedničku, podruhé ne. Tímto způsobem projdete celé pole. Čili doporučuji nějakou pomocnou proměnnou, která se bude zvyšovat o jedničku a opět zjišťujte, zda je hodnota lichá nebo sudá.

Pokud byste s tím měl další problémy, nebojte se zeptat. Hodně zdaru :-)

nahlásit spamnahlásit spam 1 / 3 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback