Sunteți pe pagina 1din 13

TABLOURI

In mod surprinzator, incepem cu tabloul, structura fundamentala, predefinita in majoritatea limbajelor de programare. Necesitatea de a elabora o noua structura de acest tip provine din urmatoarele inconveniente ale tablourilor predefinite, inconveniente care nu sunt proprii numai limbajelor C si C++: Numarul elementelor unui tablou trebuie sa fie o expresie constanta, fixata in momentul compilarii. Pe parcursul executiei programului este imposibil ca un tablou sa fie marit sau micsorat dupa necesitati. Nu se verifica incadrarea in limitele admisibile a indicilor elementelor tablourilor. Tabloul si numarul elementelor lui sunt doua entitati distincte. Orice operatie cu tablouri (atribuiri, transmiteri de parametri etc) impune specificarea explicita a numarului de elemente ale fiecarui tablou. Un sir de elemente de acelai tip, n care conteaz ordinea elementelor, se numete vector sau tablou unidimensional. Un tablou este o structura formata dintr-un numr fixat de componente de acelai tip, numit tip de baza. Numrul de componente este determinat de numrul de valori ale indicilor, care sunt obligatoriu tipuri ordinale. Poziia unui element se mai numete si indicele sau rangul elementului, iar elementele se mai numesc si componente ale vectorului. OBSERVATII: In cazul in care tip_ordinal este unul din tipurile intregi,este obligatoriu sa folosim subdomeniile lui variabila v este un tablou de dimensiune 1 cu 100 componente intregi identificate prin indici din subdomeniul 1..100. Aici tipul ordinal este subdomeniu al tipului int, iar tipul oarecare este tot int. Componentele unui tablou sunt memorate pe zone de memorii consecutive. Adresarea unei componente a tabloului se face prin indice (o valoare a tipului ordinal) care se specifica dup numele tabloului, ntre paranteze drepte. Prin declararea unui vector vom nelege numrul maxim de elementele acestuia. Numrul elementelor efective folosite, care difer de la o execuie la alta se numete numr real (efectiv de elemente).

"Vizualizarea" tuturor elementelor pe rnd si prelucrare acestora se numete parcurgere. Parcurgerea intr-un ciclu poziiile elementelor din vector i=1,2,3,...,n si pentru fiecare valoare a lui i, "vizitm" si prelucram elementul v[i], adic elementul aflat pe poziia i.

TABLOURI UNIDIMENSIONALE

Structura de date este o colecie de date nzestrat cu informaii structurale care permit identificarea i selecia componentelor. Componentele unei structuri de date pot fi identificate si selectate fie prin numele, fie prin intermediul relaiilor structurale. Cea mai simpla relaie structurala este poziia fiecrei componente in cadrul structurii. Asupra unei structuri de date se pot aplica mai multe tipuri de operaii :vizualizarea elementelor structurii sub diferite forme, actualizarea(adugarea, modificarea sau tergerea unei componente), mbogirea structural(prin adugarea unor informaii de legtura) sortare(aranjarea componentelor intr-o anumita ordine stabilita de un anumit criteriu de ordonare. Din punct de vedere al coninutului, structurile pot fi: -omogene(toate componentele structurii sunt de acelai tip) -neomogene(componentele structurii sunt de tipuri diferite) in funcie de modul in care sunt memorate structurile de date se mpart in doua mari categorii: -Structuri interne, sunt create in memoria interna RAM a sistemului, i au un caracter temporar, datorit faptului ca memoria interna este volatila. -Structuri externe, sunt depozitate pe un suport de memorie externa (hard-disk.floppydisk), avnd astfel un caracter permanent. Tablourile unidimensionale sunt tablouri cu un singur indice (vectori). Dac tabloul conine dim_1 elemente, indicii elementelor au valori ntregi din intervalul [0, dim_1-1]. La ntlnirea declaraiei unei variabile tablou, compilatorul aloc o zon de memorie continu (dat de produsul dintre dimensiunea maxim i numrul de octei corespunztor tipului tabloului) pentru pstrarea valorilor elementelor sale. Numele tabloului poate fi utilizat n diferite expresii i valoarea lui este chiar adresa de nceput a zonei de memorie care i-a fost

alocat. Un element al unui tablou poate fi utilizat ca orice alt variabil (n exemplul urmtor, atribuirea de valori elementelor tabloului vector). Se pot efectua operaii asupra fiecrui element al tabloului, nu asupra ntregului tablou. Exemplu: // Declararea tabloului vector int vector[6]; // Iniializarea elementelor tabloului vector[0]=100; vector[1]=101; vector[2]=102; vector[3]=103; vector[4]=104; vector[5]=105; Exemplu: double alpha[5], beta[5], gama[5]; int i=2; alpha[2*i-1] = 5.78; alpha[0]=2*beta[i]+3.5; gama[i]=aplha[i]+beta[i]; gama=alpha+beta; //permis //nepermis vector 100 101 102 103 104 105 vector[0] vector[1] vector[2] vector[3] vector[4] vector[5]

Variabilele tablou pot fi iniializate n momentul declarrii: declaraie_tablou=list_valori; Valorile din lista de valori sunt separate prin virgul, iar ntreaga list este inclus ntre acolade: Exemple: //1 int vector[6]={100,101,102,103,104,105}; vector 100 [0] //2 101 102 103 104 105 [5]

double x=9.8; double a[5]={1.2, 3.5, x, x-1, 7.5}; La declararea unui vector cu iniializarea elementelor sale, numrul maxim de elemente ale tabloului poate fi omis, caz n care compilatorul determin automat mrimea tabloului, n funcie de numrul elementelor iniializate. Exemplu: char tab[]={ A, C, D, C}; tab A [0] B 1 C D [3]

float data[5]={ 1.2, 2.3, 3.4 };

data

1.2 [0]

2.3

3.4

? [4]

Adresa elementului de indice i dintr-un tablou unidimensional poate fi calculat astfel: adresa_elementului_i = adresa_de_baz + i lungime_element

OPERAII CU VECTORI

O variabila de tip tablou nu poate fi citita sau scrisa in ntregime. Se pot face atribuiri intre variabile de acelai tablou. Dar, e preferabil sa se lucreze pe componente .Cu componentele unui tablou Se pot face toate operaiile ce Se pot face cu orice variabil de acel tip (afiare, citire, atribuire etc)

1Citirea unui vector Aceasta nseamn citirea numrului n de componente, intr-un ciclu for. #include<iostream.h>

void main() { int v[100],n,i; cout<<numarul de componente; cin>>n; for(i=1;i<=n;i++) cout<<v[<<i<<]=; cin>>v[i]; }

2.Scrierea unui vector

Cnd trebuie sa afim vectorul, adic toate componentele sale efective numrul acestora este cunoscut. Afiarea se realizeaz ciclic si poate fi astfel: -fiecare element pe un rnd(folosita mai ales cnd avem vectori si iruri de caractere) -toate elementele pe acelai rnd, desprite de virgula si/sau spatii(in cazul valorilor numerice) 3.Inversarea unui vector in alt vector Vom inversa vectorul x in vectorul y, de acelai tip cu x, deci vom pune in componenta y[1] pe x[n],in componenta y[2] pe x[n-1]...,in componenta y[n] pe x[1].

4.Inversarea unui vector in el insasi Va trebui sa schimbam prima componenta cu ultima,pe a doua cu penultima s.a.m.d.,pana la mijloc vom intelege n div 2 indiferent daca n este par sau impar.Asadar,va trebui sa parcurgem vectorul pana la n div 2 intershimband pe x[i] cu x[n+1-i].

5.Determinarea elementului minim dintr-un vector Aceasta problema se rezolva astfel:consideram minim primul element,apoi parcurgem restul vectorului si,ori de cate ori gasim un element mai mic actualizam minimul la valoarea acelui element #include<iostream.h> main() { int v[9],n,i,min; cout<<n=; cin>>n; for(i=1;i<=n;i++) cin>>v[i]; min=v[1]; for(i=1;i<=n;i++) if (v[i]<min) min=v[i]; cout<<valuarea minima citita este <<min; } In acest moment,la sfarsitul ciclului,variabila minim(de acelasi tip ca si componentele x) contine cel mai mic element din vector 6.Determinarea elementului maxim dintr-un vector Se actualizeaza maximul intr-o variabila max.Algoritmul este asemanator cu cel de minim.Initializam maximul cu primul element.Parcurgem intr-un ciclu pozitiile celorlalte elemente i pentru fiecare element v[i],daca v[1] mai mic decat v[i],atunci v[i] devine noul maxim. 7.Insumarea componentelor unui vector de numere Suma componentelor unui vector se calculeaza ca orice suma,se pleaca cu suma nula,apoi la fiecare pas i (i de la 1 la n),suma creste cu elementul curent,care este x[i]. suma=0; for(i=1;i<=n;i++)

cin<<x[i]; suma=suma+x[i];

Metode de sortare
Se citesc n numere intregi, operatia prin care se aranjeaza cele n numere in ordine crescatoare (descrescatoare) se numaste sortare. Pentru a sorta cele n valori, aceste se citesc intr-o variabila e tip tablou. Sortarea se va face in cadrul acestei variabile. Vom presupune ca se citesc 4 valori 3,1,4,2. a. SELECTION SORT-Sortarea prin selectarea minimului(maximului). Algoritmul este: Se determina minimul dintre valorile retinute, incepand cu prima pozitie; Minimul este trecut pe prima pozitie, prin interschimbarea continuturilor dintre componenta de indice 1 si componenta care il memoreaza; Se determina minimul dintre valorile retinute incepand cu a doua pozitie; Minimul este trecut in pozitia doi , prin interschimbarea continuturilor dintre componenta de indice 2 si componenta care il memoreaza; Se determina minimul dintre valorile retinute, incepand cu a treia pozitie; Minimul este trecut in pozitia 3, prin interschimbarea continuturilor dintre componenta de indice 3 si componenta care il memoreaza; Se determina minimul dintre valorile retinute, incepand cu penultima pozitie; Minimul este trecut in penultima pozitie, prin interschimbarea continuturilor dintre componenta de indice n-1 si componenta care il memoreaza.

Exemplu. Continutul variabilei care retine numerele citite este:

3 A A[1]

A[2]

A[3]

A[4]

Minimul este 1 si se gaseste in pozitia 2. Se inverseaza continuturile componentelor 1 si 2.

1 A A[1]

A[2]

A[3]

A[4]

Se determina minimul dintre valorile retinute in componentele de la 2 la 4. Acesta este 2 si este retinut de componenta 4. Se inverseaza continutul componentelor 2 si 4.

1 A

A[1] A[2] A[3] A[4] Se determina minimul dintre valorile retinute in componentele de la 3 la 4. Acesta este 3 si este retinut de componenta 4. Se inverseaza continutul componentelor 3 si 4. 1 A A[1] maximul. #include<iostream.h> int a[9],n,i,j,k,man,min; void main() { cout<<n=; cin>>n; for (i=0;i<n;i++) { cout<<a[<<i+1<<]=; cin>>a[i]; } for (i=0;i<n-1;i++) { min=a[i]; k=i; for (j=i+1;j<n;j++) if (a[j]<min) { min=a[j]; k=j; } man=a[k]; a[k]=a[i]; a[i]=man; } for (i=0;i<n;i++) cout<<a[i]<<endl; } A[2] A[3] A[4] 2 3 4

In cazul in cae se cere sortarea descrescatoare, la fiecare pas se calculeaza

b. BUBBLE SORT- Sortarea prin interschimbare. Algoritm: Se parcurge variabila inversand continuturile componentelor alaturate care nu sunt in ordine crescatoare (descrescatoare); Procedeul se repeat pana cand are loc o parcurgere in care nu se fac inversari Exemplu:

3 A A[1] Se efectueaza prima componentele 1 si 2. Se obtine:

A[2] parcurgere.

A[3] Se

A[4] valorile retinute de

inverseaza

1 A A[1]

A[2]

A[3]

A[4]

Valorile retinute de componentele 2 si 3 nu se inverseaza. In schimb, se inverseaza valorile retinute de componentele 3 si 4.

1 A A[1]

A[2]

A[3]

A[4]

Intrucat au avut loc inversari se parcurge vectorul. Se inverseaza valorile retinute de componentele 2 si 3:

1 A A[1]

A[2]

A[3]

A[4]

Alte inversari nu se fac. Intrucat in actuala parcurgere au fost facute inversari, se reparcurge vectorul, de data asta inutil si algoritmul se incheie. #include<iostream.h> int a[9],n,i,k,man,gasit; void main() { cout<<n=; cin>>n; for (i=1;i<n;i++) { cout<<a[<<i+1<<]=; cin>>a[i]; } do { gasit=0; for (i=1; i<n;i++) if (a[i]>a[i+1]) { man=a[i]; a[i]=a[i+1]; a[i+1]=man; gasit=1; } } while (gasit); for (i=1;i<=n;i++) cout<<a[i]<<endl; } c. INSERTION SORT -Sortarea prin insertie Cu ajutorul variabilei citite A(vector) se aranjeaza valorile intr-o alta B in ordine crescatoare. Se procedeaza astfel: B[1]=A[1]; Fiecare din valorile retinute de componentele de la 2 la n (in ordinea indicilor) se insereazaintre valorile ordonate deja ale vectorului B. Pentru realizarea inserarii unei valori, se parcurge vectorul Bde la dreapta la stanga pana se gaseste o componenta care retine o valoare mai mare(mica) decat cea care se insereaza, sau pana canda ost parcurs intreg vectorul. Incepand cu valoarea retinuta de componenta care va fi ocupata de valoarea inserata, toate valorile retinute se deplaseaza catre dreapta cu o pozitie. Exemplu: B[1]=A[1]

3 A A[1]

A[2]

A[3]

A[4]

10

3 B B[1] B[2] B[3] B[4]

Valoarea 1 trebuie inserata inaintea valorii 3. Pentru aceasta, 3 se deplaseaza la dreapta cu o pozitie sip e pozitia sa se insereaa valoarea 1.

3 A A[1]

A[2]

A[3]

A[4]

1 B B[1]

B[2]

B[3]

B[4]

Valoarea 4 trebuie inserata dupa 3. Pentru aceasta nu este necesara nici o deplasare.

3 A A[1] A[2]

A[3]

A[4]

1 B B[1] B[2]

B[3]

B[4]

Valoarea 2 se insereaza pe pozitia ocupata de valoarea 3. Pentru aceasta, valorile 3 si 4 se deplaseaza la dreapta cu cate o pozitie.

3 A A[1] A[2]

A[3]

A[4]

11

1 B B[1] B[2]

B[3]

B[4]

Acum vectorul B retine valorile sortate. #include<iostream.h> int a[9],b[9],n,i,j,k,gasit; void main() { cout<<n=; cin>>n; for (i=0;i<n;i++) { cout<<a[<<i+1<<]=; cin>>a[i]; } b[0]=a[0]; for (i=1;i<=n;i++) { j=i-1; while (j>=0 && a[i]<b[j]) j--; for (k=i-1;k>=j+1;k--) b[k+1]=b[k]; b[j+1]=a[i]; } for (i=1;i<=n;i++) cout<<b[i]<<endl; }

12

BIBLIOGRAFIE: 1. Totul despre C si C++, Dr. Kris Jamsa Lars Klander, Editura TEORA, 2005 2. Bazele programarii in C++, Doina Logofatu, Editura Polirom, 2004 3. Informatica varianta C++, Tudor Sorin, Editura L&S Informat, 2000 4. C++, George Mateescu, Editura Petrion, 2003 5. Manual de programare in C++, Stefan Prata, Editura TEORA, 2004

13