Sunteți pe pagina 1din 25

Colegiul Național „Mihai Eminescu” Suceava

Tablouri unidimensionale

Lucrare pentru obținerea


atestatului profesional

Susținător Profesor îndrumător


Popovici Cosmina-Maria Popa Carmen Teodora

2023

1
I.Cuprins

I.Cuprins...............................................................................................................................................2
II.Argument...........................................................................................................................................3
III.Declararea şi parcurgerea tablourilor unidimensionale................................................................4
IV.Ștergeri și inserări...........................................................................................................................6
V.Verificarea unor proprietăți...........................................................................................................12
VI.Sortarea tablourilor unidmensionale............................................................................................15
VII.Interclasarea tablourilor unidimenisonale..................................................................................21
VIII.Vectori caracteristici și de frecvență..........................................................................................22
IX.Concluzie.......................................................................................................................................24

2
II.Argument

Am ales această temă pentru a realiza lucrarea de atestat deoarece este foarte esențială în
programare, deci indirect pentru materia de BAC și admitere la facultate, la informatică. Acest
proiect mă ajută la recapitularea și aprofundarea tablourilor unidimensionale și pentru a
îndeplini cerințele pentru a realiza atestatul la informatică în acest an terminal.
Tablourile unidimensionale sau vectorii sunt structuri de date cărora li se atribuie un nume.
Este alcătuit dintr-o colecție de același tip, așezate continuu în memorie. Toate elementele pot
fi accesate individual prin indici de poziție. Fiecare element are un predecesor (cu excepția
primului) și un succesor (cu excepția ultimului).
Pentru a fi mai ușor de înțeles ne putem imagina vectorii ca o locuință cu camere, doar că în
loc de oameni sau obiecte se află diferite tipuri de date (numere, caractere). Pentru a ajunge la o
valoare din camera 1 vom deschide ușa de la camera 1. În programare această valoare va fi
accesată de instrucțiunea v[1], în care v este numele vectorului(al locuinţei, în cazul
exemplului), iar între parantezele pătrate se află indicele de poziţie (numărul camerei).
Vectorii ne ajută în organizarea şi prelucrarea unui şir de valori.
Acest material cuprinde diverse prelucrări ale vectorilor în limbajul de programare C++.

3
III.Declararea şi parcurgerea tablourilor
unidimensionale

1.Declarare
Un tablou unidimensional se declară în felul următor:
Tip_de_bază denumire[dimensiune];
Ex.: int v[101];
 Tipul vectorului este int (memorează valori întregi);
 v este denumirea vectorului;
 100 reprezintă numărul maxim de valori care pot fi reţinute în v (vectorul v poate
reţine între 1 şi 100 de valori, dar nu poate reţine mai mult de 100 de valori) și se
numește dimensiune fizică. De cele mai multe ori într-un program nu se folosesc
toate elemntele tabloului. Este necesar să mai existe o variabilă în program care să
reprezinte dimensiunea logică a tabloului (numărul de elemente ale tabloului care la
un moment dat sunt utilizate în program).
Vom lua ca exemplu următorul vector: int v[101]; şi un n=10 care semnifică numărul de
componente care se află în v (dimensiunea logică).
În cele mai multe cazuri un vector este indexat de la 1 (indicii de poziţie încep de la 1 şi se
termină la n), dar acesta poate fi indexat şi de la 0 (indicii de poziţie încep de la 0 şi se termină
la n-1) sau foarte rar, de la altă valoare, depinde de cerinţa problemei sau de preferinţele
programatorului.
Indexare de la 1:

Elemente 1 35 45 89 10 6 18 72 80 32
2

Indici 1 2 3 4 5 6 7 8 9 10

Indexare de la 0:

Elemente 1 35 45 89 10 6 18 72 80 32
2

Indici 0 1 2 3 4 5 6 7 8 9
Observație: În cazul indexării de la 0 numărul elementelor rămâne același (n=10), dar
indicii de poziție pornesc de la valoarea 0 și se termină la 9. Indicele de poziție reprezintă
poziția unui element în vector (a câta valoare este). Între 0 și 9 există 10 termeni, al zecilea
termen citit se află pe poziția 9.
În cazul indexării de la 1, elementul v[0] este ignorat, dar va exista în continuare.

4
Elementele unui vector declarat global sunt inițializate cu 0. Elementele unui vector declarat
local sunt inițializate cu valori aleatorii.
Declararea unui vector trebuie tratată cu mare atenție, dimensiunea fizică trebuie să fie mai
mare cu 1 decât valaoarea precizată în problemă.
Ex.: n≤100, declararea va fi:

2.Referirea la un element
Referirea la un element se face prin operatorul de indexare, [ ], care are prioritate maximă.
Ex.: v[0], v[9], v[37], v[i];
Aici, v este denumirea vectorului, iar 0,9,37,i sunt indici de poziție.
Un element al tabloului referit prin indice este tratat ca orice variabilă de tipul stabilit la
declarare. Considerăm următorul porgram:

Este obligatoriu ca programatorul să verifice dacă valorile indicilor sunt corecte! C++
nu verifică dacă valoarea indicelui face parte din intervalul stabilit la declarare!
3.Inițializarea elementelor unui tablou unidimensional
Posibilitățile prin care putem inițializa un vector sunt:

 A- este un vector cu 4 elemente: A[0]=9, A[1]=15, A[3]=17, A[4]=102;


 B- este un vector cu 100 de elemnte, primele 4 sunt; B[0]=15, B[1]=12, B[3]=18,
B[4]=74, restul elementelor vor avea valoarea 0;
 C-este un vector cu 10 elemente, toate vor avea valoarea 0.
4.Citirea, parcurgerea și afișarea unui tablou unidimensional
Citirea, parcurgerea și afișarea unui tablou unidimensional presupun referirea la
fiecare element, într-o anumită ordine!
Considerăm următoarea declarare:

Citirea:

Parcurgerea (vom parcurge vectorul pentru a înlocui fiecare element cu dublul său):
 de la stânga la dreapta:

5
 de la dreapta la stânga:

Afișarea:

Următoarea cerință presupune pașii anteriori spre rezolvare (cu referire la ce se întâmplă cu
vectorul după parcurgerea sa):
Se citesc n numere naturale, n≤100. Se cere să se afișeze pentru fiecare element dublul său,
separat prin câte un spațiu.
Rezolvare:

*În continuare, toate prelucrările și explicațiile vor fi realizate pe tablouri


unidimensionale, indexate de la 1!!!

IV.Ștergeri și inserări

1.Ștergerea
1.1.Ștergerea simplă
Să rezolvăm următoarea cerință:
Se dă un vector cu n elemente (n≤100), se cere să se afișeze vectorul după ștergerea
elementului de pe poziția k.
Pentru rezolvare, trebuie mai întâi să judecăm problemă, iar pentru asta vom lua un
exemplu:
n=7, k=3;

13 5 12 1 34 8 12
6 8 9
6
1 2 3 4 5 6 7
Trebuie să ștergem elementul aflat pe poziția 3, adică 12. Pentru asta trebuie să mutăm toate
valorile din drepata acestui element cu o poziție spre stânga.
Astfel, elementul de pe poziția 4 se mută pe poziția 3, elementul de pe poziția 5 se mută pe
poziția 4, elementul de pe poziția 6 se mută pe poziția 5, iar elementul de pe poziția 7 se mută
pe poziția 6. Pentru efectuarea acestor mutări programul va efectua următoarele operații:
v[3]=v[4];
v[4]=v[5];
v[5]=v[6];
v[6]=v[7];
Pentru cazul general: v[i]=v[i+1];

13 5 12 1 34 8 12
6 8 9
1 2 3 4 5 6 7

13 5 18 1 34 8 12
6 8 9
1 2 3 4 5 6 7

13 5 18 3 34 8 12
6 4 9
1 2 3 4 5 6 7

7
13 5 18 3 89 8 12
6 4 9
1 2 3 4 5 6 7

13 5 18 3 89 1 12
6 4 2
1 2 3 4 5 6 7

Se observă că ultimul element apare de două ori, pentru a rezolva aceasată situație este
necesar să micșorăm dimesiunea logică a tabloului cu o unitate: n--; acest element va rămâne în
memoria calculatorului, dar prin faptul că indicii vor merge până la valoarea n (care a fost
micșorată), în cazul general, nu se va putea accesa această informație.
Secvența de cod reprezentativă pentru ștergerea unui element este următoarea:
 dacă parcurgerea (ștergerea) începe de la poziția k:

 dacă parcurgerea (ștergerea) începe de la poziția k+1:

Acestea sunt cele mai întâlnite cazuri.


Rezolvarea completă a cerinței (cu una dintre ștergeri):

1.2.Ștergerea multiplă
8
Principiul este același ca la ștergerea simplă.
Cerință:
Se dă un șir cu n numere naturale (n≤100), se cere să se elimine toate elementele impare și
să se afișeze apoi șirul.

2.Inserarea
2.1.Inserarea simplă
Să rezolvăm următoarea cerință:
Se dă un vector cu n elemente (n≤100), se cere să se afișeze vectorul după inserarea unui
element, x, în poziția k.
Pentru rezolvare, trebuie mai întâi să judecăm problemă, iar pentru asta vom lua un
exemplu:
n=7, x=18, k=3;

13 5 12 1 34 8 12
6 8 9
1 2 3 4 5 6 7
Trebuie să inserăm în poziția 3 valoarea 18. Pentru a realiza acest lucru este necesar să
mutăm toate elementele din dreapta poziției 3 spre deapta cu o poziție.
Astfel, vom mări dimesiunea logică cu o unitate și elementul de pe poziția 7 se mută pe
poziția 8, elementul de pe poziția 6 se mută pe poziția 7, elementul de pe poziția 5 se mută pe
poziția 6, elementul de pe poziția 4 se mută pe poziția 5, iar elementul de pe poziția 3 se mută
pe poziția 4. Pentru efectuarea acestor mutări programul va efectua următoarele operații:
v[8]=v[7];
v[7]=v[6];
v[6]=v[5];
v[5]=v[6];
v[4]=v[3];
Pentru cazul general: v[i]=v[i-1];

13 56 12 18 34 89 12

9
1 2 3 4 5 6 7 8

13 56 12 18 34 89 12 12
1 2 3 4 5 6 7 8

13 56 12 18 34 89 89 12
1 2 3 4 5 6 7 8

13 56 12 18 18 34 89 12
1 2 3 4 5 6 7 8

13 56 12 12 18 34 89 12
1 2 3 4 5 6 7 8
Se observă faptul că s-a dublat apariția valorii de pe poziția 3, tot ce avem de făcut acum
este să introducem valoarea 18.

10
13 56 18 12 18 34 89 12
1 2 3 4 5 6 7 8
Secvența de cod reprezentativă pentru inserarea unui element este:

 dacă mărim dimesiunea logică înainte:

 dacă mărim dimesiunea logică după:

Rezolvarea completă a cerinței (cu una dintre inserări):

2.2Inserarea multiplă:
Cerință:
1.Se dă un șir cu n elemente numere întregi (n≤100). Se cere ca înaintea fiecărui număr
negativ să se afișeze opusul (valoarea absolută/modulul) său.
!Atenție: după inserare vectorul va avea o dimesiunea mai mare. La declararea tabloului
trebuie să mărim și dimesiunea fizică. Dacă vectorul conține 100 de valori și toate sunt
negative, atunci după inserare va avea un număr dublu de valori, de aceea vom declara vectorul
cu o dimesiune fizică de 201(în cazul exemplului)!

11
2.Se dă un șir cu n elemente numere întregi (n≤100). Se cere ca după fiecare număr negativ
să se afișeze opusul (valoarea absolută/modulul) său.

V.Verificarea unor proprietăți

Există o mulțime de probleme în care se cere verificarea unor proprietăți (dacă numerele
sunt pare, prime, pozitive, oglindite etc), dar toate se pot reduce la următoarele două cazuri
genereale:
1. Să se verifice că toate elementele respectă o anumită proprietate.

12
2. Să se verifice dacă există elememte care respectă o anumită proprietate.
O rezolvare se poate realiza prin numărearea valorilor care respectă regula, într-o variabilă,
de obicei nr, iar la final se compară acest număr cu numărul total de valori,n. Dacă acestea sunt
egale, atunci toate elementele respectă regula, în caz contrar, dacă nr>0 există elemente care
respectă regula, dacă nr=0, atunci niciun element nu respectă proprietatea.
Problemă:
1. Se dă un șir cu n numere reale (n≤100). Să se afișeze „DA”, dacă toate numerele sunt
prime, iar în caz contrar să se afișeze „NU”.

2. Se dă un șir cu n numere reale (n≤100). Să se afișeze „DA”, dacă există numere prime,
iar în caz contrar să se afișeze „NU”.

13
O altă variantă de rezolvare, mai bună, ne permite să oprim parcurgerea când suntem siguri
că nu este respectată prorpietatea. Vom folosi o variabilă booleană(cu valori true sai false, 1 sau
0):
 dacă la final variabila are valoarea true, atunci vectorul respectă proprietatea;
 dacă la final variabila are valoarea false, atunci vectorul nu respectă proprietatea;
Ex.:
1.Să se verifice dacă toate elementele unui vector sunt pare.
Secvențe C++:

sau

sau

14
2.Să se verifice dacă într-un vector există elemente pare.
Secvențe C++:

sau

sau

VI.Sortarea tablourilor unidmensionale

Sortarea unui tablou reprezintă aranjarea acestora într-o anumită ordine, de obicei
cresăctoare sau descrescătoare.
Există numeroși algoritmi de sortare, dar cei mai cunoscuți și utilizați sunt:
 metoda bulelor;
 sortarea prin selecție;
 sortarea prin inserție.
1.Metoda bulelor
Principiul acestei metode este:
fie un vector v[ ] cu n elemente;
parcurgem vectorul și pentru oricare două elemente învecinate care nu sunt în
ordinea dorită li se interschimbă valorile;
15
după o singură parcurgere, vectorul nu se va sorta, dar putem repeta parcurgerea;
dacă la o parcurgere nu se face nicio schimbare, vectorul este sortat.
Cum gândim algoritmul?
cât timp vectorul nu este sortat
presupunem că vectorul este sortat
parcurgem vectorul
dacă două elemente învecinate nu sunt în ordinea dorită
le interschimbăm
schimbăm presupunerea inițială
Ex.:
Pas 1:
1 2 3 4 5

39 12 9 10 27

39 12 9 10 27

12 39 9 10 27

12 9 39 10 27

12 9 10 29 27

12 9 10 27 29
Deoarece am făcut interschimbări nu știm dacă vectorul este sortat.
Pas 2:
1 2 3 4 5

12 9 10 27 29

16
12 9 10 27 29

9 12 10 27 29

9 10 12 27 29

9 10 12 27 29

9 10 12 27 29
Iar am făcut interschimbări și nu știm dacă vectorul este sortat.

Pas 3:
1 2 3 4 5

9 10 12 27 29

9 10 12 27 29

9 10 12 27 29

9 10 12 27 29

9 10 12 27 29

9 10 12 27 29
Nu am mai făcut interschimbări, cea ce înseamnă că vecotrul este sortat.
Programul C++:

17
2.Sortarea prin selecție
Principiul acestei metode:
fie un vector v[ ], cu n elemente;
plasăm în v[1] cea mai mică valoare;
plasăm în v[2] cea mai mică valoare;
etc.
Cum gândim algoritmul?
parcurgem vectorul cu indicele i;
parcurgem cu indicele j elementele din dreapta elementrului v[i];
dacă elementele v[i] și v[j] nu sunt în ordinea dorită le interschimbăm.

Ex.:
i=1;
1 2 3 4 5

39 12 9 10 27

12 39 9 10 27

18
9 39 12 10 27

9 39 12 10 27
i=2;

9 39 12 10 27

9 12 39 10 27

9 10 39 12 27

i=3;

9 10 39 12 27

9 10 12 39 27

i=4;

9 10 12 39 27

9 10 12 27 39
Programul C++:
19
3.Sortarea prin inserție:
Principiul aceste metode:
fie un vector v[ ] cu n elemente;
dacă secvența cu indici 1, 2, ..., i-1 este ordonată, atunci vom putea insera elementrul
v[i] în această secvență astfel încât să fie ordonată secvența cu indi 1, 2, ..., i-1, i;
luăm pe rând fiecare element v[i] și îl inserăm în secvența din stânga sa;
la final vectorul va fi ordonat.
Cum gândim algoritmul?
Parcurgem vectorul cu indeicele i;
Inserăm pe v[i] în secvența din stânga sa; ăentru inserare se mută unele
elemente din secvența din dreapta.
Ex.:

1 2 3 4 5

39 12 9 10 27

39 12 9 10 27

39 12 9 10 27

20
12 39 9 10 27

9 12 39 10 27

9 10 12 39 27

9 10 12 27 39
Programul C++:

VII.Interclasarea tablourilor unidimenisonale

Algoritmul de interclasare preupune construirea din doi vectori ordonați a unui vector
ordonat care să conțină reuniunea celor doi.
Cum gândim algoritmul?
considerăm doi vectori cu n, respectiv m elemente, ordonate crescător;
parcurgem cei doi vectori simultan;
alegem varianta ce mai mică din cele două elemente curente;

21
se adaugă în al treilea vecotr;
avansăm numai în tabloul din care am selectat valoarea adăugată;
parcurgerea unuia dintre cele două tablouri se sfârșește;
adăugăm toate elementele rămas din celălalt tablou în tabloul de destinație;
tabloul de destinație va avea n+m elemente.

9 10 12 27 39

11 19 23 27

9 10 11 12 19 23 27 27 39
Programul C++:

22
VIII.Vectori caracteristici și de frecvență

1.Vectori caracteristici
Vectorii caracteristici sunt vectori care inițial toate componentele sunt 0, iar pe parcursul
prelucrărilor acestea se modifică cu 1 sau rămân 0.
Problemă:
Se dă un vector cu n elemente numere întregi (n≤100). Să se afișeze toate cifrele din vector
în ordine strcit crescătoare cu spațiu între ele.
Ex.:
9301 103 3102 2137 3019
1 2 3 4 5
Se va afișa: 0 1 2 3 7 9.
Vom folosi un vecotr caracteristic cu 10 elemente, c[10], deaorece avem 10 cifre, inițializat
cu 0. Pentru fiecare cifră i, vom maraca c[i] cu 1. La final vom afișa indicii elementelor cu
valori egale cu 1.
Rezolvare C++:

23
2.Vectori de frecvență
Vecotrii de frecvență sunt asemănători celor caracterisitci cu diferența că pot reține o valoare
mai mare decât 1.
Probelmă:
Se dă un vector cu n elemente numere întregi (n≤100). Să se afișeze toate cifrele comune din
vector în ordine strcit crescătoare cu spațiu între ele.

24
IX.Concluzie

Tablourile unidimesionale sunt esențiale în programare și au o mare aplicabilitate. Sunt utile


în organizarea datelor și facilitează rezolvarea problemelor.
La început, noțiunile prezentatea anterior vor părea dificile și greu de înțeles. Parcurgerea
materialului cu atenție și judecarea informațiilor, explicațiilor și problemelor rezolvate asigură
minimul de cunoștințe necesar oricărui programator pentru a putea avansa în situații mult mai
elaborate. Acest material constituie o prezentarea generală și succintă a cazurilor generale, cele
particulare, trebuind gândite și rezolvate independent pentru a putea excela.
Orice început este greu, dar nu te da bătut! Vei reuși!

25

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