Strukturni tipovi podataka

Download Report

Transcript Strukturni tipovi podataka

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


Definisanje dve varijable tipa VEKTOR



type VEKTOR = array[1 .. 10] of float;
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
Definisanje višedimenzionalnih polja
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 opseg indeksa
 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
type DATUM 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
Naredba with u Pascalu
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;
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 of char;
Skupdat = file of Skup;
Vekdat = file of Vektor;
Komdat = file of Complex;
Procedure


F^– Baferska promenljiva
EOF(F) – Funkcija kraja datoteke
GET i PUT
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.
Read i Write
Tekstualne datoteke

Datoteke čiji su elementi znaci ASCII kodirani

type Text = file of char;
Tekstualne datoteke
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
???