int f(int n)return r;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.

ții minte doar fișa asta și ești acoperit
Returnează: int f(...) și return. Antet 2 p, valoare 6 p, return 1 p, restul 1 p.
Furnizează prin parametrul p: void f(..., int &p). Antet 3 p, valoare 6 p, restul 1 p.
Afișează: void f(...) și cout. Antet 2 p, iar afișarea are punctaj separat.
Numele și parametrii din enunț se scriu exact, în ordinea dată.
Truc: Identificatorii din bold se copiază.
Fără citire, fără main: se cere doar definiția subprogramului.
Cazul special din enunț (0, -1, nu exista) are adesea punctaj propriu.
În lucrările MI din 2025–2027, III.1 are una dintre aceste forme:
int f(int n)return r;pvoid f(int n,int &p)p=...;void f(int &n)n=...;void f(int x,int y)cout<<...;| Enunțul spune | Antet | La final | Exemplu |
|---|---|---|---|
| returnează | int f(int n) | return r; | iunie 2026, august 2026 |
furnizează prin parametrul p | void f(int n,int &p) | p=...; | specială 2026, simulare 2025 |
| furnizează prin același parametru | void f(int &n) | n=...; | model 2026 |
| afișează | void f(int x,int y) | cout<<...; | august 2025, model 2027 |
| Aspect | 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.
Scrie antetul exact cum zice enunțul: numele, ordinea parametrilor, tipurile. Identificatorii trebuie să respecte precizările din enunț.
Returnează, furnizează sau afișează. Îți dă tipul subprogramului și dacă pui &.
Pentru un număr: cum îi afli proprietatea? Abia apoi pui bucla peste interval, dacă e nevoie.
Rulează pe hârtie exemplul din enunț, apoi cazul special: 0, -1, nu exista, numărul cu o singură cifră.
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?
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.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?
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.
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);.
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.
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.
parcelebazaImparParpaginimodadepozitPlusterenascendentconsecutivdivizharsad| Lucrare | Subprogram | Forma | Tema |
|---|---|---|---|
| Model 2027 | parcele | afișează | divizori comuni |
| August 2026 | baza | returnează | cifre |
| Iunie 2026 | ImparPar | returnează | cifre |
| Rezervă 2026 | pagini | returnează | număr prim |
| Specială 2026 | moda | prin parametru | cifre, poziție |
| Simulare 2026 | depozit | returnează | cel mai mic multiplu comun |
| Model 2026 | Plus | același parametru | cifre |
| August 2025 | teren | afișează | divizori |
| Iunie 2025 | ascendent | returnează | cifre, sumă |
| Rezervă 2025 | consecutiv | prin parametru | căutare |
| Specială 2025 | diviz | returnează | divizori, maxim |
| Simulare 2025 | harsad | prin parametru | cifre, divizibilitate |
Temele sunt aproape mereu cifre și divizibilitate. Lecțiile din modulul despre algoritmi elementari pe numere sunt pregătirea directă pentru III.1.
cin, main.& lipsă.cout în loc de return sau invers.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ă.