Uvod u programiranje matematika X predavanje Nizovi Vesna

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

Uvod u programiranje - matematika – X predavanje Nizovi 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 (tipično intervalni 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 učitavanjem ili pomoću naredbe dodeljivanja. a[5] : = 8; a[7] : = Str. To. Int (Edit 1. Text);

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 niti učitati niti odštampati samo jednom naredbom.

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. type vektor = array [1. . 50] of real;

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

procedure ucitaj_vektor (var a: vektor; n: integer); var i: integer; begin for i: =1 to n do <učitaj a[i]>; end; procedure stampaj_vektor (a: vektor; n: integer); var i: integer; begin for i: =1 to n do <štampaj a[i]>; end;

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

procedure saberi (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;

procedure TForm 1. Button 1 Click(Sender: TObject); var a, b, c : vektor; n

procedure TForm 1. Button 1 Click(Sender: TObject); var a, b, c : vektor; n : 1. . 50; S : real; begin <učitaj n>; ucitaj _vektor (a, n); ucitaj _vektor (b, n); saberi (a, b, n, c); stampaj _vektor (c, n); S : = Skalarni_Proizvod (a, b, n); <štampaj S>; end;

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, uslov 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 // za proceduru Uredi 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 15 Deklarisati tipive Datum i Niz. Datuma. Urediti dati niz datuma. Napomena.

Domaći zadatak 15 Deklarisati tipive Datum i Niz. Datuma. Urediti dati niz datuma. Napomena. Datume možete zadati u samom programu, ili ih učitavati sa procedure Ucitaj. Datum (var dat: datum); begin dat. d : = Str. To. Int (Input. Box ('Ucitavanje datuma', 'dan = ', '')); dat. m : = Str. To. Int (Input. Box ('Ucitavanje datuma', 'mesec = ', '')); dat. g : = Str. To. Int (Input. Box ('Ucitavanje datuma', 'godina = ', '')); end;

Domaći zadatak 16 Polinom je određen stepenom i nizom koeficijenata. P(x) = an xn

Domaći zadatak 16 Polinom je određen stepenom i nizom koeficijenata. P(x) = an xn + an-1 xn-1 +. . . + a 2 x 2 + a 1 x + a 0 Deklarisati tip Polinom. Učitati jedan polinom, a zatim odrediti i odštampati njegov izvod.

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. – 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;