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: | srijeda, 29. siječnja 2025., 20:57 |
1. Petlja while
Petlja while je petlja u kojoj je zadani uvjet na početku. Pseudojezikom zapisujemo je ovako:
dok je uvjet činitinaredba
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:
- Izračunava se uvjet izvođenja (to je logički izraz i njegov rezultat može biti logička istina ili logička neistina).
- 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.
- 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.
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.
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.
Ulaz: 10110101
Izlaz: 181
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:
- Veći se broj podijeli s manjim i gleda ostatak dijeljenja.
- Ako je ostatak jednak nuli, najveća zajednička mjera je manji broj.
- 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.
- 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.
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.
Ulaz: 3 17 21 87 16 24 18 37 0
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.
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: