You are on page 1of 24

C/C++

PROGRAMSKI JEZIK C
Strukture Unije i Nabrajanja
Strukture Unije i Nabrajanja
 Struktura je kolekcija podataka, ne obavezno istog
tipa
 Unija je slična strukturi sem što elementi unije dele
isti memorijski prostor, pa je u datom trenutku u uniji
smešten samo jedan podatak
 Nabrajanje je imenovana kolekcija celobrojnih
vrednosti
Strukture
 Do sada smo od strukturnih podataka koristili jedino niz
kao kolekciju podataka istog tipa
 Niz je uređena kolekcija pa se pojedinom elementu
pristupalo preko imena niza i njegove pozicije u nizu
 Komponente (elementi) structure mogu biti različitog
tipa
 Pristup pojedinoj komponenti se obezbeđuje tako što se
svakoj komponenti dodeljuje ime
 Pristup se dalje vrši preko imena strukture i imena
komponente
Deklaracija promenljive tipa strukture
 Kada se radi o uzajamno povezanim podacima onda je struktura
logičan izbor
struct racun {
int broj_racuna;
char ime[80];
float stanje;
} racun1, racun2;
 na ovaj način deklarisane su promenljive racun1, racun2 tipa strukture
 Sekcija struct {….}
 Specificira tip podataka, za kojom sledi lista promenljivih razdvojenih
zarezima
 Komponente strukture se smeštaju u memoriju po redosledu navođenja

… … … … …

broj_racuna ime stanje


Deklaracija promenljive tipa structure
 Svaka struktura uvodi novi prostor imena (za svoje komponente)
struct { struct { imena komponenata
int broj; int broj; mogu biti imena koja
char ime[80]; char ime[80]; već imaju neko značenje u
float stanje; char pol; ostatku programskog teksta
} racun1, racun2; } zaposleni1, zapoleni2;

 Komponente ime i broj u strukturama racun1 i racun2 nisu u konfliktu sa


imenima komponenata u strukturama zapoleni1, zapoleni2
Inicijalizacija promenljive tipa strukture
 Slično kao i niz i promenljiva tipa strukture se može inicijalizovati zajedno sa
deklaracijom struct {
int broj;
char ime[80];
float stanje;
} racun1={23578, “Mitic Mita”, 150.} ,
racun2 ={3186, “Jelic Jela”, 870.5};
 Vrednosti u listi inicijalizatora se zadaju u istom redosledu kao i komponente strukture
 Inicijalizatori moraju biti konstantni izrazi
 Ako je broj inicijalizatora manji od broja komponenata strukture ostatak
komponenata se inicijalizuje vrednošću 0
 Za inicijalizaciju strukture se može koristiti i označeni inicijalizator
 svakoj vrednosti u listi prethodi karakter . naziv komponente i karakter =
{.broj=3186, .ime=“Jelic Jela”, .stanje=870.5}
Inicijalizacija promenljive tipa strukture

 U slučaju označenog inicijalizatora redosled vrednosti


ne mora odgovarati redosledu komponenata strukture
{.ime=“Jelic Jela”, .broj=3186, .stanje=870.5}

 Dalje ne moraju svi inicijalizatori u listi inicijalizatora biti


označeni
{.broj=3186, “Jelic Jela”, .stanje=870.5}

 Pretpostaviće se da se neoznačenim inicijalizatorom “Jelic


Jela” inicijalizuje komponenta koja sledi posle komponente
sa nazivom broj
 Komponente strukture koji nisu obuhvaćene nekim
inicijalizatorom se postavljaju na vrednost 0
Operacije na strukturama
 Najčešća operacija pri radu sa nizovima je indksiranje niza
(selekcija pojedinog elementa niza na osnovu njegove pozicije)
 Slično je i sa strukturama
 selekcije pojedine komponente strukture se vrši preko imena strukture i
imena komponente
printf(“Broj Racuna: %d\n”, racun1.broj);
printf(“Vlasnik Racuna: %s\n”, racun1.ime);
printf(“Stanje na Racunu: %f\n”, racun1.stanje);

 Komponente structure su l-vrednosti pa mogu biti levi argument


operatora dodeljivanja
racun1.broj=258;
racun1.stanje=0.0;
 Karakter . koji se koristi za pristup komponenti strukture je operator .
 Operator . ima isti prioritet kao i postfiksni ++, -- operatori (višeg je
prioriteta od skoro svih operatora C jezika)
scanf(“%d”, &racun1.broj); scanf(“%d”, &(racun1.broj));
Operacije na strukturama
 Sledeća najčešća operacija nad strukturama je dodeljivanje
racun2=racun1;
 Bočni efekat ovog izraza je kopiranje vrednosti komponenata strukture racun1 u
odgovarajuće komponente strukture racun2
 U slučaju da je komponenta strukture niz kopiraće se i kompletan niz
 Kopiranje nizova direktno nije dozvoljeno sem ako se niz ne zaokruži
fiktivnom strukturom
int a1[10], a2[10]; struct {int a[10]} a1, a2;
… ….
a2=a1; /* GRESKA */ a2=a1; /* U REDU */

 Operator dodeljivanja se može koristiti na strukturama koje su


kompatibilnog tipa
 Strukture deklarisane istovremeno (racun1 i racun2) su
kompatibilnog tipa
 Ovo su jedine operacije na strukturama
Struktura kao tip podataka
 Navedeni način deklarisanja promenljive strukture je u redu sve dok se sve
promenljive deklarisu na istom mestu
 Problem nastaje ako se promenljive istog tipa strukture deklarišu u različitim
delovima programskog teksta
 Na ovaj način se povećava dužina programskog
struct { teksta kao i mogućnost greške
int broj;  Promenljive racun1 i racun2 se ne tretiraju kao
char ime[80]; promenljive istog (ili kompatibilnog) tipa
float stanje;  Tip pdataka promenljivih racun1 i racun2 nema ime
} racun1;  Promenljive racun1 i racun2 ne mogu biti argumenti
… neke funkcije
struct {  Potrebno je odgovarajućem tipu podataka
int broj; pridruziti ime
char ime[80];  To se moze izvesti na dva nacina
float stanje;  deklaracijom imena structure
} racun2;  definicijom tipa structure
Deklaracija imena strukture
struct racun {  Deklaracija promenljivih se može
int broj; izvršiti zajedno sa deklaracijom
char ime[80]; imena structure
float stanje;
struct racun {
};
int bkoj;
 Zatim se promenljive deklarišu char ime[80];
na sledeći način float stanje;
} racun1, racun2;
struct racun racun1, racun2;
 Promenljive deklarisane kao
 Ključna reč struct se ne može promenljive tipa strukture sa istim
ispustiti imenom su kompatibilnog tipa
struct racun racun1={23578, “
Mitic Mita”, 150.};
struct racun racun2;
racun2=racun1;
Definicija tipa structure
 Naredbom typedef se može definisati ime tipa podataka
typedef struct {
int broj;
char ime[80];
float stanje;
} racun;
 Ime stukture definisano typedef naredbom se navodi na
kraju
racun racun1, racun2;
 Sada se tip racun može korstiti kao i bilo koji ugrađeni tip
podataka
 Sve promenljive tipa racun su kompatibilnog tipa, bez
obzira u kom delu programskog teksta bile deklarisane
Struktura kao argument i povratna
vrednost funkcije
 Funkcija može imati argument koji je tipa strukture, odnosno povratna
vrednost funkcije može biti tipa strukture
void print_racun(struct racun r) {
printf(“Broj Racuna: %d\n”, r.broj);
printf(“Vlasnik Racuna: %s\n”, r.ime);
printf(“Stanje na Racunu: %f\n”, r.stanje);
}
struct racun create_racun(int broj, const char *ime, float stanje) {
struct racun r;
r.broj=broj;
strcpy(r.ime, ime);
r.stanje=stanje;
}
 Pozivi bi bili

print_racun(racun1); racun1=create_racun(23578, “Mitic Mita”, 150.);


Struktura kao argument i povratna
vrednost funkcije
 Prenos argumenata u funkciju se vrši po vrednosti
U slučaju da su argumenti funkcije strukture kopiranje
istih moze biti zahtevna operacija
 U tom slučaju efikasnije je za argument uzeti
pokazivace na strukture
 Slično da bi izbegli kopiranje povratne vrednosti koja
je tipa structure, efikasnije je realizovati povratnu
vrednost funkcije kao pokazivač na strukturu
Unije
 Unija je slično strukturi kolekcija podataka ne obavezno istog tipa
 Razlika je što se u slučaju unije alocira prostor samo za najzahtevniju
komponentu i sve komponente unije dele taj prostor
 Promenom vrednosti neke komponente menja se vrednost svih komponenti
union { struct {
int I; int I;
double d; double d;
} u; } s;

 Komponente strukture se smeštaju na različitim adresama dok se


komponente unije smeštaju na istoj adresi
i

u
d
s

i d
Unije
 Komponentama unije se pristupa na isti način kao
komponentama strukture
u.i=82;
u.d=74.8;

 Rad sa unijom je skoro identičan radu sa strukturom


 Može se
 deklarisati ime unije ili
 definisati tip podataka koji je unija
 Kao i strukture, unije se mogu
 kopirati korišćenjem operatora dodeljivanja =
 prenositi u funkciju kao argument ili biti povratna vrednost funkcije
 Unije se inicijalizuju na sličan način kao i strukture s tom razlikom
što se inicijalizuje samo prva komponenta unije
Unije
union { union {
int I; int I;
double d; double d;
} u={0}; } u={.d=1.0};
 Konkretna komponenta unije se inicijalizuje označenim inicijalizatorom
 Unutar unije samo jedna komponenta je trenutno aktivna, potreban je
mehanizam kako ustanoviti o kojoj komponenti je reč
#define INT_KIND 0 n.kind=INT_KIND;
#define DOUBLE_KIND 1 n.u.i=82;
typedef struct {
int kind; void print_number(number n) {
union { if(n.kind==INT_KIND)
int i; printf(“%d”, n.i);
double d; else
} u; printf(“%f”, n.d);
} number;
Nabrojivi tipovi podataka
 Čest je slučaj da neka promenljiva može imati neku od
malog broja vrednosti
 Boja u kartama je neka od {pik, karo, herc, tref}
 logička vrednost je neka od {netacno, tacno}
 Očigledno rešenje je reprezentacija ovog skupa
vrednosti nekim skupom celobrojnih vrednosti
int s; /* boja u kartama */
s=2; /* 2 je herc */

 Ovaj pristup daje nečitljiv kod (ne vidi se koje su moguće


vrednosti za s)
 Nešto bolje rešenje je uvođenje simboličkih konstanti
Nabrojivi tipovi podataka

#define BOJA int


#define PIK 0
#define KARO 1
#define HERC 2
#define TREF 3
Sada bi mogli pisati
BOJA b;
b=HERC;

 Mana ovog rešenja je što što nije očigledno da su PIK, KARO, HERC, TREF
vrednosti istog tipa podataka BOJA
 C jezik obezbeđuje poseban tip podataka za promenljive koje mogu uzeti
neku od malog broja vrednosti
 Nabrojivi tip ili nabrajanje je korinički definisani tip podataka čiji skup
vrednosti zadaje programer i pri tome se svakoj vrednosti dodeljuje ime
Nabrojivi tipovi podataka
enum {PIK, KARO, HERC, TREF} b1, b2;

 Za razliku od struktura i unija koje formiraju nov prostor imena


identifikatori konstanti nabrojivog tipa se ne smeju poklapati sa
ostalim identifikatorima u pripadajućoj oblasti važenja
 Konstante nabrojivog tipa su slične simboličkim konstantama koje se
uvode #define direktivom
 Razlika između konstanti nabrojivog tipa i simboličkih konstanti je u
oblasti važenja
 Ako je nabrojiv tip podataka deklarisan u telu funkcije
 Oblast važenja identifikatora konstanti nabrojivog tipa je telo te funkcije
(blok oblast važenja)
 Oblast važenja simboličke konstante je od mesta uvođenja do kraja
datoteke (datotečna oblast važenja)
Nabrojivi tipovi podataka
 Slično kao u slučaju struktura i unija zadavanje imena
nabrojivom tipu podataka se može izvesti na dva načina
 Deklaracijom imena nabrojivog tipa podataka
 Definicijom imena nabrojivog tipa podataka
 Deklaracija imena nabrojivog tipa je
enum boja {PIK, KARO, HERC, TREF};
 Dalje se promenljive deklarišu na sledeći način
enum boja b1, b2;
 Definicija imena nabrojivog tipa je
typedef enum {PIK, KARO, HERC, TREF} boja;
 Promenljive se deklarišu na sledeći način
boja b1, b2;
Nabrojivi tip podataka kao skup
celobrojnih vrednosti
 Vrednosti promenljivih i konstanti nabrojivog tipa podataka tretiraju se kao
celobrojne vrednosti
 Posebno vrednosti 0, 1, 2, … se redom pridružuju konstantama nabrojivog
tipa podataka
 U nabrojivom tipu podataka boja, konstantama PIK, KARO, HERC, TREF se
redom pridružuju vrednosti 0, 1, 2, 3
 Ovo podrazmevano pridruživanje se može izmeniti na sledeći način
enum boja {PIK=1, KARO=2, HERC=3, TREF=4};
 Dalje vrednosti konstanti nabrojivog tipa mogu biti proizvoljne i izlistane u
proizvoljnom redosledu
enum odeljenje {RAZVOJ=20, PROIZVODNJA=10, PRODAJA=25};
 Dozvoljeno je da dve ili više konstanti imaju istu vrednost
 Ako se ne specificira vrednost za konstantu nabrojivog tipa podataka,
njena vrednost je za jedan veća od vrednosti prethodne konstante
 Prva konstanta, ako se ne specificira njena vrednost, ima vrednost 0
Nabrojivi tip podataka kao skup
celobrojnih vrednosti
 Vrednosti nabrojivog tipa podataka se tretiraju kao
celobrojne vrednosti
 dozvoljeno je njihovo kombinovanje
int i;
enum {PIK, KARO, HERC, TREF} s;
i=KARO; /* i=1 */
s=0; /* s=PIK */
s++; /* s 1(KARO) */
i=s+2; /* i 3 */
Zadaci za vežbu
1. Definisati strukturu datum, a zatim funkcije
a) int day_of_year(struct dat d)
b) int compare(struct date d1, struct date d2)
2. Definisati strukturu vreme zatim funkciju
 struct time split(long total_seconds)
3. Strukturu razlomak a zatim funkcije za elementarne
operacije nad razlomcima
4. Strukturu tačka (x,y), a zatim strukturu pravougaonik
sa dve komponente gornja leva i donja desna tačka
 A zatim funkcije površina, centar, da li tačka pripada …

You might also like