500 likes | 735 Views
Programski jezici. Strukturni t ipovi podataka. Strukturni t ipovi podataka. Polja Zapisi Skupovi Datoteke. Strukturni tipovi. Prisutni u svim višim programskim jezicima Nizovi Slogovi Skupovi Datoteke Pascal uvodi pojam strukturnih tipova podataka
E N D
Programski jezici Strukturni tipovi podataka
Strukturni tipovi podataka • Polja • Zapisi • Skupovi • Datoteke
Strukturni tipovi • Prisutni u svim višim programskim jezicima • Nizovi • Slogovi • Skupovi • Datoteke • Pascal uvodi pojam strukturnih tipova podataka • Jednorodne ili raznorodne strukture podataka
Polja • Jednodimenzionalne ili višedimenzionalne strukture podataka koje obuhvataju više vrednosti istog tipa • Jednodimenzionalna polja – vektori • Višedimenzionalna polja – matrice • Ključna reč array za opis polja • type VEKTOR = array[1 .. 10] of integer;
Definisanje polja • Definisanje polja VEKTOR od 10 elemenata tipa float • type VEKTOR = array[1 .. 10] of float; • Definisanje dve varijable tipa VEKTOR • var A, B: VEKTOR; • Varijable A i B odgovaraju strukturama podataka sa po 10 elemenata tipa float • Pristup komponentama vektora pomoću indeksa • A(I) – opšti slučaj • A[I] – Pascal
Pristup elementima polja • Pristup pomoću indeksa koji određuje element u okviru strukture • Indeks je u opštem slučaju celi broj • Indeks može da bude definisan i kao celobrojni izraz • A(2*I+1) • Indeksirane promenljive se koriste u programu kao i proste promenljive odgovarajućeg tipa • A(3):=0.0; • X:=A(3);
Indeksni tip • Tip indeksa u jeziku Ada može biti bilo koji diskretni tip • Intervalni tipovi u funkciji indeksa
Memorijski prostor • Polja se realizuju kao statičke strukture podataka • Unapred se rezerviše potreban memorijski prostor u memoriji računara • Granice indeksa u definiciji tipa mogu biti date i preko promenljivih i izraza čija vrednost mora biti poznata u tački definicije tipa u programu • type VEKTOR1 = array[1 .. N] of float; • type VEKTOR2 = array[N .. N+M] of float;
Dodeljivanje na nivou polja • Vektori istog strukturnog tipa mogu se dodeljivati jedan drugom, na nivou strukture ili pojedinačnih komponenti
Dodeljivanje i eksplicitna ekvivalentnost • Ako su dva vektora definisana u okviru različitih tipova koji su strukturno jednaki, sva međusobna dodeljivanja su nekorektna u slučaju eksplicitne ekvivalentnosti
Anonimne definicije strukturnih tipova • Definicija strukturnih tipova bez eksplicitnog definisanja i imenovanja tipa • Obično važi strukturna ekvivalentnost na nivou naredbi dodeljivanja, a u novije vreme eksplicitna ekvivalentnost
Neograničena polja • Mogućnost definisanja polja sa neograničenim opsegom indeksa (Ada) • Definisanje klase strukturnih tipova koja se u konkretnoj definiciji tipa bliže određuje
Neograničena polja i podtipovi • Definisanje konkretnih tipova podataka, kao podtipova tipa sa neograničenim indeksom • Podtipovi međusobno kompatibilni jer potiču od istog roditeljskog tipa
Višedimenzionalna polja • Potreba za višedimenzionalnim strukturama podataka pri rešavanju mnogih problema • Jednorodne strukture podataka • Pojedinačnim elementima se pristupa pomoću dva ili više indeksa • Dvodimenzionalne strukture – matrice za rešavanje široke klase problema sa matričnom reprezentacijom podataka
Atributi polja • Postoje u pojedinim programskim jezicima i koriste se za bliže određivanje strukture, slično kao kod elementarnih tipova podataka • Isti skup atributa se koristi za strukturni tip i za pojedinačne strukture (Ada) • A_TIP'LENGTH i A'LENGTH daju broj elemenata strukture • A_TIP'RANGE i A'RANGE daju opsegindeksa • A_TIP'FIRST i A_TIP'LAST daju prvu i zadnju vrednost indeksa • A(A_TIP'FIRST) prvi element strukture A
Zapisi • Zapisi (slogovi) su strukture podataka koje se, za razliku od polja, sastoje od komponenti (segmenata) različitog tipa. • Definišu se preko eksplicitnih definicija odgovarajućih strukturnih tipova podataka ili preko anonimnih opisa tipova.
Definisanje zapisa typeDATUM is record mesec : (jan,feb,mar,apr,maj,jun,jul,avg,sep,nov,dec); dan : integer range 1..31; godina : integer range 1900..2100; end record;
Pristup elementima zapisa • Pristup elementima preko selektora danas, sutra : DATUM; danas.mjesec := dec; sutra.dan := 14; danas.dan := sutra.dan;
Dodela vrednosti zapisu • Obično postoji mogućnost dodele vrednosti celom zapisu danas := (dec, 13, 1994); -- Najčešće se koristi danas := DATUM(dec, 13, 1994); -- Pascal danas := (mesec => dec, god => 1994, dan => 13); --Ada
Nizovi zapisa • Jednom definisani strukturni tipovi mogu se koristiti za definisanje novih strukturnih tipova type PRAZNIK is array (1..10) of DATUM; Raspust : PRAZNIK; Raspust(1) := (29, dec, 2011);
Zapisi preko zapisa • Preko već definisanih zapisa mogu se definisati novi zapisi type OSOBA is record Ime : String(1..10); Prezime : String(1..15); Dan_rodj : DATUM; end record; Student, Ja, Ti : OSOBA; Student := ("Ana", "Petrovic",(14,maj, 1970)); Ja.Dan_rodj.godina := 1953;
Zapisi sa varijantama • Definisanje zapisa sa segmentima koji se uključuju u strukturu zapisa zavisno od vrednosti nekog drugog segmenta zapisa
Student : OSOBA; with Student do with Dan_rodj do begin mesec := maj; dan := 14; godina := 1983 end; Student : OSOBA; with Student, Dan_rodj do begin mesec := maj; dan := 14; godina := 1983 end; Naredba with u Pascalu
Skupovi • Skup - više elemenata objedinjenih nekim zajedničkim svojstvom (matematika) • U programskim jezicima pojam skupa je nešto uži u odnosu na matematiku • Definisanje skupova pomoću struktura podataka i odgovarajućih strukturnih tipova (Pascal)
Skupovi – primer program Skupovi(input,output); type OsnovneBoje = (crvena, oranz, zelena, zuta, plava, violet); Boje = Set of OsnovneBoje; var Sboja, Sboja1, Sboja2 : Boje; Jednaboja : OsnovneBoje; B : Boolean; begin Sboja1 := [ crvena, zuta, violet ]; Sboja2 ;= [ ]; Sboja1 := [ crvena, zuta, violet, oranz, zelena, plava ]; Sboja2 := [ plava ]; end.
Operacije nad skupovima • Unija skupova • Presek skupova • Razlika skupova • Jednakost i nejednakost skupova • Podskupovi • Pripadnost skupu
Unija skupova Sboja1 := [ crvena, zuta, violet ]; Sboja2 := [ plava, zelena ]; Sboja := Sboja1 + Sboja2; Sboja := [ crvena, zuta, violet ] + [ plava, zelena ];
Presek skupova Sboja1 := [ crvena, zuta, violet ]; Sboja2 := [ plava, zelena, zuta ]; Sboja := Sboja1 * Sboja2;
Razlika skupova Sboja1 := [ crvena, zuta, violet ]; Sboja := Sboja1 - [ zuta, violet ];
Jednakost i nejednakost skupova Sboja1 := [ crvena, zuta, violet ]; Sboja2 := [ crvena, zuta, violet ]; Sboja := [ crvena, zuta, violet, zelena ]; B := Sboja1 = Sboja2; B := Sboja1 < > Sboja;
Podskupovi Sboja1 := [ crvena, zuta ]; Sboja2 := [ crvena, zuta, violet ]; B := Sboja1 < = Sboja2; B := Sboja2 > = Sboja1;
Pripadnost skupu Sboja1 := [ crvena, zuta ]; Sboja2 := [ crvena, zuta, violet ]; Jednaboja := violet; B := Jednaboja in Sboja1; B := Jednaboja in Sboja2;
Definisanje uslova preko skupova if (I = 215) or(I = 220) or ... or (I = 275) or(I = 280) then ... if I in [ 215, 220, 225, ..., 280 ] then ...
Datoteke • Sekvencijalne strukture jednorodnih zapisa • Jednorodne strukture slične poljima • Broj elemenata se ne definiše unapred • Podrazumeva se da datoteke fizički postoje van programa na nekom eksternom medijumu • Opisuju se sa file i postali su standardni u programskim jezicima nakon pojave ovog koncepta u Pascalu
Primeri definicija const Limit = 10; type Opseg = 1 .. Limit; Skup = set of Opseg; Vektor = array [Opseg] of real; Complex = record Re, Im : integer; end; Intdat = file of integer; Redat = file of real; Chdat = file ofchar; Skupdat = file of Skup; Vekdat = file of Vektor; Komdat = file of Complex;
Procedure • F^– Baferska promenljiva • EOF(F) – Funkcija kraja datoteke
Primer Program kojim se sadržaj datoteke A preslikava u datoteku B: program Datoteke: type Dat = file of integer; var A, B : Dat; begin reset (A); rewrite (B) ; while not EOF(A) do begin B^ := A^; GET (A); PUT(B); end; end.
Tekstualne datoteke • Datoteke čiji su elementi znaci ASCII kodirani • type Text = file of char;
Standardne datoteke INPUT i OUTPUT WRITE(CH) ekvivalentno sa WRITE(OUTPUT,CH) READ(CH) ekvivalentno sa READ(INPUT,CH) WRITELN ekvivalentno sa WRITELN(OUTPUT) READLN ekvivalentno sa READLN(INPUT) EOF ekvivalentno sa EOF(INPUT) EOLN ekvivalentno sa EOLN(INPUT)
Datoteke u C-u • FILE struktura koja je kao specijalan tip podataka definisana u stdio.h • Definicija pokazivača datoteke FILE *pok_dat; • Korišćenjem ovog pokazivača ostvaruje se pristup datoteci
Procedure u C-u • FILE *fopen(char* ime_datoteke, char* modus) • modus – znakovni niz koji pokazuje dozvoljeni način pristupa datoteci • Funkcija vraća pokazivač na datoteku koja je otvorena, ili NULL ako datoteka nije mogla da bude otvorena FILE *pok_dat; pok_dat = fopen("datul","r");
Procedure u C-u • int fclose(FILE *pok_datoteke) Ovom funkcijom se prekida veza koja postoji između pokazivača datoteke i imena datoteke. Ukoliko je zatvaranje izvršeno uspešno, povratna vrednost ove funkcije je 0.
Procedure u C-u • Standardna funkcija za čitanje jednog znaka (bajta) iz datoteke int fgetc(FILE *pok_dat) • Funkcije za upis jednog znaka (bajta) u datoteku int fputc(char c,FILE *pok_dat) Rezultat funkcije je upisani znak. • Funkcija za čitanje jednog reda iz tekstualne datoteke char *fgets(char *s, int maxbr, FILE *pok_dat) Učitava jedan red (niz znakova do znaka ‘\n’) iz datoteke na koju ukazuje pok_dat. s je niz u koji se smešta učitani red, a maxb-1 je maksimalni broj znakova koji se mogu učitati. • Funkcija za upis jednog reda u tekstualnu datoteku char *fputs(char *s, FILE *pok_dat)
Procedure u C-u • Funkcija za formatirano čitanje podataka iz tekstualne datoteke int fscanf(FILE *pok_dat,char *format [,arg]…) • Funkcija za formatirani upis podataka u tekstualne datoteke int fprintf(FILE *pok_dat,char *format [,arg]…)
Procedure u C-u • Funkcija za binarno čitanje int fread(void *ulaz, long vel, long br, FILE *uldat) Iz binarne datoteke na koju ukazuje pok_dat učitava se br podataka veličine vel bajtova i to smešta počev od lokacije na koju ukazuje pokazivač ulaz. • Funkcija za binarni upis int fwrite(void *izlaz, long vel, long br,FILE *izdat) U binarnu datoteku na koju ukazuje pok_dat upisuje se br podataka veličine vel bajtova. izlaz je početna adresa od koje su smešteni podaci koji se prenose u datoteku.
Pitanja ???