Uvod u programiranje matematika XI predavanje Vesna Velikovi

  • Slides: 25
Download presentation
Uvod u programiranje - matematika – XI predavanje Vesna Veličković vesna@pmf. ni. ac. rs

Uvod u programiranje - matematika – XI predavanje Vesna Veličković vesna@pmf. ni. ac. rs

Tipovi u Pascalu • Definicija tipa type <ime tipa> = <tip> ; Vrste tipova

Tipovi u Pascalu • Definicija tipa type <ime tipa> = <tip> ; Vrste tipova u Pascalu Prosti (nestruktuirani) Složeni (struktuirani) Redni tipovi INTEGER CHAR BOOLEAN intervalni nabrojani pointer REAL array record string file set

Array tip Više promenljivih istog tipa čini jednu celinu. Ta celina ima zajedničko ime,

Array tip Više promenljivih istog tipa čini jednu celinu. Ta celina ima zajedničko ime, a do pojedinačnih komponenti se dolazi pomoću indeksa. array [ <tip indeksa> { , <tip indeksa> } ] of <tip komponente> Tip indeksa mora biti neki redni tip. Tip komponente može biti bilo koji tip.

Nizovi Niz je jednodimenzionalni array (ima samo jedan indeks). const max. Indeks = 100;

Nizovi Niz je jednodimenzionalni array (ima samo jedan indeks). const max. Indeks = 100; type niz = array [1. . max. Indeks ] of real; var a, b : niz; na, nb : integer; // broj stvarno upotrebljenih komponetni a 1 2 3 a[3] . . . n-1 n n+1 max Index

Specifičnost nizova • Obično se u primenama ne zna unapred tačan broj komponenti (elemenata)

Specifičnost nizova • Obično se u primenama ne zna unapred tačan broj komponenti (elemenata) niza. U deklaraciji array tipa se procenjuje maksimalan broj potrebnih komponeti. • Zbog toga uz svaku promenljivu nizovnog array tipa ide po jedna integer promenljiva koja označava koliko komponenti je stvano upotrebljeno. • Procenjeni maksimalni broj komponetni ne sme biti premali, da bi program mogli upotrebiti u većem broju slučajeva, ali ni preveliki da ne bi imali mnogo neiskorišćenog prostora.

Upotreba nizova • Deklaracija tipa. U ovoj fazi opisujemo kako će promenljiva nizovnog tipa

Upotreba nizova • Deklaracija tipa. U ovoj fazi opisujemo kako će promenljiva nizovnog tipa izgledati kada se bude napravila, ali za sada ne postoji ni jedna promenljiva tog tipa. • Deklaracija promenljivih. Odvaja se memorijski prostor za potreban za čuvanje promenljive tog nizovnog tipa, i uvodi se ime te promenljive. Vrednosti komponenti (elemenata niza) su nedefinisane, pa se još uvek ne mogu upotrebljavati. • Definisanje vrednosti komponenti. • Upotreba cele promenljive ili neke od njenih komponetni.

Definisanje vrednosti komponenti Ovo se može uraditi na dva načina: • Celoj promenljivoj array

Definisanje vrednosti komponenti Ovo se može uraditi na dva načina: • Celoj promenljivoj array tipa se dodeljuje vrednost druge promenljive istog tipa. var a, b : niz; a : = b; • Dodeljivanje vrednosti pojedinačnim komponentama se može uraditi pomoću naredbe dodeljivanja ili read. a[5] : = 8; read (a[7]);

Učitavanje i štampanje • Učitavanje i štampanje nizova se radi pokomponentno (komponeta po komponenta).

Učitavanje i štampanje • Učitavanje i štampanje nizova se radi pokomponentno (komponeta po komponenta). Ne može se ceo niz učitati naredbom read ni odštampati naredbom write. • Za učitavanje array (i record) tipa koristimo procedure. (Rezultat funkcije ne može biti struktuiranog tipa. )

Primer: vektor • Deklarisati tip vektor. • Učitati dva n-dimenzionalna vektora. • Izračunati i

Primer: vektor • Deklarisati tip vektor. • Učitati dva n-dimenzionalna vektora. • Izračunati i odštampati njihov zbir i skalarni proizvod. program Vektori; type vektor = array [1. . 50] of real; var a, b, c : vektor; n : 1. . 50; s : real;

procedure ucitaj (var a: vektor; n: integer); var i: integer; begin for i: =1

procedure ucitaj (var a: vektor; n: integer); var i: integer; begin for i: =1 to n do read (a[i]); end; procedure stampaj (a: vektor; n: integer); var i: integer; begin for i: =1 to n do write (a[i]: 10: 2); writeln end;

procedure sabari (a, b: vektor; n: integer; var c: vektor); var i: integer; begin

procedure sabari (a, b: vektor; n: integer; var c: vektor); var i: integer; begin for i: =1 to n do c[i] : = a[i] + b[i]; end; function Skalarni. Proizvod (a, b: vektor; n: integer) : real; var i: integer; S : real; begin S : = 0; for i: =1 to n do S : = S + a[i] * b[i]; // S postoji da ne bi u gornjoj naredbi imali rekurziju Skalarni. Proizvod : = S; end;

begin {program} write ('n = '); read(n); ucitaj (a, n); ucitaj (b, n); Saberi

begin {program} write ('n = '); read(n); ucitaj (a, n); ucitaj (b, n); Saberi (a, b, n, c); stampaj (c, n); S : = Skalarni. Proizvod (a, b, n); writeln ('Skalarni proizvod je ', S); end. {program}

Maksimum niza • Prvo se prvi element proglasi za maksimalni. • Zatim se svi

Maksimum niza • Prvo se prvi element proglasi za maksimalni. • Zatim se svi elementi od drugog do poslednjeg uporedjuju sa proglašenim maksimumom • Ako je element koji ispitujemo veći od dosadašnjeg maksimuma, onda se on proglašava za maksimum. • Ako nije, proglašeni maksimum se ne menja. • Kada pregledamo sve elemente niza, proglašeni maksimum će biti upravo stvarni maksimum niza.

function Maximum (a: niz; n: integer) : real; var i : integer; max :

function Maximum (a: niz; n: integer) : real; var i : integer; max : real; begin max : = a[1]; for i: =2 to n do if max < a[i] then max : = a[i]; Maksimum : = max; end;

Maksimum i njegov indeks • Ako želimo da uz maksimum niza odredimo i na

Maksimum i njegov indeks • Ako želimo da uz maksimum niza odredimo i na kom mestu se on nalazi, kad god promenimo vrednost promenljive max, menjamo i indeks. • Na način opisan u donjoj proceduri, ako postoji više vrednosti jednakih maksimumu, pamtiće se mesto (indeks) njenog prvog pojavljivanja.

procedure Maximum (a: niz; n: integer; var max: real; var index : integer); var

procedure Maximum (a: niz; n: integer; var max: real; var index : integer); var i: integer; begin max : = a[1]; indeks : = 1; for i: =2 to n do if max < a[i] then begin max : = a[i]; indeks : = i; end; Maksimum : = max;

Uredjenje niza po rastućem redosledu • Na prvo mesto niza postavimo najmanji element niza.

Uredjenje niza po rastućem redosledu • Na prvo mesto niza postavimo najmanji element niza. Za to korisimo predhodno opisani postupak nalaženja najmanjeg elementa niza, osim što ne koristimo dodatne promenljive min i indeks, već, čim nadjemo neki element koji je manji od prvog, promenimo im mesta. • Zatim na drugo mesto postavimo najmanji element od preostalih. • Postupak ponavljamo dok ne dodjemo do pretposlednjeg. Kad njega postavimo, na poslednjem mestu će se automatski nalaziti najveći element.

procedure Uredi (var a: niz; n: integer); var i, j : integer; pom :

procedure Uredi (var a: niz; n: integer); var i, j : integer; pom : real; begin for i: =1 to n-1 do for j: =i+1 to n do if a[i] > a[j] then begin pom : = a[i]; a[i] : = a[j]; a[j] : = pom; end;

 • Primetimo da kod uredjenja niza po rastućem redosledu uslov u if naredbi

• Primetimo da kod uredjenja niza po rastućem redosledu uslov u if naredbi je a[i] > a[j] , a važi i<j. • Ako niz uredjujemo po opadajućem redosledu, usov u if naredbi je bi bio a[i] < a[j]. • Znači, ako elementi a[i] i a[j] nisu uredjeni kako treba, menjamo im mesta.

 • Ako se elementi niza ne mogu uporedivati relacijama < ili > (na

• Ako se elementi niza ne mogu uporedivati relacijama < ili > (na primer ako su nekog struktuiranog tipa), možemo primeniti isti algoritam za uredjenje niza samo što umesto uporedjivanja relacijom stavljamo funkciju koja ispituje da li su elementi uredjeni kako treba. function nisu_uredjeni (i, j: integer) : boolean; begin nisu_uredjeni : = not (<dobro uredjenje koje odgovara tom tipu>) end;

Uredjenje niza uglova type ugao = record stepen : 0. . 360; minut :

Uredjenje niza uglova type ugao = record stepen : 0. . 360; minut : 0. . 60; end; niz = array [1. . 100] of ugao; procedure Uredi (var a: niz; n: integer); var i, j : integer; pom : ugao; function nisu_uredjeni ( a, b : ugao) : boolean; begin nisu_uredjeni : = not ((a. stepen < b. stepen) or (a. stepen = b. stepen) and (a. minut <= b. minut)); end; begin for i: =1 to n-1 do for j: =i+1 to n do if nisu_uredjeni ( a[i], a[j] ) then razmeni_mesta (i, j) end;

Domaći zadatak 17 • Deklarisati tipove datum i niz datuma. • Učitati niz datuma

Domaći zadatak 17 • Deklarisati tipove datum i niz datuma. • Učitati niz datuma i urediti ga po rastućem redosledu.

Umetanje u uredjeni niz • Dat je niz realnih brojeva, a, uredjen po rastućem

Umetanje u uredjeni niz • Dat je niz realnih brojeva, a, uredjen po rastućem redosledu i jedan realan broj, b. • Broj b umetnuti u niz a na odgovarajuće mesto. • Prvo treba naći mesto i a[i-1] <= b <= a[i] • Zatim treba sve elemente niza počev od mesta i pomeriti za jedno mesto udesno. • I na kraju treba staviti b na mesto i.

procedure umetni (var a: niz; var n: integer; b: real); var i, j :

procedure umetni (var a: niz; var n: integer; b: real); var i, j : integer; begin {nalazenje mesta} i : = 1; while (i<=n) and (b > a[i]) do i : = i + 1; {po zavrsetku petlje b <= a[i], ili je i=n+1, tj. b je vece od svih a[i]} {pomeranje udesno} for j: =n downto i do a[j+1] : = a[j]; {umetanje b} a[i] : = b; n : = n+1; {i broj elemenata niza se menja} end;

Domaći zadatak 18 • Dat je niz realnih brojeva, a, uredjen po opadajućem redosledu

Domaći zadatak 18 • Dat je niz realnih brojeva, a, uredjen po opadajućem redosledu i jedan realan broj, b. • Broj b umetnuti u niz a na odgovarajuće mesto. • Pokušajte da nalaženje mesta i uradite počev od poslednjeg elementa niza a[n].