Professional Documents
Culture Documents
Predavanje5 Novo
Predavanje5 Novo
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; }
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; } 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.
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; }
A 0 0 1 1
B 0 1 0 1
A || B 0 1 1 1
A !A 0 1 1 0
false
true
false
false
true
false
true
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
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)
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);
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);
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
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 blok
Jednostavna
goto
preskok (if)
s logikim izrazom
break
odabir (if..else)
na poetku (while)
continue
Sloena (switch)
na kraju (do..while)
return