You are on page 1of 107

Univerzitet u Sarajevu

Elektrotehnički fakultet Sarajevo

Uvod u programiranje
Petlje
Doc. dr. Senka Krivić

Bazirano na nastavnim materijalima Vedrana Ljubovića


Petlje

● Petlja je dio programa čije se izvršavanje ponavlja


određeni broj puta.
● U programskom jeziku C postoje tri tipa petlji: for, while i
do-while.
● if nije petlja – ne ponavlja se
● switch-case nije petlja
for petlja

● for petlja se koristi kada želimo ponoviti neki kod određeni


unaprijed poznati broj puta.

#include <stdio.h>
if nije petlja!
int main() {
if nije petlja!
int i;
if nije petlja!
for (i=0; i<5; i++) {
if nije petlja!
printf("if nije petlja!\n");
if nije petlja!
}
return 0;
}
for petlja

● for petlja se koristi kada želimo ponoviti neki kod određeni


unaprijed poznati broj puta.

#include <stdio.h>
if nije petlja!
int main() {
if nije petlja!
int i;
if nije petlja!
for (i=0; i<8; i++) {
if nije petlja!
printf("if nije petlja!\n");
if nije petlja!
}
if nije petlja!
return 0;
if nije petlja!
}
if nije petlja!
for petlja

● for petlja se koristi kada želimo ponoviti neki kod određeni


unaprijed poznati broj puta.

#include <stdio.h>
if nije petlja!
int main() {
if nije petlja!
int i;
if nije petlja!
for (i=0; i<8; i++)
if nije petlja!
printf("if nije petlja!\n");
if nije petlja!
if nije petlja!
return 0;
if nije petlja!
}
if nije petlja!
for petlja

● for petlja se koristi kada želimo ponoviti neki kod određeni


unaprijed poznati broj puta.
● Petlja se sastoji od: deklaracije kontrolne varijable,
zaglavlja petlje i tijela petlje.
− (Deklaracije bi u C-u morale ići na početak funkcije)
#include <stdio.h>
int main() {
int i;
for (i=0; i<8; i++)
printf("if nije petlja!\n");

return 0;
}
Struktura for petlje
Kontrolna promjenljiva
(brojač)
Zaglavlje petlje
int i;
for (i=0; i<8; i++) {
printf("if nije petlja!\n");
}
Tijelo petlje (blok naredbi
koje se ponavljaju)
Neispravno (C++)

for (int i=0; i<8; i++) {


printf("if nije petlja!\n");
}
Česta greška

Tijelo petlje je naredba


koja ne radi ništa
for (i=0; i<10; i++);
printf("i je %d", i);

Ovo je neki blok naredbi


koji se nalazi poslije petlje

i je 10
Zaglavlje for petlje

● Sintaksa zaglavlja for petlje je:


● for (inicijalizacija; uslov; ažuriranje)

● Inicijalizacija je naredba koja se izvršava jednom prije


Veliki dio stvari
koje radimo su u početne
ulaska u petlju, a u pravilu služi za postavljanje
cilju bolje
vrijednosti kontrolne promjenljive. čitljivosti koda.
● Petlja se ponavlja sve dok je uslov ispunjen.
● Ažuriranje (inkrement, korak) je naredba koja se izvršava
pri svakom prolasku kroz petlju (nakon tijela petlje).
● Ova tri elementa su razdvojena znakom tačka-zarez.
Zaglavlje for petlje
Inicijalizacija
Postavlja početnu vrijednost
kontrolne promjenljive

int i;
for (i=0; i<8; i++) {
printf("if nije petlja!\n");
}
Uslov Ažuriranje
Petlja se ponavlja sve dok je Promjenljiva i se povećava
uslov ispunjen za jedan pri svakom prolazu
Zaglavlje for petlje

● Koliko puta će se izvršiti ova petlja?

int i;
for (i=1; i<8; i++) {
printf("if nije petlja!\n");
}
Zaglavlje for petlje

● Koliko puta će se izvršiti ova petlja?

int i;
for (i=100; i<200; i++) {
printf("if nije petlja!\n");
}
Zaglavlje for petlje

● Koliko puta će se izvršiti ova petlja?

int i;
for (i=1; i<=8; i++) {
printf("if nije petlja!\n");
}
Zaglavlje for petlje

● Koliko puta će se izvršiti ova petlja?

int i;
for (i=8; i<1; i++) {
printf("if nije petlja!\n");
}
Proizvoljan broj prolaza

#include <stdio.h>
int main() {
int i,n;
printf("Unesite broj n: ");
scanf("%d", &n);
for (i=0; i<n; i++) {
printf("if nije petlja!\n");
}
return 0;
}
Kako funkcioniše for petlja?

#include <stdio.h> i je 0
i je 1
int main() {
i je 2
int i,n; i je 3
printf("Unesite broj n: ");i je 4
poslije petlje 5
scanf("%d", &n);
for (i=0; i<n; i++) {
printf("i je %d\n", i);
}
printf("poslije petlje %d\n", i);
return 0;
}
Kako funkcioniše for petlja?

#include <stdio.h> i=? n=?


int main() {
int i,n;
printf("Unesite broj n: ");
scanf("%d", &n);
for (i=0; i<n; i++) {
printf("i je %d\n", i);
}
printf("poslije petlje %d\n", i);
return 0;
}
Kako funkcioniše for petlja?

#include <stdio.h> i=? n=?


int main() { n=5
int i,n;
printf("Unesite broj n: ");
scanf("%d", &n);
for (i=0; i<n; i++) {
printf("i je %d\n", i);
}
printf("poslije petlje %d\n", i);
return 0;
}
Kako funkcioniše for petlja?

#include <stdio.h> i=? n=?


int main() { n=5
int i,n; i=0
printf("Unesite broj n: ");
scanf("%d", &n);
for (i=0; i<n; i++) {
printf("i je %d\n", i);
}
printf("poslije petlje %d\n", i);
return 0;
}
Kako funkcioniše for petlja?

#include <stdio.h> i=? n=?


int main() { n=5
int i,n; i=0
printf("Unesite broj n: "); i<n? 0<5? DA
scanf("%d", &n);
for (i=0; i<n; i++) {
printf("i je %d\n", i);
}
printf("poslije petlje %d\n", i);
return 0;
}
Kako funkcioniše for petlja?

#include <stdio.h> i=? n=?


int main() { n=5
int i,n; i=0
printf("Unesite broj n: "); i<n? 0<5? DA
scanf("%d", &n); “i je 0”
for (i=0; i<n; i++) {
printf("i je %d\n", i);
}
printf("poslije petlje %d\n", i);
return 0;
}
Kako funkcioniše for petlja?

#include <stdio.h> i=? n=?


int main() { n=5
int i,n; i=0
printf("Unesite broj n: "); i<n? 0<5? DA
scanf("%d", &n); “i je 0”
for (i=0; i<n; i++) { i++ => i=1
printf("i je %d\n", i);
}
printf("poslije petlje %d\n", i);
return 0;
}
Kako funkcioniše for petlja?

#include <stdio.h> i=? n=?


int main() { n=5
int i,n; i=0
printf("Unesite broj n: "); i<n? 0<5? DA
scanf("%d", &n); “i je 0”
for (i=0; i<n; i++) { i++ => i=1
printf("i je %d\n", i); 1<5? DA
}
printf("poslije petlje %d\n", i);
return 0;
}
Kako funkcioniše for petlja?

#include <stdio.h> i=? n=?


int main() { n=5
int i,n; i=0
printf("Unesite broj n: "); i<n? 0<5? DA
scanf("%d", &n); “i je 0”
for (i=0; i<n; i++) { i++ => i=1
printf("i je %d\n", i); 1<5? DA
} “i je 1”
printf("poslije petlje %d\n", i);
return 0;
}
Kako funkcioniše for petlja?

#include <stdio.h> i=? n=?


int main() { n=5
int i,n; i=0
printf("Unesite broj n: "); i<n? 0<5? DA
scanf("%d", &n); “i je 0”
for (i=0; i<n; i++) { i++ => i=1
printf("i je %d\n", i); 1<5? DA
} “i je 1”
i++ >= i=2
printf("poslije petlje %d\n", i);
return 0;
}
Kako funkcioniše for petlja?

#include <stdio.h> i=? n=?


int main() { n=5
int i,n; i=0
printf("Unesite broj n: "); i<n? 0<5? DA
scanf("%d", &n); “i je 0”
for (i=0; i<n; i++) { i++ => i=1
printf("i je %d\n", i); 1<5? DA
} “i je 1”
i++ >= i=2
printf("poslije petlje %d\n", i);
return 0; 2<5? DA
}
Kako funkcioniše for petlja?

#include <stdio.h> i=? n=?


int main() { n=5
int i,n; i=0
printf("Unesite broj n: "); i<n? 0<5? DA
scanf("%d", &n); “i je 0”
for (i=0; i<n; i++) { i++ => i=1
printf("i je %d\n", i); 1<5? DA
} “i je 1”
i++ >= i=2
printf("poslije petlje %d\n", i);
return 0; 2<5? DA
} “i je 2”
...
Kako funkcioniše for petlja?

#include <stdio.h> i=? n=?


int main() { n=5
int i,n; i=0
printf("Unesite broj n: "); i<n? 0<5? DA
scanf("%d", &n);
for (i=0; i<n; i++) {
printf("i je %d\n", i);
}
printf("poslije petlje %d\n", i);“i je 4”
return 0;
}
Kako funkcioniše for petlja?

#include <stdio.h> i=? n=?


int main() { n=5
int i,n; i=0
printf("Unesite broj n: "); i<n? 0<5? DA
scanf("%d", &n);
for (i=0; i<n; i++) {
printf("i je %d\n", i);
}
printf("poslije petlje %d\n", i);“i je 4”
return 0; i++ => i=5
}
Kako funkcioniše for petlja?

#include <stdio.h> i=? n=?


int main() { n=5
int i,n; i=0
printf("Unesite broj n: "); i<n? 0<5? DA
scanf("%d", &n);
for (i=0; i<n; i++) {
printf("i je %d\n", i);
}
printf("poslije petlje %d\n", i);“i je 4”
return 0; i++ => i=5
} 5<5? NE!
Kako funkcioniše for petlja?

#include <stdio.h> i=? n=?


int main() { n=5
int i,n; i=0
printf("Unesite broj n: "); i<n? 0<5? DA
scanf("%d", &n);
for (i=0; i<n; i++) {
printf("i je %d\n", i);
}
printf("poslije petlje %d\n", i);“i je 4”
return 0; i++ => i=5
} 5<5? NE!
poslije petlje 5
Kako funkcioniše for petlja?

#include <stdio.h> i je 0
i je 1
int main() {
i je 2
int i,n; i je 3
printf("Unesite broj n: ");i je 4
poslije petlje 5
scanf("%d", &n);
for (i=0; i<n; i++) {
printf("i je %d\n", i);
}
printf("poslije petlje %d\n", i);
return 0;
}
Polja zaglavlja mogu biti i prazna

#include <stdio.h>
int main() {
int i=0,n;
printf("Unesite broj n: ");
scanf("%d", &n);
for (; i<n; i++) {
printf("i je %d\n", i);
}
printf("poslije petlje %d\n", i);
return 0;
}
Polja zaglavlja mogu biti i prazna

#include <stdio.h>
int main() {
int i=0,n;
printf("Unesite broj n: ");
scanf("%d", &n);
for (i; i<n; i++) {
printf("i je %d\n", i);
}
Nije greška ali
printf("poslije ovo je
petlje %d\n", i);
naredba koja ne radi ništa!
return 0;
}
Polja zaglavlja mogu biti i prazna

#include <stdio.h>
int main() {
int i=0,n;
printf("Unesite broj n: ");
scanf("%d", &n);
for (; i<n;) {
printf("i je %d\n", i);
i++;
}
printf("poslije petlje %d\n", i);
return 0;
}
Beskonačna petlja

#include <stdio.h>
int main() {
int i=0,n;
printf("Unesite broj n: ");
scanf("%d", &n);
for (;;) {
printf("i je %d\n", i);
i++;
}
printf("poslije petlje %d\n", i);
return 0;
}
Beskonačna petlja

● Beskonačna petlja će se izvršavati sve dok korisnik ne


prekine program.
● Može se dodati neka druga vrsta uslova u petlju:

for (;;) {
if (i>=n) break;
printf("i je %d\n", i);
i++;
}
printf("poslije petlje %d\n", i);
Naredbe break i continue

● Naredba break prekida petlju i nastavlja izvršavanje


programa nakon petlje.
● Naredba continue preskače sve naredbe do kraja tijela
petlje i prelazi na sljedeću iteraciju petlje.
for (i=0; i<100; i++) {
x = sin(i/3.);
if (x<=0) continue;
y = i + sqrt(x);
printf("i=%d x=%f y=%f\n", i, x, y);
}
Naredbe break i continue

● Naredba break prekida petlju i nastavlja izvršavanje


programa nakon petlje.
● Naredba continue preskače sve naredbe do kraja tijela
petlje i prelazi na sljedeću iteraciju petlje.
for (i=0; i<100; i++) { i=10
x = sin(i/3.); i/3. = 3.333...
sin(3.333) = -0.187...
if (x<=0) continue; y se ne računa
y = i + sqrt(x);
printf("i=%d x=%f y=%f\n”, i, x, y);
}
Naredbe break i continue

● Još jedan primjer continue/break (ispitni zadatak)


#include <stdio.h> Petlja sa ovakvim zaglavljem
int main() { se izvršava 70 puta
int k,h=2;
for (k=0; k<70; k++) {
if(k%6==0) continue;
Osim kada ga preskočimo
h++; sa continue, a to je za:
if (k==6U svakom
|| k==12)
prolazu h h=0,6,12,18,24...
break;se uvećava za 1 (ukupno 12 puta)
}
Da li će se izvršiti
printf("h=%d",h);
ovaj break?
return 0;
h=72
h=60
}
Naredbe break i continue

● Još jedan primjer continue/break (ispitni zadatak)


#include <stdio.h> Petlja sa ovakvim zaglavljem
int main() { se izvršava 70 puta
int k,h=2;
for (k=0; k<70; k++) {
if(k%6==0) continue;
Osim kada ga preskočimo
h++; sa continue, a to je za:
if (k==6 || k==12) h=0,6,12,18,24...
break; (ukupno 12 puta)
}
Da li će se izvršiti
printf("h=%d",h);
ovaj break?
return 0; NE (6 i 12 su djeljivi sa 6)
h=72
h=60
}
Naredbe break i continue

● Još jedan primjer continue/break (ispitni zadatak)


#include <stdio.h> Petlja sa ovakvim zaglavljem
int main() { se izvršava 70 puta
int k,h=2;
for (k=0; k<70; k++) {
if(k%6==0) continue;
Osim kada ga preskočimo
h++; sa continue, a to je za:
if (k==6 || k==13) h=0,6,12,18,24...
break; (ukupno 12 puta)
}
Da li će se izvršiti
printf("h=%d",h);
ovaj break?
return 0; NE (6 i 12 su djeljivi sa 6)
h=72
h=60
}
Naredbe break i continue

● Još jedan primjer continue/break (ispitni zadatak)


#include <stdio.h> Petlja sa ovakvim zaglavljem
int main() { se izvršava 70 puta
int k,h=2;
for (k=0; k<70; k++) {
if(k%6==0) continue;
Osim kada ga preskočimo
h++; sa continue, a to je za:
if (k==6 || k==13) h=0,6,12,18,24...
break; (ukupno 12 puta)
}
Da li će se izvršiti
printf("h=%d",h);
ovaj break?
return 0; DA (13 nije djeljivo sa 6)
h=72
h=13
}
Naredbe break i continue

● Još jedan primjer continue/break (ispitni zadatak)


#include <stdio.h> Petlja sa ovakvim zaglavljem
Naredba
intsemain()
izvršava za{k=1,2, se izvršava 70 puta
3,4,5,7,8,9,10,11,13 (11 puta)
int k,h=2;
for (k=0; k<70; k++) {
if(k%6==0) continue;
Osim kada ga preskočimo
h++; sa continue, a to je za:
if (k==6 || k==13) h=0,6,12,18,24...
break; (ukupno 12 puta)
}
printf("h=%d",h); Da li će se izvršiti
ovaj break?
return 0; DA (13 nije djeljivo sa 6)
h=72
h=13
}
Još o zaglavlju for petlje?

#include <stdio.h> i će se uvećati za 1


int main() { nakon ispisa
int i=0,n;
printf("Unesite broj n: ");
scanf("%d", &n);
for (; i<n; printf("i je %d\n", i++)) {

}
printf("poslije petlje %d\n", i);
return 0;
} Sve ovo je naredba koja će se
izvršiti pri svakom prolazu
(naredba ažuriranja).
Još o zaglavlju for petlje?

#include <stdio.h>
int main() {
int i=0,n;
printf("Unesite broj n: ");
scanf("%d", &n);
for (; i<n; printf("i je %d\n", i++));
printf("poslije petlje %d\n", i);
return 0;
} Tijelo petlje je prazno
Još o zaglavlju for petlje?

#include <stdio.h> U inicijalnom dijelu možemo


int main() { uraditi i unos…
int i=0,n;
printf("Unesite broj n: ");
for (scanf("%d", &n); i<n; printf("i je
%d\n", i++));
printf("poslije petlje %d\n", i);
return 0;
}
Korak ne mora biti 1

int i; i je 1
i je 4
for (i=1; i<8; i+=3) i je 7
U svakom koraku
printf("i je %d\n", i); i
poslije petlje 10
se povećava
printf("poslije petlje %d\n", i);za 3
Česta greška

i je 1
int i; i je 1
for (i=1; i<8; i+3) i je 1
printf("i je %d\n", i); i je 1
i je 1
Beskonačna petlja
printf("poslije petlje %d\n", i);i je 1
i se ne mijenja! i je 1
i je 1
i je 1
i je 1
i je 1
i je 1
i je 1
i je 1
i je 1
i je 1
Opadajuća for petlja

● Ispisati sve brojeve od n do 1 uključivo, u opadajućem


redoslijedu.
#include <stdio.h>
int main() {
int i,n;
printf("Unesite broj n: ");
scanf("%d", &n);
for (i=n; i>0; i--)
printf("%d\n", i); U svakom koraku i
return se smanjuje za 1
Petlja se0;
prekida
} kada i dođe do
nule
Opadajuća for petlja

● Ispisati sve brojeve od n do 1 uključivo, u opadajućem


redoslijedu.
n=3
#include <stdio.h> i=3
int main()Pošto
{ se i SMANJUJE i>0 => 3>0? DA
uslov je VEĆE OD "3"
int i,n; i-- => i=2
printf("Unesite broj n: "); i>0 => 2>0? DA
scanf("%d", &n); "2"
for (i=n; i>0; i--) i-- => i=1
printf("%d\n", i); i>0 => 1>0? DA
"1"
return 0; i-- => i=0
} i>0 => 0>0? NE!
Korak ne mora biti 1

● Napisati program koji ispisuje sve parne brojeve na


intervalu [n,n2]
#include <stdio.h>
int main() { Šta ako je n
neparno?
int i,n,poc;
printf("Unesite broj n: ");
scanf("%d", &n);
for (i=n; i<=n*n; i+=2)
printf("%d\n", i); U svakom koraku i
return 0; se povećava za 2
}
Korak ne mora biti 1

● Napisati program koji ispisuje sve parne brojeve na


intervalu [n,n2]
#include <stdio.h>
int main() {
int i,n,poc;
printf("Unesite broj n: ");
scanf("%d", &n);
i=n;
if (n%2 == 1) i++;
for (; i<=n*n; i+=2)
printf("%d\n", i);
return 0;
}
Korak ne mora biti 1

● Napisati program koji ispisuje sve parne brojeve na


intervalu [n,n2]
#include <stdio.h>
int main() {
int i,n,poc;
printf("Unesite broj n: ");
scanf("%d", &n);
for (i=(n%2==0)?n:n+1; i<=n*n; i+=2)
printf("%d\n", i);
return 0;
} Ternarni operator
Korak ne mora biti 1

● Napisati program u kojem se traži unos cijelog broja x, a


zatim se provjerava da li je x stepen dvojke (x=2n).
#include <stdio.h>
int main() {
int i,x;
printf("Unesite broj x: ");
scanf("%d", &x);
for (i=1; i<=x; i*=2) {
if (x==i) { U svakom koraku i se množi sa 2,
printf("JESTE!\n"); tako da su i stepeni dvojke.
}
}
return 0; Ako nije stepen dvojke, treba
} ispisati poruku NIJE...
Korak ne mora biti 1

● Napisati program u kojem se traži unos cijelog broja x, a


zatim se provjerava da li je x stepen dvojke (x=2n).
#include <stdio.h>
int main() {
int i,x;
printf("Unesite broj x: ");
scanf("%d", &x);
for (i=1; i<=x; i*=2) {
if (x==i) { GREŠKA!!!
printf("JESTE!\n");
} else {
printf("NIJE!\n");
}
}
return 0;
}
Korak ne mora biti 1

● Napisati program u kojem se traži unos cijelog broja x, a


zatim se provjerava da li je x stepen dvojke (x=2n).
#include <stdio.h>
int main() { Unesite broj x: 8
int i,x; NIJE!
NIJE!
printf("Unesite broj x: ");
NIJE!
scanf("%d", &x); JESTE!
for (i=1; i<=x; i*=2) {
if (x==i) {
printf("JESTE!\n");
} else {
printf("NIJE!\n");
}
}
return 0;
}
Korak ne mora biti 1

● Napisati program u kojem se traži unos cijelog broja x, a


zatim se provjerava da li je x stepen dvojke (x=2n).
#include <stdio.h> x=8
int main() { i=1
int i,x;
printf("Unesite broj x: ");
scanf("%d", &x);
for (i=1; i<=x; i*=2) {
if (x==i) {
printf("JESTE!\n");
} else {
printf("NIJE!\n");
}
}
return 0;
}
Korak ne mora biti 1

● Napisati program u kojem se traži unos cijelog broja x, a


zatim se provjerava da li je x stepen dvojke (x=2n).
#include <stdio.h> x=8
int main() { i=1
int i,x; 1<8? DA
printf("Unesite broj x: ");
scanf("%d", &x);
for (i=1; i<=x; i*=2) {
if (x==i) {
printf("JESTE!\n");
} else {
printf("NIJE!\n");
}
}
return 0;
}
Korak ne mora biti 1

● Napisati program u kojem se traži unos cijelog broja x, a


zatim se provjerava da li je x stepen dvojke (x=2n).
#include <stdio.h> x=8
int main() { i=1
int i,x; 1<8? DA
printf("Unesite broj x: "); x==i? NE
scanf("%d", &x);
for (i=1; i<=x; i*=2) {
if (x==i) {
printf("JESTE!\n");
} else {
printf("NIJE!\n");
}
}
return 0;
}
Korak ne mora biti 1

● Napisati program u kojem se traži unos cijelog broja x, a


zatim se provjerava da li je x stepen dvojke (x=2n).
#include <stdio.h> x=8
int main() { i=1
int i,x; 1<8? DA
printf("Unesite broj x: "); x==i? NE
scanf("%d", &x); “NIJE!”
for (i=1; i<=x; i*=2) {
if (x==i) {
printf("JESTE!\n");
} else {
printf("NIJE!\n");
}
}
return 0;
}
Korak ne mora biti 1

● Napisati program u kojem se traži unos cijelog broja x, a


zatim se provjerava da li je x stepen dvojke (x=2n).
#include <stdio.h> x=8
int main() { i=1
int i,x; 1<8? DA
printf("Unesite broj x: "); x==i? NE
scanf("%d", &x); “NIJE!”
for (i=1; i<=x; i*=2) { i*=2 => i=2
if (x==i) { ...
printf("JESTE!\n");
} else {
printf("NIJE!\n");
}
}
return 0;
}
Korak ne mora biti 1

● Napisati program u kojem se traži unos cijelog broja x, a


zatim se provjerava da li je x stepen dvojke (x=2n).
#include <stdio.h>
int main() { Unesite broj x: 8
int i,x; NIJE!
NIJE!
printf("Unesite broj x: ");
NIJE!
scanf("%d", &x); JESTE!
for (i=1; i<=x; i*=2) {
if (x==i) {
printf("JESTE!\n");
} else {
printf("NIJE!\n");
}
}
return 0;
}
Korak ne mora biti 1

● Napisati program u kojem se traži unos cijelog broja x, a


zatim se provjerava da li je x stepen dvojke (x=2n).
#include <stdio.h>
int main() {
int i,x;
printf("Unesite broj x: ");
scanf("%d", &x);
for (i=1; i<=x; i*=2) {
if (x==i) {
printf("JESTE!\n");
}
}
if (????) printf("NIJE!\n");
return 0;
}
Korak ne mora biti 1

● Napisati program u kojem se traži unos cijelog broja x, a


zatim se provjerava da li je x stepen dvojke (x=2n).
#include <stdio.h> x=9
int main() { i=1
int i,x; 1<=9? DA
printf("Unesite broj x: "); x==i? NE
scanf("%d", &x); ...
for (i=1; i<=x; i*=2) { i=2...4...8...16
if (x==i) { 16<=9? NE
printf("JESTE!\n");
}
}
if (i!=2*x) printf("NIJE!\n");
return 0;
}
Korak ne mora biti 1

● Napisati program u kojem se traži unos cijelog broja x, a


zatim se provjerava da li je x stepen dvojke (x=2n).
#include <stdio.h> x=9
int main() { i=1
int i,x; 1<8? DA
printf("Unesite broj x: "); x==i? NE
scanf("%d", &x); ...
for (i=1; i<=x; i*=2) { i=2...4...8...16
if (x==i) { 16<=9? NE
printf("JESTE!\n"); 16!=9*2? DA
}
}
if (i!=2*x) printf("NIJE!\n");
return 0;
}
Ugniježđene (višestruke) petlje

● Unutar bloka naredbi petlje se može nalaziti bilo šta, pa i


druga petlja!
i=0,j=0
#include <stdio.h> i=0,j=1
int main() { i=0,j=2
int i,j; ...
i=0,j=4
for (i=0; i<5; i++) {
i=1,j=0
for (j=0; j<5; j++) { i=1,j=1
printf("i=%d,j=%d\n", i,i=1,j=2
j);
} ...
} i=4,j=2
return 0; i=4,j=3
} i=4,j=4
Ugniježđene petlje

● Unutar bloka naredbi petlje se može nalaziti bilo šta, pa i


druga petlja!
Ovu ćemo petlju zvati
#include <stdio.h> “petlja i”
int main() {
int i,j;
for (i=0; i<5; i++) {
for (j=0; j<5; j++) {
printf("i=%d,j=%d\n", i, j);
}
}
return 0; A ovu petlju
} “petlja j”
Ugniježđene petlje

i=0

#include <stdio.h>
int main() {
int i,j;
for (i=0; i<5; i++) {
for (j=0; j<5; j++) {
printf("i=%d,j=%d\n", i, j);
}
}
return 0;
}
Ugniježđene petlje

i=0
0<5? DA
#include <stdio.h>
int main() {
int i,j;
for (i=0; i<5; i++) {
for (j=0; j<5; j++) {
printf("i=%d,j=%d\n", i, j);
}
}
return 0;
}
Ugniježđene petlje

Izvršava se tijelo
#include <stdio.h> petlje i
int main() {
int i,j;
for (i=0; i<5; i++) {
for (j=0; j<5; j++) {
printf("i=%d,j=%d\n", i, j);
}
}
return 0;
}
Ugniježdene petlje

i=0
0<5? DA
j=0
#include <stdio.h>
int main() {
int i,j;
for (i=0; i<5; i++) {
for (j=0; j<5; j++) {
printf("i=%d,j=%d\n", i, j);
}
}
return 0;
}
Ugniježdene petlje

i=0
0<5? DA
j=0
#include <stdio.h>
0<5? DA
int main() {
int i,j;
for (i=0; i<5; i++) {
for (j=0; j<5; j++) {
printf("i=%d,j=%d\n", i, j);
}
}
return 0;
}
Ugniježdene petlje

i=0
0<5? DA
j=0
#include <stdio.h>
0<5? DA
int main() {
“i=0,j=0”
int i,j;
for (i=0; i<5; i++) {
for (j=0; j<5; j++) {
printf("i=%d,j=%d\n", i, j);
}
}
return 0;
}
Ugniježdene petlje

i=0
0<5? DA
j=0
#include <stdio.h>
0<5? DA
int main() {
“i=0,j=0”
int i,j;
j++ => j=1
for (i=0; i<5; i++) {
for (j=0; j<5; j++) {
printf("i=%d,j=%d\n", i, j);
}
}
return 0;
}
Ugniježdene petlje

i=0
0<5? DA
j=0
#include <stdio.h>
0<5? DA
int main() {
“i=0,j=0”
int i,j;
j++ => j=1
for (i=0; i<5; i++) {
1<5? DA
for (j=0; j<5; j++) {
printf("i=%d,j=%d\n", i, j);
}
}
return 0;
}
Ugniježdene petlje

i=0
0<5? DA
j=0
#include <stdio.h>
0<5? DA
int main() {
“i=0,j=0”
int i,j;
j++ => j=1
for (i=0; i<5; i++) {
1<5? DA
for (j=0; j<5; j++) {
“i=0,j=1”
printf("i=%d,j=%d\n", i, j);
}
}
return 0;
}
Ugniježdene petlje

i=0
0<5? DA
j=0
#include <stdio.h>
0<5? DA
int main() {
“i=0,j=0”
int i,j;
j++ => j=1
for (i=0; i<5; i++) {
1<5? DA
for (j=0; j<5; j++) {
“i=0,j=1”
printf("i=%d,j=%d\n", i, j);
...
}
“i=0,j=4”
}
return 0;
}
Ugniježdene petlje

i=0
0<5? DA
j=0
#include <stdio.h>
0<5? DA
int main() {
“i=0,j=0”
int i,j;
j++ => j=1
for (i=0; i<5; i++) {
1<5? DA
for (j=0; j<5; j++) {
“i=0,j=1”
printf("i=%d,j=%d\n", i, j);
...
}
“i=0,j=4”
}
j++ => j=5
return 0;
}
Ugniježdene petlje

i=0
0<5? DA
j=0
#include <stdio.h>
0<5? DA
int main() {
“i=0,j=0”
int i,j;
j++ => j=1
for (i=0; i<5; i++) {
1<5? DA
for (j=0; j<5; j++) {
“i=0,j=1”
printf("i=%d,j=%d\n", i, j);
...
}
“i=0,j=4”
}
j++ => j=5
return 0;
5<5? NE
}
Ugniježdene petlje

i=0
0<5? DA
j=0
#include <stdio.h>
0<5? DA
int main() {
“i=0,j=0”
int i,j;
j++ => j=1
for (i=0; i<5; i++) {
1<5? DA
for (j=0; j<5; j++) {
“i=0,j=1”
printf("i=%d,j=%d\n", i, j);
...
}
“i=0,j=4”
}
j++ => j=5
return 0;
Izvršavanje bi se trebalo 5<5? NE
}
nastaviti ovdje, no to je
kraj petlje i
Ugniježdene petlje

i=0
0<5? DA
j=0
#include <stdio.h>
0<5? DA
int main() {
“i=0,j=0”
int i,j;
j++ => j=1
for (i=0; i<5; i++) {
1<5? DA
for (j=0; j<5; j++) {
“i=0,j=1”
printf("i=%d,j=%d\n", i, j);
...
}
“i=0,j=4”
}
j++ => j=5
return 0;
5<5? NE
}
i++ => i=1
Ugniježdene petlje

i=0
0<5? DA
j=0
#include <stdio.h>
0<5? DA
int main() {
“i=0,j=0”
int i,j;
j++ => j=1
for (i=0; i<5; i++) {
1<5? DA
for (j=0; j<5; j++) {
“i=0,j=1”
printf("i=%d,j=%d\n", i, j);
...
}
“i=0,j=4”
}
j++ => j=5
return 0;
5<5? NE
}
i++ => i=1
1<5? DA
Ugniježdene petlje

i=0
0<5? DA
j=0
#include <stdio.h>
0<5? DA
int main() {
“i=0,j=0”
int i,j;
j++ => j=1
for (i=0; i<5; i++) {
1<5? DA
for (j=0; j<5; j++) {
“i=0,j=1”
printf("i=%d,j=%d\n", i, j);
...
}
“i=0,j=4”
}
j++ => j=5
return 0;
5<5? NE
}
i++ => i=1
1<5? DA
j=0
... ...
Primjer dvostruke petlje

● Napraviti program koji crta na ekranu kvadrat dimenzija


nxn sastavljen od znakova zvijezda (*) pri čemu je n
uneseno sa tastature
Strategija rješavanja složenih programerskih
problema

● Opšta strategija (inspirisana latinskom uzrečicom “zavadi


pa vladaj”) glasi:
Ako imate složeni problem koji ne znate
(isprve) riješiti, podijelite ga na jednostavnije
probleme koje znate riješiti.
● Čak i ako ne uspijete riješiti sve dijelove, barem imate
nešto što je u praksi bolje od ništa.
Crtanje oblika na ekranu

● Ispis znakova na ekran funkcioniše po scan linijama, s


lijeva na desno, odozgo prema dolje
123456789012345678901234567890123456789
012345678901234567890123456789012345678
901234567890123456789012345678901234567
890123456789012345678901234567890123456
789012345678901234567890123456789012345
678901234567890123456789012345678901234
567890123456789012345678901234567890123

● Nema mogućnosti da se kursor vrati prema gore!


(prema lijevo se može brisati sa \b)
Crtanje oblika na ekranu

● To znači da oblike treba crtati po linijama


* *
* * * *
***** *****
* * * *
* * * * * *
* * * * * *
***** *****
Primjer dvostruke petlje

● Napraviti program koji crta na ekranu kvadrat dimenzija


nxn sastavljen od znakova zvijezda (*) pri čemu je n
uneseno sa tastature
● Podzadatak 1: Nacrtati jedan red od n zvjezdica
− Potrebno je da zadatak ispisa 1 zvjezdice
ponovimo n puta.
for (i=0; i<n; i++) {
printf("*");
}
Primjer dvostruke petlje

● Napraviti program koji crta na ekranu kvadrat dimenzija


nxn sastavljen od znakova zvijezda (*) pri čemu je n
uneseno sa tastature
● Podzadatak 1: Nacrtati jedan red od n zvjezdica
− Potrebno je da zadatak ispisa 1 zvjezdice
ponovimo n puta.
● Podzadatak 2: Ponoviti podzadatak 1 n puta!

for (i=0; i<n; i++) {


printf("*");
}
Primjer dvostruke petlje

● Napraviti program koji crta na ekranu kvadrat dimenzija


nxn sastavljen od znakova zvijezda (*) pri čemu je n
uneseno sa tastature
● Podzadatak 1: Nacrtati jedan red od n zvjezdica
− Potrebno je da zadatak ispisa 1 zvjezdice
ponovimo n puta.
● Podzadatak 2: Ponoviti podzadatak 1 n puta!
for (i=0; i<n; i++) {
for (i=0; i<n; i++) { GREŠKA: Ne možete u petlji
printf("*"); imati drugu petlju sa istom
} kontrolnom promjenljivom
}
Primjer dvostruke petlje

● Napraviti program koji crta na ekranu kvadrat dimenzija


nxn sastavljen od znakova zvijezda (*) pri čemu je n
uneseno sa tastature
● Podzadatak 1: Nacrtati jedan red od n zvjezdica
− Potrebno je da zadatak ispisa 1 zvjezdice
ponovimo n puta.
● Podzadatak 2: Ponoviti podzadatak 1 n puta!
for (i=0; i<n; i++) {
for (j=0; j<n; j++) {
printf("*");
}
}
Primjer dvostruke petlje

● Napraviti program koji crta na ekranu kvadrat dimenzija


nxn sastavljen od znakova zvijezda (*) pri čemu je n
uneseno sa tastature
#include <stdio.h>
int main() { Unesite broj n: 3
int i,j,n; *********
printf("Unesite broj n: ");
scanf("%d", &n);
for (i=0; i<n; i++) {
for (j=0; j<n; j++) {
printf("*");
}
} Nedostaju znakovi \n
return 0; za prelazak u novi red
}
Primjer dvostruke petlje

● Napraviti program koji crta na ekranu kvadrat dimenzija


nxn sastavljen od znakova zvijezda (*) pri čemu je n
uneseno sa tastature
#include <stdio.h>
Unesite broj n: 3
int main() { ***
int i,j,n; ***
printf("Unesite broj n: "); ***
scanf("%d", &n);
for (i=0; i<n; i++) {
for (j=0; j<n; j++) {
printf("*");
}
printf("\n");
}
return 0;
}
while petlja

● Petlja while koristi se kada nam nije unaprijed poznat broj


izvršenja, ali nam je poznat neki uslov.
while (uslov)
tijelo
● while znači “sve dok” - sve dok je uslov ispunjen ponavljaj
(tijelo)
● Kao ni for petlja, ni while se ne mora izvršiti niti jednom
ako uslov nije ispunjen već po ulasku u petlju.
int x=0;
while (x>2) {
printf("Password za ulaz je: ...");
}
while vs. for

● Svaka for petlja može se prepraviti u while petlju, i obrnuto

for (i=0; i<n; i++) {


printf("i je %d", i);
}
while vs. for

● Svaka for petlja može se prepraviti u while petlju, i obrnuto

i=0;
for ( ; i<n; i++) {
printf("i je %d", i);
}
while vs. for

● Svaka for petlja može se prepraviti u while petlju, i obrnuto

i=0;
for ( ; i<n; ) {
printf("i je %d", i);
i++;
}
while vs. for

● Svaka for petlja može se prepraviti u while petlju, i obrnuto

i=0;
while (i<n) {
printf("i je %d", i);
i++;
}
while vs. for

● Svaka for petlja može se prepraviti u while petlju, i obrnuto

A;
for (A; B; C) {
while(B) {
D;
D;
}
C;
}
while primjer

● Napisati program koji omogućuje korisniku da unosi


brojeve i računa sumu tih brojeva sve dok suma ne
prekorači vrijednost 100.
sve dok = while
● Pitanja:
− Šta je uslov petlje? suma<=100
− Šta je tijelo petlje? unos broja
dodavanje na sumu
while primjer

● Napisati program koji omogućuje korisniku da unosi


brojeve i računa sumu tih brojeva sve dok suma ne
prekorači vrijednost 100.
#include <stdio.h>
int main() {
int x, suma=0;
while (suma <= 100) {
printf("Unesite broj: ");
scanf("%d", &x);
suma += x;
}
printf("suma je %d", suma);
return 0;
}
do-while petlja

● Za razliku od while petlje koja se može ne izvršiti niti


jednom, do-while se uvijek izvrši barem jednom.
do
tijelo
while (uslov)
● Primjer:

do {
x = x*x;
} while (x<n);
while vs. do-while

● Provjera ispravnosti unosa


GREŠKA!
#include <stdio.h> Promjenljiva nije inicijalizirana
int main() {
int mjesec;
while (mjesec<1 || mjesec>12) {
printf("Unesite mjesec: ");
scanf("%d", &mjesec);
}
if (mjesec == 1) ...
while vs. do-while

● Provjera ispravnosti unosa


#include <stdio.h> Magična vrijednost
int main() {
int mjesec=0;
while (mjesec<1 || mjesec>12) {
printf("Unesite mjesec: ");
scanf("%d", &mjesec);
}
if (mjesec == 1) ...
while vs. do-while

● Provjera ispravnosti unosa


#include <stdio.h>
int main() {
int mjesec;
do {
printf("Unesite mjesec: ");
scanf("%d", &mjesec);
} while (mjesec<1 || mjesec>12);
if (mjesec == 1) ...

You might also like