1.2.8. Použitie cyklu v programe

 

Pri programovaní sa veľmi často opakujú tie isté výpočty. Pomocou príkazu GO TO môžeme vracať riešenie programu na žiadané opakované výpočty.

Máme za úloha sčítať celé čísla od 1 do 30.

      10 LET s=0:LET c=1

      20 LET s=s+c

      30 LET c=c+1

      40 IF c<=30 THEN GOTO 20

      50 PRINT "sucet = ";s

Na riadku 10 nastavíme začiatočné hodnoty s a c.

Premenná c prestavuje číslo, ktoré máme do celkového súčtu pričítať. Premenná s predstavuje súčet čísiel. Okamžitá hodnota s predstavuje medzisúčet čísiel od 1 do c.

Na riadku 20 pričítame do medzisúčtu číslo c, kde je nasledujúce číslo z požadovaných čísiel.

Na riadku 40 testujeme, či je takto vytvorené číslo <= 30. Ak je, program pokračuje na riadku 20.

Ak je číslo väčšie ako 30, v medzisúčte sú už všetky čísla od 1 do 30 sčítané, podmienka v príkaze IF - THEN nie je splnená a počítač vypíše celkový súčet (riadok 50).

Opakované využívanie časti programu nazývame programový cyklus.

Pri použití cyklu platia nasledujúce zásady:

a)    pred vstupom do cyklu nastavíme začiatočné hodnoty premenných, ktoré v cykle využívame (v našom prípade s, c)

b)    v cykle sa hodnota niektorých premenných mení o určenú hodnotu (c sa zvyšuje o 1)

c)    v cykle sa testuje, či je splnená podmienka ukončenia cyklu; ak nie je splnená, skáče sa na začiatok cyklu

Programový cyklus, ktorý má tieto vlastnosti, môžeme jednoduchšie vytvoriť pomocou príkazu FOR-TO-STEP-NEXT.

Začiatok cyklu má tvar:

      FOR premenná = od TO po STEP krok

Koniec cyklu sa označuje

      NEXT premenná

Premenná je takzvaná riadiaca premenná (parameter cyklu), ktorej meno môže byť len jedno písmeno.

Výrazy od, po, krok sú ľubovoľné aritmetické výrazy.

Časť programu medzi začiatkom cyklu a koncom cyklu sa volá telo cyklu.

Výraz od určuje začiatočnú hodnotu riadiacej premennej.

Výraz po určuje hornú hranicu riadiacej premennej.

Výraz krok určuje veľkosť kroku, o ktorý sa hodnota riadiacej premennej zmení pri každom prechode cyklom.

Telo cyklu sa vykoná opakovane takto:

Riadiacej premennej sa priradí hodnota výrazu od a vykoná sa telo cyklu. Na konci cyklu sa k okamžitej hodnote riadiacej premennej pričíta hodnota výrazu krok. Testuje sa, či je hodnota riadiacej premennej väčšia (pri kladnom kroku), alebo menšia (pri zápornom kroku), ako hodnota výrazu po (koncová hodnota). Ak nie je koncová hodnota prekročená, telo cyklu sa vykoná s novou hodnotou riadiacej premennej. V opačnom prípade je cyklus ukončený a vykonávanie programu pokračuje ďalším príkazom za príkazom NEXT.

Ukážme si, ako bude vyzerať program pre súčet čísiel od 1 do 30 s využitím tohto príkazu:

      10 LET s=0

      20 FOR c=1

      30 LET s=s+c

      40 NEXT c

      50 PRINT "sucet = ";c

Na riadku 10 je nastavený medzisúčet s na hodnotu 0.

Na riadku 20 sú nastavené vlastnosti cyklu; riadiaca premenná bude nadobúdať hodnoty od 1 do 30 s krokom 1, riadok 30 tvorí vlastné telo cyklu.

Riadok 40 je ukončenie cyklu, za NEXT je uvedený názov riadiacej premennej cyklu.

Ak má krok hodnotu +1, časť príkazu STEP výraz 3 sa nemusí v príkaze uvádzať. Riadok 20 sme mohli preto napísať takto:

      20 FOR c=1 TO 30

Ak chcete zmeniť program na súčet iných čísiel, stačí zmeniť jediný riadok programu, riadok 20.

Ak chcete sčítať čísla od 10 do 100 s krokom 0.5, zmeníme riadok na tvar:

      20 FOR c=10 TO 100 STEP 0.5

Hodnota kroku môže byť i záporná. Riadok 20 môžete upraviť na:

      20 FOR c=100 TO 10 STEP -0.5

Tu sme však museli zmeniť aj začiatočnú a koncovú hodnotu riadiacej premennej.

Ak je pri kladnom kroku začiatočná hodnota riadiacej premennej väčšia ako koncová hranica a pri zápornom kroku menšia ako koncová hranica, telo cyklu sa nevykoná ani raz a program pokračuje ďalším príkazom za príkazom NEXT.

Hodnota riadiacej premennej môže byť v tele cyklu znamená. Na konci cyklu sa testuje vždy jej okamžitá hodnota. Hranice cyklu sa nedajú meniť vo vnútri cyklu.

Do cyklu môžeme vstúpiť iba cez počiatok cyklu (cez FOR-NEXT).

Skok zvonku dovnútra cyklu nie je dovolený. Je ale možné vyskočiť z cyklu pred jeho ukončením.

V jednom programe môžeme použiť niekoľko cyklov. Ak sú vzájomne nezávislé, nemali by sme urobiť chybu. Ak sa použijú cykly vložené do seba, musí sa vždy ako prvý ukončiť najvnútornejší cyklus.

Na niekoľkých príkladoch si ukážeme rôzne umiestnenie cyklov v programe.

 

Správne vložené cykly:

 

 

 

Nesprávne vložené cykly:

 

 

 

Povolený skok z cyklu                    Nesprávny skok do cyklu

 

 

V nasledujúcom príklade uvidíte, aký užitočný je príkaz cyklu.

Úlohou je vytvoriť program pre načítanie mien a ich usporiadanie podľa abecedy. Meno je dlhé maximálne 10 znakov.

      10 PRINT "Usporiadanie mien podla abecedy"

      20 PRINT:INPUT "Zadaj pocet mien",k

      30 DIM a$(k,10)

      40 FOR i=1 TO k:PRINT "Zadaj meno cislo ";i

      50 INPUT a$(i)

      60 NEXT i

      70 FOR i=1 TO k-1

      80 FOR j=i+1 TO k

      90 IF a$(i)<a$(j) THEN GOTO !!)

      100 LET x$=a$(i):LET a$(i)=a$(j):LET a$(j)=x$

      110 NEXT j

      120 NEXT i

      130 PRINT: PRINT "Usporiadane mena":PRINT

      140 FOR i=1 TO k:PRINT a$(i):NEXT i

Na riadku 10, 20 je úvodný text.

Na riadku 30 sa zadá počet mien a rezervuje sa miesto v pamäti pre tieto premenné.

Na riadkoch 40-60 sa načítajú mená do reťazcových premenných a$(1)...a$(k).

Vlastné usporiadanie sa vykoná na riadkoch 70-120. Princip usporiadania je ten, že sa zoberie prvé meno (i=1) a porovná sa so všetkými nasledujúcimi (to sú tie, ktorých indexy sú väčšie ako i, teda pre j=i+1 až k na riadku 80). Vlastné porovnanie je na riadku 90. Ak je splnená podmienka, nechá sa reťazec na svojom mieste. Ak nie je, vymení sa s tým, ktorý je "menší" (riadok 100). Po ukončení vnútorného cyklu bude v a$(1) uložená "najmenších" meno. Hodnota i sa zvýši a postup sa opakuje. Tak sa nájde druhé "najmenšie" meno a uloží sa do a$(2), atď.

Na riadku 70 je horná hranica k-1, lebo je nájdených k-1 "najmenších" mien a to ostávajúce nemôže byť "menšie".

Na riadkoch 130, 140 sa vykoná výpis usporiadaných  mien.

Na tomto príklade si môžete uvedomiť, aký význam majú indexované premenné. Keby sme ich nemali, problém usporiadania by sa riešil veľmi ťažko.

Ďalšiu výhodu vidíte na riadku 140, kde sa jedným krátkym príkazovým riadkom vypíše ľubovoľný počet premenných.

Príkaz cyklu spolu s možnosťou použitia indexovaných premenných tvoria veľmi silný programovací prostriedok.

Ak v uvedenom programe nahradíte reťazcové premenné číselnými premennými, program usporiada a vypíše zadaný počet čísiel.