Programska petlja for

Sjedište: CARNET - Arhiva 2021 Loomen
E-kolegij: III. Gimnazija Osijek - Informatika 2
Knjiga: Programska petlja for
Otisnuo/la: Gost (anonimni korisnik)
Datum: ponedjeljak, 28. listopada 2024., 12:21

1. Petlja for

Naredba for najčešće se primjenjuje u zadatcima u kojima je broj ponavljanja unaprijed poznat. To je najopćenitija vrsta petlje i najčešće se koristi. U pseudojeziku zapisujemo je ovako:

               za i = x do y činiti
                  naredba

 

U programskom jeziku C  ima oblik:

              for (inicijalizacija; uvjet; promjena_vrijednosti)
              {
                   blok_naredbi;
              }

 

gdje:
  • inicijalizacija znači postavljanje kontrolne varijable (i/ili dodatnih varijabli) na početnu vrijednost
  • uvjet je uvjet koji kontrolna varijabla mora zadovoljiti da bi se izvršile naredbe u petlji (blok naredbi), a
  • promjena_vrijednosti je dio u kojem se određuje način promjene stanja kontrolne varijable.

Kontrolna varijabla kontrolira broj prolazaka petljom, a najavljuje (deklarira) se kao i sve ostale varijable koje se koriste u programu. Njezina se vrijednost automatski mijenja svakim prolaskom kroz petlju kako je to određeno promjenom_vrijednosti. U nekim programskim jezicima kontrolna varijabla mora biti rednog tipa (obično cijeli broj), no u C-u ona može biti i realan broj!

Tijek izvršavanja petlje for jest:

  1. Ako je prisutna inicijalizacija, kontrolna varijabla (i/ili dodatne varijable) postavlja se na početnu vrijednost (ako je to izraz, izračuna se njegova vrijednost, a nakon toga se ta vrijednost pridruži kontrolnoj varijabli).
  2. Ako je prisutan uvjet, provjerava se njegova istinitost. Izračunata vrijednost je logičkog tipa (istina ili laž). Ako je rezultat istina, izvodi se blok naredbi. (Ne zaboravite, u C-u se istinom smatra ono što je različito od 0.)
  3. Ako je prisutna promjena_vrijednosti, promjeni se vrijednost kontrolne varijable. Program se vraća na početak petlje te se ona ponavlja od točke 2.
  4. Ako je vrijednost uvjeta neistina, blok naredbi se preskače i program se nastavlja prvom naredbom nakon bloka.

Dijagram tijeka petlje for :

Dijelovi programske petlje for mogu se i izostaviti, ali da bi se zadovoljila sintaksa C-a obvezno je napisati null naredbu ;.

Promotrite ovako napisan zadatak:

#include <stdio.h>
int main()
{
     int i=1;
     for(;i<=7;i++)
           printf("%d \n",i);
     return 0;
}

 

OBJAŠNJENJE: U sintaksi petlje for izostavljen je dio s inicijalizacijom, no ona je napisana izvan petlje pa će se petlja normalno izvršiti. Na isti se način može izostaviti promjena vrijednosti kontrolne varijable, ali se mora osigurati njezina promjena (i približavanje uvjetu zaustavljanja) unutar bloka naredbi u petlji for. Izostavljanje uvjeta zaustavljanja moglo bi stvoriti beskonačnu petlju (petlja koja se ne može zaustaviti sama), zato treba biti oprezan.

Napomena: Vitičaste zagrade za oznaku početka i završetka bloka nisu potrebne jer se ponavlja samo jedna naredba. One se koriste samo kada se treba ponavljati više naredbi (blok naredbi).


1.1. Primjeri

Primjer 1.

Petljom

            for (i=1;i<=10;i++)
               printf("\nDanas je ponedjeljak.");

na zaslonu će se deset puta ispisati rečenica „Danas je ponedjeljak.”, svaki put u novi red /*zbog konstante \n ispred početka rečenice*/.

Zašto?

Varijabla i je kontrolna varijabla, čija se vrijednost najprije postavlja na 1. Nakon toga se provjeri uvjet (i<=10). S obzirom na to da je zadani uvjet istinit (jer 1 je manji od 10), na zaslonu se ispiše zadana rečenica. Zatim se, zbog promjene vrijednosti kontrolne varijable (i++), ta vrijednost  poveća za 1 (postavi na 2) i izvođenje se vraća na početak. Naredba će se posljednji put izvršiti kada se vrijednost kontrolne varijable postavi na 10. Nakon što se vrijednost kontrolne varijable postavi na 11, uvjet neće biti ispunjen i program počinje izvršavati prvu naredbu nakon for bloka.

NAPOMENA: Ako program zahtijeva blok naredbi za ponavljanje, a oznake početka i kraja bloka ({ i }) se izostave, program će dati pogrešan rezultat. U tom slučaju C ponavlja samo prvu naredbu nakon for. Preostale naredbe iz bloka izvršavaju se izvan naredbe ponavljanja! 

 

Primjer 2.

Petljom

for(i=100;i<=110;i++)
     printf("%d ",i);

na zaslonu će se ispisati brojevi 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 i 110 odvojeni razmakom.

Primjer 3.

Petljom

for(i=100;i<=110;i+=2)
     printf("%d ",i);

na zaslonu će se ispisati brojevi  100, 102, 104, 106, 108 i 110 odvojeni razmakom.

                                                                                 

Naredbe ponavljanja mogu se kombinirati sa svim naredbama koje se koriste u programiranju. Razmislite kako bi ovaj primjer riješili kombinacijom sa naredbom grananja. Neka vam pomogne ovaj pseudokod:

za b = 100 do 110 činiti
    ako je b mod 2 = 0 onda ispis (b);

Primjer 4.

Dio programa

s = 0;
scanf("%d", &n);
for (i=1; i<=n; i++)
    s = s + i;
printf ("%d", s);

na zaslon će ispisati zbroj brojeva od 1 do n.

Provjerimo!
Neka je n=4;
za b=1 => s=0+1=1;
za b=2 => s=1+2=3;
za b=3 => s=3+3=6;
za b=4 => s=6+4=10;
A to je upravo 1+2+3+4!

Primjer 5.

Dio programa

scanf("%d",&broj)
for (i=1; i<=4; i++)
{
     znam=broj%10;
     printf("%d",znam);
     broj=broj/10;
}

će na zaslon ispisati znamenke unesenog četveroznamenkastog broja.

Provjerimo!
Neka je broj=2314;

Za b=1 => znam = 2314 % 10 = 4 => ispis 4 => broj = 2314 / 10 =231;
Za b=2 => znam = 231 % 10 = 1 => ispis 1 => broj = 231 / 10 =23;
Za b=3 => znam = 23 % 10 = 3 => ispis 3 => broj = 23 / 10 =2;
Za b=4 => znam = 2 % 10 = 2 => ispis 2 => broj = 2 / 10 =0;
 

Na isti način možemo ispisivati znamenke troznamenkastog, peteroznamenkastog ili bilo kojeg broja kojem znamo broj znamenki. Samo mijenjamo završnu vrijednost kontrolne varijable.

Ali, što kada želimo napraviti općeniti program? Za broj kojemu ne znamo unaprijed broj znamenki?

U tom slučaju ne možemo koristiti petlju s poznatim brojem ponavljanja, već jednu od petlji kod kojih ponavljanje ovisi o uvjetu! Iako je i petlja for uvjetna petlja, u takvim zadacima prikladnije je upotrijebiti pelju while. 


Primjer 6.

U ovom su programu učinjene tri pogreške. Pronađite ih bez uporabe računala.

#include <stdio.h>
int main()
{
     int br,a,i;
     float s=0,ars;
     printf("\n Koliko imate ucenika? ");
     scanf("%d",&br);
     for(i=1,i<=br,i++);
     {
           printf("\nUpisite ocjenu %d. ucenika: ",i);
           scanf("%d",&a);
           if ((a<1)||(a>5))
                i--;
           else
                s+=a;
     }
     ars=s/br;
     printf("\n Srednja ocjena razreda je %.2f",ars);
     return 0;
}

Rješenje

  • unutar petlje for, početna vrijednost i uvjet ponavljanja odvajaju se znakom ;
  • uvjet ponavljanja i promjena vrijednosti kontrolne varijable odvajaju se znakom ;
  • iza naredbe for ne smije se pisati ; jer se blok koji slijedi neće ponavljati u petlji




2. Ugnježđivanje petlje for

Petlje for mogu se i ugnježđivati, što znači pisati jedna unutar druge.

for (inicijalizacija_1; uvjet_1; promjena_vrijednosti_1)
     for(inicijalizacija_2; uvjet_2; promjena_vrijednosti_2)
     {
           blok naredbi;
     }

U tom slučaju, kada se jednom promjeni vrijednost kontrolne varijable vanjske petlje, potpuno se izvrši unutarnja petlja (vrijednosti njezine kontrolne varijable promjene se od početne do završne). Tek tada se ponovo promijeni vrijednost kontrolne varijable vanjske petlje. Ako se vanjska petlja izvršava n puta, a unutarnja m, ugniježđene petlje izvršit će se n × m  puta.


2.1. Primjeri

Primjer 1.

Tijekom izvođenja niza naredbi:

int i,j;
for(i=0;i<=6;i+=5)
     for(j=1;j<=7;j+=3)
           printf("\n%d, %d",i, j);

vrijednosti varijabli i i j mijenjaju se ovako:

Za  i = 0 varijabla j poprima vrijednosti: 1, 4 i 7 te se na zaslonu ispisuju sljedeće vrijednosti:

      0, 1
      0, 4
      0, 7  

Tada unutarnja petlja (po j) staje jer je uvjet lažan. Povećava se vrijednost kontrolne varijable i (i= 5), pa se ponovno izvršava unutarnja petlja i poprima vrijednosti: 1, 4 i 7.

Ispis na zaslonu je ovaj:

     5, 1
     5, 4
     5, 7

 Sljedeće povećanje kontrolne varijable i je na 10 pa uvjet nije istinit, što znači da prestaje izvršavanje petlji.

 

Primjer 2.

Napišite program koji će na zaslonu ispisati sve Pitagorine brojeve u intervalu od 2 do 50. Uz taj podatak, program treba ispisati i koliko Pitagorinih brojeva ima u danom intervalu.

/* Pitagorini brojevi su uređene trojke brojeva (a, b, c) za koje vrijedi da je a2 + b2 = c2) */

Rješenje

#include<stdio.h>
#include<math.h>
int main()
{
     int a,b,c,koliko=0;
     for(a=2;a<=50;a++)
           for(b=2;b<=50;b++)
                for(c=2;c<=50;c++)
                      if (pow(a,2)+pow(b,2)==pow(c,2))
                      {
                           printf("\n%d, %d, %d", a,b,c);
                           koliko++;
                      }
     printf("\nIma ih %d", koliko);
return 0;
}

 

Zamijetite da će taj program ispisati ukupno 40 Pitagorinih trojki zato što će, primjerice, ispisati i trojku (3, 4, 5), ali i trojku (4, 3, 5). Razmislite, što treba promijeniti u programu da bi ispisivao Pitagorine trojke „bez ponavljanja” (neuređene trojke).

Napomena: Postoje starije inačice Dev C++-a u kojim ovaj program neće raditi ispravno zbog pogreške u funkciji pow(). Da biste to izbjegli upotrijebite računsku operaciju množenje.

 


3. Zadaci za vježbu

1. Bez upisivanja programa odgovorite na pitanje: Kada se ovaj program izvrši, što će se ispisati na zaslonu?

#include <stdio.h>
int main()
{   
     int i;
     for(i=20;i<=30;i+=3)
           printf("%d ",i);
     return 0;
}


2. Bez upisivanja programa napišite što će se ispisati na zaslonu nakon izvršavanja ovih programa?

a)

     #include <stdio.h>
     int main ()
     {
          int n=5,i,f=1;
          for (i=2;i<=n;i++) f=f*i;
                printf("%d!=%d",n,f);
          return 0;
     }

 b)

     #include <stdio.h>
     int main ()
     {
          int a=2, x=3,y=1,i;
          for (i=1;i<=x;i++) y=a*y;
          printf("rezultat je %d",y);
          return 0;
     }

3. Što će se ispisati na zaslonu nakon izvršavanja ovog bloka naredbi?

     int i,j;
     for(i=5,j=0;i<=10;i+=2,j++)
     {
          printf("\ni = %d j = %d",i,j);
     }

 

4. Napišite program koji će na zaslon ispisati prvih 20 prirodnih brojeva, ali u obrnutom redoslijedu (od 20 do 1).

5. Napišite program koji će zbrojiti sve cijele brojeve između 500 i 600 koji su djeljivi s 11. Uz rezultat zbroja, program treba na zaslonu ispisati i koliko ima takvih brojeva.

6. Napišite program koji će tražiti upisivanje prirodnog broja n (n < 10). Program treba izračunati i ispisati na zaslonu n! (n! = 1 × 2 × 3 × … × n )

7. Napišite program koji će za upisane cijele brojeve a i x izračunati i ispisati ax, bez uporabe funkcije pow.  /*Razmislite kako biste riješili zadatak ako je eksponent negativan?!*/

 Rješena zadataka od 4. do 7. potražite na e-sferi.


4. Za one koji žele znati više!

1. Napišite program koji će, koristeći se petljom for,  izračunati i ispisati rezultat zbroja:  

Testni primjeri

Ulaz:      3
Izlaz:     32

Ulaz:      5
Izlaz:     3413     

 

2. Napišite program koji će tražiti upisivanje prirodnog broja n i realnog broja x. Program treba izračunati i ispisati na zaslonu rezultat zbroja

 Testni primjeri

Ulaz:      5  1
Izlaz:     0.89

Ulaz:      10  1.57
Izlaz:     1.16 

 

3. Napišite program koji će od korisnika tražiti upisivanje dvaju cijelih brojeva. Program treba pomnožiti zadane brojeve koristeći se samo računskom operacijom zbrajanja.

Testni primjeri


Ulaz:     3  2
Izlaz:     6

Ulaz:      30  50
Izlaz:     1500   


Rješenja zadataka možete potražiti na e-sferi.

5. Dodatni materijali

Video lekcija - for petlja


Video lekcija - ugnježđivanje for petlji