Sunteți pe pagina 1din 5

Tipuri structurate tablouri

n programele scrise pn acum am folosit doar date simple: numere ntregi, numere reale, caractere.
Date simple pot pstra o singur valoare la un moment dat.
O structur de date reprezint un ansamblu de date (o colecie) organizate dup anumite reguli
i asupra crora pot fi efectuate anumite prelucrri, care depind de tipul de structur.
Pentru orice tip structurat se precizeaz:
- un nume comun pentru structur ;
- o metod de acces la valoarea unui element ;
- operaii specifice structurii.
Un exemplu de tip structurat este tabloul unidimensional, definit ca o structur care cuprinde
un numr de componente de acelasi tip, memorate ntr-o zon de memorie contigu. Tablourile
unidimensionale se numesc vectori. Un tablou unidimensional se declar prin:
tip id[dim]

tip de baz identificator numrul maxim de elemente


Tipul comun al elementelor se numeste tipul de baz al tabloului.
Identificatorul este numele structurii de tip tablou.
Dimensiunea dim reprezint numrul maxim de elemente ale vectorului, iar numrul de
elemente efectiv folosite se pstreaz n alt variabil ntreag, notat de ex. cu n.
Accesul la un element al tabloului se realizeaz printr-un indice, valoarea indicelui
indentificnd n mod unic fiecare element. Numerotarea elementelor ntr-un tablou
unidimensional ncepe de la 0.
Exemplu: int a[10]; // declar un vector a cu 10 elemente de tip numr ntreg

a[0]

a[1]

a[2]

a[3]

a[4]

a[5]

a[6]

a[7]

a[8]

Elementele unui vector pot fi iniializate la declarare:


tip id[dim] = { v0, v1, v2, , vdim-1 }
Exemplu: int a[4]={ 12, 100, 52, 37 };// a[0]=12; a[1]=100; a[2]=52; a[3]=37;
Operaii specifice tablourilor unidimensionale
1. Accesul la un element se face prin operaia de indexare: a[0 ], a[1], a[2],
2. Citirea elementelor unui tablou
se face prin parcurgerea structurii element cu element, cu instruciunea for
primul element din tablou are indicele 0, dar n algoritm este mai util s citim de la
elementul cu indicele 1
1. int a[101],i,n;
2. cin>>n;
3. for(i=1;i<=n;i++)
4.
cin>>a[i];

1. int a[101],i,n;
2. cin>>n;
3. for(i=0;i<n;i++)
4.
cin>>a[i];

a[9]

3. Afiarea elementelor unui tablou


se face prin parcurgerea structurii element cu element, cu instruciunea for
la afiarea elementelor trebuie s avem grij s scriem un caracter separator (spaiu), sau s
scriem elementele cte unul pe o linie (separator este ENTER), dup cum rezult din cerinele
problemei
1. int a[101],i,n;
2. for(i=1;i<=n;i++)
3.
cout<<a[i]<< ;

1. int a[101],i,n;
2. for(i=0;i<n;i++)
3.
cout<<a[i]<< ;

1. int a[101],i,n;
2. for(i=1;i<=n;i++)
3.
cout<<a[i]<<\n;

1. int a[101],i,n;
2. for(i=0;i<n;i++)
3.
cout<<a[i]<<\n;

4. Verificarea unei proprieti


n multe probleme trebuie s determinm:
a) toate elementele care verific o proprietate
b) primul element care verific proprietatea
c) ultimul element care verific proprietatea
a) Se consider un vector cu n elemente numere naturale (n100). S se verifice dac toate
elementele vectorului sunt numere pare.
Vom folosi o variabil ntreag, numit ok, care va avea valoarea 1 dac toate elementele
vectorului sunt numere pare si 0 n caz contrar. Presupunem iniial c toate elementele
vectorului sunt numere pare (ok=1); parcurgem vectorul i dac gsim un element impar,
vom atribui variabilei ok valoarea 0. n acel moment se iese din structura repetitiv for.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.

int a[101],i,n,ok=1;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=n && ok;i++)
if(a[i]%2!=0) ok=0;
if(ok==1) cout<<"toate numerele sunt pare";
else cout<<"exista numere impare";

b) Se consider un vector cu n elemente numere naturale (n100). S se verifice dac exist n vector
un numr negativ.
Vom folosi o variabil ntreag numit gasit, creia i vom atribui valoarea iniial 0 (adic
presupunem c toate elementele sunt pozitive). Parcurgem vectorul si dac gsim un element negativ,
vom atribui variabilei gasit valoarea 1. n acel moment se iese din structura repetitiv for.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.

int a[101],i,n,gasit=0;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=n && !gasit;i++)
if(a[i]<0)gasit=1;
if(gasit==1) cout<<"primul nr negativ "<<a[i];
else cout<<"exista numere negative";

c) Se consider un vector cu n elemente numere naturale (n100). S se afieze ultimul numr par din
vector.
Vom folosi o variabil ntreag numit gasit, creia i vom atribui valoarea iniial 0 (adic
presupunem c toate elementele sunt pozitive). Parcurgem vectorul a de la ultimul element, cu
indicele n, pn la primul element, cu indicele 1, i dac gsim un element par, vom atribui variabilei
gasit valoarea 1. n acel moment se iese din structura repetitiv for.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.

int a[101],i,n,gasit=0;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=n;i>0 && !gasit;i++)
if(a[i]%2==0)gasit=1;
if(gasit==1) cout<<"ultimul nr par "<<a[i];
else cout<<"nu exista numere pare";

Aplicaii:
1. Se consider un vector cu n elemente numere naturale (n100).
a) Afiai valoarea elementului maxim ;
b) Afiai numrul elementelor egale cu maximul ;
c) Afiai indicele primului element de valoare maxim ;
d) Afiai indicele ultimului element de valoare maxim.
2. Se consider un vector cu n elemente numere naturale (n100).
a) Afiai toate elementele care sunt numere prime;
b) Afiai cel mai mic numr prim din vector;
c) Afiai cel mai mare numr prim din vector.
5. Sortarea elementelor unui vector
Algoritmul sortrii elementelor unui vector este unul dintre cei mai importani algoritmi. Exist
multe variante ale algoritmilor de sortare, care difer prin performane i complexitate.
Problema sortrii: Se citesc cele n elemente ale unui vector din fiierul vector.in. Scriei n
fiierul vector.out elementele vectorului n ordine cresctoare.
Una din metodele de sortare cele mai folosite este sortar ea prin metoda bulelor (BubbleSort). Paii algoritmului Bubble-Sort sunt urmtorii:
P1. Presupunem c elementele vectorului sunt n ordine cresctoare, ok=1.
P2. Parcurgem toate elementele pn la penultimul element (cu indicele n-1) i comparm
perechile de elemente consecutive: x[i] i x[i+1]. Dac acestea nu sunt n ordine cresctoare,
adic x[i] > x[i+1], atunci le interschimbm valorile i schimbm valoarea variabilei ok, ok=0.
Pentru sortarea elementelor sunt necesare mai multe parcurgeri ale vectorului x.
P3. Dup fiecare parcurgere a vectorului, dac ok==0, elementele vectorului nu sunt sortate, i
revenim la pasul P1. Dac ajungem ca variabila ok==1, elementele sunt sortate cresctor.
La fiecare pas P2 elementele cu valoarea cea mai mare se deplaseaz spre dreapta vectorului,
ajungnd pe poziiile lor finale din vectorul sortat.
De exemplu, pentru n=7 i elementele x=(63 23 45 12 58 74 18) se va obine:

Pasul Vectorul
P1.
ok=1
P2.
i=1
63 > 23 45 12 58 74 18 23 63 45 12 58 74 18 ; ok=0;
i=2
23 63 > 45 12 58 74 18 23 45 63 12 58 74 18 ; ok=0;
i=3
23 45 63 > 12 58 74 18 23 45 12 63 58 74 18 ; ok=0;
i=4
23 45 12 63 > 58 74 18 23 45 12 58 63 74 18 ; ok=0;
i=5
23 45 12 58 63 < 74 18
i=6
23 45 12 58 63 74 > 18 23 45 12 58 63 18 74 ; ok=0;
P3.

iniial
1.
2.
3.
4.
5.
6.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.

ok==0

ok=1; 63 23 45 12 58 74 18 ok=0;
ok=1; 23 45 12 58 63 18 74 ok=0;
ok=1; 23 12 45 58 18 63 74 ok=0;
ok=1; 12 23 45 18 58 63 74 ok=0;
ok=1; 12 23 18 45 58 63 74 ok=0;
ok=1; 12 18 23 45 58 63 74 ok=0;
ok=1; 12 18 23 45 58 63 74 ok=1;
#include <fstream>
using namespace std;
ifstream fin("vector.in");
ofstream fout("vector.out");
int main()
{
int x[101],i,n,aux,ok;
//citirea elementelor
fin>>n;
for(i=1;i<=n;i++)
fin>>x[i];
//sortare cu algoritmul BubbleSort
do{
ok=1;
for(i=1;i<n;i++)
if(x[i]>x[i+1])
{ aux=x[i];
x[i]=x[i+1];
x[i+1]=aux;
ok=0;
}
}while (ok==0);
//scrierea elementelor
for(i=1;i<=n;i++)
fout<<x[i]<<' ';
fin.close();
fout.close();
return 0;
}

6. Aplicaii ale sortrii


a) Cutarea binar

Se consider un vector cu n componente ntregi (n100) si o valoare ntreag x. S se verifice dac


x apare sau nu n vector.
Aceast problem poate fi rezolvat prin parcurgerea succesiv a tuturor elementelor din vector i
verificarea egalitii. Aceast metod se numete cutare secvenial, i este ineficient pentru un
numr mai mare de elemente, avnd un timp prea mare de execuie.
n cazul n care elementele vectorului sunt sortate (cresctor sau descresctor) poate fi aplicat un
algoritm mult mai eficient, numit algoritmul cutrii binare. n aceast situaie,
comparm valoarea x cu elementul din mijlocul vectorului i avem urmtoarele posibiliti:
- x este egal cu elementul din mijloc, deci am terminat cutarea
- x este mai mic dect elementul din mijloc, deci vom continua cutarea n prima jumtate a
vectorului, unde se afl elementele mai mici dect elementul din mijloc
- x este mai mare dect elementul din mijloc, deci vom continua cutarea n a doua jumtate a
vectorului, unde se afl toate elementele mai mari dect cel din mijloc.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.

int n,a[101],x;
int s, d, m, gasit=0;
//citirea vectorului
while (!gasit && s<=d)
{ m=(s+d)/2;
if (x==a[m]) gasit=1;
else
if (x>a[m]) s=m+1;
else d=m-1;}
if (gasit)cout<<m;
else cout<<-1;
}
//scrierea elementelor

b) Interclasarea a doi vectori


Fie a un vector cu n elemente i b un vector cu m elemente, ordonai cresctor. S se construiasc
un al treilea vector, c, care s conin att elementele vectorului a, ct i elementele vectorului b, n
ordine cresctoare.
Exemplu: daca vectorul a are elementele (2,4) iar b are elementele (1,3,5,6,8) se va obine vectorul
c cu elementele (1,2,3,4,5,6,8).
O metod eficient de rezolvare a acestei probleme este urmtoarea: parcurgem simultan cei doi
vectori, comparnd la fiecare pas elementul curent din a cu elementul curent din b. Cel mai mic
dintre ele va fi copiat n vectorul c i vom avansa n vectorul din care am copiat i n vectorul c. Cnd
am ajuns la captul unui vector, copiem n c elementele rmase n cellalt vector.
Algoritmul de interclasare este urmtorul:
1.
2.
3.
4.
5.
6.
7.
8.
9.

i=1; j=1; k=1;


while (i<=n && j<=m)
if (a[i]<b[j])
{c[k]=a[i]; k++; i++;}
else {c[k]=b[j]; k++; j++;}
while (i<=n)
{c[k]=a[i]; k++; i++;}
while (j<=n)
{c[k]=b[j]; k++; j++;}