# data[].attributes.body
Când vrem să gătim o plăcintă, de obicei, urmăm o rețetă (în caz contrar, adesea, am pregăti pâine din cărbuni).

# data[].attributes.body
Rețeta noastră ne spune care sunt ingredientele, cantitățile acestora și pașii de urmat ca să facem și noi o plăcintă pufoasă și delicioasa așa cum le face bunica la țară.

# data[].attributes.body
La noi, rețeta este vechi-cunoscutul algoritm în care lucrăm cu date de intrare si ieșire.

# data[].attributes.body
Ar fi câteva. Să zicem că vrem să scriem un program care ne calculeaza cate calorii are una din trei tipuri diferite de prajituri.

Treaba-i simplă dacă ni se dau de la tastatură ingredientele, cantitățile și caloriile/100gr(ml) pentru fiecare.

Hai să vedem și cum ar arăta o implementare

# data[].attributes.body
Ei bine, se vede repede că o bucată anume de cod face același lucru, dar pentru prăjituri diferite. Doar ele variază.

Cum ar fi să luăm bucata respectivă de-o parte și s-o apelăm pentru fiecare prăjitură în parte?

# data[].attributes.body
Cam acesta ar fi rezultatul. Spre fericirea noastră, codul nostru se poate citi fără să mai fie nevoie de o lupă (la fel de mare, cel puțin)! :)

Am extras din programul principal bucățile de citire și calcul al caloriilor, deoarece se repetă.

Acum ne bucurăm de simplitate, ordine și coerență crescută deoarece, după cum observați, funcțiile noastre sunt denumite convenabil astfel încât știm care e rolul lor.

# data[].attributes.headline
Ajutor, sunt confuz(ă)... de ce i-ai zis funcție??? E ca la mate cumva?!

# data[].attributes.subject
Ajutor, sunt confuz(ă)... de ce i-ai zis funcție??? E ca la mate cumva?!

# data[].attributes.body
Din multe aspecte, întocmai! Exact cum obișnuiam să avem funcții definite pe un domeniu cu valori într-un codomeniu, aici avem:

Un domeniu din mai multe tipuri de date - echivalentul mulțimilor de numere. În subprogramele noastre avem 6 int-uri, dar în general pot fi orice tip de date.

Un codomeniu format dintr-un singur tip de date. Poate fi int, double, char etc sau void

# data[].attributes.headline
Ce drăguț... dar ia-mă ușor. Ce fel de subprograme avem? 

# data[].attributes.subject
Ce drăguț... dar ia-mă ușor. Ce fel de subprograme avem? 

# data[].attributes.body
Avem două tipuri:

Care returnează ceva

Care nu returnează nimic

Vom vorbi imediat despre amândouă, dar înainte de asta...

# data[].attributes.body
Avem doua metode.

1. Înaintea mail-ului

2. Dupa main

# data[].attributes.body
Uneori, vrem să apelăm subprograme din alte subprograme. În acest caz, în prima variantă, orice subprogram apelat într-altul trebuie să fie deja declarat și definit.

În caz contrar, programul nu va compila, deoarece codul este prelucrat de sus în jos. Pentru el e ca și cum ar încerca să pună într-o ramă o fotografie pe care încă nu i-a adus-o fotograful.

Nevoia strictă de a folosi metoda 2 vine, de exemplu, odată cu implementarea claselor sau a subprogramelor indirect recursive. O să vedeți anii următori cu ce se mănâncă și acestea, deci până atunci puteți respira ușurați cu liberatea voastră :)

# data[].attributes.body
Pentru a returna efectiv ceva, în locul lui <tip_dată> avem voie să punem orice vrem în afara de void.

# data[].attributes.body
Mai avem însă o mâncare de pește care nu returnează nimic. Ea are în locul lui <tip_dată> de mai devreme numai keyword-ul void.

De ce ne-ar interesa așa ceva? Pentru că am vrea să rulăm bucăți de cod care ne afectează, de data asta, parametri noștri!

Până acum am lucrat doar într-o bulă în care tot ce intra în subprogram se reîntorcea intact, ca și trecut prin vis, dar în exemplul nostru rămânem cu elementele citite în vector. Uraa

# data[].attributes.body
Deocamdată, trebuie să știți că:

* se folosește la vectori

& denotă că modificările variabilei de-a lungul subprogramului rămân și după apelarea acestuia