atestat sortare
TRANSCRIPT
-
7/28/2019 atestat sortare
1/13
TABLOURI
In mod surprinzator, incepem cu tabloul, structura fundamentala, predefinita in
majoritatea limbajelor de programare. Necesitatea de a elabora o noua structura de acest tip
provine din urmatoarele inconveniente ale tablourilor predefinite, inconveniente care nu sunt
proprii numai limbajelor C si C++:
Numarul elementelor unui tablou trebuie sa fie o expresie constanta, fixata in
momentul compilarii.
Pe parcursul executiei programului este imposibil ca un tablou sa fie marit sau
micsorat dupa necesitati.
Nu se verifica incadrarea in limitele admisibile a indicilor elementelor tablourilor.
Tabloul si numarul elementelor lui sunt doua entitati distincte. Orice operatie cu
tablouri (atribuiri, transmiteri de parametri etc) impune specificarea explicita a numarului de
elemente ale fiecarui tablou.
Un sir de elemente de acelai tip, n care conteaz ordinea elementelor, se
numete vector sau tablou unidimensional.
Un tablou este o structura formata dintr-un numr fixat de componente de
acelai tip, numit tip de baza. Numrul de componente este determinat de numrul de valori
ale indicilor, care sunt obligatoriu tipuri ordinale. Poziia unui element se mai numete si
indicele sau rangul elementului, iar elementele se mai numesc si componente ale vectorului.
OBSERVATII: In cazul in care tip_ordinal este unul din tipurile intregi,este obligatoriu sa
folosim subdomeniile lui variabila v este un tablou de dimensiune 1 cu 100 componente
intregi identificate prin indici din subdomeniul 1..100.
Aici tipul ordinal este subdomeniu al tipului int, iar tipul oarecare este tot int.
Componentele unui tablou sunt memorate pe zone de memorii consecutive. Adresarea unei
componente a tabloului se face prin indice (o valoare a tipului ordinal) care se specifica dup
numele tabloului, ntre paranteze drepte.
Prin declararea unui vector vom nelege numrul maxim de elementele
acestuia. Numrul elementelor efective folosite, care difer de la o execuie la alta se
numete numr real (efectiv de elemente).
1
-
7/28/2019 atestat sortare
2/13
"Vizualizarea" tuturor elementelor pe rnd si prelucrare acestora se numete
parcurgere. Parcurgerea intr-un ciclu poziiile elementelor din vector i=1,2,3,...,n si pentru
fiecare valoare a lui i, "vizitm" si prelucram elementul v[i], adic elementul aflat pe poziia i.
TABLOURI UNIDIMENSIONALE
Structura de date este o colecie de date nzestrat cu informaii structurale
care permit identificarea i selecia componentelor.
Componentele unei structuri de date pot fi identificate si selectate fie prin
numele, fie prin intermediul relaiilor structurale. Cea mai simpla relaie structurala este
poziia fiecrei componente in cadrul structurii.
Asupra unei structuri de date se pot aplica mai multe tipuri de operaii
:vizualizarea elementelor structurii sub diferite forme, actualizarea(adugarea, modificarea
sau tergerea unei componente), mbogirea structural(prin adugarea unor informaii de
legtura) sortare(aranjarea componentelor intr-o anumita ordine stabilita de un anumit criteriu
de ordonare.
Din punct de vedere al coninutului, structurile pot fi:-omogene(toate componentele structurii sunt de acelai tip)
-neomogene(componentele structurii sunt de tipuri diferite)
in funcie de modul in care sunt memorate structurile de date se mpart in doua mari
categorii:
-Structuri interne, sunt create in memoria interna RAM a sistemului, i au un caracter
temporar, datorit faptului ca memoria interna este volatila.
-Structuri externe, sunt depozitate pe un suport de memorie externa (hard-disk.floppy-disk), avnd astfel un caracter permanent.
Tablourile unidimensionale sunt tablouri cu un singur indice (vectori). Dac
tabloul conine dim_1 elemente, indicii elementelor au valori ntregi din intervalul [0, dim_1-1].
La ntlnirea declaraiei unei variabile tablou, compilatorul aloc o zon de memorie continu
(dat de produsul dintre dimensiunea maxim i numrul de octei corespunztor tipului
tabloului) pentru pstrarea valorilor elementelor sale. Numele tabloului poate fi utilizat n
diferite expresii i valoarea lui este chiar adresa de nceput a zonei de memorie care i-a fost
2
-
7/28/2019 atestat sortare
3/13
alocat. Un element al unui tablou poate fi utilizat ca orice alt variabil (n exemplul urmtor,
atribuirea de valori elementelor tabloului vector). Se pot efectua operaii asupra fiecrui
element al tabloului, nu asupra ntregului tablou.
Exemplu:
// Declararea tabloului vector
int vector[6];
// Iniializarea elementelor tabloului
vector[0]=100;
vector[1]=101;
vector[2]=102;
vector[3]=103;
vector[4]=104;
vector[5]=105;
Exemplu:
double alpha[5], beta[5], gama[5];
int i=2;
alpha[2*i-1] = 5.78;
alpha[0]=2*beta[i]+3.5;gama[i]=aplha[i]+beta[i]; //permis
gama=alpha+beta; //nepermis
Variabilele tablou pot fi iniializate n momentul declarrii:
declaraie_tablou=list_valori;
Valorile din lista de valori sunt separate prin virgul, iar ntreaga list este inclus ntre
acolade:Exemple:
//1
int vector[6]={100,101,102,103,104,105};
[0] [5]
//2
3
vector
100
101
102
103
104
105
vector[0]
vector[1]
vector[2]
vector[3]
vector[4]
vector[5]
vector 100 101 102 103 104 105
-
7/28/2019 atestat sortare
4/13
double x=9.8;
double a[5]={1.2, 3.5, x, x-1, 7.5};
La declararea unui vector cu iniializarea elementelor sale, numrul maxim de elemente ale
tabloului poate fi omis, caz n care compilatorul determin automat mrimea tabloului, n
funcie de numrul elementelor iniializate.
Exemplu:
char tab[]={ A, C, D, C};
[0] [3]
float data[5]={ 1.2, 2.3, 3.4 };
[0] [4]
Adresa elementului de indice idintr-un tablou unidimensional poate fi calculat astfel:
adresa_elementului_i = adresa_de_baz + i lungime_element
OPERAII CU VECTORI
O variabila de tip tablou nu poate fi citita sau scrisa in ntregime. Se pot face
atribuiri intre variabile de acelai tablou. Dar, e preferabil sa se lucreze pe componente .Cu
componentele unui tablou Se pot face toate operaiile ce Se pot face cu orice variabil de
acel tip (afiare, citire, atribuire etc)
1Citirea unui vector
Aceasta nseamn citirea numrului n de componente, intr-un ciclu for.
#include
4
tab A B
1
C D
data 1.2 2.3 3.4 ? ?
-
7/28/2019 atestat sortare
5/13
void main()
{
int v[100],n,i;
coutn;
for(i=1;i
-
7/28/2019 atestat sortare
6/13
5.Determinarea elementului minim dintr-un vector
Aceasta problema se rezolva astfel:consideram minim primul element,apoi
parcurgem restul vectorului si,ori de cate ori gasim un element mai mic actualizam minimul la
valoarea acelui element
#include
main()
{
int v[9],n,i,min;
coutn;
for(i=1;i>v[i];
min=v[1];
for(i=1;i
-
7/28/2019 atestat sortare
7/13
cin
-
7/28/2019 atestat sortare
8/13
Se determina minimul dintre valorile retinute in componentele de la 2 la 4.Acesta este 2 si este retinut de componenta 4. Se inverseaza continutul componentelor 2 si4.
A
A[1] A[2] A[3] A[4]Se determina minimul dintre valorile retinute in componentele de la 3 la 4.
Acesta este 3 si este retinut de componenta 4. Se inverseaza continutul componentelor 3 si4.
A
A[1] A[2] A[3] A[4]
In cazul in cae se cere sortarea descrescatoare, la fiecare pas se calculeazamaximul.
#includeint a[9],n,i,j,k,man,min;void main(){
coutn;for (i=0;i
-
7/28/2019 atestat sortare
9/13
b. BUBBLE SORT- Sortarea prin interschimbare.Algoritm:
Se parcurge variabila inversand continuturile componentelor alaturate care nusunt in ordine crescatoare (descrescatoare);
Procedeul se repeat pana cand are loc o parcurgere in care nu se fac inversari
Exemplu:
A
A[1] A[2] A[3] A[4]
Se efectueaza prima parcurgere. Se inverseaza valorile retinute de
componentele 1 si 2. Se obtine:
A
A[1] A[2] A[3] A[4]
Valorile retinute de componentele 2 si 3 nu se inverseaza. In schimb, se
inverseaza valorile retinute de componentele 3 si 4.
A
A[1] A[2] A[3] A[4]
Intrucat au avut loc inversari se parcurge vectorul. Se inverseaza valorile
retinute de componentele 2 si 3:
A
A[1] A[2] A[3] A[4]
3 1 4 2
1 3 4 2
1 3 2 4
1 2 3 4
9
-
7/28/2019 atestat sortare
10/13
Alte inversari nu se fac. Intrucat in actuala parcurgere au fost facute inversari, sereparcurge vectorul, de data asta inutil si algoritmul se incheie.
#includeint a[9],n,i,k,man,gasit;void main(){
coutn;for (i=1;i
-
7/28/2019 atestat sortare
11/13
B
B[1] B[2] B[3] B[4]Valoarea 1 trebuie inserata inaintea valorii 3. Pentru aceasta, 3 se deplaseaza la
dreapta cu o pozitie sip e pozitia sa se insereaa valoarea 1.
A
A[1] A[2] A[3] A[4]
B
B[1] B[2] B[3] B[4]
Valoarea 4 trebuie inserata dupa 3. Pentru aceasta nu este necesara nici o deplasare.
A
A[1] A[2] A[3] A[4]
B
B[1] B[2] B[3] B[4]
Valoarea 2 se insereaza pe pozitia ocupata de valoarea 3. Pentru aceasta, valorile 3 si4 se deplaseaza la dreapta cu cate o pozitie.
A
A[1] A[2] A[3] A[4]
3
3 1 4 2
1 3
3 1 4 2
1 3 4
3 1 4 2
11
-
7/28/2019 atestat sortare
12/13
B
B[1] B[2] B[3] B[4]
Acum vectorul B retine valorile sortate.#includeint a[9],b[9],n,i,j,k,gasit;void main(){
coutn;for (i=0;i
-
7/28/2019 atestat sortare
13/13
BIBLIOGRAFIE:
1. Totul despre C si C++, Dr. Kris Jamsa Lars Klander, Editura TEORA, 2005
2. Bazele programarii in C++, Doina Logofatu, Editura Polirom, 2004
3. Informatica varianta C++, Tudor Sorin, Editura L&S Informat, 2000
4. C++, George Mateescu, Editura Petrion, 2003
5. Manual de programare in C++, Stefan Prata, Editura TEORA, 2004
13