Tablouri unidimensionale
Declararea unui vector, indicii, citirea și afișarea, plus cele două greșeli care depășesc limitele fără să dea eroare.
De ce
Până acum, fiecare valoare citită avea propria variabilă. Merge pentru trei numere, dar nu și pentru o sută.
Mai mult, unele probleme cer să păstrezi toate valorile. Ca să afli media, e destul să aduni pe măsură ce citești. Ca să afli câte valori sunt peste medie, îți trebuie din nou toate valorile, iar de la tastatură nu poți citi de două ori.
Un tablou unidimensional, sau vector, este un șir de valori de același tip, păstrate sub un singur nume și deosebite printr-un indice.
Declararea
int v[100];Rezervă 100 de locuri pentru numere întregi. Dimensiunea trebuie să fie o constantă cunoscută la compilare, deci nu poți scrie int v[n]; cu n citit de la tastatură.
De aceea dimensiunea se alege după limita din enunț:
const int MAX = 1001;
int v[MAX];Dacă enunțul spune „n ≤ 1000", declari 1001 locuri și lucrezi liniștit cu indicii de la 1 la n.
Indicii
Indicii încep de la 0. Într-un int v[100], elementele sunt v[0], v[1], …, v[99]. Nu există v[100].
Ai două convenții posibile. Alege una și ține-te de ea.
De la 0, cum e natural în C++:
for (int i = 0; i < n; i++)
cin >> v[i];De la 1, cum e natural în pseudocod și în enunțuri, cu poziția 0 nefolosită:
for (int i = 1; i <= n; i++)
cin >> v[i];A doua variantă face codul să semene cu enunțul („primul element este v[1]") și te scutește de conversii în minte. Costă un loc de memorie. Pentru bac o recomand. Doar nu le amesteca în același program, pentru că de acolo vin cele mai multe erori cu unu.
Citirea și afișarea
Tiparul complet:
#include <iostream>
using namespace std;
const int MAX = 1001;
int v[MAX];
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> v[i];
for (int i = 1; i <= n; i++)
cout << v[i] << " ";
return 0;
}Vectorul este declarat în afara lui main. Nu e obligatoriu, dar pentru vectori mari este necesar. Variabilele din interiorul unei funcții stau într-o zonă de memorie limitată, iar un int v[1000000] declarat în main poate face programul să se oprească brusc. Declarat în afară, nu are problema asta.
Mai e un avantaj: un vector declarat în afara funcțiilor este inițializat automat cu zero.
Ieșirea din limite
Aici e marea capcană: C++ nu verifică dacă indicele este valid.
int v[10];
v[15] = 3; // compilează, rulează, și strică memoria altcuiva
v[-1] = 7; // la felNu primești nicio eroare. Programul poate merge perfect de zece ori și se poate opri a unsprezecea oară, sau poate da rezultate greșite fără niciun motiv vizibil.
Cele două cauze obișnuite:
Vector prea mic. Enunțul spune n ≤ 1000, tu ai declarat v[100].
Bucla trece de capăt. for (int i = 0; i <= n; i++) cu indexare de la 0 atinge v[n], care nu face parte din date.
Când un program „merge ciudat" fără motiv, verifică întâi indicii.
Un exemplu care are nevoie de vector
Se citesc n numere. Să se afișeze câte sunt strict mai mari decât media lor aritmetică.
#include <iostream>
using namespace std;
const int MAX = 1001;
int v[MAX];
int main() {
int n;
cin >> n;
long long suma = 0;
for (int i = 1; i <= n; i++) {
cin >> v[i];
suma += v[i];
}
double media = (double)suma / n;
int cate = 0;
for (int i = 1; i <= n; i++)
if (v[i] > media)
cate++;
cout << cate;
return 0;
}Două parcurgeri: prima citește și adună, a doua compară. Fără vector, a doua n-ar fi posibilă.
Observă și (double)suma / n. Fără conversie, suma / n ar fi o împărțire întreagă (7 / 2 dă 3, nu 3,5), iar media ar fi trunchiată. Comparația cu media trunchiată poate da alt rezultat decât cu media adevărată, de exemplu la >= sau când suma e negativă.
Vectori în pseudocod
Se scriu la fel, cu indicele între paranteze drepte, numerotat de obicei de la 1:
citește n
┌pentru i ← 1,n execută
│ citește v[i]
└■De reținut
- Un vector reține multe valori de același tip sub un nume, deosebite prin indice.
- Dimensiunea la declarare este constantă. Alege-o din limita dată în enunț, plus unu.
- În C++ indicii pornesc de la 0, dar poți lucra și de la 1. Alege o convenție și rămâi la ea.
- Ieșirea din limite nu dă eroare. Dă rezultate greșite, mai târziu și în altă parte.
- Declară vectorii mari în afara lui
main. - Îți trebuie vector doar când ai nevoie de valori după ce le-ai citit pe toate.