Subprograme definite de utilizator

Subprograme: declarare, apel, parametri

Doar pentru matematică-informatică. Ce e un subprogram, cum îl apelezi, diferența dintre transferul prin valoare și prin referință și variabilele locale. Cu itemi oficiali în care rezultatul depinde de un singur &.

  • 24 min
  • La BAC: Subiectul al III-lea, 1 (10p) · I (4p)
  • De revizuit
Ilustrație: Subprograme: declarare, apel, parametri
Ilustrație generată pentru ZECE (artistică, nu o planșă științifică: pentru detalii exacte vezi schemele din lecție).

ții minte doar fișa asta și ești acoperit

Fișa de aur

  1. 01

    Doar MI: la științele naturii, III.1 se scrie în pseudocod, fără subprogram.

  2. 02

    Antet: tip nume(parametri). int f(int n) returnează; void f(int n) nu.

  3. 03

    Prin valoare: int x. Subprogramul lucrează pe o copie, apelul nu vede schimbarea.

  4. 04

    Prin referință: int &x. E aceeași variabilă. Așa furnizezi un rezultat printr-un parametru.

    Truc: & = aceeași cutie.

  5. 05

    Antetul costă: 2 p dacă rezultatul se returnează, 3 p dacă se furnizează prin parametru.

  6. 06

    Variabile locale: declară tot în subprogram. La barem, 1 p merge cu corectitudinea globală.

1 din 8

Pe scurt

1 minesențialul, de recitit oricând

Culorile din lecție:termencifră, datăidee-cheie

  • Doar pentru matematică-informatică. Capitolul 7 din programă nu există la științele naturii, iar în lucrările SN importate nu se cere niciun subprogram scris de tine. La SN, aceeași problemă de la III.1 se scrie în pseudocod.
  • III.1 cere un subprogram, în toate lucrările MI importate din 2024–2027: 10 p, din care 2–3 p doar pentru antet.
  • Cel mai important lucru de înțeles: diferența dintre int x și int &x.

Ideea, apoi numele oficial

3 min 2 întrebări la final

Ai nevoie de suma cifrelor în trei locuri din program. În loc să scrii bucla de trei ori, îi dai un nume și o folosești oriunde.

int suma(int n)
{ int s=0;
  while(n!=0)
  { s=s+n%10;
    n=n/10;
  }
  return s;
}

int main()
{ int a=2027;
  cout<<suma(a)<<" "<<a;
  return 0;
}

Programul afișează 11 2027. Deși subprogramul îl aduce pe n la 0, a rămâne neschimbat.

Termen oficialÎn exemplu

antet
int suma(int n)
parametru formal
n, din antet
parametru efectiv
a, din apel
variabilă locală
s
rezultat
return s;
apel
suma(a)

Subprogramul se scrie înaintea locului în care e apelat. Programa spune „proceduri și funcții”: în C/C++ procedura e o funcție void.

C/C++
Pascal
Cu rezultat
int f(int n)
function f(n:integer):integer;
Fără rezultat
void p(int n)
procedure p(n:integer);
Prin referință
int &x
var x:integer
Returnare
return s;
f:=s;

Ce rămâne în x după void f(int a) { a=a+1; } și x=3; f(x);?

Ce rămâne în x după void f(int &a) { a=a+1; } și x=3; f(x);?

Transferul parametrilor

3 min

Aici se decide totul.

void dubleaza1(int a)
{ a=a*2;
}

void dubleaza2(int &a)
{ a=a*2;
}

Pornind de la x=5:

dubleaza1(x)
x după apel
5
De ce
a e o copie, iar la final dispare
dubleaza2(x)
x după apel
10
De ce
a e chiar x, sub alt nume
1 / 2

Oficial, primul e transfer prin valoare, al doilea transfer prin referință.

Prin valoare
Prin referință
Scriere
int a
int &a
La apel poate fi
variabilă, constantă, expresie: f(x+1)
doar o variabilă: f(x)
Ce vede apelul după
valoarea veche
valoarea nouă
Când îl folosești
date de intrare
rezultate

Tablourile sunt un caz aparte. La model 2026, I.2, antetul e int f(int s,int d,int v[]): tabloul se scrie fără &, dar subprogramul lucrează pe elementele originale.

Oficial: doi itemi în care contează &

5 min

Aceste subprograme sunt recursive, adică se apelează pe ele însele; lecția de recursivitate explică mecanismul. Aici urmărește doar ce se întâmplă cu n.

Simulare 2026, MI, I.3

void f(int &n)
{ if(n>0)
  { cout<<n;
    n=n-1;
    f(n);
    cout<<n;
  }
}

Se cere ce afișează x=3; f(x);. Toate apelurile lucrează pe aceeași variabilă.

  • La coborâre se afișează 3, 2, 1, iar variabila ajunge la 0.
  • La revenire, fiecare apel afișează n, care e 0 pentru toți: 0, 0, 0.

Se afișează 321000 (varianta a, 4 p). Dacă antetul ar fi fost void f(int n), fiecare apel ar fi avut copia lui, iar la revenire s-ar fi afișat 0, 1, 2: adică 321012, una dintre variantele greșite.

Sesiunea specială 2024, varianta 4, MI, I.2

void f(int x)
{ if(x%5!=0)
  { x=x*5/2;
    f(x);
  }
  else x=x-1;
  cout<<x;
}

Pentru f(9), parametrul e prin valoare. Atribuirile se văd doar în apelul curent.

f(55)
x la afișare
54
Ce se afișează, în ordine
primul
f(22)
x la afișare
55
Ce se afișează, în ordine
al doilea
f(9)
x la afișare
22
Ce se afișează, în ordine
al treilea
1 / 3

Se afișează 545522 (varianta b, 4 p). Atenție la a doua linie: f(22) îl schimbă pe x în 55 înainte să apeleze, iar această valoare o afișează.

Model 2022, MI, I.2 are void f(int x,int y,int&z), cu r inițial 0. Doar f(18,19,r) lasă r=2 (varianta d, 4 p): parametrul z e prin referință, deci modificările ajung în r.

Oficial: rezultat printr-un parametru la III.1

5 min o întrebare la final

Rezervă 2025, varianta 7, III.1

Subprogramul consecutiv primește n din [1,10⁴] și furnizează prin f numărul cu proprietatea (f-1)*f < n ≤ f*(f+1). Pentru n=19, f=4.

void consecutiv(int n,int &f)
{ f=1;
  while(f*(f+1)<n)
    f++;
}

Bucla crește f cât timp n e mai mare decât f*(f+1). Când se oprește, f*(f+1) e prima valoare care ajunge la n.

Barem (10 p)Puncte

antet, câte 1 p: structură, parametru de intrare, parametru de ieșire
3
valoare determinată, câte 3 p: numere cu proprietatea cerută, cel mai mare sau cel mai mic dintre ele
6
variabile locale, corectitudine globală
1

Model 2026, III.1: același parametru, și intrare, și ieșire

Subprogramul Plus are un singur parametru, n, din [10,10⁹). Înlocuiește fiecare secvență 25 cu 26 și furnizează rezultatul prin același parametru. Pentru n=202535250, după apel n=202635260.

void Plus(int &n)
{ int m=n,r=0,p=1,c;
  while(m!=0)
  { c=m%10;
    if(c==5 && m/10%10==2)
      c=6;
    r=c*p+r;
    p=p*10;
    m=m/10;
  }
  n=r;
}

Cifra 5 devine 6 doar dacă în stânga ei e un 2. Rezultatul se construiește cu c*p+r, deci zeroul de la final rămâne.

Barem: antet 2 p (structură, parametru de intrare-ieșire); valoare determinată 6 p, câte 1 p pentru identificarea unei cifre, perechea de cifre de pe poziții consecutive, înlocuirea sau alipirea unei cifre, secvențele înlocuite, ordinea cifrelor, secvențele păstrate, „inclusiv cifrele nule de la finalul numărului”; furnizarea rezultatului prin parametrul indicat 1 p; variabile locale și corectitudine globală 1 p.

De ce nu merge apelul f(5) dacă antetul e void f(int &a)?

Variabile locale și globale

3 min

int x=1;

void f()
{ int x=2;
  cout<<x;
}

int main()
{ f();
  cout<<x;
  return 0;
}

Programul afișează 21. În f, numele x e al variabilei locale, care o acoperă pe cea globală.

Locală
Globală
Declarată
în subprogram
în afara subprogramelor
Vizibilă
doar în subprogram
în tot programul, de la declarare încolo
Valoare inițială
nedefinită, până o atribui
0, dacă nu pui alta

Oficial, programa cere „variabile globale și variabile locale, domeniu de vizibilitate”. În lucrările importate, niciun enunț nu întreabă direct despre asta. Totuși baremul de la III.1 are, în toate lucrările 2024–2027 importate, un punct pentru variabilele locale declarate, împreună cu corectitudinea globală. Deci la III.1 declară tot ce folosești în interiorul subprogramului.

Ce se cere la BAC

1 mincum apare la examen

Subiectul I
Ce se cere
subprogram dat, adesea recursiv: ce afișează, ce valoare are, ce apel e corect
II.2, uneori
Ce se cere
valorile unui subprogram recursiv dat
III.1
Ce se cere
definiția completă a unui subprogram
1 / 3

Greșeli care costă puncte

2 mincapcanele de evitat

  • & lipsă la parametrul prin care se furnizează rezultatul.
  • & în plus la parametrii de intrare: la unii itemi schimbă rezultatul, iar la III.1 nu respectă cerința.
  • return cu valoare într-un subprogram void.
  • Numele greșit: Plus nu e plus. Identificatorii trebuie să respecte enunțul.
  • cin în subprogram, când valorile vin prin parametri.
  • Variabile locale nedeclarate sau folosite fără valoare inițială.
  • Parametru modificat, apoi folosit ca și cum ar avea valoarea inițială. Fă o copie.

Termeni-cheie

Subprogram
O bucată de program cu nume, parametri și, eventual, un rezultat, pe care o poți apela de oriunde.
Antet
Prima linie: tipul rezultatului, numele și lista parametrilor. Ex.: int suma(int n).
Parametri formali
Numele din antet. Primesc valori la fiecare apel.
Parametri efectivi
Ce pui între paranteze la apel: f(5), f(x+1).
Transfer prin valoare
Subprogramul lucrează pe o copie. Variabila de la apel nu se schimbă.
Transfer prin referință
Parametrul scris cu & este aceeași variabilă cu cea de la apel. Ce schimbi în subprogram rămâne schimbat.
Variabilă locală
Declarată în subprogram. Există doar cât timp acesta rulează și se vede doar în el.
Variabilă globală
Declarată în afara oricărui subprogram. Se vede din toate subprogramele scrise după ea.

Notițele mele

Salvat local

Surse