20
STRUKTURE PODATAKA I ALGORITMI 1 Strukture 1

KRAGUJEVAC 06_Strukture.ppt

  • Upload
    -

  • View
    230

  • Download
    1

Embed Size (px)

Citation preview

Page 1: KRAGUJEVAC 06_Strukture.ppt

STRUKTURE PODATAKA I ALGORITMI 1Strukture1

Page 2: KRAGUJEVAC 06_Strukture.ppt

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

2

Page 3: KRAGUJEVAC 06_Strukture.ppt

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

3

Page 4: KRAGUJEVAC 06_Strukture.ppt

Č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);

4

Page 5: KRAGUJEVAC 06_Strukture.ppt

Članice struktura mogu biti takođe strukture

struct rect{

struct point pt1;struct point pt2;

};

Sada možemo deklarisati promenljivu screen

struct rect screen;

pa bi onda koordinata x prve tačke pravougaonika bila

screen.pt1.x;

5

Page 6: KRAGUJEVAC 06_Strukture.ppt

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

6

Page 7: KRAGUJEVAC 06_Strukture.ppt

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.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);

7

Page 8: KRAGUJEVAC 06_Strukture.ppt

Funkcija za sabiranje dva vektora

/* addpoints: add two points */struct point addpoint(struct point p1, struct point p2){

p1.x += p2.x;p1.y += p2.y;

return p1;}

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.pt1.x && p.x < r.pt2.x &&p.y >= r.pt1.y && p.y <

r.pt2.y;}

8

Page 9: KRAGUJEVAC 06_Strukture.ppt

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

9

Page 10: KRAGUJEVAC 06_Strukture.ppt

Ako imamo

struct rect r, *rp = &r;

onda su sledeći izrazi ekvivalentni

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

10

Page 11: KRAGUJEVAC 06_Strukture.ppt

NIZOVI STRUKTURA

Primer: Napisati program koji broji pojavljivanje pojedinih marki automobila u tekstu sa ulaza Bez strukturachar *marke[MAXAUTO];int broj[MAXAUTO];

Sa strukturamastruct automobil {

char *marka;int broj;

} lista[MAXAUTO];

ilistruct automobil {

char *marka;int broj;

};

struct automobil lista[MAXAUTO];

11

Page 12: KRAGUJEVAC 06_Strukture.ppt

Inicijalizacijastruct 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

Page 13: KRAGUJEVAC 06_Strukture.ppt

#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

Page 14: KRAGUJEVAC 06_Strukture.ppt

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

elsereturn mid;

}

return -1;}

14

Page 15: KRAGUJEVAC 06_Strukture.ppt

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

Page 16: KRAGUJEVAC 06_Strukture.ppt

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 mozemid = (low+high) / 2 */

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

else if (cond > 0)low = mid + 1;

elsereturn mid;

}

return NULL;}

16

Page 17: KRAGUJEVAC 06_Strukture.ppt

TYPEDEF

C obezbeđuje deklaraciju za definisanje novih tipova:

typedef int Length;

Length len, maxlen;

Length *lengths[];

typedef char *String;

String p;

p=(String)malloc(10);

Deklaracija typedef ne stvara novi tip, već samo dodaje novo ime za neki postojeći tip.

17

Page 18: KRAGUJEVAC 06_Strukture.ppt

UNIJE

Unija je promenljiva koja može čuvati u različito vreme objekte različitih tipova i veličina.

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

Promenljiva u biće dovoljno velika kako bi mogla da sadrži najveći od ova tri tipa.

Programer je obavezan da vodi računa o tome koji tip vrednosti se trenutno čuva u uniji. 18

Page 19: KRAGUJEVAC 06_Strukture.ppt

Članovima unije se pristupa isto kao članovima strukture:

ime-unije.član

ilipokazivač-na-uniju->član

Unije se mogu koristiti unutar struktura i nizova i obratno.

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

Page 20: KRAGUJEVAC 06_Strukture.ppt

Za unije su dozvoljene iste operacije kao za strukture (kopiranje vrednosti, dodeljivanje neke vrednosti, uzimanje adrese, pristupanje članu)

Unija se može inicijalizovati samo vrednošću tipa njenog prvog člana.

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