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

La BAC: când compari elemente vecine, cu 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