Podmienka a cyklus
19.10.2009 23:14Podmienkaa cyklus
Vetvenie - podmienka IF
Niekedy v programe chceme, aby vykonal rôzne príkazy v závislosti od vstupných údajov, prípadne v závislosti od momentálneho stavu bežiacej aplikácie. V každom vyššom programovacom jazyku existuje nejaká forma podmieneného príkazu.
V Delphi má tvar:
if podmienka then
begin
postupnosť_príkazov1;
end
else begin
postupnosť_príkazov2;
end;
postupnosť_príkazov3;
• Podmienka je výraz, ktorý vždy nadobúda jednu z 2 logických hodnôt. True (výraz je pravdivý) alebo False (výraz je nepravdivý)
• Postupnosť_príkazov1 sa vykoná v prípade, keď je podmienka pravdivá.
• Postupnosť_príkazov2 sa vykoná, keď je podmienka nepravdivá. Vkaždom prípade sa však nakoniec vykoná postupnosť_príkazov3.
Pre lepšiu názornosť sa predchádzajúci programový kód môže zobraziť aj vývojovým diagramom:
Vetvenie (neúplné, binárne)
- použijeme, ak príkaz alebo skupina príkazov sa má vykonať, len ak je splnená určitá podmienka
- má tvar: ak podmienka tak príkaz;
- vykonanie: ak je podmienka splnená, vykoná sa príkaz
- príklady:
ak X mod 2 = 0 tak píš (' Číslo je párne. ');
ak (VstupnaHodnota1 = '') or (VstupnaHodnota2 = '') tak píš (' Chýba vstupná hodnota! ');
ak Cislo >= 0 tak Odmocnina := sqrt(Cislo); (Poznámka: funkcia sqrt slúži na výpočet druhej odmocniny).
Podmienený príkaz if (neúplný)
V programovaní vetveniu (rozhodovaniu) zodpovedá podmienený príkaz if
- použijeme, ak nejaký príkaz sa má vykonať, len ak je splnená podmienka
- má tvar: if podmienka then príkaz;
- vykonanie: ak vyhodnotením podmienky je hodnota True, vykoná sa príkaz za then, ak hodnota False, príkaz if je bez účinku.
- príklady:
if Cislo > 0 then Label1.Caption := 'Číslo je kladné';
if Slovo1 = Slovo2 then RovnakeSlova := true;
if false then Label1.Caption := 'Toto sa nikdy nevypíše!!!';
if Cislo < 0 then Cislo := - Cislo;
Vetvenie (úplné, binárne)
- použijeme, ak príkaz alebo skupina príkazov sa má vykonať, len ak je splnená určitá podmienka a iná skupina príkazov sa má vykonať, ak podmienka nie je splnená
- má tvar: ak podmienka tak príkaz1 inak príkaz2;
- vykonanie: ak je podmienka splnená, vykoná sa príkaz1, inak sa vykoná príkaz2
- príklady:
ak X mod 2 = 0 tak píš (' Číslo je párne. ') inak píš (' Číslo je nepárne ');
ak (VstupnaHodnota1 = '') or (VstupnaHodnota2 = '') tak píš (' Chýba vstupná hodnota! ') inak počítaj;
Podmienený príkaz if (úplný)
- použijeme, ak nejaký príkaz sa má vykonať, len ak je splnená podmienka a iný príkaz, ak podmienka nie je splnená
- má tvar: if podmienka then príkaz1 else príkaz2;
- vykonanie: ak vyhodnotením podmienky je True, vykoná sa príkaz1, ak False, vykoná sa príkaz2
- príklady:
if Cislo > 0 then Label1.Caption := 'Číslo je kladné' else Label1.Caption := 'Číslo nie je kladné';
if false then Label1.Caption := 'Toto sa nikdy nevypíše!!!' else Label1.Caption := 'Toto sa vždy vypíše!!!';
if Slovo1 = Slovo2 then RovnakeSlova := true else RovnakeSlova := false;
Na vetvenie výpočtu slúži logická hodnota. Podmienka je buď pravdivá alebo nepravdivá, má jednu z dvoch logických hodnôt True alebo False.
Čo môže byť výrazom?
- ogickú hodnotu vracajú napr. relácie: <, <=, =, <>, >=, >
- if Label1.Caption = Label2.Caption then ...
- if Edit1.Text <> Label1.Caption then ...
- if Edit1.text > Edit2.Text then ...
Aj reťazce môžeme porovnávať, "menší" je ten, ktorý je podľa lexikografického usporiadania skôr
- logickú hodnotu vracajú napr. logické operátory: not, or, and, xor
- if not Edit1.Text = 'start' then ..
- if (Edit1.Text = Edit2.Text) and (Edit2.Text = Edit3.Text) then ...
V poslednom príklade sme museli použiť zátvorky, ináč Delphi nevie, ktorú časť výrazu má vyhodnotiť.
Pri zložitejších podmienkach by sme mali vždy použiť zátvorky. Niekedy nie sú nevyhnutné, ale aj keď sú navyše, nevadia.
Cyklus WHILE
Opakovať postupnosť nejakých príkazov môžeme pomocou cyklu For. S takýmto cyklom sa pracuje dobre, ak dopredu vieme počet opakovaní, resp. vieme určiť počiatočnú a koncovú hodnotu, teda nejaký celočíselný interval hodnôt. V takomto cykle sme mali tzv. "premennú cyklu" (počítadlo), ktorá automaticky postupne nadobúdala hodnoty zo zadaného intervalu a pre každú z nich sa vykonalo tzv. "telo cyklu".
Väčšina štandardných programovacích jazykov má aj iný typ cyklu (cyklus s podmienkou na začiatku): postupnosť príkazov (telo cyklu) sa bude opakovať pokým je splnená nejaká podmienka.
V Delphi má tvar:
while podmienka do
begin
postupnosť_výrazov;
end;
Cyklus while na začiatku testuje, či je splnená podmienka. Ak je splnená, opakovane vykonáva telo cyklu a po každom cykle otestuje podmienku cyklu. Keď podmienka je splnená (jej hodnota je True), cyklus sa znova vykoná atď. Ak podmienka nie je splnená, pokračuje sa príkazmi za cyklom.
Podobne ako podmienku IF, aj While cyklus možno vyjadriť vývojovým diagramom:
Pozor! zápis: while x < 100 do; x := x + 10; Ak dáme za slovo do bodkočiarku bude sa vykonávať prázdny príkaz.
Telo while-cyklu sa môže vykonať:
- ani raz, napr. while false do ..
- konečný početkrát:
- nekonečný početkrát, napr. while true do ..
Príklad
Na začiatku každého roku uložíme nejakú čiastku v Sk na úrokovú vkladnú knižku s ročným úrokom 5%. Zistite, za koľko rokov naše úspory prekročia čiastku 20 000 Sk.
Vieme určite, že budeme musieť peniaze vkladať niekoľko rokov. Problém je v tom, že dopredu nevieme povedať koľko, pretože počet rokov je vlastne výstupom programu. Neformálne by sme algoritmus na vyriešenie mohli popísať takto:
založ si účet v banke
zatiaľ šetríš nula rokov
kým nemáš na začiatku roka našetrené 20 000 Sk,
vlož čiastku a čakaj na nový rok, kým sa zúročia
Ak mám na začiatku roka (1.1.) na účte X Sk, koľko budem mať na konci roka?
(X + vložená čiastka) * 1,05
Teraz to skúsme naprogramovať:
Zrejme potrebujeme premennú, kde si budeme pamätať stav účtu, nazvime ju ucet. Druhou bude premenná roky, kde budeme počítať roky vkladania.
Formálnejší algoritmus
na začiatku máš na účte 0 Sk
zatiaľ šetríš nula rokov
kým nie je na účte 20 000 Sk
účet sa ti zvýši o úrok 5% a pribudne nová čiastka
šetríš o jeden rok viac
Potrebujeme cyklus, ktorý sa bude vykonávať, kým platí nejaká podmienka - práve na to je vhodný while cyklus. Pomocou neho zapíšeme algoritmu v Delphi:
ucet := 0;
roky := 0;
while ucet < 20 000 do
begin
ucet := (ucet + ciastka) * 1,05;
roky := roky +1;
end;
Príklad
Určite ciferný súčet daného prirodzeného čísla.
Do premennej cislo si uložíme zadané číslo. Budeme potrebovať ešte jednu premennú sucet. Ciferný súčet vypočítame tak, že postupne budeme z čísla "odtrhávať" poslednú cifru a tú pripočítavať do ciferného súčtu. Celý proces by mohol vyzerať nasledovne:
na začiatku: cislo = 1357 sucet = 0
odtrhneme cifru 7 cislo = 135 sucet = 0 + 7 = 7
odtrhneme cifru 5 cislo = 13 sucet = 7 + 5 = 12
odtrhneme cifru 3 cislo = 1 sucet = 12 + 3 = 15
odtrhneme cifru 1 cislo = 0 sucet = 15 + 1 = 16
ak cislo = 0, výpočet ciferného súčtu končí
Ako zistiť poslednú cifru daného čísla? .. cislo mod 10
Ako odtrhnúť z čísla poslednú cifru? .. cislo := cislo div 10
Zápis v programovacom jazyku:
načítaj(cislo); (napr. cislo:= Edit.Text;)
sucet := 0;
while cislo <> 0 do
begin
sucet := sucet + cislo mod 10;
cislo := cislo div 10;
end;
Úlohy
- Modifikujte riešenú úlohu tak, že budeme môcť do programu zadať ročné vklady, ročný úrok aj cieľovú sumu.
- Určte počet cifier daného prirodzeného čísla.
- K danému kladnému celému číslu N vypočítajte číslo, ktoré sa líši od čísla N tým, že má zamenenú prvú a poslednú cifru.
- K danému kladnému celému číslu N vypočítajte číslo, ktoré má rovnaké cifry ako N, ale v opačnom poradí.
- Je dané prirodzené číslo N. Akým najmenším počtom platidiel je možné zaplatiť čiastku N korún, ak máte k dispozícii neobmedzené množstvo slovenských mincí a bankoviek všetkých druhov. Vypíšte rozpis bankoviek.
———
Späť