oop c nastavak

Post on 15-Feb-2016

37 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Elektronski fakultet

TRANSCRIPT

Objektno-orijentisanoprogramiranje

Napredne tehnike programiranja u programskom jeziku C

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

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.

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

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

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.

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

zoni memorije, Za prenos argumenata funkcije.

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;

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

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.

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.

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.

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.

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.

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č.

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.

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.

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

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)

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

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)

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)

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)

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.

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

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

različitih tipova.

Definicija strukturestruct <ime>{

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

};

Primerstruct student {

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

};

Definicija podataka tipa strukture struct student student1,

*ptrstudent, druga_godina[250];

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

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.

top related