Vectorii (tablourile unidimensionale) sunt baza a jumătate din problemele de la BAC informatică: îi folosești la Subiectul II, la problema cu șiruri sau tablouri de la Subiectul III și adesea la problema cu fișier. Operațiile de bază — citire, afișare, sumă, minim, maxim — par banale, dar exact pe ele se pierd puncte prin inițializări greșite sau indici scăpați. Aici le ai pe toate, în C++, în varianta pe care o poți scrie din reflex.
Declararea unui vector în C++
int v[101]; // poate reține 101 elemente: v[0], v[1], ..., v[100]
Dimensiunea dintre paranteze e numărul maxim de elemente, fixat la compilare. Dacă enunțul spune „cel mult 100 de numere” și vrei să numerotezi de la 1, declari 101 elemente, ca să existe v[100]. Câte elemente folosești efectiv ține o variabilă separată, de obicei n.
Indicii pot porni de la 0 sau de la 1 — amândouă variantele sunt corecte, important e să rămâi consecvent în tot programul. În exemplele de mai jos folosim indici de la 1, pentru că așa sunt formulate adesea enunțurile de BAC („al i-lea element”).
Un vector declarat global (în afara oricărei funcții) are toate elementele inițializate automat cu 0. Unul declarat local, în main, conține valori neprevăzute până îl completezi.
Citirea și afișarea
#include <iostream>
using namespace std;
int v[101], n;
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
cin >> v[i];
for (int i = 1; i <= n; i++)
cout << v[i] << " ";
return 0;
}
Două detalii: condiția e i <= n (nu <) pentru că pornim de la 1, iar la afișare pui un spațiu între valori, altfel 3 8 2 devine 382. Dacă indicii pornesc de la 0, bucla devine for (int i = 0; i < n; i++).
Suma și media aritmetică
int s = 0;
for (int i = 1; i <= n; i++)
s = s + v[i];
double media = (double)s / n;
Suma pornește obligatoriu de la 0. La medie, conversia la double e esențială: s / n între doi întregi e împărțire întreagă. Pentru vectorul 3 8 -2 8 5, suma e 22, iar 22 / 5 dă 4, pe când (double)22 / 5 dă 4.4.
Dacă elementele pot fi mari (de exemplu până la 109) și sunt multe, suma poate depăși limita lui int (aproximativ 2,1 miliarde); atunci declari suma long long.
Minimul și maximul
Regula de aur: inițializează maximul și minimul cu primul element, nu cu 0. Dacă toate elementele sunt negative, un maxim pornit de la 0 rămâne 0, deși 0 nu e în vector.
int mx = v[1], mn = v[1];
for (int i = 2; i <= n; i++)
{
if (v[i] > mx) mx = v[i];
if (v[i] < mn) mn = v[i];
}
Alternativa acceptată e să pornești de la o valoare „imposibilă” dată de enunț: dacă numerele sunt din [0, 109], poți porni maximul de la −1 și minimul de la 109 + 1.
Poziția maximului: prima sau ultima apariție
Enunțurile cer des poziția maximului, iar când valoarea maximă apare de mai multe ori, contează care poziție. Diferența stă într-un singur caracter:
int pmax = 1;
for (int i = 2; i <= n; i++)
if (v[i] > v[pmax]) pmax = i; // > → prima apariție
// >= → ultima apariție
Pentru 3 8 -2 8 5 (pozițiile 1–5), maximul e 8: cu > se obține poziția 2, cu >= poziția 4. Păstrând poziția, nu mai ai nevoie de o variabilă separată pentru valoare: o iei din v[pmax].
Program complet
Citește n și n numere întregi; afișează suma, media, minimul și maximul împreună cu prima poziție pe care apare maximul.
#include <iostream>
using namespace std;
int v[101], n;
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
cin >> v[i];
int s = 0, mn = v[1], pmax = 1;
for (int i = 1; i <= n; i++)
{
s = s + v[i];
if (v[i] < mn) mn = v[i];
if (v[i] > v[pmax]) pmax = i;
}
cout << "suma = " << s << endl;
cout << "media = " << (double)s / n << endl;
cout << "minim = " << mn << endl;
cout << "maxim = " << v[pmax] << " pe pozitia " << pmax << endl;
return 0;
}
Pentru intrarea 5 / 3 8 -2 8 5, programul afișează: suma = 22, media = 4.4, minim = -2, maxim = 8 pe poziția 2. Observă că am pus toate prelucrările într-o singură parcurgere: e mai scurt și la fel de clar.
Alte prelucrări care apar des
- Numărare cu o condiție (câte elemente pare, câte mai mari decât media): un contor pornit de la 0, incrementat într-un
if. - Căutare a unei valori x: parcurgi și te oprești la prima apariție (sau folosești o variabilă
gasitde tipbool). - Verificarea unei proprietăți pentru toate elementele (de exemplu „vectorul e crescător”): presupui că e adevărată și o infirmi la primul contraexemplu, comparând
v[i]cuv[i + 1]pentru i de la 1 la n − 1. - Afișare în ordine inversă:
for (int i = n; i >= 1; i--).
v[i] și v[i + 1], bucla merge doar până la n - 1. Altfel citești v[n + 1], care nu face parte din date, iar rezultatul poate fi greșit fără niciun mesaj de eroare.De reținut
- ● Declară vectorul cu o dimensiune cel puțin egală cu valoarea maximă a lui n (plus 1 dacă numerotezi de la 1).
- ● Vectorii globali sunt inițializați cu 0; cei locali, nu.
- ● Suma pornește de la 0; pentru medie folosește
(double)s / n. - ● Minimul și maximul se inițializează cu primul element, nu cu 0.
- ●
>dă prima poziție a maximului,>=dă ultima. - ● Comparațiile cu vecinul
v[i + 1]se opresc lan - 1.