nizovi - primena u praksi

15
Visoka Poslovna škola strukovnih studija Blace SEMINARSKI RAD Predmet:Algoritmi i strukture podataka Tema: Nizovi – primena u praksi

Upload: milos-stojanovic

Post on 29-Dec-2014

78 views

Category:

Documents


7 download

TRANSCRIPT

Page 1: Nizovi - Primena u Praksi

Visoka Poslovna škola strukovnih studija Blace

SEMINARSKI RAD

Predmet:Algoritmi i strukture podataka

Tema: Nizovi – primena u praksi

Nastavnik: Student:

Branislav Jevtovć Miloš Stojanović 50/10 r

Page 2: Nizovi - Primena u Praksi

Nizovi – primena u praksi

Sadržaj

1. NIZ..............................................................2

1.1 PREDSTAVLJANJE NIZOVA........................21.2 ISKORIŠĆENJE PROSTORA I EFIKASNOST...31.3 INDEKSIRANJE..........................................4

2. NIZOVI – PRIMENA U PRAKSI............4

2.1 JEDNODIMENZIONALNI NIZ.......................42.2 STRING.....................................................62.3 VIŠEDIMENZIONALNI NIZOVI....................62.4 INICIJALIZACIJA NIZOVA..........................82.5NIZ STRINGOVA.........................................82.6 STRING FUNKCIJE.....................................92.7 POKAZIVAČI I NIZOVI.............................10

3. Literatura....................................................10

[Type text] Visoka Poslovna škola strukovnih stuija Blace [Type text]

Page 3: Nizovi - Primena u Praksi

Nizovi – primena u praksi

1. Niz

Niz u programiranju predstavlja složeni tip podataka, sačinjen od nekolicine drugih podataka istog ili različitog tipa. Svaki podatak u nizu se naziva njegovim elementom, a svaki element ima svoj indeks, odnosno objekat preko kojeg prilazimo tom elementu u nizu. Niz ima široku primenu i postoji u praktično svim programskim jezicima. Za niz retko možemo čuti i nazive kao što su polje ili tabela.

Niz je konačan, linearno uređen skup homogenih elemenata. Homogenost kod niza se ogleda u tome što je svaki element istog skalarnog ili strukturnog tipa. Jedna od glavnih pozitivnih osobina niza je uređenost. Uređenost omogućava da se zna tačno koji je prvi, drugi i svaki sledeći član niza.

1.1 Predstavljanje nizovaJednodimenzionalni nizovi

Niz može biti jednodimenzionalan (niz), dvodimenzionalan (matrica), i višedimenzionalan.

Kod jednodimenzionalnog niza, dimenzija se poistovjećuje sa dužinom niza. Npr. kažemo da je niz dimenzije n to znači da niz ima n članova. Kod više dimenzionalnih nizova, međutim, ne postoji pojam dužine, nego se uvek kaže da je niz dimenzija m x n x ... x z ili (m,n,...,z).Za niz je bitno poznavati njegove dimenzije da bismo mogli ispravno indeksirati odnosno dodavati njegove elemente.

Jednodimenzionalni nizovi su po svojoj strukturi najjednostavniji.

X[l:u] = {X[i]}, i = l, l+1,…u

Slika 1. - Predstavljanje nizova

s - Memoriska reč;Al – Adresa memoriskog elementa;

Višedimenzionalni nizovi

Višedimenzionalni nizovi su nizovi koje mi najčešće nazivamo matricama. Svaki višedimenzionalni niz možemo da gledamo kao na jednodimenzionalni niz sa elementima jednodimenzionalnog niza.

X[l1:u1:l2:u2] = {X[i1,i2]}, i1 = l1,l1 + 1, …u1, i2 = l2, l2 + 1, … u2

[Type text] Visoka Poslovna škola strukovnih stuija Blace [Type text]

Page 4: Nizovi - Primena u Praksi

Nizovi – primena u praksi

Primeri višedimenzionalnih nizova su: matrice, dijagonalne matrice, trougaone matrice, simetrične matrice i dr.

X[l1:u1:l2:u2,..,ln:un] = {X[i1,i2,..in]}, i1 = l1,l1 + 1, …u1, i2 = l2, l2 + 1, … u2; in = ln, ln +1

1.2 Iskorišćenje prostora i efikasnost

Kod sekvencijalne memoriske reprezentacije iskorišćenje memoriskog prostora je optimalno, a pristup je efikasan ako je veličina elemenata S jednaka jednoj memoriskoj reči ili njenom celom multiplu.

Slika 2. – Memoriska reprezentacija kada je element S jednak jednoj memoriskoj reči

Veliki problemi nastaju kada element S nije jednak jednoj memoriskoj reči. Tada se memoriska reprezentacija bitno razlikuje od memoriske reprezentacija kada je element S jednak jednoj memoriskoj reči.

To ostavlja posledice na jedan od dva parametra memoriske reprezentacije a to su iskorišćenje prostora i efikasnost pristupa. U zavisnosti od toga šta je prioritetni cilj određujemo na koji način formiramo niz.

Ako je iskorišćenje prostora prioritet elementi se kontinualno smeštaju što se u nekim slučajevima plaća neefikasnošću pristupa.

Slika 3. – Memoriska reprezentacija (iskorišćenje prostora)

Ako je efikasnost pristupa prioritet elementi “se smeštaju sa dopunom“ što se plaća slabim iskorišćenjem memoriskog prostora.

Slika 4. – Memoriska reprezentacija (efikasnost pristupa)

1.3 Indeksiranje

Svaki element niza ima onoliko indeksa koliko sam niz ima dimenzija. Tako, element jednodimenzionalnog niza ima jedan indeks, a n-dimenzionalni niz ima n indeksa. Sam indeks je obično ceo broj, ali može biti bilo koji objekat.

[Type text] Visoka Poslovna škola strukovnih stuija Blace [Type text]

Page 5: Nizovi - Primena u Praksi

Nizovi – primena u praksi

2. Nizovi – primena u praksi

Nizovi postoje gotovo u svakom programskom jeziku. Zbog efikasnosti pristupa i memoriske efikasnosti sačinjavaju izvorne kodove miliona programa širom sveta. U ovom zadatku imam za cilj da objasnim kakva je primena nizova u C programskom jeziku.

2.1 Jednodimenzionalni niz

Opšta forma deklarisanja jednodimenzionalnog niza je:

type var_name [size];

Type predstavlja korektan C tip podataka, var_name predstavla ime niza, a size određuje koliko elemenata ima niz. Ako želimo niz od 50 elemenata možemo da koristimo i izraz:

int height [50];

C definiše da u deklarisanom nizu prvi element ima index 0. Ako niz ima 50 elemenata poslednji element niza ima index 49. Ako na primer želimo da 25-om elementu niza dodelimo vrednost 60 to ćemo uraditi na sledeći način:

height [24] = 60;

C smešta jednodimenzionalne nizove kontinualno u sukcesivne memoriske lokacije. Prvi element se nalazi na najnižoj adresi. Ako se sledeći element koda izvršava…

int num[10];int i;for (i=0;i<10;i++)

0007: CLRF 18 ; briši i0008: MOVLW 0A0009: SUBWF 18,W ; sada test da li je <10000A: GOTO 013 ; ako jeste tada zaustavite rutinu

num[i] = i;

00C: MOVLW 0E ; učitavanje početka numeričkog koda00D: ADDWF 18,W00E: MOVWF 0400F: MOVF 18,W010: MOVWF 000011: INCF 18, F0012: GOTO 008niz i će izgledati ovako:element 1 2 3 4 5 6 7 8 9 10

0 1 2 3 4 5 6 7 8 9

[Type text] Visoka Poslovna škola strukovnih stuija Blace [Type text]

Page 6: Nizovi - Primena u Praksi

Nizovi – primena u praksi

Element niza se može koristiti na bilo kom mestu gde imate potrebu za promenjivom ili konstantnom.

Ako imamo potrebu da nam svaki sledeći niz ima kvadratnu vrednost i da se ispišu svi članovi niza onda ćemo postupiti na sledeći način:

#include <16C74.h>

void main(void){int num[10];int i;

for (i=0,i<10,i++)num[i] = i * i;

for (i=0,i<10,i++)printf("&d", num[i]);}

Šta ako želimo da postojeći niz proširimo sa jednim elementom? Programski jezik C ne poseduje proveru granica za indeksirani niz. Da li to znači da možemo upisivati i čitati element koji nije deklarisan u nizu. Možemo. Ali to može dovesti do katastrofalnog rezultata koji može da se manifestuje u vidu pada celog programa, a u nekim slučajevima i rad celog računara je doveden u pitanje.

Dodeljivanje vrednosti jednog niza drugom nizu korišćenjem formule dodeljivanja:

int a[10], b[10];..a=b;

Ovo je nekorektno. Da bi dodelili vrednosti jednog niza drugom nizu morate da kopirate svaki element prvog niza u element drugog niza pojedinačno. Jedno od osnovnih pravila po kojem je to moguće je da ova niza imaju isti broj elemenata. Ako je taj uslov zadovoljen koristi se sledeća formula:

for (i=0,i<10,i++)b[i] = a[i];

2.2 String

String je najuobičajni jednodimenzionalni niz. String se definiše kao niz karaktera koji se završava sa null. Null se u C-u definiše kao 0. Ako se svaki string mora završiti sa null, tada se pri deklarisanju stringa mora dodati dodatni element. Ovaj dodatni element će sadržati null. Sve string konstante se automatski završavaju sa null u C kompajleru.

[Type text] Visoka Poslovna škola strukovnih stuija Blace [Type text]

Page 7: Nizovi - Primena u Praksi

Nizovi – primena u praksi

C nema ugrađen string kao tip podataka. Umesto toga podržava stringove upotrebom jednodimenzionalnih nizova karaktera.

Funkcijom gets(str) možemo učitati sve karaktere sa tastature sve dok se ne naiđe na carriage return. Učitani string karaktera će biti smešten u deklarisan niz str. Moramo biti sigurni da je dužina stringa str veća ili jednaka učitanom broju karaktera sa tastature plus null (null = \0).

void main(void){

char str[80];int i;

printf("Unesi string (<80 karaktera): \n");gets(str);for (i=0; str[i] ;i++)

printf("&c", str[i]);

print("\n&s", str);}String se može štampati na dva načina: kao niz karaktera upotrebom &C ili kao string &S.

2.3 Višedimenzionalni nizovi

C programski jezik podržava i rad sa višedimenzionalnim nizovima. Jedan višedimenzionalni niz dimenzija 5x5 kreiramo na sledeći način:

int number [5] [5]; Koristi 25 lokacija

Ako želimo da dodamo dodatne informacije o nizu to možemo uraditi jednostavnim dodavanjem dodatnog skupa zagrada.

Dvodimenzioni nizovi se najbolje predstavljaju u vrsta/kolona formatu. Ovakvim nizovima se pristupa po vrstama,i to sa leva na desno. Dvodimenzionalni niz se koristi na potpuno isti način kao i jednodimenzionalni niz.

Sledeći program nam smešta u 5x4 niz, u svaki element niza proizvod indeks vrednosti elemenata niza, a potom prikazuje sadržaj niza u vrsta/kolona formatu.

void main (void){

int array [5][4];int i,j;

for (i=0;i<5;i++)for(j=0,j<4;j++)

array [i][j]=i*j;

for (i=0;i<5;i++)

[Type text] Visoka Poslovna škola strukovnih stuija Blace [Type text]

Page 8: Nizovi - Primena u Praksi

Nizovi – primena u praksi

{for(j=0,j<4;j++)

printf("&d", array [i][j]);printf("\n");

}}

Grafička prikaz 5x4 niza:

0 0 0 00 1 2 30 2 4 60 3 6 90 4 8 12

Upotreba multidimenzionih nizova povećava broj varijabli potrebnih za pristup svakom pojedinačnom elementu. Usled upotrebe PicMikro mikrokontrolera višedimenzionalni niz od 10x10 elemenata nije moguć. Kao alternativu koriste se dva niza od po 50 elemenata.

Primer sume svih elemenata matrice x:

int i, j, num_rows=3, num_cols=4;int sum=0;

for(i=0; i <num_rows; i++)for(j=0; i<num_cols; j++)sum+=x[i][j];

cout << "suma elemenata matrice=" << sum;

2.4 Inicijalizacija nizova

C programski jezik obezbeđuje metod kojim dodeljuje inicijalnu vrednost nizu na isti način kako bi bila dodeljena i za sasmostalnu varijablu. Uopštena forma jednodimenzionalnog niza je:

type_array name[size] = {value_list};

Value_list je lista konstanti kompatibilnih sa definisanim tipom niza, pri čemu su konstante međusobno razdvojene zarezom. Prva konstanta se smešta kao prvi element liste, druga konstanta na mesto drugog elementa liste i tako dalje. Sledećim primerom ćemo prikazati inicijalizaciju niza od 5 celobrojnih elemenata:

int i[5] = {1,2,3,4,5};

Element i[0] će imati vrednost 0, a element i[4] će imati vrednost 5.String može da bude inicijalizovan na dva načina.

[Type text] Visoka Poslovna škola strukovnih stuija Blace [Type text]

Page 9: Nizovi - Primena u Praksi

Nizovi – primena u praksi

Prvi način podrazumeva da napravite listu svih pojedinačnih karaktera kao na primer:

char str[3] = { “a”, “b”, “c”};

Drugi metod je da se koristi string pod navodnicima, kao što je prikazano u primeru:

char name [5] = “John”;

Možda se primećuje da ne postoje uglaste zagrade oko stringa. One se ne koriste prilikom inicijalizacije zato što se stringovi u C jeziku završavaju sa null. Kompajler automatski dodaje null na kraju stringa.

Multidimenzionalni niz se inicijalizuje na isti način kao i jednodimenzionalni niz. Jednostavnije je koristiti format vrsta/kolona kada se koriste dvodimenzionalni nizovi.

Inicijalizacija 3x3 niza:

int num [3] [3] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 };

2.5Niz stringova

Niz stringova je veoma dobar za korišćenje u C jeziku. On se inicijalizuje kao bilo koji drugi niz. Način korišćenja niza stringova je malo drugačiji nego kod korišćenja niza. Za pristup stringu iz tabele dovoljno je specificirati samo prvi indeks.

Kreirati niz name koji sadrzi 10 imena pri čemu svako ime ima 40 karaktera (uključujući i null).

char names [10] [40];

Sledeći primer ispisuje peto ime iz niza:

printf (“&S”, names [4]);

Isto pravilo važi i za nizove koji imaju više od dve dimenzije. Imamo niz animals deklarisan na sledeći način:

char animals [5] [4] [50];

Ako bismo želeli da pristupimo animals stringu koristimo prve dve dimenzije. Na primer, da bi smo pristupili drugom stringu u trećoj listi, specifiramo:

animals [2] [1].

2.6 String funkcije

Unutar programa se stringovima može manipulisati na razne načine. Jedan od primera je kopiranje sa izvorišta na odredište pomoću strcpy komande. To omogućava da se konstantni

[Type text] Visoka Poslovna škola strukovnih stuija Blace [Type text]

Page 10: Nizovi - Primena u Praksi

Nizovi – primena u praksi

string unese u RAM. Da bi mogli da manipulišemo stringovima moramo da obezbedimo da string niz odgovara veličini stringa kojim se manipuliše. Ovo su samo neki od mnogo brojnih funkcija.Kada se jednodimenzionalni niz pojavljuje u deklaraciji argumenata funkcije,tada se ne navodi dimenzija niza.

int suma_niza(int A[], int numelements){int sum =0;for(int i=0; i<numelements; i++)sum += A[i];return sum;}

Uočimo da se vrednost elemenata niza može menjati unutar funkcije. Očito je da se niz ne prenosi po vrednosti, jer funkcije tada ne bi bile moguće. Nizovi se u funkciju prenose kao memorijske reference.

Kompajler memorijsku referencu niza (tj. adresu) pamti "u njegovom imenu" stoga se pri pozivu funkcije navodi samo ime, bez uglatih zagrada.

strcat | Vrši spajanje dva stringa

strchr | Traži prvo pojavljivanje karaktera u stringu

strrchr | Traži poslednje pojavljivanje karaktera

strcmp | Poredi dva stringa

strncmp | Poredi broj karaktera u dva stringa

2.7 Pokazivači i nizovi

Pokazivači i nizovi su blisko povezani i međusobno zamenjivi. Ako koristimo ime niza bez indeksa, vi zapravo upotrebljavate pokazivač na početak niza. Ono što se zapravo prenosi funkcija je pokazivač na prvi element stringa. Kada se prenosi niz funkciji prenosi se samo pokazivač na prvi element.

Pošto je ime niza bez indeksa ustvari pokazivač, možete da dodelite drugom pokazivaču. To omogućava da pristupite nizu pomoću pointer aritmetike.

int a[5] = {1, 2, 3, 4, 5}void main (void){

int * p,i;p=a;for (i=o;i<5;i++)

printf ( “&d”, *(p+i));}

[Type text] Visoka Poslovna škola strukovnih stuija Blace [Type text]

Page 11: Nizovi - Primena u Praksi

Nizovi – primena u praksi

Treba zapamtiti da pokazivač treba indeksirati samo kada ukazuje na niz. Pošto pokazivači ukazuju samo na prvi element ili osnovu stringa, neispravno je inkrementirati pokazivač. Mešanje pokazivača i nizova može dovesti do neočekivanih rezultata.

3. Literatura

Programski jezik C za PIC Mikrokontrolere; Wikipedia; Algoritmi i strukture podataka(prezentacija).

[Type text] Visoka Poslovna škola strukovnih stuija Blace [Type text]