4 IZVEDENI TIPOVI Sadraj tip niza tip stringa

  • Slides: 32
Download presentation
4 IZVEDENI TIPOVI

4 IZVEDENI TIPOVI

Sadržaj • • tip niza tip stringa tip sloga (strukture) tip unije 2

Sadržaj • • tip niza tip stringa tip sloga (strukture) tip unije 2

Tip niza • tip niza predstavlja sredstvo za grupisanje više vrednosti istog tipa, tako

Tip niza • tip niza predstavlja sredstvo za grupisanje više vrednosti istog tipa, tako da im se pristupa na osnovu pozicije, tzv. indeksiranjem • same vrednosti mogu biti proizvoljnog tipa (baznog ili izvedenog) • nizovi baznih tipova zovu se jednodimenzioni nizovi ili vektori, a nizovi takvih nizova nose naziv matrice • memoriju za niz zauzima kompajler u fazi prevođenja i ona se ne može menjati u toku izvršenja programa 3

Definisanje niza • Niz se definiše iskazom tip ime. Niza[duzina]; gde je tip elemenata

Definisanje niza • Niz se definiše iskazom tip ime. Niza[duzina]; gde je tip elemenata niza, a konstantni izraz duzina predstavlja najveći mogući broj elemenata niza. • primer: iskazom int vek[50]; definiše se niz vek čiji su elementi tipa int i ne može ih biti više od 50. 4

Smeštanje niza u memoriju • Na osnovu dužine i veličine u bajtovima svakog elementa

Smeštanje niza u memoriju • Na osnovu dužine i veličine u bajtovima svakog elementa (određuje se iz tipa elementa), kompajler rezerviše memoriju za niz. Niz se smešta u jedinstvenu zonu operativne memorije. • Dakle, za niz vek biće rezervisan memorijski prostor veličine 50 * l(int) gde je l(int) veličina podataka tipa int u bajtovima 5

neaktuelni elementi . . . . prvi element poslednji element • tokom izvršenja programa,

neaktuelni elementi . . . . prvi element poslednji element • tokom izvršenja programa, memorija ne može da se menja • dakle, broj aktuelnih elemenata niza vek može biti manji od 50, ali veći ne! • zaključak: niz treba tretirati kao rezervisani memorijski prostor u kojem su (ređe) svi ili (najčešće) samo neki elementi aktuelni 6

Nizovi i simboličke konstante • Za zadavanje dužine niza (naročito ako se koristi više

Nizovi i simboličke konstante • Za zadavanje dužine niza (naročito ako se koristi više nizova iste dužine) koriste se simboličke konstante: #define MAX_EL 100 ………………… int niz 1[MAX_EL]; • za zadavanje dužine niza ne mogu se koristiti zaključane promenljive, jer one po prirodi nisu konstante nego – promenljive. 7

Pristup elementima niza • nizom se može rukovati isključivo preko pojedinačnih elemenata; dodela nizu

Pristup elementima niza • nizom se može rukovati isključivo preko pojedinačnih elemenata; dodela nizu nije dozvoljena ni u jednom procedurnom programskom jeziku, pa ni u C-u • elementima niza pristupa se operacijom koja nosi naziv indeksiranje • operator indeksiranja je binaran, sa nizom kao levim operandom, a indeksom kao desnim. Oznaka operatora je [], a ispisuje se oko desnog operanda 8

desni operand ime. Niza[indeks] • najmanja vrednost indeksa je 0; najveća vrednost indeksa je

desni operand ime. Niza[indeks] • najmanja vrednost indeksa je 0; najveća vrednost indeksa je duzina-1 0 ≤ indeks ≤ duzina-1 • indeks je unsigned izraz; u praksi se najčešće koriste int izrazi (kompatibilni su sa unsigned) • kompajler računa adresu elementa po formuli levi operand adr(ime. Niza[indeks]) = adr(ime. Niza[0]) + indeks*l (tip) • u toku izvršenja programa "proboj" indeksa (izlazak iz opsega) se ne proverava, što znatno ubrzava indeksiranje, ali ako dođe do proboja posledice su nepredvidive! 9

int vek[50], vek 1[50], i, j; ……………… vek[15] vek 1[0] vek[i] vek 1[2*i-j+1] vek[50]

int vek[50], vek 1[50], i, j; ……………… vek[15] vek 1[0] vek[i] vek 1[2*i-j+1] vek[50] //greska, ali nece biti prijavljena vek = vek 1; //dodela nije dozvoljena 10

Inicijalizacija niza • niz se može inicijalizovati inicijalizatorom ={vr 1, vr 2, …, vrn}

Inicijalizacija niza • niz se može inicijalizovati inicijalizatorom ={vr 1, vr 2, …, vrn} gde su vr 1, vr 2, …, vrn konstantne vrednosti koje se dodeljuju elementima niza pri kompilaciji • primeri: int i. Niz[4] = {3, -1, 10, 20}; //i. Niz[0]=3, i. Niz[1]=-1, i. Niz[2]=10, i. Niz[3]=20 double db[10] = {1. 3, -0. 5}; //db[0]=1. 3, db[1]=-0. 5, ostali nedefinisani int in[] = {10, 25, 2, 8, 19} ; //in dobija duzinu 5 sic! 11

Multiindeksni tipovi • niz baznih tipova nosi naziv vektor; nizovi čiji su elementi nizovi,

Multiindeksni tipovi • niz baznih tipova nosi naziv vektor; nizovi čiji su elementi nizovi, nizovi nizova itd. zovu se multiindeksni ili multidimenzionalni tipovi • najpoznatiji multiindeksni tip je niz vektora koji nosi naziv matrica (nizovi sa više od 2 dimenzije se retko koriste) • definicija multiindeksnog tipa: tip ime[duzina 1][duzina 2]…[duzinak]; • indeksiranje: • ime[indeks 1][indeks 2]…[indeksk] 12

Matrica • definicija: tip ime. Matrice[duzina 1][duzina 2]; • indeksiranje ime. Matrice[indeks 1][indeks 2]

Matrica • definicija: tip ime. Matrice[duzina 1][duzina 2]; • indeksiranje ime. Matrice[indeks 1][indeks 2] • pošto je matrica nizova, izraz oblika ime. Matrice[indeks] je dozvoljen i po tipu je niz (predstavlja vrstu matrice) 13

smeštanje matrice u memoriju • kompajler pakuje matricu, tj. seče je po vrstama i

smeštanje matrice u memoriju • kompajler pakuje matricu, tj. seče je po vrstama i smešta sukcesivno u memoriju poslednja vrsta nulta vrsta . . . . vrsta • ako je definisana matrica double m[MAXV][MAXK]; //MAXV I MAXK su simbolicke konstante adresa elementa sa indeksima i i j računa se formulom adr(m[i][j]) = adr(m[0][0])+(i*MAXK+j)*l(double) uočiti: prva dimenzija MAXV se ne koristi u formuli 14

inicijalizacija matrice • matrica se inicijalizuje kao i svaki drugi niz, uzimajući u obzir

inicijalizacija matrice • matrica se inicijalizuje kao i svaki drugi niz, uzimajući u obzir to da je svaki član takvog niza takođe niz • primer: int mtr[2][3]={{2, 6, -1}, {3, 8, 2}}; 15

Tip stringa • tip stringa, kao takav, jeste tekstuelni tip, tj. tip čije su

Tip stringa • tip stringa, kao takav, jeste tekstuelni tip, tj. tip čije su konstante tekstovi • u C-u, tip stringa realizuje se kao specijalni znakovni niz • dakle, znakovni niz u C-u pojavljuje se u dve uloge: – u ulozi (običnog) niza čiji su elementi znakovnog tipa i – u ulozi stringa 16

String-konstante • Specifičnost znakovnog niza u ulozi stringa. Oblik: "sadrzaj stringa" Na primer, "Jovan

String-konstante • Specifičnost znakovnog niza u ulozi stringa. Oblik: "sadrzaj stringa" Na primer, "Jovan Jovic" • Mogu se upotrebiti za inicijalizaciju char ime[] = "Jovan Jovic"; 17

Memorisanje stringa • Kada je znakovni niz u ulozi stringa, iza poslednjeg aktuelnog znaka

Memorisanje stringa • Kada je znakovni niz u ulozi stringa, iza poslednjeg aktuelnog znaka umeće se znak ''. char niz kao string char ime[12]="Ana Peric"; 'A' 'n' 'a' '' 'P' 'e' 'r' 'i' 'c' '' char ime[12]={'A', 'n', 'a', 'P', 'e', 'r', 'i', 'c'}; 'A' 'n' 'a' '' 'P' 'e' 'r' 'i' običan char niz 'c' 18

 • za ulaz-izlaz stringova postoji posebna konverziona specifikacija %s • operacije nad stringovima

• za ulaz-izlaz stringova postoji posebna konverziona specifikacija %s • operacije nad stringovima (spajanje ili konkatenacija, kopiranje, brisanje podstringa, dodavanje podstringa, određivanje dužine stringa itd. ) izvedene su kao funkcije i nalaze se u biblioteci čije je zaglavlje <string. h> 19

Tip sloga (strukture) • tip sloga ili zapisa generalno predstavlja sredstvo za grupisanje više

Tip sloga (strukture) • tip sloga ili zapisa generalno predstavlja sredstvo za grupisanje više vrednosti različitog tipa, sa svrhom da posluži za opis entiteta; u C-u se za tip sloga (iz nejasnih razloga) koristi termin struktura • elementi su semantički nesamostalni; da bi se to podvuklo, umesto termina "element" koristi se termin polje • polja strukture mogu biti proizvoljnog tipa (baznog ili izvedenog) • memoriju za strukturu zauzima kompajler u fazi prevođenja i ona se ne može menjati u toku izvršenja programa 20

Definisanje strukture • ključna reč struct zajednička je za sve strukture (kao kod enumeracije

Definisanje strukture • ključna reč struct zajednička je za sve strukture (kao kod enumeracije reč enum) • shodno tome, postoje ista tri načina za definisanje sloga: – direktno – primenom taga – primenom typedef 21

Opšta šema (sa npr. tagom): struct tag { tip 1 p 1, p 2

Opšta šema (sa npr. tagom): struct tag { tip 1 p 1, p 2 , …, pk; polja tipa tip tip 2 q 1, q 2 , …, qm; tip 3 r 1, r 2 , …, rn; polja tip …………. . }; gde su tip 1, . . . tipovi polja, a p 1, … q 1, … r 1, … njihovi nazivi 1 2 3 22

 • direktno struct {int i; double a, b; char ch; } s 1,

• direktno struct {int i; double a, b; char ch; } s 1, s 2; • sa tagom struct tck { char oznaka; //polje tipa char double x, y; //dva polja tipa double }; ………………. struct tck t 1, t 2; //definisanje promenljivih 23

 • sa typedef struct { char ime[15]; char prezime[30]; unsigned godrodj; } Osoba;

• sa typedef struct { char ime[15]; char prezime[30]; unsigned godrodj; } Osoba; ………… Osoba pers 1, pers 2; 24

Rukovanje strukturama • pristup poljima: pomoću operatora koji se zove selektor i predstavlja simbolom.

Rukovanje strukturama • pristup poljima: pomoću operatora koji se zove selektor i predstavlja simbolom. (tačka) ime. Sloga. ime. Polja • primer: pers 1. godrodj pers 2. ime pers 2. prezime[5] 25

 • operator dodele = jeste definisan za strukture struct tck t 1, t

• operator dodele = jeste definisan za strukture struct tck t 1, t 2; t 2. oznaka='a'; t 2. x=4. 2; t 2. y=-0. 5; t 1 = t 2; //polja t 2 se kopiraju u odgovarajuca polja t 1 'a' 4. 2 -0. 5 t 1 t 2 26

 • struktura se može inicijalizovati, istim konstruktom kao i niz ={vr 1, vr

• struktura se može inicijalizovati, istim konstruktom kao i niz ={vr 1, vr 2, . . . , vrn} gde su vr 1, vr 2, . . . , vrn konstantne vrednosti koje se dodeljuju poljima redom kojim su polja definisana • primer: struct tck t = {'b', 0. 8, -2. 4}; gde će biti: t. oznaka='b' t. x=0. 8 t. y=-2. 4. 27

Tip unije • u formalnom smislu (sintaksno) definiše se i koristi isto kao i

Tip unije • u formalnom smislu (sintaksno) definiše se i koristi isto kao i struktura; razlika je samo u ključnoj reči koja je kod unije union (umesto struct), sve ostalo je isto • po pitanju ponašanja, potpuno se razlikuje od strukture 28

struct str { char c; int i; double d; }. . . . struct

struct str { char c; int i; double d; }. . . . struct str s; union un { char c; int i; double d; }. . . . union un u; d i c i polja dele memoriju d c 29

 • polja unije dele memorijski prostor (jednak najdužem polju) što u potpunosti menja

• polja unije dele memorijski prostor (jednak najdužem polju) što u potpunosti menja ponašanje odgovarajućih promenljivih! • ređe se koriste, a tipična primena je reinterpretacija memorijskog prostora //Pretpostavka: unsigned short zauzima 2 bajta, a unsigned char 1 bajt union reg { unsigned short rec; unsigned char bajt[2]; //bajt[0] je nizi bajt rec, a bajt[1] je visi bajt rec }; 30

int main() { union registar; registar. rec = 0 x. A 15 D; printf("Rec:

int main() { union registar; registar. rec = 0 x. A 15 D; printf("Rec: %Xn", registar. rec); printf("Bajtovi: %X %Xn", registar. bajt[0], registar. bajt[1]); return 0; registar. rec } izlaz: Rec: A 15 D 5 D A 1 smer rasta adresa Bajtovi: 5 D A 1 registar. bajt[0] registar. bajt[1] 31

Rezime • niz objedinjava elemente istog tipa, sa mogućnošću pristupa indeksiranjem • niz skalara

Rezime • niz objedinjava elemente istog tipa, sa mogućnošću pristupa indeksiranjem • niz skalara zove se vektor, a niz vektora zove se matrica • memoriju za niz zauzima kompajler i ona se ne može menjati u toku izvršavanja programa • string je tekstuelni tip koji se u C-u realizuje preko specijalnog znakovnog niza • tip sloga (strukture) služi za objedinjavanje elemenata (polja) različitog tipa u svrhu opisa odgovarajućeg entiteta • unija objedinjuje polja različitog tipa, s tim što polja dele memorijski prostor 32