kragujevac 06_strukture.ppt
TRANSCRIPT
![Page 1: KRAGUJEVAC 06_Strukture.ppt](https://reader034.vdocuments.site/reader034/viewer/2022051018/55cf9138550346f57b8ba56a/html5/thumbnails/1.jpg)
STRUKTURE PODATAKA I ALGORITMI 1Strukture1
![Page 2: KRAGUJEVAC 06_Strukture.ppt](https://reader034.vdocuments.site/reader034/viewer/2022051018/55cf9138550346f57b8ba56a/html5/thumbnails/2.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022051018/55cf9138550346f57b8ba56a/html5/thumbnails/3.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022051018/55cf9138550346f57b8ba56a/html5/thumbnails/4.jpg)
Č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](https://reader034.vdocuments.site/reader034/viewer/2022051018/55cf9138550346f57b8ba56a/html5/thumbnails/5.jpg)
Č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](https://reader034.vdocuments.site/reader034/viewer/2022051018/55cf9138550346f57b8ba56a/html5/thumbnails/6.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022051018/55cf9138550346f57b8ba56a/html5/thumbnails/7.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022051018/55cf9138550346f57b8ba56a/html5/thumbnails/8.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022051018/55cf9138550346f57b8ba56a/html5/thumbnails/9.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022051018/55cf9138550346f57b8ba56a/html5/thumbnails/10.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022051018/55cf9138550346f57b8ba56a/html5/thumbnails/11.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022051018/55cf9138550346f57b8ba56a/html5/thumbnails/12.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022051018/55cf9138550346f57b8ba56a/html5/thumbnails/13.jpg)
#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](https://reader034.vdocuments.site/reader034/viewer/2022051018/55cf9138550346f57b8ba56a/html5/thumbnails/14.jpg)
/* 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](https://reader034.vdocuments.site/reader034/viewer/2022051018/55cf9138550346f57b8ba56a/html5/thumbnails/15.jpg)
/* 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](https://reader034.vdocuments.site/reader034/viewer/2022051018/55cf9138550346f57b8ba56a/html5/thumbnails/16.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022051018/55cf9138550346f57b8ba56a/html5/thumbnails/17.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022051018/55cf9138550346f57b8ba56a/html5/thumbnails/18.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022051018/55cf9138550346f57b8ba56a/html5/thumbnails/19.jpg)
Č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](https://reader034.vdocuments.site/reader034/viewer/2022051018/55cf9138550346f57b8ba56a/html5/thumbnails/20.jpg)
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