- řetězce - char
- cykly a podmínky - for, while, do while, podmínka if else
- logické výrazy
- úkol č. 3
Řetězce
Takže, začneme se učit o ukládání textu (znaků) do proměnných.
Pamatujete, jak jsme se učili o typech a zazněl tam char?
Vytváří se stejně jako typ int, ale má jinou inicializaci.
char prom[10]; // vytvoří proměnnou prom jako typ
// char o maximální délce 9 znaků
Obecně:
char jméno_proměnné[max_počet_znaků];
Trošku se zmíním o maximální délce znaků, protože se jistě ptáte, proč, když jsme dali maximální počet znaků 10, je jich jen 9.. Později se budeme učit o řetězcích string ale nyní o char ;) :
Styl řetězců má jednu zvláštnost: Poslednim znakem každého řetězce je \0 - tzv. prázdný znak. Tento znak je ASCII kódem 0 a slouží pro označení konce řetězce (0 = nula).
Abyste tedy mohli vytvořit proměnnou typu char, nesmíte zapomenout započítat poslední znak \0.
Chceme vytvořit proměnnou jmeno, která bude mít maximální možnou délku 7 znaků.
Napíšeme tedy:
char jmeno[8];
Musíme totiž započítat onen prázdný znak (proto 8).
Teď vám ukážu dva možné způsoby inicializace, doporučuju používat ten druhý, uvidíte ;)
char jmeno[8] = { 'b', 'e', 'r', 'u', 's', 'k', 'a', '\0' };
a druhý způsob:
char jmeno[8]="Beruska"; // znak \0 se už přidá sám
Jinak když vyvoláte jmeno[3], tak se vám vyvolá 4. písmeno (musíte počítat i tu nulu), tedy u.
Tak, jaký způsob zápisu si vyberte? Myslím, že to vím ;)
Ještě vám ukážu jeden způsob:
char jmeno[]="Beruska"; // nechá kompilator počítat a sám
// zakomponuje prázdný znak \0
Pokud nevyplníte max. počet znaků a necháte tedy kompilátor počítat, MUSÍTE již rovnou inicializovat.
Nemůžete tedy udělat toto:
char jmeno[]; // toto nemůžete napsat a až poté inicializovat
Takže nyní byste měli dokázat stvořit program, který se zeptá na jméno, vek apod.
A teď ještě ukážu, nač se dále používá char.
Na ASCII systému je 'S' jiným způsobem zápisu 83.
Proto příkaz...
char pismeno=64; // ...je @, tedy když vyvoláme
// pismeno, dostaneme @
Díky tomu můžeme vložit češtinu do našeho programu.
char ch=159; // 159 == č
cout << ch << "tverec"; // výsledek : čtverec
Cykly
Počítače provádějí více než jen ukládání dat. Analyzují, spojují, přeskupují a jiným způsobem manipulují s daty. Na provádění svých manipulačních zázraků potřebují nástroje na vykonávání opakovatelných činností a na učinění rozhodnutí. C++ je samozřejmě poskytuje.
Jsou to: for, while, do while, if else a switch.
Používá je i C, takže pokud je znáte, máte plus.
a) for
Pokud chcete něco poslat na výstup vícekrát, než jednou, for vám pomůže.
Nejprve příklad:
int i;
for (i=0; i<5; i++) //1.řádek
cout << "Zde je ten text.\n"; //2.řádek
cout << "konec"; //3.řádek
V prvním řádku píšeme samotnou podmínku, ve druhém příkaz, který se provede, pokud je výsledek pravdivý a ve třetím příkaz, který se provede, pokud je podmínka nepravdivá.
Výsledek by tedy byl:
Zde je ten text.
Zde je ten text.
Zde je ten text.
Zde je ten text.
Zde je ten text.
konec
Druhou část jistě chápete (2. řádek), proto si vysvětlíme první:
Čtěte for jako "pokud", ulehčí vám to práci.
cyklus začíná nastavením proměnné i (vytvořené před cyklem) na nulu.
i = 0; // pozor, musí být středník!
Toto byla inicializační část cyklu.
Dále se testuje podmínka:
i < 5;
zda-li je i menší, než 5. Je-li tomu tak, program provede následující příkaz:
cout << "Zde je ten text.\n";
Potom cyklus použije změnovou část cyklu, aby zvýšil i o 1:
i++ //vysvětlení v minulé lekci
Jak tedy probíhá děj step-by-step? ;)
i=0, 0<5 a tak vytiskne text Zde je ten text.
i=1, 1<5 a tak vytiskne text Zde je ten text.
i=2, 2<5 a tak vytiskne text Zde je ten text.
i=3, 3<5 a tak vytiskne text Zde je ten text.
i=4, 4<5 a tak vytiskne text Zde je ten text.
i=5, 5<5
neplatí, a tudíž se cyklus opouští a následuje další, na cyklu nezávislý příkaz: konec
For tedy probíhá jen tehdy, dokud je děj pravdivý.
Obecně:
for (inicializace; testovací_výraz; změnový_výraz)
příkaz
další příkazy
Inicializace se provádí pouze jednou, jinak by neměl cyklus smysl. Při dalším úkonu tedy není i znovu 0, ale nabývá hodnoty dle změnového výrazu.
Vytvořit i inicializovat proměnnou můžete přímo v cyklu for, ale poté již není možné proměnnou vyvolat (Proměnná bude existovat jen v cyklu, mimo něj neexistuje!).
for (int i=0; i<5; i++)
cout << "Zde je ten text.\n";
cout << "Konec, protoze hodnota i je " << i; // NELZE!
Proměnná i je viditelná jen v tučné části textu! (v cyklu)
* * * Nyní prosím přejděte úplně nakonec této lekce a přečtěte si text pod čarou, poté se sem opět vraťte.
b) WHILE
Cyklud while je cyklus for zbavený inicializační a změnové části, má pouze jednu testovací podmínku a příkaz.
while (testovací_podmínka)
příkaz
Zde také platí, že se cyklus stále opakuje, pokud je podmínka pravdivá. Jakmile je nepravdivá, opouští se cyklus.
int i=0;
while (i<5)
{
cout << "ahoj\n";
i++;
}
Díky while můžeme vytvořit časovou prodlevu :
long cekej=0;
while (cekej < 10000)
cekej++; // počítá potichu
Problém nastává, že na každém PC je jiný procesor a tudíž jiná rychlost :(Proto se používá jiný (lepší) způsob, ale o něm později ;)
c) do while
Třetím cyklem je do while. Liší se od obou předchozích, ptž je cyklem se vstupní podmínkou. Tzn, že cyklus nejprve provede tělo cyklu, a potom teprve vyhodnotí výraz, aby věděl, zda by měl pokračovat dalším průběhem. Když se podmínka ukáže nepravdivým, cyklus končí.V jako jediném se tedy příkazy provedou minimálně jednou.
do
příkaz(y)/blok // nebo-li tělo
while (testovací_podmínka)
Může být použitelný např. při hádání čísla :
#include <iostream>
using namespace std;
int main()
{
int n;
cout << "Zdej cislo od 1 do 10 pro nalezeni ";
cout << "meho oblibeneho cisla\n";
do
{
cin >> n; // provádí tělo
} while (n != 7); // potom testuje
cout << "Ano, 7 je me oblibene cislo.\n" ;
return 0;
}
Cyklus skončí až tehdy, kdy uživatel uhodne číslo /v tomto případě 7/.
d) if else
Čtěte if jako jestliže. A to přesně dělá, vyhodnotí podmínku a je-li pravdivá, provede ji, v opačném případě ji prostě přeskočí.
if (testovací_podmínka)
příkaz1
else
příkaz2
není na tom nic složitého.Nejprve se testuje podmínka. je-li pravdivá provede se příkaz1 (a příkaz2 již NE) , nebo, pokud podmínka není pravdivá, je proveden příkaz2 (příkaz jeden nebude proveden). else vlastně nám jen říká, že i v případě nepravdivé podmínky se má něco udělat.
I zde platí že můžeme použít bloky.
else a příkaz2 můžeme vynechat :
if (testovací_podmínka)
příkaz1
To způsobí, že není-li podmínka pravdivá, pokračuje program dále.. nic se neprovede..
např :
int heslo;
cout << "Zadejte heslo : ";
cin >> heslo;
if (heslo == 1892)
cout << "Spravne, vase heslo je v poradku.";
else
cout << "Vase heslo je spatne.";
Co možná děláte za chybu?Nesmíte použít operátor přiřazení "=" ale podmínky rovnosti "==" //lekce 2
Podmínky lze samozřejmě stupňovat.
int n;
int Fave = 27;
cout << "Zadejte cislo v rozsahu 1-100 ke zjisteni ";
cout << "mého oblibeneho cisla: ";
cin >> n;
if (n < Fave)
cout << "Prilis nizke -- hadejte znovu: ";
else if (n > Fave)
cout << "Prilis vysoke -- hadejte znovu: ";
else
cout << Fave << " je spravne!\n";
Logické výrazy
Často musíte testovat jednu, či více podmínek.Logický operátor NEBO ||
-znamená, že je-li alespoň jeden výraz pravdivý, je podmínka pravdivá. 5 ==5 || 5==9 // pravdivá, protože 1. výraz je pravdivý 5 > 8 || 5 < 2 // nepravdivá, oba jsou nepravdivé tyto výrazy můžete použít např v cyklech
cin >> heslo;
if (heslo==1892 || heslo==2981)
cout << "Spravne";
else
cout << "Spatne";
Pravdivá jen tehdy, pokud uživatel zadal heslo 1892 nebo 2981.Logický operátor A &&
-znamená, že jsou li oba výrazy pravdivé, je podmínka pravdivá.
5 == 5 && 4 == 4 // pravdivá, oba jsou pravdivé
5 == 3 && 4 == 4 // nepravdivá, jeden je nepravdivý
5 > 6 && 8 < 7 // nepravdivá, oba jsou nepravdivé
tyto výrazy můžete použít např v cyklech:
int vek;
cin >> vek;
int heslo=1892;
if (heslo==1892 && vek>=18)
cout << "Spravne";
else
cout << "Spatne";
Pravdivá jen tehdy, pokud uživatel zadal dobré heslo a je mu více než 18 let.
Logický operátor NE !
-obrací pravdivostní hodnotu výrazuPokud je tedy vyraz pravdivý, !vyraz je nepravdivý a naopak.
if ( ! ( x > 5 ) ) // if (x <= 5)
Úkol
Na začátek Vás program 10x uvítá(10x se vypíše ta samá hláška pomocí některého cyklu.Poté se zeptá na Váše jméno a uloží jej, a poté Vám vypíše první písmeno ve jméně.
Vše musí být přehledné,odřádkované apod.
Dále vytvoříte proměnnou (typ char ktera bude mit místo na 5 čísel ) a řeknete uživateli, ať zadá 1. jednociferné číslo, až ho zadá, uloží se jako 1.znak v proměnné typu char , zeptá se znova a uloží až do té doby, až uživatel zadá všech 5 čísel. (Řešte pomocí cyklu)
Nyní Vypíše program první 2 písmena vašeho jména a za ně s mezerami hodnoty, které jste zadali.
Nakonec poděkuje a seznámí uživatele se stránkami www.programujte.com o čem jsou a jak mohou pomoci. (na 3 řádky, ne obecně, ale vaše názory na ně)
Tak, doufám, že máte co dělat ;))
* * *
Zápis příkazů:
Jak můžete například u for, while apod. zapisovat
for (i=0; i<5; i++)
cout << "ahoj.";
tak můžete použít i více příkazů. A to tak, že je dáte do tzv. BLOKU.
for (i=0; i<5; i++)
{
cout << "ahoj.";
cout << "ahoj.";
}
Vše, co je v závorkách { } je tělo f-ce, a všechny se provedou je-li podmínka pravdivá.Více v dodatku, který vyjde. (spíše jen o možnostech tohoto vyžití)