Subprogramele (funcțiile) sunt „rețetele" programării: le scrii o singură dată, le apelezi de câte ori vrei, cu ingrediente diferite. De aici începe programarea modulară — și jumătate din subiectul III de BAC.
O colecție de instrucțiuni care îndeplinesc o sarcină, grupate sub un nume. Ca o rețetă de prăjitură: o scrii o dată, o folosești mereu — cu ingrediente diferite.
Numele funcției + lista de parametri. Cartea de vizită.
„Ingredientele" pe care le primește la fiecare apel.
Instrucțiunile care se execută efectiv.
Rezultatul trimis înapoi. Opțional — poate lipsi (void).
Procedural (void) = execută o acțiune (afișează), fără să întoarcă nimic. Operand (return) = calculează și returnează o valoare pe care o poți folosi mai departe.
Formali = numele din definiția funcției. Efectivi = valorile trimise la apel. La apel, efectivii se copiază în formali, în ordinea pozițiilor.
Același apel dubleaza(n) — două efecte total diferite. Privește memoria în paralel.
🐍 Python — la fel, tot pe copie:
🐍 Python — NU are & pentru numere; primești prin return:
Consecința pentru funcții — aceeași regulă, două rezultate diferite:
✔ SCALAR (imutabil) — originalul e în siguranță
⚠ LISTĂ (mutabilă) — originalul SE modifică
Locală = trăiește doar cât rulează funcția. Globală = vizibilă peste tot. Cine „vede" ce?
⚙ C++
🐍 Python — aceeași regulă:
↑ ascunde x-ul global cât timp funcția rulează
Până acum ai învățat cum se scrie un subprogram. Acum înveți când și ce să faci subprogram: să iei o problemă mare și s-o tai în bucăți cu o singură treabă fiecare.
Scrisă „la grămadă", într-un singur main, iese o funcție lungă cu bucle imbricate greu de urmărit. Întrebarea corectă: ce sarcini mici se repetă sau se pot testa separat?
Primește: un număr
Întoarce: adevărat/fals
Treaba lui: doar să decidă dacă e prim — nimic altceva.
Primește: un număr
Întoarce: suma cifrelor
Treaba lui: doar atât — îl reutilizezi oriunde.
Treaba lui: citește datele, apelează funcțiile și afișează. Nu calculează el nimic complicat — coordonează.
Modele pe care le vei rescrie de zeci de ori. Observă: fiecare problemă = o funcție cu treabă clară.
Un număr e perfect dacă suma divizorilor săi proprii îl dă chiar pe el: 6 = 1+2+3, 28 = 1+2+4+7+14.
Test: 6 → DA · 28 → DA · 12 → NU · 496 → DA. Folosește trucul perechilor de divizori (√n) din Modulul 03.
Cel mai elegant tipar: o funcție care apelează altă funcție. Scrii oglindit o dată și palindromul devine o singură linie.
Test: 121 → palindrom · 573 → 375 · 1221 → palindrom. Ideea de aur: funcțiile mici se combină în funcții mari.
Funcție void cu trei parametri (lățime, înălțime, caracter): desenează doar conturul, interiorul rămâne gol.
void = doar afișează, nu întoarce nimic. Schimbi parametrii → alt desen, fără să rescrii codul.
Cu return poți întoarce o singură valoare. Dar împărțirea dă două: câtul și restul. Soluția în C++: parametri prin referință.
Fără &, funcția ar modifica doar copiile și în main c și r ar rămâne nedefinite. Ăsta e exact subiectul categoriei „subprograme care întorc valori prin parametri".
Un subprogram care merge pe exemplul din enunț poate fi tot greșit. Înainte să-l declari gata, testează-l pe cazurile limită: zero, valori negative, listă goală, un singur element.
Fiecare cod de mai jos pare corect și chiar funcționează pe exemplele obișnuite. Citește-l, răspunde la întrebarea de sub el și discutați în clasă — abia apoi se deschide explicația.
Întrebare: ce se întâmplă dacă x este exact 0?
Întrebare: ce se întâmplă dacă lista v este goală?
Întrebare: ce afișează — 10 sau 5? Și de ce?
Întrebare: de ce nu se afișează niciodată mesajul de la linia 3?
10 întrebări, exact conceptele de mai sus. Țintește 10/10.
Programarea modulară pe scurt.