Documente Academic
Documente Profesional
Documente Cultură
TEMA:
Tablouri: vectori, matrici, şiruri de caractere.
NOŢIUNI TEORETICE
1. Tablouri
Numim tablou o colecţie (grup, mulţime ordonată) de date, de acelaşi tip, situate într-o zonă
de memorie continuă (elementele tabloului se află la adrese succesive). În funcţie de numărul
indicilor utilizaţi pentru a referi elementele tabloului, putem întâlni tablouri unidimensionale
(vectorii) sau multidimensionale (matricile sunt tablouri bidimensionale).
2. Şiruri de caractere
Şirurile de caractere sunt vectori de caractere, care au ca ultim element un terminator de şir,
caracterul null (zero ASCII), ’\0’.
Trebuie subliniat faptul că la multe dintre funcțiile cu șiruri de caractere (în exemplele de aici
- copiere sau concatenare) pot să apară erori grave. La lucrul cu aceste funcții, considerate
“nesigure”, programatorul trebuie să se asigure că șirul destinație are “suficiente elemente”
(să facă alocare dinamică de memorie pentru numărul necesar de elemente). Ca urmare, astfel
de funcții au fost înlocuite în Visual Studio cu funcții ”oarecum similare”, dar sigure. Aceste
funcții au același nume, urmate de _s, și un pramatru în plus (dimensiunea șirului
copiat/concatenat, etc).
strcpy_s (<şir_destinaţie>, <lungime>, <şir_sursă>)
strcat_s (<şir_destinaţie>, <lungime>, <şir_sursă>)
PROBLEME REZOLVATE
// a)
#include <iostream>
1 vect[i]
using namespace std;
int main()
{ aux 2
double vect[100];
int n; //n-numarul de elemente ale vectorului 3 vect[n-i-1]
cout << "Nr. elemente ="; cin >> n; double aux;
// citire vector
for (int i = 0; i < n; i++) { Figura 1. Interschimbarea a
cout << "v[" << i + 1 << "]="; două variabile
cin >> vect[i];
}
for (int i = 0; i < n / 2; i++) {
aux = vect[i];
vect[i] = vect[n - 1 - i];
vect[n - 1 - i] = aux;
}
cout << "Vector cu elemente interschimbate\n";
for (int i = 0; i < n; i++)
cout << vect[i] << "\t";
cout << endl;
}
Pentru schimbarea elementelor vectorului s-a folosit variabila auxiliară aux (figura 4.2.). Fără
această variabilă, la atribuirea vect[i]=vect[n-1-i], valoarea elementului vect[i]
s-ar fi pierdut. Trebuie observat, de asemenea, că variabila contor i ia valori între 0 şi n/2
(de exemplu, dacă vectorul are 4 sau 5 elemente sunt necesare 2 interschimbări).
Prima variantă a algoritmului folosește un indicator (gata, de tip boolean), care va determina
dacă am terminat numărul de parcurgeri ale vectorului. Înainte de fiecare parcurgere a
întregului vector, valoarea indicatorului este setată pe true. Dacă, pe măsură ce se parcurge
vectorul, se realizează o interschimbare a 2 elemente vecine din vector, valoarea indicatorului
este setată pe false. Astfel, când am terminat o parc urgere completă a vectorului, valoarea
indicatorului ne va spune dacă vectorul este ordonat (gata = true) sau neordonat (gata =
false – condiția din while, deci e necesară o nouă parcurgere).
Această variantă a algoritmului de ordonare prin metoda bulelor este potrivită pentru situațiile
în care doar câteva dintre elementele vectorului nu sunt în ordinea corespunzătoar și doar
dupa câteva interschimbări vectorul ajunge sa fie ordonat. Indicatorul gata ne ajută să
detectăm acest lucru și să ne oprim “la timp/devreme” .
ALGORITM Bubble_Sort
INCEPUT
gata false
CIT TIMP not gata REPETA
INCEPUT
gata true
PENTRU i=0 LA n-2 REPETA
INCEPUT
DACA vect[i] > vect[i+1] ATUNCI
` INCEPUT
aux vect[i]
vect[i] vect[i+1]
vect[i+1] aux
gata fals
SFARSIT
SFARSIT
SFARSIT
SFARSIT
O a doua variantă a aceluiași algoritm de sortare este cea fără indicator, în care se realizează
un număr “fix” de parcurgeri.
Se parcurge vectorul, se compară elementele vecine, 2 câte 2 (pereche) ăi se interschimbă
acestea când nu sunt în “ordinea dorită”. Astfel, după prima parcurgere, cel mai mare element
(în cazul unei ordonări crescătoare) este plasat “correct”, pe ultima poziție din vector.
Celelalte elemente nu sunt plaste corect, deci procesul trebuie repetat. A doua parcurgere nu
se va mai realiza asupra întregului vector, ci doar asupra elementelor “rămase” (primele n-1
elemente). După a doua parcurgere, cele mai mari elemente ajung pe ultimele 2 poziții din
vector, în ordinea corespunzătoare. Următoarea parcurgere vizează primele n-2 elemente din
vector, ș.a.m.d.
#include <iostream>
using namespace std;
int main(void)
{
int A[10][10]; int nr_lin, nr_col;
cout << "Nr.linii:"; cin >> nr_lin;
cout << "Nr. coloane:"; cin >> nr_col; int i, j;
//citirea elementelor unei matrici
for (i = 0; i < nr_lin; i++)
for (j = 0; j < nr_col; j++) {
cout << "A[" << i << "," << j << "]=";//afisarea unui mesaj
prealabil citirii
cin >> A[i][j];
}
//afisarea elementelor matricii
for (i = 0; i < nr_lin; i++) {
for (j = 0; j < nr_col; j++)
cout << A[i][j] << '\t';
cout << '\n';
}//dupa afis. elem-lor unei linii, se trece pe linia urmatoare
return 0;
}
#include <iostream>
using namespace std;
int main()
{
double a[10][10], b[10][10], c[10][10];
int m, n, p, j;
cout << "m="; cin >> m; cout << "n="; cin >> n; cout << "p="; cin >> p;
// calculul matricii AT =A
double at[10][10]; // at este matricea transpusă
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
at[i][j] = a[j][i];
cout << "A transpus=\n";
// de completat secventa de afisare a matricii at, cu n linii si m coloane
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
cout << at[i][j] << "\t";
cout << endl;
}
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char sir1[] = "abcd", sir2[] = "abcde", sir3[] = "abcdef";
char sir4[] = "de"; cout << sizeof(sir4)<<endl; // afisare: 3
cout << "Lung sir \"sir1\" este " << strlen(sir1) << endl;
//Lung sir "sir1" este 4
cout << strcmp(sir1, sir2) << '\n'; // afisare: -1
// Cod 'e' = 101, Cod 'a' = 97, Cod 'd' = 100
cout << strcmp(sir2, sir1) << '\n'; //afisare: 1
cout << strcmp(sir1, "") << ' ';//compararea variabilei sir1 cu const. sir vid
char str1[20] = "hello"; char str2[20] = "goodbye";
int difer;
cout << "str1 = " << str1 << " str2 = " << str2 << '\n';
difer = strcmp(str1, str2);
if (difer == 0)
cout << "Siruri echivalente!\n";
else if (difer > 0)
cout << str1 << " mai mare(lexicografic) decat " << str2 << '\n';
else
cout << str1 << " mai mic(lexicografic) decat " << str2 << '\n';
cout << "Inainte de copiere:\n";
cout << "str1 = " << str1 << '\n'; cout << "str2 = " << str2 << '\n';
//strcpy(str3, str1); //NESIGURA!!!!
strcpy_s(str1, strlen(str2)+1, str2);
cout << "\nDupa copierea lui str2 in str1:\n";
cout << "str1 = " << str1 << '\n';
cout << "str2 = " << str2 << '\n';