STRUKTURE PODATAKA I ALGORITMI 1 Strukture OSNOVE STRUKTURA

  • Slides: 16
Download presentation
STRUKTURE PODATAKA I ALGORITMI 1 Strukture

STRUKTURE PODATAKA I ALGORITMI 1 Strukture

OSNOVE STRUKTURA struct point { int x; int y; }; Strukture se deklarišu pomoću

OSNOVE STRUKTURA struct point { int x; int y; }; Strukture se deklarišu pomoću ključne reči struct Naziv strukture može se pisati iza reči struct Promenljive članice strukture se navoda između vitičastih zagrada Promenljive članice mogu imati isti naziv kao i obične promenljive ili kao članice neke druge strukture

 Deklaracija struct definiše tip Iza deklaracije strukture može se nalaziti lista promenljivih tog

Deklaracija struct definiše tip Iza deklaracije strukture može se nalaziti lista promenljivih tog tipa struct {. . . } x, y, z; potpuno analogno kao int x, y, z; Deklaracije strukture iza koje se ne nalazi lista promenljivih ne izaziva rezervisanje memorije. Ona predstavlja šablon strukture. Naziv neke strukture se može iskoristiti za deklarisanje primeraka te strukture Ako je prethodno deklarisana struktura point, onda struct point pt; deklariše promenljivu pt koja je struktura tipa struct point Struktura se može inicijalizovati navođenjem inicijalnih vrednosti struct point maxpt = { 320, 200 };

 Član određene strukture se može upotrebiti korišćenjem oblika ime_strukture. clan Na primer, koordinate

Član određene strukture se može upotrebiti korišćenjem oblika ime_strukture. clan Na primer, koordinate tačke pt možemo prikazati pomoću printf("%d, %d", pt. x, pt. y); Slično, rastojanje od koordinatnog početka do tačke pt možemo izračunati kao dist = sqrt((double)pt. x * pt. x + (double)pt. y * pt. y);

 Članice struktura mogu biti takođe strukture struct rect { struct point pt 1;

Članice struktura mogu biti takođe strukture struct rect { struct point pt 1; struct point pt 2; }; Sada možemo deklarisati promenljivu screen struct rect screen; pa bi onda koordinata x prve tačke pravougaonika bila screen. pt 1. x;

STRUKTURE I FUNKCIJE Jedine dozvoljene operacije sa strukturama su kopiranje, dobijanje njihove adrese operatorom

STRUKTURE I FUNKCIJE Jedine dozvoljene operacije sa strukturama su kopiranje, dobijanje njihove adrese operatorom & i pristup njihovim članovima Operacije kopiranja obuhvataju prenošenje struktura kao argumenata funkcijama i vraćanje vrednosti iz funkcija Strukture se mogu inicijalizovati listom konstantnih vrednosti njhovih članova Kako slati podatke iz strukture funkciji poslati sve podatke pojedinačno poslati celu strukturu poslati pokazivač na tu strukturu

 Funkcija makepoint uzima dve koordinate (celobrojne vrednosti) i vraća strukturu /* makepoint: make

Funkcija makepoint uzima dve koordinate (celobrojne vrednosti) i vraća strukturu /* 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; } Obratite pažnju da ne postoji konflikt između argumenata funkcije i članica strukture Primer korišćenja struct rect screen; struct point middle; struct point makepoint(int, int); screen. pt 1 = makepoint(0, 0); screen. pt 2 = makepoint(XMAX, YMAX); middle = makepoint((screen. pt 1. x + screen. pt 2. x)/2, (screen. pt 1. y + screen. pt 2. y)/2);

 Funkcija za sabiranje dva vektora /* addpoints: add two points */ struct point

Funkcija za sabiranje dva vektora /* addpoints: add two points */ struct point addpoint(struct point p 1, struct point p 2) { p 1. x += p 2. x; p 1. y += p 2. y; return p 1; } Funkcija koja proverava da li je tačka unutar pravougaonika /* ptinrect: return 1 if p in r, 0 if not */ int ptinrect(struct point p, struct rect r) { return p. x >= r. pt 1. x && p. x < r. pt 2. x && p. y >= r. pt 1. y && p. y < r. pt 2. y; }

 Najčešće je pogodnije funkciji poslati pokazivač na strukturu Deklaracija struct point *pp; označava

Najčešće je pogodnije funkciji poslati pokazivač na strukturu Deklaracija struct point *pp; označava da je pp pokazivač na strukturu tipa struct point Ako pp pokazuje na strukturu point, onda se njenim članicama može pristupiti sa (*pp). x i (*pp). y struct point pt, *pp; pp = &pt; printf("Point is (%d, %d)n", (*pp). x, (*pp). y); Ako je p pokazivač na neku strukturu, pristupanje članicama strukture može se kraće izvršiti korišćenjem p->član_strukture tako da bi poslednji red prethodnog primera glasio printf("Point is (%d, %d)n", pp->x, pp->y);

 Ako imamo struct rect r, *rp = &r; onda su sledeći izrazi ekvivalentni

Ako imamo struct rect r, *rp = &r; onda su sledeći izrazi ekvivalentni r. pt 1. x rp->pt 1. x (r. pt 1). x (rp->pt 1). x

NIZOVI STRUKTURA Primer: Napisati program koji broji pojavljivanje pojedinih marki automobila u tekstu sa

NIZOVI STRUKTURA Primer: Napisati program koji broji pojavljivanje pojedinih marki automobila u tekstu sa ulaza Bez struktura char *marke[MAXAUTO]; int broj[MAXAUTO]; Sa strukturama struct automobil { char *marka; int broj; } lista[MAXAUTO]; ili struct automobil { char *marka; int broj; }; struct automobil lista[MAXAUTO];

 Inicijalizacija struct automobil { char *marka; int broj; } lista[] ={ {"Alfa Romeo",

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} };

#include <stdio. h> #include <ctype. h> #include <string. h> #define MAXREC 100 #define BRAUTO

#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("%4 d %sn", lista[n]. broj, lista[n]. marka); return 0; }

/* binsearch: trazi marku u nizu tab[0]. . . tab[n-1] */ int binsearch(char *marka,

/* 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; }

/* getword: get next word or character from input */ int getword(char *word, int

/* 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 = ''; return c; } for ( ; --lim > 0; w++) if (!isalnum(*w = getch())) { ungetch(*w); break; } *w = ''; return word[0]; }

POKAZIVAČI NA STRUKTURE /* binsearch: trazi marku u nizu tab[0]. . . tab[n-1] */

POKAZIVAČI NA STRUKTURE /* 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; /* zasto ne moze mid = (low+high) / 2 */ if ((cond = strcmp(marka, mid->marka)) < 0) high = mid; else if (cond > 0) low = mid + 1; else return mid; } return NULL; }