op 10 3334

21
04/23/22 1 Strukture Struktura predstavlja skup podataka kojim se opisuju svojstva objekta. Strukture predstavljaju složene objekte koji se sastoje od komponenti raznih tipova. Strukture pomažu pri organizaciji kompleksnih podataka, posebno u velikim programima, jer one omogućuju obradu grupe međusobno povezanih promenljivih kao jedne celine. Komponente koje obrazuju strukturu nazivaju se elementi ili članovi strukture.

Upload: dejan-marinkovic

Post on 24-Jan-2015

46 views

Category:

Education


6 download

DESCRIPTION

Sam programski jezik je uređen konačan skup znakova za formulisanje programa. Njegova definicija data u ISO standardu glasi: programski jezik je veštački jezik koji se koristi za predstavljanje programa. Sam program predstavlja sistem oznaka za opis algoritama i struktura podataka pomoću kojih ljudi komuniciraju sa računarom. Jednostavnije korišćenje mašinskog jezika dobija se uvođenjem simboličkih imena za naredbe i adreseme morijskih lokacija, a to omogućava asemblerski ili simbolički mašinski jezik. Asemblerski jezik je niskog nivoa, zbog toga što je korespodencija između asemblerskog i mašinskog jezika jedan prema jedan. Programer koristi naredbe računara na kome radi, pa stoga program nije prenosiv - ne može se izvršiti na drugom računaru bez reprogramiranja.

TRANSCRIPT

Page 1: Op 10 3334

04/10/23 1

Strukture

• Struktura predstavlja skup podataka kojim se opisuju svojstva objekta. Strukture predstavljaju složene objekte koji se sastoje od komponenti raznih tipova. Strukture pomažu pri organizaciji kompleksnih podataka, posebno u velikim programima, jer one omogućuju obradu grupe međusobno povezanih promenljivih kao jedne celine.

• Komponente koje obrazuju strukturu nazivaju se elementi ili članovi strukture.

Page 2: Op 10 3334

04/10/23 2

Strukture

Opis strukturestruct oznaka_str{Tip ime_elementa1;Tip ime_elementa2;};

• Član strukture ili oznaka strukture i neka obična promenljiva (koja nije član strukture) mogu nositi isto ime bez konflikta, budući da se mogu razlikovati po kontekstu u kome su upotrebljene.

Page 3: Op 10 3334

04/10/23 3

Strukture

• Možemo definisati strukturu datum sa tri celobrojne komponente, koje predstavljaju dan, mesec i godinu:struct datum {int dan;int mesec;int godina;};

• Struktura datum sadrži tri elementa tipa int: dan, mesec i godina, koji se nazivaju članovima strukture. Ključna reč struct definiše strukturu, tako da promenljive mogu biti deklarisane kao tip struct datum. Elementi strukture mogu biti i nizovi, pokazivačke promenljive, kao i neka druga struktura.

Page 4: Op 10 3334

04/10/23 4

Inicijalizacija strukture• Inicijalizacija strukture je slična inicijalizaciji niza. Inicijalizovane

vrednosti se navode između vitičastih zagrada i razdvojene su zarezom.

• Kod struktura, ime strukture nije pokazivač na neki od članova, kao što je to bilo slučaj kod nizova. Dodeljivanje jedne vrednosti elementa neke strukture drugoj strukturi se vrši pomoću znaka =.

• Deklaracija struct definiše tip. Iza desne vitičaste zagrade kojom se završava lista članova može doći lista promenljivih kao, uostalom, iza svakog drugog tipa. To znači,

struct {

..} x, y, z;

• je sintaksno identično sa int x, y, z; jer oba izraza deklarišu x, y, z kao promenljive zadatog tipa i stvaraju za njih mesto.

Page 5: Op 10 3334

04/10/23 5

• Deklaracija strukture koja nije popraćena listom promenljivih ne rezerviše mesto u memoriji nego samo opisuje vrstu ili oblik strukture. Međutim, ako je deklaracija obavljena, ona se može kasnije upotrebiti u definicijama. Primera radi, zadata deklaracija strukture point u gornjem slučaju

struct point pt;

• definiše promenljivu pt koja je struktura tipa point. Struktura se može inicijalizovati listom inicijalizatora u kojoj je svaki od njih konstantan izraz članova strukture

struct point maxpt={320, 200};

Page 6: Op 10 3334

04/10/23 6

Deklaracija strukturnih promenljivih

• Ako definišemo model strukture označene sa licnost ispred funkcije main () #define MAXIME 31#define MAXADRESA 41struct licnost {char ime [MAXIME];char adresa [MAXADRESA];unsigned starost; };tada u funkciji možemo opisati strukturne promenljive korišćenjem oznake strukture:struct licnost osoba 1, osoba2;

Page 7: Op 10 3334

04/10/23 7

Deklaracija strukturnih promenljivih

• Pri opisu strukturnog modela dozvoljeno je da se definišu i promenljive tako da je struct licnost osoba 1, osoba2;skraćeni zapis zastruct licnost {char ime [MAXIME];char adresa [MAXADRESA];unsigned starost; }osoba1, osoba2;

Page 8: Op 10 3334

04/10/23 8

Inicijalizacija i dodela vrednosti strukturnim promenljivama

• Elementima strukturne promenljive moguć je direktan pristup, bez nabrajanja elemenata koji mu prethode.

• Selekcija člana strukture ima opšti oblik:ime_strukture.ime_clana

• Pristup elementima ime, adresa i starost promenljive osoba1 može se ostvariti pomoću složenih imena osoba1. imeosoba1.adresaosoba1.starost

• Operator tačka ima najviši prioritet među operatorima C jezika i istog je prioriteta kao i operator selekcije elemenata niza ([]).

Page 9: Op 10 3334

04/10/23 9

Inicijalizacija i dodela vrednosti strukturnim promenljivama

• Za učitavanje stringova jednostavnije je koristiti funkciju gets() od scanf(). Funkcija gets() prihvata znake sa tastature dok ne naiđe na znak za novu liniju (’\n’) koji se dobija pritiskom na taster ENTER. Funkcija predaje učitane znake pozivajućoj funkciji ignorišući znak za novu liniju i dodajući završni ili nulti znak (’\o’).

• Funkcija scanf() omogućava učitavanje mešovitih podataka u standardnoj formi i:

počinje znakom koji nije praznina, ako je specifikacija %s učitava se do prvog praznog znaka ,

ali ignorišući ga.

Page 10: Op 10 3334

04/10/23 10

• Elementima strukture mogu se učitavati vrednosti korišćenjem funkcija gets() i scanf()

gets(osoba1.ime);

gets(osoba1.adresa);

scanf(“%d”,&osoba1.starost);

Page 11: Op 10 3334

04/10/23 11

Strukturne promenljive i pokazivači

• Ako je definisana pokazivačka promenljiva osoba:struct licnost *osoba;elementima strukture na koju ova promenljiva pokazuje može se pristupiti korišćenjem operatora tačka(*osoba).ime(*osoba).adresa(*osoba).starost

• Radi jednostavnijeg pristupa elementima strukturne promenljive na koju pokazuje pokazivačka promenljiva, uveden je operator “strelica u desno” (->)osoba->imeosoba->adresaosoba->starost

Page 12: Op 10 3334

04/10/23 12

Strukture koje sadrže pokazivače

• Dva niza znakova u ovoj strukturi zauzimaju prostor fiksne veličine . Pošto su članovi strukture ime i adresa nizovi, oni zauzimaju podjednako veliki memorijski prostor bez obzira šta je u njih upisano.

• Efikasniji način organizovanja podataka je korišćenje pokazivača kao članova strukture i njihovo usmeravanje na efikasnije i ekonomičnije smeštanje znakovnih nizova.

Page 13: Op 10 3334

04/10/23 13

Strukture koje sadrže pokazivače

• Nova deklaracija šablona strukture struct licnost {char *ime;char *adresa ;unsigned starost; };

• Dva niza znakova zamenjena su pokazivačima na znak, pri čemu svaki zauzima onoliko mesta koliko je potrebno za pokazivač.

Page 14: Op 10 3334

04/10/23 14

Prioritet

• Pojedini član strukture može se putem pokazivača dosegnuti izrazom (*pp1).x i (*pp1).y. Uočimo da su zagrade nužne jer operator tačka ima viši prioritet od operatora zvezda. Izraz *pp1.x je ekvivalentan sa *(pp1.x), sto nije korektno formiran izraz.

• Operator tačka (.) odvaja ime promenljive i ime člana strukture. Spada u najvišu prioritetnu grupu. Zbog najvišeg prioriteta tačka operatora, izraz++promenljiva.clan;je ekvivalentan sa ++(promenljiva.clan);

• Isto tako &promenljiva.clan je ekvivalentan sa &(promenljiva.clan)

Page 15: Op 10 3334

04/10/23 15

• Kada struktura sadrži niz kao član strukture, onda se članovi polja dosežu izrazompromenljiva.clan[izraz]

• Na primer, ako je kupac promenljiva tipa struct racun, onda osmi znak u imenu kupca mozemo dobiti izrazom kupac.ime[7]. Ako pak imamo niz struktura, onda pojedini član elementa polja dosežemo izrazompolje[izraz].clan

• Na primer, ako je promenljiva kupci niz tipa struct racun, onda broj računa osmog kupca dosežemo izrazom kupci[7].broj_racuna.

• .

Prioritet

Page 16: Op 10 3334

04/10/23 16

Prioritet

• U poslednja dva primera dolazi do izrazaja asocijativnost, jer su uglaste zagrade i operator tačka istog prioriteta. Njihova asocijativnost je sleva na desno, tako da se operandi grupišu prvo oko levog operatora

Page 17: Op 10 3334

04/10/23 17

Prioritet

• Struktura moze sadržati članove koji su pokazivači. Budući da . i -> operatori imaju viši prioritet od * operatora, vrednost na koju član pokazuje možemo dohvatiti pomoću*var.clan ili*ptvar->clan

• Slično, zbog najvišeg prioriteta koji imaju operatori . i -> izrazi poput++ptvar->clan i ++ptvar->clan.podclanekvivalentni su sa izrazima++(ptvar->clan) i ++(ptvar->clan.podclan)

Page 18: Op 10 3334

04/10/23 18

Prioritet

• Izraz(++ptvar)->clan povećaće pokazivač na strukturu pre nego što se dohvati član strukture. Pri tome se adresa koju sadrži ptvar poveća za onoliko bajtova koliko iznosi veličina strukture.

• Evo jos nekoliko primera izraza sa -> i .; neka je struct pravougaonik r, *pr=&r;

• Tada su sledeći izrazi ekvivalentni:r.pt1.xpr->pt1.x(r.pt1).x(pr->pt1).x

• Tu se koristi asocijativnost operatora . i ->, koja je sleva na desno.

Page 19: Op 10 3334

04/10/23 19

Primer• Napisati program kojim se učitavaju podaci za dve osobe i

ispisuju podaci o starijoj

#include<stdio.h>#define MAXIME 31#define MAXADRESA 41struct licnost{char ime[MAXIME];char adresa[MAXADRESA];unsigned starost;};

Page 20: Op 10 3334

04/10/23 20

void citaj(struct licnost * osoba){printf(“Unesite ime osobe:”);gets(osoba->ime);printf(“Unesite adresu osobe:”);gets(osoba->adresa);printf(“Unesite starost osobe:”);scanf(“%u”,&osoba->starost);while(getchar()!=’\n’); /*ocistiti ulazni string iz scanf jer je ”nova linija” separator;

scanf() ignorise znake praznine i nove linije */}

Page 21: Op 10 3334

04/10/23 21

main(){struct licnost osoba1,osoba2,*stariji;printf(“Unesi podatke za prvu osobu:\n”);citaj(&osoba1);printf(“Unesi podatke za drugu osobu:\n”);citaj(&osoba2);if (osoba1.starost>osoba2.starost) stariji=&osoba1;else stariji=&osoba2;printf(“Stariji je:”);printf(“%s,star:%u.\n”,stariji->adresa,stariji->starost);}