Milan Herda, 04/2020
Lekcia 8
Jazyková konštrukcia, pomocou ktorej vieme zapísať kód, ktorý sa má opakovať.
Každý cyklus má aspoň dve časti:
Telo
Kód, ktorý sa má opakovane vykonávať
Kontrolná podmienka
Podmienka, ktorá určuje,
či má opakovanie pokračovať
Pozor na kontrolné podmienky,
aby nevznikol nekonečný cyklus
Názov, ktorý používame na označenie jedného prechodu telom cyklu.
Opakovanie tela cyklu
while (podmienka) {
telo();
}
Pokiaľ platí podmienka, opakuj telo.
Podmienka je na začiatku a riadi vstup do cyklu
=
vstupná podmienka
while (!jePredTebouStena()) {
krokDopredu();
polozZnacku();
}
do {
telo();
} while (podmienka);
Opakuj telo, pokiaľ platí podmienka.
Podmienka je na konci a riadi výstup z cyklu
=
výstupná (koncová) podmienka
Telo sa vykoná minimálne raz!
do {
krokDopredu();
polozZnacku();
} while (!jePredTebouStena());
for (inicializacia; vstupnaPodmienka; krok) {
telo();
}
for (inicializacia; vstupnaPodmienka; krok) {
telo();
}
inicializacia;
while (vstupnaPodmienka) {
telo();
krok;
}
for (let i = 0; i < 20; i = i + 1) {
krokDopredu();
polozZnacku();
}
let i = 0;
while (i < 20) {
krokDopredu();
polozZnacku();
i = i + 1;
}
Pomocou cyklu for prepíšte funkciu na kreslenie čiary dĺžky N
const ciaraDlzkyN = function (dlzka) {
polozZnacku();
let nakreslenych = 1;
while (!jePredTebouStena() && nakreslenych < dlzka) {
krokDopredu();
polozZnacku();
nakreslenych = nakreslenych + 1;
}
};
Pomocou cyklu for prepíšte funkciu na kreslenie čiary dĺžky N
const ciaraDlzkyN = function (dlzka) {
for (let i = 0; i < dlzka; i = i + 1) {
polozZnacku();
krokDopredu();
}
};
const ciaraDlzkyN = function (dlzka) {
polozZnacku();
for (let i = 1; !jePredTebouStena() && i < dlzka; i = i + 1) {
krokDopredu();
polozZnacku();
}
};
for (let vlastnost in objekt) {
telo();
}
Toto je špeciálny typ cyklu, ktorý:
const osoba = {
meno: 'fero',
priezvisko: 'mrkvička',
vyska: 183,
vek: 25,
};
for (let vlastnost in osoba) {
const hodnota = osoba[vlastnost];
// porozmyslajte, preco nemozeme pouzit osoba.vlastnost?
console.log(
'Hodnota vlastnosti ' + vlastnost + ' je ' + hodnota
);
}
Vykonávanie tela každého zo spomenutých cyklov viete ukončiť predčasne pomocou dvoch príkazov:
break
continue
Ukončí všetky iterácie aktuálneho cyklu a pokračuje ďalším kódom.
Ukončí aktuálnu iteráciu a pokračuje ďalšou.
Pre while vyhodnotí podmienku.
Pre for urobí krok a potom vyhodnocuje podmienku.
for (let i = 0; i < 20; i = i + 1) {
polozZnacku();
if (jePredTebouStena()) {
break;
}
krokDopredu();
}
Podmienené vykonávanie kódu.
Používa sa ako náhrada pre sekvencie
if - else if - else if - ... - else
switch (vyraz) {
case 1:
urobNieco();
break;
case 'hodnota2':
urobNiecoIne();
break;
case 'hodnota3':
urobNiecoUplneIne();
break;
default:
urobNiecoBezne();
break;
}
switch (vyraz) {
case 1:
urobNieco();
break;
case 'hodnota2':
urobNiecoIne();
break;
case 'hodnota3':
urobNiecoUplneIne();
break;
default:
urobNiecoBezne();
break;
}
Najskôr sa vyhodnotí
výraz.
Následne sa hodnota výrazu porovnáva (pomocou ===)
s hodnotami uvedenými v návestiach (case).
switch (vyraz) {
case 1:
urobNieco();
break;
case 'hodnota2':
urobNiecoIne();
break;
case 'hodnota3':
urobNiecoUplneIne();
break;
default:
urobNiecoBezne();
break;
}
Pri nájdení prvej zhody sa začne vykonávať kód, ktorý nasleduje za týmto návestím.
Vykonáva sa až do konca príkazu switch alebo do prvého prerušenia behu (typicky break)
Môže byť aj return (ale ukončuje funkciu) alebo continue (ukončuje aj cyklus)
switch (vyraz) {
case 1:
urobNieco();
break;
case 'hodnota2':
urobNiecoIne();
break;
case 'hodnota3':
urobNiecoUplneIne();
break;
default:
urobNiecoBezne();
break;
}
if (vyraz === 1) {
urobNieco();
} else if (vyraz === 'hodnota2') {
urobNiecoIne();
} else if (vyraz === 'hodnota3') {
urobNiecoUplneIne();
} else {
urobNiecoBezne();
}
switch (vyraz) {
case 1:
urobNieco();
break;
case 'hodnota2':
urobNiecoIne();
case 'hodnota3':
urobNiecoUplneIne();
break;
default:
urobNiecoBezne();
break;
}
Keď sa neuvedie príkaz break, tak vykonávanie kódu "prepadáva" do ďalšieho návestia.
if (vyraz === 1) {
urobNieco();
} else if (vyraz === 'hodnota2') {
urobNiecoIne();
urobNiecoUplneIne();
} else if (vyraz === 'hodnota3') {
urobNiecoUplneIne();
} else {
urobNiecoBezne();
}
Prepíšte funkciu akyJeDalsiSmerVlavo pomocou príkazu switch
const SEVER = 'sever';
const JUH = 'juh';
const ZAPAD = 'západ';
const VYCHOD = 'východ';
const akyJeDalsiSmerVlavo = function (terajsiSmer) {
if (terajsiSmer === SEVER) {
return ZAPAD;
}
if (terajsiSmer === ZAPAD) {
return JUH;
}
if (terajsiSmer === JUH) {
return VYCHOD;
}
return SEVER;
};
const SEVER = 'sever';
const JUH = 'juh';
const ZAPAD = 'západ';
const VYCHOD = 'východ';
const akyJeDalsiSmerVlavo = function (terajsiSmer) {
switch (terajsiSmer) {
case SEVER:
return ZAPAD;
case ZAPAD:
return JUH;
case JUH:
return VYCHOD;
default:
return SEVER;
}
};
Treba ho poznať, ale neodporúčam ho používať.
Problémom je potreba ukončovať návestia.
Chýbajúci break môže byť úmyselný, ale väčšinou nie je :)
Vznikajú kvôli tomu veľmi ťažko odhaliteľné chyby.
Riešenie:
Nepoužívať switch a vetviť iba pomocou if