Wskazniki i referencje - przekazywania parametrow do funkcji

0

Witam!

Czy ktos mily, mógłby przerobic mi mój programik tak, aby parametry do funkcji "srednie" byly przekazywane:

a) jeden przez referencje
b) jeden przez wskaznik

a jeden z intow niech zostanie jak jest przez wartosc.

Chcialbym zobaczyc jak to dziala w praktyce na stworzonym przez siebie programie.

Pozdrawiam! :)


#include <iostream>
using namespace std;

const int mmax = 100;
const int nmax = 100;

void wczytaj_macierz(int wiersze, int kolumny, float macierz[][nmax])
{
	int i,j;
	
		for(i=0;i<wiersze;i++)
		for(j=0;j<kolumny;j++)
		{
			cout << "Podaj element [" << i+1 << "][" << j+1 << "]:" << endl;
			cin >> macierz[i][j];
		}
}

void wypisz_macierz (int wiersze, int kolumny, float macierz[][nmax])
{
	int i,j;
	
	for(i=0;i<wiersze;i++)
	{for(j=0;j<kolumny;j++)
		cout << macierz[i][j] << "  ";
		cout << endl;
	}
}

void suma_wektorow(int rozmiar, float wektor1[], float wektor2[], float wektor3[])
{
	int i;
		for(i=0;i<rozmiar;i++)
			wektor3[i] = wektor2[i] + wektor1[i];
}

void srednie (int rozmiar, float wektor[], int numer)
{
	int i, iloscd, iloscu;
	float sredniad,sredniau;
	
	sredniad = 0; sredniau = 0; iloscd = 0; iloscu = 0;
	
	for(i=0;i<rozmiar;i++)
	{
			if(wektor[i] >=0)
				{
						sredniad = sredniad + wektor[i];
						iloscd ++;
				}
			if(wektor[i] < 0)
				{		sredniau = sredniau + wektor[i];
						iloscu ++;
				}
	}
	
	if(iloscd > 0)
	{
		cout << "Srednia liczb dodatnich w kolumnie " << numer << ":" << endl;
		cout << sredniad/iloscd;
	}
	
	else
	cout << "Brak liczb dodatnich w kolumnie " << numer << endl << endl;
	
	if(iloscu > 0)
	{
		cout << "Srednia liczb ujemnych w kolumnie " << numer << ":" << endl;
		cout << sredniau/iloscu;
	}
	
	else
	cout << "Brak liczb ujemnych w kolumnie " << numer << endl << endl;
	
}


float minimum (int rozmiar, float wektor[])
{
	int i;
	float min;
	
	min = wektor[0];
	
		for(i=1;i<rozmiar;i++)
		{
			if(wektor[i] < min)
			min = wektor[i];
		}
	return min;
}

int main()
{
	int m,n,i;
	float A[mmax][nmax]; float B[mmax]; float C[mmax];
	
	cout << "Witaj w programie!" << endl;
	cout << "Podaj ilosc wierszy macierzy A (<= " << mmax << "):" << endl;
	cin >> m;
	cout << "Podaj ilosc kolumn macierzy A (<=" << nmax << "):" << endl;
	cin >> n;
	
	
	if(m>0 && n>0 && m<=mmax && n<=nmax)
	{
		wczytaj_macierz(m,n,A);
		cout << "Macierz, ktora podales ma postac:" << endl;
		wypisz_macierz(m,n,A);
		
		suma_wektorow(n,A[0],A[m-1],C);
		cout << "Suma ostatniego i pierwszego wiersza macierzy wynosi:" << endl;
		
		for(i=0;i<n;i++)
		cout << C[i] << "  ";
		
		for(i=0;i<m;i++)
		C[i] = A[i][1];
		
		srednie (m,C,2);
		
		for(i=0;i<m;i++)
		B[i] = minimum(n,A[i]);
		
		cout << "Wektor utworzony z wartosci minimalnych w wierszach macierzy to:" << endl;
		for(i=0;i<m;i++)
		cout << B[i] << "   ";
		
	}
	
	else
	cout << "Podano zly rozmiar macierzy!" << endl;
	
	return 0;
}


	

1

a) Dodajesz ampersand po nazwie typu parametru int& parametr, odwolujesz sie w ten sam sposob jak przez wartosc.
b) Dodajesz gwiazdke po nazwie typu parametru int* parametr, odwolujesz sie przez wyluskanie *parametr

Ad: Gwiazdka/ampersand moga byc w dowolnym miejscu miedzy tymi dwoma wyrazami:
int& parametr
int & parametr
int &parametr

0

Dziekuje. :)

To jeszcze dwa małe pytanka..

A czy w mainie muszę w jakis sposob jeszcze cos dodawac, jak podaję tam parametry?

Zapis float wektor[] - na liscie parametrow jest ponoc rownoznaczny z przekazywaniem przez wskaznik. Czy istnieje jakis inny sposob zapisu tego?

Pozdrawiam!

0

usiślając,przy przesyłaniu parametru przez wskaźnik trzeba jeszcze pamiętać o wyłuskaniu adresu parametru w wywolaniu funkcji:

int someVariable;
someFunctionTakingPointerToIntAsParameter(&someVariable);
0

Rozumiem.

To w takim razie zmienilem sobie te funkcje. Jedno przeslalem przez referencje, drugie przez wskaznik. Dzialac dziala. Pytanie tylko czy to wlasnie z punktu widzenia informatykow ma tak wygladac. Wstawie wiec zmieniony program i prosze potwierdzic, ze jest ok. :)


 
#include <iostream>
using namespace std;
 
const int mmax = 100;
const int nmax = 100;
 
void wczytaj_macierz(int wiersze, int kolumny, float macierz[][nmax])
{
        int i,j;
 
                for(i=0;i<wiersze;i++)
                for(j=0;j<kolumny;j++)
                {
                        cout << "Podaj element [" << i+1 << "][" << j+1 << "]:" << endl;
                        cin >> macierz[i][j];
                }
}
 
void wypisz_macierz (int wiersze, int kolumny, float macierz[][nmax])
{
        int i,j;
 
        for(i=0;i<wiersze;i++)
        {for(j=0;j<kolumny;j++)
                cout << macierz[i][j] << "  ";
                cout << endl;
        }
}
 
void suma_wektorow(int rozmiar, float wektor1[], float wektor2[], float wektor3[])
{
        int i;
                for(i=0;i<rozmiar;i++)
                        wektor3[i] = wektor2[i] + wektor1[i];
}
 
void srednie (int* rozmiar, float wektor[], int& numer)
{
        int i, iloscd, iloscu;
        float sredniad,sredniau;
 
        sredniad = 0; sredniau = 0; iloscd = 0; iloscu = 0;
 
        for(i=0;i<*rozmiar;i++)
        {
                        if(wektor[i] >=0)
                                {
                                                sredniad = sredniad + wektor[i];
                                                iloscd ++;
                                }
                        if(wektor[i] < 0)
                                {                sredniau = sredniau + wektor[i];
                                                iloscu ++;
                                }
        }
 
        if(iloscd > 0)
        {
                cout << "Srednia liczb dodatnich w kolumnie " << numer << ":" << endl;
                cout << sredniad/iloscd;
        }
 
        else
        cout << "Brak liczb dodatnich w kolumnie " << numer << endl << endl;
 
        if(iloscu > 0)
        {
                cout << "Srednia liczb ujemnych w kolumnie " << numer << ":" << endl;
                cout << sredniau/iloscu;
        }
 
        else
        cout << "Brak liczb ujemnych w kolumnie " << numer << endl << endl;
 
}
 
 
float minimum (int rozmiar, float wektor[])
{
        int i;
        float min;
 
        min = wektor[0];
 
                for(i=1;i<rozmiar;i++)
                {
                        if(wektor[i] < min)
                        min = wektor[i];
                }
        return min;
}
 
int main()
{
        int m,n,i;
        float A[mmax][nmax]; float B[mmax]; float C[mmax];
 
        cout << "Witaj w programie!" << endl;
        cout << "Podaj ilosc wierszy macierzy A (<= " << mmax << "):" << endl;
        cin >> m;
        cout << "Podaj ilosc kolumn macierzy A (<=" << nmax << "):" << endl;
        cin >> n;
 
 
        if(m>0 && n>0 && m<=mmax && n<=nmax)
        {
                wczytaj_macierz(m,n,A);
                cout << "Macierz, ktora podales ma postac:" << endl;
                wypisz_macierz(m,n,A);
 
                suma_wektorow(n,A[0],A[m-1],C);
                cout << "Suma ostatniego i pierwszego wiersza macierzy wynosi:" << endl;
 
                for(i=0;i<n;i++)
                cout << C[i] << "  ";
 
                for(i=0;i<m;i++)
                C[i] = A[i][1];
 
 				int a = 2;
 				
                srednie (&m,C,a);
 
                for(i=0;i<m;i++)
                B[i] = minimum(n,A[i]);
 
                cout << "Wektor utworzony z wartosci minimalnych w wierszach macierzy to:" << endl;
                for(i=0;i<m;i++)
                cout << B[i] << "   ";
 
        }
 
        else
        cout << "Podano zly rozmiar macierzy!" << endl;
 
        return 0;
}
 
 

I jeszcze jedna sprawa. Zauwazylem, ze referencja nie moze dzialac na jakiejsc liczbie tylko na zmiennej, prawda?

Zeby int&rozmiar zadzialalo musialem w mainie zrobic int a = 2; i potem jako parametr przeslac a; Z sama dwójką to nie działało. Czy coś źle robiłem? Czy taka tego specyfika? :D

0

W sumie to ostatnie pytanie prosze uznac, jakby go nie bylo. Pytam sie o oczywistosci.

Prosze tylko sprawdzic czy reszta z wskaznikami i refami jest ok :D

0

Przy wywolaniach funkcji kompilator jest bezwzgledny, wiec jak nie krzyczy jest raczej ok.

0
sprd123 napisał(a):

I jeszcze jedna sprawa. Zauwazylem, ze referencja nie moze dzialac na jakiejsc liczbie tylko na zmiennej, prawda?

Zeby int&rozmiar zadzialalo musialem w mainie zrobic int a = 2; i potem jako parametr przeslac a; Z sama dwójką to nie działało. Czy coś źle robiłem? Czy taka tego specyfika? :D

void fun(const int &a)
  {
   cout<<a<<endl;
  }

int x=3;
fun(x);
fun(3);

1 użytkowników online, w tym zalogowanych: 0, gości: 1