Académique Documents
Professionnel Documents
Culture Documents
Clasa a V-a
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
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;
}
2
Lecia 9 Tablouri unidimensionale in C++. Vectori de frecventa.
Clasa a V-a
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
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;
}
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
SUCCES!