Informatică, întrebare adresată de ducky13, 9 ani în urmă

Hey all, imi poate explica si mie cineva de ce atunci cand intr-un enunt ne este precizat ca o functie returneaza prin intermediul aceluiasi parametru o valoare trebuie sa scriem antetul functiei de tipul void in loc de int?

Ex: functia elim_impar primeste prin intermediul parametrului x un numar natural si furnizeaza prin intermediul aceluiasi parametru x nr. obtinut prin eliminarea tuturor cifrelor impare din x. In cazul acesta avem variantele:

A. int elimin_impar (int &x)

B. void elimin_impar(int x)

C. void elimin_impar (int &x)

D. int elimin_impar(int x)

dintre toate acestea raspunsul corect este C insa nu inteleg de ce.

Multumesc anticipat.

Răspunsuri la întrebare

Răspuns de andriesboss92
1

Forma generala:

void nume_functie(tip_variabila var_1, ... , tip_variabila &var_n)

{

    instructiune 1;

    ...

    instructiune n;

}

Unde:

void - reprezinta tipul functiei

nume_functie - reprezinta identificatorul cu ajutorul caruia functia va fi apelata pe parcursul programului

Lista de parametri formali :  

  • tip_variabila - reprezinta tipul variabilelor/parametrilor formali

  • var_1 - reprezinta parametrul formal al functiei

  • &var_n - reprezinta parametrul formal cu referință al functiei

Intre acolade se trece corpul functiei - setul de instructiuni ce va prelucra parametrii formali in scopul returnarii unui rezultat.

ATENTIE!

Daca se cere: "Sa se scrie o functie care intoarce rezultatul printr-un parametru" se va folosi un astfel de antet:

EX:  void nume_functie( int ¶metru )

Daca se cere: "Sa se scrie o functie care returneaza ceva a numarul primit prin parametrul x", unde "ceva" semnifica o actiune asupra numarului, cum ar fi numarul de cifre SAU cate cifre impare are etc.    ....se va folosi un astfel de antet:

EX:

int nume_functie(int x)

{

bloc_instructiuni;

...

return variabila; // ( sau 1 sau 0 );

}

În cazul tău, cerința îți cere să furnizezi prin intermediul aceluiași parametrul valoarea obținută. Prin urmare, pentru ca in momentul in care apelezi in main functia elimin_impar(n) , variabil n va primi numarul obtinut in subprogram datorita referintei. Deci... daca punem referinta la un parametru in suprogram, atunci valoarea parametrului respectiv va fi aceeasi pentru variabila declarata in main.

Sa luam exemplul urmator:

void marire(int &x)

{

x=x+1;

}

int main()

{

int n;

cin>>n;

marire(n);

cout<<n;

}

Daca citim pentru n valoare 19, la afisare se va afisa 20.

Explicatie: Odata ce am citit valoarea lui n, prin apelul functiei marire(n), lui x i se va atribui valoarea lui n. Teoretic, x-ul va deveni n-ul din main. Ceea ce i se intampla lui x in subprogram i se va intampla si lui n in main.

In general, intr-un subprogram de tip void ai voie fie sa afisezi in interiorul lui, fie sa intorci prin referinta, fie sa afisezi si sa intorci prin referinta; pe cand in cele de tip int ai voie doar sa returnezi o valoare si cam atat..

( return variabila SAU return 1/0 )

Sper ca ai inteles.. Daca nu, astept un reply :)


ducky13: dar atunci de ce ar fi gresit sa scriu : int marire(int&x) { x=x+1; return x;} adica practic si in acest caz n-ul din main isi modifica valoarea in tot programul si este returnat tot prin acesta
andriesboss92: Din ce am invatat eu la scoala... subprogramele de tip int cu parametrul referinta nu merg pe toate compilerele, ceea ce inseamna ca nu sunt corecte din punct de vedere global. Plus ca in cerinta spune "furnizeaza prin intermediul aceluiasi parametru x" si NU spune "returneaza prin intermediul [...] ". Adica iti specifica din start faptul ca tu trebuie sa folosesti void cu referinta. E ca si cum tu ai merge la munca, muncesti, si tot tu faci banii.
andriesboss92: Gandeste-te la functiile de tip int asa: Tu esti seful unei firme. Ai angajati care muncesc pentru tine si fac bani. Adica angajatii returneaza banii pentru tine
EX: int functie ( int angajat )
{
int bani=100; angajat=bani; return angajat;
}

Daca ai folosi subprogram de tip int atunci te-ai contrazice cu cerinta.
andriesboss92: Inca o chestiune.. Subprogramele de tip int doar returneaza. Ele nu modifica din subprogram in main. Plus ca in main, cand faci apelul unui subprogram de tip int, fie il atribui unei valori, fie il apelezi in cout.

Cel mai simplu, dau exemplu:
int x(int &p)
{
p++;
}

int main()
{
int v=10;
v=x(v);
cout<}

Daca faci asa ca mai sus, fara a mai da return la valoarea p in subprogram, o sa iti afiseze valori reziduale.
andriesboss92: Pe cand daca folosesti void, nu ai nevoie de o astfel de sintaxa ca mai sus, ci o sa arate astfel:

void x(int &p)
{
p++;
}

int main()
{
int v=10;
x(v);
cout<}
andriesboss92: Trebuia: cout << v; la ambele exemple.. nu stiu de ce s-au sters
andriesboss92: La ultimul exemplu, cel cu subprogram de tip void, o sa iti afiseze valoarea 11
ducky13: am inteles, mulltumesc mult
andriesboss92: Cu placere
Alte întrebări interesante