Sunteți pe pagina 1din 5

Lecia 9 Tablouri unidimensionale in C++. Vectori de frecventa.

Clasa a V-a

Prelucrarea tablourilor unidimensionale

Tabloul este o structur de date intern format dint-o mulime ordonat de elemente, ordonarea fcndu-se cu un
ansamblu de indici.
Tabloul de memorie se va identifica dup un nume, iar fiecare element al su, dup numele tabloului i numrul su
de ordine. Fiecare element al structurii se identific dup numele tabloului i poziia din tablou. De la nceput trebuie
s se precizeze cte elemente are tabloul pentru ca sistemul s-i aloce zona de memorie corespunztoare. n timpul
prelucrrii tabloului nu i se pot aduga mai multe elemente dect au fost alocate, pentru c se iese din spaiul de
memorie alocat.
Tabloul de memorie este o structur de date static. Tabloul cu o singur dimensiune este numit vector.
Definiie: vectorii snt o colecie de valori de acelai tip (ntreg, caracter, sau alte tipuri), valori ce pot fi accesate dup
un indice, sau poziie, care se mai cheam i indicele n vector al acelei valori.

Exemplu:

Acest vector are numele v si are n elemente, numere intregi. Indicii elementelor sunt 0,1,2,..n-1.
Declararea unui tablou unidimensional se face prin instructiunea:
Tip_data nume [nr_elemente ];
Aici, tip_data precizeaz tipul elementelor vectorului, nume este identificatorul vectorului, iar nr_elemente este o
constant ntreag care specific numrul de elemente ale vectorului.
De exemplu, prin:
int a[10];
se declar un vector cu 10 de elemente de tip ntreg.
La declararea unui vector se pot atribui valori iniiale elementelor sale astfel:
Tip_data nume[ nr_elemente ] = { lista_valori };
Exemplu
int a[5]={10, 20, 2, 4, 9 };
n cazul declarrii unui vector iniializat se poate omite numrul elementelor sale, dac se iniializeaz toate
elementele.
Referirea la un element al vectorului se face prin construcia:
nume[indice];
unde nume este numele tabloului, iar indice este numrul de ordine al elementului n vector. n C++ numerotarea
indicilor incepe de la 0.Bineinteles ca putem sa lucram cu indici de la 1, dar in acest caz va trebui sa declaram vectorul
cu un element in plus, pentru a avea acelasi numar maxim de elemente specificat in problema de rezolvat.
Citirea unui vector Afisarea unui vector Explicatii
int n, a[100],i; int n, a[100],i; Aici indicii tabloului sunt
int main() int main() 0,1,2,99.Deci daca tabloul are n
{fin>>n; {fin>>n; elemente atunci primul indice este
for(i=0;i<n;i++) for(i=0;i<n;i++) 0, iar ultimul indice este n-1;
fin>>a[i]; fout<<a[i];
return 0; return 0;
} }
int n, a[101],i; int n, a[101],i; Aici indicii tabloului sunt
int main() int main() 1,2,100.Deci daca tabloul are n
{fin>>n; {fin>>n; elemente atunci primul indice de la
for(i=1;i<=n;i++) for(i=1;i<=n;i++) care pornim este 1 , iar ultimul
fin>>a[i]; fout<<a[i]; indice este n,desi exista si elementul
return 0; return 0; de indice 0, dar pe care noi nu il
} } folosim;

1
Lecia 9 Tablouri unidimensionale in C++. Vectori de frecventa.
Clasa a V-a

VECTORI APLICAII

Maximul dintr-un vector


Din fisierul de intrare maxim.in se citeste de pe prima linie un numar natural n, reprezentand numarul de elemente
ale unui vector, iar de pe linia urmatoare se citesc n elemente, numere intregi, separate printr-un spatiu,
reprezentand elementele vectorului. Se cere s se afieze valoarea maxim din acest vector in fisierul de iesire
maxim.out.
#include <fstream>
using namespace std;
ifstream fin("maxim.in");
ofstream fout("maxim.out");
int v[100],n;

int main()
{
int i, vmax;
fin>>n;
for ( i = 0; i < n; i++ )
fin>>v[i];
vmax = v[0];
for ( i = 1; i < n; i++ )
if ( vmax < v[i] )
vmax = v[i];
fout<<vmax;
fin.close();
fout.close();
return 0;
}

Suma elementelor unui vector


#include <fstream>
using namespace std;
ifstream fin("suma.in");
ofstream fout("suma.out");
int n,v[101];
int main()
{
int i, s=0;
fin>>n;
for ( i = 0; i < n; i++ )
{
fin>>v[i];
s= s + v[i];
}
fout<<s;
fin.close();
fout.close();
return 0;
}

2
Lecia 9 Tablouri unidimensionale in C++. Vectori de frecventa.
Clasa a V-a

Vectorul de frecvene i aplicaii (sursa algopedia)

Vectorul de frecvene reine numrul de apariii al fiecrei valori citite ntr-un vector. Folosirea vectorului de frecvene
permite scrierea unor algoritmi eficieni n cazul n care datele de intrare au valori dintr-un domeniu cunoscut care
poate fi prelucrat rapid. Folosirea unui vector de frecven sau marcare este eficient numai n cazul n care valorile
care intereseaz sunt ntregi i numrul valorilor distincte posibile este cel mult 1.000.000 pentru un timp maxim de 1
sec/test.
De exemplu acest vector poate fi folosit pentru sortarea rapid a datelor, n timp liniar.
Tot cu ajutorul acestui vector pot fi implementate operaiile de baz cu mulimi:
- Cutarea unui element
- Intersecia a dou (sau mai multe) mulimi
- Reuniunea a dou (sau mai multe) mulimi

n orice mulime elementele sunt unice, iar vectorul frecvenelor are doar valori 0 sau 1. Acest vector este numit
vectorul caracteristic al unei mulimi. Vectorul de frecvene poate fi folosit pentru a obine rapid mulimea asociat
ca un vector caracteristic astfel:
- 0 nseamn c elementul nu aparine mulimii
- o valoare diferit de 0 nseamn c elementul aparine mulimii

APLICAII ale vectorului de frecvene sau vectorului caracteristic al unei mulimi:


1. Prelucrarea cifrelor
2. Sortare n timp liniar
3. Operaii cu mulimi

Aplicaie rezolvat Cifre distincte:


Fiind dat un numr natural n ntre 1 i dou miliarde s se afieze cifrele numarului i numrul de aparitii ale fiecarei
cifre in numar.

Date de intrare
Fiierul de intrare cifdist.in conine numrul n.

Date de ieire
Fiierul de ieire cifdist.out va conine pe fiecare linie cifra si numarul de aparitii a acesteia in numar, separate printr-
un spatiu.
Restricii

Exemplu
cifdist.in cifdist.out Explicatii
2342342444 23 Numrul 2342342444 conine 3 cifre
32 distincte, 2, 3 si 4 . Cifra 2 apare in numar
45 de 3 ori, cifra 3 de 2 ori si cifra 4 de 5 ori.

Vectorul de frecven pentru cifrele unui numr se declar sub forma unui vector cu 10 componente, de la
fr[0],,fr[9]. Acestea vor fi iniializate cu 0, iar dup citirea numrului n se va incrementa cu 1 numrul apariiilor
pentru fiecare cifr a lui n.

Atenie! Vectorul de frecvene nu permite refacerea numrului citit iniial, dac este necesar valoarea acestuia
trebuie memorat separat.
Soluie: Codul C++ este dat n continuare:

3
Lecia 9 Tablouri unidimensionale in C++. Vectori de frecventa.
Clasa a V-a

#include<fstream>
using namespace std;
ifstream fin("cifdist.in");
ofstream fout("cifdist.out");
int fr[10],n,cn,c;
int main()
{
fin>>n;
cn=n;//clonam valoarea n in variabila cn
while(cn>0) //construim vectorul frecventelor
{c=cn%10;
fr[c]++;
cn=cn/10;
}
//afisam cifrele distincte si numarul de aparitii
for(c=0;c<10;c++)
if (fr[c]>0)
fout<<c<<' '<<fr[c]<<endl;
return 0;
}

Aplicaie rezolvat Numere:

Se consider un fiier text care conine maxim 100000 de numere naturale de maxim doua cifre. S se afieze
numerele din fisier precum si frecventa acestora.
Soluie: Codul C++ este dat n continuare:

#include<fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int main()
{
int x,i;
int fr[100]= {0}; //tabloul frecventelor initializat cu 0
while(fin>>x)
{
fr[x]++; //creste frecventa valorii x
}
for(i=0; i<100; i++)
if(fr[i]>0)
fout<<i<<" apare de "<<fr[i]<<" ori in fisier"<<endl;
return 0;
}

4
Lecia 9 Tablouri unidimensionale in C++. Vectori de frecventa.
Clasa a V-a

Tema

http://liis.ro/~infosuport/6/fisa_vectori.pdf
http://varena.ro problemele:cfdist, cifrecomune ,maxnr,cifre1,culori,minnrk
http://campion.edu.ro problemele: rachete,marcare
http://www.pbinfo.ro/ problemele:mincifre,numere8,numere1

Trimitei soluiile pe adresa maftei03@gmail.com sub forma unei arhive denumit cu numele vostru.
Creai arhiva urmnd paii:
1. Creai un folder cu numelevostru_tema5
2. Copiati una cte una sursele main.cpp n acest folder i redenumii-le cu numele problemei
3. Arhivai acest folder pastrand numele arhivei identic cu al folderului
4. Ataai arhiva la email-ul pe care l trimitei la adresa maftei04@gmail.com

Termen: 6 martie 2016, ora 21

SUCCES!

S-ar putea să vă placă și