Upload
-
View
230
Download
1
Embed Size (px)
Citation preview
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