Informatică BAC: parcurs cu 50 de lecții
Pregătește informatica pentru BAC în 50 de lecții: algoritmi, tablouri, texte, subprograme și grafuri. Exersează prin exemple, grile și fișe de verificare.
Înapoi la blog

21 octombrie 2026
7 min citire
Un subprogram poate furniza mai multe rezultate prin parametri transmiși prin referință. La BAC, această tehnică este utilă când trebuie să obții simultan minimul și maximul unui vector, fără să parcurgi datele de două ori. Valoarea returnată poate avea un alt rol: să indice dacă rezultatele există.
Lecția privește subprogramele definite de utilizator de la matematică-informatică. Vom construi o funcție care primește un vector și lungimea lui, apoi completează două variabile de ieșire. Pentru vectorul vid, funcția semnalează că nu există extreme. Respectă însă antetul și restricțiile din problema de BAC aleasă, care pot exclude acest caz.
Vectorul și numărul elementelor sunt intrări. Minimul și maximul sunt ieșiri, deoarece funcția trebuie să le completeze pentru programul apelant. Rezultatul logic al funcției spune dacă aceste ieșiri au fost calculate pentru un vector nevid.
Această separare evită folosirea unei valori numerice speciale pentru absența rezultatului. De exemplu, zero nu poate însemna automat că nu există minim, fiindcă poate fi chiar minimul unui vector valid.
Pentru vectorul vid, contractul ales aici păstrează nemodificate variabilele de ieșire și returnează fals. Programul principal nu le afișează în această situație. Pentru un vector nevid, funcția returnează adevărat și garantează că cele două variabile conțin extremele.
Minimul și maximul trebuie să pornească de la o valoare care aparține vectorului. Prima valoare este un candidat valid pentru ambele. Apoi comparăm celelalte elemente, începând de la al doilea.
Inițializarea maximului cu zero ar eșua pentru un vector format numai din numere negative. Inițializarea minimului cu zero ar eșua pentru un vector format numai din numere pozitive. Un candidat artificial poate rămâne în rezultat fără să fi existat în date.
De aceea, verificarea lungimii precedă accesarea primului element. Pentru lungimea zero, poziția zero nu reprezintă un element valid al vectorului logic, chiar dacă tabloul rezervat în memorie are capacitate mai mare.
Programul citește o lungime între zero și o mie și apoi elementele întregi. Funcția nu modifică vectorul. Parametrii pentru minim și maxim trebuie să primească două variabile distincte, deoarece păstrează rezultate diferite.
#include <iostream>
using namespace std;
bool extreme(const int v[], int n, int &minim, int &maxim) {
if (n == 0) return false;
minim = v[0];
maxim = v[0];
for (int i = 1; i < n; ++i) {
if (v[i] < minim) minim = v[i];
if (v[i] > maxim) maxim = v[i];
}
return true;
}
int main() {
int n, v[1000];
cin >> n;
for (int i = 0; i < n; ++i) cin >> v[i];
int mic = 0, mare = 0;
if (extreme(v, n, mic, mare))
cout << mic << ' ' << mare;
else
cout << "VID";
return 0;
}
Cuvântul care declară vectorul constant în interfața funcției împiedică modificarea elementelor prin acel parametru. Nu copiază automat întregul vector. Lungimea trebuie transmisă separat, deoarece funcția are nevoie să știe câte elemente sunt valide.
Pentru vectorul minus șapte, minus doi, minus nouă și minus doi, ambele extreme pornesc de la minus șapte. Al doilea element mărește maximul la minus doi, fără să schimbe minimul.
Al treilea element micșorează minimul la minus nouă. Ultimul este egal cu maximul deja găsit, deci nu schimbă rezultatele. Funcția furnizează minus nouă și minus doi.
| Prefix analizat | Minim | Maxim |
|---|---|---|
| -7 | -7 | -7 |
| -7, -2 | -7 | -2 |
| -7, -2, -9 | -9 | -2 |
| -7, -2, -9, -2 | -9 | -2 |
După fiecare pas, rezultatele descriu prefixul analizat, nu întregul vector înainte de terminarea buclei. Când toate elementele au fost parcurse, prefixul coincide cu vectorul complet.
Dacă transmiți aceeași variabilă pentru minim și maxim, ambele referințe ar desemna același loc. O modificare făcută pentru minim ar schimba și ceea ce funcția consideră maxim, iar cele două rezultate nu ar mai putea fi păstrate independent.
Pentru vectorul unu și trei, aceeași variabilă ar ajunge să păstreze trei la final. Nu ar mai exista un loc separat în care să rămână minimul unu. Problema nu se rezolvă prin schimbarea numelor parametrilor formali.
Contractul trebuie respectat și la apel, nu doar în corpul funcției. Folosește două variabile distincte și nu le confunda cu numele elementelor sau cu lungimea vectorului.
Funcția întoarce valorile minimă și maximă, nu pozițiile lor. Dacă problema cere indicii, trebuie să păstrezi și pozițiile candidaților. O valoare repetată poate apărea pe mai multe poziții, chiar dacă extremul numeric este unic ca valoare.
Regula de departajare contează atunci când păstrezi poziții. Comparațiile stricte mențin prima apariție; actualizarea și la egalitate ar putea păstra ultima. Pentru valorile numerice din această lecție, egalitatea nu cere actualizare.
Nu afișa o poziție atunci când se cere valoarea și nici invers. Notează lângă fiecare ieșire semnificația ei, inclusiv convenția de numerotare dacă apar indici.
După un apel reușit, poți calcula amplitudinea vectorului ca diferență dintre maxim și minim. Dacă valorile pot fi foarte depărtate, tipul expresiei trebuie ales astfel încât diferența să încapă, chiar dacă fiecare element încape separat într-un întreg obișnuit.
Poți verifica și dacă toate elementele sunt egale: într-un vector nevid, această situație este echivalentă cu egalitatea minimului și maximului. Nu este nevoie de o parcurgere nouă pentru această concluzie, odată ce extremele sunt cunoscute corect.
Pentru vectorul vid, astfel de interpretări trebuie tratate separat. Nu folosi valorile inițiale ale variabilelor de ieșire ca și cum ar fi rezultate ale unei prelucrări reușite.
Un vector cu un singur element trebuie să producă aceeași valoare pentru minim și maxim. Un vector constant verifică faptul că egalitățile nu creează rezultate artificiale. Un vector negativ verifică inițializarea maximului.
Vectorul vid verifică respectarea contractului funcției și ramura din programul principal. Un apel care ignoră rezultatul logic ar putea afișa date fără semnificație, chiar dacă implementarea funcției este corectă.
Această distincție dintre calcul și folosirea rezultatului este utilă pentru învățarea prin înțelegere. Verifică separat ce promite subprogramul și ce presupune codul care îl apelează.
Fiecare element de după primul este comparat cu cele două extreme curente. Timpul este proporțional cu numărul elementelor, iar memoria suplimentară a funcției este constantă.
Două funcții separate, una pentru minim și una pentru maxim, ar parcurge vectorul de două ori. Ordinul de complexitate ar rămâne liniar, însă funcția comună adună cele două rezultate într-o singură parcurgere și face explicită legătura dintre ele.
Vectorul este 5, 5, 5. Minimul și maximul sunt cinci, iar toate elementele sunt egale.
Vectorul este -4. Ambele rezultate sunt minus patru. Bucla de comparații nu execută niciun pas după inițializare.
Vectorul este 8, -3, 0, 8. Minimul este minus trei, maximul este opt, iar amplitudinea matematică este unsprezece.
El semnalează dacă există rezultate numerice valide. Minimul și maximul sunt transmise separat prin referințe, iar vectorul vid produce un răspuns negativ.
Da, interfața poate fi simplificată dacă antetul cerut și restricțiile permit. Nu schimba însă arbitrar un antet impus la examen.
Scrie pentru fiecare ieșire semnificația și condiția în care poate fi folosită. Pentru o revizie explicată a apelului, poți consulta un profesor de informatică.
Official curriculum reference
Official curriculum reference (www.edu.ro)Folosim cookie-uri pentru a îmbunătăți experiența ta pe Hola25. Cookie-urile esențiale sunt necesare pentru funcționarea platformei. Poți personaliza setările pentru cookie-uri de analiză și marketing.
Politica de cookies | Politica de confidențialitatePregătește informatica pentru BAC în 50 de lecții: algoritmi, tablouri, texte, subprograme și grafuri. Exersează prin exemple, grile și fișe de verificare.
Înțelege complexitatea buclelor la BAC. Compară parcurgeri succesive, imbricate și împărțiri repetate, apoi justifică timpul și memoria algoritmului.