Differences

This shows you the differences between two versions of the page.

Link to this comparison view

sd-ca:articole:tutorial-01-1 [2016/02/24 13:08]
radu.stochitoiu
sd-ca:articole:tutorial-01-1 [2016/02/24 13:26] (current)
radu.stochitoiu
Line 54: Line 54:
 <code cpp> <code cpp>
 void push_back(int value) { void push_back(int value) {
- // Verific daca vectorul intern este plin + // Verific daca vectorul intern este plin 
- if (size == capacity) { + if (size == capacity) { 
- // Voi face o realocare. La final copiez elementele in noul vectorl+ // Voi face o realocare. La final copiez elementele in noul vectorl
  
- // Aloc un nou vector de dimensiune dubla. + // Aloc un nou vector de dimensiune dubla. 
- int *tmpArray = new int[ 2*capacity ];+ int *tmpArray = new int[ 2*capacity ];
  
- // Copiez elementele in noul vector + // Copiez elementele in noul vector 
- for ( int i = 0; i < size; ++i ) { + for ( int i = 0; i < size; ++i ) { 
- tmpArray[ i ] = array[ i ]; + tmpArray[ i ] = array[ i ]; 
- }+ }
  
- // Eliberez memoria ocupata de vechiul vector. + // Eliberez memoria ocupata de vechiul vector. 
- delete[] array;+ delete[] array;
  
- // Salvez vectorul nou format, care are capacitate dubla. + // Salvez vectorul nou format, care are capacitate dubla. 
- array = tmpArray; + array = tmpArray; 
- capacity = 2 * capacity;+ capacity = 2 * capacity; 
 +
 + 
 + // Adaug elementul la finalul vectorului 
 + // Pozitia noului element este size; 
 + array[ size ] = value; 
 + size++; // urmatorul element adaugat va fi adaugat la o urmatoarea pozitie 
 +
 +</​code>​ 
 +==== Adaugarea de alte elemente (e.g. sortarea) ==== 
 + 
 +<code cpp> 
 +// Metoda care sorteaza crescator elementele vectorului. 
 +void sort() { 
 + for ( int i = 0; i < size; ++i ) { 
 + for ( int j = i + 1; j < size; ++j ) { 
 + if (array[ i ] > array[ j ]) { 
 + int tmp = array[i]; 
 + array[ i ] = array[ j ]; 
 + array[ j ] = tmp; 
 + // sau std::​swap(array[i],​ array[j]);​ 
 + // sau array[i] ^= array[j], array[j] ^= array[i], array[i] ^= array[j]; 
 + }
  }  }
 + }
 +}
  
- // Adaug elementul la finalul ​vectorului +// Metoda care afiseaza elementele ​vectorului. 
- // Pozitia noului element este size; +void print() { 
- array[ ​size = value; + std::cout << "​Continut:​ "; 
- size++; // urmatorul element adaugat va fi adaugat la o urmatoarea pozitie+ for ( int i = 0; i < size; ++i ) { 
 + std::cout << ​array[i<< ' ';
  }  }
 + std::cout << '​\n';​
 +}
 </​code>​ </​code>​
-==== Adaugarea de alte elemente (e.g. sortarea) ==== 
  
 ===== Testare si Evaluare ===== ===== Testare si Evaluare =====
  
 ==== Program de test ==== ==== Program de test ====
 +
 +In continuare vom face un program care prima data citeste n numere intr-un ResizableArray de dimensiune n, apoi mai citeste inca m numere pe care le introduce in acelasi ResizableArray pentru a demonstra realocarea, iar apoi va afisa elementele inainte si dupa sortarea acestora.
 +
 +<code cpp>
 +#include <​iostream>​
 +#include "​ResizableArray.h"​
 +
 +int main() {
 + // Declararea unui element de tip ResizableArray
 + ResizableArray ra; 
 +
 + // Initializarea (alocarea vectorului intern). Presupunem ca are o dimensiune n;
 + int n;
 + std::cout << "n = ";
 + std::cin >> n;
 + ra.init(n);​
 +
 + // Citirea si adaugarea a n elemente.
 + for ( int i = 0; i < n; ++i ) {
 + int x; // al i-lea element citit de la tastatura
 + std::cin >> x;
 + ra.push_back(x);​
 +
 + // Observatie: Capacitatea vectorului intern nu se modifica.
 + std::cout << "​Dimensiune:​ " << ra.size << " Capacitate " << ra.capacity << '​\n';​
 + }
 +
 + // Afisare continut vector
 + ra.print();​
 +
 + // Vom adauga in continuare inca m elemente;
 + int m;
 + std::cout << "m = ";
 + std::cin >> m;
 + for ( int i = 0; i < m; ++i ) {
 + int x; // al i-lea element citit de la tastatura
 + std::cin >> x;
 + ra.push_back(x);​
 +
 + // Observatie: Se poate modifica capacitatea vectorului intern!
 + std::cout << "​Dimensiune:​ " << ra.size << " Capacitate " << ra.capacity << '​\n';​
 + }
 +
 + // Afisare continut vector
 + std::cout << "​Inainte de sortare\n";​
 + ra.print();​
 +
 + // Vom sorta elementele apoi vom afisa din nou continutul.
 + ra.sort();
 + std::cout << "Dupa sortare\n";​
 + ra.print();​
 +
 + // Eliberare memorie
 + delete[] ra.array;
 +
 + return 0;
 +}
 +</​code>​
 +
 +Exemplu:
 +
 +<code bash>
 +n = 5
 +1         
 +Dimensiune: 1 Capacitate 5
 +7
 +Dimensiune: 2 Capacitate 5
 +13
 +Dimensiune: 3 Capacitate 5
 +2
 +Dimensiune: 4 Capacitate 5
 +41
 +Dimensiune: 5 Capacitate 5
 +Continut: 1 7 13 2 41 
 +m = 6
 +1
 +Dimensiune: 6 Capacitate 10
 +5
 +Dimensiune: 7 Capacitate 10
 +2
 +Dimensiune: 8 Capacitate 10
 +-2
 +Dimensiune: 9 Capacitate 10
 +1
 +Dimensiune: 10 Capacitate 10
 +4
 +Dimensiune: 11 Capacitate 20
 +Inainte de sortare
 +Continut: 1 7 13 2 41 1 5 2 -2 1 4 
 +Dupa sortare
 +Continut: -2 1 1 1 2 2 4 5 7 13 41
 +</​code>​
  
 ==== Verificare cu Valgrind ==== ==== Verificare cu Valgrind ====
  
 +Pentru acelasi test rulat cu <code bash> valgrind ./main.out </​code>​ toata memoria va fi eliberata.
 +
 +<code bash>
 +==8090== HEAP SUMMARY:
 +==8090== ​    in use at exit: 0 bytes in 0 blocks
 +==8090== ​  total heap usage: 3 allocs, 3 frees, 140 bytes allocated
 +==8090== ​
 +==8090== All heap blocks were freed -- no leaks are possible
 +==8090== ​
 +==8090== For counts of detected and suppressed errors, rerun with: -v
 +==8090== ERROR SUMMARY: 0 errors from 0 contexts (suppressed:​ 0 from 0)
 +</​code>​
sd-ca/articole/tutorial-01-1.1456312121.txt.gz · Last modified: 2016/02/24 13:08 by radu.stochitoiu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0