PROIECTAREA ALGORITMILOR

Similar documents
Titlul lucrării propuse pentru participarea la concursul pe tema securității informatice

2. Setări configurare acces la o cameră web conectată într-un router ZTE H218N sau H298N

Procesarea Imaginilor

Arbori. Figura 1. struct ANOD { int val; ANOD* st; ANOD* dr; }; #include <stdio.h> #include <conio.h> struct ANOD { int val; ANOD* st; ANOD* dr; }

Mulțumim anticipat tuturor acelora care vor transmite critici/observații/sugestii

Versionare - GIT ALIN ZAMFIROIU

Metrici LPR interfatare cu Barix Barionet 50 -

Lucrarea de laborator nr. 4

ARBORI AVL. (denumiti dupa Adelson-Velskii si Landis, 1962)

Olimpiad«Estonia, 2003

Proiectarea bazelor de date. PL/SQL Înregistrări și Colecții # 13. Adrian Runceanu

Structura și Organizarea Calculatoarelor. Titular: BĂRBULESCU Lucian-Florentin

Textul si imaginile din acest document sunt licentiate. Codul sursa din acest document este licentiat. Attribution-NonCommercial-NoDerivs CC BY-NC-ND

9. Memoria. Procesorul are o memorie cu o arhitectură pe două niveluri pentru memoria de program și de date.

REVISTA NAŢIONALĂ DE INFORMATICĂ APLICATĂ INFO-PRACTIC

Semnale şi sisteme. Facultatea de Electronică şi Telecomunicaţii Departamentul de Comunicaţii (TC)

2. Setări configurare acces la o cameră web conectată într-un echipament HG8121H cu funcție activă de router

MS POWER POINT. s.l.dr.ing.ciprian-bogdan Chirila

Reflexia şi refracţia luminii. Aplicaţii. Valerica Baban

INTEROGĂRI ÎN SQL SERVER

Subiecte Clasa a VI-a

Mecanismul de decontare a cererilor de plata

La fereastra de autentificare trebuie executati urmatorii pasi: 1. Introduceti urmatoarele date: Utilizator: - <numarul dvs de carnet> (ex: "9",

Grafuri bipartite. Lecție de probă, informatică clasa a XI-a. Mihai Bărbulescu Facultatea de Automatică și Calculatoare, UPB

X-Fit S Manual de utilizare

IV. PROGRAMAREA ORIENTATĂ PE OBIECTE

Programare în limbaj de asamblare 16. Formatul instrucţiunilor (codificare, moduri de adresare).

CAIETUL DE SARCINI Organizare evenimente. VS/2014/0442 Euro network supporting innovation for green jobs GREENET

Ghid identificare versiune AWP, instalare AWP şi verificare importare certificat în Store-ul de Windows

Update firmware aparat foto

Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic

Structuri de date: ARBORI

Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic

Auditul financiar la IMM-uri: de la limitare la oportunitate

INFORMAȚII DESPRE PRODUS. FLEXIMARK Stainless steel FCC. Informații Included in FLEXIMARK sample bag (article no. M )

2. Tipul referinţă, structuri de date dinamice ( liste înlănţuite şi arbori binari).

6. Bucle. 6.1 Instrucţiunea while

CERERI SELECT PE O TABELA

Baze de date distribuite și mobile

Modalitǎţi de clasificare a datelor cantitative

Seminar 3 ASC MIR Operatii pe biti Operatii cu siruri

D în această ordine a.î. AB 4 cm, AC 10 cm, BD 15cm

Dispozitive Electronice şi Electronică Analogică Suport curs 02 Metode de analiză a circuitelor electrice. Divizoare rezistive.

Metoda BACKTRACKING. prof. Jiduc Gabriel

GHID DE TERMENI MEDIA

Updating the Nomographical Diagrams for Dimensioning the Concrete Slabs

Proiectarea bazelor de date # 11. PL/SQL Funcții în PL/SQL (partea a II-a) Adrian Runceanu

C10. Structuri de date dinamice / Arbori binari 1/57

Laborator 2. Definirea tablourilor şi a funcţiilor (în linia de comandă) în Matlab 7.0

Nume şi Apelativ prenume Adresa Număr telefon Tip cont Dobânda Monetar iniţial final

I. Instrucţiuni PRELEGERE IX PROGRAMAREA CALCULATOARELOR ŞI LIMBAJE DE PROGRAMARE

ISBN-13:

The First TST for the JBMO Satu Mare, April 6, 2018

Noţiuni de bază (II) 4. Scrierea constantelor

Itemi Sisteme de Operare

Ierarhia memoriilor Tipuri de memorii Memorii semiconductoare Memoria cu unități multiple. Memoria cache Memoria virtuală

Laborator 1. Programare declarativă. Programare logică. Prolog. SWI-Prolog

2. SCHEME LOGICE ŞI PSEUDOCOD

CERERI SELECT PE MAI MULTE TABELE

Capitolul 4 SUBCERERI. F. Radulescu. Curs: Baze de date - Limbajul SQL

Aspecte controversate în Procedura Insolvenţei şi posibile soluţii

HEAPSORT I. CONSIDERAŢII TEORETICE

R O M Â N I A CURTEA CONSTITUŢIONALĂ

Propuneri pentru teme de licență

Crearea aplicaţiilor consolă

Reţele Neuronale Artificiale în MATLAB

Mods euro truck simulator 2 harta romaniei by elyxir. Mods euro truck simulator 2 harta romaniei by elyxir.zip

Documentaţie Tehnică

Excel Advanced. Curriculum. Școala Informală de IT. Educație Informală S.A.

ALGORITMI DE GESTIUNE A PAGINILOR DE MEMORIE

3.2 Arhitectura setului de instrucţiuni ISA. Copyright Paul GASNER

5.1 Definirea datelor în SQL

Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic

CHAMPIONS LEAGUE 2017 SPONSOR:

PACHETE DE PROMOVARE

EN teava vopsita cu capete canelate tip VICTAULIC

Tratarea excepţiilor

LIDER ÎN AMBALAJE EXPERT ÎN SISTEMUL BRAILLE

Metoda de programare BACKTRACKING

Macrocomenzi. Figura 1. Personalizarea barei de meniuri. Se va afișa fereastra din figura 2. Figura 2. Includerea tab ului Developer.

Algoritmi si structuri de date ( ) Informatica Ramnicu Valcea, anul 1

INTERPRETOARE DE COMENZI

:= 950; BEGIN DELETE FROM

În continuare vom prezenta unele dintre problemele de calcul ale numerelor Fibonacci.

UTILIZAREA FOILOR DE CALCUL TABELAR - EXCEL

[{CYCLE NOCYCLE}] [{CACHE

Actualizarea firmware-ului pentru aparatul foto digital SLR

O abordare Data Mining pentru detectarea accesului neautorizat la baza de date.

Ghid pentru configurarea şi utilizarea aplicaţiei clicksign Demo

Memorii în Sisteme Embedded. Tipuri de memorii. Arhitectura memoriilor.

MODELUL UNUI COMUTATOR STATIC DE SURSE DE ENERGIE ELECTRICĂ FĂRĂ ÎNTRERUPEREA ALIMENTĂRII SARCINII

4. Asignarea adreselor IP

Ghid de utilizare a Calculatorului valorii U

PROCEDURA PRIVIND DECONTURILE. 2. Domeniu de aplicare Procedura se aplică în cadrul Universităţii Tehnice Cluj-Napoca

Limbajul VHDL. Circuite integrate numerice. Limbajul VHDL

Figura x.1 Ecranul de pornire al mediului de dezvoltare

Știinţa, Ministerul Educaţiei al Republicii Moldova

Mediul de programare C/C++ (Versiunea Borland C++ 3.1)

9. CURSOARE. Obiective. În acest Capitol, vom învăţa despre: Manipularea cursoarelor. Folosirea Cursor FOR Loops şi Nesting Cursors.

Funcţii grup şi clauzele GROUP BY, HAVING. Operatorii ROLLUP şi CUBE.

Transcription:

Universitatea Constantin Brâncuşi Târgu-Jiu Facultatea de Inginerie Departamentul de Automatică, Energie şi Mediu 3 PROIECTAREA ALGORITMILOR Lect. univ. dr. Adrian Runceanu 1

Curs 3 Alocarea dinamică de memorie în C++ 2

Conţinutul cursului 1. Pointeri la funcţii 2. Folosirea pointerilor şi tablourilor ca parametri în funcţii 3. Alocarea dinamică a memoriei 3.1. Operatorul new 3.2. Operatorul delete 4. Structuri implementate dinamic: 4.1. Stiva 4.2. Coada 4.3. Lista simplu înlănţuită 4.4. Lista dublu înlănţuită 3

1. Pointeri la funcţii Numele unei funcţii este un pointer spre funcţia respectivă. El poate fi folosit ca parametru efectiv la apeluri de funcţii. În felul acesta, o funcţie poate transfera funcţiei apelate un pointer spre o funcţie. Aceasta, la rândul ei, poate apela funcţia care i-a fost transferată în acest fel. 4

1. Pointeri la funcţii În instrucţiunile în care se atribuie pointeri la funcţii, tipurile de funcţii trebuie să corespundă exact. Sintaxa de declaraţie este: tip functie(*pointer_functie)(lista_param); 5

Exemple: 1. Se observă importanţa folosirii parantezelor rotunde pentru pointeri la funcţii. Fără acestea nu s-ar mai considera un pointer la funcţie ci o funcţie care întoarce un pointer de un anumit tip. a) Fie declaraţia int *s(int *s1, int *s2); În acest caz avem o funcţie care întoarce pointer la int. 6

b) În declaraţia int (*s)(int *s1, int *s2); avem un pointer la o funcţie care întoarce o valoare de tip int. c) int (*f (int,int)) [10]; În acest caz se defineşte o variabilă de tipul unei funcţii cu doi parametri de tip int care întoarce ca valoare un pointer la un tablou de 10 întregi. 7

2. Schemă de program care foloseşte un tablou de pointeri la funcţii predefinite. // tablou de pointeri la funcţii predefinite #include<iostream.h> #include<math.h> double(*func_mat[ ])(double) = { sin, sinh, cos, cosh, tan, atan }; int main() { int i; double x; for (x=0.01; x<1.01; x+=0.01) for(i=0; i<6; i++) cout<<(*func_mat[i])(x)<<endl; } 8

3) În continuare, un exemplu de program care foloseşte un tablou de pointeri la funcţii definite: #include<iostream.h> typedef int (*functie)(); // Pointer la funcţie de tip întreg void tiparire() { cout<< \nfuncţia de tiparire ; } void afisare() { cout<< \nfuncţia de afisare ; } 9

void scriere() { cout<< \nfuncţia de scriere ; } void verificare() { cout<< \nfuncţia de verificare ; } /* declaratia tabloului de pointeri la funcţii */ functie tf[ ] = { scriere, verificare, afisare, tiparire }; int main() { int i; for(i=0; i<4; i++) /* Apelul unei funcţii din tabloul de pointeri la funcţii */ (*tf[i])() ; } 3 10

Conţinutul cursului 1. Pointeri la funcţii 2. Folosirea pointerilor şi tablourilor ca parametri în funcţii 3. Alocarea dinamică a memoriei 3.1. Operatorul new 3.2. Operatorul delete 4. Structuri implementate dinamic: 4.1. Stiva 4.2. Coada 4.3. Lista simplu înlănţuită 4.4. Lista dublu înlănţuită 11

2. Folosirea pointerilor şi tablourilor ca parametri în funcţii În lista de parametri a unei funcţii pot apărea atât parametri de tip tablou cât şi pointeri la un tip de dată. În cazul tablourilor, nu se încarcă în stivă tot conţinutul tablourilor ci numai adresa primului element. Este recomandată utilizarea ca parametri a pointerilor în locul tablourilor. Pentru a vedea mai clar, vom defini aceeaşi funcţie folosind pe rând tablouri şi apoi pointeri. 3 12

Exemple: 3 1. Funcţia lungime calculează lungimea unui şir de caractere. Varianta din stânga defineşte funcţia prin utilizarea tabloului, varianta din dreapta defineşte funcţia prin utilizarea pointerilor. int lungime (char s[ ]) { } int i; for(i=0; s[i]; i++); return i; int lungime(char *s) { } char *p; for(p=s; *p; p++); return p-s; 13

2. Următoarea funcţie face transferul datelor între două zone de memorie. Funcţia copiere are ca parametri: - dest = adresa zonei destinaţie - sursa = adresa zonei sursă - nr = numărul de octeţi care vor fi copiaţi 14

void copiere(void *dest, void *sursă, int nr) { while (nr--) *((char*) dest)++ = *((char*)sursa)++ ; } Pointerii vor fi convertiţi la char pentru a face accesul la nivel de octet. La fiecare secvenţă de ciclare se transferă un octet şi se micşorează numărul de octeţi transferaţi cu 1. În momentul în care nr devine 0 se iese din ciclul de transfer. 3 15

. Produsul elementelor de pe diagonala principală a unei matrici de tip int: long produs(void *a, int n) { int *p=(int*)a,m; long k=1; for(m=n; m--; k=k * (*p), p = p + n+1) ; return k; } Pointerul p este iniţializat cu adresa de început a matricei. Prin adunarea cu valoarea n+1 se face mereu poziţionarea pe următorul element de pe diagonala principală. Variabila k este înmulţită pe rând cu elementele de la adresa lui p. 3 16

Conţinutul cursului 1. Pointeri la funcţii 2. Folosirea pointerilor şi tablourilor ca parametri în funcţii 3. Alocarea dinamică a memoriei 3.1. Operatorul new 3.2. Operatorul delete 4. Structuri implementate dinamic: 4.1. Stiva 4.2. Coada 4.3. Lista simplu înlănţuită 4.4. Lista dublu înlănţuită 17

3. Alocarea dinamică a memoriei Odată cu gestiunea pointerilor apare şi posibilitatea utilizării variabilelor dinamice. Spre deosebire de variabilele statice, aşa cum sugerează şi denumirea, variabilele dinamice sunt variabile care sunt create şi eliminate la cererea programatorului şi a căror dimensiune se poate modifica pe parcursul execuţiei programului. Zona de memorie în care se face alocarea dinamică a variabilelor se numeşte heap. 18

3. Alocarea dinamică a memoriei Alocarea de zone de memorie şi eliberarea lor în timpul execuţiei programelor permite gestionarea optimă a memoriei de către programe. Un astfel de mijloc de gestionare a memoriei se numeşte alocare dinamică a memoriei. 19

3. Alocarea dinamică a memoriei Alocarea dinamica a memoriei se poate executa prin utilizarea a doi operatori ai limbajului C++: 1.Operatorul de alocare a memoriei - new 2.Operatorul de dezalocare(eliberare) a memoriei - delete 20

Conţinutul cursului 1. Pointeri la funcţii 2. Folosirea pointerilor şi tablourilor ca parametri în funcţii 3. Alocarea dinamică a memoriei 3.1. Operatorul new 3.2. Operatorul delete 4. Structuri implementate dinamic: 4.1. Stiva 4.2. Coada 4.3. Lista simplu înlănţuită 4.4. Lista dublu înlănţuită 21

3.1. Operatorul new Limbajul C++ permite alocări în zona heap prin intermediul operatorului new. Acesta este un operator unar şi are aceeaşi prioritate ca şi ceilalţi operatori unari. Operatorul new are ca valoare adresa de început a zonei de memorie alocată în memoria heap sau zero (pointerul nul) în cazul în care nu se poate face alocarea. Operandul operatorului new în cea mai simpla formă, este numele unui tip (predefinit sau definit de utilizator). 22

.1. Operatorul new Exemplul 1: int *pint; pint = new int; Prin intermediul acestei expresii, se alocă în memoria heap o zonă de memorie în care se pot păstra date de tip int. Adresa de început a zonei alocate se atribuie pointerului pint. Expresia: *pint=100; păstrează întregul 100 în zona respectivă. 3 23

3.1. Operatorul new Exemplul 2: int& i = *new int; Prin intermediul acestei declaraţii (definiţii) se alocă în memoria heap o zonă de memorie în care se pot păstra date de tip int. Numele i permite referirea la întregul păstrat în zona respectivă. Expresia de atribuire: i=100 păstrează întregul 100 în zona respectivă. 24

3.1. Operatorul new Zonele de memorie alocate cu ajutorul operatorului new pot fi iniţializate. În acest scop se utilizează o expresie de forma: new tip(expresie) unde: tip este numele unui tip de date expresie este o expresie a cărei valoare iniţializează zona de memorie 25

3.1. Operatorul new Exemplul 1: double *pdouble; pdouble = new double(3.14159265); Această instrucţiune realizează următoarele: alocă în memoria heap o zonă de memorie în care se pastrează valoarea 3.14159265 în format real dublă precizie adresa de început a acestei zone de memorie se atribuie variabilei pdouble 26

3.1. Operatorul new Exemplul 2: double pi = *new double(3.14159265); Prin această declaraţie se rezervă, în memoria heap, o zonă de memorie în care se păstrează valoarea 3.14159265 în format real dublă precizie. Data respectivă se poate referi cu ajutorul numelui pi. De exemplu, pi poate fi utilizat în mod obişnuit în expresii de forma: pi*r*r sin(pi/2) x*180/pi, etc. 27

3.1. Operatorul new O altă utilizare importantă este aceea de alocare a unei zone de memorie, în memoria heap, pentru tablouri. În acest scop, utilizăm o expresie de forma: new tip[expresie] unde expresie expresie de tip intreg; Prin această construcţie se rezervă, în memoria heap, o zonă de memorie de expresie*sizeof(tip) octeţi. Valoarea expresiei de mai sus, este adresa de început a zonei de memorie rezervată prin operatorul new. 28

Exemplu: double *tab; int m,n;.. tab=new double[m*n]; Această instrucţiune rezervă în memoria heap o zonă de m*n*sizeof(double) octeţi. Adresa de început a acestei zone de memorie se atribuie pointerului tab. Elementele unei astfel de zone de memorie nu pot fi iniţializate decât numai prin secvenţe de program corespunzătoare. De exemplu, pentru a initializa cu 0 cele m*n elemente de tip double rezervate ca mai sus, putem folosi instrucţiunea for de mai jos: for(int i=0; i<m*n; i++) tab[i]=0.0; 3 29

Conţinutul cursului 1. Pointeri la funcţii 2. Folosirea pointerilor şi tablourilor ca parametri în funcţii 3. Alocarea dinamică a memoriei 3.1. Operatorul new 3.2. Operatorul delete 4. Structuri implementate dinamic: 4.1. Stiva 4.2. Coada 4.3. Lista simplu înlănţuită 4.4. Lista dublu înlănţuită 30

3.2. Operatorul delete O zonă de memorie alocată prin operatorul new se eliberează prin operatorul delete. Daca p este un pointer spre tip: tip *p; şi p=new tip; atunci zona din memoria heap alocată cu ajutorul lui new se eliberează folosind construcţia: delete p. 31

3.2. Operatorul delete De asemenea, operatorul delete se utilizează pentru a dezaloca tablourile alocate prin new. Fie alocarea: tip *p=new tip[expresie]; Această zonă se eliberează folosind o construcţie de forma: delete[expresie] p; 32

Conţinutul cursului 1. Pointeri la funcţii 2. Folosirea pointerilor şi tablourilor ca parametri în funcţii 3. Alocarea dinamică a memoriei 3.1. Operatorul new 3.2. Operatorul delete 4. Structuri implementate dinamic: 4.1. Stiva 4.2. Coada 4.3. Lista simplu înlănţuită 4.4. Lista dublu înlănţuită 33

4.1. Stiva O stivă este un tip de dată ale cărui operaţii de inserare şi de ştergere păstrează această regulă: ultimul - venit - primul - ieșit LIFO (Last-In-First-Out) Astfel, într-o stivă pot fi adăugate sau şterse elemente doar în vârful stivei. 34

4.1. Stiva Grafic, o stivă se poate reprezenta astfel: Ultimul venit Primul ieșit 35

4.1. Stiva Pentru a putea realiza implementarea dinamică a stivei, elementele unei astfel de structuri vor fi de tip structură, cu două feluri de informaţii: informaţia propriu-zisă (conţinutul efectiv al elementului respectiv şi care variază în funcţie de problemă notată cu inf care este de un anumit tip de date tip) informaţia de legătură (care este un pointer ce conţine adresa elementului precedent din stivă notat cu leg). 36

4.1. Stiva Tipul de date necesar implementării dinamice a structurii de tip stivă este: typedef struct tnod { tip inf; // informatia propriu-zisa struct tnod *leg; // informatia de legatura } TNOD; 37

4.1. Stiva Adăugarea sau extragerea unui element se face la un singur capăt numit vârful stivei. Elementul introdus primul în stivă se afla la baza stivei. Informaţia de legătură a fiecărui element din stivă reprezintă adresa elementului pus anterior în stivă, excepţie făcând elementul de la bază, a cărui informaţie de legătură este NULL. 38

Se observă că este necesar şi suficient să fie reţinută adresa elementului din vârful stivei întrun pointer pe care îl voi nota cu vf(tnod *vf), celelalte elemente putând fi accesate cu ajutorul informaţiei de legătură de care dispune fiecare element al stivei. Stiva se poate reprezenta grafic astfel: NULL 3 Vârful stivei Baza stivei 39

4.1. Stiva Operaţiile ce se pot efectua asupra stivei 1) Iniţializarea stivei: void init( TNOD* vf ) { vf=null; } 40

2) Adăugarea unui element x în vârful stivei: Deoarece toate adăugările şi ştergerile se fac la un singur capăt al stivei, singura posibilitate de a adăuga un element în stivă este în vârf. Acest lucru se realizează astfel: Se alocă memorie pentru noul element (a); Se iniţializează zona de informaţie propriu-zisă (utilă) a acestuia (b); Se iniţializează informaţia de legătură cu adresa elementului care a fost anterior în vârful stivei, adresă păstrată în variabila vf (c); Se actualizează variabila vf cu adresa noului element alocat (d). Putem observa că acest algoritm este corect şi dacă stiva era vidă înainte de adăugare(vf=null). 3 41

void adaug(tip x,tnod *vf) { TNOD *p; //pointer de lucru p=new TNOD; //(a) p->inf=x; //(b) p->leg=vf; //(c) vf=p; //(d) } Această operaţie se poate reprezenta grafic astfel: p Vârful stivei(vf) Baza stivei 42

) Extragerea elementului din vârful stivei Prin extragerea unui element se înţelege eliminarea acestuia din stivă. Această operaţie se poate realiza numai dacă stiva este nevidă şi în caz afirmativ se va şterge elementul din vârful stivei. Operaţia se efectuează astfel: Într-un pointer de lucru notat p, se reţine adresa elementului din vârful stivei; (a) În variabila q se extrage elementul din vârful stivei; Adresa elementului următor celui din vârful stivei devine adresa noului vârf al stivei; (b) Se eliberează memoria ocupată de elementul care a fost anterior în vârful stivei.(c) 3 43

void extragere( TNOD *vf, tip *q) { TNOD *p; //pointer de lucru p=vf; //(a) *q=vf->inf; // Se extrage în variabila *q valoarea din varful stivei vf=vf->leg; //(b) delete p; //(c) } Această operaţie se poate reprezenta grafic astfel: p Vârful stivei(vf) 44

4) Verificarea dacă stiva este vidă int stvida( TNOD *vf ) { return vf==null; } 5) Numărarea elementelor din stivă int cardinal(tnod *vf) { int m=0; //contorizeaza elementele stivei TNOD* p; //pointer de lucru p=vf; while (p!=null) { m++; p=p->leg; } return m; } 45

Întrebări? 46