Podmienka a cyklus

19.10.2009 23:14

Podmienkaa 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

  1. Modifikujte riešenú úlohu tak, že budeme môcť do programu zadať ročné vklady, ročný úrok aj cieľovú sumu.
  2. Určte počet cifier daného prirodzeného čísla.
  3. 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.
  4. K danému kladnému celému číslu N vypočítajte číslo, ktoré má rovnaké cifry ako N, ale v opačnom poradí.
  5. 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äť

Vyhľadávanie

(c) 2008 Všetky práva vyhradené.