30
Objektno-orijentisano programiranje Napredne tehnike programiranja u programskom jeziku C

OOP C Nastavak

Embed Size (px)

DESCRIPTION

Elektronski fakultet

Citation preview

Page 1: OOP C Nastavak

Objektno-orijentisanoprogramiranje

Napredne tehnike programiranja u programskom jeziku C

Page 2: OOP C Nastavak

Pokazivači Pokazivači predstavljaju poseban

izveden tip podataka. Podatak tipa pokazivača sarži

memorijsku adresu nekog drugog podatka.

Deklaracija pokazivača:<tip> *<ime>;

Page 3: OOP C Nastavak

Operatori koji se koriste u radu sa pokazivačima Operator referenciranja (&) - određuje

adresu neke promenljive; Operator dereferenciranja (*) -

određuje vrednost promenljive na koju ukazuje neka pokazivačka promenljiva.

Page 4: OOP C Nastavak

Primerint i=0, j=0;//promenljive su tipa int

int *pi; //pi je pokazivac na int

pi=&i; //pi ukazuje na promenljivu I

*pi=2; //promenljiva na koju ukazuje pi // dobija vrednost 2, tj. i=2

j=*pi; //j dobija vrednost 2 , j=I

pi=&j; //pi dobija adresu promenljive j, //tj. ukazuje na j

Page 5: OOP C Nastavak

Pokazivač tipa void Pokazivač tipa void (generički pokazivač)

može da primi adresu bilo kog objekta u memoriji.

Primer:int i=0;int *pi1=&i, *pi2;void *pv; //pokazivac na bilo koji tippv=pi1; //pv ukazuje na ipi2=pv; //nemoguca dodela, greska

Page 6: OOP C Nastavak

Konstanta NULL Konstanta NULL je definisana u

header fajlu stdio.h i ima vrednost 0. Dodeljuje se pokazivačkoj promenljivoj kada on ne ukazuje ni na jedan podatak u memoriji.

Page 7: OOP C Nastavak

Koričćenje pokazivača u programu U radu sa poljima, Za pristup podacima u dinamičkoj

zoni memorije, Za prenos argumenata funkcije.

Page 8: OOP C Nastavak

Veza pokazivača i polja Ime polja u programskom jeziku C je

pokazivaš na prvi element polja.

Primer:int polje[10], *pok_polja, a;pok_polja=&polje[0]; //pok_polja=polje;a=polje[0]; //a=*polje; ili a=*pok_polja;

Page 9: OOP C Nastavak

Adresna aritmetikaDozvoljene su sledeće operacije nad okazivačima: dodela vrednosti jednog pokazivača drugoma (samo

ako su istog tipa); dodavanje ili oduzimanje celobrojnog podatka od

vrednosti pokazivača (ako je pokazivač pa=&a[k], pa+1=&a[k+1] bez obzira kolika je dužina podatka a – ne dodaje se bukvalno 1 – već dužina podatka odgovarajućeg tipa);

uporedjivanje 2 pokazivača (samo ako ukazuju na elemente istog niza);

poredjenje pokazivača sa nulom (ispituje da li pokazivač uopšte uakzije na neki ojekat – umesto 0 koristi se konstanta NULL);

Page 10: OOP C Nastavak

Zadatak 1.Napisati program na C-u za izračunavanje skalarnog proizvoda dva vektora sa po N elemenata. Elementima vektora pristupati korišćenjem pokazivača.

Page 11: OOP C Nastavak

Dodela memorijskog prostora podacima1. Statička – prostor za smeštanje vrednosti

promenljive se rezerviše kada se počne sa izvršenjem bloka u kojem je ona definisana, a oslobadja se po završetku izvršenja tog bloka. Kada se polja pamte u statičkoj zoni memorije, potrebno je predvideti njegovu maksimalnu veličinu niza i toliki se prostor pri svakom izvršenju programa i za sve vreme izvršenja programa rezerviše za smeštanje njegovih elemenata.

Page 12: OOP C Nastavak

Dodela memorijskog prostora podacima2. Dinamička – prostor za smeštanje podatak

u memoriji se zauzima u toku izvršenja programa. U tom slučaju u statičkoj zoni memorije definiše se jedan pokazivač na taj deo memorijskog prostora. U toku rada programa može da se rezerviše mem. prostor na koji taj pokazivač ukazuje, da se menja veličina tog mem. prostora i da se on oslobadja te da se u nastavku izvršenja programa koristi za pamćenje drugih podataka.

Page 13: OOP C Nastavak

Funkcije za upravljanje dinamičkom zonom memorije Deklarisane su u header fajlu stdlib.h.

void* malloc(long velicina) – rezerviše deo memorijskog prostora zadate veličine. Veličina se zadaje brojem bajtova. Funkcija vraća generički pokazivač (tipa void*) na rezervisani memorijski prostor, ili NULL ako rezervacija ne može da se izvrši. Sadržaj rezervisanog prostora je nedefinisan.

Page 14: OOP C Nastavak

Funkcije za upravljanje dinamičkom zonom memorije

void* calloc(int broj,int velicina) – rezerviše deo memorijskog za pamćenje navedeni broj elemenata zadate veličine. Funkcija vraća generički pokazivač (tipa void*) na rezervisani memorijski prostor, ili NULL ako rezervacija ne može da se izvrši. Rezervisani deo memorisjkog prostora se inicijalno popunava nulama.

Page 15: OOP C Nastavak

Funkcije za upravljanje dinamičkom zonom memorije

void* realloc(void* pokazivac, int velicina) – Ova funkcija menja veličinu memorijskog prostora na koji ukazuje zadati pokazivač na zadati veličinu (tj. na zadati broj bajtova). Veličina memorisjkog prostora na koji ukazuje navedeni pokazivač se na ovaj način može i da se smanji i da se poveća.

void free(void* pokazivac) – oslobadja deo memorijskog prostora na koji ukazuje davedeni pokazivač.

Page 16: OOP C Nastavak

Zadatak 2.Napisati program na C-u za zamenu prve pojave podstringa s1 u stringu s stringom s2. Stringovi s1 i s2 mogu biti različitih dužina. Sve stringove pamtiti u dinamičkoj zoni meorije i za svaki od njih u svakom trenutku treba da bude rezervisano onoliko memorijskog prostora koliko je potrebno za pamćenje njihovih vrednosti.

Page 17: OOP C Nastavak

Matrice u dinamičkoj zoni memorije U statičkoj zoni memorije matrica se pamti u

linearizovanom obliku (matrica reda mxn se pamti kao niz dužine m*n - linearizacija se vrši po vrstama).

U dinamičkoj zoni memorije matrica može biti predstavljena na tri načina: linearizovano – matrica se zamenjuje vektorom

odgovarajuće dužine; tako što se u dinamičkoj zoni memorije rezerviše

prostor za onoliko nezavisnih vektora koliko vrsta ima matrica, a u statičkoj zoni memorije se matrica definiše kao vektor pokazivača na vrste;

tako što se i vrste i vektor pokazivača na vrste smeštaju u dinamičku zonu memorije – u statičkoj zoni memorije u tom slučaju postoji samo pokazivač na vektor pokazivača na vrste.

Page 18: OOP C Nastavak

Linearizovano smeštanje matrice u dinamičkoj zoni memorije

Šematski prikaz na ovaj način zapamćene matrice:

statička zona memorije dinamička zona memorije

a ...

mxn elemenata

Page 19: OOP C Nastavak

Linearizovano smeštanje matrice u dinamičkoj zoni memorije Rezervacija prostora:

int *a,m,n,i,j;

a=(int*)calloc(m*n,sizeof(int)); Pristup elementima matrice:

pomoću indeksa:…a[n*i+j]…

korišćenjem pokazivača:…*(a+n*i+j)

Page 20: OOP C Nastavak

Kombinovano smeštanje matrice u statičkoj i dinamičkoj zoni Šematski prikaz smeštanja podataka:

statička zona dinamička zona a

...

m pokazivača n elemenata u nizu

Page 21: OOP C Nastavak

Kombinovano smeštanje matrice u statičkoj i dinamičkoj zoni Rezervacija prostora:

int *a[10],m,n,i,j;for (i=0;i<m;i++)

a[i]=(int*)calloc(n,sizeof(int));

Pristup elementima matrice: pomoću indeksa:…a[i][j]… korišćenjem pokazivača:…*(*(a+i)+j)

Page 22: OOP C Nastavak

Kompletno smeštanje matrice u dinamočkoj zoni memorije Šematski prikaz smeštanja podataka:

dinamička zona memorije a

...

m pokazivača po n elemenata u nizu (vrsti)

Page 23: OOP C Nastavak

Kompletno smeštanje matrice u dinamočkoj zoni memorije Rezervacija prostora:

int **a,m,n,i,j;…

a=(int**)calloc(m,sizeof(int*));for (i=0;i<m;i++)

a[i]=(int*)calloc(n,sizeof(int)); Pristup elementima matrice:

pomoću indeksa:…a[i][j]… korišćenjem pokazivača:…*(*(a+i)+j)

Page 24: OOP C Nastavak

Prenos parametara korišćenjem pokazivača U programskom jeziku C-u svaki parametar

elementarnog tipa se prenosi funkciji po vrednosti. To podrazumeva da se pri pozivu funkcije pravi kopija stvarnog argumenta u OM, funkcija radi sa tom kopijom i u trenutku završetka rada funkcije kopija se briše iz operativne memorije. To automatski onemogućava da parametar funkcije bude promenjen u funkciji, a da to bude vidljivo u pozivajućem modulu.

Kada se javi potreba da se se promena parametara u funkciji vidi u pozivajućem modulu, za prenos parametara se koriste pokazivači.

Page 25: OOP C Nastavak

Zadatak 3.Napisati funkciju na C-u za zamenu vrednosti dveju promenljivih.

Page 26: OOP C Nastavak

Strukture Struktura je složeni tip podataka koji sadrži elemente

različitih tipova.

Definicija strukturestruct <ime>{

<tip1> <ime1>;<tip2> <ime2>;…<tipN> <imeN>;

};

Page 27: OOP C Nastavak

Primerstruct student {

char prezime[20]; char ime[20]; char datumrodjenja[8]; int godina; int ocena[30];

};

Page 28: OOP C Nastavak

Definicija podataka tipa strukture struct student student1,

*ptrstudent, druga_godina[250];

Page 29: OOP C Nastavak

Operacije nad strukturama pristupanje članovima strukture korišćenjem

operatora . i ->student1.godina = 3;

ptrstudent->ocena[0]=8; određivanje adrese strukture korišćenjem operatora &

ptrstudent=&student1; određivanje veličine strukture pomoću sizeof

operatoraptrstudent=(struct student*) malloc( sizeof(struct student));

dodeljivanje svih elemenata jedne strukture drugoj strukturi istog tipa

student1=treca[i];

Page 30: OOP C Nastavak

Zadatak 4.Napisati program na C-u za obradu podataka sa prijemnog ispita na jednom fakultetu. Program treba da štampa rang listu studenata koji su položili prijemni ispit. Rang lista sadrži imena, prezimena, matične brojeve i ukupne brojeve poena studenata i uredjena je u nerastućem redosledu prema ukupnom broju poena. Student polaže prijemni ispit iz dva predmeta i smatra se da je položio prijemni ispit ukoliko je iz oba predmeta osvojio najmanje polovinu od maksimalnog broja bodova.Ukupan broj bodova se dobija kao zbir bodova koje student ima na osnovu uspeha iz srednje škole i broja bodova osvojenih iz oba predmeta na prijemnom ispitu.