You are on page 1of 65

Iteracije (petlje) Sloeni logiki izrazi

Iteracije
ULAZ: Prirodni brojevi A i B IZLAZ: Najvea zajednika mjera (djelitelj) brojeva A i B

Iteracije
ULAZ: Prirodni brojevi A IZLAZ: Rastav broja A na proste faktore Euklidov algoritam: Prvo je potrebno odrediti koji je od dvaju uneenih brojeva vei i ulaz preurediti tako da bude A>B Nakon toga se rauna A%B Ako je A%B = 0, onda je B najvea zajednika mjera U suprotnom se u A upisuje vrijednost varijable B, a u B vrijednost A%B i postupak se ponavlja.
A
5 3

3 2

pom

Iteracije
ULAZ: Prirodni brojevi A IZLAZ: Rastav broja A na proste faktore 1. 2. 3. 4. 5. 6. 7. Uitaj A i B Ako je A<B promjeni A i B Sve dok je (A%B != 0) radi pom = A%B A=B B = pom Ispii B

Iteracije
#include <iostream> using namespace std; int main () { Uitaj A i B Ako je A<B promjeni A i B Sve dok je (A%B != 0) radi pom = A%B A=B B = pom Ispii B return 0; }

Iteracije
#include <iostream> using namespace std; int main () { unsigned int A, B, pom; cout << "Upisite A i B: "; cin >> A >> B; if (A < B) { pom = A; A = B; B = pom; } 3. Sve dok je (A%B != 0) radi pom = A%B; A = B; B = pom; cout << "M = " << B; return 0; }

Kako ovo? Ovo je petlja bez brojaa!

Iteracije
#include <iostream> using namespace std; int main () { unsigned int A, B, pom; cout << "Upisite A i B: "; cin >> A >> B; if (A < B) { pom = A; A = B; B = pom; } for (;A%B;) { pom = A%B; A = B; B = pom; } cout << "M = " << B; return 0; }

Iteracija tipa while


U programskom jeziku C++ postoji posebna vrsta iteracije za sluaj kada nije potreban broja iteracija while.
Sintaksa:
while (logicki uvjet) blok naredbi

Iteracija tipa while


Kako radi iteracija tipa while?
Provjerava se logiki uvjet u glavi petlje Ako je ispunjen izvrava se tijelo petlje i vraa na glavu petlje Ako nije ispunjen, prestkae se tijelo petlje i nastavlja se sa sljedeom naredbom iza tijela.

Iteracije
#include <iostream> using namespace std; int main () { unsigned int A, B, pom; cout << "Upisite A i B: "; cin >> A >> B; if (A < B) { pom = A; A = B; B = pom; } for (;A%B;) { pom = A%B; A = B; B = pom; } cout << "M = " << B; return 0; }

Iteracije
#include <iostream> using namespace std; int main () { unsigned int A, B, pom; cout << "Upisite A i B: "; cin >> A >> B; if (A < B) { pom = A; A = B; B = pom; } while (A%B) { pom = A%B; A = B; B = pom; } cout << "M = " << B; return 0; }

Iteracije
ULAZ: Broj N tipa unsigned short
IZLAZ: Ispisati je li N prost broj.

Sjetimo se programa koji smo uradili proli puta...

Iteracije
#include <iostream> #include <cmath> using namespace std; int main () { unsigned short N; bool prost = true; cout << "Upisite N: "; cin >> N; for (unsigned short k = 2; k <= sqrt(N); k++) { if (N%k == 0) { prost = false; } } if (prost) cout << "Broj " << N << " je prost broj."; else cout << "Broj " << N << " nije prost broj."; return 0; }

Iteracije
#include <iostream> #include <cmath> using namespace std; int main () { unsigned short N; bool prost = true; cout << "Upisite N: "; cin >> N; unsigned short k = 2; while (k <= sqrt(N)) { if (N%k == 0) { prost = false; } k++; } if (prost) cout << "Broj " << N << " je prost broj."; else cout << "Broj " << N << " nije prost broj."; return 0; }

Ovo ne treba biti posebna naredba, ve se moe napisati u zadnjoj pojavi varijable k u petlji (pod uvjetom da e se sigurno izvriti).

Iteracije
#include <iostream> #include <cmath> using namespace std; int main () { unsigned short N; bool prost = true; cout << "Upisite N: "; cin >> N; unsigned short k = 2; while (k <= sqrt(N)) { if (N%k++ == 0) { prost = false; } } if (prost) cout << "Broj " << N << " je prost broj."; else cout << "Broj " << N << " nije prost broj."; return 0; }

Iteracije
No rekli smo da se ovaj program moe poboljati tako da stane im varijabla prost poprimi vrijednost false. Dakle, petlja se mora izvravati sve dok je ksqrt(N) i dok je prost = true Za to nam je potreban logiki veznik konjunkcije kojim bismo povezali dva izraza usporeivanja. U programskom jeziku C++ za to se koristi operator &&.

Iteracije
#include <iostream> #include <cmath> using namespace std; int main () { unsigned short N; bool prost = true; cout << "Upisite N: "; cin >> N; unsigned short k = 2; while (k <= sqrt(N) && prost) { if (N%k++ == 0) { prost = false; } } if (prost) cout << "Broj " << N << " je prost broj."; else cout << "Broj " << N << " nije prost broj."; return 0; }

Sloeni logiki izrazi


Sloeni se logiki izrazi tvore od jednostavnijih pomou logikih operatora
Izraz usporeivanja je logiki izraz Ako su A i B logiki izrazi onda je i
(A) logiki izraz !A logiki izraz (logika negacija) A && B logiki izraz (logika konjunkcija) A || B logiki izraz (logika disjunkcija)

Sloeni logiki izrazi


Logiki operatori primaju kao operatore dvije logike vrijednosti i vraaju logiku vrijednost
Negacija izvre loiku vrijednost Disjunkcija je istinita ako je istinit jedan ili drugi argument Konjunkcija je istinita ako je istinit jedan i drugi argument

Sloeni logiki izrazi


A 0 0 1 1 B A && B 0 0 1 0 0 0 1 1

A 0 0 1 1

B 0 1 0 1

A || B 0 1 1 1

A !A 0 1 1 0

Logiki izrazi (nastavak)


Primjeri sloenih logikih izraza
A && (B || !C) !A || (B && C)

Logiki izrazi (nastavak)


Pitanje: Ako je A = 0, B = 1 i C = 3, kolika e biti vrijednost izraza
A>B && B==C || C<4
false false true

false

true

Logiki izrazi (nastavak)


Pitanje: Ako je A = 0, B = 2 i C = 3, kolika e biti vrijednost izraza
A>B && B==C || !C<4
3==true false==0 true true

false

Logiki izrazi (nastavak)


Pitanje: Ako je A = 0, B = 2 i C = 3, kolika e biti vrijednost izraza
A>B && B==C || !(C<4)

false

true

Logiki izrazi (nastavak)


Pitanje: Ako je A = 0, B = 2 i C = 3, kolika e biti vrijednost izraza
A>B && (B==C || C<4)

false

true

Logiki izrazi (nastavak)


Prioritet operatora u logikim izrazima
1. 2. 3. 4. 5. ! <, <=, >=, > ==, != && ||

Iteracije
ULAZ: Svaki se pravokutnik zadaje s dvije toke u ravnini donjim lijevim i gornjim desnim kutom. Pretpostavlja se da su stranice svih pravokutnika paralelne s koordinatnim osima. Potrebno je unositi pravokutnike sve dok se ne unese pravokutnik kojem de donji lijevi kut jednak gornjem desnom. Taj posljednji unos ne ulazi u izraun. IZLAZ: Potrebno je ispisati donji lijevi i gornji desni kut pravokutnika koji je presjek sviju uneenih pravokutnika ili 0 ako je presjek prazan. Program treba odmah stati ako presjek postane prazan.

Iteracije

Iteracije
Ovo je kao problem traenja maksimalne i minimalne vrijednosti, ali u vie dimenzija. Neka su PAx, PAy, PBx, PBy toke koje definiraju donji lijevi i gornji desni kut presjeka. Kada unesemo novi pravokutnik imamo sljedee:
PAx = max{Ax, PAx}, PAy = max{Ay, PAy} PBx = min{Bx, PBx}, PBy = min{By, PBy}

Iteracije
Koji su uvjeti zaustavljanja?
1. Kada je Ax = Bx i Ay = By 2. Ako u nekom trenutku postane PAx > PBx ili PAy > PBy

to ako je PAx = PBx ili PAy = PBy?

Iteracije
Koji su uvjeti da pravokutnik bude dobro uneen? Mora biti Ax < Bx i Ay < By

Iteracije
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Unesi PAx, PAy, PBx, PBy Sve dok pravokutnik nije dobro uneen idi na 1 Radi Unesi Ax, Ay, Bx, By Ako je pravokutnik krivo uneen idi na 4 Ako nije (Ax = Bx) i (Ay = By) radi Ako je Ax > PAx onda PAx = Ax Ako je Ay > PAy onda PAy = Ay Ako je Bx < PBx onda PBx = Bx Ako je By < PBy onda PBy = By inae zavri Sve dok je (PAx <= PBx) i (PAy <= PBy)

Iteracije
13. Ako je PAx <= PBx i PAy <= PBy 14. Ispii PAx, PAy, PBx, PBy 15. inae 16. Ispii 0

Iteracije
#include <iostream> using namespace std; int main () { Unesi PAx, PAy, PBx, PBy Sve dok pravokutnik nije dobro uneen idi na 1 Radi Unesi Ax, Ay, Bx, By Ako je pravokutnik krivo uneen idi na 4 Ako nije (Ax = Bx) i (Ay = By) radi Ako je Ax > PAx onda PAx = Ax Ako je Ay > PAy onda PAy = Ay Ako je Bx < PBx onda PBx = Bx Ako je By < PBy onda PBy = By inae zavri Sve dok je (PAx <= PBx) i (PAy <= PBy)

Iteracije
13. 14. 15. 16. } Ako je PAx <= PBx i PAy <= PBy Ispii PAx, PAy, PBx, PBy inae Ispii 0 return 0;

Iteracije
#include <iostream> using namespace std; int main () { float Ax, Bx, Ay, By, PAx, PAy, PBx, PBy; cout << "Upisite Ax Ay Bx By: "; cin >> PAx >> PAy >> PBx >> PBy; 2. Sve dok pravokutnik nije dobro uneen idi na 1 3. Radi cout << "Upisite Ax Ay Bx By: "; cin >> Ax >> Ay >> Bx >> By; 5. Ako je pravokutnik krivo uneen idi na 4 if (!(Ax == Bx && Ay == By)) { if (Ax > PAx) PAx = Ax; if (Ay > PAy) PAy = Ay; if (Bx < PBx) PBx = Ax; if (By < PBy) PBy = By; else break; 12. Sve dok je (PAx <= PBx) i (PAy <= PBy)

Iteracije
if (PAx <= PBx && PAy <= PBy) cout << "P = ((" << PAx << "," << PAy << "),(" << PBx << "," << PBy << "))"; else cout << "P = 0"; return 0; }

Iteracije
#include <iostream> using namespace std; int main () { float Ax, Bx, Ay, By, PAx, PAy, PBx, PBy; cout << "Upisite Ax Ay Bx By: "; cin >> PAx >> PAy >> PBx >> PBy; 2. Sve dok pravokutnik nije dobro uneen idi na 1 3. Radi cout << "Upisite Ax Ay Bx By: "; cin >> Ax >> Ay >> Bx >> By; 5. Ako je pravokutnik krivo uneen idi na 4 if (!(Ax == Bx && Ay == By)) { if (Ax > PAx) PAx = Ax; if (Ay > PAy) PAy = Ay; if (Bx < PBx) PBx = Ax; if (By < PBy) PBy = By; else break; 12. Sve dok je (PAx <= PBx) i (PAy <= PBy)

Ovo je kao while petlja ali je okrenuta naopako!

Itereracija tipa do..while


Za sluaj kada uvjet provjeravamo na kraju postoji do..while petlja Sintaksa: do..while je
do blok naredbi while (logicki uvjet);
jedina iteracija iza ijeg kraja ide znak ";"

Iteracije
#include <iostream> using namespace std; int main () { float Ax, Bx, Ay, By, PAx, PAy, PBx, PBy; cout << "Upisite Ax Ay Bx By: "; cin >> PAx >> PAy >> PBx >> PBy; 2. Sve dok pravokutnik nije dobro uneen idi na 1 do { cout << "Upisite Ax Ay Bx By: "; cin >> Ax >> Ay >> Bx >> By; 5. Ako je pravokutnik krivo uneen idi na 4 if (!(Ax == Bx && Ay == By)) { if (Ax > PAx) PAx = Ax; if (Ay > PAy) PAy = Ay; if (Bx < PBx) PBx = Ax; if (By < PBy) PBy = By; else break; } while (PAx <= PBx && PAy <= PBy);

Ovo se takoer moe rijeiti pomou do..while petlje

Iteracije
#include <iostream> using namespace std; int main () { float Ax, Bx, Ay, By, PAx, PAy, PBx, PBy; do { cout << "Upisite Ax Ay Bx By: "; cin >> PAx >> PAy >> PBx >> PBy; } while (PAx > PBx || PAy > PBy); do { do { cout << "Upisite Ax Ay Bx By: "; cin >> Ax >> Ay >> Bx >> By; } while (Ax > Bx || Ay > By); if (!(Ax == Bx && Ay == By)) { if (Ax > PAx) PAx = Ax; if (Ay > PAy) PAy = Ay; if (Bx < PBx) PBx = Ax; if (By < PBy) PBy = By; else break; } while (PAx <= PBx && PAy <= PBy);

Iteracije
Koja je razlika u izvoenju while i do..while petlje? Tijelo while petlje se ne mora izvesti ni jednom, dok se tijelo do..while petlje uvijek izvodi barem jednom.

Iteracije
Trebamo se rijeiti jo i break naredbe. Moemo uvjet koji treba biti zadovoljen da bi se break naredba izvela uvesti u uvjet petlje! Petlju treba zaustaviti ako uvjet ispred break naredbe nije ispunjen!

Iteracije
#include <iostream> using namespace std; int main () { float Ax, Bx, Ay, By, PAx, PAy, PBx, PBy; do { cout << "Upisite Ax Ay Bx By: "; cin >> PAx >> PAy >> PBx >> PBy; } while (PAx > PBx || PAy > PBy); do { do { cout << "Upisite Ax Ay Bx By: "; cin >> Ax >> Ay >> Bx >> By; } while (Ax > Bx || Ay > By); if (!(Ax == Bx && Ay == By)) { if (Ax > PAx) PAx = Ax; if (Ay > PAy) PAy = Ay; if (Bx < PBx) PBx = Ax; if (By < PBy) PBy = By; } while (PAx <= PBx && PAy <= PBy || Ax == Bx && Ay == By);

Ovaj se uvjet moe pojednostavniti!

Iteracije
Sjetimo se iz matematike:
de Morganovi zakoni:
!(A && B) !A || !B !(A || B) !A && !B

Distributivnost
A && (B || C) A && B || A && C A || B && C (A || B) && (A || C)

Dvostruka negacija
!!A A

Iteracije
#include <iostream> using namespace std; int main () { float Ax, Bx, Ay, By, PAx, PAy, PBx, PBy; do { cout << "Upisite Ax Ay Bx By: "; cin >> PAx >> PAy >> PBx >> PBy; } while (PAx > PBx || PAy > PBy); do { do { cout << "Upisite Ax Ay Bx By: "; cin >> Ax >> Ay >> Bx >> By; } while (Ax > Bx || Ay > By); if (!(Ax == Bx && Ay == By)) { if (Ax > PAx) PAx = Ax; if (Ay > PAy) PAy = Ay; if (Bx < PBx) PBx = Ax; if (By < PBy) PBy = By; } while (PAx <= PBx && PAy <= PBy || Ax == Bx && Ay == By);

Iteracije
#include <iostream> using namespace std; int main () { float Ax, Bx, Ay, By, PAx, PAy, PBx, PBy; do { cout << "Upisite Ax Ay Bx By: "; cin >> PAx >> PAy >> PBx >> PBy; } while (PAx > PBx || PAy > PBy); do { do { cout << "Upisite Ax Ay Bx By: "; cin >> Ax >> Ay >> Bx >> By; } while (Ax > Bx || Ay > By); if (!(Ax == Bx) || !(Ay == By)) { if (Ax > PAx) PAx = Ax; if (Ay > PAy) PAy = Ay; if (Bx < PBx) PBx = Ax; if (By < PBy) PBy = By; } while (PAx <= PBx && PAy <= PBy || Ax == Bx && Ay == By);

Iteracije
#include <iostream> using namespace std; int main () { float Ax, Bx, Ay, By, PAx, PAy, PBx, PBy; do { cout << "Upiite Ax Ay Bx By: "; cin >> PAx >> PAy >> PBx >> PBy; } while (PAx > PBx || PAy > PBy); do { do { cout << "Upisite Ax Ay Bx By: "; cin >> Ax >> Ay >> Bx >> By; } while (Ax > Bx || Ay > By); if (Ax != Bx || Ay != By) { if (Ax > PAx) PAx = Ax; if (Ay > PAy) PAy = Ay; if (Bx < PBx) PBx = Ax; if (By < PBy) PBy = By; } while (PAx <= PBx && PAy <= PBy || Ax == Bx && Ay == By);

Iteracije
ULAZ: Decimalni broj D i prirodni broj N IZLAZ: N D

Napomena: Zabranjeno koristiti cmath biblioteku.

Iteracije
ULAZ: Decimalni broj D>1 i prirodni broj N IZLAZ: N D Ako je x N D , onda je D = xN. Za svaki D>1 N D mora biti izmeu 1 i D. Postavimo A = 1, B = D i rauamo
AB x 2

Iteracije
ULAZ: Decimalni broj D>1 i prirodni broj N IZLAZ: N D Ako je xN>D, onda smo premaili korijen i stavljamo B = x i ponavljamo postupak Ako je xN<D, onda smo x premalen i stavljamo A = x i ponavljamo postupak Ako je xN = D, onda smo pogodili korijen i zavravamo.

Iteracije
ULAZ: Decimalni broj D>1 i prirodni broj N IZLAZ: N D Problem je to za neke brojeve, kao to su recimo D = N = 2 zasigurno nikada neemo doi do tone vrijednosti korijena Stoga je potrebno definirati koliko "blizu" korijena elimo stati. Taj se broj zove pogreka i oznauje se s . Kada postane B-A, moemo biti sigurni da nismo udaljeni od korijena za vie od .

Iteracije
1. 2. 3. 4. 5. 6. 7. 8. 9. Uitaj D i N A = 1, B = D Radi x = (A + B) / 2 Izraunaj xN Ako je xN < D A = x inae B = x Sve dok (xN != D && B A > EPSILON) Ispii x

Iteracije
1. Uitaj D i N 2. A = 1, B = D 3. Radi 4. x = (A + B) / 2 5. Y=1 6. Za (I=1..N) Y = Y*x 7. Ako je xN < D A = x 8. inae B = x 9. Sve dok (Y != D && B A > EPSILON) 10. Ispii x

Iteracije
Radit emo s podatkom tipa float. Iako on ima tonost na 7 decimala, ispisivat emo ih 5. Stoga emo pretpostaviti da je uvijek = 10-6.

Iteracije
#include <iostream> using namespace std; int main () { Uitaj D i N A = 1, B = D Radi x = (A + B) / 2 Y=1 Za (I=1..N) Y = Y*x Ako je xN < D A = x inae B = x Sve dok (Y != D && B A > EPSILON) Ispii x return 0; }

Iteracije
#include <iostream> using namespace std; int main () { int N; float D, epsilon do { cout << "Upisi cin >> N; } while (N<1); do { cout << "Upisi cin >> D; } while (D<1); float A = 1, B =

=1E-6, x, y;

N: ";

D: ";

D;

Iteracije
do { x = (A + B) / 2; y = 1; for (int i = 1; i <= N; i++) y *= x; if (y < D) A = x; else B = x; } while (y != D && B-A > epsilon); cout << "Rjesenje je " << x << endl; system("pause"); return 0; }

Iteracije
epsilon je definiran kao varijabla. Varijabla oduzima memorijski prostor S druge strane, epsilon se ne mijenja Moemo je definirati kao konstantu. U tom sluaju moemo epsilon definirati kao konstantu Tad neemo moi mijenjati vrijednost, ali neemo trebati ni memorijski prostor za nju.

Iteracije
#include <iostream> using namespace std; int main () { int N; float D, epsilon do { cout << "Upisi cin >> N; } while (N<1); do { cout << "Upisi cin >> D; } while (D<1); float A = 1, B =

=1E-6, x, y;

N: ";

D: ";

D;

Iteracije
#include <iostream> using namespace std; int main () { int N; float D, x, y; const float epsilon=1E-6; do { cout << "Upisi N: "; cin >> N; } while (N<1); do { cout << "Upisi D: "; cin >> D; } while (D<1); float A = 1, B = D;

Iteracije
epsilon je definiran kao varijabla.
No, konstante ni ne trebamo prosljeivati prevoditelju. To moemo rijeiti i u preprocesiranju.

Iteracije
#include <iostream> using namespace std; int main () { int N; float D, x, y; const float epsilon=1E-6; do { cout << "Upisi N: "; cin >> N; } while (N<1); do { cout << "Upisi D: "; cin >> D; } while (D<1); float A = 1, B = D;

Iteracije
#include <iostream> #define epsilon 1E-6 using namespace std; int main () { int N; float D, x, y; do { cout << "Upisi N: "; cin >> N; } while (N<1); do { cout << "Upisi D: "; cin >> D; } while (D<1); float A = 1, B = D;

Programski konstrukti - rezime


Programski konstrukti Sekvencija Selekcija Iteracija Skokovi

Programski blok

Jednostavna

s eksplicitnim brojaem (for)

goto

preskok (if)

s logikim izrazom

break

odabir (if..else)

na poetku (while)

continue

Sloena (switch)

na kraju (do..while)

return

You might also like