principi programiranja cas 2
DESCRIPTION
principi, algoritmi, predavanjeTRANSCRIPT
Principi programiranja
Čas IITip podataka floatOsnovno o algoritmima
FLOAT
Realni brojevi u pokretnom zarezu (nazivaju se float ili real) zauzimaju 4 ili 8 bajtova memorije računara (za nas
manje bitno). Primjer kod 4-bajtnog (32-bitnog) zapisa:
prvi bit je predznak 0 pozitivan broj 1 negativan
23 bita za zapis osnovice realnog broja 8 bita za zapis eksponenta
npr. – 234 106
Domen i operacije kod float-a
Iz datog načina zapisa slijede i ograničenja u pogledu najmanjeg i najvećeg broja koji se može zapisati pomoću floata kao i preciznosti koju float može da tretira (očigledno broj ne može da se zapiše “beskonačno” precizno).
A=B+C gdje su A, B i C float-i se obavlja na isti način kao što je bilo opisano za cijele brojeve, ali sa tom razlikom što se za privremene promjenljive u registrima ostavlja prostor i tumače na način pogodan za float.
Domen i operacije kod float-a
A=B+C gdje su A i C float, a B cijeli broj se obavlja na sljedeći način: kompajler vidi da se sabiraju različiti tipovi podataka,
uočava se da je za smještaj float-a potrebno više prostora;
za operande operacije sabiranja u registrima procesora se zauzme prostor kao da je u pitanju sabiranje float-a;
to znači da se prilikom presipanja B iz memorije u registre B konvertuje u float;
ovo se naziva implicitnom konverzijom; zatim se operacija obavi kao za float; opisana operacija nema efekta na promjenljivu B u
memoriji već samo na privremenu promjenljivu (kojoj se ne može pristupiti iz programa) u registrima.
Domen i operacije kod float-a
A=B+C gdje su B i C float-i, a A cijeli broj: obavlja se operacija kao kod floata i rezultat
(privremena promjenljiva) smjesti u registre procesora kao float;
sada rezultat treba “presuti” iz registara procesora u memorijsku lokaciju za promjenljivu A;
kako je A cijeli broj dolazi do odsjecanja necjelobrojnog dijela.
Npr. A=2.3+4.1 rezultuje u ovom slučaju u A=6. A=B+C gdje su B i C cijeli, a A float:
Operacija se obavi kao za cijele a zatim dobijeni rezultat prebaci u promjenljivu koja je float.
Domen i operacije kod float-a
Npr. A=B/C gdje su B i C cijeli brojevi B=4 i C=3 daje A=1 bez obzira da li je u pitanju float ili cijeli broj.
Isto to daje operacija na konstantama: A=4/3. Operacija A=4.0/3.0 daje: A=1.333....338 ako
je A floatdecimalni zarez u programiranju 12 trojki i 13.-ta osmica ako je float sa 4 bajta
memorije (slično i kod 8-bajtog zapisa float-a)
Zbog ograničenja u memoriji operacije sa floatima daju grešku koja je kod 4-bajtnog zapisa reda veličine 1 10-13 po operaciji. Za mali broj operacija greška je relativno mala a recimo za 1 1012 operacija greška je reda veličine broj_operacija x greška_za_operaciju=1 10 -1 odnosno ne može se uzeti kao pouzdana čak ni na prvu decimalu.
Operacije kod floata i zapis konstanti
Float se može primjenljivati u svim relacijama poređenja sa pravilima kao u matematici.
Dozvoljeni zapisi konstanti tipa float su: 1, -134, 23 kao cijeli broj ali ako ce cijeli broj
pridružuje floatu A=-134; 1.0, 2.34, -0.35, .34 čak i za cijeli broj se može
koristiti tačka da bi naglasila da je u pitanju float ako je to potrebno; ako broj počne sa . to podrazumjeva da je nula ispred;
1e6, 1e-12 3.456e-3 ovo je tzv. eksponencijalni zapis gdje eb označava 10b; tako je 3.456 10-3 .
Implicitna i eksplicitna konverzija
Ako promjenljive različitih tipova podataka učestvuju u operacijama i računar jednu promjenljivu prebaci u viši tip podatka (tip podatka koji zauzima veću memoriju u registru) da bi izvršio odgovarajuću operaciju nad usklađenim operandima to se naziva implicitnom konverzijom.
Korisnik može da izvrši eksplicitnu konverziju (ovo se preporučuje) kojom se podešava u kakvom će se obliku pojaviti promjenljive u pojedinim operacijama. Npr. INT2FLOAT(I)+B i FLOAT2INT(F)+A
konvertuj cijeli broj u float konvertuj float u cijeli broj
Napomena!!!
Neki programski jezici će odraditi operaciju A=B/C ako je A float kao da je operacija sa float-ima bez obzira što je na lijevoj strani.
Ovo obično rade matematički paket (npr. MATLAB i MATHEMATICA) koji su namjenjeni za matematička izračunavanja, a ne klasični viši programski jezici.
Mi ćemo ovu problematiku tretirati kao kod viših programskih jezika.
Algoritamski koraci
Mi ćemo podrazumjevati sljedeće algoritamske korake: Alokaciju promjenljivih (zauzimanje memorijskog prostora za
promjenljive); Unos podataka; Sekvencu; Selekciju; Ciklus; Izlaz podataka; Smatraćemo da se dealokacija (brisanje promjenljivih) obavlja
automatski od strane kompajlera); Program može da ima izostavljen neki od predmetnih koraka
ili više pojedinih koraka; Program može pozivati potprograme; Program ima početak i kraj.
Početak i kraj
Oznake
Start
End
Pseudo kod
Svaki algoritamski korak ćemo predstavljati grafičkom oznakom i pseudo kodom koji je različit od bilo kog programskog jezika, a opet veoma sličan kodu tzv. paskaloidnih jezika u koje spadaju svi jezici koji se uče na VRŠ.
Početak programa nećemo predstavljati pseudo kodom, dok će oznaka za kraj biti END.
Alokacija promjenljivih
Oznaka
A: FLOATB: INTEGERC: CHARD: LOGICAL
Strelica stiže od starta programa
Dozvoljeni naziv promjenljive praćen dvotačkomi nazivom tipa te promjenljive.Ovaj se korak mora obaviti prije bilo koje druge naredbe. U okviru pseudo koda se može navesti na isti način kao ovdje bez isprekidanih linija okolo.
UNOS I IZLAZ U PROGRAM
Korisnik ili na neki drugi način moraju biti zadate vrijednosti promjenljivih nad kojima se vrše operacije. Ovaj dio se naziva unos podataka . Rezultat programa se prikazuje ili na neki pogodan način koristi. Taj dio se naziva izlazom podataka.
Oznake
N,A Ulaz
X1,C Izlaz
Pseudokod
Input N,A
Output X1,C
SEKVENCA
Oznaka Pseudo kod
X=2X=2 Pojedinačna naredba
X=A+B
Y=X*X
Z=Y-2
Niz naredbi. Strelice ukazuju na redosljed izvršavanja. Ako se izostave podrazumjeva se odozgo na dolje u programu.
X=A+B
Y=X*X
Z=Y-2
Selekcija
Oznaka
X>0
Y=X
Da
NeTumačenjeAko je X veće od nule postavi vrijednost Y na vrijednost X. Ako nije ne čini ništa.
Pseudo kod
IF(X>0)
Y=X
ENDIF
Selekcija – Apsolutna vrijednost
Primjer računanja apsolutne vrijednosti broja. Apsolutna vrijednost (oznaka |X|) je jednaka samom broju X ako je veći ili jednak od nule, a –X ako je manji od nule.
Matematički se ovo može označiti kao:
, ako je 0,| |
, u ostalim slucajevima.
X XX
X
Selekcija - Primjer
START
X:FLOATY:FLOAT
X0
Y=X
X
Y=-X
Y
END
DA
NE
Pseudo kod
X:FLOATY:FLOATINPUT XIF X0Y=XELSEY= - XENDIFOUTPUT YEND
Složena selekcija
2 4
2 4
4 0 ili 1
drugdje
X X
X XY
X X
X
Složena selekcija - primjer
Dat je samo dio gdje je prikazana selekcija ostalo dodajte sami za vježbu.
X>4
2<X4
X0X1
Bolje je zapisati kao X>2X4 a čakje dovoljno i X>2 (zašto?)
Šestougaona oznaka se može koristiti zasloženije uslove umjesto romba.
DA
NE
NEDA
DANE
Y=X2
Y=X
Y=4
Y=-X
Složena selekcija – Kompaktniji zapis
X
Y=X2 Y=X
X>4 2<X4
X0X1ostalo
Y=4 Y=-X
PSEUDO KOD
IF X>4Y=X*XELSEIF X>2Y=XELSEIF X0X1Y=4ELSEY=-XENDIFod studenata će se tražiti manje kompaktan
zapis (pogledajte prethodni slajd)
Ciklus
Ciklus ili petlja je dio algoritma koji se ponavlja više puta. Postoje: ciklusi koji se ponavljaju tačno određen broj puta; ciklusi koji se ponavljaju dok je zadovoljen logički uslov.
Pošto je drugi tip nešto opštiji samo će on biti izučavan.
OznakaWHILE USLOV=T
naredbe ***DA
NE
PseudokodWHILE USLOV=TNEKE NAREDBEENDWHILE
Ciklus - Primjer
Izvršiti sumiranje brojeva od 1 do N.
START
N:INTEGERS:INTEGERI:INTEGER
S
END
DANE
N
S=0inicijalizacija; mi ne znamo koji su podaci stajali na memorijskoj lokaciji koja je dodjeljena promjenljivoj S i moramo postaviti S na 0 u ovom slučaju da bi sumiranje vršili od 0
I=0
WHILE I<N
I=I+1
S=S+I
Ciklus – Primjer – Pseudo kod
I: INTEGERS:INTEGERN:INTEGERINPUT NS=0I=0WHILE I<NI=I+1S=S+IENDWHILEOUTPUT SEND
Algoritam se mora testirati!Testiranje se obavlja tako što se pretpostavi neka (ili nekoliko) karakterističnih vrijednosti ulaza (npr. N=5) i provjeri da li će rezultat na kraju biti ispravan.
Za domaći napraviti program koji nalazi proizvod N prvih prirodnih brojeva: 1 2 3... N=N! (čita se N faktorijel). Zapamtite 0!=1.
Ciklus - Primjer
Prethodni primjer je bio primjer ciklusa koji se izvršava tačno određen broj puta. Sljedeći primjer je ciklus koji se izvršava dok je zadovoljen uslov.
Izvršiti sumiranje prirodnih brojeva koje korisnik zadaje do trenutka kada se unese negativan broj ili nula. Negativan broj ili nulu ne treba sabirati i čim se pojavi neka takva vrijednost treba prekinuti dalje izvršavanje.
Ciklus – Primjer
START
S:INTEGERI:INTEGER
S
END
DA
I
S=0
WHILE I>0
S=S+I
Za vježbu ili domaći napišite pseudo kod za ovaj algoritam.
NE
Selekcije i ciklusi- Napomene
Unutar jednog ciklusa (selekcije) može se nalaziti drugi ciklus (selekcija).
Unutrašnja selekcija se mora zatvoriti istovremeno ili prije spoljašnje. Ne smije nikada da se zatvara kasnije (ciklusi odnosno selekcije se ne mogu sjeći).
Može se matematički dokazati da se svaki algoritamski rješiv problem može riješiti korišćenjem jedne sekvence, jednog ciklusa i jedne selekcije.
Naravno unutar svakog od djelova mogu opet postojati ugnježdeni drugi elementi.
dokazali Bohm i Jacopini 1966-te godine
Algoritam 1/10
Odrediti veći od dva unesena cijela broja.
Deset jednostavnih algoritama
START
A:INTEGERB:INTEGER
END
A,B
A>B
B A
DANE
PSEUDOKODA:INTEGERB:INTEGERINPUT A,BIF A>BOUTPUT AELSEOUTPUT BENDIFEND
Na osnovu ovog programa napisati algoritam i pseudo kod za određivanje manjeg od dva cijela broja kao i za algoritam koji štampa kakav je odnos brojeva. Npr. A je jednako B ili A je veće od B.
Algoritam 2/10
Napisati program koji računa stepen broja: Y=XN. N je prirodan broj.
Uočiti da važi: X0=1 dalje XN=X*XN-1.
Deset jednostavnih algoritama
START
X:FLOATY:FLOAT
N:INTEGER
END
X,N
Y=1
WHILE N>0
Y=Y*X
N=N-1
DA
Y
PSEUDO KODX:FLOATY:FLOATN:INTEGERINPUT X,NY=1WHILE N>0Y=Y*X
N=N-1ENDWHILEOUTPUT YEND
Algoritam 2/10
Probajte za domaći da realizujete program koji određuje stepen XN, gdje je N član skupa cijelih brojeva.
Pomoć. Ako je N0 algoritam ostaje isti kao u prethodnom slučaju. Za N<0 može se koristiti činjenica da je X-N=1/XN pa se nakon učitavanja promjenljivih uzme X=1/X i N=-N i ponovi procedura za prirodne brojeve. U drugom slučaju treba izbjeći mogućnost da je X=0.
Deset jednostavnih algoritama
Algoritam 3/10
Odrediti ostatak pri dijeljenju dva prirodna broja.
Uzmimo primjer: Pri dijeljenju 9 sa 4 ostatak je 1 jer je 2x4+1=9. Olakšavajuća okolnost je to što računar kada dijeli cijele brojeve daje cijeli broj ako korisnik ne zatraži konverziju podataka.
Deset jednostavnih algoritama
START
N,M:INTEGERP,O:INTEGER
M,N
P=M/N
O=M-P*N
O
END
PSEUDO KODN,M,P,O:INTEGERINPUT M,NP=M/N O=M-P*N
OUTPUT OEND
Algoritam 3/10
Za vježbu sami napišite program koji u slučaju da su uneseni brojevi manji od nule štampa obavještenje da ne može da odredi ostatak dijeljenja.
Takođe pokušajte da razmislite o varijanti da vam ostatak dijeljenja sa negativnim brojem zaista treba. Kako biste modifikovali algoritam?
Deset jednostavnih algoritama
Algoritam 4/10
Unesen je prirodan broj. Odrediti sumu njegovih cifara.
Posmatrajmo broj 324. Suma njegovih cifara je 3+2+4=9. Najjednostavniji način da se ovo odredi je da se kreira jedna promjenljiva koja će da čuva podatke o sumi cifara broja i da se inicijalizuje na nulu (S=0). Zatim se odredi ostatak dijeljenja broja sa 10 (to je broj 4, S=4) i podjeli broj sa 10 (dobija se rezulatat 32). 32 se zatim podjeli sa 10 (dobija se 3) i ostatak je 2 koje se pridoda 4 iz prethodnog slučaja (S=6). Dobijeno 3 se podijeli sa 10 rezultat je nula i ostatak 3 se pridoda dosadašnjoj sumi (S=9). Kada se dobije rezultat 0 može se obustaviti dalja procedura.
Deset jednostavnih algoritama
Algoritam 4/10Deset jednostavnih algoritama
START
N:INTEGERS:INTEGER
END
N
S=0
WHILE N>0
S=S+N-(N/10)*10
DAS
N=N/10
NE
!!!!!!Obratite pažnju na ovaj korak!!!
PSEUDO KODN,S;INTEGERINPUT NS=0WHILE N>0
S=S+N-(N/10)*10N=N/10ENDWHILEOUTPUT SEND
Algoritam 4/10
Za vježbu modifikovati predmetni algoritam da pronalazi sumu cifara i negativnih brojeva.
Moguća modifikacija na početku algoritma:
Deset jednostavnih algoritama
N<0
N=-N
DA NE
Algoritam 5/10
Procesori obično barataju sa 4 osnovne matematičke radnje i sve ostale nastoje da svedu na osnovne matematičke operacije.
Za računanje funkcije f(x) se koristi razvoj u Taylor-ov red:
f(x)=f(0)+f’(0)x+f”(0)x2/2!+f”’(0)x3/3!+...+f(n)(0)xn/n!+...
Deset jednostavnih algoritama
vrijednost funkcije f(x) u tački x=0 izvodi funkcije f(x) u tački x=0
faktorijel n!=1·2 ·3·... ·nračunanje se prekida kada član f(n)(0)xn/n! postane manji od neke zadate vrijednosti
Algoritam 5/10
Odrediti vrijednost ex=exp(x), za zadato x, sumirajući Taylor-ov red dok ne dobijemo član manji po apsolutnoj vrijednosti od 0.0001.
e se naziva Ojlerovim brojem koji približno iznosi e2.7182818... .
Svi izvodi funkcije exp(x) su jednaki exp(x). Kako je exp(0)=1 Taylor-ov red se onda svodi
na:f(x)=1+x+x2/2!+x3/3!+...+xn/n!+...
Deset jednostavnih algoritama
Algoritam 5/10Deset jednostavnih algoritama
START
X,Y,T:FLOATN:INTEGER
X
Y
END
Y=1
N=1
T=1
WHILE T>0.0001T<-0.0001
DA
T=T*X/N
Y=Y+T
N=N+1
!!! Interesantan korak. Protumačiti ga!
NE
Algoritam 5/10Deset jednostavnih algoritama
Pseudo kodX,Y,T:FLOATN:INTEGERINPUT XY=1N=1T=1WHILE T>0.0001T<-0.0001T=T*X/NY=Y+TN=N+1
ENDWHILEOUTPUT YEND
Algoritam 5/10
Pokušajte sami za da odradite funkciju sin(x) čiji je razvoj u Taylorov red:f(x)=x-x3/3!+x5/5!-...+(-1)nx2n+1/(2n+1)!+...
Uradite sami sljedeći zadatak. Pokazuje se da sin(x) računat prethodnom formulom je efikasan za x u granicama od -/4 do /4. Za x van ovih granica (pretpostavlja se da je x u granicama od -/2 do /2) efikasnije je koristiti relaciju sin(x)=cos(/2-x). Razvoj u Taylorov red funkcije kosinus je: f(x)=1-x2/2!+x4/4!-...+(-1)nx2n/2n!+...
Napisati program koji kombinuje ova dva reda u zavisnosti od unešene vrijednosti za x. Napomena: 3.1415926...
Deset jednostavnih algoritama
Algoritam 6/10
Napisati program koji računa korjene kvadratne jednačine u zavisnosti od unesenih vrijednosti a, b, c:ax2+bx+c=0. Prepostaviti da se traže rješenja u skupu realnih brojeva.
Za a0 i b2-4ac>0 jednačina ima dva rješenje:
Za a0 i b2-4ac=0 jednačina ima jedno rješenje: x=-b/2a.
Deset jednostavnih algoritama
2
1
4
2
b b acx
a
2
2
4
2
b b acx
a
Algoritam 6/10
Za a0 i b2-4ac<0 jednačina nema rješenje u skupu realnih brojeva.
Za a=0 i b0 jednačina ima jedno rješenje: x=-c/b.
Za a=0 i b=0 i c0 sistem je nemoguć. Za a=0 i b=0 i c=0 sistem je trivijalan
(beskonačno mnogo rješenja).
Rješavanje zahtjeva veći broj selekcija.
Deset jednostavnih algoritama
Algoritam 6/10
DA
NE
Deset jednostavnih algoritama
START
A,B,C:FLOATX1,X2,X:INTEGER
A,B,C
B*B-4*A*C>0A0
X1=(-B+KvKor(B*B-4*A*C))/(2*A)
X1=(-B-KvKor(B*B-4*A*C))/(2*A)
X1,X2
B*B-4*A*C0A0
X=-B/(2*A)
X
DA
NE
B*B-4*A*C<0
“Nema rješenja”
DA
NE
A0B0
X=-C/B
DA
X
B0C0
“Nema rješenja”
NE
“Trivijalno”DA
NE
Algoritam 6/10Deset jednostavnih algoritama
END
PSUEDO KODA,B,C:FLOATX,X1,X2:FLOATINPUT A,B,CIF B*B-4*A*C>0A0X1=(-B+KvKor(B*B-4*A*C))/(2*A)X2=(-B-KvKor(B*B-4*A*C))/(2*A)OUTPUT X1,X2ELSEIF B*B-4*A*C0A0X=-B/(2*A)OUTPUT XELSEIF B*B-4*A*C<0
OUTPUT “NEMA RJEŠENJA”ELSEIF A0B0X=-C/BOUTPUT XELSEIF B0C0OUTPUT “NEMA RJEŠENJA”ELSEOUTPUT “TRIVIJALNO”ENDIFEND
Algoritam 6/10
Na narednom času ćemo se upoznati sa načinom izračunavanja kvadratnog korjena.
Oblik naredbe OUTPUT “TEKST” označava štampanje niza karaktera – stringa.
Deset jednostavnih algoritama