Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Utilizarea combinata a parametrilor de tip valoare, pointer si referinta in descrierea si apelarea functiilor

c



+ Font mai mare | - Font mai mic



Utilizarea combinata a parametrilor de tip valoare, pointer si referinta in descrierea si apelarea functiilor

a1) Definirea unei functii cu parametri combinti

Mai inainte, au fost prezentate trei modalitati distincte de transmitere a parametrilor unei functii apelate. In practica o functie poate fi definita cu toate cele trei tipuri de transmitere a parametrilor: prin valoare, prin pointeri (adrese) si prin referinte:



tip_functie nume_functie(tipargfv1 argfv1. [,tipargfvn argfvn],

tipargfp1 *argfp1. [,tipargfpn *argfpm],

tipargfr1& argfr1. [,tipargfrk& argfrk])

unde:

argfv1, ., argfvn sunt parametri formali de tip valoare;

tipargfv1 ., tipargfvn sunt tipurile parametrilor formali de tip valoare;

argfp1, ., argfpm sunt parametri formali de tip pointer, adresa;

tipargfp1 ., tipargfpm sunt tipurile parametrilor formali de tip pointer;

argfr1, ., argfrm sunt parametri formali de tip referinta;

tipargfr1 ., tipargfrk sunt tipurile parametrilor formali de tip referinta.

a2) Apelarea unei functii cu parametri combinti

Apelarea generala a unei asemenea functii se face astfel:

- apelarea independenta:

nume_functie(argev1 . [,argevn],

&argep1 . [,&argepm] ,

arger1 . [,&argerm]);

- apelarea dependenta, ca o functie intr-o expresie:

- e= . nume_functie(argev1 . [,argevn],

&argep1 . [,&argepm] ,

arger1 . [,&argerm]).;

unde:

argev1 . [,argevn] sunt parameri efectivi de tip valoare;

&argep1 . [,&argepm] adresele parameri efectivi de tip pointer;

arger1 . [,&argerm]) sunt parametri efectivi de tip referinta.

- e este identificatorul unei variabile rezultat, care va primi o valoare corespunzatoare, dupa evaluarea expresiei in care este apelata functia anterior definita

Observatie: In cazul apelarii dependente a unei functii, in cadrul unei expresii, valoarea returnata de functie trebuie sa fie diferita de void si compatibila cu constructia expresiei.

Problema 1

Se considera doua numere naturale n si k (n>=k) date. Sa se determine: ceficientul binomial c(n,k), c.m.m.d.c(n,p) si daca n si p sunt prime intre ele, intr-o singura functie definita, oricare ar fi n si k naturali dati (n>=k>0). Se va utiliza, pentru determinarea c(n,p) un parametru de tip pointer, pentru c.m.m.d.c. un parametru de tip referinta iar functia va returna o valoare diferita de zero daca n si k sunt prime intre ele.

#include<iostream.h>

#define nmax 32000

double fact(int m) // m parameru de tip valoare

int f(int m,int p,double *cmp,unsigned long int& cmmdc)

cmmdc=p;

}

if((!a)&&(b)) cmmdc=b;

if((a)&&(!b)) cmmdc=a;

if(b) return(a%b);

else return(0);

}

void main(void)

while((n<1)||(n>nmax)||(n<k));

// apelarea functiei cu n si k parametri de tip valoare,

// cnk de tip pointer si cmmdc de tip referinta

if(f(n,k,&cnk,cmmdc))

cout<<'n numerele '<<n<<' si '<<k<<' sunt prime intre ele';

else

cout<<'n nr '<<n<<' si '<<k<<' nu sunt prime intre ele sau unul e 0';

cout<<'n c('<<n<<','<<k<<')='<<cnk;

cout<<'n cmmdc('<<n<<','<<k<<')='<<cmmdc;

cout<<'n continuati?(d/n):';

cin>>r;}}

Problema 2

Se considera o grupa de studenti cu structura: cod student, un camp numeric intre 1 si 99, numele si prenumele, doua campuri alfanumerice de maximum 10 caractere, numarul de note, un intreg intre 1 si 15 si un sir de note. Utilizandu-se o functie definita, careia i se transmite un parametru cu structura de mai sus, de tip pointer (adresa), si care returneaza o structura cu media studentului: cod student, nume si prenume si media, sa se afiseze, printr-o alta functie definita, media oricarui student, careia i se transmite ca parametru de tip referinta, structura cu media studentului, anterior calculata.

#include<iostream.h>

#include<iomanip.h>

#include<string.h>

struct tip_note

;

struct tip_medie

;

void calcul_medie(tip_note artnota,tip_medie *artmedia)

artmedia->media=artmedia->media/artnota.nrn;

}

void afisaza_medie(tip_medie& artmedia)

void main(void)

while((anote.cm<1)||(anote.cm>99));

cout<<'n numele (max 10 car):';

cin>>anote.n;

cout<<'n prenumele (max 10 car):';

cin>>anote.p;

do

while((anote.nrn<1)||(anote.nrn>15));

for(k=0;k<anote.nrn;k++)

while((anote.nota[k]<1)||(anote.nota[k]>10));

}

//apelarea functiei de calcul medie cu transmiterea param prin adresa

calcul_medie(anote,&amedie);

//atribuirea parametrului de transmis la o varibila referinta

tip_medie& wmedie=amedie;

//apelarea functie de afisare medie cu transmiterea param prin referinta

afisaza_medie(wmedie); //era corect si apelul:afisaza_medie(amedie);

cout<<'n continuati?(d/n):';

cin>>r;

Variabile referinta independente

Tipul referinta, in C++, poate fi aplicat si asupra unor variabile independente, care nu au legatura cu apelarea vreunei functii:

tip_variabile_referite var1[,var2] . [,varn];

tip_variabila_referinta& refvar1=var1;

tip_variabila_referinta& refvar2=var2;

tip_variabila_referinta& refvarn=varn;

unde:

- tip_variabile_referite reprezinta tipul unor variabile oarecare (tipuri standard: int, char, float, double sau derivatele acestora; tipuri compuse (tablouri, structuri, etc.) sau definite de programator;

- var1[,var2] . [,varn] sunt identificatorii unor variabile independente, de tipul precizat prin tip_variabile_referite;

- tip_variabila_referinta& reprezinta tipul unei variabile referinta care refera o alta variabila independenta (tip standard: int, char, float, double sau derivatele acestora; tip compus: tablou, structura, etc.) sau definit de programator;

- refvar1[,refvar2] . [,refvarn] sunt identificatorii unor variabile de tip referinta, de tipul precizat prin tip_variabila_referinta, care refera variabilele independente: var1[,var2] . [,varn];

- tipul variabilelor referinta trebuie sa fie identic cu tipul variabilelor referite;

- tipul referinta poate fi asociat si tipului returnat de o functie.

Observatii:

nu se admite folosirea unei variabile referinta care sa refere o alta variabila referinta;

nu se admite crearea unui tablou de referinte, asa cum se poate creea un tablou de pointeri;

nu se admite folosirea unui pointer catre o variabila de tip referinta;

nu se pot folosi referinte catre structuri cu campuri de biti.

Folosirea variabilelor referinta independente este ilustrata in problema de mai jos:

Problema 3

Sa se citesca de la tastatura oricare doua numere intregi fara semn si sa se afiseze pe stdout valorile acestora prin intermediul unor variabile independente de tip referinta, apoi sa se modifice valorile variabilelor referite cat si ale variabilelor referinta si, de asemenea, sa se afiseze si sa se traga concluziile asupra rezultatelor obtinute.

#include<iostream.h>

void main()

}

Concluzie:

Analizand rezultatele executiei programului de mai sus rezulta ca modificarea valorilor variabilelor referite atrage, in mod automat, si modificarea variabilelor referinta asociate, si invers, modificarea valorilor variabilelor referinta atrage, in mod automat, si modificarea variabilelor referite asociate.

Utilizarea tipului referinta, asociat unei functii, poate fi aplicata pentru verificarea depasirii limitelor unui tablou, in citire sau scriere, ca in programul de mai jos:

Problema 4

Se se citeasca componentelor reale, strict pozitive, ale unui vector de la stdout cu functia citire_vector, de tip referinta, sa se afiseze aleator componentelor tabloului, testandu-se existenta numarului componentei in tablou, cu functia de tip referinta, verificare_vector, si sa se calculeze si sa se afiseze media numerelor , cu o functie referinta, calcul_medie, verificandu-se permanent depasirea dimensiunilor vectorului.

#include<iostream.h>

#include<stdlib.h>

#define nmax 10

//const nmax=10;

double vector[nmax];

int n,i;

double& citeste_vector(int m)

while(wx<0);

return(wx);

}

else

}

int& verificare_vector(int m)

double& calcul_medie()

void main(void)

while((n<1)||(n>nmax));

for(k=0;k<nmax;k++) // ptr n>=nmax se semnaleaza depasire

else

cout<<'n nr de numere de afisat aleator (max 6):';

cin>>nrn;

cout<<'n numerele citite aleator:';

i=0;

while(i<=nrn)

else

cout<<'n componeta a '<<ka<<'-a nu este in tablou'<<flush;

i++;

}

}

// apelarea functiei ptr ca;culul mediei celor n numere

wmedia=calcul_medie();

cout<<'n media celor '<<n<<' nr.='<<wmedia;

}

Utilizarea parametrilor formali impliciti in descrierea functiilor

Limbajul C++, spre deosebire de limbajul C, ofera posibilitatea initializarii parametrilor formali, in linia de definire a functiei, cu scopul, fie de a utiliza in corpul functiei aceste valori, fie de a testa daca functia apelanta a transmis sau nu valori efective pentru anumiti parametri formali.

tip_functie nume_functie(tipargf1 [*/&]argf1=valf1 . [,[*/&]tipargfn argfn=valfn])

unde:

- tip_functie, nume_functie, tipargf1 . tipargfn, argf1 . argfn au semnificatiile prezentate anterior;

-valf1, . , valfn sunt expresii cu valori constante care reprezinta, de fapt, valorile initiale care vor fi atribuite parametrilor formali omologi si care vor putea fi folosite in functie.

Observatii:

- parametri formali pot fi de orice tip: valoare, pointer sau referinta;

- initializarea parametrilor formali este utila, in cazul cand acestia sunt utilizati ca optiuni implicite in executarea functiei, care nu a primit valori efective explicite de la functia apelanta pentru acesti parametri. Nespecificarea tuturor parametrilor este permis in C++.

Problema 5

Se citeste din stdin un sir de numere reale. Sa se afiseze, prin optiune: sirul in ordinea introducerii, in ordine crescatoare, in ordine descrescatoare si media elementelor sirului, utilizandu-se o functie cu o optiune implicita.

#include<iostream.h>

#define nmax 10

double prelucreaza_sir(double sirdat[nmax],double sirmod[nmax],int m,int opt=0)

if((opt==1)||(opt==2)) //ordonarea sirului

if((opt==2)&&((sirmod[i]<sirmod[i+1])))

}

}

return m;

}

if(opt==3) //calculul mediei elementelor sirului

}

void main(void)

while((n<1)||(n>nmax));

// citirea componentelor sirului

for(i=0;i<n;i++)

cout<<'n 0 = afisarea sirului in ordinea inversa introducerii:';

cout<<'n 1 = afisarea sirului in ordine crescatoare:';

cout<<'n 2 = afisarea sirului in ordine descrescatoare:';

cout<<'n 3 = afisarea mediei componentelor sirusirului:';

cout<<'n 4 = terminarea afisarii rezultatelor:';

do

while(!((optiune==0)||(optiune==1)||(optiune==2)

||(optiune==3)||(optiune==4)));

while(((optiune==0)||(optiune==1)||(optiune==2)||(optiune==3)))

if(optiune==1)

if(optiune==2)

if(optiune==3)

if(optiune==4) break; //intreruperea afisarii

cout<<'n 0 = afisarea sirului in ordinea inversa introducerii:';

cout<<'n 1 = afisarea sirului in ordine crescatoare:';

cout<<'n 2 = afisarea sirului in ordine descrescatoare:';

cout<<'n 3 = afisarea mediei componentelor sirusirului:';

cout<<'n 4 = terminarea afisarii rezultatelor:';

do

while(!((optiune==0)||(optiune==1)||(optiune==2)

||(optiune==3)||(optiune==4)));

cout<<'n continuati executia programului?(d/n):';

cin>>r;

}

}



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 875
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved