Programski jezik C –strukturepoincare.matf.bg.ac.rs/.../Programski_jezik_C_strukture.pdf · 2018....

Post on 22-Apr-2021

3 views 0 download

Transcript of Programski jezik C –strukturepoincare.matf.bg.ac.rs/.../Programski_jezik_C_strukture.pdf · 2018....

Programski jezik C – strukture

2/28

Ugrađeni osnovni tipovi

Celobrojni – short, int, long, long long Realni – float, double, long double Znakovni - char

3/28

Složeni tipovi

Nizovi, niske

Ali i ...

Korisnički definisani tipovi: strukture, unije, polja bitova, nabrojivi tipovi

4/28

Strukture

Struktura u C-u je kolekcija jedne ili više promenljivih ne obavezno istih tipova, povezanih i grupisanih pod istim imenom radi lakšeg rada.

Komponente strukture u C-u se nazivaju članovima.

5/28

Strukture

Na primer, struktura je slog o osobi: sadrži članove ime, adresu, broj lične karte (ili matični broj), itd.

Neki od članova mogu opet biti strukture (npr. ime ili adresa).

6/28

Strukture: primer Struktura tačka:

struct tacka {int x;int y;

} Struktura je i pravougaonik (stranica paralelnih koordinatnim

osama), sa komponentama - parom tačaka t1, t2 (donje levo i gornje desno teme), itd:

struct pravoug {struct tacka t1;struct tacka t2;

};

7/28

Strukture: primer

Mogu sadržati promenljive proizvoljnog tipa Na primer, moguće je definisati strukturu koja sadrži i niz

struct student {char ime[50];float prosek;

};

8/28

Deklaracija promenljivih tipa strukture

struct tacka a, b, c;

9/28

Strukture - deklaracija Deklaracija strukture definiše tip; On može da bude eksplicitno imenovan – kao u prethodnom

primeru tip tacka, i to eksplicitno ime može se koristiti kasnijekao skraćenica za oznaku tog tipa strukture

Uz deklaraciju strukture (ili skraćenicu tipa koji definiše struktura) mogu se navesti promenljive odgovarajućeg tipa kojidefiniše struktura

Na primer, deklaracijomstruct {

int x;int y;

} a, b, c;

10/28

Inicijalizacija

Struktura se može inicijalizovati navođenjem vrednostikomponenti - konstantnih izraza, npr.

struct tacka t = {100,100 };

11/28

Pristup članovima strukture Obraćanje članu strukture vrši se navođenjem imena strukture i

imena člana razdvojenih tačkom (.) Na primer,

printf("%d,%d", t.x, t.y); ili, za promenljivu s tipa pravoug,

struct pravoug s; oznaka s.t1.x označava x-koordinatu donjeg levog temena

pravougaonika s

Operator ., iako binaran, najvišeg je prioriteta (istog nivoa kaomale zagrade i unarni postfiksni operatori)

12/28

Strukture i funkcije Operacije nad strukturom su kopiranje i dodela vrednosti,

uzimanje adrese strukture operatorom & (operacije nad strukturom kao celinom), i obraćanje članovima strukture

Zato se strukture mogu pojaviti kao argumenti funkcije (kopiranje) odnosno kao vrednost koju funkcija vraća (dodela)

Strukture se ne mogu porediti Strukture kao argumenti funkcije mogu se prenositi kao celine,

prenosom komponenti ili prenosom adrese strukture (pokazivača na strukturu)

Vrednost funkcije takođe može biti tipa strukture ili pokazivača na strukturu

13/28

Strukture i funkcije - primeri Na primer, funkcija izgtacka izgrađuje tačku od njenih

koordinata x i y (argumenti su tipa int a vrednost koju funkcijavraća je tipa struct tacka):

/ izgtacka: izgrađuje tacku od komponenata x i y /struct tacka izgtacka(int x, int y){ struct tacka priv;

priv.x = x;priv.y = y;return priv;

}

14/28

Strukture i funkcije

Funkcija za sabiranje dve tačke ima i argumente i vrednost tipastrukture tacka:

/ sabtacaka: sabira dve tacke /struct tacka sabtacaka(struct tacka t1, struct tacka t2){

t1.x += t2.x;t1.y += t2.y;return t1;

}

15/28

Strukture i funkcije Funkcija tacuprav testira da li je zadata tačka u unutrašnjosti

zadatog pravougaonika argumenti su tipa struktura tacka odnosno pravoug, a funkcija

vraća ceo broj - rezultat testa):

/ tacuprav: vraca 1 ako je tačka t u pravougaoniku p, 0 inače /int tacuprav(struct tacka t, struct pravoug p){

return t.x > p.t1.x && t.x < p.t2.x && t.y > p.t1.y && t.y < p.t2.y;

}

16/28

Strukture i funkcije / prenos parametara Prenos parametara po vrednosti… Primer:

struct razlomak {int brojilac;int imenilac;

}; Šta nije u redu sa narednim kodom?

void skrati(struct razlomak r) {int n = nzd(r.brojilac, r.imenilac);r.brojilac /= n; r.imenilac /= n;

}

17/28

Nizovi struktura Ako treba da obrađujemo veći broj struktura istog tipa, možemo

da uvedemo onoliko nizova koliko članova ima struktura, ili da uvedemo niz struktura.

Na primerstruct opis_meseca {

char ime[10];int broj_dana;

}; ... struct opis_meseca meseci[13];

18/28

Nizovi struktura - inicijalizacija Moguća je i deklaracija sa inicijalizacijom (u kojoj nije

neophodno navođenje broja elemenata niza)struct opis_meseca meseci[] = {

{ "",0 },{ "januar",31 },{ "februar",28 },{ "mart",31 },...{ "decembar",31 }

};

19/28

Primer

Nakon navedene deklaracije, ime i-tog meseca u godini se može dobiti sa meseci[i].ime, njegov broj dana sa meseci[i].broj_dana

Broj elemenata ovako inicijalizovanog niza može se izračunati nasledeći način:

sizeof(meseci)/sizeof(struct opis_meseca)

20/28

Unije Unije i polja bitova predstavljaju načine uštede memorije Unije su donekle slične strukturama, ali podaci koji se čuvaju u

njima dele isti memorijski prostor.union u_obelezje {

int ivred;float fvred;

} ;union u_obelezje u;u.ivred=15;

Iste operacije kao nad strukturom: dodela vrednosti i kopiranje (unije kao celine), uzimanje adrese i pristup

clanovima

može da se inicijalizuje samo vrednošću tipa svog prvog člana

21/28

Polja bitova Polja bitova se koriste da bi vrednosti za koje se unapred zna da imaju

veoma mali opseg, zauzimale samo odgovarajući broj bitova, a ne i cele bajtove

Gotovo sve zavisno od implementacije Primer: struct osobine_pravougaonika {

unsigned int popunjen : 1;unsigned int boja : 3;unsigned int vrsta_okvira : 2;};...#define ZELENA 2...#define PUN 0struct osobine_pravougaonika op;op.popunjen = 0; op.boja = ZELENA; op.vrsta_okvira = PUN;

22/28

Nabrojivi tipovi - enum

Tip podataka sa malim skupom dopustivih vrednosti Primer:

enum znak_karte {KARO,PIK,HERC,TREF};

23/28

Enum - primeri

Sastoje se od nabrojivih konstanti sa celobrojnim vrednostima (od 0 do broja konstanti - 1, što se podrazumeva, ili sa vrednostima kojesu tim konstantama eksplicitno dodeljene).

Na primer,enum boolean {NE, DA};

je nabrojivi tip nazvan boolean sa dve nabrojive konstante od kojihprva (NE) ima vrednost 0 a druga (DA) vrednost 1.

U primeruenum meseci { JAN=1, FEB, MAR, APR, MAJ, JUN, JUL, AVG,

SEP, OKT, NOV, DEC }; nabrojiva konstanta JAN ima vrednost 1 a svaka sledeca - za 1 veću

od prethodne

24/28

Enum - primer

Moguće je i eksplicitno navođenje celobrojnih vrednosti enum znak_karte {

KARO = 1,PIK = 2,HERC = 4,TREF = 8};

25/28

Enum - primer

Nabrojivi tipovi mogu da učestvuju u izgradnji drugih složenih tipova Na primer,

struct karta {unsigned char broj;enum znak_karte znak;} mala_dvojka = {2, TREF};

26/28

typedef – nova imena postojećih tipova

Primer:

typedef int Length;

uvodi ime Length kao sinonim za tip int

Ime tipa Length onda može da se koristi u deklaracijama, eksplicitnim konverzijama i slično, na isti način kao što se koristi imeint:

Length len, maxlen;

27/28

typedef Deklaracijom typedef se NE kreira novi tip već se samo uvodi novo

ime za potojeći tip Staro ime za taj tip može da se koristi i dalje

typedef deklaracija se najčešće koristi u kombinaciji sa strukturama da bi se izbeglo pisanje ključne reči struct pri svakom korišćenju imena strukturnog tipa.

28/28

typedef - primer struct tacka {

int x, y;};

typedef struct tacka Tacka; Tacka a, b;

ili...

typedef struct tacka { int x, y; } Tacka; Tacka a, b;