Jump to content
Sign in to follow this  
ldd.man25

Intrebari subfunctii din transmiterea parametrilor

Recommended Posts

Ne-a predat asta subfunctiile, am facut niste chestii micute pana acum.

Acum ne-a predat "Transmiterea parametrilor" si din moment ce vorbeste cu noi doar in termeni stiintifici si nu explica nimic pe romaneste, va dati seama singuri de ce am deschis topicul asta :))

a scris un programel in care la subfunctie a folosit void si nu pot sa-mi dau seama care e diferenta daca ar fi folosit void sau int de exemplu.

Aici e programul.

#include<iostream>
using namespace std;
void f(int a, int b);
int main()
{int x=2,y=4;
cout<<"x ="<<x<<" ; "<<"y= "<<y;
f(2+x, y+3);

cout<<"x= "<<x<<" ; "<<"y= "<<y;

return 0;}
void f(int a, int b)
{
    a++;
    b=b+4;
    cout<<"a= "<<a<<" ; "<<"b= "<<b;
}

cred ca a vrut sa ne demonstreze ca variabilele asta x si y din programul de mai sus, nu isi pastreaza valoarea din subprogram o data cu terminarea subprogramului si reiau valorile din int main. Am dreptate?

si se foloseste void asta cand nu returnezi nimic?

poti sa returnezi intr-un subprogram mai multe variabile? 

pentru un program simplu de calculat suma elemntelor unui vector de exemplu, e mai eficient sa fie creat cu o subfunctie care calculeaza suma, sau e mai eficient dc se scrie totul in main? sau e la fel de eficient? 

thx for reading.

Share this post


Link to post
Share on other sites

cred ca a vrut sa ne demonstreze ca variabilele asta x si y din programul de mai sus, nu isi pastreaza valoarea din subprogram o data cu terminarea subprogramului si reiau valorile din int main. Am dreptate?

Exact. Sunt transmise defapt niste copii (nu se aplica si daca trimiti ca parametru un vector). Ai sa inveti si transmiterea prin referinta :).

si se foloseste void asta cand nu returnezi nimic?

Da. (daca ai o functie void F(int x) de exemplu, nu o poti folosi drept valoare, gen cout<<F(3) sau if(F(3) == 23). Daca aveai in schimb int F(int x), te puteai folosi de valoarea returnata (gen, daca returna 3 la x=4, cout<<F(4) afisa 3, if (F(4) == 3) era adevarata, etc)

poti sa returnezi intr-un subprogram mai multe variabile? 

Prin return nu. Insa poti stoca intr-un vector valorile de care ai nevoie.

pentru un program simplu de calculat suma elemntelor unui vector de exemplu, e mai eficient sa fie creat cu o subfunctie care calculeaza suma, sau e mai eficient dc se scrie totul in main? sau e la fel de eficient? 

E la fel de eficient, dar te ajuta sa nu faci o varza in main care sa fie greu de inteles, impartind problema in sub-probleme.

Share this post


Link to post
Share on other sites

ms mult courage

deci daca folosesc o matrice X in main, si o modific intr-o subfunctie, matricea isi va pastra valoarea dupa ce a fost modificata?  

sa-mi bag banii, daca stiam asta nu ma apucam sa scriu programul asta:

#include<iostream>
using namespace std;
int m,n,g, contor,contor2;
void citire(float v[10][10]);
void afisare(float v[10][10]);
void suma(float v[10][10],float x);
void diferenta(float v[10][10], float x);
void produs(float v[10][10], float x);
void cat(float v[10][10], float x);
void suma2(float v[10][10],float p[10][10]);
void diferenta2(float v[10][10],float p[10][10]);
void produs2(float v[10][10],float p[10][10]);
int main()
{float x[10][10],y[10][10],z[10][10],k;
    cout<<"Introduceti numarul de linii: ";cin>>m;
    cout<<"Introduceti numarul de coloane: ";cin>>n;
    cout<<"Introduceti numarul de coloane pentru matricea produs: ";cin>>g;
    cout<<"Introduceti prima matrice: ";
    citire(x);
    cout<<"Introduceti a doua matrice: ";
    citire(y);
    cout<<"Introduceti a III-a matrice (cea care se va inmulti cu prima matrice): ";
    citire(z);
    cout<<"Introduceti scalarul cu care se vor aduna, scadea, inmulti, imparti matricile: ";
    cin>>k;
    cout<<" k + prima matrice = \n";suma(x,k);
    cout<<" k + a doua matrice = \n";suma(y,k);
    cout<<" k - prima matrice= \n";diferenta(x,k);
    cout<<" k - a doua matrice= \n";diferenta(y,k);
    cout<<" k X  prima matrice= \n";produs(x,k);
    cout<<" k X a doua matrice= \n";produs(y,k);
    cout<<" prima matrice / k = \n";cat(x,k);
    cout<<"a doua matrice / k = \n";cat(x,k);
    cout<<"prima matrice + a doua matrice= \n";suma2(x,y);
    cout<<"prima matrice  - a doua matrice= \n";diferenta2(x,y);
    cout<<"prima matrice X a doua matrice= \n";produs2(x,y);
return 0;}
void citire(float v[10][10])
{
    int i,j;
     contor++;
    if (contor!=3)
         {
            for(i=1;i<=m;i++)
              for(j=1;j<=n;j++)
               /*cout<<"v [ "<<i<<" ] [ "<<j<<" ] = ";*/cin>>v[i][j];
         }
     else  for(i=1;i<=n;i++)
             for(j=1;j<=g;j++)
                cin>>v[i][j];

}
void afisare(float v[10][10])
{
    int i,j;
    for(i=1;i<=m;i++)
    {
         for(j=1;j<=n;j++)
          cout<<v[i][j]<<" ";
           cout<<"\n";
       }
}
void suma(float v[10][10],float x)
{
    int i,j;
    for(i=1;i<=m;i++)
    for(j=1;j<=n;j++)
    v[i][j]+=x;
    afisare(v);
}
void diferenta(float v[10][10], float x)
{
    int i,j;
    for(i=1;i<=m;i++)
    for(j=1;j<=n;j++)
    v[i][j]-=x;
    afisare(v);
}
void produs(float v[10][10], float x)

{ contor2++;
    int i,j;
    for(i=1;i<=m;i++)
    for(j=1;j<=n;j++)
    v[i][j]*=x;
    if(contor2!=3)afisare(v);
}
void cat(float v[10][10], float x)
{
    int i,j;
    for(i=1;i<=m;i++)
    for(j=1;j<=n;j++)
    v[i][j]/=x;
    afisare(v);
}
void suma2(float v[10][10],float p[10][10])
{
      int i,j;
      float c[10][10];
    for(i=1;i<=m;i++)
    for(j=1;j<=n;j++)
    c[i][j]=v[i][j]+p[i][j];
    afisare(c);
}
void diferenta2(float v[10][10],float p[10][10])
{  produs(v,(-1));
    int i,j;
      float c[10][10];
    for(i=1;i<=m;i++)
    for(j=1;j<=n;j++)
    c[i][j]=v[i][j]+p[i][j];
    afisare(c);
}
void produs2(float v[10][10],float p[10][10])
{
    int i,j,k;
      float c[10][10];
       for(i=1;i<=m;i++)
          for(j=1;j<=g;j++)
    {
        c[i][j]=0;
        for(k=1;k<=n;k++)
        c[i][j]+=v[i][k]*p[k][j];
     }
    afisare(c);
}

eu eram cu gandul ca matricea nu isi pastreaza valoarea daca o modific in subfunctie, ca orice alta variabila.

Ba si cand dadeam cout imi venea sa pic de pe scaun :)))))

 

Share this post


Link to post
Share on other sites

Da, matricea isi pastreaza valoarea modificata.

 

Daca vrei o explicatie, ar fi ceva de genu: vectorul reprezinta o zona de memorie continua in care poti pune niste date. Fiind continua, stiu ca elementul a este inaintea lu a+1. Deci daca stiu adresa din memorie a lu 'a' si mai adaug 1 (aici 1 reprezinta cat ocupa 1 element din acel vector), obtin adresa lu a+1. 

 

Deci tu cand trimiti ca parametru un vector, tu defapt trimiti doar adresa de inceput a lui. Aceea nu o poti modifica, dar valoarea stocata se modifica.

 

Cand trimiti un int normal, atunci nu trimiti adresa acelei valori, ci trimiti efectiv valoarea. Deci daca undeva in memorie ai un a=5, o sa trimiti valoarea 5, care nu mai e legata deloc de 'a'.  Mai incolo o sa inveti despre transmiterea prin referinta (folosind & inainte variabilei) dar la urma urmei si ala trimite doar o valoare, doar ca trimite valoarea adresei de memorie unde se afla variabila ta.

 

Din pacate nu le am deloc cu explicatul, deci e o mare sansa sa nu fi inteles mare lucru :))


love is a verb
Love is a doing word

Share this post


Link to post
Share on other sites

Am invatat in cele din urma si care e treaba cu transmiterea prin referinta si care e treaba cu adresele si valorile astea, are destul de multa logica, pacat ca nu are cine sa-mi explice calumea si la clasa :))

Momentul ala cand mai bine statea acasa si ma uitam pe net la tutoriale de c++ decat sa fac cu profa... 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...