Documente Academic
Documente Profesional
Documente Cultură
PROIECT ATESTAT
INFORMATICA
TEMA:
TABLOURI
UNIDIMENSIONALE
CUPRINS
1. Tablouri unidimensionale
pag. 4
2. Vectori de frecventa
pag. 10
3. Tablouri multidimensionale
..... pag. 13
4. Sortari ..
..... pag. 14
5. Exerciti si probleme
.. pag. 21
6. Bibliografie
. pag.
30
1.Tablouri
unidimensionale: vectori
Un tablou unidimensional care conine valorile Val1, Val2, etc., poate fi reprezentat
grafic astfel:
Nume vector: a
Dimensiune vector: n
Elemente:
Val1
Primul element
Val2
Val3
Val4
Val5
Ultimul element
Elementele sale sunt memorate unele dup altele ocup un spaiu continuu de
memorie. Modul de declarare al unui vector cu dimensiune constant este
urmtorul:
Sintaxa:
tip_de_baz nume_tablou [dimensiune] = { const0, const1, ...}
Unde:
tip_de_baz este tipul elementelor;
dimensiune reprezint numrul maxim de elemente ale tabloului i este n
general o
constant ntreag (de obicei o constant simbolic);
const0, const1, etc. reprezint valori constante de iniializare, i prezena
lor este opional.
Memoria ocupat de un vector este egal cu dimensiune * sizeof(tip).
Exemple:
int tab[10];
float v[60];
#define N 10
int tab[N];
dimensiunile maxime. De asemenea, vom mai avea o variabil n care vom pstra
numrul efectiv de elemente din vector numele variabilei este de obicei n!
Exemplu:
#define M 100
// dimensiune maxima vector
int main () {
int a[M], n;
scanf ("%d", &n); // citeste dimensiune efectiva
if ( n > M) {
printf ("Eroare: n > %d \n",M); return;
}
... // citire i utilizare elemente vector
2,
dimensiunea
fiind
data
de
numarul
precizate,
Fiecare element din vector este identificat printr-un indice ntreg, pozitiv care arat
poziia sa n vector; selectarea unui element folosete operatorul de indexare: []
paranteze drepte. Se spune c accesul este direct la orice element din vector.
Selectarea unui element dintr-un vector:
nume_tablou [indice]
unde indice este o expresie ntreag cu valori ntre 0 i
dimensiune -1.
Un element de tablou poate fi prelucrat ca orice variabil avnd tipul
de baz.
Numerotarea elementelor fiind de la zero, primul element din orice vector are
indicele zero, iar ultimul element dintr-un vector are un indice mai mic cu 1 dect
numrul elementelor din vector.
Exemple:
Utilizarea unui vector presupune repetarea unor operaii asupra fiecrui element
din vector deci folosirea unor structuri repetitive. De obicei, pentru a realiza o
prelucrare asupra tuturor elementelor tabloului se folosete instruciunea for cu o
variabil contor care s ia toate valorile indicilor ( ntre 0 si dimensiune -1 ).
Exemplu:
#define N 10 int tab[N], i;
for(i=0; i<N; i++)
//prelucrare tab[i]
Dup cum spuneam, de obicei nu toate elementele tabloului sunt folosite, ci doar
primele nr_elem<=dimensiune ( vezi programul urmtor, se pot citi doar primele
nr_elem ):
int a[100], n, i;
// vectorul a de max 100 de intregi, n numrul efectiv de elemente folosite
//citirea i afiarea unui vector de ntregi:
scanf ("%d",&n);
// citete nr efectiv de elemente din vector
for (i=0;i<n;i++)
scanf ("%d", &a[i]);
// citire elemente vector
for (i=0;i<n;i++)
printf ("a[%d]=%d\n", i, a[i]); // scrie elemente vector
//suma elementelor 0..n-1 din vectorul a
int s;
for (i=0, s=0; i<n; i++)
s = s + a[i];
Observa ii:
Nici compilatorul, nici mediul de execuie nu verific valorile indicilor.
Cu
alte
cuvinte,
nu
sunt
generate
mod
normal
avertizri/erori
Exemple:
#define N 10 int
tab[N];
tab[N]=5; // se modifica zona de 2 octeti urmatoare tabloului
tab[-10]=6; /* se modifica o zona de 2 octeti situata la o adresa cu 20
de octeti inferioara tabloului */
// Exemplu ce poate compila i chiar rula dar cu posibile erori
colaterale:
const int dim = 5;
int numere[dim];
// vector cu index de la 0 la 4
numere[88] = 999;
printf("%d\n", numere[77]);
// Index out of bound! Index in afara limitelor, nesemnalat!
Pentru copierea datelor dintr-un vector ntr-un alt vector se va scrie un ciclu
pentru copierea elemnt cu element, sau se va folosi functia memcpy.
Exemplu:
int a[30]={1,3,5,7,9}, b[30], i, n;
....
for (i=0;i<n;i++)
b[i]=a[i];
Exemple:
int size;
printf("Introduceti dimensiunea vectorului:");
scanf("%d", &size);
float values[size];
// NU!
int size;
float values[size];
printf("Introduceti dimensiunea vectorului:");
scanf("%d", &size);
2.Vectori
de frecventa
.....
Vectorul de frecven este numit uneori i vector de marcare deoarece poate fi folosit
pentru a determina valorile distincte care apar (sau care nu apar) printre datele de
intrare ale unei aplicaii.
Exemplu: Se consider un fiier text care conine maxim 100000 de numere naturale
<=6000. S se afieze valorile din mulimea 0..100 care nu apar n fiier
Dei numrul valorilor din fiier este foarte mare i valorile posibile sunt cuprinse ntre
limitele 0 i 60000 (deci 60001 valori distincte posibile), singurele valori care conteaz
pentru rezolvarea problemei sunt 0, 1...100, adic 101 valori distincte. Asociem
fiecrei valori din mulimea 0..100 un element n tabloul a cu urmtoarea
semnificaie:
cout<<i<<" ";
return 0;
}
Folosirea unui vector de frecven sau marcare asociat este eficient numai n cazul n
care valorile care intereseaz sunt ntregi i numrul valorilor distincte posibile este
cel mult 10000. Uzual folosirea acestui tip de vectori duce la optimizarea consumului
de memorie i la obinerea unor algoritmi de rezolvare eficieni.
3.Tablouri
multidimensionale
Unde ind1, ind2, ..., indn - expresii ntregi cu valori ntre 0 i dimi-1 pentru
i=1..n. Un element de tablou poate fi prelucrat ca orice variabila avnd
tipul de baz.
4.Sortari
1. BUBLE SORT
PREZENTAREA METODEI
Prin metoda de sortare prin metoda buleleor se parcurge vectorul i se
compar fiecare element cu succesorul su. Dac nu sunt n ordine cele
dou elemente, acestea se interschimb ntre ele. La prima parcurgere
elementul de valoare maxim se deplaseaz ctre ultima poziie. La a doua
parcurgere, elementul imediat urmtor ca valoare dup elementul maxim
se deplaseaz ctre penultima poziie. Vectorul se parcurge de mai multe
ori, pn cnd la o parcurgere complet nu se mai execut nici o
interschimbare ntre elemente, nici o deplasare.
PREZENTAREA ALGORITMULUI
ALGORITM:
void Metoda_bulelor(int (&v)[20], int n) {
int ok,i,aux;
do{
ok=1;
for(i=1;i<=n-1;i++)
if(v[i]>v[i+1]) {
ok=0;
aux=v[i];
v[i]=v[i+1];
v[i+1]=aux; }
} while(ok!=1);
}
ALGORITM:
#include<iostream.h>
int v[25],n,i,j,aux;
void main()
{cout<<nr de elemente=;
cin>>n;
for(i=0;i<n;i++)
{cout<<v[<<i<<]=;
cin>>v[i];}
for(i=0;i<n;i++)
cout<<v[i]<< ;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(v[i]>v[j])
{ aux=v[j]; v[j]=v[i]; v[i]=aux; }
cout<<endl;
for(i=0;i<n;i++)
cout<<v[i]<< ;
}
ALGORITM
#include <iostream.h>
int a[100], n, i;
void numarare(int a[100], int n) // a - tabloul de numere intregi care se va ordona crescator
// n - numarul de elemente al tabloului {
int i, j, b[100], c[100], x;
for(i=1; i<=n; i++)
b[i]=0;
for(i=1; i<=n-1; i++)
for(j=i+1; j<=n; j++)
if( a[i] < a[j] )
b[j] = b[j]+1;
else
b[i] = b[i]+1;
for(i=1; i<=n; i++) {
x=b[i];
#include <iostream.h>
int a[100], n, i;
void inserare(int a[100], int n) // a - tabloul de numere intregi care se va
ordona crescator // n - numarul de elemente al tabloului {
int i, j, x;
for(i=2; i<=n; i++) {
x = a[i];
j = i-1;
while( j >= 1 && a[j] > x ) {
a[j+1] = a[j]; j--;
}
a[j+1] = x;
}
return;
}
int main(void) {
cout<<"Dati dimensiunea tabloului n = ";
cin>>n;
cout<<"Dati elementele tablourile \n";
for(i=1; i<=n; i++) {
cout<<"a["<<i<<"] = ";
cin>>a[i]; } inserare(a, n);
cout<<"Tabloul ordonat crescator \n";
for(i=1; i<=n; i++)
cout<<a[i]<<" ";
}
5.Exerciti
si probleme
REZOLVARE:
#include <iostream>
using namespace std;
int main()
{
int a[100],n,i,p2=0,p5=0;
cin>>n;
for (i=0;i<n;i++)
cin>>a[i];
for (i=0;i<n;i++)
{
while(a[i]%2==0)
{
p2++;
a[i]=a[i]/2;
}
while(a[i]%5==0)
{
p5++;
a[i]=a[i]/5;
}
}
if(p2<p5) cout<<p2;
else cout<<p5;
return 0;
}
2.Secvente
de
suma
(cu
sir
de
sume
partiale
O(n*n))
REZOLVARE:
}
is.close();
os.close();
return 0;
}
sau
#include <fstream>
using namespace std;
ifstream is("date.in");
ofstream os("date.out");
int main()
{
int a[100],sp[100],n,s;
is>>n;
sp[0]=0;
for(int i=1;i<=n;i++)
{
is>>a[i];
sp[i]=sp[i-1]+a[i];
}
is>>s;
for(int i=1;i<n;i++)
for(int j=i;j<=n;j++)
if(sp[j]-sp[i-1]==s)
{
}
is.close();
os.close();
return 0;
}
REZOLVARE:
#include<iostream>
using namespace std;
int main()
{
int a[100],n,i,p[100],t,c;
cout<<"n="; cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
for(i=1;i<=n+1;i++) p[i]=0;
while(p[n+1]!=1)
{
for(i=1;i<=n;i++)
if(p[i]==1) cout<<a[i]<<" ";
cout<<endl;
i=1;
while(p[i]==1 && i<=n)
{ p[i]=0;
i++;
}
p[i]=1;
}
return 0;
}
4. Se citeste un vector cu n elemente numere naturale cu elementele numerotate incepand
de la 1.
Sa se inlocuiasca fiecare element a[i] cu cea mai mare putere a lui i care este mai mica sau
egala cu a[i], exceptand primul element al vectorului, element care va ramane neschimbat.
Exemplu: Pentru vectorul 23 24 43 90 80 rezulta vectorul 23 16 27 64 25.
REZOLVARE:
#include<iostream>
using namespace std;
int main()
{
int a[100],n,i,p;
cout<<"n="; cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
for(i=2;i<=n;i++)
{
p=1;
while(p*i<=a[i]) p=p*i;
a[i]=p;
}
for(i=1;i<=n;i++) cout<<a[i]<<" ";
return 0;
}
REZOLVARE:
#include<iostream>
using namespace std;
int main()
{
int a[100],n,i,j,aux,p;
cout<<"n="; cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(a[i]>a[j])
{
aux=a[i];
a[i]=a[j];
a[j]=aux;
}
p=1;
for(i=1;i<=n;i++)
if(a[i]!=i) p=0;
if(p==1) cout<<"da";
else cout<<"nu";
return 0;
}
6. Se citeste un vector a cu n elemente numere intregi. Stergeti toate aparitiile primului
element si afisati vectorul ramas.
Exemplu: n=6 si vectorul 3 4 5 3 3 6
se afiseaza 4 5 6
REZOLVARE:
#include<iostream>
using namespace std;
int main()
{
int a[100],n,i,x,k;
cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
x=a[1];
for(i=1;i<=n;i++)
if(a[i]==x)
{
for(k=i;k<n;k++)
a[k]=a[k+1];
n--;
i--;
}
for(i=1;i<=n;i++)
cout<<a[i]<<" ";
return 0;
}
7. Fiind dat un vector v cu n elemente numere intregi , sa se construiasca alti doi vectori :
primul va contine numai elementele pare , iar al doilea numai elementele impare ale
vectorului initial.
REZOLVARE:
#include<fstream>
using namespace std;
ifstream fin("1.in");
ofstream fout("1.out");
int main()
{
int v[100],n,x[100],y[100],m,p,i;
fin>>n;
for(i=0;i<n;i++) fin>>v[i];
m=0;p=0;
for(i=0;i<n;i++)
if(v[i]%2==0) { x[m]=v[i];
m++;
}
else { y[p]=v[i];
p++;
}
for(i=0;i<m;i++) fout<<x[i]<<" ";
fout<<endl;
for(i=0;i<p;i++) fout<<y[i]<<" ";
fin.close();
fout.close();
return 0;
}
REZOLVARE:
#include<iostream>
using namespace std;
);