Programska petlja while

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

1. Petlja while

Petlja while je petlja u kojoj je zadani uvjet na početku. Pseudojezikom zapisujemo je ovako:

dok je uvjet činiti
     naredba

Njezin je opći oblik u programskom jeziku C ovaj:

     while (uvjet izvođenja)
     {
           blok_naredbi;
     }

 

Uvjet je aritmetički, relacijski ili logički izraz. Blok naredbi u petlji se ponavlja sve dok je uvjet istinit ili različit od 0. Kada uvjet postane lažan ili jednak 0, program nastavlja izvođenje prvom naredbom nakon while bloka. S obzirom na to da se uvjet ponavljanja ispituje na početku petlje, to znači da blok naredbi unutar petlje ne mora nužno biti izvršen nijedanput.

Naredba while obično se upotrebljava kada:
  • se ne zna točan broj ponavljanja naredbi u petlji
  • ne postoji kontrolna varijabla koja se mijenja ponavljanjem
  • na izvršavanje petlje utječu neki vanjski parametri (npr. unos s tipkovnice).

Tijek izvršavanja while bloka je ovakav:
  1. Izračunava se uvjet izvođenja (to je logički izraz i njegov rezultat može biti logička istina ili logička neistina).
  2. Ako je rezultat istinit (ili različit od 0), izvodi se blok naredbi, a nakon toga se program vraća na naredbu while i izvodi od točke 1.
  3. Ako je rezultat neistinit (jednak 0), preskače se blok naredbi i program nastavlja s izvođenjem prve naredbe nakon bloka naredbi.

 

Dijagram tijeka petlje while:


Kao i u ostalim složenim naredbama, tako i kad je riječ o  while vrijedi činjenica da oznake početka i kraja bloka ({, }) nisu prijeko potrebne ako je unutar bloka samo jedna naredba!

Pri postavljanju uvjeta ne smije se zaboraviti da on mora u jednom trenutku postati neistinit. U suprotnom će program ući u beskonačnu petlju!


1.1. Primjer 1.

 Koristeći se naredbom  while, program na zaslonu ispisuje prvih deset prirodnih brojeva.

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

/*U ovakvim situacijama prikladnija je petlja for.*/

 


1.2. Primjer 2.

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

#include <stdio.h>
int main()
{
     int p=1,i,n;
     float s=0;
     printf("\nUpisite jedan broj: ");
     scanf("%d",&n);
     while(i=1;i<=n;i+=2)
     {
           s+=(float)p/i;
           p=-p;
     }
     printf("\n  suma je %.3f",s);
     return 0;
}

 

Rješenje

  • Konstrukcija  (i=1;i<=n;i+=2) karakteristična je za for petlju, a ne za while.
  • Početna vrijednost kontrolne varijable postavlja se ispred naredbe while.
  • Promjena vrijednosti kontrolne varijable događa se unutar bloka while.

Ispravan program izgleda ovako:

#include <stdio.h>
int main()
{
     int p=1,i=1,n;
     float s=0;
     printf("\nUpisite jedan broj: ");
     scanf("%d",&n);
     while(i<=n)
     {
           s+=(float)p/i;
           i+=2;
           p=-p;
     }
     printf("\n  suma je %.3f",s);
     return 0;
}

Razmislite što računa ovaj program!


1.3. Primjer 3.

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=1,s=0;
     while(i<=5)
     {
           s+=i;
           i+=2;
     }
     printf("\nTrazeni zbroj je %d",s);
     return 0;
}

 

Rješenje

Na zaslonu će se ispisati: „Trazeni zbroj je 9“. Zašto?

1. korak

Vrijednost kontrolne varijable i je 1. Pri prvom ulasku u petlju while, provjerava se uvjet. S obzirom na to da je uvjet istinit (vrijedi da je 1 <= 5), izvršava se blok naredbi unutar naredbe while. Vrijednost varijable s uvećava se za 1 (1 je vrijednost varijable i) pa postaje 1. Nakon toga vrijednost varijable i uvećava se za 2 i postaje 3.

2. korak

Sada se program vraća na provjeravanje uvjeta 3 <= 5 i uvjet je zadovoljen. Vrijednost varijable s postaje 4 (prethodna vrijednost varijable s (1) uvećana za vrijednost varijable i (3)), a vrijednost varijable i ponovno se uvećava za 2 i postaje 5.

3. korak             

Tijekom ponovne provjere uvjeta vrijednost kontrolne varijable je 5, pa je uvjet još istinit (5 <= 5). Izvršavanjem bloka naredbi unutar while, vrijednost varijable s postaje 9 (5 + 4), a vrijednost kontrolne varijable je 7 (5 + 2).

4. korak             

Povratkom na provjeru uvjeta pokazuje se da uvjet više nije istinit (7 > 5) i izvršavanje programa nastavlja se sljedećom naredbom nakon bloka while. U našem je slučaju to naredba za ispis vrijednosti varijable s. Dakle, na zaslonu će se ispisati „Trazeni zbroj je 9“.


1.4. Primjer 4.

Bez upisivanja programa odgovorite koliko će se puta izvršiti ova petlja?

int i=100,suma=0;
while(i)
{
     suma+=--i;
     i++;
}

 

Rješenje

Ova će se petlja izvršavati beskonačno.

Početna vrijednost varijable i je 100. Uvjet je samo (i) i dok god je i različit od 0 naredbe u petlji while će se izvršavati. Unutra petlje while nalazi se naredba koja računa zbroj varijabli i (suma+=--i;), ali ta naredba ujedno i dekrementom smanjuje vrijednost varijable i na 99. Naredba i++; ponovo povećava vrijednost varijable i na 100, nakon toga se program vraća na uvjet u naredbi while.

Ako dodate naredbu printf("\n%d\t%d",suma,i); između naredbe suma+=--i; i naredbe i++;vidjet ćete promjene varijabli suma i i. Pokretanjem tako popravljenog programa vidjet ćete kako se mijenja varijabla suma. U jednom od koraka izvođenja programa varijabla suma poprimit će negativan predznak.

Zašto?

Da bismo odgovorili na to pitanje moramo se prisjetiti prikaza cijelih brojeva u računalu. S obzirom na to da je memorija računala ograničena, cijeli se brojevi prikazuju u određenom broju bitova (konkretno int se prikazuje u 32 bita). U jednom koraku izvođenja programa vrijednost varijable suma će biti veća od najvećeg broja koji stane u 32 bita. Višak bitova neće imati mjesto u memoriji i zanemariti će se, procesor će broj interpretirati kao negativan.


2. Zadaci za vježbu

1. U programima koji slijede učinjena je pogreška zbog koje programi ne rade ispravno. Ne zaboravite da pogreška ne mora uvijek biti sintaktička nego može biti  i logička. Pronađite pogrešku bez uporabe računala!

a)

#include <stdio.h>
int main()
{
     int s=0, n;
     printf ("\nUpisite broj: ");
     scanf("%d",&n);
     while (i=1;i<=n)
     {
           s+=i;
           i+=3;
     }
     printf("Zbroj je %d",s);
     return 0;
}

 

 b)

#include <stdio.h>
int main()
{
     int s=0, i=1, n, znam;
     printf ("\nUpisite broj: ");
     scanf("%d",&n);
     while (n!=0)
     {
          znam=n%10;
          s+=znam;
     }
     n/=10;
     printf("Zbroj je %d",s);
     return 0;
}

 

Nakon ispravljenih pogreški odgovorite: Što rade prikazani programi?

2. 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=1,f=1,n=6;
     while(i<=n)
     {
           f*=i;i++;
     }
     printf("\n%d! = %d",n,f);
     return 0;
}

3. Napišite program koji će od korisnika tražiti upisivanje jednoga prirodnog broja. Program treba upisani broj rastaviti na proste faktore i ispisati ih.

 

Testni primjeri

Ulaz:      12

Izlaz:     12=1*2*2*3


4. Napišite program koji će na zaslonu ispisati najveću i najmanju znamenku učitanog broja.

Testni primjeri

Ulaz:      2583476

Izlaz:     Najmanja znamenka je 2, a najveca 8


5. Napišite program koji omogućuje upisivanje broja u binarnom brojevnom sustavu. Program treba upisani broj pretvoriti u dekadski i rezultat ispisati na zaslonu.

Testni primjeri

Ulaz:      10110101

Izlaz:     181

Rješenja zadataka od 3. do 5. potražite na e-sferi.

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

1. Napišite program koji, koristeći se Euklidovim algoritmom za traženje najveće zajedničke mjere dvaju brojeva, skraćuje upisani razlomak (upisuje se posebno brojnik, a posebno nazivnik danog razlomka).

Uputa: Euklidov algoritam radi ovako:

  1. Veći se broj podijeli s manjim i gleda ostatak dijeljenja.
  2. Ako je ostatak jednak nuli, najveća zajednička mjera je manji broj.
  3. Ako je ostatak različit od nule, manji broj postaje veći, ostatak pri dijeljenju postaje manji broj, i algoritam se vraća na početak.
  4. Postupak se ponavlja sve dok ostatak pri dijeljenju većeg broja s manjim ne postane nula.

              Pronađimo najveću zajedničku mjeru brojeva 12 i 18.

2. Među neparnim brojevima mogu se izdvojiti oni kojima je svaka znamenka neparna. Nazovimo ih „potpuno neparni brojevi”. Napišite program koji će za upisani cijeli broj ispisati je li potpuno neparan ili nije potpuno neparan.

Testni primjeri

Ulaz:      1325

Izlaz:     Nije potpuno neparan.

Ulaz:      3793

Izlaz:     Potpuno je neparan.     

 

3. Napišite program koji omogućuje upisivanje cijelih brojeva sve dok se ne upiše 0. Program treba na zaslonu ispisati koliko od upisanih brojeva ima barem jednu parnu znamenku.

Testni primjeri:

Ulaz:      3  17  21  87  16  24  18  37  0

Izlaz:     5            

 

4. Napišite program koji omogućuje upisivanje cijelih brojeva sve dok se ne upiše 0. Program treba na zaslonu ispisati koliko od upisanih brojeva ima točno jednu neparnu znamenku.

 

Testni primjeri

Ulaz:      31  7  121  352  81  11  13  0

Izlaz:     2        

 


Rješenja ovih zadataka možete pronaći na e-sferi.


4. Dodatni materijali

Video lekcija - while petlja: