44
Principi programiranja Čas II Tip podataka float Osnovno o algoritmima

Principi programiranja cas 2

Embed Size (px)

DESCRIPTION

principi, algoritmi, predavanje

Citation preview

Page 1: Principi programiranja cas 2

Principi programiranja

Čas IITip podataka floatOsnovno o algoritmima

Page 2: Principi programiranja cas 2

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

Page 3: Principi programiranja cas 2

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.

Page 4: Principi programiranja cas 2

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.

Page 5: Principi programiranja cas 2

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.

Page 6: Principi programiranja cas 2

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.

Page 7: Principi programiranja cas 2

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 .

Page 8: Principi programiranja cas 2

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

Page 9: Principi programiranja cas 2

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.

Page 10: Principi programiranja cas 2

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.

Page 11: Principi programiranja cas 2

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.

Page 12: Principi programiranja cas 2

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.

Page 13: Principi programiranja cas 2

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

Page 14: Principi programiranja cas 2

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

Page 15: Principi programiranja cas 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

Page 16: Principi programiranja cas 2

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

Page 17: Principi programiranja cas 2

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

Page 18: Principi programiranja cas 2

Složena selekcija

2 4

2 4

4 0 ili 1

drugdje

X X

X XY

X X

X

Page 19: Principi programiranja cas 2

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

Page 20: Principi programiranja cas 2

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)

Page 21: Principi programiranja cas 2

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

Page 22: Principi programiranja cas 2

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

Page 23: Principi programiranja cas 2

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.

Page 24: Principi programiranja cas 2

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.

Page 25: Principi programiranja cas 2

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

Page 26: Principi programiranja cas 2

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

Page 27: Principi programiranja cas 2

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.

Page 28: Principi programiranja cas 2

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

Page 29: Principi programiranja cas 2

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

Page 30: Principi programiranja cas 2

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

Page 31: Principi programiranja cas 2

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

Page 32: Principi programiranja cas 2

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

Page 33: Principi programiranja cas 2

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

Page 34: Principi programiranja cas 2

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

Page 35: Principi programiranja cas 2

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

Page 36: Principi programiranja cas 2

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

Page 37: Principi programiranja cas 2

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

Page 38: Principi programiranja cas 2

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

Page 39: Principi programiranja cas 2

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

Page 40: Principi programiranja cas 2

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

Page 41: Principi programiranja cas 2

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

Page 42: Principi programiranja cas 2

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

Page 43: Principi programiranja cas 2

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

Page 44: Principi programiranja cas 2

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