programski jezik c –strukturepoincare.matf.bg.ac.rs/.../programski_jezik_c_strukture.pdf · 2018....
TRANSCRIPT
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;