Sunteți pe pagina 1din 15

Dabija tefan, clasa a X-a D, Colegiul Naional Vasile

Alecsandri, Galai

VECTORI I MATRICI

VECTORII
DECLARAREA UNUI VECTOR

Uneori este necesar prelucrarea unui set de valori de acelai


tip,aezate ntr-o anumit ordine.O astfel de structur se
numesteir,iar valorile respective se numescelementele irului.
Limbajul C++ ofer posibilitatea de a memora toate elementele
irului ntr-o singur variabil indexat,n care elementele sunt
dispuse ntr-o anumit ordine,ocupnd locaii de memorie
succesive,bine determinate.O astfel de variabil se numetetablou
unidimensionalsauvector.
Vectorii sunt de fapt nite spaii n memorie, n care putem
reine anumite valori, citite de la tastatur. Deoarece acetia
sunt tablouri unidimensionale, dup cum le spune i numele,
au o singur dimensiune i anume LUNGIMEA.
Pentru a referi un anumit element al vectorului,trebuie s scriem
numele variabilei-vector,urmat de poziia elementului cuprins ntre
paranteze, de exemplu: a[i].

Acesta este un vector cu numrul maxim de spaii n memorie egal cu 10.


n prim faz, aceste spaii sunt goale. Trebuie s le atribuim numere. El se
va numi vectorul v (putem s-l numim si altfel, bineneles), iar spaiile din
acesta sunt numerotate de la 0 la 9. Deci, pentru un vector cu n spatii, ele vor
fi numerotate de la 0 la n-1 .

Iat vectorul cu 10 spaii, atribuite fiecrui numr, ales aleator.

Acest vector are de exemplu: v [0]=5, v [1] = 11, .a.m.d. De fapt, vectorii sunt
asemntori unei funcii, cu legea de coresponden definit de utilizator
pentru fiecare valoare a lui f: f(0)=5, f(1)=11, etc. n C++, vectorii se declara
astfel:tip <nume vector> [valoarea maxima de spatii in memorie];
Exemplu:
int vector [25];- am declarat un vector cu maxim 25 de spaii n memorie, de tip
ntreg (int).

CITIREA I AFIAREA UNUI VECTOR

Pasul 2 dup declarare este citirea


fiecrei valori ale fiecrui spaiu,
adic aceiv [i]. Pentru asta, vom avea
nevoie de o variabili, care s
memoreze numrul spaiului, ce va
porni evident de la 0. Si vom mai citi
de la tastatura o variabilan, care
reprezinta numarul actual de spatii
dorite de utilizator. (Nota! Vectorul
poate avea si max. 100 de spatii
libere, dar utilizatorul nu poate
introduce un n > 100, deoarece citirea
se va opri!).
In acest program vom citi si afisa
un vector. Pentru a citi, avem nevoie
de instructiuneafor, care sa ceara de
la tastatura, pentru fiecareide
la0lan-1, cate un numar care ii va fi
atribuit luiv[i]. Apoi, parcurgem
vectorul asemanator, dar de aceasta
data afisam fiecarev [i].

//Citirea unui vector


#include <iostream.h>
#include <math.h>
void main ()
{
int v [20], n, i;
cout<<Introduceti numarul de
spatii: ;
cin>>n;
for (i=0; i<n; i++) //de la fiecare i de
la primul spatiu (0) la ultimul (n-1)
cin>>v [i]; //citim fiecare v
[i]
for (i=0; i<n; i++) //parcurgem din
nou vectorul
cout<<v [i]<< ; //si de
aceasta data afisam v [i]

SORTAREA PRIN INSERARE A UNUI VECTOR

Este cea mai eficienta metoda de a ordona elementele unui vector


crescator sau descrescator. Acest lucru ne ajuta la o aplicatie care suna
cam asa: Se citesc de la tastatura n numere reale. Sa se afiseze aceste
numere, ordonate crescator sau descrescator, la cererea utilizatorului.
Problema consta in memorarea numerelor citite de la tastatura intr-un
vector v. Sa zicem ca am memorat aceste numere in vectorul v[10]:

Dupa cum se vede, aceste


numere sunt introdusealeator, si
anumenu sunt ordonate. Aceasta
strategie aordonarii prin
interschimbareconsta in
parcurgerea acelui vector, si
schimbarea pozitiei numarului cu
cel precedent, in cazul in care este
mai mare sau mai mic decat cel la
care am ajuns (depinzand de tipul
de ordonare). Procesul se va
repeta cat timp numerele sunt in

Deci, incepem sa parcurgem vectorul, in acest caz pentru o ordonare


crescatoare.
Mai intai citimv[0], iar apoi,v[0+1], adicav[1].
Comparam cele doua valori, si observam cav[0]>v[1], deci
interschimbam. Cum facem acest lucru? Schimb de variabile. Folosim o
auxiliara,aux, care va retine valoarea luiv[0]si o va transmite luiv[1].
Apoi, citimv[1+1]=v[2].v [1]va fi egal cu 10, pentru ca am schimbat .
Observam cav[2]este deja mai mare decatv[1], deci il lasam in pace.
Si tot asa, pana lav[n]=v[10]in cazul nostru, cand facem ultima
schimbare.
Procesul se repeta pana cand vectorul va fi complet ordonat. Cum
scriem in C++? Pai, iata cum facem: Citim vectorul de la tastatura, prin
metoda obisnuita. Apoi, il parcurgem, tot prin metoda uzuala. Folosim o
variabilaj, care va desemna de fapt urmatoarea valoare a luiv[i],
deciv[j]=v[i+1].
In cazul asta putem comparav[i]cuv[j]. Dacav[i]>v[j], schimbam,
adicaaux=v[i],v[i]=v[j], iarv[j]=aux. Codul arata cam asa:

//Ordonare
#include <iostream.h>
void main ()
{
double long n, i, j, a, aux, d;//am declarat variabilele folosite: n pentru nr actual de spatii in vector, i
pentru pozitia fiecarei valori ale vectorului, j pentru a afla pozitia urmatoare a lui v[i], a este o
variabila care cere utilizatorului tipul de ordonare, aux este auxiliara care ajuta la interschimbare, iar d
pentru a repeta programul, la cererea utilizatorului.
int v [1000];
do {
cout<<Ordonarea numerelor introduse <<endl;
cout<<Alegeti tipul de ordonare: <<endl;
cout<<1.ORDONARE CRESCTOARE<<endl;
cout<<2.ORDONARE DESCRESCTOARE<<endl;
cin>>a;//cerem de la tastatura tipul de ordonare
if (a==1)//daca am ales ordonarea crescatoare, atunci >>
{
cout<<Ati ales ordonarea cresctoare.<<endl;
cout<<Cte numere introduceti? (MAX=1000) ;
cin>>n;//aici citim numarul de spatii disponibile in vector
if (n>1000) //acesta nu trebuie sa fie mai mare de 1000
cout<<Reporniti programul si introduceti un numr corespunztor.;//in acest caz cerem utilizatorului
sa introduca un numar mai mic de 1000.
else
{
cout<<Introduceti numerele: ;//in cazul in care a introdus un numar corect
for (i=0; i<n; i++)
cin>>v [i];//citim vectorul
for (i=0; i<n; i++)//incepem sa-l parcurgem
{
for (j=i+1; j<n; j++)//iar pentru j=i+1, adica valoarea urmatoarei pozitii
if (v [i]>v [j])//comparam pozitia initiala cu cea urmatoare. Daca este mai mare, atunci schimbam
pozitiile valorilor
{
aux=v [i];
v [i]=v [j];
v [j]=aux;
}
}

cout<<Ordinea cresctoare a numerelor introduse este: ;


for (i=0; i<n; i++)
cout<<v [i]<<; ;//si in final afisam ordinea corecta, in acest caz crescatoare, a numerelor din vector, cu
; intre ele
}
}
else if (a==2) //daca am ales ordonarea descrescatoare, atunci>>
{
cout<<Ati ales ordonarea descresctoare.<<endl;
cout<<Cte numere introduceti? (MAX=1000) ;
cin>>n;//la fel, citim numarul actual de spatii in vector
if (n>1000)
cout<<Reporniti programul si introduceti un numr corespunztor.;//cerem repornirea in cazul unui
numar >1000
else
{
cout<<Introduceti numerele: ;
for (i=0; i<n; i++)
cin>>v [i];//citim fiecare numar de la tastatura si le memoram in vector
for (i=0; i<n; i++)//apoi il parcurgem
{
for (j=i+1; j<n; j++)//si pentru urmatoarea valoare din urmatoarea pozitie,
if (v [i]<v [j])//comparam valoarea initiala cu cea de pe urmatoarea pozitie, dar in cazul ordonarii
descrescatoare, v[i] trebuie sa fie mai mare decat v[i+1].
{
aux=v [i];
v [i]=v [j];
v [j]=aux;
}
}
cout<<Ordinea descresctoare a numerelor introduse este: ;
for (i=0; i<n; i++)
cout<<v [i]<<; ;//afisam fiecare numar din vector, in ordinea corecta
}
}
cout<<endl;
cout<<Doriti s reporniti programul? (DA=1 / NU=0) ;
cin>>d;
} while (d==1);//aici cerem utilizatorului permisiunea de a repeta programul, dupa cum v-am explicat in
posturile anterioare

CUTAREA BINAR

Aceasta metoda functioneaza doar pentru un vector deja ordonat (crescator sau
descrescator).
1.Mai intai verificam daca numarul cautat nu este chiar la jumatatea vectorului,
iar daca nu, comparam valorile vecinilor lui.
2.Daca x-ul cautat este mai mare decat valoarea de la mijloc, atunci continuam
cautarea doar spre dreapta.
3.Daca x-ul cautat este mai mic decat valoarea de la mijloc, atunci pornim spre
stanga.
Cum scriem in C++? Foarte usor. Folosim nistevariabile auxiliare, si
anumelst(limita stanga), initiala0,ldr(limita dreapta, initialan-1, si
unamij(mijlocul vectorului), care va fi egala cu(lst+ldr)/2.
Incepem cautarea: dupa ce am citit vectorul, il parcurgem, si vedem daca este
egal cu mijlocul, adica verificam conditiax=v[mij]. Altfel, dacaxeste mai mic
decatv[mij], pornim spre stanga, adicaldr=mij-1. Procesul se repeta, panaxeste
gasit. Altfel, dacaxeste mai mare decatv[mij], pornim cautarea spre dreapta,
adicalst=mij+1. In schimb mai avem nevoie de o variabila care ne indica daca
elementulxa fost gasit, si anumegasit, initial0

#include <iostream.h>
void main ()
{
int v[10], x, gasit, i, lst, ldr, mij, n;//v este vectorul, x este elementul cautat, gasit este variabila
care ne va indica daca x este gasit, i=pozitia viecarui v[i], lst=limita stanga, ldr=limita dreapta,
mij=pozitia de mijloc, n=lungimea actuala a vectorului
cout<<Cate numere introduceti?;
cin>>n;//citim lungimea vectorului
cout<<Introduceti numerele din vector: ;
for (i=0; i<n; i++)
cin>>v[i];//citim elementele vectorului
gasit=0;//gasit este initial 0, adica fals
lst=0;//limita stanga este pe pozitia 0
ldr=n-1;//limita dreapta este pozitia n-1
cout<<Introduceti elementul x cautat: ;
cin>>x;//citim elementul cautat
for (i=0; i<n && !gasit && lst<=ldr; i++)//parcurgem vectorul, conditia fiind ca variabila gasit sa
nu devina 1, deoarece daca am gasit elementul, repetitia trebuie a se opreasca. Iar la sfarsit, limita
stanga trebuie sa fie cel putin egala cu cea dreapta, altfel repetitia va fi la nesfarsit.
{
mij=(lst+ldr)/2;
{
if (x==v[mij]) gasit=1;//daca x este egal cu nr. din pozitia mij, atunci l-am gasit pe x.
else if (x<v[mij]) ldr=mij-1;//daca x este mai mic decat nr. din pozitia mij, atunci parcurgem
vectorul doar inspre stanga, deci limita dreapta va deveni mij-1, pentru ca mij a fost deja testat
else lst=mij+1;//daca x este mai mare decat nr. din pozitia mij, parcurgem vectorul inspre dreapta,
adica limita stanga va deveni mij+1
}
}
if (!gasit) cout<<x<<nu este in vector.;
else cout<<x<< este pe pozitia <<mij<<.;//la sfarsit afisam rezultatul cautarii, iar daca x a
fost gasit, putem afisa si pozitia acestuia, adica mij.
}

MATRICI

Tabloul
bidimensional,
numit si MATRICE,
este caracterizat,
dupa cum ii spune
si numele, de
numarul de linii si
de coloane.
Fiecare element
din matrice este
bine determinat
de o linie si de o
coloana.

Matricile prezentate anterior suntMATRICI


PATRATICE(numarul de linii este egal cu numarul de
coloane), iar in C++ are anumite proprietati ajutatoare.
Matricea se declara folosind comanda:tip [numar max.
de linii] [numar max. de coloane];.Exemplu:int x[10][5].Am
declarat o matrice de tipintcu maxim 10 linii si 5 coloane.
Ca si la vectori, matricea declarata este goala. Trebuie sa
ii atribuim elemente fiecarui spatiu liber. Atribuirea se face
aproximativ ca la vectori, doar ca aici vom avea doua
repetitii, deoarece fiecarei linii ii corespunde n-1 coloane,
etc, si vom avea nevoie de o variabilai, ce va reprezenta
linia, si unaj, ce va reprezenta coloana. Vom mai folosi inca
2 variabile,nsim, care vor reprezenta numarul actual de
linii, respectiv coloane

Iata o
matrice careia iam atribuit
cateva numere in
mod aleator:

Iata cum facem atribuirea in C++:for (i=0; i<n; i++)


for (j=0; j<m; j++)
cin>>x[i][j]; In aceasta mica aplicatie, vom citi de la tastatura o matrice,
si o vom afisa pe ecran. Iata cum facem:
#include <iostream.h>
void main ()
{
int x[10][10], n, m, i, j;//m=matricea, n, m= nr actual de linii/coloane, i,
j=linia, respectiv coloana
cout<<Dati numarul de linii: ; cin>>n;//citim nr de linii
cout<<Dati numarul de coloane: ; cin>>m;//citim nr. de coloane
cout<<Introduceti elementele matricei: <<endl;
for (i=0; i<n; i++)
for (j=0; j<m; j++)
{
cout<<x["<<i<<"]["<<j<<"]=;
cin>>x[i][j];//citim elementele matricei
}
cout<<Afisam matricea: <<endl;
for (i=0; i<n; i++)
for (j=0; j<m; j++)
{cout<<x[i][j]<< ;//si afisam fiecare linie, respectiv coloana, dar
cu un mic spatiu intre elemente
cout<<endl;//dupa fiecare linie terminata, trebuie sa trecem la alt
rand
}
}

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