curs6_an1_sem1_14_15

Upload: thehelper

Post on 01-Mar-2016

5 views

Category:

Documents


0 download

DESCRIPTION

Curs6_an1_sem1_14_15

TRANSCRIPT

  • CURS 6

    Tablouri

  • CUPRINS

    1. Noiuni introductive

    2. Tablouri unidimensionale

    3. Tablouri multidimensionale

    4. Elemente de tablou

    5. Iniializarea tablourilor la declarare

    6. Prelucrarea tuturor elementelor unui tablou

    7. Transmiterea tablourilor ctre funcii

    8. Cutarea n tablouri

    9. Inserarea n tablouri

    10. tergerea din tablouri

    2

  • 1. NOIUNI INTRODUCTIVE

    Tinand cont de imporanta noiunii de tablou n domeniul ingineresc relum i detaliem unele aspecte referitoare la tablouri.

    Un tablou este o list de elemente de acelai tip plasate succesiv ntr-o zon contigu de memorie

    Orice tablou are un nume (care este un pointer

    constant ctre primul element din tablou)

    Tipul elementelor tabloului reprezint tipul tabloului respectiv 3

  • 2. TABLOURI UNIDIMENSIONALE

    Declaraia tabloului:

    tip nume_tablou[dimensiune];

    tip este un tip de dat (predefinit sau definit de utilizator)

    nume_tablou este un identificator C/C++

    dimensiune este o expresie constant ntreag i pozitiv ce specific numrul de elemente din tablou

    4

  • TABLOURI UNIDIMENSIONALE

    Pentru referirea unui element se folosete operatorul de indexare [ ], preciznd numele tabloului i poziia elementului n tablou (indexul sau indicele):

    nume_tablou[index]

    Indexul este, n general, o expresie ntreag i pozitiv

    primul element are indexul 0

    ultimul are indexul (dimensiune-1)

    5

  • TABLOURI UNIDIMENSIONALE

    Pe baza numrului de elemente i a tipului, compilatorul determin dimensiunea zonei de memorie care se aloc tabloului, dup relaia:

    dimens_memorie = sizeof(tip) * dimensiune

    Exemplu:

    int tab[100];

    primul element: tab[0]

    ultimul element: tab[99]

    un element oarecare , i+1: tab[i]

    dimensiunea tabloului este: sizeof(int)*100 = 2(4)00

    6

  • TABLOURI UNIDIMENSIONALE

    Dup alocarea memoriei necesare, la compilarea restului programului sau la execuie, nu se mai fac verificri de domeniu la indici

    de exemplu o referire de genul tab[200] nu va fi

    semnalat ca eroare ns va genera surprize la execuie

    acest lucru impune o mai mare atenie din partea programatorului

    7

  • TABLOURI UNIDIMENSIONALE

    Observaii:

    1. Dimensiunea specificat la declarare poate fi o expresie constant ntreag:

    const int SIZE = 10;

    int score[SIZE/2];

    2. Nu se admite ca dimensiune o expresie n care intervin variabile:

    int size;

    cout

  • 3. TABLOURI MULTIDIMENSIONALE

    Declaraie:

    tip nume_tablou[dimens1][dimens2]...[dimensN];

    dac n=1, tabloul se numete uni-dimensional (vector, dar e impropriu ca noiune): int tab[100];

    dac n=2, tabloul se numete matrice:

    float tab[10][5];

    n general pentru un n oarecare, tablou n-dimensional

    Mediile de programare pot impune restricii legate de numrul maxim de dimensiuni admise pentru un tablou multidimensional, limbajul C/C++ nu impune

    ns o limitare 9

  • TABLOURI MULTIDIMENSIONALE

    Un tablou cu mai multe dimensiuni este de fapt un

    tablou unidimensional avnd ca elemente alte tablouri

    Exemplu: int tab[2][3];

    este un tablou cu 2 elemente iar fiecare element este

    un tablou 3 de numere ntregi

    Organizarea logic:

    10

    Col

    Linie

    0 1 2

    0 tab[0][0] tab[0][1] tab[0][2]

    1 tab[1][0] tab[1][1] tab[1][2]

  • TABLOURI MULTIDIMENSIONALE

    Organizarea n memorie:

    Referirea unui element se face astfel:

    nume_tablou[index1][index2]...[indexN]

    0 tab[0][0]

    1 tab[0][1]

    2 tab[0][2]

    3 tab[1][0]

    4 tab[1][1]

    5 tab[1][2]

    11

  • 4. ELEMENTE DE TABLOU

    Un element de tablou poate apare oriunde poate s apar o variabil simpl cu acelai tip: atribuiri:

    tab[i] = 23;

    citiri de la consol:

    cin >> tab[i];

    scanf(%d, &tab[i]);

    afiri:

    cout

  • 5. INIIALIZAREA TABLOURILOR LA DECLARARE

    Dac nu sunt iniializate explicit, tablourile locale (ca i variabilele simple), vor conine valori nedefinite la nceperea execuiei

    Iniializarea se poate face la declarare, prin utilizarea unei liste de valori separate prin virgul i delimitat de acolade

    13

  • INIIALIZAREA TABLOURILOR

    Tablouri unidimensionale:

    tip nume_tablou[dimensiune] = {ec0, ..., ecN-1};

    dac dimensiunea lipsete numrul expresiilor constante d dimensiunea tabloului

    elementele care nu se iniializeaz explicit sunt automat iniializate cu 0 (la tablourile globale)

    n cazul irurilor de caractere acoladele pot lipsi

    Exemple:

    int tab[ ] = {1,3,5,7,9,11};

    float tab[5] = {0,1,2};

    char tab[ ] = "abcd";//4 elemente si \0

    char aa[] ={'a','b','c','d,\0'};//dim. 5 explicit \0

    char bb[5] ={'a','b','c','d'};//dim. maxim 5 explicit specificata

    14

  • INIIALIZAREA TABLOURILOR

    Tablouri multidimensionale:

    tip nume[n][m]= {

    {ec11,...,ec1m},

    {ec21,...,ec2m},...,

    {ecn1,...,ecnm}

    };

    unde: n, m, ecij, sunt expresii constante (indicii de la 0 la

    n-1, respectiv de la 0 la m-1)

    acoladele interioare nu sunt obligatorii, dar ele specific modul de iniializare pe linii

    Exemplu:

    int tab[3][2] = { {10,11},

    {12,13},

    {14,15} }; 15

  • 6. PRELUCRAREA ELEMENTELOR UNUI TABLOU

    Se utilizeaz cel mai frecvent instruciunea ciclic for pentru a prelucra secvenial toate elementele:

    variabila de ciclare este folosit ca i index n tablou

    iar o alt variabil sau constant simbolic ce conine dimensiunea tabloului se folosete n condiia asociat instruciunii ciclice

    16

  • PRELUCRAREA ELEMENTELOR UNUI TABLOU

    Tablouri unidimensionale

    for (int i=0; i> temperature[i];

    for (int i=0; i

  • PRELUCRAREA ELEMENTELOR UNUI TABLOU

    Tablouri bidimensionale

    int numArr[10][10];

    for (int row = 0; row < 10; row++)

    for (int col = 0; col < 10; col++) { cout

  • PRELUCRAREA ELEMENTELOR UNUI TABLOU

    Exemplu tablouri bidimensionale: suma elementelor de

    pe diagonala principal

    int arr[10][10];

    int sum = 0;

    for (int row = 0; row < 10; row++)

    for (int col = 0; col < 10; col++)

    if (row == col)

    sum += arr[row][col];

    cout

  • 7. TRANSMITEREA TABLOURILOR CTRE FUNCII

    Un tablou poate fi transmis ca parametru unei funcii. n acest caz:

    Parametrul formal e declarat ca i un tablou de acelai

    tip i dimensiune cu tabloul folosit ca argument, sau

    Parametrul formal e declarat ca i un tablou de la care

    poate lipsi prima dimensiune (stnga), sau

    Parametrul formal e un pointer ctre tipul tabloului.

    In toate cazurile, la apel ca argument se d doar adresa tabloului

    20

  • La tablourile unidimensionale se poate considera ca parametru un tablou fr dimensiune. Uzual, n acest caz, se mai transmite i un ntreg ce poate fi:

    dimensiunea tabloului

    numrul de elemente din tablou ce se prelucreaz

    In acest mod, funcia respectiv poate fi apelat pentru orice tablou ce are acelai tip precizat n prototipul funciei

    21

  • TRANSMITEREA TABLOURILOR CTRE FUNCII

    // prototip

    void read_data(int score[ ], int size);

    // definitie

    void read_data(int score[ ], int size)

    {

    for (int i=0; i> score[i];

    }

    // apel

    int tab1[120], tab2[110];

    read_data(tab1,120);

    read_data(tab2,110);

    22

  • TRANSMITEREA TABLOURILOR CTRE FUNCII

    Primul parametru la apel se mai numete i parametru tablou (adresa primului element din tablou)

    Un astfel de parametru este o form de apel prin adresa n care se comunic funciei aproape totul despre tablou (cu excepia dimensiunii)

    Pe baza acesteia i a indexului unui element se poate calcula adresa oricrui element din tablou

    La apelul prin adresa, orice modificare, n funcie, a elementelor unui tablou transmis ca si parametru, se

    reflect asupra tabloului iniial

    23

  • TRANSMITEREA TABLOURILOR CTRE FUNCII

    Dac se folosete modificatorul const pentru tablou atunci nu se mai pot face modificri asupra elementelor tabloului:

    void displayArray ( const int arr [ ], int MAXSIZE );

    n cazul tablourilor multidimensionale, prima dimensiune, (cea din stnga) poate lipsi datorit mecanismului de alocare a tablourilor n memorie n C:

    void display(char p[ ][100], int size)

    24

  • TRANSMITEREA TABLOURILOR CTRE FUNCII

    const int SIZE=5;

    double calcAvg (double numbers[ ], int max); // prototip

    void printArray(double[ ], int); // prototip

    void main( ) {

    double temps[SIZE];

    int index;

    double avg;

    cout

  • TRANSMITEREA TABLOURILOR CTRE FUNCII

    //implementarea functiei calcAvg

    double calcAvg (double numbers[ ], int count)

    {

    double sum=0; for (int i=0; i

  • 7. CUTAREA N TABLOURI

    Este o operaie foarte frecvent

    De obicei se caut poziia unui element cu o anumit valoare

    Dac tabloul nu este sortat se aplic cutarea liniar:

    care const n parcurgerea secvenial a elementelor tabloului i compararea acestora cu valoarea de cutat

    dac este gsit un element ce are acea valoare, se returneaz indicele elementului, altfel se returneaz valoarea -1

    acest algoritm permite gsirea primului element ce are o anumit valoare ns pot fi mai multe elemente cu aceeai valoare

    27

  • CUTAREA N TABLOURI

    int linear_search(int arr[ ], int n, int val)

    {

    int pos;

    for(pos = 0; pos < n; pos++)

    if (arr[pos] == val)

    return pos;

    return -1;

    }

    Aceast metod este suficient de bun pentru tablouri mici (sute de elemente)

    Pentru tablouri mari este necesar o operaie prealabil de sortare dup care se pot folosi ali algoritmi ce permit reducerea numrului de comparaii

    28

  • CUTAREA N TABLOURI

    Cutarea binar:

    tabloul se consider sortat

    se verific dac elementul din mijloc are valoarea cutat

    dac da, se returneaz poziia acestuia

    dac nu, se restrnge cutarea la una din cele dou jumti (stnga sau dreapta)

    se continu n acest mod pn la gsirea unui element sau pn cnd intervalul de cutare devine nul

    29

  • CUTAREA N TABLOURI

    // se presupune ca tabloul este sortat crescator

    int binarySearch(int arr[ ], int size, int target){

    int middlePosition, middleValue;

    int low = 0, high = size - 1;

    while (low

  • 8. INSERAREA N TABLOURI

    In cazul tablourilor nesortate, pentru a insera

    elemente noi ntr-un tablou trebuie s inem cont de urmtoarele:

    trebuie s existe poziii libere n tablou;

    pentru elementul nou se creaz loc prin deplasarea altor elemente, de obicei spre dreapta

    In cazul tablourilor sortate trebuie gsit mai nti poziia n care se va face inserarea astfel nct dup inserare tabloul s rmn sortat

    31

  • INSERAREA N TABLOURI

    Tablouri nesortate

    void insert_at(int arr[ ], int n, int idx, int val)

    {

    if (idx == -1)

    arr[n] = val; // adaugare

    else

    {

    // deplasare dreapta

    for(int i = n; i > idx; i) arr[i] = arr[i-1];

    // inserare valoare noua

    arr[idx] = val;

    }

    }

    32

  • INSERAREA N TABLOURI

    Tablouri sortate

    void insertElement ( int arr [ ], int &size, int newElement ) { int insertPosition, k; // cautare pozitie inserare

    insertPosition = -1; do insertPosition++; while ( newElement > arr[insertPosition] && insertPosition != size - 1 ); if ( newElement = insertPosition; k-- ) arr[k+1] = arr[k]; // inserare

    arr[insertPosition] = newElement; } else arr[size] = newElement; // adaugare size++;//se va vedea si in exterior }

    33

  • 9. TERGEREA DIN TABLOURI

    Ca i inserarea, tergerea presupune deplasarea unor elemente, de obicei spre stnga

    Se presupune c se cunoate poziia n care se face tergere (dac nu se face cutarea elementului de tablou cu o anumit valoare)

    void deleteElement ( int arr [ ], int &size, int position ) //size is reference to have the modified value outside

    { int k; if ( position >= size ) cout