kragujevac 06_strukture.ppt

Post on 17-Jan-2016

230 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

STRUKTURE PODATAKA I ALGORITMI 1Strukture1

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

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

Č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

Č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

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

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

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

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

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

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

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

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

elsereturn 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

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

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

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

Č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

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

top related