Pregled iskaza u C-u Izraz; Iskaz dodele, serijski komponovani iskaz; blok Uslovni iskazi i izrazi; složeno grananje Iterativni iskazi
Iskaz dodele Promena vrednosti a = Ψ; Izračunava vrednost izraza Ψ, transformiše je u tip promenljive a i dodeljuje je promenljivoj a. S leve strane iskaza dodele mora biti promenljiva (adresa).
Iskaz dodele: preduslov, postuslov Primer: {i>0, j>1} i = j+1 {i>2} Najslabiji preduslov: {j>1} jer (i=j+1)>2 implicira {j>1}, tj. {j>1} i = j+1 {i>2}
Serijski komponovani iskaz Iskazi se dopisuju jedan na drugi: {iskaz1; iskaz2; iskaz3; } BLOK: može da sadrži i deklaracije, tj. oblika je { lista deklaracja lista iskaza }
Serijski komponovani iskaz: preduslov, postuslov Q 0 {iskaz1; iskaz2; iskaz3; } Q 3 ako Q 0 iskaz1; Q 1 Q 1 iskaz2; Q 2 Q 2 iskaz3; Q 3
Primeri iskaza dodele Swap (razmena) int x=5, y=10; {x=5 && y=10} x = x + y; {x=15 && y=10} {x=15 && y=10} y = x - y; {x=15 && y=5} {x=15 && y=5} x = x - y; {x=10 && y=5}
Uslovni iskaz nepotpuni oblik if( uslov ) iskaz potpuni oblik if( uslov ) iskaz else iskaz Kombinacije: potpuni, nepotpuni oblik
Primer Minimum dva broja int x, y, min; if( x < y ) { min = x; } else { min = y; } Skraćeno: min = ( x < y )? x : y
Složeno grananje: switch Ako x uzima više vrednosti, onda se može koristiti switch-iskaz, npr. switch (x){ case 0: printf("nula"); break; case 1: printf("jedan"); break; case 2: printf("dva"); break;... case 9: printf("devet"); break; default: printf("greska"); } Uloga iskaza break! Ako x = 0, bez break: nulajedandva...
Iteracija (ponavljanje) - petlja, ciklus Tri moguća oblika za izražavanje ponovljenog izračunavanja su: petlja za (ključna reč for) brojački ciklus petlja sve dok - radi (while) ciklus sa predproverom uslova petlja radi - dok je (do-while) ciklus sa postproverom uslova
Petlja for Sintaksa: for(inicijalizacija; uslov; korak){ lista iskaza } Značenje: izvršava se inicijalizacija (izraz), (ispitivanje uslova, lista iskaza, korak) (ispitivanje uslova, lista iskaza, korak)...
Primer Zbir prvih n prirodnih brojeva: s = 0; for(i = 1; i <= n; i++ ) s = s + i; for( s = 0, i = 1; i <= n; i++ ) s = s + i; for( s = 0, i = 1; i <= n; s = s + i, i++ );
Petlja while Sintaksa Značenje while( uslov ) { lista iskaza } Ispitati da li je uslov pre nego što se izvrši lista iskaza. Ako je uslov ispunjen, izvršiti listu iskaza. Inače, završiti sa izvršavanjem. Lista iskaza se ne mora izvršiti nijednom.
Primeri Množenje uzastopnim dodavanjem {x,y N U {0}} {z = x*y} { z=0; u=x; while (u>0) { z=z+y; u=u-1; } }
Petlja do - while Sintaksa do { Značenje lista iskaza } while( uslov ); Ispitati da li važi uslov pošto se izvrši lista iskaza. Lista iskaza se izvršava bar jednom!
Petlja do while- primeri 1. Euklidov algoritam: nzd(a,b), npr. nzd(14,5) 14 / 5 = 2 (4) 5 / 4 = 1 (1) 4 / 1 = 4 (0) nzd(14,5)=1
Petlja do while- Euklidov algoritam { int a, b, prvi, drugi, ost; prvi=a; drugi=b; if (prvi < drugi) swap(prvi, drugi); do { ost = prvi%drugi; prvi = drugi; drugi = ost; } while (ost!=0); /* prvi = nzd(a,b) */ }
Petlja do while- Euklidov algoritam 1. nzd(a,b) = nzd(b,a) 2. nzd(a,b) = b b a 3. nzd(a,b) = nzd(prvi, drugi) sledi iz: 4. nzd(prvi, drugi) = nzd(drugi, ost)
Odnos while i do-while while (p) S; if(p) do S while(p); do { S1; S2; Sk;} while(p) { t=1; while (t p) {S1; S2; Sk; t=0;}
Prekidanje iteracije continue break odnosi se na najbližu petlju, a izaziva prelaz na sledeći korak odnosi se na najbližu petlju ili grananje, a izaziva prekid petlje ili grananja
Bezuslovno grananje Sintaksa goto etiketa;... etiketa: iskaz; Prenos izračunavanja na tačku programa obeleženu etiketom. Etiketa mora biti unutar funkcije u kojoj je definisana. Nema skoka iz jedne funkcije u drugu.
Iteracija i rekurentne formule Iterativni programi omogućavaju da se implementiraju veze zadate rekurentnim formulama. Primer. Fibonačijev niz je definisan sa: f 0 = f 1 = 1 f n = f n-1 + f n-2 ili niz: 1, 1, 2, 3, 5, 8, 13, 21,...
Prvih 20 u Fibonačijevom nizu int main(void) { int i,ppret,pret,sled; } ppret = 1; pret = 1; for (i = 1; i <= 20; i++) { } Rezultat: sled = ppret + pret; printf("%d ",sled); ppret = pret; pret = sled; return 0; // inicijalizacija // sledecičlan // reinicijalizacija 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711
Invarijanta petlje Neko svojstvo koje je tačno prilikom svakog prolaska kroz petlju: invarijanta petlje koristi u dokazivanju korektnosti petlje i celog programa.
Primer invarijante U Euklidovom algoritmu, sledeće svojstvo je tačno prilikom svakog prolaska kroz petlju: P: nzd(a,b) = nzd(prvi, drugi) Da bi se ovo dokazalo, mora se pokazati: (a) da je P tačno pri prvom ulasku u petlju (b) Ako je P tačno u jednom prolazu, onda je tačno i u sledećem.
Primer invarijante U programu za Fibonačijev niz, sledeće svojstvo je tačno prilikom svakog prolaska kroz petlju: P(i): ppret = f i-1, pret = f i