Download as ppt, pdf, or txt
Download as ppt, pdf, or txt
You are on page 1of 20

1

STRUKTUREPODATAKAI
ALGORITMI1
Strukture

OSNOVE STRUKTURA

struct point
{
int x;
int y;
};
Strukture

se deklariupomoukljunereistruct

Nazivstrukturemoesepisatiizareistruct
Promenljivelanicestrukturesenavodaizmeuvitiastihzagrada
Promenljivelanicemoguimatiistinazivkaoiobinepromenljive

ilikaolanicenekedrugestrukture

Deklaracijastructdefinietip

Izadeklaracijestrukturemoesenalazitilistapromenljivihtog
tipa
struct { ... } x, y, z;

potpuno analogno kao


int x, y, z;

Deklaracije strukture iza koje se ne nalazi lista promenljivih ne


izaziva rezervisanjememorije.Onapredstavljaablonstrukture.
Nazivnekestrukturesemoeiskoristitizadeklarisanje
primerakatestrukture
Ako je prethodno deklarisanastrukturapoint, onda
struct point pt;

deklarie promenljivu pt koja je struktura tipa struct point

Strukturasemoeinicijalizovatinavoenjeminicijalnihvrednosti
struct point maxpt = { 320, 200 };

lanodreenestrukturesemoeupotrebitikorienjemoblika
ime_strukture.clan

Na primer,koordinatetakeptmoemoprikazatipomou
printf("%d,%d", pt.x, pt.y);

Slino,rastojanjeodkoordinatnogpoetkadotakeptmoemo
izraunatikao
dist = sqrt((double)pt.x * pt.x + (double)pt.y * pt.y);

lanicestrukturamogubititakoestrukture
struct rect
{
struct point pt1;
struct point pt2;
};

Sadamoemodeklarisatipromenljivuscreen
struct rect screen;

pa bi onda koordinata x prve takepravougaonikabila


screen.pt1.x;

STRUKTUREIFUNKCIJE

Jedinedozvoljeneoperacijesastrukturamasukopiranje,
dobijanjenjihoveadreseoperatorom&ipristupnjihovim
lanovima

Operacijekopiranjaobuhvatajuprenoenjestrukturakao
argumenatafunkcijamaivraanjevrednostiizfunkcija

Strukturesemoguinicijalizovatilistomkonstantnihvrednosti
njhovihlanova

Kakoslatipodatkeizstrukturefunkciji

poslatisvepodatkepojedinano
poslaticelustrukturu
poslatipokazivanatustrukturu

Funkcijamakepointuzimadvekoordinate(celobrojnevrednosti)i
vraastrukturu
/* makepoint: make a point from x and y components */
struct point makepoint(int x, int y)
{
struct point temp;
temp.x = x;
temp.y = y;
return temp;
}

Obratitepanjudanepostojikonfliktizmeuargumenatafunkcije
ilanicastrukture

Primerkorienja
struct rect screen;
struct point middle;
struct point makepoint(int, int);
screen.pt1 = makepoint(0,0);
screen.pt2 = makepoint(XMAX, YMAX);
middle = makepoint((screen.pt1.x + screen.pt2.x)/2,
(screen.pt1.y + screen.pt2.y)/2);

Funkcijazasabiranjedvavektora
/* addpoints: add two points */
struct point addpoint(struct point p1, struct point p2)
{
p1.x += p2.x;
p1.y += p2.y;
return p1;
}

Funkcijakojaproveravadalijetakaunutarpravougaonika
/* ptinrect: return 1 if p in r, 0 if not */
int ptinrect(struct point p, struct rect r)
{
return
p.x >= r.pt1.x && p.x < r.pt2.x &&
p.y >= r.pt1.y && p.y < r.pt2.y;
}

Najeejepogodnijefunkcijiposlatipokazivanastrukturu

Deklaracija
struct point *pp;

oznaavadajepppokazivanastrukturutipastructpoint

Akopppokazujenastrukturupoint,ondasenjenimlanicama
moepristupitisa(*pp).x i (*pp).y
struct point pt, *pp;
pp = &pt;
printf("Point is (%d,%d)\n", (*pp).x, (*pp).y);

Ako je p pokazivananekustrukturu,pristupanjelanicama
strukturemoesekraeizvritikorienjem
p->lan_strukture

takodabiposlednjiredprethodnogprimeraglasio
printf("Point is (%d,%d)\n", pp->x, pp->y);
9

Akoimamo
struct rect r, *rp = &r;

ondasusledeiizraziekvivalentni
r.pt1.x
rp->pt1.x
(r.pt1).x
(rp->pt1).x

10

NIZOVISTRUKTURA

Primer: Napisati program koji broji pojavljivanje


pojedinih marki automobila u tekstu sa ulaza
Bezstruktura
char *marke[MAXAUTO];
int broj[MAXAUTO];

Sastrukturama
struct automobil {
char *marka;
int broj;
} lista[MAXAUTO];

ili
struct automobil {
char *marka;
int broj;
};
struct automobil lista[MAXAUTO];

11

Inicijalizacija
struct automobil {
char *marka;
int broj;
} lista[] ={
{"Alfa Romeo", 0},
{"Audi", 0},
{"BMW", 0},
{"Chevrolet", 0},
{"Fiat", 0},
{"Ford", 0},
{"Honda", 0},
/* ... */
{"Renault", 0},
{"Suzuki", 0},
{"Toyota", 0},
{"Volkswagen", 0}
};

12

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAXREC 100
#define BRAUTO (sizeof lista / sizeof(struct automobil))
int getword(char *, int);
int binsearch(char *, struct automobil *, int);
/* brojanje marki automobila */
main()
{
int n;
char rec[MAXREC];
while (getword(rec, MAXREC) != EOF)
if (isalpha(rec[0]))
if ((n = binsearch(rec, lista, BRAUTO)) >= 0)
lista[n].broj++;
for (n = 0; n < BRAUTO; n++)
if (lista[n].broj > 0)
printf("%4d %s\n", lista[n].broj, lista[n].marka);
return 0;
}

13

/* binsearch: trazi marku u nizu tab[0]...tab[n-1] */


int binsearch(char *marka, struct automobil tab[], int n)
{
int cond;
int low, high, mid;
low = 0;
high = n - 1;
while (low <= high)
{
mid = (low+high) / 2;
if ((cond = strcmp(marka, tab[mid].marka)) < 0)
high = mid - 1;
else if (cond > 0)
low = mid + 1;
else
return mid;
}
return -1;
}
14

/* getword: get next word or character from input */


int getword(char *word, int lim)
{
int c, getch(void);
void ungetch(int);
char *w = word;
while (isspace(c = getch()));
if (c != EOF)
*w++ = c;
if (!isalpha(c)) {
*w = '\0';
return c;
}
for ( ; --lim > 0; w++)
if (!isalnum(*w = getch())) {
ungetch(*w);
break;
}
*w = '\0';
return word[0];
}

15

POKAZIVAINASTRUKTURE
/* binsearch: trazi marku u nizu tab[0]...tab[n-1] */
struct automobil *binsearch(char *marka, struct automobil *tab, int
n)
{
int cond;
struct automobil *low = &tab[0];
struct automobil *high = &tab[n];
struct automobil *mid;
while (low < high)
{
mid = low + (high-low) / 2;
mid = (low+high) / 2 */

/* zasto ne moze

if ((cond = strcmp(marka, mid->marka)) < 0)


high = mid;
else if (cond > 0)
low = mid + 1;
else
return mid;
}
return NULL;
}

16

TYPEDEF

C obezbeujedeklaracijuzadefinisanjenovih
tipova:

typedef int Length;


Length len, maxlen;
Length *lengths[];

typedef char *String;


String p;
p=(String)malloc(10);

Deklaracija typedef ne stvara novi tip, vesamo


dodajenovoimezanekipostojeitip.

17

UNIJE

Unija je promenljiva koja moeuvatiurazliito


vremeobjekterazliitihtipovaiveliina.

union primer {
int broj;
char slovo;
float broj_r;
} u;

Promenljivaubiedovoljnovelikakakobimogla
dasadrinajveiodovatritipa.

Programerjeobavezandavodiraunaotome
kojitipvrednostisetrenutnouvauuniji.
18

lanovimaunijesepristupaistokaolanovima
strukture:

ime-unije.lan

ili
pokaziva-na-uniju->lan

Unijesemogukoristitiunutarstrukturainizova
iobratno.

struct{
char *name;
int flags;
union {
int ival;
char *sval;
} u;
} symtab[NSYM];
symtab[i].u.ival
*symtab[i].u.sval

ili

symtab[i].u.sval[0]

19

Zaunijesudozvoljeneisteoperacijekaoza
strukture(kopiranjevrednosti,dodeljivanjeneke
vrednosti,uzimanjeadrese,pristupanjelanu)

Unijasemoeinicijalizovatisamovrednoutipa
njenogprvoglana.

struct radnik {
char prezime[20];
char ime[20];
char plata_ili_nadnica;
union {
float plata;
struct {
int sati_rada;
float satnica;
} nadnica;
} zarada;
} osoba[20];

20

You might also like