Zanka (računalništvo)

Iz MaFiRaWiki

Zanke v programskih jezikih predstavljajo način za ponavljajoče izvajanje programske kode.

Ta je pri tem vstavljena v telo zanke, njeno izvajanje pa se ponovi tolikokrat, kot je to definirano v zanki. Kadar je število ponovitev manjše od 1 se koda v telesu zanke ne izvede. V nekaterih programski jezikih se lahko števec zanke tudi povečuje oz. zmanjšuje za določen korak.

Vsebina

Zanke v Javi

Java pozna tri vrste zank: zanka while, zanka for in zanka do. Najbolj osnovna je zanka while.

GOTO - kontrolni ukaz

Ukaz GOTO ni zanka ampak kontrolni ukaz, s pomocjo katerega lahko naredimo zanko. Uporabljala se je v starejših programskih jezikih. V novejših jezikih je ta tip zanke navadno še vedno možno uporabljati, vendar pa to ni priporočljivo saj vodi v slabo pregledno kodo in težko vzdrževanje takšnega programa.

Primer

Primer izpisa kvadratov števil od 1 do 10 v BASICU s pomočjo GOTO zanke.

10 I=1
20 PRINT I*I
30 I=I+1
40 IF I>9 GOTO 60
50 GOTO 20
60 PRINT I*I

Zanka while

Ta zanka omogoča izvajanje določene programske kode, dokler je zadoščeno danemu pogoju. Pred vstopom v telo zanke se vedno preveri pogoj. Če je pogoj veljaven, se izvede koda v telesu zanke. Ta se izvaja, dokler je na začetku postavljen pogoj veljaven. V primeru, da je pogoj že na začetku neveljaven se koda ne izvede.

Splošna oblika


Pogoj za ponavljanje je na začetku, ponavljanje pa traja toliko časa, kolikor časa je < p > true. Obstaja pa možnost, da se jedro zanke ne bo izvršilo niti enkrat.

  while (p) {
    A;
  }

Shematični prikaz

slika:Zankawhile.PNG

To pomeni: "če je izpolnjen pogoj p, izvedi ukaze A, nato ponovi zanko."

Primer

Primer izpisa kvadratov števil od 1 do 10 v Javi s pomočjo zanke while.

  1. int i = 1;
  2. while (i <= 10) {
  3. System.out.println(i*i);
  4. i = i + 1;
  5. }

Primeri drugih vrst uporabe zanke while:

Zanke s preprostimi števci

Primer: izpis celih števil od 1 do 10.

  1. int i = 1;
  2. while (i <= 10) {
  3. System.out.print(i);
  4. i = i + 1;
  5. }
Zanke brez števcev

Poznamo zanke, ki se ponavljajo v nedogled, in take, ki uporabijo števec. Seveda pa to ni edini način za uporabo zank.

Primer zanke, v kateri niso uporabljena števila in števci.

V spremenljivki String s je shranjen niz znakov. Napraviti želimo nov niz String t, ki je tak kot niz s brez presledkov na začetku. Na primer, če je niz s enak
" Presledek na zacetku.", potem mora biti t enak "Presledek na zacetku."

Pri pisanju programa uporabimo metodo substring, ki vrne podniz danega niza:

  1. public class PrimerSubstring {
  2. public static void main(String[] args) {
  3. String a = "Od nekdaj lepe so Ljubljanke slovele.";
  4. String b = a.substring(6, 20);
  5. System.out.println(b);
  6. }
  7. }

Izpiše: daj lepe so Lj

Vgnezdene zanke (dvojne)

Primer: kako lahko vgnezdimo eno zanko v drugo. Denimo, da želimo izpisati na zaslon petnajst vrstic sestavljenih iz petnajstih zvezdic, ločenih s presledki:

  1. int i = 0;
  2. while (i < 15) { // 15 vrstic zvezdic
  3. int j = 0;
  4. while (j < 14) { // 15 zvezdic s presledkom
  5. System.out.print("* ");
  6. j = j + 1;
  7. }
  8. System.out.println("*"); // zadnja zvezdica in pomik v novo vrsto
  9. i = i + 1;
  10. }

Vidimo primer vgnezdene zanke, saj imamo znotraj ene zanke while še eno zanko while.

Neskončna zanka

Primer: neskončne zanke, ki izpisuje niz "vsak je svoje sreče kovač" v nedogled.


  1. public class Pregovor{
  2. public static void main(String[] args){
  3. while(true){
  4. System.out.print("vsak je svoje sreče kovač, ");
  5. }
  6. }
  7. }


Program izpisuje: vsak je svoje sreče kovač, vsak je svoje sreče kovač, vsak je svoje sreče kovač, vsak je svoje sreče kovač,.....

Zanke z dodatnim pogojem za ustavljanje

Če bi želeli, da bi se izvajanje zanke prekinilo, čeprav števec še ni preštel do konca. To lahko naredimo s pomožno spremenljivko tipa boolean, ki jo v telesu zanke nastavimo na false, če je treba zanko prekiniti. Pogoj zanke nato upošteva vrednost spremenljivke.

Primer: ki preveri, ali obstaja celo število x med 1 in 100 in celo število y med −100 in 100, ki zadošča enačbi y10 + 2yx2 + 951 = 0

  1. int x = 1;
  2. int y = -100;
  3. boolean obstaja = false;
  4. while (!obstaja && (y <= 100)) {
  5. x = 1;
  6. while (!obstaja && (x <= 100)) {
  7. if (y*y*y*y*y*y*y*y*y*y + 2*y*x*x + 951 == 0) {
  8. obstaja = true;
  9. }
  10. else {
  11. x = x + 1;
  12. }
  13. }
  14. if (!obstaja) {
  15. y = y + 1;
  16. }
  17. }
  18. if (obstaja) {
  19. System.out.println("Resitev: x = " + x + ", y = " + y);
  20. }
  21. else {
  22. System.out.println("Ni resitve.");
  23. }

Rešitev: x = 100, y = -3


Zanko while v taki ali drugačni obliki poznajo skoraj vsi sodobni programski jeziki.

Zanka do-while

Ta zanka je podobna zanki while s to razliko, da je pri njej pogoj postavljen na konec zanke. Telo zanke se zato vedno izvede vsaj enkrat, preden se preveri pogoj na koncu. Zanka se izvaja, dokler je pogoj veljaven.

Splošna oblika

 do{
   A;
 } while(p);

Shematični prikaz

slika:dowhile.PNG

To preberemo takole: "Izvedi ukaz A. Nato preveri pogoj p.".

Primer

Primer izpisa kvadratov števil od 1 do 10 v Javi s pomočjo zanke do-while.

  1. int i = 1;
  2. do {
  3. System.out.println(i*i);
  4. i = i + 1;
  5. }
  6. while (i <= 10)

Zanka for

Ta zanka omogoča iterativno izvajanje programske kode, ki se nahaja v telesu zanke. Večinoma se uporablja takrat, ko je že vnaprej znano željeno število ponovitev zanke.

Ideja je v tem, da je zanka for (v nekaterih primerih) bolj čitljiva kot pa zanka while, saj so vsi ukazi v zvezi s števcem i zbrani na enem mestu na začetku zanke.

Splošna oblika

 for (A; p; B) {
   C;
 }

Shematični prikaz

slika:for_zanka.PNG

To preberemo takole: "Izvedi ukaz A. Dokler je pogoj p enak true ponavljaj: izvedi C in nato še B".

Pozor! Čeprav je v zanki for ukaz B napisan pred ukazom C, se najprej izvede C in šele nato B! Ukaz B se v praksi uporablja večinoma za to, da se poveča števec, s katerim štejemo ponovitve zanke.


Primer

Primer izpisa kvadratov števil od 1 do 10 v Javi s pomočjo zanke for.

  1. for (int i=1; i<=10; i++) {
  2. System.out.println(i*i);
  3. }

Primer while --> for

Primer pretvorbe iz zanke while v zanko for

Primer: Program LihaStevila naj izpiše vsa liha števila med -5 in 30.

while

  1. public class LihaStevila {
  2. public static void main(String[] args) {
  3. int i = -5;
  4. while (i <= 30) {
  5. System.out.print(i + ", ");
  6. i = i + 2;
  7. }
  8. }
  9. }

for

  1. public class LihaStevila {
  2. public static void main(String[] args) {
  3. for(int i = -5; i <= 30; i = i + 2){
  4. System.out.print(i + ", ");
  5. }
  6. }
  7. }

Primeri zank

Java

  • while
 int i = 0;                           int i = 10;
 while(i < 10){                       while(i >= 0){
   ...                                  ... 
   //telo zanke                         //telo zanke
   ...                                  ...
   i+=2;                                i-=2;
  }                                    }
  • do-while
 int i = 0;                           int i = 10;
 do{                                  do{ 
  ...//telo zanke...;                    ...//telo zanke...
  i+=2;                                  i-=2; 
 } while(i < 10)                      }while(i >= 0)
 
  • for
 for (int i=0; i<10; i+=2) {          for (int i=10; i>=0; i-=2) {
   ...                                  ...
   // telo zanke                        // telo zanke
   ...                                  ...
 }                                    }

Delphi

For I:=0 to 10 Step 2 do              For I:=10 downto 0 Step -2 do
Begin                                 Begin
  ...                                   ...
  // telo zanke                         // telo zanke
  ...                                   ...
End;                                  End;

BASIC

FOR I=0 TO 10 STEP 2                  FOR I=10 TO 0 STEP -2
  ...                                   ...
  // telo zanke                         // telo zanke
  ...                                   ...
NEXT I                                NEXT I

PHP

  • for
for ($i=0; $i<10; $i+=2) {          for ($i=10; $i>=0; $i-=2) {
   ...                                  ...
   // telo zanke                        // telo zanke
   ...                                  ...
 }                                    }
  • while
 $i = 0;                               $i = 10;
 while($i < 10){                       while($i >= 0){
   ...                                  ... 
   //telo zanke                         //telo zanke
   ...                                  ...
   $i+=2;                                $i-=2;
  }                                    }



V številnih programskih jezikih se lahko za števec zanke uporablja samo celo število, nekateri pa dopuščajo tudi uporabo decimalnega števila. Ker decimalna števila v računalniku niso predstavljena natančno se lahko zgodi, da se določena zanka izvede večkrat ali manjkrat, kot je bilo to željeno. Primer takšne zanke v Javi:

for (double i=0.0; i<=1.0; i=i+0.1) {
  ...
}

Glej tudi:

Osebna orodja