Professional Documents
Culture Documents
P03b - Korisnicki Definisani Tipovi
P03b - Korisnicki Definisani Tipovi
1
Korisnički definisani tipovi
SADRŽAJ PREZENTACIJE:
I Strukture
I Unije
I Nabrojivi tipovi
I Deklaracija typedef
I Polja bitova
2
Korisnički definisani tipovi
I Unije
I Polja bitova
I Nabrojivi tipovi
3
Korisnički definisani tipovi
Strukture
Struktura je skup jedne ili više promenljih, koje mogu biti različitih tipova,
grupisanih zajedno radi lakše manipulacije.
Definisanjem strukture uvodi se novi tip podataka i nakon toga mogu da se koriste
promenljive tog novog tipa, na isti način kao i za druge tipove.
U jeziku C ne postoji tip koji opisuje razlomke, ali može se definisati struktura koja
opisuje razlomke.
Razlomak može da bude opisan parom koji čine brojilac i imenilac, na primer, celobro-
jnog tipa.
struct razlomak {
int brojilac ;
int imenilac ;
};
4
Korisnički definisani tipovi
Zatim se izmedu vitičastih zagrada navodi opis članova (ili polja) strukture.
Imena članova strukture se ne mogu koristiti kao samostalne promenljive, one postoje
samo kao deo složenijeg objekta.
Napomena
Prethodnom definicijom strukture razlomak uveden je novi tip podataka pod imenom
struct razlomak.
5
Korisnički definisani tipovi
Strukture omogućavaju da se povezane vrednosti (ne nužno istog tipa) tretiraju kao
jedna celina.
Na taj nacin one pomažu pri organizaciji i obradi kompleksnih podataka, posebno u
velikim programima.
struct student {
char ime [40];
float prosek ;
};
U ovoj strukturi student je opisan pomoću dva atributa: ime i prosek.
6
Korisnički definisani tipovi
struct dvojniRazlomak {
struct razlomakGore ;
struct razlomakDole ;
};
Na ovaj način vidimo da strukture mogu biti ugnježdene.
Ukoliko je navedena u okviru funkcije, ona može da se koristi samo u okviru te funkcije.
7
Korisnički definisani tipovi
struct razlomak a, b, c;
Definicijom strukture je opisano da se razlomci sastoje od brojioca i imenioca.
struct razlomak a = { 1, 2 };
8
Korisnički definisani tipovi
Komentar
Redosled navodenja inicijalizatora odgovara redosledu navodenja članova strukture.
struct razlomak {
int brojilac ;
int imenilac ;
} a = {1, 2}, b, c;
9
Korisnički definisani tipovi
a. imenilac
Ispis promenljive a tipa struct razlomak:
int brojilac = 5;
int imenilac = 3;
a. brojilac = brojilac ;
a. imenilac = imenilac ;
10
Korisnički definisani tipovi
Operator sizeof se može primeniti i na ime strukturnog tipa i na promenljive tog tipa.
Ovaj broj nekada moze da bude i veći od zbira veličina pojedinačnih polja strukture.
11
Korisnički definisani tipovi
12
Korisnički definisani tipovi
Ispis iz programa
Naslov knjige: Misliti na jeziku C++
Komentar
U programu je korišćena funkcija strcpy(s,t) kopira string t u string s.
13
Korisnički definisani tipovi
Nizovi struktura
Umesto da povezana skupina složenih podataka čuva u nezavisnim nizovima bolje je
koristiti nizove struktura.
Primer nizova struktura:
Potrebno imati podatke o imenima i broju dana meseci u godini.
Moguće je te podatke čuvati u nizu sa brojevima dana i u (nezavisnom) nizu imena
meseci.
Bolje je na sledeći način opisati strukturu koja sadrži broj dana i ime:
struct opis_meseca {
char ime [10];
int broj_dana ;
};
i koristiti niz ovakvih struktura:
Napomena
Deklarisan je niz dužine 13 da bi se meseci mogli referisati po svojim rednim brojevima,
pri čemu se početni elelement ne koristi.
14
Korisnički definisani tipovi
15
Korisnički definisani tipovi
Komentar
Nakon navedene deklaracije:
16
Korisnički definisani tipovi
Unije
Unije su slične strukturama, takodje objedinjuju nekoliko promenljivih koje ne
moraju imati isti tip.
Kod struktura se sva polja istovremeno popunjavaju i sva se mogu istovremeno ko-
ristiti.
Jedina razlika je da se umesto ključne reči struct koristi ključna reč union.
17
Korisnički definisani tipovi
Primer unije
Naredna unija omogućava korisniku da izabere da li će vreme da pamti kao ceo broj
sekundi ili kao razlomljen broj.
union vreme {
int obicno ;
float precizno ;
};
Nakon definisanja tipa unije, moguće je definisati i promenljive ovog tipa, na primer:
union vreme a;
a. obicno = 12;
18
Korisnički definisani tipovi
#include <stdio.h>
union Data
{
int i;
float f;
char str [20];
};
int main( )
{
union Data data;
printf ( " Velicina unije union Data: %d\n", sizeof (data));
return 0;
}
Ispis iz programa: Velicina unije union Data: 20
19
Korisnički definisani tipovi
#include <stdio.h>
#include <string .h>
union Data
{
int i;
float f;
char str [20];
};
int main( )
{
union Data data;
data.i = 10;
data.f = 220.5;
strcpy ( data.str , "C Programming ");
return 0;
}
20
Korisnički definisani tipovi
Komentar
Rezultat prethodnog programa je:
data.i : 1917853763
data.f : 4122360580327794860452759994368.000000
data.str : C Programming
21
Korisnički definisani tipovi
#include <stdio.h>
#include <string .h>
union Data
{
int i;
float f;
char str [20];
};
int main( )
{
union Data data;
data.i = 10;
printf ( "data.i : %d\n", data.i);
data.f = 220.5;
printf ( "data.f : %f\n", data.f);
22
Korisnički definisani tipovi
Komentar
Rezultat izmenjenog programa je:
data.i : 10
data.f : 220.500000
data.str : C Programming
23
Korisnički definisani tipovi
Za zaposlene se još čuva i koeficijent za platu, dok se za studente čuva broj indeksa:
struct akademac {
char ime_i_prezime [50];
char jmbg [14];
char vrsta;
union {
double plata;
char indeks [7];
} dodatno ;
};
24
Korisnički definisani tipovi
Član strukture vrsta tipa char sadrži informaciju o tome da li se radi o zaposlenom (na
primer, vrednost z) ili o studentu (na primer, vrednost s).
int main () {
struct akademac pera = {"Pera Peric", " 0101970810001 ", ’z’};
pera. dodatno .plata = 56789.5;
printf ("%f\n", pera. dodatno .plata);
struct akademac ana = {"Ana Anic", " 1212992750501 ", ’s’};
strcpy (ana. dodatno .indeks , " 12/123 ");
printf ("%s\n", ana. dodatno . indeks );
return 0;
}
25
Korisnički definisani tipovi
enum znak_karte {
KARO ,
PIK ,
HERC ,
TREF
};
Nakon navedene definicije u programu se imena KARO, TREF, PIK i HERC mogu
koristiti umesto nekih konkretnih konstantnih brojeva.
26
Korisnički definisani tipovi
Na primer:
enum znak_karte {
KARO = 1,
PIK = 2,
HERC = 4,
TREF = 8
};
Vrednosti nabrojivih tipova nisu promenljive i njima se ne može menjati vrednost.
27
Korisnički definisani tipovi
Na primer:
enum znak_karte {
KARO = 1,
PIK = 2,
HERC = 4,
TREF = 8
} znak;
28
Korisnički definisani tipovi
struct karta {
unsigned char broj;
enum znak_karte znak;
} osam_herc = {8, HERC };
29
Korisnički definisani tipovi
#include <stdio.h>
int main ()
{
/* Deklaracija promenljive tipa enum sedmica */
enum sedmica today ;
danas = SREDA;
printf ("Dan %d",today +1);
return 0;
}
Ispis iz programa: Dan 4
30
Korisnički definisani tipovi
#include <stdio.h>
/* Definicija tipa nabrojivog tipa enum boolean i deklaracija
promenljive ovog tipa */
enum boolean {NE , DA} odgovor ;
int main ()
{
/* Promenljiva nabrojivog tipa moze da ima samo jednu
konstantnu vrednost .*/
odgovor = NE;
printf (" Velicina enum promenljve je %d bajta", sizeof ( odgovor
));
return 0;
}
Ispis iz programa: Velicina enum promenljve je 4 bajta
31
Korisnički definisani tipovi
#include <stdio.h>
enum boje {CRVENA , ZELENA = 3, PLAVA , LJUBICASTA , ZUTA , CRNA };
int main ()
{
/* Promenljiva nabrojivog tipa ima samo jednu konstantnu
vrednost .*/
enum boje b = ZELENA ;
printf ("Boja je: %d ", b);
b = PLAVA;
printf ("Boja je: %d ", b);
b = CRNA;
printf ("Boja je: %d ", b);
/* b = 3; -Greska jer se promenljivoj nabrojivog tipa ne moze
dodeliti ceo broj.*/
return 0;
}
Ispis iz programa: Velicina enum promenljve je 4 bajta
32
Korisnički definisani tipovi
Ispis iz programa
Na primer:
Boja je: 3
Boja je: 4
Boja je: 7
struct karta {
unsigned char broj;
enum znak_karte znak;
} osam_herc = {8, HERC };
33
Korisnički definisani tipovi
Na primer, deklaracija:
Deklaracijom typedef se ne kreira novi tip vec se samo uvodi novo ime za potojeci
tip.
34
Korisnički definisani tipovi
struct point {
int x, y;
};
typedef struct point Point;
Point a, b;
Definicija strukture i pridruživanje novog imena se mogu uraditi istovremeno. Na
primer:
35
Korisnički definisani tipovi
Napomena
Jedan od primera je upotrebe typedef je za imenovanje celobrojnog tipa, i zatim odabir
short, int i long u zavisnosti od mašine.
36
Korisnički definisani tipovi
int main ()
{
/* Definisemo promenljivu tipa tacke.
Umesto struct point mozemo koristiti POINT */
POINT a;
/* Postavljamo vrednosti koordinata tacke a*/
a.x = 3; a.y = 4;
/* Ispisujemo velicinu strukture tacka */
printf (" sizeof ( struct point) = %d\n", sizeof (POINT));
/* Ispisujemo vrednosti koordinata tacaka */
printf ("x koordinata tacke a je %d\n", a.x);
printf ("y koordinata tacke a je %d\n", a.y);
return 0;
37
Korisnički definisani tipovi
x koordinata tacke a je 3
y koordinata tacke a je 4
38
Korisnički definisani tipovi
Polja bitova
Pored unije, jedan od načina uštede memorije u C programima su polja bitova (engl. bit
fields).
Primer:
Neka je dopušteno samo 4 boje (crvena, plava, zelena, i crna) koje mogu da se predstave
pomocu 2 bita.
39
Korisnički definisani tipovi
struct osobine_pravougaonika {
unsigned char popunjen : 1;
unsigned char boja : 2;
unsigned char vrsta_okvira : 1;
};
Iza svake promenljive naveden je broj bitova koji je potrebno odvojiti za tu promenljivu.
Veličina ovako definisanog polja bitova (vrednost izraza sizeof (struct os-
obine pravougaonika)) je samo 1 bajt. Iako je potrebno samo 4 bita, svaki podatak
mora da zauzima ceo broj bajtova).
40