Bloky
V jazyku C++ môžeme definovať pomocou {} blok, v ktorom môžeme deklarovať lokálne premenné. Inak povedané, premenná je platná len vo vnútri bloku. Ak sa končí náš blok, definovaná premenná stráca platnosť. Prvý príklad nám fungovanie bloku priblíži viac.
Ešte poznámka, bloky sa využívajú všade. Poznáte ich z cyklov či podmienok. Teraz sa ale zameriame na platnosť samotných premenných. Taktiež by vám to malo zodpovedať otázku, prečo (väčšinou, podľa potreby) nedeklarujeme premenné v aktuálnom dosahu bloku, ale mimo nich (alebo výstižnejšie, nad vyššou úrovňou ako je aktuálny blok).
1. príklad: Využitie bloku
#include <iostream> using namespace std; int main() { int vaha = 55; { int vyska = 189; cout << "Moja vyska je: " << vyska << " a vaha: " << vaha << "\n"; } return 0; }
Výsledná činnosť programu:
Moja vyska je: 189 a vaha: 55
Rozbor programu:
Vidíte, náš definovaný blok kódu funguje. Vo vnútri sme si vytvorili svoju premennú a následne sme ju vypísali. Ale, akú máme záruku, že premenná vyska je prístupná i mimo bloku?
Presvedčme sa v ďalšom príklade.
2. príklad: Skúsme oproti prvému príkladu šupnúť výpis premennej vyska mimo pôsobností bloku
#include <iostream> using namespace std; int main() { int vaha = 55; { int vyska = 189; } cout << "Moja vyska je: " << vyska << " a vaha: " << vaha << "\n"; return 0; }
Výsledná činnosť programu:
vaša cesta k súboru||In function 'int main()':| vaša cesta k súboru|8|warning: unused variable 'vyska' [-Wunused-variable]| vaša cesta k súboru|10|error: 'vyska' was not declared in this scope| ||=== Build failed: 1 error(s), 1 warning(s) (0 minute(s), 1 second(s)) ===| Alebo iný podobný výpis, avšak všetky výpisy majú spoločné slovo error
Rozbor programu:
Čo sme pokazili? Len to, že sme k lokálne deklarovanej premennej vyska chceli pristúpiť mimo nášho bloku definovaného {}. Všimnite si ale, že premenná vaha má prístup k celému kódu. Aj v bloku. Pretože premenná váha je súčasťou dobre známej hlavnej funkcie main. Premenné v main majú prístup do celého bloku, ale mimo funkcie main nemajú.
Na záver tejto témy si dajme ešte jeden príklad.
3. príklad:
#include <iostream> using namespace std; int main() { int vaha = 65; { int vaha = 109; } cout << "Moja vaha je: " << vaha << "\n"; return 0; }
Výsledná činnosť programu:
Moja vaha je: 65
Rozbor programu: Výsledok je vám jasný? Stále pamätajte, kde je pôsobnosť deklarovanej premennej v bloku.
Reverzný reťazec
V minulých dieloch sme si ukázali ako jednoducho vypísať pole a reťazec obrátene. Teraz to skomplikujme a napíšeme obratené reťazec pomocou výmeny písmen. Nazveme to reverzný reťazec. Využijeme pri tom knižnicu <string>, ktorá je ušitá presne pre potreby jazyka C++.
4. príklad: Reverzný reťazec
#include <iostream> #include <string> using namespace std; int main() { string word; cout << "Napiste lubovolne slovo: "; getline(cin, word); if (word.empty()) { cout << "Sorry, ale musis nieco zadat! Skus znova."; return 0; } char znak; int i, j; for (i = 0, j = word.size() - 1; i < j && j > 0; i++, j--) { znak = word[j]; word[j] = word[i]; word[i] = znak; } cout << "Vas zadany retazec po reverzii je: " << word << "\n"; return 0; }
Výsledná činnosť programu:
Napiste lubovolne slovo: maminka Vas zadany retazec po reverzii je: aknimam
Rozbor programu: Už hneď si všimnete, že tento program je napísaný profesionálnejšie a snáď tak uspokojím i náročnejších čitateľov. Zároveň je to ľahko pochopiteľný algoritmus. Miesto zbytočného písania dvoch cyklov for, sme využili možnosť to skĺbiť v jedno napísanie cyklu for. Algoritmus funguje tak, že vymieňa jednotlivé písmená z oboch strán v reťazci. Áno, to som napísal dosť krkolomne, preto radšej ukážem príklad:
Máme slovo maminka, ako som zadal už v bežiacom programe.
Vo slove maminka najprv premenná i zoberie prvé písmeno m a premenná j zoberie posledné písmeno a. Následne algoritmus prehodí oba písmena. A takto to pokračuje ďalej. Ukážka:
1. iterácia: maminka po vykonaní aaminkm
2. iterácia: aaminkm po vykonaní akminam
3. iterácia: akminam po vykonaní aknimam
4. iterácia: sa nevykoná, pretože je porušená podmienka i<j