osnovi programiranja -...

13

Click here to load reader

Upload: vuonganh

Post on 05-Feb-2018

220 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Osnovi programiranja - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/OPcasovi/algoritmi.pdf · – objektni(C++, JAVA...) – logiˇcki(PROLOG) – funkcionalni(LISP, Haskell,

Osnovi programiranja

Milena Vujosevic - Janicic 2005/2006

November 7, 2005

Page 2: Osnovi programiranja - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/OPcasovi/algoritmi.pdf · – objektni(C++, JAVA...) – logiˇcki(PROLOG) – funkcionalni(LISP, Haskell,

2

Page 3: Osnovi programiranja - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/OPcasovi/algoritmi.pdf · – objektni(C++, JAVA...) – logiˇcki(PROLOG) – funkcionalni(LISP, Haskell,

1

Uvod u programiranje

1.1 Istorija racunara i programskih jezika

Programski jezici

• masinski zavisni

– masinski jezik

– asembler

• masinski nezavisni

– proceduralni(C, pascal, fortran...)

– objektni(C++, JAVA...)

– logicki(PROLOG)

– funkcionalni(LISP, Haskell, Miranda)

1.2 Postupak resavanja problema pomocu racunara

Moze se podeliti na sledece korake:1

1. razumevanje problema

2. izgradnja modela

3. formiranje algoritma

4. provera ispravnosti algoritma

5. realizacija (implementacija) algoritma (tj. pisanje programa)

6. testiranje programa

7. sastavljanje dokumentacije

Uzi smisao termina programiranje obuhvata samo korake 5 i 6.

1Tekstovi o postupku resavanja problema pomocu racunara, razvojnom putu programa i o kvalitetu programapreuzeti su sa sajta www.matf.bg.ac.yu/˜jelenagr

Page 4: Osnovi programiranja - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/OPcasovi/algoritmi.pdf · – objektni(C++, JAVA...) – logiˇcki(PROLOG) – funkcionalni(LISP, Haskell,

4 Milena Vujosevic–Janicic

1.2.1 Razumevanje problema

• Uociti terminologiju koja iskoriscena u formulaciji problema (npr. proveriti simetricnostcrno-bele slike? uociti termin simetricnost matrice)

• uociti sta je dato i sta je ulaz

• uociti sta se trazi i sta treba da bude izlaz

• uociti eventualna ogranicenja u formulaciji, a koja su vezana za dopustene/nedopustenemetode i operacije (npr. resiti problem simetricnosti bez upotrebe pomocnih matrica iliresiti zadatak ne koristeci staticki niz)

1.2.2 Izgradnja modela

uociti slican problem za koji postoji resenje, odnosno pokusati naci matematicku strukturu kojaodgovara resenju realnog problema npr. obracunavamo plate zaposlenih u 12 meseci i znamo daimamo 20 radnika => upotrebicemo tabelu 20x12, odnosno matricu 20x12

1.2.3 Formiranje algoritma

Konstruisati efikasan algoritam, odnosno dati skup preciznih uputstava kako doci do resenjazadatog problema

Algoritmi se mogu opisivati: blok-shemom (dijagramom toka), prirodnim jezikom, pseudo-jezikom.

• OPIS ALGORITAMA PRIRODNIM JEZIKOMOpisati prirodnim jezikom detaljno, precizno i nedvosmisleno korake pri resavanju problema,vodeci racuna o redosledu operacija koji se izvrsavaju.

• OPIS ALGORITAMA PSEUDO JEZIKOMPseudo jezik je neformalna kombinacija prirodnog jezika i nekog programskoj jezika. Priupotrebi pseudo jezika mora se voditi racuna da se jezicke konstrukcije koriste uvek na istinacin i da budu pracene objasnjenjima (ako je potebno).

• OPISIVANJE ALGORITAMA BLOK SEMOM

Za ovaj oblik opisa koriste se graficki simboli ciji je opis propisan ISO standardom. Tekst kojiopisuje obradu se zapisuje unutar grafickih simbola. Tok rada algoritma se opisuju linijamakoje povezuju graficke simbole koji reprezenuju obradu.

1.2.4 Provera ispravnosti algoritma

Teorijski i prakticno ovo je jedan od najslozenijih koraka me�u ovih 7.Sastoji se u analizi slucajeva i analizi ponasanja algoritma.Naime, analizom problema mogu se ustanoviti razliciti slucajevi (vrednosti ulaznih podataka)

u kojima se algoritam razlicito ponasa.

1.2.5 Realizacija algoritma

Ovaj korak se cesto naziva i implementacija algoritma ili kodiranje algoritma.U stvari ovaj korak se odnosi na prevodjenje algoritma na neki programski jezik, odnosno u

oblik koji je razumljiv za racunar.

Page 5: Osnovi programiranja - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/OPcasovi/algoritmi.pdf · – objektni(C++, JAVA...) – logiˇcki(PROLOG) – funkcionalni(LISP, Haskell,

1.3 Razvojni put jednog programa 5

1.2.6 Sastavljanje dokumentacije

Korektno napisana dokumentacija treba da sadrzi razna uputstva o samom programu:

• opis problema koji se resava (npr. izracunavanje prosecne plate jedne firme u toku 12 meseci)

• izgled ulaznihizlaznih podataka (ulaz je datoteka ciji svaki red je oblika: ime i prezime radnikaJMBG redni br meseca plata tog meseca, a izlaz je HTML dokument koji opisuje tabelu cijisavki red sadrzii JMBG i prosek plate tog radnika i razliku u odnsu na prosek svih plata)

• blok-shemu (dijagram toka) algoritma

• opis procesa formiranja algoritma

• test primere i rezultate testianja

• detaljne opise formata u programu

• opis postupka prevodjenja programa i uputstvo za neke specificne situacije

Poenta korektno napisane dokumentacije: da autor programa i nakon godinu dana i hiljade drugihprogram moze da se snadje u sopstvenom programu, kao i da njegov kolega koji nije ucestvovaou formiranju programa moze da vrsi dopune ili izmene programa bez obzira sto nije prvi autorprograma.

1.3 Razvojni put jednog programa

1.3.1 Editovanje

Kodiranje algoritma: ovaj korak se odnosi na prevodjenje algoritma na neki programski jezik,odnosno u oblik koji je razumljiv za racunar i unosenje programskog koda posredstvom teksteditora (EDIT, Notepad, Wordpad, Word, joe, pico, emacs, gnotepad+,...) i njegovih komandi.Krajnji rezultat je datoteka sa izvornim oblikom koda koji se zove i source.

1.3.2 Prevo�enje

Ako prevodilac nije signalizirao pojavu greske, onda se na izlazu iz ove faze dobija datoteka saprevedenim izvornim kodom, tj. objektni program.

Prevo�enje moze da ima dve faze: prevod izvornog koda na asembler, a potom i asembliranjetakvog koda na masinski program.

1.3.3 Signalizacija greske 1

Ako je prevodilac signalizirao pojavu greske, onda se mora izvrsiti korekcija greske u tekst editoru.Te greske mogu nastati u zapisu programa i mogu biti u neskladu sa pravilima programskogjezika (npr. C, Pascal,...) i zbog njih program nije razumljiv racunaru, tj. zapis ne moze da seinterpretira ili prevede na masinski jezik racunara. Ove greske otkriva kompilator ili interpretator.Npr. sintaksna C greska je i=i+1 a=a-2 ( tj. pri kucanju je zaboravljena ; za kraj naredbe)

1.3.4 Linker

Objektni program je ulaz u sistemski program linker. Linker povezuje objektni program i potrebneobjektne programe iz sistemske biblioteke u izvrsni program koji racunar i operativni sistem moguda izvrse.

Page 6: Osnovi programiranja - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/OPcasovi/algoritmi.pdf · – objektni(C++, JAVA...) – logiˇcki(PROLOG) – funkcionalni(LISP, Haskell,

6 Milena Vujosevic–Janicic

1.3.5 Loader

Izvrsni program prihvata loader i

• smesta program u operativnu meoriju

• rezervise resurse racunara

• predaje izvrsni program operativnom sistemu koji na dalje preuzima kontrolu nad programom

1.3.6 Signalizacija greske 2

Ako program tokom izvrsavnja ne daje (ocekivane) rezultate, potrebno je otkloniti greske i ponovoprogram prevesti i povezati sa potrebnim programima iz sistemske biblioteke i smestiti izvrsivuverziju u operativnu memoriju i pokrenuti izvrsavanje programa. Na primer, te greske mogu bitiu skladu sa pravilima programskog jezika, ali su vezane za neispravan deo programa, tj. fragmentprograma koji opisuje razlicit postupak od nameravanog, te racunar izvrsava program, ali ne radiono sto se zelelo. Takve greske mora da otkrije programer, jer ne moze kompajler da prepozna staje programer zeleo, a nije isprogramirao.

U te greske se ubrajaju:

• Logicke greske (greske nastale zbog primene pogresne logike u programiranju)

• Greske u kodiranju (greske koje nastaju pri unosenju programa u racunar, npr. zamena slovakoja dovodi do promene imena promenljivih i slicno, npr, promenljivu K ste uvecali za 1, anameravali ste da uvecate promenljivu K2).

1.3.7 Rezultat

Kraj razvojnog puta jednog programa jeste nakon faze testiranja izlaznih vrednosti koje programdaje kao rezultat svog izvrsenja.

1.4 Kvalitet programa

Kriterijum ocene kvaliteta programa

• Najvazniji kriterijum je korektnost rada pri obradi na racunaru. Ostali kriterijumi najcescei nisu od koristi, ako nije ispunjen ovaj kriterijum.

• citljivostBitno je da postoji visok stepen razumljivosti logike programa.

• jednostavnostKoristiti najjednostavnije programske strukture, ali tako da se ne umanji efikasnost programa.

• efikasnostMeri se vreme potrebno za izvrsavanje programa i velicina potrebne memorije.

• modularnostMisli se na tehniku izrade programa pri kojoj se veci programi dele u vise odvojenih pro-gramskih modula koji komuniciraju medu sobom. Time se povecava citljivost i jednostavnosti olaksavaju buduce modifikacije.

• univerzalnostUpotrebljavati sto opstiju logiku programa (npr.snabdevanje programa argumentima obezbe-diti iza datoteke (opsti ulaz), a ne unositi u program kao konstante,...)

Page 7: Osnovi programiranja - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/OPcasovi/algoritmi.pdf · – objektni(C++, JAVA...) – logiˇcki(PROLOG) – funkcionalni(LISP, Haskell,

1.5 Algoritmi 7

1.5 Algoritmi

1.5.1 Algebarski algoritmi

Primer 1 Algoritam zdravo svete

Algoritam Ispisulaz: nema podataka na ulazuizlaz: poruka Zdravo, svete!!!{output " Zdravo, svete!!!"}

Primer 2 Algoritam za sabiranje dva broja

Algoritam Sabiranjeulaz: x,yizlaz: zbir brojeva x,y/* algoritam je formiran tako da funkcioniseza bilo koji realan broj sa ulaza. Zbog toga seu algoritmu koristi promenljiva - ime kojeoznacava promenljivu vrednost.*/{input x,y;zbir = x + y;output zbir;}

Primer 3 Algoritam za maksimum, domaci maksimum tri broja

Algoritam Maksimumulaz: x, y;izlaz: veci od brojeva x i y{input x,y;if (x>y) max=x

else max=y;output max;}

Primer 4 Algoritam za izracunavanje sume brojeva koja se unosi pre unosa nule

Algoritam Zbirulaz: brojevi sve dok se ne unese nulaizlaz: zbir brojeva{zbir=0; /*Inicijalizujemo zbir na nulu*/input x; /*Unosimo prvi u nizu brojeva*/while x!=0 /*Proveravani da li je broj

x razlicit od nule i ako jesteonda ga dodajemo na zbir*/

{zbir=zbir+x;input x; /*unosimo novi ulazni broj*/}

Page 8: Osnovi programiranja - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/OPcasovi/algoritmi.pdf · – objektni(C++, JAVA...) – logiˇcki(PROLOG) – funkcionalni(LISP, Haskell,

8 Milena Vujosevic–Janicic

output zbir; /*Na izlaz saljemo izracunati zbir*/}

Zadatak 1 Algoritam za maksimum brojeva koji se unose, zavrsetak unosa je nula

Algoritam Maksimumulaz: brojevi sve dok se ne unese nulaizlaz: maksimum unetih brojeva{input x;max = x;while (x!=0) /*Proveravani da li je broj

x razlicit od nule*/{input x; /*unosimo novi ulazni broj*/if (x>max) max=x; /*proveravamo da li je uneti

broj veci od tekucegmaksimuma i ako jesteonda tekucem maksimumudodeljujemo njegovuvrednost*/

}output max; /*Na izlaz saljemo izracunati

maximum*/}

Zadatak 2 Algoritam za n!

Algoritam n!ulaz: prirodan broj n;izlaz: faktorijel prirodnog broja n;{input n;f=1;while (n>1)

{f=f*n;n=n-1;}

output f;}

Zadatak 3 Algoritam za razmenu dva broja

Algoritam razmenaulaz: dva brojaizlaz: razmena dva broja{input x,y;pom=x;x=y;y=pom;output x,y;}

Page 9: Osnovi programiranja - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/OPcasovi/algoritmi.pdf · – objektni(C++, JAVA...) – logiˇcki(PROLOG) – funkcionalni(LISP, Haskell,

1.5 Algoritmi 9

Zadatak 4 Celobrojni kolicnik i ostatak pri deljenju

x = qy + r, 0 ≤ r < y, 0 ≤ q

Algoritam kolicnikulaz: prirodni brojevi x i y;izlaz: kolicnik i ostatak pri deljenju{input x,y;kolicnik=0;ostatak=x;while (ostatak>=y)

{ostatak=ostatak-y;kolicnik=kolicnik+1;}

output kolicnik, ostatak;}

Zadatak 5 Algoritam koji resava kvadratnu jednacinu

a ∗ x2 + b ∗ x + c

Algoritam kvadratna jednacinaulaz: koeficijenti a, b,cizlaz: resenje kvadratne jednacine{input a,b,c;if (a=0)

if (b=0)if (c=0)

output "C";else output "prazan skup";

else x=-c/boutput x;

else d=b*b - 4acif (d>0)

{x1=(-b+sqrt(d))/2a;x2=(-b-sqrt(d))/2a;output x1, x2;}

else if (d=0){x=-b/2a;output x;}else{Re=-b/2a;Im=sqrt(-d)/2a;output Re+i*Im, Re-i*Im;}

}

Page 10: Osnovi programiranja - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/OPcasovi/algoritmi.pdf · – objektni(C++, JAVA...) – logiˇcki(PROLOG) – funkcionalni(LISP, Haskell,

10 Milena Vujosevic–Janicic

Zadatak 6 Fibonacijevi brojevi

Algoritam fibonaciulaz n;izlaz n-ti fibonacijev broj;{input n;x0=0;x1=1;if n=0 rezultat=x0;

else {while (n>1){

novi=x0+x1;x0=x1;x1=novi;n=n-1;

}rezultat=x1;

output rezultat;}

}

1.5.2 Koren prirodnog broja

Zadatak 7 Naci ceo deo korena prirodnog broja

Algoritam Koren1ulaz prirodan broj n;izlaz ceo deo korena prirodnog broja;{input n;koren=1;while (koren*koren<=n)

koren=koren+1;koren=koren-1;output koren;}

Zadatak 8 Naci ceo deo korena prirodnog broja

Algoritam Koren2ulaz prirodan broj n;izlaz ceo deo korena prirodnog broja;{input n;suma=0;broj=0;while (suma<=n)

{suma=suma+broj+broj+1;broj=broj+1;}

broj=broj-1;

Page 11: Osnovi programiranja - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/OPcasovi/algoritmi.pdf · – objektni(C++, JAVA...) – logiˇcki(PROLOG) – funkcionalni(LISP, Haskell,

1.5 Algoritmi 11

output broj;}

1.5.3 NZD

Zadatak 9 Naci najveci zajednicki delitelj za dva broja

Algoritam NZD1ulaz prirodni brojevi a, b;izlaz nzd(a,b);{input a,b;nzd = 1;br=2;while (br<=a && br<=b)

{if (a%br)==0 && (b%br)==0 nzd=br;br=br+1;}

output nzd;}

Zadatak 10 Naci najveci zajednicki delitelj za dva broja

Algoritam NZD2ulaz prirodni brojevi a, b;izlaz nzd(a,b);{input a,b;nzd = 1;if (a<b) nzd=a;

else nzd=b;indikator=1;while (indikator)

{if (a%nzd)==0 && (b%nzd)==0 indikator=0;

else nzd=nzd-1;}

output nzd;}

Zadatak 11 Euklidov algoritam 1

Algoritam NZD3ulaz prirodni brojevi a, b;izlaz nzd(a,b);{input a,b;while (a!=b)

{if (a>b) a=a-b;

else b=b-a;}

output a;}

Page 12: Osnovi programiranja - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/OPcasovi/algoritmi.pdf · – objektni(C++, JAVA...) – logiˇcki(PROLOG) – funkcionalni(LISP, Haskell,

12 Milena Vujosevic–Janicic

Zadatak 12 Euklidov Algoritam 2

Algoritam NZD4ulaz prirodni brojevi a, b;izlaz nzd(a,b);{input a,b;if (a<b) {

pom=a;a=b;b=pom;}

while (b!=0){pom = b;b = a % b;a = pom;}

output a;}

Page 13: Osnovi programiranja - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~milena/OPcasovi/algoritmi.pdf · – objektni(C++, JAVA...) – logiˇcki(PROLOG) – funkcionalni(LISP, Haskell,

Sadrzaj

1 Uvod u programiranje 31.1 Istorija racunara i programskih jezika . . . . . . . . . . . . . . . . . . . . . . . . . 31.2 Postupak resavanja problema pomocu racunara . . . . . . . . . . . . . . . . . . . . 3

1.2.1 Razumevanje problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.2.2 Izgradnja modela . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.2.3 Formiranje algoritma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.2.4 Provera ispravnosti algoritma . . . . . . . . . . . . . . . . . . . . . . . . . . 41.2.5 Realizacija algoritma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.2.6 Sastavljanje dokumentacije . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

1.3 Razvojni put jednog programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.3.1 Editovanje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.3.2 Prevo�enje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.3.3 Signalizacija greske 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.3.4 Linker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.3.5 Loader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.3.6 Signalizacija greske 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.3.7 Rezultat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

1.4 Kvalitet programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.5 Algoritmi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

1.5.1 Algebarski algoritmi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.5.2 Koren prirodnog broja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.5.3 NZD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11