Subprograme definite de utilizator

Subprogramul de la III.1: cum iei cele 10 puncte

Doar pentru matematică-informatică. Citești verbul din enunț și știi cum arată antetul. Cele patru forme, cu barem, rezolvate pe lucrări din 2025 și 2026, și proiectarea modulară cu un subprogram ajutător.

  • 28 min
  • La BAC: Subiectul al III-lea, 1 (10p)
  • De revizuit
Ilustrație: Subprogramul de la III.1: cum iei cele 10 puncte
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

    Returnează: int f(...) și return. Antet 2 p, valoare 6 p, return 1 p, restul 1 p.

  2. 02

    Furnizează prin parametrul p: void f(..., int &p). Antet 3 p, valoare 6 p, restul 1 p.

  3. 03

    Afișează: void f(...) și cout. Antet 2 p, iar afișarea are punctaj separat.

  4. 04

    Numele și parametrii din enunț se scriu exact, în ordinea dată.

    Truc: Identificatorii din bold se copiază.

  5. 05

    Fără citire, fără main: se cere doar definiția subprogramului.

  6. 06

    Cazul special din enunț (0, -1, nu exista) are adesea punctaj propriu.

1 din 9

Pe scurt

1 minesențialul, de recitit oricând

  • Doar pentru matematică-informatică. La științele naturii, aceeași problemă se scrie în pseudocod, cu alt barem.
  • Citești verbul: returnează, furnizează sau afișează. Îți spune forma antetului și unde sunt punctele.
  • Partea grea e algoritmul de 6 p, de obicei pe cifre sau pe divizori. Îl găsești în lecțiile despre numere; aici e forma completă.

Patru forme, un singur tabel

2 min

În lucrările MI din 2025–2027, III.1 are una dintre aceste forme:

returnează
Antet
int f(int n)
La final
return r;
Exemplu
iunie 2026, august 2026
furnizează prin parametrul p
Antet
void f(int n,int &p)
La final
p=...;
Exemplu
specială 2026, simulare 2025
furnizează prin același parametru
Antet
void f(int &n)
La final
n=...;
Exemplu
model 2026
afișează
Antet
void f(int x,int y)
La final
cout<<...;
Exemplu
august 2025, model 2027
1 / 4

Punctele, pentru fiecare formă

4 min o întrebare la final

Returnează (iunie 2026)
Prin parametru (specială 2026)
Același parametru (model 2026)
Afișează (model 2027)
Antet
2
3
2
2
Valoare determinată
6
6
6
5
Returnare, furnizare sau afișare
1
inclus în antet
1
2
Variabile locale, corectitudine
1
1
1
1

La august 2025, tot o formă cu afișare, repartizarea e alta: 2, 6, 1, 1. Deci numerele pot varia cu un punct, nu și ideea.

La fiecare, antetul se punctează pe aspecte: structură, parametri de intrare, parametru de ieșire. Valoarea determinată se punctează tot pe aspecte, chiar dacă nu ajungi la final.

  1. Copiază numele și parametrii

    Scrie antetul exact cum zice enunțul: numele, ordinea parametrilor, tipurile. Identificatorii trebuie să respecte precizările din enunț.

  2. Găsește verbul

    Returnează, furnizează sau afișează. Îți dă tipul subprogramului și dacă pui &.

  3. Scrie algoritmul pentru un singur caz

    Pentru un număr: cum îi afli proprietatea? Abia apoi pui bucla peste interval, dacă e nevoie.

  4. Verifică pe exemplu și pe margini

    Rulează pe hârtie exemplul din enunț, apoi cazul special: 0, -1, nu exista, numărul cu o singură cifră.

  5. Declară tot

    Toate variabilele locale, la începutul subprogramului. Nu scrie main, nici cin.

Cum arată antetul pentru: baza are parametrii n și b și returnează 1 sau -1?

Oficial: sesiunea specială 2026, varianta 4 (furnizare prin parametru)

4 min 2 întrebări la final

Cifrele lui n, de la stânga la dreapta, sunt modele la o paradă: impare pentru rochii, pare pentru costume. Există cel puțin un costum. Subprogramul moda primește n din [0,10⁹] și furnizează prin pc numărul de ordine al primului costum. Pentru 576798 sau 5700, pc=3.

Cifrele vin de la dreapta, dar poziția se numără de la stânga. Numeri cifrele, reții poziția de la dreapta a ultimei pare întâlnite, apoi transformi.

void moda(int n,int &pc)
{ int nr=0,ult=0;
  do
  { nr++;
    if(n%2==0) ult=nr;
    n=n/10;
  }while(n!=0);
  pc=nr-ult+1;
}
  • do...while tratează și n=0, care are o cifră, pe 0, deci pc=1.
  • n%2 are aceeași valoare cu n%10%2: paritatea numărului e paritatea ultimei cifre.
  • Pentru 5700: de la dreapta 0, 0, 7, 5. ult=2, nr=4, deci pc=3.

Barem: antet 3 p, câte 1 p pentru structură, parametru de intrare, parametru de ieșire; valoare determinată 6 p, câte 1 p pentru parcurgerea tuturor cifrelor, algoritmul de primă sau ultimă apariție, numărarea, identificarea cifrei pentru rochie sau costum, cifrele verificate, inclusiv zerourile de la final, poziția față de stânga; variabile locale și corectitudine globală 1 p.

Cum arată antetul pentru: moda are parametrii n și pc, iar prin pc furnizează rezultatul?

Câte puncte are antetul când rezultatul se furnizează printr-un parametru?

Oficial: simulare 2025 (furnizare, cu căutare)

3 min

Un număr harsad e divizibil cu suma cifrelor lui. Subprogramul harsad primește k din [1,10⁶] și furnizează prin n cel mai mare număr harsad mai mic sau egal cu k. Pentru k=2027, n=2025.

void harsad(int k,int &n)
{ int s,x,gasit=0;
  n=k;
  while(gasit==0)
  { s=0;
    x=n;
    while(x!=0)
    { s=s+x%10;
      x=x/10;
    }
    if(n%s==0) gasit=1;
    else n--;
  }
}

Cobori de la k până găsești primul bun. 1 e harsad, deci bucla se termină sigur. Copia x e necesară: parcurgerea cifrelor nu trebuie să-l strice pe n.

Barem: antet 3 p; valoare determinată 6 p, câte 1 p pentru suma unei serii, accesul la o cifră, cifrele din sumă, identificarea unui număr harsad, determinarea primei sau ultimei valori cu o proprietate, numerele verificate; variabile locale și corectitudine globală 1 p.

Oficial: august 2025, varianta 4 (afișare, cu „nu exista”)

4 min

Un teren de x pe y, din [2,100], se împarte în parcele de arie egală, cu valori naturale, astfel încât numărul de parcele să fie par și strict mai mic decât aria unei parcele. Subprogramul teren afișează fiecare soluție pe câte o linie, ca în exemplu, sau nu exista. Pentru 6 și 8: 2 parcele de arie 24, 4 parcele de arie 12, 6 parcele de arie 8.

void teren(int x,int y)
{ int p,A=x*y,gasit=0;
  for(p=2;p*p<A;p=p+2)
    if(A%p==0)
    { cout<<p<<" parcele de arie ";
      cout<<A/p<<endl;
      gasit=1;
    }
  if(gasit==0)
    cout<<"nu exista";
}

Numărul de parcele p e divizor al ariei totale. Condiția „p mai mic decât aria unei parcele” înseamnă p<A/p, adică p*p<A. Mergi din 2 în 2, pentru că p e par.

Barem: antet 2 p; valori determinate 6 p, câte 1 p pentru aria unei parcele sau divizorul ariei, numărul de parcele corespunzător, număr par, număr mai mic decât aria, identificarea unei perechi, perechile analizate; afișare și cazul nu exista 1 p; variabile locale și corectitudine globală 1 p.

Pentru afișare în C se poate scrie printf("%d parcele de arie %d\n",p,A/p);.

Proiectarea modulară

6 min

Când o problemă are două etape clare, le poți separa: un subprogram face verificarea pentru un singur număr, iar altul parcurge intervalul. Programa cere asta la 7.2.

Oficial: iunie 2025, varianta 1, III.1

Numărul an e ascendent al lui n dacă oricare dintre cifrele lui an e cel puțin egală cu cifra unităților lui n. Subprogramul ascendent are parametrii n, x, y și returnează suma ascendenților lui n din [x,y], sau 0. Pentru 827, 9, 800, returnează 7893.

int bun(int a,int u)
{ while(a!=0)
  { if(a%10<u) return 0;
    a=a/10;
  }
  return 1;
}

int ascendent(int n,int x,int y)
{ int i,s=0;
  for(i=x;i<=y;i++)
    if(bun(i,n%10)==1)
      s=s+i;
  return s;
}

Subprogramul bun e scris înainte, ca să poată fi apelat. Pentru i=0, bun returnează 1, dar adunarea lui 0 nu schimbă suma, deci rezultatul rămâne corect.

Barem: antet 2 p; valoare determinată 6 p, câte 1 p pentru cifra unităților, compararea a două cifre, verificarea unei proprietăți, cifrele verificate, suma unei serii, numerele însumate; returnare 1 p; variabile locale și corectitudine globală 1 p.

În lucrările importate, 2020–2027, nu am găsit nicio cerință de tipul „folosind apeluri ale subprogramului”, deci modularitatea rămâne alegerea ta.

Ce se cere la BAC

3 mincum apare la examen

Model 2027
Subprogram
parcele
Forma
afișează
Tema
divizori comuni
August 2026
Subprogram
baza
Forma
returnează
Tema
cifre
Iunie 2026
Subprogram
ImparPar
Forma
returnează
Tema
cifre
Rezervă 2026
Subprogram
pagini
Forma
returnează
Tema
număr prim
Specială 2026
Subprogram
moda
Forma
prin parametru
Tema
cifre, poziție
Simulare 2026
Subprogram
depozit
Forma
returnează
Tema
cel mai mic multiplu comun
Model 2026
Subprogram
Plus
Forma
același parametru
Tema
cifre
August 2025
Subprogram
teren
Forma
afișează
Tema
divizori
Iunie 2025
Subprogram
ascendent
Forma
returnează
Tema
cifre, sumă
Rezervă 2025
Subprogram
consecutiv
Forma
prin parametru
Tema
căutare
Specială 2025
Subprogram
diviz
Forma
returnează
Tema
divizori, maxim
Simulare 2025
Subprogram
harsad
Forma
prin parametru
Tema
cifre, divizibilitate
1 / 12

Temele sunt aproape mereu cifre și divizibilitate. Lecțiile din modulul despre algoritmi elementari pe numere sunt pregătirea directă pentru III.1.

Greșeli care costă puncte

2 mincapcanele de evitat

  • Program complet în loc de subprogram: citire din cin, main.
  • Antet schimbat: alt nume, altă ordine a parametrilor, & lipsă.
  • cout în loc de return sau invers.
  • Formatul de afișare diferit de exemplu: textul trebuie scris exact.
  • Cazul din enunț uitat: nu exista, 0, -1.
  • n stricat de o buclă pe cifre, apoi folosit din nou.
  • return în buclă înainte de vreme: un else return la prima cifră verifică doar o cifră.

Termeni-cheie

Definiția completă
Antetul și corpul subprogramului. Enunțul nu cere programul principal, nici citirea datelor.
Parametru de intrare
Prin el primești date. Se scrie prin valoare.
Parametru de ieșire
Prin el furnizezi rezultatul. Se scrie prin referință, cu &.
Parametru de intrare-ieșire
Același parametru, prin referință: aduce valoarea și ia rezultatul.
Proiectare modulară
Împărțirea rezolvării în subprograme mici, fiecare cu o singură sarcină.

Notițele mele

Salvat local

Surse